@nodetool-ai/runtime 0.8.2 → 0.8.4-a13.1

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 (295) hide show
  1. package/dist/.nodetool-build-stamp +1 -1
  2. package/dist/canvas-codec.d.ts +3 -0
  3. package/dist/canvas-codec.d.ts.map +1 -0
  4. package/dist/canvas-codec.js +12 -0
  5. package/dist/canvas-codec.js.map +1 -0
  6. package/dist/context-packer.d.ts +1 -1
  7. package/dist/context-packer.js +1 -1
  8. package/dist/context.d.ts +3 -0
  9. package/dist/context.d.ts.map +1 -1
  10. package/dist/context.js +16 -5
  11. package/dist/context.js.map +1 -1
  12. package/dist/host-binaries.d.ts.map +1 -1
  13. package/dist/host-binaries.js +4 -3
  14. package/dist/host-binaries.js.map +1 -1
  15. package/dist/http-client-spans.d.ts +9 -0
  16. package/dist/http-client-spans.d.ts.map +1 -0
  17. package/dist/http-client-spans.js +88 -0
  18. package/dist/http-client-spans.js.map +1 -0
  19. package/dist/image-codec.d.ts +6 -3
  20. package/dist/image-codec.d.ts.map +1 -1
  21. package/dist/image-codec.js +17 -17
  22. package/dist/image-codec.js.map +1 -1
  23. package/dist/image-model-tasks.d.ts +20 -0
  24. package/dist/image-model-tasks.d.ts.map +1 -1
  25. package/dist/image-model-tasks.js +44 -1
  26. package/dist/image-model-tasks.js.map +1 -1
  27. package/dist/index.d.ts +4 -3
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +4 -3
  30. package/dist/index.js.map +1 -1
  31. package/dist/media-ref-bytes.d.ts.map +1 -1
  32. package/dist/media-ref-bytes.js +31 -6
  33. package/dist/media-ref-bytes.js.map +1 -1
  34. package/dist/otlp-json-trace-exporter.d.ts +89 -0
  35. package/dist/otlp-json-trace-exporter.d.ts.map +1 -0
  36. package/dist/otlp-json-trace-exporter.js +155 -0
  37. package/dist/otlp-json-trace-exporter.js.map +1 -0
  38. package/dist/prompt-asset-refs.d.ts +12 -1
  39. package/dist/prompt-asset-refs.d.ts.map +1 -1
  40. package/dist/prompt-asset-refs.js +9 -4
  41. package/dist/prompt-asset-refs.js.map +1 -1
  42. package/dist/providers/antigravity-provider.d.ts +113 -0
  43. package/dist/providers/antigravity-provider.d.ts.map +1 -0
  44. package/dist/providers/antigravity-provider.js +527 -0
  45. package/dist/providers/antigravity-provider.js.map +1 -0
  46. package/dist/providers/api-route-provider.d.ts +22 -0
  47. package/dist/providers/api-route-provider.d.ts.map +1 -0
  48. package/dist/providers/api-route-provider.js +56 -0
  49. package/dist/providers/api-route-provider.js.map +1 -0
  50. package/dist/providers/azure-openai-provider.d.ts +69 -0
  51. package/dist/providers/azure-openai-provider.d.ts.map +1 -0
  52. package/dist/providers/azure-openai-provider.js +233 -0
  53. package/dist/providers/azure-openai-provider.js.map +1 -0
  54. package/dist/providers/base-provider.d.ts.map +1 -1
  55. package/dist/providers/base-provider.js +41 -4
  56. package/dist/providers/base-provider.js.map +1 -1
  57. package/dist/providers/bedrock-provider.d.ts +52 -0
  58. package/dist/providers/bedrock-provider.d.ts.map +1 -0
  59. package/dist/providers/bedrock-provider.js +648 -0
  60. package/dist/providers/bedrock-provider.js.map +1 -0
  61. package/dist/providers/bedrock-transport.d.ts +37 -0
  62. package/dist/providers/bedrock-transport.d.ts.map +1 -0
  63. package/dist/providers/bedrock-transport.js +186 -0
  64. package/dist/providers/bedrock-transport.js.map +1 -0
  65. package/dist/providers/chatgpt-provider.d.ts +48 -0
  66. package/dist/providers/chatgpt-provider.d.ts.map +1 -0
  67. package/dist/providers/chatgpt-provider.js +551 -0
  68. package/dist/providers/chatgpt-provider.js.map +1 -0
  69. package/dist/providers/claude-agent-provider.d.ts +29 -51
  70. package/dist/providers/claude-agent-provider.d.ts.map +1 -1
  71. package/dist/providers/claude-agent-provider.js +144 -202
  72. package/dist/providers/claude-agent-provider.js.map +1 -1
  73. package/dist/providers/claude-cli.d.ts +265 -0
  74. package/dist/providers/claude-cli.d.ts.map +1 -0
  75. package/dist/providers/claude-cli.js +488 -0
  76. package/dist/providers/claude-cli.js.map +1 -0
  77. package/dist/providers/codex-provider.d.ts +9 -2
  78. package/dist/providers/codex-provider.d.ts.map +1 -1
  79. package/dist/providers/codex-provider.js +25 -11
  80. package/dist/providers/codex-provider.js.map +1 -1
  81. package/dist/providers/context-window.d.ts.map +1 -1
  82. package/dist/providers/context-window.js +1 -0
  83. package/dist/providers/context-window.js.map +1 -1
  84. package/dist/providers/core-tools.d.ts +4 -1
  85. package/dist/providers/core-tools.d.ts.map +1 -1
  86. package/dist/providers/core-tools.js +5 -3
  87. package/dist/providers/core-tools.js.map +1 -1
  88. package/dist/providers/cost-calculator.d.ts.map +1 -1
  89. package/dist/providers/cost-calculator.js +9 -0
  90. package/dist/providers/cost-calculator.js.map +1 -1
  91. package/dist/providers/credential-check.d.ts +8 -0
  92. package/dist/providers/credential-check.d.ts.map +1 -1
  93. package/dist/providers/credential-check.js +22 -0
  94. package/dist/providers/credential-check.js.map +1 -1
  95. package/dist/providers/custom-openai-provider.d.ts.map +1 -1
  96. package/dist/providers/custom-openai-provider.js +19 -1
  97. package/dist/providers/custom-openai-provider.js.map +1 -1
  98. package/dist/providers/dreamina-pending.d.ts +22 -0
  99. package/dist/providers/dreamina-pending.d.ts.map +1 -0
  100. package/dist/providers/dreamina-pending.js +86 -0
  101. package/dist/providers/dreamina-pending.js.map +1 -0
  102. package/dist/providers/dreamina-provider.d.ts +10 -3
  103. package/dist/providers/dreamina-provider.d.ts.map +1 -1
  104. package/dist/providers/dreamina-provider.js +325 -45
  105. package/dist/providers/dreamina-provider.js.map +1 -1
  106. package/dist/providers/extension-tab.d.ts +42 -0
  107. package/dist/providers/extension-tab.d.ts.map +1 -0
  108. package/dist/providers/extension-tab.js +200 -0
  109. package/dist/providers/extension-tab.js.map +1 -0
  110. package/dist/providers/fake-provider.d.ts +3 -1
  111. package/dist/providers/fake-provider.d.ts.map +1 -1
  112. package/dist/providers/fake-provider.js +63 -9
  113. package/dist/providers/fake-provider.js.map +1 -1
  114. package/dist/providers/fake-schema-answer.d.ts +10 -0
  115. package/dist/providers/fake-schema-answer.d.ts.map +1 -0
  116. package/dist/providers/fake-schema-answer.js +64 -0
  117. package/dist/providers/fake-schema-answer.js.map +1 -0
  118. package/dist/providers/fal-provider.d.ts.map +1 -1
  119. package/dist/providers/fal-provider.js +5 -2
  120. package/dist/providers/fal-provider.js.map +1 -1
  121. package/dist/providers/gemini-web-provider.d.ts +76 -0
  122. package/dist/providers/gemini-web-provider.d.ts.map +1 -0
  123. package/dist/providers/gemini-web-provider.js +827 -0
  124. package/dist/providers/gemini-web-provider.js.map +1 -0
  125. package/dist/providers/http-transport.d.ts.map +1 -1
  126. package/dist/providers/http-transport.js +2 -0
  127. package/dist/providers/http-transport.js.map +1 -1
  128. package/dist/providers/huggingface-provider.d.ts.map +1 -1
  129. package/dist/providers/huggingface-provider.js +17 -1
  130. package/dist/providers/huggingface-provider.js.map +1 -1
  131. package/dist/providers/index.d.ts +18 -2
  132. package/dist/providers/index.d.ts.map +1 -1
  133. package/dist/providers/index.js +66 -15
  134. package/dist/providers/index.js.map +1 -1
  135. package/dist/providers/llama-provider.d.ts +8 -0
  136. package/dist/providers/llama-provider.d.ts.map +1 -1
  137. package/dist/providers/llama-provider.js +23 -5
  138. package/dist/providers/llama-provider.js.map +1 -1
  139. package/dist/providers/lmstudio-provider.js +2 -2
  140. package/dist/providers/lmstudio-provider.js.map +1 -1
  141. package/dist/providers/manifest-models.d.ts +2 -12
  142. package/dist/providers/manifest-models.d.ts.map +1 -1
  143. package/dist/providers/manifest-models.js +45 -3
  144. package/dist/providers/manifest-models.js.map +1 -1
  145. package/dist/providers/meta-provider.d.ts +53 -6
  146. package/dist/providers/meta-provider.d.ts.map +1 -1
  147. package/dist/providers/meta-provider.js +289 -6
  148. package/dist/providers/meta-provider.js.map +1 -1
  149. package/dist/providers/meta-segmentation.d.ts +27 -0
  150. package/dist/providers/meta-segmentation.d.ts.map +1 -0
  151. package/dist/providers/meta-segmentation.js +141 -0
  152. package/dist/providers/meta-segmentation.js.map +1 -0
  153. package/dist/providers/meta-transcription.d.ts +31 -0
  154. package/dist/providers/meta-transcription.d.ts.map +1 -0
  155. package/dist/providers/meta-transcription.js +187 -0
  156. package/dist/providers/meta-transcription.js.map +1 -0
  157. package/dist/providers/node-llama-cpp-provider.d.ts +6 -3
  158. package/dist/providers/node-llama-cpp-provider.d.ts.map +1 -1
  159. package/dist/providers/node-llama-cpp-provider.js +77 -62
  160. package/dist/providers/node-llama-cpp-provider.js.map +1 -1
  161. package/dist/providers/ollama-provider.d.ts +23 -0
  162. package/dist/providers/ollama-provider.d.ts.map +1 -1
  163. package/dist/providers/ollama-provider.js +140 -27
  164. package/dist/providers/ollama-provider.js.map +1 -1
  165. package/dist/providers/openai-compat/client.d.ts +10 -1
  166. package/dist/providers/openai-compat/client.d.ts.map +1 -1
  167. package/dist/providers/openai-compat/client.js +21 -3
  168. package/dist/providers/openai-compat/client.js.map +1 -1
  169. package/dist/providers/openai-compat/index.d.ts +1 -1
  170. package/dist/providers/openai-compat/index.d.ts.map +1 -1
  171. package/dist/providers/openai-compat/index.js +1 -1
  172. package/dist/providers/openai-compat/index.js.map +1 -1
  173. package/dist/providers/openai-compat/types.d.ts +4 -0
  174. package/dist/providers/openai-compat/types.d.ts.map +1 -1
  175. package/dist/providers/openai-compat-provider.d.ts +11 -0
  176. package/dist/providers/openai-compat-provider.d.ts.map +1 -1
  177. package/dist/providers/openai-compat-provider.js +47 -2
  178. package/dist/providers/openai-compat-provider.js.map +1 -1
  179. package/dist/providers/openai-provider.d.ts +15 -0
  180. package/dist/providers/openai-provider.d.ts.map +1 -1
  181. package/dist/providers/openai-provider.js +50 -12
  182. package/dist/providers/openai-provider.js.map +1 -1
  183. package/dist/providers/opper-provider.d.ts +31 -0
  184. package/dist/providers/opper-provider.d.ts.map +1 -0
  185. package/dist/providers/opper-provider.js +91 -0
  186. package/dist/providers/opper-provider.js.map +1 -0
  187. package/dist/providers/provider-request-log.d.ts.map +1 -1
  188. package/dist/providers/provider-request-log.js +3 -2
  189. package/dist/providers/provider-request-log.js.map +1 -1
  190. package/dist/providers/python-provider.d.ts.map +1 -1
  191. package/dist/providers/python-provider.js +5 -3
  192. package/dist/providers/python-provider.js.map +1 -1
  193. package/dist/providers/responses-api.d.ts +12 -2
  194. package/dist/providers/responses-api.d.ts.map +1 -1
  195. package/dist/providers/responses-api.js +54 -3
  196. package/dist/providers/responses-api.js.map +1 -1
  197. package/dist/providers/safe-url.d.ts.map +1 -1
  198. package/dist/providers/safe-url.js +8 -0
  199. package/dist/providers/safe-url.js.map +1 -1
  200. package/dist/providers/scripted-provider.d.ts.map +1 -1
  201. package/dist/providers/scripted-provider.js +6 -1
  202. package/dist/providers/scripted-provider.js.map +1 -1
  203. package/dist/providers/types.d.ts +16 -0
  204. package/dist/providers/types.d.ts.map +1 -1
  205. package/dist/providers/types.js.map +1 -1
  206. package/dist/providers/vgenv-provider.d.ts +33 -0
  207. package/dist/providers/vgenv-provider.d.ts.map +1 -0
  208. package/dist/providers/vgenv-provider.js +261 -0
  209. package/dist/providers/vgenv-provider.js.map +1 -0
  210. package/dist/providers/vllm-provider.d.ts +7 -0
  211. package/dist/providers/vllm-provider.d.ts.map +1 -1
  212. package/dist/providers/vllm-provider.js +15 -3
  213. package/dist/providers/vllm-provider.js.map +1 -1
  214. package/dist/python-bridge-base.d.ts +16 -6
  215. package/dist/python-bridge-base.d.ts.map +1 -1
  216. package/dist/python-bridge-base.js +117 -40
  217. package/dist/python-bridge-base.js.map +1 -1
  218. package/dist/python-bridge-codec.d.ts +16 -1
  219. package/dist/python-bridge-codec.d.ts.map +1 -1
  220. package/dist/python-bridge-codec.js +60 -2
  221. package/dist/python-bridge-codec.js.map +1 -1
  222. package/dist/python-bridge-framing.d.ts +10 -1
  223. package/dist/python-bridge-framing.d.ts.map +1 -1
  224. package/dist/python-bridge-framing.js +33 -8
  225. package/dist/python-bridge-framing.js.map +1 -1
  226. package/dist/python-bridge-types.d.ts +26 -5
  227. package/dist/python-bridge-types.d.ts.map +1 -1
  228. package/dist/python-bridge-types.js.map +1 -1
  229. package/dist/python-graph-resolver.d.ts.map +1 -1
  230. package/dist/python-graph-resolver.js +12 -2
  231. package/dist/python-graph-resolver.js.map +1 -1
  232. package/dist/python-node-executor.d.ts +14 -3
  233. package/dist/python-node-executor.d.ts.map +1 -1
  234. package/dist/python-node-executor.js +185 -3
  235. package/dist/python-node-executor.js.map +1 -1
  236. package/dist/python-stdio-bridge.d.ts +6 -0
  237. package/dist/python-stdio-bridge.d.ts.map +1 -1
  238. package/dist/python-stdio-bridge.js +58 -12
  239. package/dist/python-stdio-bridge.js.map +1 -1
  240. package/dist/run-trace-context.d.ts +2 -27
  241. package/dist/run-trace-context.d.ts.map +1 -1
  242. package/dist/run-trace-context.js +4 -51
  243. package/dist/run-trace-context.js.map +1 -1
  244. package/dist/run-trace-processor.d.ts +3 -0
  245. package/dist/run-trace-processor.d.ts.map +1 -1
  246. package/dist/run-trace-processor.js +63 -46
  247. package/dist/run-trace-processor.js.map +1 -1
  248. package/dist/run-trace-scope.d.ts +28 -0
  249. package/dist/run-trace-scope.d.ts.map +1 -0
  250. package/dist/run-trace-scope.js +51 -0
  251. package/dist/run-trace-scope.js.map +1 -0
  252. package/dist/run-trace-serialization.d.ts.map +1 -1
  253. package/dist/run-trace-serialization.js +4 -3
  254. package/dist/run-trace-serialization.js.map +1 -1
  255. package/dist/span-record.d.ts +4 -0
  256. package/dist/span-record.d.ts.map +1 -0
  257. package/dist/span-record.js +48 -0
  258. package/dist/span-record.js.map +1 -0
  259. package/dist/swappable-python-bridge.d.ts +6 -6
  260. package/dist/swappable-python-bridge.d.ts.map +1 -1
  261. package/dist/swappable-python-bridge.js +10 -10
  262. package/dist/swappable-python-bridge.js.map +1 -1
  263. package/dist/telemetry.d.ts +2 -2
  264. package/dist/telemetry.d.ts.map +1 -1
  265. package/dist/telemetry.js +33 -34
  266. package/dist/telemetry.js.map +1 -1
  267. package/dist/testing.d.ts +1 -1
  268. package/dist/testing.d.ts.map +1 -1
  269. package/dist/testing.js +55 -3
  270. package/dist/testing.js.map +1 -1
  271. package/dist/token-counter.d.ts +4 -13
  272. package/dist/token-counter.d.ts.map +1 -1
  273. package/dist/token-counter.js +68 -18
  274. package/dist/token-counter.js.map +1 -1
  275. package/dist/trace-context-manager.d.ts +12 -0
  276. package/dist/trace-context-manager.d.ts.map +1 -0
  277. package/dist/trace-context-manager.js +30 -0
  278. package/dist/trace-context-manager.js.map +1 -0
  279. package/dist/trace-exporters.d.ts +2 -3
  280. package/dist/trace-exporters.d.ts.map +1 -1
  281. package/dist/trace-exporters.js +5 -52
  282. package/dist/trace-exporters.js.map +1 -1
  283. package/dist/trace-semantic-conventions.d.ts +2 -0
  284. package/dist/trace-semantic-conventions.d.ts.map +1 -0
  285. package/dist/trace-semantic-conventions.js +2 -0
  286. package/dist/trace-semantic-conventions.js.map +1 -0
  287. package/dist/traced-storage.d.ts +17 -0
  288. package/dist/traced-storage.d.ts.map +1 -0
  289. package/dist/traced-storage.js +41 -0
  290. package/dist/traced-storage.js.map +1 -0
  291. package/dist/tracing-module.d.ts +3 -0
  292. package/dist/tracing-module.d.ts.map +1 -0
  293. package/dist/tracing-module.js +12 -0
  294. package/dist/tracing-module.js.map +1 -0
  295. package/package.json +37 -18
@@ -0,0 +1,527 @@
1
+ /**
2
+ * AntigravityProvider — models reached through Google's Antigravity CLI
3
+ * (`agy`) in headless mode, on the machine's signed-in Antigravity account.
4
+ *
5
+ * There is no API key: `agy` authenticates with credentials cached by an
6
+ * earlier interactive `agy` session. Each turn spawns
7
+ * `agy --input-format stream-json --output-format stream-json`, writes the
8
+ * prompt as one `user` event on stdin, closes stdin, and reads the NDJSON event
9
+ * stream (`init`, `step_update`, `result`). See
10
+ * https://antigravity.google/docs/cli/headless/.
11
+ *
12
+ * The CLI runs its own agent with its own tools, so NodeTool tools are not
13
+ * offered to it. It runs in a dedicated empty scratch directory, never the
14
+ * server's working directory, because headless runs auto-allow file reads and
15
+ * writes inside the active workspace. Shell commands stay soft-denied: the
16
+ * provider never passes `--dangerously-skip-permissions`.
17
+ */
18
+ import { createLogger, importNodeBuiltin } from "@nodetool-ai/config";
19
+ import { PROVIDER_IDS, isString } from "@nodetool-ai/protocol";
20
+ import { z } from "zod";
21
+ import { BaseProvider } from "./base-provider.js";
22
+ import { hashSystemPrompt } from "./provider-session.js";
23
+ import { isProviderMessageEvent, isProviderSessionUpdate, isProviderStop } from "./types.js";
24
+ const log = createLogger("nodetool.runtime.providers.antigravity");
25
+ /** The executable name the official installer puts on PATH. */
26
+ const DEFAULT_COMMAND = "agy";
27
+ /** Where the official installer places `agy` on macOS and Linux. */
28
+ const INSTALLER_BIN_DIR = [".local", "bin"];
29
+ /** How long a finished run may take to exit before it is stopped. */
30
+ const RESULT_EXIT_GRACE_MS = 30_000;
31
+ const INSTALL_HINT = "Install the Antigravity CLI (agy), then run `agy` once in a terminal to sign in.";
32
+ /** A field the CLI may omit or change shape on. Unexpected values read as absent. */
33
+ const lenient = (schema) => schema.optional().catch(undefined);
34
+ /** The fields of a `stream-json` event this provider reads. Others are ignored. */
35
+ const cliEventSchema = z.object({
36
+ event: lenient(z.string()),
37
+ conversation_id: lenient(z.string()),
38
+ step_type: lenient(z.string()),
39
+ text_delta: lenient(z.string()),
40
+ status: lenient(z.string()),
41
+ response: lenient(z.string()),
42
+ error: lenient(z.union([z.string(), z.object({ message: lenient(z.string()) })])),
43
+ structured_output: lenient(z.record(z.string(), z.unknown())),
44
+ usage: lenient(z.object({
45
+ input_tokens: lenient(z.number()),
46
+ output_tokens: lenient(z.number()),
47
+ thinking_tokens: lenient(z.number()),
48
+ cache_read_tokens: lenient(z.number())
49
+ }))
50
+ });
51
+ /** A failed `agy` run. Its message names the remedy. */
52
+ class AntigravityCliError extends Error {
53
+ constructor(message) {
54
+ super(message);
55
+ this.name = "AntigravityCliError";
56
+ }
57
+ }
58
+ export class AntigravityProvider extends BaseProvider {
59
+ static requiredSecrets() {
60
+ // Auth lives in the CLI's own credential cache, not in a NodeTool secret.
61
+ return [];
62
+ }
63
+ runCli;
64
+ /**
65
+ * Within-process cache of the active conversation per thread. The persisted
66
+ * `provider_session` column is the source of truth; this only covers callers
67
+ * that do not thread a session token in (the CLI chat).
68
+ */
69
+ sessions = new Map();
70
+ modelsCache = null;
71
+ constructor(_secrets = {}, options = {}) {
72
+ super(PROVIDER_IDS.ANTIGRAVITY);
73
+ this.runCli = options.runCli ?? spawnAgy;
74
+ }
75
+ /** The CLI's credentials never leave this process. */
76
+ getContainerEnv() {
77
+ return {};
78
+ }
79
+ /** `agy` runs its own tools. NodeTool tools are not forwarded to it. */
80
+ async hasToolSupport() {
81
+ return false;
82
+ }
83
+ async unavailableReason() {
84
+ try {
85
+ const run = await this.runCli(["--version"], { stdin: "", cwd: null });
86
+ await readLines(run);
87
+ const { code, stderr } = await run.exit;
88
+ if (code === 0)
89
+ return null;
90
+ return `The Antigravity CLI failed to start (exit ${code}): ${stderr.trim() || "no output"}`;
91
+ }
92
+ catch (err) {
93
+ return err instanceof Error ? err.message : String(err);
94
+ }
95
+ }
96
+ /**
97
+ * The slugs `agy models` prints. Effort is part of the slug (for example
98
+ * `gemini-3.1-pro-high`). Empty when the CLI is missing or signed out.
99
+ */
100
+ async getAvailableLanguageModels() {
101
+ this.modelsCache ??= this.listModels().catch((err) => {
102
+ log.warn("Listing Antigravity models failed", { error: err.message });
103
+ this.modelsCache = null;
104
+ return [];
105
+ });
106
+ return this.modelsCache;
107
+ }
108
+ async listModels() {
109
+ const run = await this.runCli(["models"], { stdin: "", cwd: null });
110
+ const lines = await readLines(run);
111
+ const { code, stderr } = await run.exit;
112
+ if (code !== 0) {
113
+ throw new AntigravityCliError(`agy models exited ${code}: ${stderr.trim() || "no output"}`);
114
+ }
115
+ return parseModelSlugs(lines).map((id) => ({
116
+ id,
117
+ name: modelDisplayName(id),
118
+ provider: PROVIDER_IDS.ANTIGRAVITY
119
+ }));
120
+ }
121
+ async *generateMessages(args) {
122
+ // A single forced tool is how callers ask for structured output. `agy`
123
+ // enforces a JSON schema natively, so the result comes back as that call.
124
+ const resultTool = args.tools?.length === 1 && args.toolChoice === args.tools[0].name
125
+ ? args.tools[0]
126
+ : undefined;
127
+ const systemPrompt = extractSystemPrompt(args.messages);
128
+ const systemHash = hashSystemPrompt(systemPrompt);
129
+ const threadId = args.threadId ?? null;
130
+ const prior = args.providerSession ??
131
+ (threadId ? (this.sessions.get(threadId) ?? null) : null);
132
+ const canResume = prior != null &&
133
+ prior.providerId === this.provider &&
134
+ prior.model === args.model &&
135
+ (prior.systemHash == null || prior.systemHash === systemHash) &&
136
+ args.messages.length > prior.checkpoint;
137
+ const turn = {
138
+ model: args.model,
139
+ checkpoint: args.messages.length,
140
+ systemHash,
141
+ threadId,
142
+ cacheSession: args.providerSession == null,
143
+ effort: args.effort,
144
+ resultTool,
145
+ signal: args.signal
146
+ };
147
+ // Resuming is best-effort: the CLI may have pruned the conversation. A
148
+ // resume that fails before any content reached the consumer falls back to
149
+ // a fresh conversation primed with the full history.
150
+ const emitted = { content: false };
151
+ if (canResume && prior) {
152
+ try {
153
+ yield* this.runTurn({
154
+ ...turn,
155
+ prompt: buildResumeDelta(args.messages, prior.checkpoint),
156
+ conversation: prior.token,
157
+ emitted
158
+ });
159
+ return;
160
+ }
161
+ catch (err) {
162
+ if (emitted.content || args.signal?.aborted)
163
+ throw err;
164
+ log.warn("Antigravity conversation resume failed; starting fresh", {
165
+ error: err instanceof Error ? err.message : String(err)
166
+ });
167
+ }
168
+ }
169
+ const history = args.loadFullHistory
170
+ ? await args.loadFullHistory()
171
+ : args.messages;
172
+ yield* this.runTurn({
173
+ ...turn,
174
+ prompt: buildFreshPrompt(history, systemPrompt),
175
+ conversation: null,
176
+ emitted
177
+ });
178
+ }
179
+ /** Run one `agy` turn and translate its event stream into stream items. */
180
+ async *runTurn(plan) {
181
+ if (plan.signal?.aborted)
182
+ return;
183
+ const cliArgs = buildCliArgs(plan);
184
+ this.recordRequestPayload({ args: cliArgs, prompt: plan.prompt });
185
+ const cwd = await scratchWorkspace();
186
+ const run = await this.runCli(cliArgs, {
187
+ stdin: `${JSON.stringify({ event: "user", message: { content: plan.prompt } })}\n`,
188
+ cwd
189
+ });
190
+ const onAbort = () => run.kill();
191
+ plan.signal?.addEventListener("abort", onAbort, { once: true });
192
+ let sessionSent = false;
193
+ let result = null;
194
+ try {
195
+ for await (const line of run.lines) {
196
+ const event = parseEvent(line);
197
+ if (!event)
198
+ continue;
199
+ const conversationId = event.conversation_id;
200
+ if (!sessionSent && conversationId) {
201
+ sessionSent = true;
202
+ if (plan.threadId) {
203
+ const session = {
204
+ providerId: this.provider,
205
+ model: plan.model,
206
+ token: conversationId,
207
+ checkpoint: plan.checkpoint,
208
+ systemHash: plan.systemHash
209
+ };
210
+ if (plan.cacheSession)
211
+ this.sessions.set(plan.threadId, session);
212
+ yield { type: "session", session };
213
+ }
214
+ }
215
+ if (event.event === "step_update") {
216
+ const delta = event.text_delta;
217
+ if (event.step_type === "agent_response" && delta && !plan.resultTool) {
218
+ plan.emitted.content = true;
219
+ yield { type: "chunk", content: delta, done: false };
220
+ }
221
+ continue;
222
+ }
223
+ if (event.event === "result") {
224
+ // The provider sends one prompt and closed stdin, so the first
225
+ // result ends the turn and `agy` exits on its own.
226
+ result = event;
227
+ break;
228
+ }
229
+ }
230
+ }
231
+ finally {
232
+ plan.signal?.removeEventListener("abort", onAbort);
233
+ // Stop the process only when the turn did not finish: the consumer
234
+ // stopped early, the run was aborted, or a parse step threw. A finished
235
+ // run is left to exit so it can save the conversation for a resume.
236
+ if (result) {
237
+ // A run that never exits after its result would leak a process.
238
+ setTimeout(() => run.kill(), RESULT_EXIT_GRACE_MS).unref?.();
239
+ }
240
+ else {
241
+ run.kill();
242
+ }
243
+ }
244
+ if (plan.signal?.aborted)
245
+ return;
246
+ if (!result) {
247
+ const { code, stderr } = await run.exit;
248
+ throw cliFailure(`agy exited (${code ?? "signal"}) without a result`, stderr);
249
+ }
250
+ this.trackResultUsage(plan.model, result.usage);
251
+ if (result.status !== "SUCCESS") {
252
+ const error = result.error;
253
+ const detail = isString(error) ? error : (error?.message ?? "");
254
+ throw cliFailure(`agy returned ${result.status ?? "no status"}`, detail);
255
+ }
256
+ if (plan.resultTool) {
257
+ if (!result.structured_output) {
258
+ throw new AntigravityCliError(`agy returned no structured output for ${plan.resultTool.name}`);
259
+ }
260
+ yield {
261
+ id: `result_${result.conversation_id ?? Date.now()}`,
262
+ name: plan.resultTool.name,
263
+ args: result.structured_output
264
+ };
265
+ }
266
+ else if (!plan.emitted.content && result.response) {
267
+ // No deltas streamed (for example an older CLI): use the final text.
268
+ plan.emitted.content = true;
269
+ yield { type: "chunk", content: result.response, done: false };
270
+ }
271
+ yield { type: "chunk", content: "", done: true };
272
+ }
273
+ trackResultUsage(model, usage) {
274
+ if (!usage)
275
+ return;
276
+ this.trackUsage(model, {
277
+ inputTokens: usage.input_tokens ?? 0,
278
+ outputTokens: (usage.output_tokens ?? 0) + (usage.thinking_tokens ?? 0),
279
+ cachedTokens: usage.cache_read_tokens ?? 0
280
+ });
281
+ }
282
+ async generateMessage(args) {
283
+ let content = "";
284
+ const toolCalls = [];
285
+ for await (const item of this.generateMessages(args)) {
286
+ if (isProviderSessionUpdate(item) ||
287
+ isProviderMessageEvent(item) ||
288
+ isProviderStop(item)) {
289
+ continue;
290
+ }
291
+ if ("args" in item) {
292
+ toolCalls.push(item);
293
+ }
294
+ else if (!item.thinking && isString(item.content)) {
295
+ content += item.content;
296
+ }
297
+ }
298
+ return {
299
+ role: "assistant",
300
+ content: content || null,
301
+ toolCalls: toolCalls.length ? toolCalls : null
302
+ };
303
+ }
304
+ }
305
+ /** The `agy` flags for one headless turn. */
306
+ export function buildCliArgs(plan) {
307
+ const args = [
308
+ "--input-format",
309
+ "stream-json",
310
+ "--output-format",
311
+ "stream-json"
312
+ ];
313
+ if (plan.model)
314
+ args.push("--model", plan.model);
315
+ if (plan.conversation)
316
+ args.push("--conversation", plan.conversation);
317
+ if (plan.effort)
318
+ args.push("--effort", cliEffort(plan.effort));
319
+ if (plan.resultTool) {
320
+ args.push("--json-schema", JSON.stringify(plan.resultTool.inputSchema ?? { type: "object" }));
321
+ }
322
+ return args;
323
+ }
324
+ /** Every stdout line of a short-lived `agy` command. */
325
+ async function readLines(run) {
326
+ const lines = [];
327
+ for await (const line of run.lines)
328
+ lines.push(line);
329
+ return lines;
330
+ }
331
+ /** `agy --effort` accepts only low, medium and high. */
332
+ function cliEffort(effort) {
333
+ return effort === "xhigh" || effort === "max" ? "high" : effort;
334
+ }
335
+ /**
336
+ * Model slugs from `agy models` output. The CLI prints one model per line,
337
+ * possibly with a bullet or a trailing description, so this keeps the first
338
+ * token of each line that looks like a slug. Every slug carries a version
339
+ * number, which separates slugs from header words.
340
+ */
341
+ export function parseModelSlugs(lines) {
342
+ const slugs = [];
343
+ for (const raw of lines) {
344
+ const token = raw.trim().replace(/^[-*•]\s*/, "").split(/\s+/)[0] ?? "";
345
+ if (!/^[a-z][a-z0-9._-]*$/i.test(token) || !/\d/.test(token))
346
+ continue;
347
+ if (!slugs.includes(token))
348
+ slugs.push(token);
349
+ }
350
+ return slugs;
351
+ }
352
+ /** `gemini-3.1-pro-high` → `Gemini 3.1 Pro High`. */
353
+ function modelDisplayName(slug) {
354
+ return slug
355
+ .split("-")
356
+ .map((part) => (part ? part[0].toUpperCase() + part.slice(1) : part))
357
+ .join(" ");
358
+ }
359
+ /** One stdout line as an event, or null for a line that is not one. */
360
+ function parseEvent(line) {
361
+ const trimmed = line.trim();
362
+ if (!trimmed.startsWith("{"))
363
+ return null;
364
+ let json;
365
+ try {
366
+ json = JSON.parse(trimmed);
367
+ }
368
+ catch {
369
+ log.debug("Skipping non-JSON agy output line");
370
+ return null;
371
+ }
372
+ const parsed = cliEventSchema.safeParse(json);
373
+ return parsed.success ? parsed.data : null;
374
+ }
375
+ /**
376
+ * An Error for a failed run. It carries no HTTP status on purpose: the generic
377
+ * 401 remedy points at Settings, and `agy` is signed in from a terminal.
378
+ */
379
+ function cliFailure(summary, detail) {
380
+ const text = detail.trim();
381
+ if (/auth|sign[ -]?in|log[ -]?in|credential/i.test(text)) {
382
+ return new AntigravityCliError(`Antigravity sign-in required: ${text}. Run \`agy\` once in a terminal to sign in.`);
383
+ }
384
+ return new AntigravityCliError(text ? `${summary}: ${text}` : summary);
385
+ }
386
+ /** Flatten a message's content to plain text (text blocks only). */
387
+ function textOf(content) {
388
+ if (content == null)
389
+ return "";
390
+ if (isString(content))
391
+ return content;
392
+ return content
393
+ .filter((c) => c.type === "text")
394
+ .map((c) => c.text)
395
+ .join("");
396
+ }
397
+ /** `agy` accepts only text prompts. Refuse images rather than drop them. */
398
+ function assertTextOnly(messages) {
399
+ const withMedia = messages.some((m) => Array.isArray(m.content) && m.content.some((c) => c.type !== "text"));
400
+ if (withMedia) {
401
+ throw new AntigravityCliError("The Antigravity CLI accepts text prompts only. Remove the attached images or media, or pick another provider.");
402
+ }
403
+ }
404
+ function extractSystemPrompt(messages) {
405
+ return messages
406
+ .filter((m) => m.role === "system")
407
+ .map((m) => textOf(m.content))
408
+ .filter(Boolean)
409
+ .join("\n\n");
410
+ }
411
+ /**
412
+ * The user messages added since the checkpoint. Assistant turns in the slice
413
+ * came from the resumed conversation itself, so they are not replayed.
414
+ */
415
+ export function buildResumeDelta(messages, checkpoint) {
416
+ const delta = messages.slice(checkpoint).filter((m) => m.role === "user");
417
+ assertTextOnly(delta);
418
+ return delta
419
+ .map((m) => textOf(m.content))
420
+ .filter(Boolean)
421
+ .join("\n\n");
422
+ }
423
+ /**
424
+ * The prompt for a fresh conversation. `agy` has no system-prompt flag and
425
+ * cannot import earlier turns, so instructions and prior history are sent as
426
+ * delimited blocks ahead of the new user turn.
427
+ */
428
+ export function buildFreshPrompt(messages, systemPrompt) {
429
+ const convo = messages.filter((m) => m.role === "user" || m.role === "assistant");
430
+ assertTextOnly(convo);
431
+ const last = convo[convo.length - 1];
432
+ const newTurn = last?.role === "user" ? textOf(last.content) : "";
433
+ const prior = last?.role === "user" ? convo.slice(0, -1) : convo;
434
+ const transcript = prior
435
+ .map((m) => {
436
+ const text = textOf(m.content);
437
+ return text ? `${m.role === "assistant" ? "Assistant" : "User"}: ${text}` : "";
438
+ })
439
+ .filter(Boolean)
440
+ .join("\n\n");
441
+ return [
442
+ systemPrompt ? `<instructions>\n${systemPrompt}\n</instructions>` : "",
443
+ transcript ? `<conversation_so_far>\n${transcript}\n</conversation_so_far>` : "",
444
+ newTurn
445
+ ]
446
+ .filter(Boolean)
447
+ .join("\n\n");
448
+ }
449
+ /**
450
+ * The empty directory `agy` runs in. Headless runs may read and write inside
451
+ * their workspace, so it must never be the server's own working directory.
452
+ */
453
+ async function scratchWorkspace() {
454
+ const [fs, os, path] = await Promise.all([
455
+ importNodeBuiltin("node:fs/promises"),
456
+ importNodeBuiltin("node:os"),
457
+ importNodeBuiltin("node:path")
458
+ ]);
459
+ if (!fs || !os || !path)
460
+ return null;
461
+ const dir = path.join(os.tmpdir(), "nodetool-antigravity");
462
+ await fs.mkdir(dir, { recursive: true });
463
+ return dir;
464
+ }
465
+ /** The real runner: spawns `agy` with `~/.local/bin` appended to PATH. */
466
+ const spawnAgy = async (args, options) => {
467
+ const [cp, os, path, readline] = await Promise.all([
468
+ importNodeBuiltin("node:child_process"),
469
+ importNodeBuiltin("node:os"),
470
+ importNodeBuiltin("node:path"),
471
+ importNodeBuiltin("node:readline")
472
+ ]);
473
+ if (!cp || !os || !path || !readline) {
474
+ throw new AntigravityCliError("The Antigravity provider requires Node.js");
475
+ }
476
+ // A desktop app launched outside a shell often lacks the installer's bin
477
+ // directory on PATH.
478
+ const installerBin = path.join(os.homedir(), ...INSTALLER_BIN_DIR);
479
+ const env = {
480
+ ...process.env,
481
+ PATH: [process.env["PATH"], installerBin].filter(Boolean).join(path.delimiter)
482
+ };
483
+ const child = cp.spawn(DEFAULT_COMMAND, args, {
484
+ cwd: options.cwd ?? undefined,
485
+ env,
486
+ stdio: ["pipe", "pipe", "pipe"],
487
+ windowsHide: true
488
+ });
489
+ let stderr = "";
490
+ child.stderr.setEncoding("utf8");
491
+ child.stderr.on("data", (data) => {
492
+ // Keep the tail. It holds the failure reason.
493
+ stderr = (stderr + data).slice(-8192);
494
+ });
495
+ const exit = new Promise((resolve, reject) => {
496
+ child.once("error", (err) => {
497
+ reject(err.code === "ENOENT"
498
+ ? new AntigravityCliError(`Antigravity CLI (agy) not found. ${INSTALL_HINT}`)
499
+ : err);
500
+ });
501
+ child.once("close", (code) => resolve({ code, stderr }));
502
+ });
503
+ // A caller that stops early never awaits `exit`. Mark it handled.
504
+ exit.catch(() => undefined);
505
+ // Surface a spawn failure here, before the caller waits on stdout.
506
+ await Promise.race([
507
+ exit.then(() => undefined),
508
+ new Promise((resolve) => child.once("spawn", () => resolve()))
509
+ ]);
510
+ child.stdin.on("error", () => {
511
+ // The process may exit before reading stdin; its exit code reports why.
512
+ });
513
+ child.stdin.end(options.stdin);
514
+ const lines = readline.createInterface({
515
+ input: child.stdout,
516
+ crlfDelay: Infinity
517
+ });
518
+ return {
519
+ lines,
520
+ exit,
521
+ kill: () => {
522
+ if (child.exitCode === null && child.signalCode === null)
523
+ child.kill();
524
+ }
525
+ };
526
+ };
527
+ //# sourceMappingURL=antigravity-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"antigravity-provider.js","sourceRoot":"","sources":["../../src/providers/antigravity-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { OpenAICompatProvider, type OpenAICompatProviderOptions } from "./openai-compat-provider.js";
2
+ import type { LanguageModel } from "./types.js";
3
+ /**
4
+ * API Route chat models use the shared OpenAI-compatible transport. Its
5
+ * `/models` rows carry no tool-calling flag, so the base default (native
6
+ * tools on) applies to every model.
7
+ */
8
+ export declare class APIRouteProvider extends OpenAICompatProvider {
9
+ static requiredSecrets(): string[];
10
+ constructor(secrets: {
11
+ API_ROUTE_API_KEY?: string;
12
+ }, options?: OpenAICompatProviderOptions);
13
+ getContainerEnv(): Record<string, string>;
14
+ /**
15
+ * Keep chat routes, using the shared classifier to exclude image/video IDs.
16
+ * A row whose `supported_endpoint_types` lacks `"openai"` is skipped because
17
+ * this adapter only calls `/chat/completions`. A row without the field is
18
+ * kept.
19
+ */
20
+ getAvailableLanguageModels(): Promise<LanguageModel[]>;
21
+ }
22
+ //# sourceMappingURL=api-route-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-route-provider.d.ts","sourceRoot":"","sources":["../../src/providers/api-route-provider.ts"],"names":[],"mappings":"AACA,OAAO,EACL,oBAAoB,EACpB,KAAK,2BAA2B,EACjC,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAMhD;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,oBAAoB;IACxD,OAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;IAED,YACE,OAAO,EAAE;QAAE,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAAE,EACvC,OAAO,GAAE,2BAAgC,EAQ1C;IAEQ,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEjD;IAED;;;;;OAKG;IACY,0BAA0B,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAoBpE;CACF"}
@@ -0,0 +1,56 @@
1
+ import { createLogger } from "@nodetool-ai/config";
2
+ import { OpenAICompatProvider } from "./openai-compat-provider.js";
3
+ import { classifyListedModel } from "./custom-model-kinds.js";
4
+ const log = createLogger("nodetool.runtime.providers.api-route");
5
+ const API_ROUTE_BASE_URL = "https://global.api-route.com/v1";
6
+ /**
7
+ * API Route chat models use the shared OpenAI-compatible transport. Its
8
+ * `/models` rows carry no tool-calling flag, so the base default (native
9
+ * tools on) applies to every model.
10
+ */
11
+ export class APIRouteProvider extends OpenAICompatProvider {
12
+ static requiredSecrets() {
13
+ return ["API_ROUTE_API_KEY"];
14
+ }
15
+ constructor(secrets, options = {}) {
16
+ const apiKey = secrets.API_ROUTE_API_KEY;
17
+ if (!apiKey)
18
+ throw new Error("API_ROUTE_API_KEY is required");
19
+ super({ providerId: "api_route", apiKey, baseURL: API_ROUTE_BASE_URL }, options);
20
+ }
21
+ getContainerEnv() {
22
+ return { API_ROUTE_API_KEY: this.apiKey };
23
+ }
24
+ /**
25
+ * Keep chat routes, using the shared classifier to exclude image/video IDs.
26
+ * A row whose `supported_endpoint_types` lacks `"openai"` is skipped because
27
+ * this adapter only calls `/chat/completions`. A row without the field is
28
+ * kept.
29
+ */
30
+ async getAvailableLanguageModels() {
31
+ try {
32
+ const rows = await this.fetchCompatModelRows();
33
+ const seen = new Set();
34
+ const models = [];
35
+ for (const row of rows) {
36
+ const endpoints = row.supported_endpoint_types;
37
+ if (Array.isArray(endpoints) && !endpoints.includes("openai"))
38
+ continue;
39
+ if (classifyListedModel(row).kind !== "language")
40
+ continue;
41
+ if (seen.has(row.id))
42
+ continue;
43
+ seen.add(row.id);
44
+ models.push({ id: row.id, name: row.id, provider: this.provider });
45
+ }
46
+ return models;
47
+ }
48
+ catch (error) {
49
+ log.warn("API Route model discovery failed", {
50
+ error: error instanceof Error ? error.message : String(error)
51
+ });
52
+ return [];
53
+ }
54
+ }
55
+ }
56
+ //# sourceMappingURL=api-route-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-route-provider.js","sourceRoot":"","sources":["../../src/providers/api-route-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EACL,oBAAoB,EAErB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,GAAG,GAAG,YAAY,CAAC,sCAAsC,CAAC,CAAC;AACjE,MAAM,kBAAkB,GAAG,iCAAiC,CAAC;AAE7D;;;;GAIG;AACH,MAAM,OAAO,gBAAiB,SAAQ,oBAAoB;IACxD,MAAM,CAAU,eAAe;QAC7B,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC/B,CAAC;IAED,YACE,OAAuC,EACvC,OAAO,GAAgC,EAAE;QAEzC,MAAM,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;QACzC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC9D,KAAK,CACH,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAChE,OAAO,CACR,CAAC;IACJ,CAAC;IAEQ,eAAe;QACtB,OAAO,EAAE,iBAAiB,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5C,CAAC;IAED;;;;;OAKG;IACM,KAAK,CAAC,0BAA0B;QACvC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC/C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;YAC/B,MAAM,MAAM,GAAoB,EAAE,CAAC;YACnC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,SAAS,GAAG,GAAG,CAAC,wBAAwB,CAAC;gBAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBAAE,SAAS;gBACxE,IAAI,mBAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,UAAU;oBAAE,SAAS;gBAC3D,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBAAE,SAAS;gBAC/B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrE,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,kCAAkC,EAAE;gBAC3C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF"}