@jini-ai/agent-runtime 0.1.0
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.
- package/LICENSE +201 -0
- package/README.md +43 -0
- package/dist/acp-model-probe.d.ts +48 -0
- package/dist/acp-model-probe.d.ts.map +1 -0
- package/dist/acp-model-probe.js +15 -0
- package/dist/acp-model-probe.js.map +1 -0
- package/dist/agent-protocol/acp/account-failure.d.ts +54 -0
- package/dist/agent-protocol/acp/account-failure.d.ts.map +1 -0
- package/dist/agent-protocol/acp/account-failure.js +37 -0
- package/dist/agent-protocol/acp/account-failure.js.map +1 -0
- package/dist/agent-protocol/acp/constants.d.ts +26 -0
- package/dist/agent-protocol/acp/constants.d.ts.map +1 -0
- package/dist/agent-protocol/acp/constants.js +39 -0
- package/dist/agent-protocol/acp/constants.js.map +1 -0
- package/dist/agent-protocol/acp/index.d.ts +14 -0
- package/dist/agent-protocol/acp/index.d.ts.map +1 -0
- package/dist/agent-protocol/acp/index.js +14 -0
- package/dist/agent-protocol/acp/index.js.map +1 -0
- package/dist/agent-protocol/acp/json.d.ts +82 -0
- package/dist/agent-protocol/acp/json.d.ts.map +1 -0
- package/dist/agent-protocol/acp/json.js +144 -0
- package/dist/agent-protocol/acp/json.js.map +1 -0
- package/dist/agent-protocol/acp/models.d.ts +112 -0
- package/dist/agent-protocol/acp/models.d.ts.map +1 -0
- package/dist/agent-protocol/acp/models.js +293 -0
- package/dist/agent-protocol/acp/models.js.map +1 -0
- package/dist/agent-protocol/acp/rpc.d.ts +107 -0
- package/dist/agent-protocol/acp/rpc.d.ts.map +1 -0
- package/dist/agent-protocol/acp/rpc.js +162 -0
- package/dist/agent-protocol/acp/rpc.js.map +1 -0
- package/dist/agent-protocol/acp/session-params.d.ts +55 -0
- package/dist/agent-protocol/acp/session-params.d.ts.map +1 -0
- package/dist/agent-protocol/acp/session-params.js +81 -0
- package/dist/agent-protocol/acp/session-params.js.map +1 -0
- package/dist/agent-protocol/acp/session.d.ts +101 -0
- package/dist/agent-protocol/acp/session.d.ts.map +1 -0
- package/dist/agent-protocol/acp/session.js +832 -0
- package/dist/agent-protocol/acp/session.js.map +1 -0
- package/dist/agent-protocol/acp/text-suppression.d.ts +73 -0
- package/dist/agent-protocol/acp/text-suppression.d.ts.map +1 -0
- package/dist/agent-protocol/acp/text-suppression.js +229 -0
- package/dist/agent-protocol/acp/text-suppression.js.map +1 -0
- package/dist/agent-protocol/acp/types.d.ts +27 -0
- package/dist/agent-protocol/acp/types.d.ts.map +1 -0
- package/dist/agent-protocol/acp/types.js +2 -0
- package/dist/agent-protocol/acp/types.js.map +1 -0
- package/dist/agent-protocol/acp/updates.d.ts +166 -0
- package/dist/agent-protocol/acp/updates.d.ts.map +1 -0
- package/dist/agent-protocol/acp/updates.js +268 -0
- package/dist/agent-protocol/acp/updates.js.map +1 -0
- package/dist/agent-protocol/core/index.d.ts +6 -0
- package/dist/agent-protocol/core/index.d.ts.map +1 -0
- package/dist/agent-protocol/core/index.js +6 -0
- package/dist/agent-protocol/core/index.js.map +1 -0
- package/dist/agent-protocol/core/json-line-stream.d.ts +42 -0
- package/dist/agent-protocol/core/json-line-stream.d.ts.map +1 -0
- package/dist/agent-protocol/core/json-line-stream.js +333 -0
- package/dist/agent-protocol/core/json-line-stream.js.map +1 -0
- package/dist/agent-protocol/index.d.ts +8 -0
- package/dist/agent-protocol/index.d.ts.map +1 -0
- package/dist/agent-protocol/index.js +8 -0
- package/dist/agent-protocol/index.js.map +1 -0
- package/dist/agent-protocol/pi-rpc/events.d.ts +26 -0
- package/dist/agent-protocol/pi-rpc/events.d.ts.map +1 -0
- package/dist/agent-protocol/pi-rpc/events.js +167 -0
- package/dist/agent-protocol/pi-rpc/events.js.map +1 -0
- package/dist/agent-protocol/pi-rpc/index.d.ts +11 -0
- package/dist/agent-protocol/pi-rpc/index.d.ts.map +1 -0
- package/dist/agent-protocol/pi-rpc/index.js +11 -0
- package/dist/agent-protocol/pi-rpc/index.js.map +1 -0
- package/dist/agent-protocol/pi-rpc/internal.d.ts +45 -0
- package/dist/agent-protocol/pi-rpc/internal.d.ts.map +1 -0
- package/dist/agent-protocol/pi-rpc/internal.js +41 -0
- package/dist/agent-protocol/pi-rpc/internal.js.map +1 -0
- package/dist/agent-protocol/pi-rpc/models.d.ts +21 -0
- package/dist/agent-protocol/pi-rpc/models.d.ts.map +1 -0
- package/dist/agent-protocol/pi-rpc/models.js +48 -0
- package/dist/agent-protocol/pi-rpc/models.js.map +1 -0
- package/dist/agent-protocol/pi-rpc/session.d.ts +106 -0
- package/dist/agent-protocol/pi-rpc/session.d.ts.map +1 -0
- package/dist/agent-protocol/pi-rpc/session.js +371 -0
- package/dist/agent-protocol/pi-rpc/session.js.map +1 -0
- package/dist/amr-model-cache.d.ts +40 -0
- package/dist/amr-model-cache.d.ts.map +1 -0
- package/dist/amr-model-cache.js +79 -0
- package/dist/amr-model-cache.js.map +1 -0
- package/dist/amr-profile-resolver.d.ts +21 -0
- package/dist/amr-profile-resolver.d.ts.map +1 -0
- package/dist/amr-profile-resolver.js +4 -0
- package/dist/amr-profile-resolver.js.map +1 -0
- package/dist/artifact-taxonomy.d.ts +27 -0
- package/dist/artifact-taxonomy.d.ts.map +1 -0
- package/dist/artifact-taxonomy.js +5 -0
- package/dist/artifact-taxonomy.js.map +1 -0
- package/dist/auth.d.ts +25 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +332 -0
- package/dist/auth.js.map +1 -0
- package/dist/capabilities.d.ts +9 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +2 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/claude-stream.d.ts +37 -0
- package/dist/claude-stream.d.ts.map +1 -0
- package/dist/claude-stream.js +660 -0
- package/dist/claude-stream.js.map +1 -0
- package/dist/copilot-stream.d.ts +37 -0
- package/dist/copilot-stream.d.ts.map +1 -0
- package/dist/copilot-stream.js +136 -0
- package/dist/copilot-stream.js.map +1 -0
- package/dist/defs/aider.d.ts +13 -0
- package/dist/defs/aider.d.ts.map +1 -0
- package/dist/defs/aider.js +63 -0
- package/dist/defs/aider.js.map +1 -0
- package/dist/defs/amp.d.ts +12 -0
- package/dist/defs/amp.d.ts.map +1 -0
- package/dist/defs/amp.js +56 -0
- package/dist/defs/amp.js.map +1 -0
- package/dist/defs/amr.d.ts +37 -0
- package/dist/defs/amr.d.ts.map +1 -0
- package/dist/defs/amr.js +303 -0
- package/dist/defs/amr.js.map +1 -0
- package/dist/defs/antigravity.d.ts +25 -0
- package/dist/defs/antigravity.d.ts.map +1 -0
- package/dist/defs/antigravity.js +213 -0
- package/dist/defs/antigravity.js.map +1 -0
- package/dist/defs/claude.d.ts +30 -0
- package/dist/defs/claude.d.ts.map +1 -0
- package/dist/defs/claude.js +130 -0
- package/dist/defs/claude.js.map +1 -0
- package/dist/defs/codebuddy.d.ts +26 -0
- package/dist/defs/codebuddy.d.ts.map +1 -0
- package/dist/defs/codebuddy.js +124 -0
- package/dist/defs/codebuddy.js.map +1 -0
- package/dist/defs/codex.d.ts +30 -0
- package/dist/defs/codex.d.ts.map +1 -0
- package/dist/defs/codex.js +196 -0
- package/dist/defs/codex.js.map +1 -0
- package/dist/defs/copilot.d.ts +12 -0
- package/dist/defs/copilot.d.ts.map +1 -0
- package/dist/defs/copilot.js +88 -0
- package/dist/defs/copilot.js.map +1 -0
- package/dist/defs/cursor-agent.d.ts +27 -0
- package/dist/defs/cursor-agent.d.ts.map +1 -0
- package/dist/defs/cursor-agent.js +93 -0
- package/dist/defs/cursor-agent.js.map +1 -0
- package/dist/defs/deepseek.d.ts +12 -0
- package/dist/defs/deepseek.d.ts.map +1 -0
- package/dist/defs/deepseek.js +53 -0
- package/dist/defs/deepseek.js.map +1 -0
- package/dist/defs/devin.d.ts +12 -0
- package/dist/defs/devin.d.ts.map +1 -0
- package/dist/defs/devin.js +45 -0
- package/dist/defs/devin.js.map +1 -0
- package/dist/defs/grok-build.d.ts +26 -0
- package/dist/defs/grok-build.d.ts.map +1 -0
- package/dist/defs/grok-build.js +105 -0
- package/dist/defs/grok-build.js.map +1 -0
- package/dist/defs/hermes.d.ts +13 -0
- package/dist/defs/hermes.d.ts.map +1 -0
- package/dist/defs/hermes.js +51 -0
- package/dist/defs/hermes.js.map +1 -0
- package/dist/defs/index.d.ts +33 -0
- package/dist/defs/index.d.ts.map +1 -0
- package/dist/defs/index.js +33 -0
- package/dist/defs/index.js.map +1 -0
- package/dist/defs/kilo.d.ts +12 -0
- package/dist/defs/kilo.d.ts.map +1 -0
- package/dist/defs/kilo.js +20 -0
- package/dist/defs/kilo.js.map +1 -0
- package/dist/defs/kimi.d.ts +13 -0
- package/dist/defs/kimi.d.ts.map +1 -0
- package/dist/defs/kimi.js +26 -0
- package/dist/defs/kimi.js.map +1 -0
- package/dist/defs/kiro.d.ts +12 -0
- package/dist/defs/kiro.d.ts.map +1 -0
- package/dist/defs/kiro.js +20 -0
- package/dist/defs/kiro.js.map +1 -0
- package/dist/defs/mimo.d.ts +13 -0
- package/dist/defs/mimo.d.ts.map +1 -0
- package/dist/defs/mimo.js +26 -0
- package/dist/defs/mimo.js.map +1 -0
- package/dist/defs/opencode.d.ts +27 -0
- package/dist/defs/opencode.d.ts.map +1 -0
- package/dist/defs/opencode.js +89 -0
- package/dist/defs/opencode.js.map +1 -0
- package/dist/defs/pi.d.ts +18 -0
- package/dist/defs/pi.d.ts.map +1 -0
- package/dist/defs/pi.js +94 -0
- package/dist/defs/pi.js.map +1 -0
- package/dist/defs/qoder.d.ts +11 -0
- package/dist/defs/qoder.d.ts.map +1 -0
- package/dist/defs/qoder.js +50 -0
- package/dist/defs/qoder.js.map +1 -0
- package/dist/defs/qwen.d.ts +11 -0
- package/dist/defs/qwen.d.ts.map +1 -0
- package/dist/defs/qwen.js +28 -0
- package/dist/defs/qwen.js.map +1 -0
- package/dist/defs/reasonix.d.ts +20 -0
- package/dist/defs/reasonix.d.ts.map +1 -0
- package/dist/defs/reasonix.js +60 -0
- package/dist/defs/reasonix.js.map +1 -0
- package/dist/defs/shared.d.ts +23 -0
- package/dist/defs/shared.d.ts.map +1 -0
- package/dist/defs/shared.js +58 -0
- package/dist/defs/shared.js.map +1 -0
- package/dist/defs/trae-cli.d.ts +14 -0
- package/dist/defs/trae-cli.d.ts.map +1 -0
- package/dist/defs/trae-cli.js +22 -0
- package/dist/defs/trae-cli.js.map +1 -0
- package/dist/defs/vibe.d.ts +12 -0
- package/dist/defs/vibe.d.ts.map +1 -0
- package/dist/defs/vibe.js +20 -0
- package/dist/defs/vibe.js.map +1 -0
- package/dist/detection.d.ts +14 -0
- package/dist/detection.d.ts.map +1 -0
- package/dist/detection.js +266 -0
- package/dist/detection.js.map +1 -0
- package/dist/diagnostics.d.ts +8 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +95 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/env.d.ts +19 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +95 -0
- package/dist/env.js.map +1 -0
- package/dist/executables.d.ts +24 -0
- package/dist/executables.d.ts.map +1 -0
- package/dist/executables.js +349 -0
- package/dist/executables.js.map +1 -0
- package/dist/index.d.ts +74 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +102 -0
- package/dist/index.js.map +1 -0
- package/dist/invocation.d.ts +6 -0
- package/dist/invocation.d.ts.map +1 -0
- package/dist/invocation.js +47 -0
- package/dist/invocation.js.map +1 -0
- package/dist/json-event-stream.d.ts +9 -0
- package/dist/json-event-stream.d.ts.map +1 -0
- package/dist/json-event-stream.js +856 -0
- package/dist/json-event-stream.js.map +1 -0
- package/dist/launch.d.ts +12 -0
- package/dist/launch.d.ts.map +1 -0
- package/dist/launch.js +221 -0
- package/dist/launch.js.map +1 -0
- package/dist/mcp.d.ts +44 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +12 -0
- package/dist/mcp.js.map +1 -0
- package/dist/metadata.d.ts +24 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +100 -0
- package/dist/metadata.js.map +1 -0
- package/dist/mmd-routes.d.ts +12 -0
- package/dist/mmd-routes.d.ts.map +1 -0
- package/dist/mmd-routes.js +146 -0
- package/dist/mmd-routes.js.map +1 -0
- package/dist/model-registry.d.ts +120 -0
- package/dist/model-registry.d.ts.map +1 -0
- package/dist/model-registry.js +77 -0
- package/dist/model-registry.js.map +1 -0
- package/dist/models.d.ts +16 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +93 -0
- package/dist/models.js.map +1 -0
- package/dist/opencode-log.d.ts +16 -0
- package/dist/opencode-log.d.ts.map +1 -0
- package/dist/opencode-log.js +163 -0
- package/dist/opencode-log.js.map +1 -0
- package/dist/paths.d.ts +3 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +29 -0
- package/dist/paths.js.map +1 -0
- package/dist/pi-models.d.ts +13 -0
- package/dist/pi-models.d.ts.map +1 -0
- package/dist/pi-models.js +36 -0
- package/dist/pi-models.js.map +1 -0
- package/dist/prompt-augmenter.d.ts +60 -0
- package/dist/prompt-augmenter.d.ts.map +1 -0
- package/dist/prompt-augmenter.js +26 -0
- package/dist/prompt-augmenter.js.map +1 -0
- package/dist/prompt-budget.d.ts +20 -0
- package/dist/prompt-budget.d.ts.map +1 -0
- package/dist/prompt-budget.js +226 -0
- package/dist/prompt-budget.js.map +1 -0
- package/dist/prompt-file.d.ts +7 -0
- package/dist/prompt-file.d.ts.map +1 -0
- package/dist/prompt-file.js +27 -0
- package/dist/prompt-file.js.map +1 -0
- package/dist/providers/aihubmix.d.ts +99 -0
- package/dist/providers/aihubmix.d.ts.map +1 -0
- package/dist/providers/aihubmix.js +239 -0
- package/dist/providers/aihubmix.js.map +1 -0
- package/dist/providers/anthropic-messages.d.ts +116 -0
- package/dist/providers/anthropic-messages.d.ts.map +1 -0
- package/dist/providers/anthropic-messages.js +313 -0
- package/dist/providers/anthropic-messages.js.map +1 -0
- package/dist/providers/azure-chat.d.ts +99 -0
- package/dist/providers/azure-chat.d.ts.map +1 -0
- package/dist/providers/azure-chat.js +164 -0
- package/dist/providers/azure-chat.js.map +1 -0
- package/dist/providers/connection-guard.d.ts +67 -0
- package/dist/providers/connection-guard.d.ts.map +1 -0
- package/dist/providers/connection-guard.js +211 -0
- package/dist/providers/connection-guard.js.map +1 -0
- package/dist/providers/elevenlabs.d.ts +28 -0
- package/dist/providers/elevenlabs.d.ts.map +1 -0
- package/dist/providers/elevenlabs.js +138 -0
- package/dist/providers/elevenlabs.js.map +1 -0
- package/dist/providers/google-messages.d.ts +108 -0
- package/dist/providers/google-messages.d.ts.map +1 -0
- package/dist/providers/google-messages.js +284 -0
- package/dist/providers/google-messages.js.map +1 -0
- package/dist/providers/google.d.ts +20 -0
- package/dist/providers/google.d.ts.map +1 -0
- package/dist/providers/google.js +42 -0
- package/dist/providers/google.js.map +1 -0
- package/dist/providers/index.d.ts +39 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +39 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/model-catalog.d.ts +32 -0
- package/dist/providers/model-catalog.d.ts.map +1 -0
- package/dist/providers/model-catalog.js +394 -0
- package/dist/providers/model-catalog.js.map +1 -0
- package/dist/providers/oauth-callback-server.d.ts +35 -0
- package/dist/providers/oauth-callback-server.d.ts.map +1 -0
- package/dist/providers/oauth-callback-server.js +217 -0
- package/dist/providers/oauth-callback-server.js.map +1 -0
- package/dist/providers/oauth-credentials.d.ts +29 -0
- package/dist/providers/oauth-credentials.d.ts.map +1 -0
- package/dist/providers/oauth-credentials.js +70 -0
- package/dist/providers/oauth-credentials.js.map +1 -0
- package/dist/providers/oauth-provider.d.ts +95 -0
- package/dist/providers/oauth-provider.d.ts.map +1 -0
- package/dist/providers/oauth-provider.js +130 -0
- package/dist/providers/oauth-provider.js.map +1 -0
- package/dist/providers/oauth-tokens.d.ts +35 -0
- package/dist/providers/oauth-tokens.d.ts.map +1 -0
- package/dist/providers/oauth-tokens.js +136 -0
- package/dist/providers/oauth-tokens.js.map +1 -0
- package/dist/providers/ollama-chat.d.ts +106 -0
- package/dist/providers/ollama-chat.d.ts.map +1 -0
- package/dist/providers/ollama-chat.js +292 -0
- package/dist/providers/ollama-chat.js.map +1 -0
- package/dist/providers/openai-chat.d.ts +147 -0
- package/dist/providers/openai-chat.d.ts.map +1 -0
- package/dist/providers/openai-chat.js +302 -0
- package/dist/providers/openai-chat.js.map +1 -0
- package/dist/providers/pkce.d.ts +81 -0
- package/dist/providers/pkce.d.ts.map +1 -0
- package/dist/providers/pkce.js +176 -0
- package/dist/providers/pkce.js.map +1 -0
- package/dist/providers/sse-decode.d.ts +47 -0
- package/dist/providers/sse-decode.d.ts.map +1 -0
- package/dist/providers/sse-decode.js +109 -0
- package/dist/providers/sse-decode.js.map +1 -0
- package/dist/providers/token-params.d.ts +29 -0
- package/dist/providers/token-params.d.ts.map +1 -0
- package/dist/providers/token-params.js +41 -0
- package/dist/providers/token-params.js.map +1 -0
- package/dist/providers/turn-end-guard.d.ts +37 -0
- package/dist/providers/turn-end-guard.d.ts.map +1 -0
- package/dist/providers/turn-end-guard.js +42 -0
- package/dist/providers/turn-end-guard.js.map +1 -0
- package/dist/providers/types.d.ts +36 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +13 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/qoder-stream.d.ts +19 -0
- package/dist/qoder-stream.d.ts.map +1 -0
- package/dist/qoder-stream.js +167 -0
- package/dist/qoder-stream.js.map +1 -0
- package/dist/registry.d.ts +5 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +58 -0
- package/dist/registry.js.map +1 -0
- package/dist/resolution.d.ts +2 -0
- package/dist/resolution.d.ts.map +1 -0
- package/dist/resolution.js +19 -0
- package/dist/resolution.js.map +1 -0
- package/dist/role-marker-guard.d.ts +53 -0
- package/dist/role-marker-guard.d.ts.map +1 -0
- package/dist/role-marker-guard.js +280 -0
- package/dist/role-marker-guard.js.map +1 -0
- package/dist/telemetry-sink.d.ts +35 -0
- package/dist/telemetry-sink.d.ts.map +1 -0
- package/dist/telemetry-sink.js +5 -0
- package/dist/telemetry-sink.js.map +1 -0
- package/dist/terminal-launch.d.ts +11 -0
- package/dist/terminal-launch.d.ts.map +1 -0
- package/dist/terminal-launch.js +123 -0
- package/dist/terminal-launch.js.map +1 -0
- package/dist/types.d.ts +185 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +47 -0
package/dist/defs/amr.js
ADDED
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/** Ported from OD's `apps/daemon/src/runtimes/defs/amr.ts` (two de-branded comments; see `source-map.md`). */
|
|
2
|
+
import { execAgentFile } from './shared.js';
|
|
3
|
+
const AMR_MODELS_TIMEOUT_MS = 10_000;
|
|
4
|
+
const AMR_MODELS_RETRY_DELAYS_MS = [250, 750];
|
|
5
|
+
const PREFERRED_AMR_CHAT_MODEL_ORDER = [
|
|
6
|
+
'deepseek-v4-flash',
|
|
7
|
+
'deepseek-v3.2',
|
|
8
|
+
'glm-5.1',
|
|
9
|
+
'gemini-2.5-flash',
|
|
10
|
+
];
|
|
11
|
+
const PREFERRED_AMR_CHAT_MODEL_RANK = new Map(PREFERRED_AMR_CHAT_MODEL_ORDER.map((id, index) => [id, index]));
|
|
12
|
+
// AMR is the vela CLI's ACP stdio mode. `vela agent run --runtime opencode`
|
|
13
|
+
// starts a private OpenCode server and forwards stream-json over ACP JSON-RPC.
|
|
14
|
+
// Required env (set on the daemon process or via Settings → CLI env):
|
|
15
|
+
// VELA_RUNTIME_KEY — OpenRouter (or compatible) API key
|
|
16
|
+
// VELA_LINK_URL — OpenAI-compatible endpoint, e.g. https://openrouter.ai/api/v1
|
|
17
|
+
// VELA_OPENCODE_BIN — optional; absolute path to opencode when not on PATH
|
|
18
|
+
// See docs/new-agent-runtime-acp.md and the vela
|
|
19
|
+
// `specs/current/runtime/manual-agent-run-openrouter.md`.
|
|
20
|
+
//
|
|
21
|
+
// Model wiring notes:
|
|
22
|
+
//
|
|
23
|
+
// 1. vela rejects `session/prompt` until `session/set_model` has been
|
|
24
|
+
// called, so AMR cannot accept the synthetic `default` model id —
|
|
25
|
+
// attachAcpSession skips set_model whenever model === 'default'.
|
|
26
|
+
//
|
|
27
|
+
// 2. Vela 0.0.1 exposes the current link-supported catalog through
|
|
28
|
+
// `vela models`, but that command prints public ids such as
|
|
29
|
+
// `public_model_deepseek_v3_2`. The ACP `session/set_model` call accepts
|
|
30
|
+
// the link-facing slug (`deepseek-v3.2` / `glm-5.1`), so this adapter
|
|
31
|
+
// normalizes those public ids at the spawn boundary until Vela exposes
|
|
32
|
+
// canonical ACP ids directly.
|
|
33
|
+
export function normalizeVelaModelId(rawId) {
|
|
34
|
+
const trimmed = rawId.trim();
|
|
35
|
+
if (!trimmed)
|
|
36
|
+
return null;
|
|
37
|
+
const withoutProvider = trimmed.startsWith('vela/')
|
|
38
|
+
? trimmed.slice('vela/'.length)
|
|
39
|
+
: trimmed;
|
|
40
|
+
const withoutPrefix = withoutProvider.startsWith('public_model_')
|
|
41
|
+
? withoutProvider.slice('public_model_'.length)
|
|
42
|
+
: withoutProvider;
|
|
43
|
+
if (!withoutPrefix)
|
|
44
|
+
return null;
|
|
45
|
+
if (/^deepseek_v3_2$/i.test(withoutPrefix))
|
|
46
|
+
return 'deepseek-v3.2';
|
|
47
|
+
if (/^deepseek-v3-2$/i.test(withoutPrefix))
|
|
48
|
+
return 'deepseek-v3.2';
|
|
49
|
+
if (/^kimi_k2_6$/i.test(withoutPrefix))
|
|
50
|
+
return 'kimi-k2.6';
|
|
51
|
+
if (/^kimi_k2_7_code$/i.test(withoutPrefix))
|
|
52
|
+
return 'kimi-k2.7-code';
|
|
53
|
+
if (/^glm_5_1$/i.test(withoutPrefix))
|
|
54
|
+
return 'glm-5.1';
|
|
55
|
+
if (/^glm_5$/i.test(withoutPrefix))
|
|
56
|
+
return 'glm-5';
|
|
57
|
+
const versioned = normalizeKnownVelaVersionId(withoutPrefix);
|
|
58
|
+
if (versioned)
|
|
59
|
+
return versioned;
|
|
60
|
+
return withoutPrefix.replace(/_/g, '-');
|
|
61
|
+
}
|
|
62
|
+
// Every capture group below is a mandatory (non-optional) part of its
|
|
63
|
+
// pattern — `(haiku|opus|sonnet)` is a required alternation and `(\d+)`
|
|
64
|
+
// requires 1+ digit characters — so none can be empty/undefined when the
|
|
65
|
+
// overall regex matches. `family` needs an explicit assertion because it's
|
|
66
|
+
// the only capture with a method called on it directly; the others type-check
|
|
67
|
+
// fine interpolated bare (`noUncheckedIndexedAccess` types them
|
|
68
|
+
// `string | undefined`, but TypeScript doesn't restrict template-literal
|
|
69
|
+
// interpolation the way it restricts a method call on a possibly-undefined
|
|
70
|
+
// value).
|
|
71
|
+
function normalizeKnownVelaVersionId(rawId) {
|
|
72
|
+
const claude = /^claude[_-](haiku|opus|sonnet)[_-](\d+)[_-](\d+)(.*)$/i.exec(rawId);
|
|
73
|
+
if (claude) {
|
|
74
|
+
const [, family, major, minor, suffix = ''] = claude;
|
|
75
|
+
return `claude-${family.toLowerCase()}-${major}.${minor}${suffix.replace(/_/g, '-')}`;
|
|
76
|
+
}
|
|
77
|
+
const gpt = /^gpt_(\d+)_(\d+)(.*)$/i.exec(rawId);
|
|
78
|
+
if (gpt) {
|
|
79
|
+
const [, major, minor, suffix = ''] = gpt;
|
|
80
|
+
return `gpt-${major}.${minor}${suffix.replace(/_/g, '-')}`;
|
|
81
|
+
}
|
|
82
|
+
const gemini = /^gemini_(\d+)_(\d+)(.*)$/i.exec(rawId);
|
|
83
|
+
if (gemini) {
|
|
84
|
+
const [, major, minor, suffix = ''] = gemini;
|
|
85
|
+
return `gemini-${major}.${minor}${suffix.replace(/_/g, '-')}`;
|
|
86
|
+
}
|
|
87
|
+
const minimax = /^minimax_m(\d+)_(\d+)(.*)$/i.exec(rawId);
|
|
88
|
+
if (minimax) {
|
|
89
|
+
const [, major, minor, suffix = ''] = minimax;
|
|
90
|
+
return `minimax-m${major}.${minor}${suffix.replace(/_/g, '-')}`;
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
function isVelaChatModelId(modelId) {
|
|
95
|
+
// Temporary chat-surface guard: Vela already lists media-generation models,
|
|
96
|
+
// but this AMR runtime adapter currently drives only chat completions.
|
|
97
|
+
// Remove this filter when AMR grows first-class image/video execution.
|
|
98
|
+
const id = modelId.toLowerCase();
|
|
99
|
+
if (id.startsWith('gpt-image-'))
|
|
100
|
+
return false;
|
|
101
|
+
if (id.startsWith('seedance-'))
|
|
102
|
+
return false;
|
|
103
|
+
if (id.startsWith('doubao-seedance-'))
|
|
104
|
+
return false;
|
|
105
|
+
if (id.startsWith('veo-'))
|
|
106
|
+
return false;
|
|
107
|
+
if (id.startsWith('imagen-'))
|
|
108
|
+
return false;
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
export function parseVelaModels(stdout) {
|
|
112
|
+
const seen = new Set();
|
|
113
|
+
const models = [];
|
|
114
|
+
for (const line of String(stdout || '').split('\n')) {
|
|
115
|
+
const trimmed = line.trim();
|
|
116
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
117
|
+
continue;
|
|
118
|
+
// `trimmed` is already non-empty and has no leading whitespace (checked
|
|
119
|
+
// above), so its first whitespace-split token is always non-empty too.
|
|
120
|
+
const rawId = trimmed.split(/\s+/)[0];
|
|
121
|
+
const id = normalizeVelaModelId(rawId);
|
|
122
|
+
if (!id || seen.has(id) || !isVelaChatModelId(id))
|
|
123
|
+
continue;
|
|
124
|
+
seen.add(id);
|
|
125
|
+
models.push({ id, label: id });
|
|
126
|
+
}
|
|
127
|
+
return orderAmrChatModels(models);
|
|
128
|
+
}
|
|
129
|
+
export function parseVelaModelJson(stdout, expectedSource) {
|
|
130
|
+
let parsed;
|
|
131
|
+
try {
|
|
132
|
+
parsed = JSON.parse(stdout);
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
throw new Error(`Invalid vela model JSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
136
|
+
}
|
|
137
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
138
|
+
throw new Error('Invalid vela model JSON: expected object');
|
|
139
|
+
}
|
|
140
|
+
const source = parsed.source;
|
|
141
|
+
if (source !== expectedSource) {
|
|
142
|
+
throw new Error(`Invalid vela model JSON source: expected ${expectedSource}, got ${String(source)}`);
|
|
143
|
+
}
|
|
144
|
+
const data = parsed.data;
|
|
145
|
+
if (!Array.isArray(data)) {
|
|
146
|
+
throw new Error('Invalid vela model JSON: expected data array');
|
|
147
|
+
}
|
|
148
|
+
const seen = new Set();
|
|
149
|
+
const models = [];
|
|
150
|
+
for (const item of data) {
|
|
151
|
+
const rawId = item && typeof item === 'object'
|
|
152
|
+
? item.id
|
|
153
|
+
: null;
|
|
154
|
+
const id = typeof rawId === 'string' ? rawId.trim() : '';
|
|
155
|
+
if (!id || seen.has(id) || !isVelaChatModelId(id))
|
|
156
|
+
continue;
|
|
157
|
+
seen.add(id);
|
|
158
|
+
models.push({ id, label: id });
|
|
159
|
+
}
|
|
160
|
+
return orderAmrChatModels(models);
|
|
161
|
+
}
|
|
162
|
+
function orderAmrChatModels(models) {
|
|
163
|
+
return models
|
|
164
|
+
.map((model, index) => ({ model, index }))
|
|
165
|
+
.sort((a, b) => {
|
|
166
|
+
const aRank = PREFERRED_AMR_CHAT_MODEL_RANK.get(a.model.id) ?? Number.MAX_SAFE_INTEGER;
|
|
167
|
+
const bRank = PREFERRED_AMR_CHAT_MODEL_RANK.get(b.model.id) ?? Number.MAX_SAFE_INTEGER;
|
|
168
|
+
return aRank - bRank || a.index - b.index;
|
|
169
|
+
})
|
|
170
|
+
.map(({ model }) => model);
|
|
171
|
+
}
|
|
172
|
+
function sleep(ms) {
|
|
173
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
174
|
+
}
|
|
175
|
+
function velaModelsErrorMessage(error) {
|
|
176
|
+
if (error instanceof Error)
|
|
177
|
+
return error.message;
|
|
178
|
+
return String(error ?? '');
|
|
179
|
+
}
|
|
180
|
+
function isRetriableVelaModelsError(error) {
|
|
181
|
+
const message = velaModelsErrorMessage(error).toLowerCase();
|
|
182
|
+
return [
|
|
183
|
+
'deadline exceeded',
|
|
184
|
+
'timed out',
|
|
185
|
+
'timeout',
|
|
186
|
+
'temporarily unavailable',
|
|
187
|
+
'temporary failure',
|
|
188
|
+
'econnreset',
|
|
189
|
+
'econnrefused',
|
|
190
|
+
'enotfound',
|
|
191
|
+
'502',
|
|
192
|
+
'503',
|
|
193
|
+
'504',
|
|
194
|
+
].some((pattern) => message.includes(pattern));
|
|
195
|
+
}
|
|
196
|
+
export async function fetchVelaPresetModels(resolvedBin, env) {
|
|
197
|
+
const { stdout } = await execAgentFile(resolvedBin, ['model', 'preset', '--format', 'json'], {
|
|
198
|
+
env,
|
|
199
|
+
timeout: AMR_MODELS_TIMEOUT_MS,
|
|
200
|
+
maxBuffer: 1024 * 1024,
|
|
201
|
+
});
|
|
202
|
+
return parseVelaModelJson(String(stdout), 'preset');
|
|
203
|
+
}
|
|
204
|
+
export async function fetchVelaRemoteModelsWithRetry(resolvedBin, env) {
|
|
205
|
+
// The internal exhaustion check below (`attempt === AMR_MODELS_RETRY_DELAYS_MS.length`)
|
|
206
|
+
// always throws on the last allowed attempt — strictly before the `for`
|
|
207
|
+
// condition itself would ever end the loop — so there's no way to fall
|
|
208
|
+
// through normally; no trailing fallback throw is needed. That same check
|
|
209
|
+
// also means `attempt` is always a valid in-bounds index into
|
|
210
|
+
// `AMR_MODELS_RETRY_DELAYS_MS` whenever we reach the `sleep()` call below
|
|
211
|
+
// (the assertion just satisfies `noUncheckedIndexedAccess`).
|
|
212
|
+
//
|
|
213
|
+
// Coverage note (re-derived, not merely restated from the paragraph
|
|
214
|
+
// above): `for (let attempt = 0; ; attempt += 1)` has an empty middle
|
|
215
|
+
// clause — an unconditional, infinite loop — and its body contains no
|
|
216
|
+
// `break` (grepped: none). The only two ways out are the `return` on a
|
|
217
|
+
// successful parse and the `throw` in the catch arm, and the `throw` is
|
|
218
|
+
// unconditionally forced once `attempt === AMR_MODELS_RETRY_DELAYS_MS.length`
|
|
219
|
+
// (`AMR_MODELS_RETRY_DELAYS_MS` is the literal 2-element `[250, 750]`
|
|
220
|
+
// above, so that's guaranteed after at most 3 attempts). So this
|
|
221
|
+
// function's implicit end-of-body statement (the closing `}` two lines
|
|
222
|
+
// below) can never execute — v8/istanbul still instruments it because
|
|
223
|
+
// it can't prove an arbitrary `for(;;)` terminates, but the real control
|
|
224
|
+
// flow genuinely never reaches it. Documented here (and in
|
|
225
|
+
// `source-map.md`'s 2026-07-22 entry) instead of forced via a test,
|
|
226
|
+
// per this repo's no-`/* v8 ignore */` standard.
|
|
227
|
+
for (let attempt = 0;; attempt += 1) {
|
|
228
|
+
try {
|
|
229
|
+
const { stdout } = await execAgentFile(resolvedBin, ['model', 'list', '--format', 'json'], {
|
|
230
|
+
env,
|
|
231
|
+
timeout: AMR_MODELS_TIMEOUT_MS,
|
|
232
|
+
maxBuffer: 1024 * 1024,
|
|
233
|
+
});
|
|
234
|
+
return parseVelaModelJson(String(stdout), 'remote');
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
if (attempt === AMR_MODELS_RETRY_DELAYS_MS.length ||
|
|
238
|
+
!isRetriableVelaModelsError(error)) {
|
|
239
|
+
throw error;
|
|
240
|
+
}
|
|
241
|
+
await sleep(AMR_MODELS_RETRY_DELAYS_MS[attempt]);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Read the signed-in account's billing summary via the vela CLI — the same
|
|
247
|
+
* data source used for models, so balance/tier come through the versioned CLI
|
|
248
|
+
* contract rather than a separate HTTP call. Returns total available balance
|
|
249
|
+
* and the real membership tier.
|
|
250
|
+
*/
|
|
251
|
+
export async function fetchVelaBillingSummary(resolvedBin, env) {
|
|
252
|
+
const { stdout } = await execAgentFile(resolvedBin, ['billing', 'summary', '--format', 'json'], { env, timeout: AMR_MODELS_TIMEOUT_MS, maxBuffer: 1024 * 1024 });
|
|
253
|
+
const data = JSON.parse(String(stdout));
|
|
254
|
+
// Use `balanceUsd` — the same field the console wallet page renders as the
|
|
255
|
+
// headline "余额" — so the two surfaces always agree. Fall back to the total
|
|
256
|
+
// available only if `balanceUsd` is missing.
|
|
257
|
+
const balanceUsd = typeof data.balanceUsd === 'string'
|
|
258
|
+
? data.balanceUsd
|
|
259
|
+
: typeof data.totalAvailableCreditsUsd === 'string'
|
|
260
|
+
? data.totalAvailableCreditsUsd
|
|
261
|
+
: null;
|
|
262
|
+
// `membershipTier` is omitted for free accounts. A SUCCESSFUL summary with no
|
|
263
|
+
// tier therefore means "free" — normalize to the explicit sentinel so the UI
|
|
264
|
+
// shows the plan and the Upgrade CTA for free users. "Unknown" (billing
|
|
265
|
+
// unavailable) is signalled separately by the fetch rejecting → null account,
|
|
266
|
+
// never by an absent tier on a successful read.
|
|
267
|
+
const tier = typeof data.membershipTier === 'string' && data.membershipTier.trim()
|
|
268
|
+
? data.membershipTier.trim()
|
|
269
|
+
: 'free';
|
|
270
|
+
return { plan: tier, balanceUsd };
|
|
271
|
+
}
|
|
272
|
+
export const amrAgentDef = {
|
|
273
|
+
id: 'amr',
|
|
274
|
+
name: 'AMR',
|
|
275
|
+
bin: 'vela',
|
|
276
|
+
versionArgs: ['--version'],
|
|
277
|
+
fetchModels: fetchVelaRemoteModelsWithRetry,
|
|
278
|
+
// Fail closed when Vela's live catalog is unavailable. Stale static
|
|
279
|
+
// fallbacks let users select models that link/opencode no longer accepts.
|
|
280
|
+
fallbackModels: [],
|
|
281
|
+
buildArgs: () => ['agent', 'run', '--runtime', 'opencode'],
|
|
282
|
+
streamFormat: 'acp-json-rpc',
|
|
283
|
+
// vela resumes the upstream OpenCode session via ACP session/load across
|
|
284
|
+
// turns (the OpenCode session store persists per conversation), so the daemon
|
|
285
|
+
// captures the durable handle, skips the transcript resend on resume, and
|
|
286
|
+
// maps vela's resume_failed onto the reseed path. See resumesSessionViaAcpLoad.
|
|
287
|
+
resumesSessionViaAcpLoad: true,
|
|
288
|
+
// Vela routes model selection through ACP's `session/set_model` and only
|
|
289
|
+
// accepts ids that survived the `vela models` preflight check, so a
|
|
290
|
+
// free-text "Custom" id silently fails at spawn. The model picker
|
|
291
|
+
// surfaces the live Vela catalog instead.
|
|
292
|
+
supportsCustomModel: false,
|
|
293
|
+
supportsImagePaths: true,
|
|
294
|
+
// Daemon-process env override for emergency operator pinning. Normal UI
|
|
295
|
+
// selection comes from the live `vela models` catalog and is preflighted
|
|
296
|
+
// before spawn.
|
|
297
|
+
defaultModelEnvVar: 'VELA_DEFAULT_MODEL',
|
|
298
|
+
// Vela/OpenCode can spend extended stretches silent while the upstream
|
|
299
|
+
// provider is still working. Keep the outer chat watchdog aligned with the
|
|
300
|
+
// 30-minute ACP stage timeout so the daemon does not fail the run first.
|
|
301
|
+
inactivityTimeoutMs: 30 * 60 * 1000,
|
|
302
|
+
};
|
|
303
|
+
//# sourceMappingURL=amr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amr.js","sourceRoot":"","sources":["../../src/defs/amr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export declare function writeAntigravityModelSelection(label: string, settingsPath?: string): void;
|
|
2
|
+
export declare function acquireAntigravityModelLock(): Promise<() => void>;
|
|
3
|
+
export declare function _resetAntigravityModelLockForTests(): void;
|
|
4
|
+
export interface WaitForAgyModelOptions {
|
|
5
|
+
timeoutMs?: number;
|
|
6
|
+
pollIntervalMs?: number;
|
|
7
|
+
readFile?: (path: string) => Promise<string>;
|
|
8
|
+
now?: () => number;
|
|
9
|
+
abortSignal?: AbortSignal;
|
|
10
|
+
}
|
|
11
|
+
export declare function waitForAgyToReadModel(logFilePath: string, expectedModel: string, options?: WaitForAgyModelOptions): Promise<boolean>;
|
|
12
|
+
export declare const antigravityAgentDef: {
|
|
13
|
+
id: string;
|
|
14
|
+
name: string;
|
|
15
|
+
bin: string;
|
|
16
|
+
versionArgs: string[];
|
|
17
|
+
fallbackModels: import("../types.js").RuntimeModelOption[];
|
|
18
|
+
supportsCustomModel: false;
|
|
19
|
+
buildArgs: (_prompt: string, _imagePaths: string[], _extra?: string[] | undefined, options?: import("../types.js").RuntimeBuildOptions | undefined, runtimeContext?: import("../types.js").RuntimeContext | undefined) => string[];
|
|
20
|
+
promptViaStdin: true;
|
|
21
|
+
streamFormat: string;
|
|
22
|
+
installUrl: string;
|
|
23
|
+
docsUrl: string;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=antigravity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"antigravity.d.ts","sourceRoot":"","sources":["../../src/defs/antigravity.ts"],"names":[],"mappings":"AAgDA,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,MAAM,EACb,YAAY,GAAE,MAAkC,GAC/C,IAAI,CAgBN;AAeD,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,CAevE;AAKD,wBAAgB,kCAAkC,IAAI,IAAI,CAEzD;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAE7C,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IASnB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAgBD,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,OAAO,CAAC,CAgClB;AAED,eAAO,MAAM,mBAAmB;;;;;;;;;;;;CAqFL,CAAC"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/** Ported verbatim from OD's `apps/daemon/src/runtimes/defs/antigravity.ts` (import path adjusted only). See `source-map.md`. */
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, } from 'node:fs';
|
|
3
|
+
import { readFile as fsReadFile } from 'node:fs/promises';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
import { dirname, join } from 'node:path';
|
|
6
|
+
import { DEFAULT_MODEL_OPTION } from './shared.js';
|
|
7
|
+
// `agy` v1.0.3 still has no `--model` flag (upstream issue #35), but the
|
|
8
|
+
// TUI's Switch-Model picker writes the choice to its settings.json, and
|
|
9
|
+
// every `agy -p` invocation re-reads that file on startup — verified by
|
|
10
|
+
// capturing the `--log-file` line `Propagating selected model override to
|
|
11
|
+
// backend: label="<model>"`. So we can route OD's model picker through
|
|
12
|
+
// settings.json: when the user picks a concrete model in Settings, the
|
|
13
|
+
// daemon writes the label into agy's settings.json right before spawn,
|
|
14
|
+
// and the resulting print-mode run uses that model.
|
|
15
|
+
//
|
|
16
|
+
// Two ids the picker exposes are special:
|
|
17
|
+
// - 'default' : leave settings.json untouched, so agy keeps
|
|
18
|
+
// whatever the user last picked in its own TUI.
|
|
19
|
+
// (Respects user choice when they switch models
|
|
20
|
+
// from `agy` directly.)
|
|
21
|
+
// - any other id : the literal display label agy expects (e.g.
|
|
22
|
+
// "Gemini 3.1 Pro (High)", "Claude Sonnet 4.6
|
|
23
|
+
// (Thinking)"). We persist it before spawn.
|
|
24
|
+
//
|
|
25
|
+
// `supportsCustomModel: false` because the label set is a server-side
|
|
26
|
+
// enum — a typed id agy doesn't recognise resolves to a silent
|
|
27
|
+
// `availableModels` cache miss + empty print-mode output, which surfaces
|
|
28
|
+
// to the user as a generic "empty response" error.
|
|
29
|
+
//
|
|
30
|
+
// The 8 model labels mirror what `Switch Model` in agy's TUI lists for
|
|
31
|
+
// consumer-tier accounts as of 2026-05-28. The set is small and stable
|
|
32
|
+
// enough to ship statically until upstream adds a programmatic
|
|
33
|
+
// `agy models` subcommand (also tracked under issue #35).
|
|
34
|
+
const ANTIGRAVITY_SETTINGS_PATH = join(homedir(), '.gemini', 'antigravity-cli', 'settings.json');
|
|
35
|
+
export function writeAntigravityModelSelection(label, settingsPath = ANTIGRAVITY_SETTINGS_PATH) {
|
|
36
|
+
let existing = {};
|
|
37
|
+
if (existsSync(settingsPath)) {
|
|
38
|
+
try {
|
|
39
|
+
const parsed = JSON.parse(readFileSync(settingsPath, 'utf8'));
|
|
40
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
41
|
+
existing = parsed;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Corrupt JSON — fall through and rewrite the file from scratch so
|
|
46
|
+
// the next spawn starts from a known-good state.
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
existing.model = label;
|
|
50
|
+
mkdirSync(dirname(settingsPath), { recursive: true });
|
|
51
|
+
writeFileSync(settingsPath, `${JSON.stringify(existing, null, 2)}\n`);
|
|
52
|
+
}
|
|
53
|
+
// Per-process serialization for write-settings → spawn → agy-reads
|
|
54
|
+
// cycles on antigravity. `~/.gemini/antigravity-cli/settings.json` is
|
|
55
|
+
// process-global, so two OD runs that both pick concrete (non-default)
|
|
56
|
+
// models can race: run A writes model A, spawn A starts, run B writes
|
|
57
|
+
// model B before A's agy has read settings.json — A then executes on
|
|
58
|
+
// model B. The daemon serialises non-default antigravity spawns
|
|
59
|
+
// through this chain: each acquire awaits the previous release, and
|
|
60
|
+
// each release fires only after the spawned agy actually emits
|
|
61
|
+
// `Propagating selected model override to backend: label="<X>"` in
|
|
62
|
+
// its `--log-file` (which is the upstream signal that settings.json
|
|
63
|
+
// has been read).
|
|
64
|
+
let antigravityLockChain = Promise.resolve();
|
|
65
|
+
export async function acquireAntigravityModelLock() {
|
|
66
|
+
const previous = antigravityLockChain;
|
|
67
|
+
// Definite-assignment assertion (`!`), not a `() => {}` fallback default:
|
|
68
|
+
// the ECMAScript spec guarantees a `Promise` executor runs synchronously,
|
|
69
|
+
// immediately, during construction — `release = resolve` below has
|
|
70
|
+
// already run by the time `new Promise(...)` returns, so a fallback
|
|
71
|
+
// no-op default would be assigned, coverage-instrumented, and never once
|
|
72
|
+
// invoked. Removing it drops that dead function instead of padding a
|
|
73
|
+
// test around code that cannot execute.
|
|
74
|
+
let release;
|
|
75
|
+
antigravityLockChain = new Promise((resolve) => {
|
|
76
|
+
release = resolve;
|
|
77
|
+
});
|
|
78
|
+
await previous;
|
|
79
|
+
return release;
|
|
80
|
+
}
|
|
81
|
+
// Visible for tests. Resets the module-level lock chain so a test that
|
|
82
|
+
// installed a hanging acquirer can release it without leaking state to
|
|
83
|
+
// subsequent test cases. Production code never calls this.
|
|
84
|
+
export function _resetAntigravityModelLockForTests() {
|
|
85
|
+
antigravityLockChain = Promise.resolve();
|
|
86
|
+
}
|
|
87
|
+
// Polls agy's `--log-file` for the line
|
|
88
|
+
// `Propagating selected model override to backend: label="<expectedModel>"`
|
|
89
|
+
// which `model_config_manager.go` emits once agy has finished reading
|
|
90
|
+
// `~/.gemini/antigravity-cli/settings.json` and sent the model
|
|
91
|
+
// override to the upstream backend. Returns true on observed signal,
|
|
92
|
+
// false on timeout OR abort. Never throws — a missing log file is
|
|
93
|
+
// treated as "not yet seen" so the polling loop keeps retrying until
|
|
94
|
+
// either the deadline or the abort signal fires.
|
|
95
|
+
//
|
|
96
|
+
// IMPORTANT: callers MUST NOT use a `false` return as a "go ahead and
|
|
97
|
+
// release the settings.json lock" signal — false means "I gave up
|
|
98
|
+
// polling," not "agy definitely didn't read this." Release the lock
|
|
99
|
+
// only on (a) a `true` return, OR (b) child exit. See server.ts for
|
|
100
|
+
// the wiring.
|
|
101
|
+
export async function waitForAgyToReadModel(logFilePath, expectedModel, options = {}) {
|
|
102
|
+
const timeoutMs = options.timeoutMs ?? 15_000;
|
|
103
|
+
const pollIntervalMs = options.pollIntervalMs ?? 250;
|
|
104
|
+
const readFile = options.readFile ?? ((path) => fsReadFile(path, 'utf8'));
|
|
105
|
+
const now = options.now ?? Date.now;
|
|
106
|
+
const abortSignal = options.abortSignal;
|
|
107
|
+
if (abortSignal?.aborted)
|
|
108
|
+
return false;
|
|
109
|
+
const escaped = expectedModel.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
110
|
+
const pattern = new RegExp(`Propagating selected model override to backend: label="${escaped}"`);
|
|
111
|
+
const deadline = now() + timeoutMs;
|
|
112
|
+
while (now() < deadline) {
|
|
113
|
+
if (abortSignal?.aborted)
|
|
114
|
+
return false;
|
|
115
|
+
try {
|
|
116
|
+
const content = await readFile(logFilePath);
|
|
117
|
+
if (pattern.test(content))
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// Log file may not have appeared yet; keep polling.
|
|
122
|
+
}
|
|
123
|
+
if (now() >= deadline)
|
|
124
|
+
break;
|
|
125
|
+
await new Promise((resolve) => {
|
|
126
|
+
const timer = setTimeout(resolve, pollIntervalMs);
|
|
127
|
+
const onAbort = () => {
|
|
128
|
+
clearTimeout(timer);
|
|
129
|
+
resolve();
|
|
130
|
+
};
|
|
131
|
+
abortSignal?.addEventListener('abort', onAbort, { once: true });
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
export const antigravityAgentDef = {
|
|
137
|
+
id: 'antigravity',
|
|
138
|
+
name: 'Antigravity',
|
|
139
|
+
bin: 'agy',
|
|
140
|
+
versionArgs: ['--version'],
|
|
141
|
+
fallbackModels: [
|
|
142
|
+
DEFAULT_MODEL_OPTION,
|
|
143
|
+
{ id: 'Gemini 3.1 Pro (High)', label: 'Gemini 3.1 Pro (High)' },
|
|
144
|
+
{ id: 'Gemini 3.1 Pro (Low)', label: 'Gemini 3.1 Pro (Low)' },
|
|
145
|
+
{ id: 'Gemini 3.5 Flash (High)', label: 'Gemini 3.5 Flash (High)' },
|
|
146
|
+
{ id: 'Gemini 3.5 Flash (Medium)', label: 'Gemini 3.5 Flash (Medium)' },
|
|
147
|
+
{ id: 'Gemini 3.5 Flash (Low)', label: 'Gemini 3.5 Flash (Low)' },
|
|
148
|
+
{
|
|
149
|
+
id: 'Claude Sonnet 4.6 (Thinking)',
|
|
150
|
+
label: 'Claude Sonnet 4.6 (Thinking)',
|
|
151
|
+
},
|
|
152
|
+
{ id: 'Claude Opus 4.6 (Thinking)', label: 'Claude Opus 4.6 (Thinking)' },
|
|
153
|
+
{ id: 'GPT-OSS 120B (Medium)', label: 'GPT-OSS 120B (Medium)' },
|
|
154
|
+
],
|
|
155
|
+
supportsCustomModel: false,
|
|
156
|
+
// We deliberately do NOT opt into `resumesSessionViaCli` / agy's `-c`
|
|
157
|
+
// resume flag on follow-up turns. Tested both shapes; `-c` activates
|
|
158
|
+
// agy's internal agentic loop (multi-step model retries, tool calls,
|
|
159
|
+
// fallback-to-cached-response on tool errors) which can't be steered
|
|
160
|
+
// from OD's system-prompt OVERRIDE — even with the strongest wording
|
|
161
|
+
// we got an identical byte-for-byte form re-emission on turn 2 when
|
|
162
|
+
// turn 1's tool-call retry path returned the cached form response.
|
|
163
|
+
//
|
|
164
|
+
// Instead we treat agy as a stateless plain adapter like qwen /
|
|
165
|
+
// deepseek: every spawn gets the full OD-rendered transcript via
|
|
166
|
+
// `buildDaemonTranscript`, and that transcript's prior assistant
|
|
167
|
+
// turns are sanitized to strip `<question-form>` markup + form-schema
|
|
168
|
+
// JSON fences (see `sanitizePriorAssistantTurnForTranscript` in
|
|
169
|
+
// apps/web/src/providers/daemon.ts). The stronger OVERRIDE block
|
|
170
|
+
// composed in server.ts gives a second line of defense for weak
|
|
171
|
+
// plain-stream models like Gemini 3.5 Flash.
|
|
172
|
+
buildArgs: (_prompt, _imagePaths, _extra = [], options = {}, runtimeContext = {}) => {
|
|
173
|
+
if (options.model && options.model !== DEFAULT_MODEL_OPTION.id) {
|
|
174
|
+
writeAntigravityModelSelection(options.model, runtimeContext.antigravitySettingsPath);
|
|
175
|
+
}
|
|
176
|
+
// We invoke agy via `-p -` (print mode + stdin sentinel), NOT
|
|
177
|
+
// `chat -`. Verified against `agy --help` on v1.0.3 — the
|
|
178
|
+
// `Available subcommands` list is `changelog / help / install /
|
|
179
|
+
// plugin / update`, and `chat` is NOT among them. `-p` is the
|
|
180
|
+
// documented print-mode flag (`Short alias for --print`) and
|
|
181
|
+
// `agy -p -` reads the prompt from stdin. The looper reviewer
|
|
182
|
+
// bot's environment runs a different agy build that may have
|
|
183
|
+
// renamed the entry point; until upstream confirms a stable
|
|
184
|
+
// headless subcommand (see google-antigravity/antigravity-cli#119)
|
|
185
|
+
// and the change actually ships in the auto-update channel that
|
|
186
|
+
// packaged OD users get, `-p -` is the contract that actually
|
|
187
|
+
// produces a print-mode reply on the installed CLI.
|
|
188
|
+
const args = [];
|
|
189
|
+
// Always opt into `--log-file` when the daemon supplied a path so
|
|
190
|
+
// it can post-exit grep for the actual upstream failure shape
|
|
191
|
+
// (auth missing vs quota reached vs upstream error) — without it
|
|
192
|
+
// the chat surfaces a generic "empty response" because print mode
|
|
193
|
+
// never echoes those errors on stdout. See server.ts empty-output
|
|
194
|
+
// guard for the consumer.
|
|
195
|
+
//
|
|
196
|
+
// Flag order is load-bearing on agy v1.0.3: `agy -p --log-file
|
|
197
|
+
// /tmp/x -` runs successfully but leaves /tmp/x empty, while `agy
|
|
198
|
+
// --log-file /tmp/x -p -` captures the diagnostic log, including
|
|
199
|
+
// `Propagating selected model override to backend: label="<model>"`
|
|
200
|
+
// and auth/quota failures.
|
|
201
|
+
if (runtimeContext.agentLogFilePath) {
|
|
202
|
+
args.push('--log-file', runtimeContext.agentLogFilePath);
|
|
203
|
+
}
|
|
204
|
+
args.push('-p');
|
|
205
|
+
args.push('-');
|
|
206
|
+
return args;
|
|
207
|
+
},
|
|
208
|
+
promptViaStdin: true,
|
|
209
|
+
streamFormat: 'plain',
|
|
210
|
+
installUrl: 'https://antigravity.google/cli',
|
|
211
|
+
docsUrl: 'https://antigravity.google/docs/cli-overview',
|
|
212
|
+
};
|
|
213
|
+
//# sourceMappingURL=antigravity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"antigravity.js","sourceRoot":"","sources":["../../src/defs/antigravity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export declare const claudeAgentDef: {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
bin: string;
|
|
5
|
+
fallbackBins: string[];
|
|
6
|
+
versionArgs: string[];
|
|
7
|
+
authProbe: {
|
|
8
|
+
args: string[];
|
|
9
|
+
timeoutMs: number;
|
|
10
|
+
};
|
|
11
|
+
helpArgs: string[];
|
|
12
|
+
capabilityFlags: {
|
|
13
|
+
'--include-partial-messages': string;
|
|
14
|
+
'--add-dir': string;
|
|
15
|
+
'--effort': string;
|
|
16
|
+
};
|
|
17
|
+
fallbackModels: import("../types.js").RuntimeModelOption[];
|
|
18
|
+
fetchModels: (_resolvedBin: string, env: import("../types.js").RuntimeEnv) => Promise<import("../types.js").RuntimeModelOption[] | null>;
|
|
19
|
+
reasoningOptions: {
|
|
20
|
+
id: string;
|
|
21
|
+
label: string;
|
|
22
|
+
}[];
|
|
23
|
+
buildArgs: (_prompt: string, _imagePaths: string[], extraAllowedDirs?: string[] | undefined, options?: import("../types.js").RuntimeBuildOptions | undefined, runtimeContext?: import("../types.js").RuntimeContext | undefined) => string[];
|
|
24
|
+
promptViaStdin: true;
|
|
25
|
+
promptInputFormat: "stream-json";
|
|
26
|
+
streamFormat: string;
|
|
27
|
+
externalMcpInjection: "claude-mcp-json";
|
|
28
|
+
resumesSessionViaCli: true;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=claude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/defs/claude.ts"],"names":[],"mappings":"AA2BA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4GA,CAAC"}
|