@agentex/agent 0.0.37 → 0.0.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/README.md +54 -17
  3. package/dist/providers/antigravity/codec.d.ts +4 -0
  4. package/dist/providers/antigravity/codec.d.ts.map +1 -0
  5. package/dist/providers/antigravity/codec.js +27 -0
  6. package/dist/providers/antigravity/codec.js.map +1 -0
  7. package/dist/providers/antigravity/connection.d.ts +100 -0
  8. package/dist/providers/antigravity/connection.d.ts.map +1 -0
  9. package/dist/providers/antigravity/connection.js +267 -0
  10. package/dist/providers/antigravity/connection.js.map +1 -0
  11. package/dist/providers/antigravity/discovery.d.ts +11 -0
  12. package/dist/providers/antigravity/discovery.d.ts.map +1 -0
  13. package/dist/providers/antigravity/discovery.js +92 -0
  14. package/dist/providers/antigravity/discovery.js.map +1 -0
  15. package/dist/providers/antigravity/execute.d.ts +9 -0
  16. package/dist/providers/antigravity/execute.d.ts.map +1 -0
  17. package/dist/providers/antigravity/execute.js +206 -0
  18. package/dist/providers/antigravity/execute.js.map +1 -0
  19. package/dist/providers/antigravity/index.d.ts +12 -0
  20. package/dist/providers/antigravity/index.d.ts.map +1 -0
  21. package/dist/providers/antigravity/index.js +46 -0
  22. package/dist/providers/antigravity/index.js.map +1 -0
  23. package/dist/providers/antigravity/parse.d.ts +114 -0
  24. package/dist/providers/antigravity/parse.d.ts.map +1 -0
  25. package/dist/providers/antigravity/parse.js +369 -0
  26. package/dist/providers/antigravity/parse.js.map +1 -0
  27. package/dist/providers/antigravity/probe.d.ts +3 -0
  28. package/dist/providers/antigravity/probe.d.ts.map +1 -0
  29. package/dist/providers/antigravity/probe.js +84 -0
  30. package/dist/providers/antigravity/probe.js.map +1 -0
  31. package/dist/providers/antigravity/runtime.d.ts +30 -0
  32. package/dist/providers/antigravity/runtime.d.ts.map +1 -0
  33. package/dist/providers/antigravity/runtime.js +69 -0
  34. package/dist/providers/antigravity/runtime.js.map +1 -0
  35. package/dist/providers/antigravity/session.d.ts +7 -0
  36. package/dist/providers/antigravity/session.d.ts.map +1 -0
  37. package/dist/providers/antigravity/session.js +317 -0
  38. package/dist/providers/antigravity/session.js.map +1 -0
  39. package/dist/providers/gemini/index.d.ts.map +1 -1
  40. package/dist/providers/gemini/index.js +6 -0
  41. package/dist/providers/gemini/index.js.map +1 -1
  42. package/dist/registry.d.ts.map +1 -1
  43. package/dist/registry.js +2 -0
  44. package/dist/registry.js.map +1 -1
  45. package/dist/types.d.ts +6 -5
  46. package/dist/types.d.ts.map +1 -1
  47. package/dist/types.js.map +1 -1
  48. package/dist/utils/auth.d.ts +1 -1
  49. package/dist/utils/auth.d.ts.map +1 -1
  50. package/dist/utils/auth.js +79 -1
  51. package/dist/utils/auth.js.map +1 -1
  52. package/dist/utils/binary.d.ts.map +1 -1
  53. package/dist/utils/binary.js +10 -0
  54. package/dist/utils/binary.js.map +1 -1
  55. package/dist/utils/instructions.d.ts +36 -12
  56. package/dist/utils/instructions.d.ts.map +1 -1
  57. package/dist/utils/instructions.js +116 -62
  58. package/dist/utils/instructions.js.map +1 -1
  59. package/dist/utils/runtime-homes.d.ts.map +1 -1
  60. package/dist/utils/runtime-homes.js +4 -0
  61. package/dist/utils/runtime-homes.js.map +1 -1
  62. package/dist/utils/skills.d.ts +3 -3
  63. package/dist/utils/skills.d.ts.map +1 -1
  64. package/dist/utils/skills.js +16 -2
  65. package/dist/utils/skills.js.map +1 -1
  66. package/package.json +3 -2
  67. package/src/providers/antigravity/codec.ts +29 -0
  68. package/src/providers/antigravity/connection.ts +304 -0
  69. package/src/providers/antigravity/discovery.ts +90 -0
  70. package/src/providers/antigravity/execute.ts +214 -0
  71. package/src/providers/antigravity/index.ts +48 -0
  72. package/src/providers/antigravity/parse.ts +439 -0
  73. package/src/providers/antigravity/probe.ts +89 -0
  74. package/src/providers/antigravity/runtime.ts +64 -0
  75. package/src/providers/antigravity/session.ts +359 -0
  76. package/src/providers/gemini/index.ts +6 -0
  77. package/src/registry.ts +2 -0
  78. package/src/types.ts +6 -5
  79. package/src/utils/auth.ts +82 -1
  80. package/src/utils/binary.ts +10 -0
  81. package/src/utils/instructions.ts +162 -73
  82. package/src/utils/runtime-homes.ts +4 -0
  83. package/src/utils/skills.ts +17 -4
@@ -0,0 +1,46 @@
1
+ import { resolveAuthForProvider } from "../../utils/auth.js";
2
+ import { antigravitySessionCodec } from "./codec.js";
3
+ /**
4
+ * Google Antigravity CLI (`agy`), the successor to Gemini CLI for Google
5
+ * accounts (Free, AI Pro, AI Ultra) since Gemini CLI stopped serving them on
6
+ * 2026-06-18. Driven through its headless `stream-json` mode, which keeps one
7
+ * process per session and resumes conversations with `--conversation`.
8
+ *
9
+ * Install: `curl -fsSL https://antigravity.google/cli/install.sh | bash`,
10
+ * then run `agy` once to sign in. Headless runs reuse the cached sign-in.
11
+ */
12
+ export const antigravityProvider = {
13
+ type: "antigravity",
14
+ capabilities: {
15
+ sessions: true,
16
+ modelDiscovery: true,
17
+ quotaProbing: false,
18
+ mcp: false,
19
+ skills: true,
20
+ instructions: true,
21
+ workspace: true,
22
+ planMode: true,
23
+ concurrentSend: false,
24
+ cancelQueuedMessage: false,
25
+ stopTask: false,
26
+ modes: true,
27
+ resume: true,
28
+ modelVariants: false,
29
+ permissionRequests: false,
30
+ questionRequests: false,
31
+ upstreamProviderDisconnect: false,
32
+ sessionModelChange: false,
33
+ sessionVariantChange: false,
34
+ sessionEffortChange: false,
35
+ sessionModeChange: false,
36
+ },
37
+ // Everything below loads lazily on first use.
38
+ execute: async (ctx) => (await import("./execute.js")).executeAntigravityProvider(ctx),
39
+ createSession: async (ctx) => (await import("./session.js")).createAntigravitySession(ctx),
40
+ resolveAuth: (ctx) => resolveAuthForProvider("antigravity", ctx),
41
+ sessionCodec: antigravitySessionCodec,
42
+ listModels: (options) => import("./discovery.js").then((m) => m.listAntigravityModels(options)),
43
+ listModes: (options) => import("./discovery.js").then((m) => m.listAntigravityModes(options)),
44
+ probeCapabilities: (ctx) => import("./probe.js").then((m) => m.probeAntigravityCapabilities(ctx)),
45
+ };
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/antigravity/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAErD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAmB;IACjD,IAAI,EAAE,aAAa;IACnB,YAAY,EAAE;QACZ,QAAQ,EAAE,IAAI;QACd,cAAc,EAAE,IAAI;QACpB,YAAY,EAAE,KAAK;QACnB,GAAG,EAAE,KAAK;QACV,MAAM,EAAE,IAAI;QACZ,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,IAAI;QACd,cAAc,EAAE,KAAK;QACrB,mBAAmB,EAAE,KAAK;QAC1B,QAAQ,EAAE,KAAK;QACf,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,aAAa,EAAE,KAAK;QACpB,kBAAkB,EAAE,KAAK;QACzB,gBAAgB,EAAE,KAAK;QACvB,0BAA0B,EAAE,KAAK;QACjC,kBAAkB,EAAE,KAAK;QACzB,oBAAoB,EAAE,KAAK;QAC3B,mBAAmB,EAAE,KAAK;QAC1B,iBAAiB,EAAE,KAAK;KACzB;IACD,8CAA8C;IAC9C,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,0BAA0B,CAAC,GAAG,CAAC;IACtF,aAAa,EAAE,KAAK,EAAE,GAAmB,EAAyB,EAAE,CAClE,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,wBAAwB,CAAC,GAAG,CAAC;IAC9D,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,sBAAsB,CAAC,aAAa,EAAE,GAAG,CAAC;IAChE,YAAY,EAAE,uBAAuB;IACrC,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/F,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC7F,iBAAiB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC;CAClG,CAAC"}
@@ -0,0 +1,114 @@
1
+ import type { ExecutionStatus, StreamEvent, TokenUsage, TurnResult } from "../../types.js";
2
+ /**
3
+ * Parser for Antigravity CLI (`agy`) headless `stream-json` output.
4
+ *
5
+ * Wire contract (https://antigravity.google/docs/cli/headless): one `init`
6
+ * event per process, `step_update` events while a turn runs, and one `result`
7
+ * event per turn. Every line is `{ "event": <name>, <name>: { ... } }`.
8
+ *
9
+ * - `step_update.step_type` is a closed vocabulary; observed values are
10
+ * `user_input`, `agent_response`, `tool`, and `checkpoint`. A step is
11
+ * `ACTIVE` while it runs and `DONE` when it finishes. `agent_response`
12
+ * streams its text as `text_delta` fragments across ACTIVE updates and a
13
+ * final DONE (short replies arrive as a single DONE).
14
+ * - `result.usage`, `num_turns`, and `duration_seconds` are cumulative over
15
+ * the process's session; `response` covers only the turn that emitted it.
16
+ * The parser turns the cumulative counters back into per-turn deltas.
17
+ *
18
+ * The parser is stateful (text accumulates per step, usage is differenced
19
+ * per turn), so use one instance per `agy` process.
20
+ */
21
+ export declare const ANTIGRAVITY_PROVIDER_TYPE = "antigravity";
22
+ /** Token counters as `agy` reports them. `output` includes `thinking`. */
23
+ export interface AgyUsage {
24
+ inputTokens: number;
25
+ outputTokens: number;
26
+ thinkingTokens: number;
27
+ cacheReadTokens: number;
28
+ totalTokens: number;
29
+ }
30
+ /** A parsed `result` event, with per-turn deltas alongside the raw totals. */
31
+ export interface AgyResult {
32
+ /** `SUCCESS`, `ERROR`, `CANCELED`, `INTERRUPTED`, `INVALID`, `WAITING`, or `RUNNING`. */
33
+ status: string;
34
+ /** Response text for the turn that emitted this result. */
35
+ response: string;
36
+ error: string | null;
37
+ conversationId: string | null;
38
+ /** Cumulative over the process's session. */
39
+ numTurns: number | null;
40
+ /** This turn's share of the cumulative `duration_seconds`, in ms. */
41
+ turnDurationMs: number | null;
42
+ /** Cumulative over the process's session. */
43
+ usage: AgyUsage | null;
44
+ /** This turn's share of the cumulative usage. */
45
+ turnUsage: AgyUsage | null;
46
+ /** Tools the CLI soft-denied because no permission rule allowed them. */
47
+ deniedActions: unknown[] | null;
48
+ structuredOutput: unknown;
49
+ raw: Record<string, unknown>;
50
+ }
51
+ /** `AGY_ERROR: {...}` stderr line printed when a turn fails on an agent or model API error. */
52
+ export interface AgyErrorReport {
53
+ message: string | null;
54
+ status: string | null;
55
+ code: number | string | null;
56
+ retryable: boolean | null;
57
+ raw: Record<string, unknown>;
58
+ }
59
+ export interface AgyStreamParserOptions {
60
+ /** Emit `assistant_delta` / `thinking_delta` events for streamed fragments. */
61
+ includePartialMessages?: boolean;
62
+ /** Conversation id already known (resume), used until the stream reports one. */
63
+ conversationId?: string | null;
64
+ }
65
+ export interface AgyParsedLine {
66
+ events: StreamEvent[];
67
+ result: AgyResult | null;
68
+ }
69
+ export declare function parseAgyUsage(value: unknown): AgyUsage | null;
70
+ /**
71
+ * Map `agy` token counters onto agentex `TokenUsage`. `input_tokens` already
72
+ * includes cache reads (like Codex), and `output_tokens` already includes
73
+ * thinking, so the counters pass through without re-adding anything.
74
+ */
75
+ export declare function agyUsageToTokenUsage(usage: AgyUsage): TokenUsage;
76
+ /** Key a usage record by model. `agy` reports the model only when one was pinned. */
77
+ export declare function agyUsageRecord(usage: AgyUsage | null, model: string | null): Record<string, TokenUsage> | undefined;
78
+ export declare class AgyStreamParser {
79
+ conversationId: string | null;
80
+ model: string | null;
81
+ permissionMode: string | null;
82
+ private readonly includePartial;
83
+ private readonly responseText;
84
+ private readonly thinkingText;
85
+ private readonly toolCallsOpened;
86
+ private previousUsage;
87
+ private previousDurationSec;
88
+ constructor(options?: AgyStreamParserOptions);
89
+ parseLine(line: string): AgyParsedLine;
90
+ private noteConversation;
91
+ private base;
92
+ private onInit;
93
+ private onStep;
94
+ private onThinking;
95
+ private onResult;
96
+ }
97
+ /** Parse a complete `stream-json` transcript. Returns every turn's result in order. */
98
+ export declare function parseAgyStreamJson(stdout: string, options?: AgyStreamParserOptions): {
99
+ events: StreamEvent[];
100
+ results: AgyResult[];
101
+ conversationId: string | null;
102
+ model: string | null;
103
+ };
104
+ /** Parse an `AGY_ERROR: {...}` stderr line, or return null for any other line. */
105
+ export declare function parseAgyErrorLine(line: string): AgyErrorReport | null;
106
+ /** True when `agy` output says the CLI has no usable sign-in. */
107
+ export declare function isAgyAuthRequired(text: string): boolean;
108
+ /** Error code for a failed turn, from the most specific signal available. */
109
+ export declare function classifyAgyFailure(result: AgyResult | null, agyError: AgyErrorReport | null): string;
110
+ /** Map an `agy` result status onto a one-shot `ExecutionStatus`. */
111
+ export declare function mapAgyExecutionStatus(status: string): ExecutionStatus;
112
+ /** Map an `agy` result status onto a session `TurnResult` status. */
113
+ export declare function mapAgyTurnStatus(status: string): TurnResult["status"];
114
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../src/providers/antigravity/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,369 @@
1
+ /**
2
+ * Parser for Antigravity CLI (`agy`) headless `stream-json` output.
3
+ *
4
+ * Wire contract (https://antigravity.google/docs/cli/headless): one `init`
5
+ * event per process, `step_update` events while a turn runs, and one `result`
6
+ * event per turn. Every line is `{ "event": <name>, <name>: { ... } }`.
7
+ *
8
+ * - `step_update.step_type` is a closed vocabulary; observed values are
9
+ * `user_input`, `agent_response`, `tool`, and `checkpoint`. A step is
10
+ * `ACTIVE` while it runs and `DONE` when it finishes. `agent_response`
11
+ * streams its text as `text_delta` fragments across ACTIVE updates and a
12
+ * final DONE (short replies arrive as a single DONE).
13
+ * - `result.usage`, `num_turns`, and `duration_seconds` are cumulative over
14
+ * the process's session; `response` covers only the turn that emitted it.
15
+ * The parser turns the cumulative counters back into per-turn deltas.
16
+ *
17
+ * The parser is stateful (text accumulates per step, usage is differenced
18
+ * per turn), so use one instance per `agy` process.
19
+ */
20
+ export const ANTIGRAVITY_PROVIDER_TYPE = "antigravity";
21
+ function rec(value) {
22
+ return typeof value === "object" && value !== null && !Array.isArray(value)
23
+ ? value
24
+ : null;
25
+ }
26
+ function str(value) {
27
+ return typeof value === "string" && value.length > 0 ? value : null;
28
+ }
29
+ function num(value) {
30
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
31
+ }
32
+ function parseJsonObject(line) {
33
+ const trimmed = line.trim();
34
+ if (!trimmed.startsWith("{"))
35
+ return null;
36
+ try {
37
+ return rec(JSON.parse(trimmed));
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ }
43
+ export function parseAgyUsage(value) {
44
+ const u = rec(value);
45
+ if (!u)
46
+ return null;
47
+ const inputTokens = num(u["input_tokens"]) ?? 0;
48
+ const outputTokens = num(u["output_tokens"]) ?? 0;
49
+ return {
50
+ inputTokens,
51
+ outputTokens,
52
+ thinkingTokens: num(u["thinking_tokens"]) ?? 0,
53
+ cacheReadTokens: num(u["cache_read_tokens"]) ?? 0,
54
+ totalTokens: num(u["total_tokens"]) ?? inputTokens + outputTokens,
55
+ };
56
+ }
57
+ function subtractUsage(total, previous) {
58
+ if (!previous)
59
+ return total;
60
+ const diff = (a, b) => Math.max(0, a - b);
61
+ return {
62
+ inputTokens: diff(total.inputTokens, previous.inputTokens),
63
+ outputTokens: diff(total.outputTokens, previous.outputTokens),
64
+ thinkingTokens: diff(total.thinkingTokens, previous.thinkingTokens),
65
+ cacheReadTokens: diff(total.cacheReadTokens, previous.cacheReadTokens),
66
+ totalTokens: diff(total.totalTokens, previous.totalTokens),
67
+ };
68
+ }
69
+ /**
70
+ * Map `agy` token counters onto agentex `TokenUsage`. `input_tokens` already
71
+ * includes cache reads (like Codex), and `output_tokens` already includes
72
+ * thinking, so the counters pass through without re-adding anything.
73
+ */
74
+ export function agyUsageToTokenUsage(usage) {
75
+ return {
76
+ inputTokens: usage.inputTokens,
77
+ outputTokens: usage.outputTokens,
78
+ cachedInputTokens: usage.cacheReadTokens,
79
+ };
80
+ }
81
+ /** Key a usage record by model. `agy` reports the model only when one was pinned. */
82
+ export function agyUsageRecord(usage, model) {
83
+ if (!usage)
84
+ return undefined;
85
+ if (usage.inputTokens === 0 && usage.outputTokens === 0 && usage.cacheReadTokens === 0)
86
+ return undefined;
87
+ return { [model ?? "default"]: agyUsageToTokenUsage(usage) };
88
+ }
89
+ function stringifyOutput(value) {
90
+ if (value == null)
91
+ return "";
92
+ if (typeof value === "string")
93
+ return value;
94
+ try {
95
+ return JSON.stringify(value);
96
+ }
97
+ catch {
98
+ return String(value);
99
+ }
100
+ }
101
+ export class AgyStreamParser {
102
+ conversationId;
103
+ model = null;
104
+ permissionMode = null;
105
+ includePartial;
106
+ responseText = new Map();
107
+ thinkingText = new Map();
108
+ toolCallsOpened = new Set();
109
+ previousUsage = null;
110
+ previousDurationSec = 0;
111
+ constructor(options = {}) {
112
+ this.includePartial = options.includePartialMessages === true;
113
+ this.conversationId = options.conversationId ?? null;
114
+ }
115
+ parseLine(line) {
116
+ const event = parseJsonObject(line);
117
+ if (!event)
118
+ return { events: [], result: null };
119
+ const kind = str(event["event"]);
120
+ switch (kind) {
121
+ case "init":
122
+ return { events: this.onInit(event), result: null };
123
+ case "step_update":
124
+ return { events: this.onStep(event), result: null };
125
+ case "result":
126
+ return this.onResult(event);
127
+ default:
128
+ return {
129
+ events: [{ type: "unknown", subtype: kind ?? "unknown", ...this.base(event) }],
130
+ result: null,
131
+ };
132
+ }
133
+ }
134
+ noteConversation(id) {
135
+ const value = str(id);
136
+ if (value)
137
+ this.conversationId = value;
138
+ }
139
+ base(raw, messageId = null) {
140
+ return {
141
+ timestamp: new Date().toISOString(),
142
+ providerType: ANTIGRAVITY_PROVIDER_TYPE,
143
+ sessionId: this.conversationId,
144
+ messageId,
145
+ eventId: null,
146
+ turnId: null,
147
+ parentToolCallId: null,
148
+ raw,
149
+ };
150
+ }
151
+ onInit(event) {
152
+ const init = rec(event["init"]) ?? {};
153
+ this.noteConversation(event["conversation_id"] ?? init["conversation_id"]);
154
+ this.model = str(init["model"]) ?? this.model;
155
+ this.permissionMode = str(init["permission_mode"]) ?? this.permissionMode;
156
+ const tools = Array.isArray(init["tools"])
157
+ ? init["tools"].filter((t) => typeof t === "string")
158
+ : null;
159
+ return [{
160
+ type: "system",
161
+ subtype: "init",
162
+ model: this.model,
163
+ cwd: str(init["cwd"]),
164
+ tools,
165
+ permissionMode: this.permissionMode,
166
+ ...this.base(event),
167
+ }];
168
+ }
169
+ onStep(event) {
170
+ const step = rec(event["step_update"]);
171
+ if (!step)
172
+ return [];
173
+ this.noteConversation(step["conversation_id"]);
174
+ const index = num(step["step_index"]) ?? -1;
175
+ const state = str(step["state"]);
176
+ const done = state !== "ACTIVE";
177
+ const stepId = `${this.conversationId ?? "agy"}:${index}`;
178
+ const type = str(step["step_type"]);
179
+ // Thinking is not part of the documented stream, but the step schema has
180
+ // room for it; surface it if a build sends it rather than dropping it.
181
+ const events = this.onThinking(step, event, index, stepId, done);
182
+ if (type === "user_input" || type === "checkpoint")
183
+ return events;
184
+ if (type === "agent_response") {
185
+ const delta = typeof step["text_delta"] === "string" ? step["text_delta"] : "";
186
+ const text = (this.responseText.get(index) ?? "") + delta;
187
+ this.responseText.set(index, text);
188
+ if (delta && this.includePartial) {
189
+ events.push({ type: "assistant_delta", text: delta, blockIndex: 0, ...this.base(event, stepId) });
190
+ }
191
+ if (done) {
192
+ this.responseText.delete(index);
193
+ if (text.trim())
194
+ events.push({ type: "assistant", text, ...this.base(event, stepId) });
195
+ }
196
+ return events;
197
+ }
198
+ const toolInfo = rec(step["tool_info"]);
199
+ const subagentInfo = rec(step["subagent_info"]);
200
+ if (type === "tool" || toolInfo || subagentInfo) {
201
+ const name = str(step["tool_name"]) ?? str(toolInfo?.["name"]) ?? (subagentInfo ? "subagent" : "tool");
202
+ if (!this.toolCallsOpened.has(index)) {
203
+ this.toolCallsOpened.add(index);
204
+ events.push({
205
+ type: "tool_call",
206
+ toolCallId: stepId,
207
+ name,
208
+ input: toolInfo?.["parameters"] ?? subagentInfo ?? null,
209
+ ...this.base(event, stepId),
210
+ });
211
+ }
212
+ if (done) {
213
+ this.toolCallsOpened.delete(index);
214
+ const error = rec(toolInfo?.["error"]);
215
+ const output = stringifyOutput(toolInfo?.["output"] ?? (subagentInfo ? subagentInfo : null));
216
+ events.push({
217
+ type: "tool_result",
218
+ toolCallId: stepId,
219
+ toolName: name,
220
+ content: output || str(error?.["message"]) || "",
221
+ isError: error !== null,
222
+ exitCode: null,
223
+ ...this.base(event, stepId),
224
+ });
225
+ }
226
+ return events;
227
+ }
228
+ // Forward-compat: a step type this parser does not model yet.
229
+ if (done)
230
+ events.push({ type: "unknown", subtype: type ?? "step_update", ...this.base(event, stepId) });
231
+ return events;
232
+ }
233
+ onThinking(step, event, index, stepId, done) {
234
+ const delta = typeof step["thinking_delta"] === "string" ? step["thinking_delta"] : "";
235
+ if (!delta && !this.thinkingText.has(index))
236
+ return [];
237
+ const events = [];
238
+ const text = (this.thinkingText.get(index) ?? "") + delta;
239
+ this.thinkingText.set(index, text);
240
+ if (delta && this.includePartial) {
241
+ events.push({ type: "thinking_delta", text: delta, blockIndex: 0, ...this.base(event, stepId) });
242
+ }
243
+ if (done) {
244
+ this.thinkingText.delete(index);
245
+ if (text.trim())
246
+ events.push({ type: "thinking", text, ...this.base(event, stepId) });
247
+ }
248
+ return events;
249
+ }
250
+ onResult(event) {
251
+ const payload = rec(event["result"]) ?? {};
252
+ this.noteConversation(payload["conversation_id"]);
253
+ const status = str(payload["status"]) ?? "ERROR";
254
+ const usage = parseAgyUsage(payload["usage"]);
255
+ const turnUsage = usage ? subtractUsage(usage, this.previousUsage) : null;
256
+ if (usage)
257
+ this.previousUsage = usage;
258
+ const durationSec = num(payload["duration_seconds"]);
259
+ const turnDurationMs = durationSec == null
260
+ ? null
261
+ : Math.round(Math.max(0, durationSec - this.previousDurationSec) * 1000);
262
+ if (durationSec != null)
263
+ this.previousDurationSec = durationSec;
264
+ // Steps of a finished turn never complete; don't leak them into the next.
265
+ this.responseText.clear();
266
+ this.thinkingText.clear();
267
+ this.toolCallsOpened.clear();
268
+ const result = {
269
+ status,
270
+ response: typeof payload["response"] === "string" ? payload["response"] : "",
271
+ error: str(payload["error"]),
272
+ conversationId: this.conversationId,
273
+ numTurns: num(payload["num_turns"]),
274
+ turnDurationMs,
275
+ usage,
276
+ turnUsage,
277
+ deniedActions: Array.isArray(payload["denied_actions"]) ? payload["denied_actions"] : null,
278
+ structuredOutput: payload["structured_output"],
279
+ raw: event,
280
+ };
281
+ return {
282
+ events: [{
283
+ type: "result",
284
+ text: result.response,
285
+ costUsd: null,
286
+ isError: status !== "SUCCESS",
287
+ stopReason: null,
288
+ terminalReason: status.toLowerCase(),
289
+ numTurns: result.numTurns,
290
+ durationMs: turnDurationMs,
291
+ ...this.base(event),
292
+ }],
293
+ result,
294
+ };
295
+ }
296
+ }
297
+ /** Parse a complete `stream-json` transcript. Returns every turn's result in order. */
298
+ export function parseAgyStreamJson(stdout, options) {
299
+ const parser = new AgyStreamParser(options);
300
+ const events = [];
301
+ const results = [];
302
+ for (const line of stdout.split(/\r?\n/)) {
303
+ const parsed = parser.parseLine(line);
304
+ events.push(...parsed.events);
305
+ if (parsed.result)
306
+ results.push(parsed.result);
307
+ }
308
+ return { events, results, conversationId: parser.conversationId, model: parser.model };
309
+ }
310
+ /** Parse an `AGY_ERROR: {...}` stderr line, or return null for any other line. */
311
+ export function parseAgyErrorLine(line) {
312
+ const match = line.match(/AGY_ERROR:\s*(\{.*\})\s*$/);
313
+ if (!match?.[1])
314
+ return null;
315
+ const raw = parseJsonObject(match[1]);
316
+ if (!raw)
317
+ return null;
318
+ const code = raw["code"] ?? raw["http_code"] ?? raw["grpc_code"] ?? raw["status_code"] ?? null;
319
+ return {
320
+ message: str(raw["message"]) ?? str(raw["error"]),
321
+ status: str(raw["status"]) ?? str(raw["canonical_status"]) ?? str(raw["canonicalStatus"]),
322
+ code: typeof code === "number" || typeof code === "string" ? code : null,
323
+ retryable: typeof raw["retryable"] === "boolean" ? raw["retryable"] : null,
324
+ raw,
325
+ };
326
+ }
327
+ const AGY_AUTH_PROMPT_RE = /Authentication required|Please (?:visit the URL to log in|sign in)|authentication failed or timed out|not signed in|Failed to sign in/i;
328
+ /** True when `agy` output says the CLI has no usable sign-in. */
329
+ export function isAgyAuthRequired(text) {
330
+ return AGY_AUTH_PROMPT_RE.test(text);
331
+ }
332
+ const RATE_LIMIT_RE = /RESOURCE_EXHAUSTED|rate.?limit|quota|\b429\b/i;
333
+ /** Error code for a failed turn, from the most specific signal available. */
334
+ export function classifyAgyFailure(result, agyError) {
335
+ const text = [result?.error, agyError?.message, agyError?.status, agyError?.code].filter(Boolean).join(" ");
336
+ if (isAgyAuthRequired(text) || /UNAUTHENTICATED|PERMISSION_DENIED|\b401\b/.test(text))
337
+ return "auth_required";
338
+ if (RATE_LIMIT_RE.test(text))
339
+ return "rate_limited";
340
+ if (/invalid model selection|not recognized as a known model/i.test(text))
341
+ return "invalid_model";
342
+ if (result?.status === "WAITING")
343
+ return "waiting_for_input";
344
+ if (result?.status === "INVALID")
345
+ return "invalid_state";
346
+ if (result?.status === "RUNNING")
347
+ return "incomplete_turn";
348
+ return "agent_error";
349
+ }
350
+ /** Map an `agy` result status onto a one-shot `ExecutionStatus`. */
351
+ export function mapAgyExecutionStatus(status) {
352
+ switch (status) {
353
+ case "SUCCESS":
354
+ return "completed";
355
+ case "CANCELED":
356
+ case "INTERRUPTED":
357
+ return "aborted";
358
+ case "WAITING":
359
+ return "blocked";
360
+ default:
361
+ return "failed";
362
+ }
363
+ }
364
+ /** Map an `agy` result status onto a session `TurnResult` status. */
365
+ export function mapAgyTurnStatus(status) {
366
+ const mapped = mapAgyExecutionStatus(status);
367
+ return mapped === "blocked" ? "failed" : mapped;
368
+ }
369
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../src/providers/antigravity/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ProviderRuntimeContext, ProviderRuntimeReport } from "../../types.js";
2
+ export declare function probeAntigravityCapabilities(ctx?: ProviderRuntimeContext): Promise<ProviderRuntimeReport>;
3
+ //# sourceMappingURL=probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probe.d.ts","sourceRoot":"","sources":["../../../src/providers/antigravity/probe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AASpF,wBAAsB,4BAA4B,CAChD,GAAG,GAAE,sBAA2B,GAC/B,OAAO,CAAC,qBAAqB,CAAC,CA6EhC"}
@@ -0,0 +1,84 @@
1
+ import { buildEnv, ensurePathInEnv } from "../../utils/env.js";
2
+ import { runChildProcess } from "../../utils/process.js";
3
+ import { listAntigravityModels } from "./discovery.js";
4
+ import { AGY_SIGN_IN_MESSAGE, findAgyBinary } from "./runtime.js";
5
+ /** Flags the adapter relies on. All shipped together in Antigravity CLI 1.1.15. */
6
+ const REQUIRED_FLAGS = ["--input-format", "--output-format", "--conversation", "--mode", "--model"];
7
+ export async function probeAntigravityCapabilities(ctx = {}) {
8
+ let resolved;
9
+ try {
10
+ resolved = await findAgyBinary(ctx);
11
+ }
12
+ catch (error) {
13
+ return {
14
+ binary: {
15
+ status: "missing",
16
+ command: null,
17
+ version: null,
18
+ protocolProfile: null,
19
+ reason: error instanceof Error ? error.message : String(error),
20
+ },
21
+ capabilities: {},
22
+ };
23
+ }
24
+ const env = buildEnv(ctx.env);
25
+ ensurePathInEnv(env);
26
+ const cwd = ctx.cwd ?? process.cwd();
27
+ const run = (runId, args, timeoutSec) => runChildProcess({
28
+ runId,
29
+ command: resolved.bin,
30
+ args: [...resolved.prefixArgs, ...args],
31
+ cwd,
32
+ env,
33
+ timeoutSec,
34
+ }).catch(() => null);
35
+ const [versionRun, helpRun, models] = await Promise.all([
36
+ run("antigravity-version-probe", ["--version"], 5),
37
+ run("antigravity-protocol-probe", ["--help"], 10),
38
+ listAntigravityModels(ctx).catch((error) => (error instanceof Error ? error : new Error(String(error)))),
39
+ ]);
40
+ const version = versionRun
41
+ ? (`${versionRun.stdout}\n${versionRun.stderr}`).match(/\d+\.\d+(?:\.\d+)?/)?.[0] ?? null
42
+ : null;
43
+ const help = helpRun ? `${helpRun.stdout}\n${helpRun.stderr}` : "";
44
+ const missingFlags = REQUIRED_FLAGS.filter((flag) => !help.includes(flag));
45
+ const protocolSupported = help.length > 0 && missingFlags.length === 0 && /stream-json/.test(help);
46
+ const modelError = models instanceof Error ? models : null;
47
+ const modelDiscovery = Array.isArray(models) && models.length > 0;
48
+ const signedOut = modelError?.message === AGY_SIGN_IN_MESSAGE;
49
+ const supported = (value, reason) => ({
50
+ supported: value,
51
+ status: value ? "supported" : "upgrade_required",
52
+ ...(!value && reason ? { reason } : {}),
53
+ });
54
+ return {
55
+ binary: {
56
+ status: protocolSupported ? "supported" : "upgrade_required",
57
+ command: resolved.bin,
58
+ version,
59
+ protocolProfile: protocolSupported ? "agy-stream-json-v1" : null,
60
+ ...(!protocolSupported
61
+ ? { reason: `Update Antigravity CLI (\`agy update\`): missing ${missingFlags.join(", ") || "stream-json support"}` }
62
+ : {}),
63
+ },
64
+ capabilities: {
65
+ sessions: supported(protocolSupported, "Antigravity stream-json input is unavailable"),
66
+ resume: supported(protocolSupported, "Antigravity --conversation resume is unavailable"),
67
+ modelDiscovery: modelDiscovery
68
+ ? supported(true)
69
+ : {
70
+ supported: false,
71
+ // Not signed in is a setup step, not an outdated CLI.
72
+ status: signedOut ? "missing" : "upgrade_required",
73
+ reason: signedOut ? AGY_SIGN_IN_MESSAGE : modelError?.message ?? "Antigravity CLI did not list any models",
74
+ },
75
+ planMode: supported(protocolSupported),
76
+ modes: supported(protocolSupported),
77
+ sessionModelChange: supported(false),
78
+ sessionVariantChange: supported(false),
79
+ sessionEffortChange: supported(false),
80
+ sessionModeChange: supported(false),
81
+ },
82
+ };
83
+ }
84
+ //# sourceMappingURL=probe.js.map