@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
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { MAX_TIMEOUT_MS } from './constants.js';
|
|
2
|
+
/** Default environment variable name `resolveAcpTimeoutMs` reads when the
|
|
3
|
+
* caller does not supply its own. A host application with its own branded
|
|
4
|
+
* env var naming convention should pass its own name explicitly rather than
|
|
5
|
+
* rely on this default. */
|
|
6
|
+
export const DEFAULT_ACP_TIMEOUT_ENV_VAR = 'AGENT_RUNTIME_ACP_TIMEOUT_MS';
|
|
7
|
+
/**
|
|
8
|
+
* Extracts a human-readable error message from an unknown thrown value.
|
|
9
|
+
* Returns `err.message` for `Error` instances, `String(err)` otherwise.
|
|
10
|
+
*
|
|
11
|
+
* @param err - Any caught value (typically an `Error` but may be anything).
|
|
12
|
+
*/
|
|
13
|
+
export function errorMessage(err) {
|
|
14
|
+
return err instanceof Error ? err.message : String(err);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Resolves the effective ACP timeout from an environment variable, falling
|
|
18
|
+
* back to `fallbackMs` when the variable is absent or non-finite. Clamps the
|
|
19
|
+
* result to `[0, MAX_TIMEOUT_MS]`.
|
|
20
|
+
*
|
|
21
|
+
* @param env - The process environment object to read the timeout var from.
|
|
22
|
+
* @param fallbackMs - The default timeout to use when the env var is unset.
|
|
23
|
+
* @param envVarName - The environment variable name to read. Defaults to
|
|
24
|
+
* `DEFAULT_ACP_TIMEOUT_ENV_VAR`; a host application may pass its own
|
|
25
|
+
* branded name (its own `<PRODUCT>_ACP_TIMEOUT_MS`-style variable) here
|
|
26
|
+
* without this package hardcoding any one product's naming convention.
|
|
27
|
+
* @returns The resolved timeout in milliseconds.
|
|
28
|
+
*/
|
|
29
|
+
export function resolveAcpTimeoutMs(env, fallbackMs, envVarName = DEFAULT_ACP_TIMEOUT_ENV_VAR) {
|
|
30
|
+
const raw = Number(env[envVarName]);
|
|
31
|
+
if (!Number.isFinite(raw))
|
|
32
|
+
return fallbackMs;
|
|
33
|
+
return Math.min(MAX_TIMEOUT_MS, Math.max(0, Math.floor(raw)));
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Coerces an unknown value to a `JsonObject` if it is a non-null, non-array
|
|
37
|
+
* plain object, or returns `null` otherwise. The primary guard used throughout
|
|
38
|
+
* the ACP layer before accessing named properties on parsed JSON frames.
|
|
39
|
+
*
|
|
40
|
+
* @param value - Any value from a JSON parse result.
|
|
41
|
+
* @returns The value cast as `JsonObject`, or `null` when the cast is unsafe.
|
|
42
|
+
*/
|
|
43
|
+
export function asObject(value) {
|
|
44
|
+
return value && typeof value === 'object' ? value : null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Returns a short diagnostic string describing the JSON kind of `value`:
|
|
48
|
+
* `'array'`, `'null'`, or the result of `typeof`. Used to build
|
|
49
|
+
* `acp_raw_event_shape` diagnostics without touching the value.
|
|
50
|
+
*
|
|
51
|
+
* @param value - Any value from a parsed ACP update object.
|
|
52
|
+
*/
|
|
53
|
+
export function acpValueKind(value) {
|
|
54
|
+
if (Array.isArray(value))
|
|
55
|
+
return 'array';
|
|
56
|
+
if (value === null)
|
|
57
|
+
return 'null';
|
|
58
|
+
return typeof value;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Returns a sorted array of own string keys from `value` if it is a
|
|
62
|
+
* `JsonObject`, or an empty array otherwise. Used to snapshot object
|
|
63
|
+
* structure for diagnostic payloads without risking a throw.
|
|
64
|
+
*
|
|
65
|
+
* @param value - Any value from a parsed ACP update object.
|
|
66
|
+
*/
|
|
67
|
+
export function objectKeys(value) {
|
|
68
|
+
const obj = asObject(value);
|
|
69
|
+
return obj ? Object.keys(obj).sort() : [];
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Recursively traverses an ACP update value up to 4 levels deep and returns
|
|
73
|
+
* the first non-empty string found, checking common text-bearing keys in order:
|
|
74
|
+
* `text`, `delta`, `content`, `message`, `output`, `answer`, `value`, `body`,
|
|
75
|
+
* `parts`, `choices`. Handles string scalars, flat arrays, and nested objects.
|
|
76
|
+
*
|
|
77
|
+
* Used as the extraction primitive by `extractAcpUpdateText`.
|
|
78
|
+
*
|
|
79
|
+
* @param value - A value from a parsed ACP session update.
|
|
80
|
+
* @param depth - Current recursion depth (max 4); callers omit this.
|
|
81
|
+
* @returns The first non-empty string found, or `null` when none is present.
|
|
82
|
+
*/
|
|
83
|
+
export function extractAcpTextValue(value, depth = 0) {
|
|
84
|
+
if (depth > 4)
|
|
85
|
+
return null;
|
|
86
|
+
if (typeof value === 'string')
|
|
87
|
+
return value.length > 0 ? value : null;
|
|
88
|
+
if (Array.isArray(value)) {
|
|
89
|
+
const text = value
|
|
90
|
+
.map((item) => extractAcpTextValue(item, depth + 1))
|
|
91
|
+
.filter((part) => typeof part === 'string' && part.length > 0)
|
|
92
|
+
.join('');
|
|
93
|
+
return text.length > 0 ? text : null;
|
|
94
|
+
}
|
|
95
|
+
const obj = asObject(value);
|
|
96
|
+
if (!obj)
|
|
97
|
+
return null;
|
|
98
|
+
for (const key of [
|
|
99
|
+
'text',
|
|
100
|
+
'delta',
|
|
101
|
+
'content',
|
|
102
|
+
'message',
|
|
103
|
+
'output',
|
|
104
|
+
'answer',
|
|
105
|
+
'value',
|
|
106
|
+
'body',
|
|
107
|
+
'parts',
|
|
108
|
+
'choices',
|
|
109
|
+
]) {
|
|
110
|
+
const text = extractAcpTextValue(obj[key], depth + 1);
|
|
111
|
+
if (text)
|
|
112
|
+
return text;
|
|
113
|
+
}
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Extracts the first non-empty text string from the top-level properties of a
|
|
118
|
+
* parsed ACP session update object. Checks the same key list as
|
|
119
|
+
* `extractAcpTextValue` but at only one level of depth (the update object
|
|
120
|
+
* itself), delegating deep traversal to that helper.
|
|
121
|
+
*
|
|
122
|
+
* @param update - A parsed ACP `session/update` params object.
|
|
123
|
+
* @returns The first non-empty text string, or `null` when none is present.
|
|
124
|
+
*/
|
|
125
|
+
export function extractAcpUpdateText(update) {
|
|
126
|
+
for (const key of [
|
|
127
|
+
'content',
|
|
128
|
+
'text',
|
|
129
|
+
'delta',
|
|
130
|
+
'message',
|
|
131
|
+
'output',
|
|
132
|
+
'answer',
|
|
133
|
+
'value',
|
|
134
|
+
'body',
|
|
135
|
+
'parts',
|
|
136
|
+
'choices',
|
|
137
|
+
]) {
|
|
138
|
+
const text = extractAcpTextValue(update[key]);
|
|
139
|
+
if (text)
|
|
140
|
+
return text;
|
|
141
|
+
}
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/agent-protocol/acp/json.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import type { JsonObject } from './types.js';
|
|
2
|
+
/** A single model entry exposed to the daemon's model-selection UI and to `session/set_model` calls. */
|
|
3
|
+
export interface ModelOption {
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
}
|
|
7
|
+
/** Parsed model-selection config option extracted from an ACP `session/new` result's `configOptions` array. */
|
|
8
|
+
export interface AcpModelConfigOption {
|
|
9
|
+
configId: string;
|
|
10
|
+
currentValue: string | null;
|
|
11
|
+
values: unknown[];
|
|
12
|
+
}
|
|
13
|
+
/** Options accepted by `detectAcpModels` to control how the probe subprocess is launched and identified. */
|
|
14
|
+
export interface DetectAcpModelsOptions {
|
|
15
|
+
bin: string;
|
|
16
|
+
args: string[];
|
|
17
|
+
cwd?: string;
|
|
18
|
+
env?: NodeJS.ProcessEnv;
|
|
19
|
+
timeoutMs?: number;
|
|
20
|
+
clientName?: string;
|
|
21
|
+
clientVersion?: string;
|
|
22
|
+
defaultModelOption?: ModelOption;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Normalises a raw config-option field value to a lowercase, whitespace- and
|
|
26
|
+
* punctuation-stripped token for fuzzy matching against `MODEL_CONFIG_OPTION_IDS`.
|
|
27
|
+
*
|
|
28
|
+
* @param value - A raw field value from an ACP config option object.
|
|
29
|
+
* @returns A normalised token string, or `''` when `value` is not a string.
|
|
30
|
+
*/
|
|
31
|
+
export declare function normalizeConfigOptionToken(value: unknown): string;
|
|
32
|
+
/**
|
|
33
|
+
* Returns `true` when the given `option` object from `configOptions` represents
|
|
34
|
+
* a model-selection config option, using a cascade of category, id, and name
|
|
35
|
+
* normalisation checks against `MODEL_CONFIG_OPTION_IDS`.
|
|
36
|
+
*
|
|
37
|
+
* @param option - A single item from the `configOptions` array.
|
|
38
|
+
* @param configId - The trimmed `id` field of that item.
|
|
39
|
+
*/
|
|
40
|
+
export declare function isModelConfigOption(option: JsonObject, configId: string): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Scans the `configOptions` array from an ACP `session/new` result and returns
|
|
43
|
+
* the first entry that passes `isModelConfigOption`. Returns `null` when no
|
|
44
|
+
* model config option is found, so callers can fall back to the `models` field.
|
|
45
|
+
*
|
|
46
|
+
* @param configOptions - The raw `result.configOptions` value from a session response.
|
|
47
|
+
* @returns A parsed `AcpModelConfigOption` or `null` when absent.
|
|
48
|
+
*/
|
|
49
|
+
export declare function findModelConfigOption(configOptions: unknown): AcpModelConfigOption | null;
|
|
50
|
+
/**
|
|
51
|
+
* Extracts and normalises the available models list from an ACP
|
|
52
|
+
* `configOptions` array (preferred) into a `ModelOption[]`. Prepends
|
|
53
|
+
* `defaultModelOption` and deduplicates by id. Returns `null` when no model
|
|
54
|
+
* config option is found in `configOptions`.
|
|
55
|
+
*
|
|
56
|
+
* @param configOptions - The raw `result.configOptions` from a session response.
|
|
57
|
+
* @param defaultModelOption - The fallback option to prepend to the list.
|
|
58
|
+
* @returns `{ currentModelId, models }` or `null` when no config option is found.
|
|
59
|
+
*/
|
|
60
|
+
export declare function normalizeModelConfigOptions(configOptions: unknown, defaultModelOption: ModelOption): {
|
|
61
|
+
currentModelId: string | null;
|
|
62
|
+
models: ModelOption[];
|
|
63
|
+
} | null;
|
|
64
|
+
/**
|
|
65
|
+
* Produces the final ordered `ModelOption[]` for a session, merging the
|
|
66
|
+
* `configOptions` path (preferred when it yields more than one option) with
|
|
67
|
+
* the legacy `models.availableModels` path. Always includes `defaultModelOption`
|
|
68
|
+
* at position zero and deduplicates by id.
|
|
69
|
+
*
|
|
70
|
+
* @param models - The raw `result.models` value from a `session/new` response.
|
|
71
|
+
* @param defaultModelOption - The fallback option to prepend.
|
|
72
|
+
* @param configOptions - Optional `result.configOptions` for the config-option path.
|
|
73
|
+
* @returns A deduplicated array of `ModelOption` items.
|
|
74
|
+
*/
|
|
75
|
+
export declare function normalizeModels(models: unknown, defaultModelOption: ModelOption, configOptions?: unknown): ModelOption[];
|
|
76
|
+
/**
|
|
77
|
+
* Returns `true` for JSON-RPC error codes that indicate a model-selection
|
|
78
|
+
* failure from which the session can recover by falling back to the default
|
|
79
|
+
* model and sending the prompt anyway.
|
|
80
|
+
*
|
|
81
|
+
* @param code - The `error.code` value from a JSON-RPC error response.
|
|
82
|
+
*/
|
|
83
|
+
export declare function modelSelectionErrorIsRecoverable(code: unknown): boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Reads the currently active model id from a `session/new` (or
|
|
86
|
+
* `session/set_model`) result object, checking `configOptions` first and
|
|
87
|
+
* falling back to `models.currentModelId`. Returns `null` when neither is set.
|
|
88
|
+
*
|
|
89
|
+
* @param result - The parsed `result` object from a session handshake response.
|
|
90
|
+
*/
|
|
91
|
+
export declare function currentModelFromSessionResult(result: JsonObject): string | null;
|
|
92
|
+
/**
|
|
93
|
+
* Probes a running ACP binary by spawning it, performing the
|
|
94
|
+
* `initialize` → `session/new` handshake, and reading the model list from the
|
|
95
|
+
* session result. The child is killed with `SIGTERM` once the list is
|
|
96
|
+
* extracted or the timeout expires.
|
|
97
|
+
*
|
|
98
|
+
* Used by runtime adapter definitions to populate the model-selection dropdown
|
|
99
|
+
* without waiting for an actual prompt run.
|
|
100
|
+
*
|
|
101
|
+
* @param options.bin - Absolute path or `$PATH`-resolvable name of the ACP binary.
|
|
102
|
+
* @param options.args - CLI arguments to pass to the binary.
|
|
103
|
+
* @param options.cwd - Working directory for the probe subprocess.
|
|
104
|
+
* @param options.env - Environment for the probe subprocess (default: `process.env`).
|
|
105
|
+
* @param options.timeoutMs - Hard timeout for the probe; subject to `MAX_TIMEOUT_MS`.
|
|
106
|
+
* @param options.clientName - Client name sent in the `initialize` handshake.
|
|
107
|
+
* @param options.clientVersion - Client version sent in the `initialize` handshake.
|
|
108
|
+
* @param options.defaultModelOption - Fallback option prepended to the result list.
|
|
109
|
+
* @returns A promise resolving to the available `ModelOption[]`.
|
|
110
|
+
*/
|
|
111
|
+
export declare function detectAcpModels({ bin, args, cwd, env, timeoutMs, clientName, clientVersion, defaultModelOption, }: DetectAcpModelsOptions): Promise<ModelOption[]>;
|
|
112
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../src/agent-protocol/acp/models.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAa,UAAU,EAAe,MAAM,YAAY,CAAC;AAMrE,wGAAwG;AACxG,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AACD,+GAA+G;AAC/G,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB;AACD,4GAA4G;AAC5G,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,WAAW,CAAC;CAClC;AACD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIjE;AACD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQjF;AACD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,OAAO,GAAG,oBAAoB,GAAG,IAAI,CAqBzF;AACD;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,OAAO,EACtB,kBAAkB,EAAE,WAAW,GAC9B;IAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,WAAW,EAAE,CAAA;CAAE,GAAG,IAAI,CAsBjE;AACD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,OAAO,EACf,kBAAkB,EAAE,WAAW,EAC/B,aAAa,CAAC,EAAE,OAAO,GACtB,WAAW,EAAE,CAqBf;AACD;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAEvE;AACD;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAO/E;AACD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,eAAe,CAAC,EACpC,GAAG,EACH,IAAI,EACJ,GAAmB,EACnB,GAAiB,EACjB,SAA8B,EAC9B,UAAmC,EACnC,aAAiC,EACjC,kBAAqE,GACtE,EAAE,sBAAsB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAoGjD"}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/** @module agent-protocol/acp/models
|
|
2
|
+
* ACP model detection, normalisation, and config-option selection. The primary
|
|
3
|
+
* export `detectAcpModels` spawns an ACP subprocess, performs the
|
|
4
|
+
* `initialize` + `session/new` handshake, and returns the available model list.
|
|
5
|
+
* Consumed by runtime adapter definitions. Depends on the core JSON-line
|
|
6
|
+
* stream and acp/types, acp/constants, acp/json, acp/rpc, and
|
|
7
|
+
* acp/session-params.
|
|
8
|
+
*/
|
|
9
|
+
import { spawn } from 'node:child_process';
|
|
10
|
+
import { createJsonLineStream } from '../core/index.js';
|
|
11
|
+
import { ACP_PROTOCOL_VERSION, DEFAULT_TIMEOUT_MS, MODEL_CONFIG_OPTION_IDS } from './constants.js';
|
|
12
|
+
import { errorMessage, resolveAcpTimeoutMs, asObject } from './json.js';
|
|
13
|
+
import { sendRpc, rpcErrorMessage } from './rpc.js';
|
|
14
|
+
import { buildAcpSessionNewParams } from './session-params.js';
|
|
15
|
+
/**
|
|
16
|
+
* Normalises a raw config-option field value to a lowercase, whitespace- and
|
|
17
|
+
* punctuation-stripped token for fuzzy matching against `MODEL_CONFIG_OPTION_IDS`.
|
|
18
|
+
*
|
|
19
|
+
* @param value - A raw field value from an ACP config option object.
|
|
20
|
+
* @returns A normalised token string, or `''` when `value` is not a string.
|
|
21
|
+
*/
|
|
22
|
+
export function normalizeConfigOptionToken(value) {
|
|
23
|
+
return typeof value === 'string'
|
|
24
|
+
? value.trim().toLowerCase().replace(/[\s_-]+/g, '')
|
|
25
|
+
: '';
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Returns `true` when the given `option` object from `configOptions` represents
|
|
29
|
+
* a model-selection config option, using a cascade of category, id, and name
|
|
30
|
+
* normalisation checks against `MODEL_CONFIG_OPTION_IDS`.
|
|
31
|
+
*
|
|
32
|
+
* @param option - A single item from the `configOptions` array.
|
|
33
|
+
* @param configId - The trimmed `id` field of that item.
|
|
34
|
+
*/
|
|
35
|
+
export function isModelConfigOption(option, configId) {
|
|
36
|
+
const category = normalizeConfigOptionToken(option.category);
|
|
37
|
+
if (category === 'model')
|
|
38
|
+
return true;
|
|
39
|
+
const id = normalizeConfigOptionToken(configId);
|
|
40
|
+
if (id === 'model')
|
|
41
|
+
return true;
|
|
42
|
+
if (category)
|
|
43
|
+
return false;
|
|
44
|
+
const name = normalizeConfigOptionToken(option.name);
|
|
45
|
+
return MODEL_CONFIG_OPTION_IDS.has(id) || name === 'model';
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Scans the `configOptions` array from an ACP `session/new` result and returns
|
|
49
|
+
* the first entry that passes `isModelConfigOption`. Returns `null` when no
|
|
50
|
+
* model config option is found, so callers can fall back to the `models` field.
|
|
51
|
+
*
|
|
52
|
+
* @param configOptions - The raw `result.configOptions` value from a session response.
|
|
53
|
+
* @returns A parsed `AcpModelConfigOption` or `null` when absent.
|
|
54
|
+
*/
|
|
55
|
+
export function findModelConfigOption(configOptions) {
|
|
56
|
+
const options = Array.isArray(configOptions) ? configOptions : [];
|
|
57
|
+
for (const rawOption of options) {
|
|
58
|
+
const option = asObject(rawOption);
|
|
59
|
+
if (!option)
|
|
60
|
+
continue;
|
|
61
|
+
const configId = typeof option.id === 'string' ? option.id.trim() : '';
|
|
62
|
+
if (!configId)
|
|
63
|
+
continue;
|
|
64
|
+
const type = typeof option.type === 'string' ? option.type.trim() : '';
|
|
65
|
+
if (type && type !== 'select')
|
|
66
|
+
continue;
|
|
67
|
+
if (!isModelConfigOption(option, configId))
|
|
68
|
+
continue;
|
|
69
|
+
const currentValue = typeof option.currentValue === 'string' && option.currentValue.trim()
|
|
70
|
+
? option.currentValue.trim()
|
|
71
|
+
: null;
|
|
72
|
+
return {
|
|
73
|
+
configId,
|
|
74
|
+
currentValue,
|
|
75
|
+
values: Array.isArray(option.options) ? option.options : [],
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Extracts and normalises the available models list from an ACP
|
|
82
|
+
* `configOptions` array (preferred) into a `ModelOption[]`. Prepends
|
|
83
|
+
* `defaultModelOption` and deduplicates by id. Returns `null` when no model
|
|
84
|
+
* config option is found in `configOptions`.
|
|
85
|
+
*
|
|
86
|
+
* @param configOptions - The raw `result.configOptions` from a session response.
|
|
87
|
+
* @param defaultModelOption - The fallback option to prepend to the list.
|
|
88
|
+
* @returns `{ currentModelId, models }` or `null` when no config option is found.
|
|
89
|
+
*/
|
|
90
|
+
export function normalizeModelConfigOptions(configOptions, defaultModelOption) {
|
|
91
|
+
const modelConfig = findModelConfigOption(configOptions);
|
|
92
|
+
if (!modelConfig)
|
|
93
|
+
return null;
|
|
94
|
+
const seen = new Set([defaultModelOption.id]);
|
|
95
|
+
const out = [defaultModelOption];
|
|
96
|
+
for (const rawValue of modelConfig.values) {
|
|
97
|
+
const value = asObject(rawValue);
|
|
98
|
+
if (!value)
|
|
99
|
+
continue;
|
|
100
|
+
const id = typeof value.value === 'string' && value.value.trim()
|
|
101
|
+
? value.value.trim()
|
|
102
|
+
: typeof value.id === 'string'
|
|
103
|
+
? value.id.trim()
|
|
104
|
+
: '';
|
|
105
|
+
if (!id || seen.has(id))
|
|
106
|
+
continue;
|
|
107
|
+
seen.add(id);
|
|
108
|
+
const name = typeof value.name === 'string' ? value.name.trim() : '';
|
|
109
|
+
const isCurrent = id === modelConfig.currentValue;
|
|
110
|
+
const labelBase = name && name !== id ? `${name} (${id})` : id;
|
|
111
|
+
out.push({ id, label: isCurrent ? `${labelBase} • current` : labelBase });
|
|
112
|
+
}
|
|
113
|
+
return { currentModelId: modelConfig.currentValue, models: out };
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Produces the final ordered `ModelOption[]` for a session, merging the
|
|
117
|
+
* `configOptions` path (preferred when it yields more than one option) with
|
|
118
|
+
* the legacy `models.availableModels` path. Always includes `defaultModelOption`
|
|
119
|
+
* at position zero and deduplicates by id.
|
|
120
|
+
*
|
|
121
|
+
* @param models - The raw `result.models` value from a `session/new` response.
|
|
122
|
+
* @param defaultModelOption - The fallback option to prepend.
|
|
123
|
+
* @param configOptions - Optional `result.configOptions` for the config-option path.
|
|
124
|
+
* @returns A deduplicated array of `ModelOption` items.
|
|
125
|
+
*/
|
|
126
|
+
export function normalizeModels(models, defaultModelOption, configOptions) {
|
|
127
|
+
const configModels = normalizeModelConfigOptions(configOptions, defaultModelOption);
|
|
128
|
+
if (configModels && configModels.models.length > 1) {
|
|
129
|
+
return configModels.models;
|
|
130
|
+
}
|
|
131
|
+
const modelsObj = asObject(models);
|
|
132
|
+
const available = Array.isArray(modelsObj?.availableModels) ? modelsObj.availableModels : [];
|
|
133
|
+
const currentModelId = typeof modelsObj?.currentModelId === 'string' ? modelsObj.currentModelId : null;
|
|
134
|
+
const seen = new Set([defaultModelOption.id]);
|
|
135
|
+
const out = [defaultModelOption];
|
|
136
|
+
for (const model of available) {
|
|
137
|
+
const id = typeof model?.modelId === 'string' ? model.modelId.trim() : '';
|
|
138
|
+
if (!id || seen.has(id))
|
|
139
|
+
continue;
|
|
140
|
+
seen.add(id);
|
|
141
|
+
const name = typeof model?.name === 'string' ? model.name.trim() : '';
|
|
142
|
+
const isCurrent = id === currentModelId;
|
|
143
|
+
const labelBase = name && name !== id ? `${name} (${id})` : id;
|
|
144
|
+
out.push({ id, label: isCurrent ? `${labelBase} • current` : labelBase });
|
|
145
|
+
}
|
|
146
|
+
return out.length > 1 || !configModels ? out : configModels.models;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Returns `true` for JSON-RPC error codes that indicate a model-selection
|
|
150
|
+
* failure from which the session can recover by falling back to the default
|
|
151
|
+
* model and sending the prompt anyway.
|
|
152
|
+
*
|
|
153
|
+
* @param code - The `error.code` value from a JSON-RPC error response.
|
|
154
|
+
*/
|
|
155
|
+
export function modelSelectionErrorIsRecoverable(code) {
|
|
156
|
+
return code === -32603 || code === -32602 || code === -32601 || code === -32002;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Reads the currently active model id from a `session/new` (or
|
|
160
|
+
* `session/set_model`) result object, checking `configOptions` first and
|
|
161
|
+
* falling back to `models.currentModelId`. Returns `null` when neither is set.
|
|
162
|
+
*
|
|
163
|
+
* @param result - The parsed `result` object from a session handshake response.
|
|
164
|
+
*/
|
|
165
|
+
export function currentModelFromSessionResult(result) {
|
|
166
|
+
const configCurrent = findModelConfigOption(result.configOptions)?.currentValue;
|
|
167
|
+
if (configCurrent)
|
|
168
|
+
return configCurrent;
|
|
169
|
+
const models = asObject(result.models);
|
|
170
|
+
return typeof models?.currentModelId === 'string' && models.currentModelId.trim()
|
|
171
|
+
? models.currentModelId.trim()
|
|
172
|
+
: null;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Probes a running ACP binary by spawning it, performing the
|
|
176
|
+
* `initialize` → `session/new` handshake, and reading the model list from the
|
|
177
|
+
* session result. The child is killed with `SIGTERM` once the list is
|
|
178
|
+
* extracted or the timeout expires.
|
|
179
|
+
*
|
|
180
|
+
* Used by runtime adapter definitions to populate the model-selection dropdown
|
|
181
|
+
* without waiting for an actual prompt run.
|
|
182
|
+
*
|
|
183
|
+
* @param options.bin - Absolute path or `$PATH`-resolvable name of the ACP binary.
|
|
184
|
+
* @param options.args - CLI arguments to pass to the binary.
|
|
185
|
+
* @param options.cwd - Working directory for the probe subprocess.
|
|
186
|
+
* @param options.env - Environment for the probe subprocess (default: `process.env`).
|
|
187
|
+
* @param options.timeoutMs - Hard timeout for the probe; subject to `MAX_TIMEOUT_MS`.
|
|
188
|
+
* @param options.clientName - Client name sent in the `initialize` handshake.
|
|
189
|
+
* @param options.clientVersion - Client version sent in the `initialize` handshake.
|
|
190
|
+
* @param options.defaultModelOption - Fallback option prepended to the result list.
|
|
191
|
+
* @returns A promise resolving to the available `ModelOption[]`.
|
|
192
|
+
*/
|
|
193
|
+
export async function detectAcpModels({ bin, args, cwd = process.cwd(), env = process.env, timeoutMs = DEFAULT_TIMEOUT_MS, clientName = 'agent-runtime-detect', clientVersion = 'runtime-adapter', defaultModelOption = { id: 'default', label: 'Default (CLI config)' }, }) {
|
|
194
|
+
const effectiveTimeoutMs = resolveAcpTimeoutMs(env, timeoutMs);
|
|
195
|
+
return await new Promise((resolve, reject) => {
|
|
196
|
+
const child = spawn(bin, args, {
|
|
197
|
+
cwd,
|
|
198
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
199
|
+
env: { ...env },
|
|
200
|
+
});
|
|
201
|
+
child.stdout.setEncoding('utf8');
|
|
202
|
+
child.stderr.setEncoding('utf8');
|
|
203
|
+
let settled = false;
|
|
204
|
+
let stderrBuf = '';
|
|
205
|
+
let expectedId = 1;
|
|
206
|
+
let nextId = 2;
|
|
207
|
+
let timer = null;
|
|
208
|
+
const finish = (fn, value) => {
|
|
209
|
+
if (settled)
|
|
210
|
+
return;
|
|
211
|
+
settled = true;
|
|
212
|
+
if (timer)
|
|
213
|
+
clearTimeout(timer);
|
|
214
|
+
try {
|
|
215
|
+
child.stdin.end();
|
|
216
|
+
}
|
|
217
|
+
catch { }
|
|
218
|
+
fn(value);
|
|
219
|
+
};
|
|
220
|
+
const fail = (message) => {
|
|
221
|
+
finish(reject, new Error(message));
|
|
222
|
+
if (!child.killed)
|
|
223
|
+
child.kill('SIGTERM');
|
|
224
|
+
};
|
|
225
|
+
const writeRpc = (id, method, params) => {
|
|
226
|
+
try {
|
|
227
|
+
sendRpc(child.stdin, id, method, params);
|
|
228
|
+
}
|
|
229
|
+
catch (err) {
|
|
230
|
+
fail(`stdin write failed: ${errorMessage(err)}`);
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
const sendSessionNew = () => {
|
|
234
|
+
expectedId = nextId;
|
|
235
|
+
writeRpc(nextId, 'session/new', buildAcpSessionNewParams(cwd));
|
|
236
|
+
nextId += 1;
|
|
237
|
+
};
|
|
238
|
+
const parser = createJsonLineStream((raw) => {
|
|
239
|
+
const obj = asObject(raw);
|
|
240
|
+
const error = asObject(obj?.error);
|
|
241
|
+
const result = asObject(obj?.result);
|
|
242
|
+
const rpcErr = rpcErrorMessage(raw);
|
|
243
|
+
if (rpcErr) {
|
|
244
|
+
// JSON-RPC -32603 "Internal error" during model detection:
|
|
245
|
+
// If this is for the current expected-id (initialize/session/new),
|
|
246
|
+
// it's a real probe failure — reject immediately.
|
|
247
|
+
// Otherwise it's cleanup noise — suppress it.
|
|
248
|
+
if (error?.code === -32603 && obj?.id !== expectedId)
|
|
249
|
+
return;
|
|
250
|
+
fail(rpcErr);
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
if (obj?.id !== expectedId || !result)
|
|
254
|
+
return;
|
|
255
|
+
if (expectedId === 1) {
|
|
256
|
+
sendSessionNew();
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
if (expectedId === 2) {
|
|
260
|
+
const models = normalizeModels(result.models, defaultModelOption, result.configOptions);
|
|
261
|
+
finish(resolve, models);
|
|
262
|
+
if (!child.killed)
|
|
263
|
+
child.kill('SIGTERM');
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
child.stdout.on('data', (chunk) => parser.feed(chunk));
|
|
267
|
+
child.stdout.on('close', () => parser.flush());
|
|
268
|
+
child.stdin.on('error', (err) => fail(`stdin error: ${err.message}`));
|
|
269
|
+
child.stderr.on('data', (chunk) => {
|
|
270
|
+
stderrBuf = `${stderrBuf}${chunk}`.slice(-16_000);
|
|
271
|
+
});
|
|
272
|
+
child.on('error', (err) => fail(`spawn failed: ${err.message}`));
|
|
273
|
+
child.on('close', (code, signal) => {
|
|
274
|
+
parser.flush();
|
|
275
|
+
if (!settled) {
|
|
276
|
+
const errTail = stderrBuf.trim();
|
|
277
|
+
const suffix = errTail ? ` stderr=${errTail}` : '';
|
|
278
|
+
fail(`ACP model detection exited code=${code} signal=${signal ?? 'none'}${suffix}`);
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
if (effectiveTimeoutMs > 0) {
|
|
282
|
+
timer = setTimeout(() => {
|
|
283
|
+
fail(`ACP model detection timed out after ${effectiveTimeoutMs}ms`);
|
|
284
|
+
}, effectiveTimeoutMs);
|
|
285
|
+
}
|
|
286
|
+
writeRpc(1, 'initialize', {
|
|
287
|
+
protocolVersion: ACP_PROTOCOL_VERSION,
|
|
288
|
+
clientCapabilities: { terminal: false },
|
|
289
|
+
clientInfo: { name: clientName, version: clientVersion },
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/agent-protocol/acp/models.ts"],"names":[],"mappings":"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"}
|