Skip to content

agy (Antigravity CLI) is missing from @superset/agent-setup, causing superset agents wait and status indicators to never fire #8906

Open

Description

@chrisfentiman

Where did this happen?

Desktop app (macOS)

Version

Paradev / Superset Version: 2.0.0 (macOS)

What happened?

agy (Antigravity) is registered as a built-in terminal agent in @superset/shared (BUILTIN_TERMINAL_AGENTS), PRESET_ICONS, and the usage/quota readers (UsageAgent / QuotaCapableAgent), but it is completely omitted from AGENT_SETUP_TARGETS and AGENT_SETUP_DEFINITIONS in @superset/agent-setup.

Because no wrapper or lifecycle hooks are installed for agy:
1. ~/.superset/bin/agy does not exist (SUPERSET_AGENT_ID="agy" is never exported and the launch SessionStart event is never sent).
2. No lifecycle hooks are registered in Antigravity CLI's hook config (~/.gemini/config/hooks.json).
3. Running agy inside a Paradev/Superset terminal never sends Start, UserPromptSubmit, ToolUse, or Stop events to ~/.superset/hooks/notify.sh.
4. superset agents wait hangs indefinitely (status: "unknown", reason: "agent is starting"), and superset agents explain reports:
text No agent hook from this terminal yet. Why: something may be running in the terminal, but no agent hook has reached Superset. It is a program that is not an agent, an agent still starting, or an agent whose hooks are not installed.

Steps to reproduce

  1. Open a terminal pane in Paradev/Superset (2.0.0).
  2. Launch Antigravity CLI with an initial prompt:
    agy --mode accept-edits -i "Say hello"
  3. Wait for agy to finish responding and return to an idle prompt.
  4. Run superset agents list / superset agents explain --pane <pane-id> / superset agents wait --pane <pane-id>.
  5. Observe that the pane remains in unknown / agent is starting and never transitions to working or idle/Stop.

Logs, screenshots, or recordings

Potential Root Cause

  1. In @superset/shared/agent-command, agy is registered in BUILTIN_TERMINAL_AGENTS:
    ts createBuiltinTerminalAgent({ id: "agy", label: "Antigravity", command: "agy --mode accept-edits", promptCommand: "agy --mode accept-edits -i", resumeCommand: "agy --mode accept-edits --conversation", nonInteractiveCommand: "agy -p", })

  2. However, in @superset/agent-setup/src/agent-setup-targets.ts, AGENT_SETUP_TARGETS only lists: amp, claude, codex, droid, opencode, omp, pi, cursor-agent, gemini, mastracode, kimi, grok, copilot, vibe, devin, muse, ufo (agy is missing, as are fx, hermes, and kiro).

  3. Note that gemini (Gemini CLI) and agy (Antigravity CLI) are separate tools with different hook config files and wire schemas:

  • gemini reads ~/.gemini/settings.json (BeforeAgent, AfterAgent, AfterTool).
  • agy reads ~/.gemini/config/hooks.json, groups hooks under a top-level namespace key (e.g. "superset-notify": { ... }), uses event names SessionStart, PreInvocation, PreToolUse, PostToolUse, Stop, and passes "conversationId" on stdin without "hook_event_name" in the JSON payload.

Expected Behavior / Proposed Fix

Add { id: "agy", managedBinary: true } to AGENT_SETUP_TARGETS and wire AGENT_SETUP_DEFINITIONS.agy to:

  1. Create ~/.superset/bin/agy via createWrapper("agy", ...) with agentId: "agy".
  2. Create ~/.superset/hooks/agy-hook.sh (or handle agy in notify.sh) and register a managed "superset-notify" block in ~/.gemini/config/hooks.json:
    json { "superset-notify": { "SessionStart": [ { "type": "command", "command": "\"$HOME/.superset/hooks/agy-hook.sh\" SessionStart" } ], "PreInvocation": [ { "type": "command", "command": "\"$HOME/.superset/hooks/agy-hook.sh\" UserPromptSubmit" } ], "PostToolUse": [ { "matcher": ".*", "hooks": [ { "type": "command", "command": "\"$HOME/.superset/hooks/agy-hook.sh\" PostToolUse" } ] } ], "Stop": [ { "type": "command", "command": "\"$HOME/.superset/hooks/agy-hook.sh\" Stop" } ] } }
  3. Antigravity CLI (agy) hook payload details for agy-hook.sh:
  • Stdin JSON contains "conversationId" (map to "session_id"), "workspacePaths" (first element is cwd), and on Stop events "fullyIdle": true | false (only forward Stop to notify.sh when fullyIdle is not false).
  • PostToolUse hooks in agy expect {} on stdout before exiting 0.

Activity

  1. github-actions commented on Oct 26, 2026

    @github-actions
    Contributor

    Summary

    The report holds up. Antigravity CLI (agy) is a built-in terminal agent with a preset, a resume command and a quota reader. But @superset/agent-setup never installs anything for it: no ~/.superset/bin/agy wrapper and no lifecycle hooks. So when agy runs in a Superset terminal, the host gets no SessionStart, Start or Stop event. The pane stays at "agent is starting", superset agents wait never returns, and superset agents explain shows the "No agent hook from this terminal yet" message. A wrapper and hook config are needed. A wrapper alone would not be enough, because notify.sh cannot read Antigravity's hook payload as it is today (details below).

    Affected code

    • packages/shared/src/builtin-terminal-agents.ts:240-248: agy is registered here as a built-in agent.
    • packages/agent-setup/src/agent-setup-targets.ts:16-34: AGENT_SETUP_TARGETS has no agy entry. kiro (:229), fx (:250) and hermes (:261) are also missing. SUPERSET_MANAGED_BINARIES (:38) is built from this list, so no wrapper is created.
    • packages/agent-setup/src/agent-setup.ts:84-165: AGENT_SETUP_DEFINITIONS has no agy key. The per-agent setup paths at :251 and :280 return false for it.
    • packages/cli/src/commands/agents/explain/explain-agent.ts:89,112: the "No agent hook from this terminal yet" message the reporter quotes.

    Root cause

    1. No wrapper. Wrapper-only agents such as ufo (agent-wrappers-ufo.ts) still get SUPERSET_AGENT_ID exported and a launch-time SessionStart from buildWrapperScript (agent-wrappers-common.ts:200-244). agy has no wrapper, so it does not get even that.
    2. No hook config is written for Antigravity. The Gemini integration writes only ~/.gemini/settings.json (agent-wrappers-gemini.ts:35-37) with Gemini CLI event names (:50-56). Nothing writes Antigravity's hook file. I could not check from the repo that the file is ~/.gemini/config/hooks.json, or check the schema the issue describes; someone should confirm both against Antigravity's docs.
    3. notify.sh could not read Antigravity's payload as-is. This is why pointing agy straight at notify.sh would not work, even with hooks registered:
      • The event name comes only from hook_event_name/hookEventName, with a Codex type fallback (templates/notify-hook.template.sh:83-93). With no event name it exits silently (:115). The issue says Antigravity puts no event name in the payload.
      • The session id comes only from session_id/sessionId/resourceId/thread-id (:72-79). conversationId is never read, so --conversation resume would not get an id.
      • mapEventType (packages/host-service/src/events/map-event-type.ts:23+) has no case for PreInvocation. The adapter would need to translate it, for example to UserPromptSubmit.

    How to reproduce

    • Manual: follow the steps in the issue. Also check that ~/.superset/bin/agy does not exist after the desktop app starts.
    • Unit test sketch in packages/agent-setup (bun:test):
      import { AGENT_SETUP_TARGETS, SUPERSET_MANAGED_BINARIES } from "./agent-setup-targets";
      import { BUILTIN_TERMINAL_AGENTS } from "@superset/shared/agent-command";
      test("every built-in terminal agent has a setup target", () => {
        const targetIds = new Set(AGENT_SETUP_TARGETS.map((t) => t.id));
        const missing = BUILTIN_TERMINAL_AGENTS.map((a) => a.id).filter((id) => !targetIds.has(id));
        expect(missing).toEqual([]); // currently ["kiro", "agy", "fx", "hermes"]
      });
      The import path may need adjusting. Turning the test into an explicit allowlist would keep future agents from silently skipping setup.

    Suggested fix

    Model the fix on the Gemini integration (agent-wrappers-gemini.ts plus templates/gemini-hook.template.sh):

    1. Add { id: "agy", managedBinary: true } to AGENT_SETUP_TARGETS.
    2. Add a new agent-wrappers-agy.ts with:
      • createAgyWrapper(): buildWrapperScript("agy", 'exec "$REAL_BIN" "$@"', { agentId: "agy" }).
      • createAgyHookScript(): writes an agy-hook.sh adapter. It takes the event name from argv, maps conversationId to session_id, drops Stop when fullyIdle is false, prints {} where Antigravity expects output, and forwards to notify.sh with hook_event_name set.
      • Ensure/remove functions for Superset's block in Antigravity's hook file, using managed-json-hooks.ts if the namespaced layout fits its eventsContainerKey model. If not, use a small dedicated merge.
    3. Wire agy: { setup: [...], teardown: [removeAgyManagedHooks] } into AGENT_SETUP_DEFINITIONS.
    4. If PreInvocation reaches the host without being renamed, add it to mapEventType. The cleaner option is to rename it in the adapter.

    A wrapper-only entry like ufo would be a quick partial fix. The pane would at least leave "starting", but working/idle status would still not update until hooks are installed. kiro, fx and hermes have the same gap and might be handled in separate issues.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions