@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,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module diagnostics
|
|
3
|
+
*
|
|
4
|
+
* Builds the `AgentDiagnostic` explaining why a CLI isn't invocable, for
|
|
5
|
+
* the three failure classes detection distinguishes: not resolvable at
|
|
6
|
+
* all, resolved but not invocable, and invocable but not authenticated.
|
|
7
|
+
*
|
|
8
|
+
* Ported verbatim from OD's
|
|
9
|
+
* `apps/daemon/src/runtimes/detection/diagnostics.ts`, with `AgentDiagnostic`
|
|
10
|
+
* / `AgentFixIntent` now imported from this package's own `types.ts`
|
|
11
|
+
* (vendored from OD's contracts workspace package, not a dependency on it).
|
|
12
|
+
*/
|
|
13
|
+
import { agentBinEnvKey, agentSearchDirs } from './executables.js';
|
|
14
|
+
// Cap on how many searched dirs we attach to a `not-on-path` diagnostic.
|
|
15
|
+
// The resolver walks PATH + the user-toolchain whitelist, which can run to
|
|
16
|
+
// dozens of entries; the UI only needs enough to make "we looked here"
|
|
17
|
+
// land without ballooning the response payload.
|
|
18
|
+
const MAX_SEARCHED_DIRS = 24;
|
|
19
|
+
function setEnvIntent(agentId) {
|
|
20
|
+
const envKey = agentBinEnvKey(agentId);
|
|
21
|
+
return envKey ? [{ kind: 'setEnv', envKey }] : [];
|
|
22
|
+
}
|
|
23
|
+
// The agent is not resolvable at all: either nothing matched on PATH, or a
|
|
24
|
+
// user-supplied `*_BIN` override points at a missing/invalid file. The two
|
|
25
|
+
// cases get different copy + fix affordances because the remedy differs
|
|
26
|
+
// (install / point us at the binary vs. fix or clear the override).
|
|
27
|
+
export function buildExecutableDiagnostic(def, configuredEnv = {}) {
|
|
28
|
+
const envKey = agentBinEnvKey(def.id);
|
|
29
|
+
const overrideRaw = envKey ? configuredEnv?.[envKey]?.trim() : '';
|
|
30
|
+
if (envKey && overrideRaw) {
|
|
31
|
+
return {
|
|
32
|
+
reason: 'configured-bin-invalid',
|
|
33
|
+
severity: 'error',
|
|
34
|
+
message: `${def.name}'s configured binary (${envKey}) was not found or is not executable.`,
|
|
35
|
+
detail: overrideRaw,
|
|
36
|
+
fixActions: [{ kind: 'setEnv', envKey }, { kind: 'clearEnv', envKey }, { kind: 'rescan' }],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
reason: 'not-on-path',
|
|
41
|
+
severity: 'error',
|
|
42
|
+
message: `${def.name} (\`${def.bin}\`) was not found on your PATH.`,
|
|
43
|
+
searchedDirs: agentSearchDirs().slice(0, MAX_SEARCHED_DIRS),
|
|
44
|
+
fixActions: [{ kind: 'openInstall' }, ...setEnvIntent(def.id), { kind: 'rescan' }],
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
// A file matched but `--version` could not spawn it. Permission failures
|
|
48
|
+
// are real binaries that need their executable bit restored; missing-target
|
|
49
|
+
// failures are usually leftover npm/nvm/mise shims whose underlying target
|
|
50
|
+
// was uninstalled.
|
|
51
|
+
export function buildNotInvocableDiagnostic(def, launch, cause) {
|
|
52
|
+
if (cause === 'not-executable') {
|
|
53
|
+
return {
|
|
54
|
+
reason: 'not-executable',
|
|
55
|
+
severity: 'error',
|
|
56
|
+
message: `${def.name} was found but is not executable. Restore its execute permission or choose a different binary, then rescan.`,
|
|
57
|
+
...(launch.launchPath ? { detail: launch.launchPath } : {}),
|
|
58
|
+
fixActions: [...setEnvIntent(def.id), { kind: 'rescan' }],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
reason: 'shim-broken',
|
|
63
|
+
severity: 'error',
|
|
64
|
+
message: `${def.name} was found but could not be launched — its wrapper or shim points at a missing target.`,
|
|
65
|
+
...(launch.launchPath ? { detail: launch.launchPath } : {}),
|
|
66
|
+
fixActions: [...setEnvIntent(def.id), { kind: 'openDocs' }, { kind: 'rescan' }],
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
// The agent is installed and invocable but its auth probe reported a
|
|
70
|
+
// missing / unverifiable credential. Detection only reaches this helper
|
|
71
|
+
// for adapters that declare a cheap, side-effect-free authProbe; until an
|
|
72
|
+
// adapter also declares a spawn-safe OAuth producer, diagnostics point at
|
|
73
|
+
// docs.
|
|
74
|
+
export function buildAuthDiagnostic(def, auth) {
|
|
75
|
+
if (auth.status === 'ok')
|
|
76
|
+
return null;
|
|
77
|
+
const signInIntent = { kind: 'openDocs' };
|
|
78
|
+
if (auth.status === 'missing') {
|
|
79
|
+
return {
|
|
80
|
+
reason: 'auth-missing',
|
|
81
|
+
severity: 'error',
|
|
82
|
+
message: auth.message || `${def.name} is installed but not authenticated.`,
|
|
83
|
+
...(auth.stderrTail ? { detail: auth.stderrTail } : {}),
|
|
84
|
+
fixActions: [signInIntent, { kind: 'rescan' }],
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
reason: 'auth-unknown',
|
|
89
|
+
severity: 'warning',
|
|
90
|
+
message: auth.message || `${def.name} authentication status could not be verified.`,
|
|
91
|
+
...(auth.stderrTail ? { detail: auth.stderrTail } : {}),
|
|
92
|
+
fixActions: [signInIntent, { kind: 'rescan' }],
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"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"}
|
package/dist/env.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
type RuntimeEnvMap = NodeJS.ProcessEnv | Record<string, string>;
|
|
2
|
+
export interface SpawnEnvHooks {
|
|
3
|
+
/**
|
|
4
|
+
* Per-agent env customization (e.g. vela/AMR profile forwarding,
|
|
5
|
+
* analytics identity, a routed model's endpoint override). Called after
|
|
6
|
+
* the proxy-aware merge, before the built-in OpenCode/MiMo housekeeping.
|
|
7
|
+
* Return a partial env to merge in, or nothing to leave `env` as-is
|
|
8
|
+
* (mutating `env` directly is also fine — it's a live object).
|
|
9
|
+
*/
|
|
10
|
+
perAgentEnv?: (agentId: string, env: NodeJS.ProcessEnv) => NodeJS.ProcessEnv | void;
|
|
11
|
+
/**
|
|
12
|
+
* Applied last, after all other env composition. A host with a
|
|
13
|
+
* sandboxed/jailed spawn mode plugs its own env constraints in here.
|
|
14
|
+
*/
|
|
15
|
+
sandboxOverlay?: (env: NodeJS.ProcessEnv) => NodeJS.ProcessEnv;
|
|
16
|
+
}
|
|
17
|
+
export declare function spawnEnvForAgent(agentId: string, baseEnv: RuntimeEnvMap, configuredEnv?: unknown, systemProxyEnv?: RuntimeEnvMap, hooks?: SpawnEnvHooks): NodeJS.ProcessEnv;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAuCA,KAAK,aAAa,GAAG,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;IACpF;;;OAGG;IACH,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU,CAAC;CAChE;AASD,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,EACtB,aAAa,GAAE,OAAY,EAC3B,cAAc,GAAE,aAAuC,EACvD,KAAK,GAAE,aAAkB,GACxB,MAAM,CAAC,UAAU,CAkDnB"}
|
package/dist/env.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module env
|
|
3
|
+
*
|
|
4
|
+
* Builds the environment passed to `spawn()` for a given agent adapter:
|
|
5
|
+
* proxy-aware merge of the inherited launch env with per-agent configured
|
|
6
|
+
* overrides, plus a couple of per-CLI housekeeping tweaks (OpenCode/MiMo
|
|
7
|
+
* project-config-discovery, which would otherwise walk up from cwd and run
|
|
8
|
+
* an install step that can corrupt a pnpm workspace it's spawned inside).
|
|
9
|
+
*
|
|
10
|
+
* Heavily de-branded from OD's `apps/daemon/src/runtimes/env/env.ts`. The
|
|
11
|
+
* origin file was far more coupled than r1b's "supporting generic file"
|
|
12
|
+
* classification anticipated — it read OD's own app-config subsystem, OD's
|
|
13
|
+
* sandbox-mode subsystem, and vela/AMR-specific env forwarding including a
|
|
14
|
+
* literal product-name identity value and two product-prefixed env var
|
|
15
|
+
* names (see `source-map.md` for the exact originals). None of that is
|
|
16
|
+
* ported:
|
|
17
|
+
*
|
|
18
|
+
* - `mergeProxyAwareEnv` / `resolveSystemProxyEnv` now come from
|
|
19
|
+
* `@jini-ai/platform` (the same functions, already verbatim-lifted there).
|
|
20
|
+
* - AMR/vela-specific env injection and OD's app-config-driven analytics
|
|
21
|
+
* identity env are replaced by an optional `perAgentEnv` hook — a plain
|
|
22
|
+
* `(agentId, env) => NodeJS.ProcessEnv | void` the host can supply to add
|
|
23
|
+
* its own per-agent env logic (vela profile forwarding, analytics ids,
|
|
24
|
+
* …) without this package needing to know about vela or app-config.
|
|
25
|
+
* - Sandbox-mode env application is replaced by an optional
|
|
26
|
+
* `sandboxOverlay` hook with the same shape, for the same reason.
|
|
27
|
+
* - OD's AMR trace-env helper (emitting a product-prefixed run-id/attempt/
|
|
28
|
+
* session-id triad) is dropped entirely — it is OD/vela-adapter-owned
|
|
29
|
+
* trace-correlation env, not a generic runtime concern, and its own name
|
|
30
|
+
* was itself product-branded. A host that needs equivalent trace
|
|
31
|
+
* correlation can build it as a `perAgentEnv` hook.
|
|
32
|
+
*
|
|
33
|
+
* See `source-map.md` for the full accounting.
|
|
34
|
+
*/
|
|
35
|
+
import os from 'node:os';
|
|
36
|
+
import { mergeProxyAwareEnv, resolveSystemProxyEnv } from '@jini-ai/platform';
|
|
37
|
+
import { expandConfiguredEnv } from './paths.js';
|
|
38
|
+
import { resolveAmrOpenCodeExecutable } from './executables.js';
|
|
39
|
+
function stripKeysCaseInsensitive(env, keysToStrip) {
|
|
40
|
+
const keysUpper = new Set(keysToStrip.map((key) => key.toUpperCase()));
|
|
41
|
+
for (const key of Object.keys(env)) {
|
|
42
|
+
if (keysUpper.has(key.toUpperCase()))
|
|
43
|
+
delete env[key];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export function spawnEnvForAgent(agentId, baseEnv, configuredEnv = {}, systemProxyEnv = resolveSystemProxyEnv(), hooks = {}) {
|
|
47
|
+
const expandedConfiguredEnv = expandConfiguredEnv(configuredEnv);
|
|
48
|
+
const env = mergeProxyAwareEnv(process.platform, systemProxyEnv, baseEnv, expandedConfiguredEnv);
|
|
49
|
+
if (agentId === 'amr') {
|
|
50
|
+
// `execAgentFile` REPLACES the child environment (execFile with `env`
|
|
51
|
+
// set), so anything missing here is genuinely absent for the AMR CLI.
|
|
52
|
+
// `vela model list` resolves its config home up front and exits
|
|
53
|
+
// non-zero with "$HOME is not defined" when HOME is unset. Backfill
|
|
54
|
+
// HOME from the OS so the authoritative catalog call is never silently
|
|
55
|
+
// decapitated by a missing home dir.
|
|
56
|
+
if (!env.HOME?.trim()) {
|
|
57
|
+
const home = os.homedir();
|
|
58
|
+
if (home)
|
|
59
|
+
env.HOME = home;
|
|
60
|
+
}
|
|
61
|
+
if (!env.VELA_OPENCODE_BIN?.trim()) {
|
|
62
|
+
const opencodeBin = resolveAmrOpenCodeExecutable(env);
|
|
63
|
+
if (opencodeBin)
|
|
64
|
+
env.VELA_OPENCODE_BIN = opencodeBin;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (agentId === 'opencode') {
|
|
68
|
+
stripKeysCaseInsensitive(env, ['OPENCODE', 'OPENCODE_PID', 'OPENCODE_RUN_ID', 'OPENCODE_SERVER_PASSWORD']);
|
|
69
|
+
// OpenCode is bun-based and, left to its defaults, walks up from its
|
|
70
|
+
// cwd to the nearest project root and runs `bun install` there at
|
|
71
|
+
// startup to set up local plugins. When that root is a pnpm workspace
|
|
72
|
+
// (the host's own repo, or a project nested inside it), the install
|
|
73
|
+
// replaces the pnpm `.pnpm` store with a bun `node_modules/.bun` +
|
|
74
|
+
// `bun.lock` and breaks the workspace. Disable project-config
|
|
75
|
+
// discovery (and its install) so OpenCode only honors the config
|
|
76
|
+
// injected via `OPENCODE_CONFIG_CONTENT`.
|
|
77
|
+
if (!env.OPENCODE_DISABLE_PROJECT_CONFIG?.trim()) {
|
|
78
|
+
env.OPENCODE_DISABLE_PROJECT_CONFIG = 'true';
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (agentId === 'mimo') {
|
|
82
|
+
stripKeysCaseInsensitive(env, ['MIMOCODE', 'MIMOCODE_PID', 'MIMOCODE_RUN_ID', 'MIMOCODE_SERVER_PASSWORD']);
|
|
83
|
+
// MiMo builds on the same toolchain as OpenCode and has the same
|
|
84
|
+
// workspace-corruption risk. Disable project-config discovery so MiMo
|
|
85
|
+
// only honors the config injected through `MIMOCODE_CONFIG_CONTENT`.
|
|
86
|
+
if (!env.MIMOCODE_DISABLE_PROJECT_CONFIG?.trim()) {
|
|
87
|
+
env.MIMOCODE_DISABLE_PROJECT_CONFIG = 'true';
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
const perAgentOverrides = hooks.perAgentEnv?.(agentId, env);
|
|
91
|
+
if (perAgentOverrides)
|
|
92
|
+
Object.assign(env, perAgentOverrides);
|
|
93
|
+
return hooks.sandboxOverlay ? hooks.sandboxOverlay(env) : env;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=env.js.map
|
package/dist/env.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { RuntimeAgentDef } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Override the env var names `resolveDetectionHome` / the packaged-binary
|
|
4
|
+
* lookup read. The host application (e.g. the OD adapter) calls this once
|
|
5
|
+
* at startup if it wants its own namespaced env vars instead of the
|
|
6
|
+
* generic defaults.
|
|
7
|
+
*/
|
|
8
|
+
export declare function configureExecutableResolutionEnv(overrides: {
|
|
9
|
+
agentHomeEnvVar?: string;
|
|
10
|
+
resourceRootEnvVar?: string;
|
|
11
|
+
}): void;
|
|
12
|
+
export declare function userToolchainBinDirs(): string[];
|
|
13
|
+
export declare function agentSearchDirs(): string[];
|
|
14
|
+
export declare function agentBinEnvKey(agentId: string | undefined): string | null;
|
|
15
|
+
export declare function resolveOnPath(bin: string): string | null;
|
|
16
|
+
export declare function resolveAmrOpenCodeExecutable(env?: Record<string, string | undefined>): string | null;
|
|
17
|
+
export declare function codexAppBundleCandidates(): string[];
|
|
18
|
+
export declare function resolveAgentExecutable(def: RuntimeAgentDef, configuredEnv?: Record<string, string>): string | null;
|
|
19
|
+
export declare function inspectAgentExecutableResolution(def: RuntimeAgentDef, configuredEnv?: Record<string, string>): {
|
|
20
|
+
configuredOverridePath: string | null;
|
|
21
|
+
pathResolvedPath: string | null;
|
|
22
|
+
selectedPath: string | null;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=executables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executables.d.ts","sourceRoot":"","sources":["../src/executables.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAgClD;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAAC,SAAS,EAAE;IAC1D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,IAAI,CAGP;AAkDD,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C;AAuBD,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;AAKD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAGzE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAaxD;AA0CD,wBAAgB,4BAA4B,CAC1C,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,MAAM,GAAG,IAAI,CAuBf;AAkFD,wBAAgB,wBAAwB,IAAI,MAAM,EAAE,CAgBnD;AAED,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,eAAe,EACpB,aAAa,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACzC,MAAM,GAAG,IAAI,CAEf;AAED,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,eAAe,EACpB,aAAa,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACzC;IACD,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,CA6BA"}
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module executables
|
|
3
|
+
*
|
|
4
|
+
* Resolves an agent's executable path: `*_BIN` env overrides, PATH search
|
|
5
|
+
* (including user-toolchain bin dirs), a resource-root-relative packaged
|
|
6
|
+
* binary, and (macOS only) a well-known app-bundle install.
|
|
7
|
+
*
|
|
8
|
+
* Ported from OD's `apps/daemon/src/runtimes/core/executables.ts` with two
|
|
9
|
+
* changes:
|
|
10
|
+
*
|
|
11
|
+
* 1. `wellKnownUserToolchainBins` now comes from `@jini-ai/platform` instead of
|
|
12
|
+
* the OD workspace package it originally shipped from (same function,
|
|
13
|
+
* already verbatim-lifted — see `@jini-ai/platform`'s own `source-map.md`).
|
|
14
|
+
* 2. De-branded: the origin's product-prefixed agent-home / resource-root
|
|
15
|
+
* env var names and its sandbox-runtime-config integration (an
|
|
16
|
+
* OD-daemon-level subsystem out of this package's charter) are replaced
|
|
17
|
+
* by `configureExecutableResolutionEnv()` — an injectable pair of
|
|
18
|
+
* env-var names, defaulting to `AGENT_RUNTIME_HOME` /
|
|
19
|
+
* `AGENT_RUNTIME_RESOURCE_ROOT`, with no sandbox dependency. See
|
|
20
|
+
* `source-map.md` for the exact original names.
|
|
21
|
+
*/
|
|
22
|
+
import { accessSync, constants, existsSync, statSync } from 'node:fs';
|
|
23
|
+
import { delimiter } from 'node:path';
|
|
24
|
+
import path from 'node:path';
|
|
25
|
+
import { homedir } from 'node:os';
|
|
26
|
+
import { wellKnownUserToolchainBins } from '@jini-ai/platform';
|
|
27
|
+
import { expandHomePath } from './paths.js';
|
|
28
|
+
const AGENT_BIN_ENV_KEYS = new Map([
|
|
29
|
+
['amr', 'VELA_BIN'],
|
|
30
|
+
['aider', 'AIDER_BIN'],
|
|
31
|
+
['claude', 'CLAUDE_BIN'],
|
|
32
|
+
['codebuddy', 'CODEBUDDY_BIN'],
|
|
33
|
+
['codex', 'CODEX_BIN'],
|
|
34
|
+
['copilot', 'COPILOT_BIN'],
|
|
35
|
+
['cursor-agent', 'CURSOR_AGENT_BIN'],
|
|
36
|
+
['deepseek', 'DEEPSEEK_BIN'],
|
|
37
|
+
['devin', 'DEVIN_BIN'],
|
|
38
|
+
['hermes', 'HERMES_BIN'],
|
|
39
|
+
['kimi', 'KIMI_BIN'],
|
|
40
|
+
['kiro', 'KIRO_BIN'],
|
|
41
|
+
['kilo', 'KILO_BIN'],
|
|
42
|
+
['mimo', 'MIMO_BIN'],
|
|
43
|
+
['opencode', 'OPENCODE_BIN'],
|
|
44
|
+
['pi', 'PI_BIN'],
|
|
45
|
+
['qoder', 'QODER_BIN'],
|
|
46
|
+
['qwen', 'QWEN_BIN'],
|
|
47
|
+
['reasonix', 'REASONIX_BIN'],
|
|
48
|
+
['trae-cli', 'TRAE_CLI_BIN'],
|
|
49
|
+
['vibe', 'VIBE_BIN'],
|
|
50
|
+
]);
|
|
51
|
+
/** Env var names consulted by detection-home/resource-root resolution. Overridable via `configureExecutableResolutionEnv`. */
|
|
52
|
+
const executableResolutionEnv = {
|
|
53
|
+
agentHomeEnvVar: 'AGENT_RUNTIME_HOME',
|
|
54
|
+
resourceRootEnvVar: 'AGENT_RUNTIME_RESOURCE_ROOT',
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Override the env var names `resolveDetectionHome` / the packaged-binary
|
|
58
|
+
* lookup read. The host application (e.g. the OD adapter) calls this once
|
|
59
|
+
* at startup if it wants its own namespaced env vars instead of the
|
|
60
|
+
* generic defaults.
|
|
61
|
+
*/
|
|
62
|
+
export function configureExecutableResolutionEnv(overrides) {
|
|
63
|
+
if (overrides.agentHomeEnvVar)
|
|
64
|
+
executableResolutionEnv.agentHomeEnvVar = overrides.agentHomeEnvVar;
|
|
65
|
+
if (overrides.resourceRootEnvVar)
|
|
66
|
+
executableResolutionEnv.resourceRootEnvVar = overrides.resourceRootEnvVar;
|
|
67
|
+
}
|
|
68
|
+
const TOOLCHAIN_DIR_CACHE_TTL_MS = 5000;
|
|
69
|
+
let cachedToolchainHome = null;
|
|
70
|
+
let cachedToolchainDirs = null;
|
|
71
|
+
let cachedToolchainDirsAt = 0;
|
|
72
|
+
// Resolve the home directory detection should search, honoring the
|
|
73
|
+
// configured agent-home override env var. `hasOverride` lets callers scope
|
|
74
|
+
// strictly to the override home (skipping real-machine system locations) so
|
|
75
|
+
// sandboxed detection runs and tests stay deterministic instead of
|
|
76
|
+
// reaching the host.
|
|
77
|
+
function resolveDetectionHome() {
|
|
78
|
+
const homeOverride = process.env[executableResolutionEnv.agentHomeEnvVar];
|
|
79
|
+
return { home: homeOverride || homedir(), hasOverride: Boolean(homeOverride) };
|
|
80
|
+
}
|
|
81
|
+
function userToolchainDirs() {
|
|
82
|
+
const { home, hasOverride } = resolveDetectionHome();
|
|
83
|
+
const homeOverride = hasOverride ? home : undefined;
|
|
84
|
+
const now = Date.now();
|
|
85
|
+
if (cachedToolchainHome === home &&
|
|
86
|
+
cachedToolchainDirs &&
|
|
87
|
+
now - cachedToolchainDirsAt < TOOLCHAIN_DIR_CACHE_TTL_MS) {
|
|
88
|
+
return cachedToolchainDirs;
|
|
89
|
+
}
|
|
90
|
+
cachedToolchainHome = home;
|
|
91
|
+
cachedToolchainDirsAt = now;
|
|
92
|
+
// When the agent-home override is set, scope the search strictly to the
|
|
93
|
+
// override home: skip Homebrew / /usr/local *and* pass an empty env so
|
|
94
|
+
// that a developer or CI runner with NPM_CONFIG_PREFIX /
|
|
95
|
+
// npm_config_prefix exported can't leak the real machine's <prefix>/bin
|
|
96
|
+
// into a sandboxed detection run. Without this, tests that build a tmp
|
|
97
|
+
// home would be machine-environment-dependent.
|
|
98
|
+
cachedToolchainDirs = wellKnownUserToolchainBins({
|
|
99
|
+
home,
|
|
100
|
+
includeSystemBins: process.platform !== 'win32' && !homeOverride,
|
|
101
|
+
env: homeOverride ? {} : process.env,
|
|
102
|
+
});
|
|
103
|
+
return cachedToolchainDirs;
|
|
104
|
+
}
|
|
105
|
+
// The user-level toolchain bin directories (Homebrew, ~/.local/bin, ~/.bun/bin,
|
|
106
|
+
// version-manager node dirs, npm prefixes, …) that binary *resolution* searches
|
|
107
|
+
// beyond process.env.PATH. Exposed so the spawn env can append the same dirs:
|
|
108
|
+
// a binary can resolve here yet fail to *execute* if its shebang interpreter
|
|
109
|
+
// (e.g. `#!/usr/bin/env bun`) lives in one of these dirs and the spawn PATH
|
|
110
|
+
// doesn't include it. Keeping resolution and spawn PATH symmetric fixes that.
|
|
111
|
+
export function userToolchainBinDirs() {
|
|
112
|
+
return userToolchainDirs();
|
|
113
|
+
}
|
|
114
|
+
function resolvePathDirs() {
|
|
115
|
+
const seen = new Set();
|
|
116
|
+
const dirs = [
|
|
117
|
+
...(process.env.PATH || '').split(delimiter),
|
|
118
|
+
// GUI launchers (macOS .app bundles, Linux .desktop files) often start
|
|
119
|
+
// with a minimal PATH. Include common user-level CLI install locations
|
|
120
|
+
// so agent detection matches the user's shell-installed tools,
|
|
121
|
+
// especially Node version managers.
|
|
122
|
+
...userToolchainDirs(),
|
|
123
|
+
];
|
|
124
|
+
return dirs.filter((dir) => {
|
|
125
|
+
if (!dir || seen.has(dir))
|
|
126
|
+
return false;
|
|
127
|
+
seen.add(dir);
|
|
128
|
+
return true;
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
// The exact, de-duplicated directory list `resolveOnPath` walks. Surfaced so
|
|
132
|
+
// detection can attach it to a `not-on-path` diagnostic verbatim — the UI
|
|
133
|
+
// shows the user where we actually looked before asking them to set an
|
|
134
|
+
// explicit binary path, instead of recomputing PATH client-side.
|
|
135
|
+
export function agentSearchDirs() {
|
|
136
|
+
return resolvePathDirs();
|
|
137
|
+
}
|
|
138
|
+
// The `*_BIN` environment variable that overrides PATH detection for a given
|
|
139
|
+
// agent id (e.g. `cursor-agent` → `CURSOR_AGENT_BIN`), or null when the agent
|
|
140
|
+
// has no override key. Drives the `setEnv` / `clearEnv` fix intents.
|
|
141
|
+
export function agentBinEnvKey(agentId) {
|
|
142
|
+
if (!agentId)
|
|
143
|
+
return null;
|
|
144
|
+
return AGENT_BIN_ENV_KEYS.get(agentId) ?? null;
|
|
145
|
+
}
|
|
146
|
+
export function resolveOnPath(bin) {
|
|
147
|
+
const exts = process.platform === 'win32'
|
|
148
|
+
? (process.env.PATHEXT || '.EXE;.CMD;.BAT').split(';')
|
|
149
|
+
: [''];
|
|
150
|
+
const dirs = resolvePathDirs();
|
|
151
|
+
for (const dir of dirs) {
|
|
152
|
+
for (const ext of exts) {
|
|
153
|
+
const full = path.join(dir, bin + ext);
|
|
154
|
+
if (full && existsSync(full))
|
|
155
|
+
return full;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
function looksExecutableOnWindows(filePath) {
|
|
161
|
+
const ext = path.extname(filePath).trim().toUpperCase();
|
|
162
|
+
if (!ext)
|
|
163
|
+
return false;
|
|
164
|
+
const executableExts = (process.env.PATHEXT || '.EXE;.CMD;.BAT')
|
|
165
|
+
.split(';')
|
|
166
|
+
.map((value) => value.trim().toUpperCase())
|
|
167
|
+
.filter(Boolean);
|
|
168
|
+
return executableExts.includes(ext);
|
|
169
|
+
}
|
|
170
|
+
function executableFilePath(raw) {
|
|
171
|
+
if (typeof raw !== 'string' || raw.trim().length === 0)
|
|
172
|
+
return null;
|
|
173
|
+
const expanded = expandHomePath(raw.trim());
|
|
174
|
+
if (!path.isAbsolute(expanded))
|
|
175
|
+
return null;
|
|
176
|
+
try {
|
|
177
|
+
if (!statSync(expanded).isFile())
|
|
178
|
+
return null;
|
|
179
|
+
if (process.platform === 'win32') {
|
|
180
|
+
if (!looksExecutableOnWindows(expanded))
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
accessSync(expanded, constants.X_OK);
|
|
185
|
+
}
|
|
186
|
+
return expanded;
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Resolve the first available binary for an agent definition. Tries
|
|
193
|
+
// `def.bin` first, then walks `def.fallbackBins` in order. Used for agents
|
|
194
|
+
// whose forks ship under a different binary name but speak the exact same
|
|
195
|
+
// CLI. Returns null when no candidate is on PATH.
|
|
196
|
+
function configuredExecutableOverride(def, configuredEnv = {}) {
|
|
197
|
+
const envKey = AGENT_BIN_ENV_KEYS.get(def?.id);
|
|
198
|
+
if (!envKey)
|
|
199
|
+
return null;
|
|
200
|
+
return executableFilePath(configuredEnv?.[envKey]);
|
|
201
|
+
}
|
|
202
|
+
export function resolveAmrOpenCodeExecutable(env = process.env) {
|
|
203
|
+
const configured = executableFilePath(env.VELA_OPENCODE_BIN);
|
|
204
|
+
if (configured)
|
|
205
|
+
return configured;
|
|
206
|
+
// In packaged builds prefer the bundled companion under
|
|
207
|
+
// `<resourceRoot>/bin/libexec/opencode/opencode` so a stale global
|
|
208
|
+
// `opencode` on the user's PATH can't override the known-good build that
|
|
209
|
+
// shipped with this app. PATH is only consulted as a last resort.
|
|
210
|
+
const resourceRoot = (env[executableResolutionEnv.resourceRootEnvVar] ?? process.env[executableResolutionEnv.resourceRootEnvVar])?.trim();
|
|
211
|
+
if (resourceRoot) {
|
|
212
|
+
const bundledDir = packagedVelaOpenCodeCompanionTree(resourceRoot);
|
|
213
|
+
if (bundledDir) {
|
|
214
|
+
const bundled = executableFilePath(path.join(bundledDir, process.platform === 'win32' ? 'opencode.exe' : 'opencode'));
|
|
215
|
+
if (bundled)
|
|
216
|
+
return bundled;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return resolveOnPath('opencode-cli') ?? resolveOnPath('opencode');
|
|
220
|
+
}
|
|
221
|
+
// The AMR (vela) OpenCode companion ships as a
|
|
222
|
+
// `<resourceRoot>/bin/libexec/opencode/opencode` *executable file*, not just
|
|
223
|
+
// the directory. Treating any directory there as a valid companion produces
|
|
224
|
+
// a false-positive availability path: `detectAgents()` would surface AMR as
|
|
225
|
+
// available even though the first real run can't launch. Verify the inner
|
|
226
|
+
// executable too.
|
|
227
|
+
function packagedVelaOpenCodeCompanionTree(resourceRoot) {
|
|
228
|
+
const candidate = path.join(resourceRoot, 'bin', 'libexec', 'opencode');
|
|
229
|
+
const exe = path.join(candidate, process.platform === 'win32' ? 'opencode.exe' : 'opencode');
|
|
230
|
+
try {
|
|
231
|
+
if (!statSync(candidate).isDirectory())
|
|
232
|
+
return null;
|
|
233
|
+
if (!statSync(exe).isFile())
|
|
234
|
+
return null;
|
|
235
|
+
if (process.platform === 'win32') {
|
|
236
|
+
if (!looksExecutableOnWindows(exe))
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
accessSync(exe, constants.X_OK);
|
|
241
|
+
}
|
|
242
|
+
return candidate;
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
function packagedBuiltInExecutable(def, configuredEnv = {}) {
|
|
249
|
+
if (def.id !== 'amr')
|
|
250
|
+
return null;
|
|
251
|
+
const resourceRoot = process.env[executableResolutionEnv.resourceRootEnvVar]?.trim();
|
|
252
|
+
if (!resourceRoot)
|
|
253
|
+
return null;
|
|
254
|
+
if (!resolveAmrOpenCodeExecutable({ ...process.env, ...configuredEnv }) &&
|
|
255
|
+
!packagedVelaOpenCodeCompanionTree(resourceRoot)) {
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
const candidate = path.join(resourceRoot, 'bin', process.platform === 'win32' ? 'vela.exe' : 'vela');
|
|
259
|
+
try {
|
|
260
|
+
if (!statSync(candidate).isFile())
|
|
261
|
+
return null;
|
|
262
|
+
if (process.platform === 'win32') {
|
|
263
|
+
if (!looksExecutableOnWindows(candidate))
|
|
264
|
+
return null;
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
accessSync(candidate, constants.X_OK);
|
|
268
|
+
}
|
|
269
|
+
return candidate;
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// The official OpenAI Codex desktop app ships the `codex` CLI *inside* its
|
|
276
|
+
// macOS application bundle and does NOT add it to PATH unless the user
|
|
277
|
+
// explicitly runs the app's "Install command line tool" action. Users who
|
|
278
|
+
// installed Codex only through the app therefore see a "not installed"
|
|
279
|
+
// agent card even though a healthy native `codex` binary exists on disk,
|
|
280
|
+
// because neither PATH nor the user-toolchain search dirs cover the app
|
|
281
|
+
// bundle. Probe the well-known bundle locations so app-only installs are
|
|
282
|
+
// detected. This is a last-resort fallback that ranks below PATH, so an
|
|
283
|
+
// explicit `npm i -g` / Homebrew / version-manager install always wins.
|
|
284
|
+
function codexAppBundleExecutable(def) {
|
|
285
|
+
if (def?.id !== 'codex')
|
|
286
|
+
return null;
|
|
287
|
+
for (const candidate of codexAppBundleCandidates()) {
|
|
288
|
+
const resolved = executableFilePath(candidate);
|
|
289
|
+
if (resolved)
|
|
290
|
+
return resolved;
|
|
291
|
+
}
|
|
292
|
+
return null;
|
|
293
|
+
}
|
|
294
|
+
// Exported for tests: the no-override `/Applications` branch can't be
|
|
295
|
+
// exercised through `resolveAgentExecutable` deterministically (it would
|
|
296
|
+
// depend on the host actually having `/Applications/Codex.app`), so tests
|
|
297
|
+
// assert the built candidate list directly to catch a path typo or
|
|
298
|
+
// ordering regression in the common real-world install case.
|
|
299
|
+
export function codexAppBundleCandidates() {
|
|
300
|
+
// The Codex app bundle is a macOS-only concept; other platforms have no
|
|
301
|
+
// analogous standalone install of the `codex` CLI to probe for here.
|
|
302
|
+
if (process.platform !== 'darwin')
|
|
303
|
+
return [];
|
|
304
|
+
const { home, hasOverride } = resolveDetectionHome();
|
|
305
|
+
const bundleSuffix = ['Codex.app', 'Contents', 'Resources', 'codex'];
|
|
306
|
+
// User-scoped install (~/Applications). Honors the override home so
|
|
307
|
+
// sandboxed detection runs and tests stay deterministic.
|
|
308
|
+
const candidates = [path.join(home, 'Applications', ...bundleSuffix)];
|
|
309
|
+
// System-wide /Applications install. Skip it under an override home for
|
|
310
|
+
// the same isolation reason `userToolchainDirs` skips Homebrew/system
|
|
311
|
+
// bins.
|
|
312
|
+
if (!hasOverride) {
|
|
313
|
+
candidates.unshift(path.join('/Applications', ...bundleSuffix));
|
|
314
|
+
}
|
|
315
|
+
return candidates;
|
|
316
|
+
}
|
|
317
|
+
export function resolveAgentExecutable(def, configuredEnv = {}) {
|
|
318
|
+
return inspectAgentExecutableResolution(def, configuredEnv).selectedPath;
|
|
319
|
+
}
|
|
320
|
+
export function inspectAgentExecutableResolution(def, configuredEnv = {}) {
|
|
321
|
+
if (!def?.bin) {
|
|
322
|
+
return {
|
|
323
|
+
configuredOverridePath: null,
|
|
324
|
+
pathResolvedPath: null,
|
|
325
|
+
selectedPath: null,
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
const configuredOverridePath = configuredExecutableOverride(def, configuredEnv);
|
|
329
|
+
const candidates = [
|
|
330
|
+
def.bin,
|
|
331
|
+
...(Array.isArray(def.fallbackBins) ? def.fallbackBins : []),
|
|
332
|
+
];
|
|
333
|
+
let pathResolvedPath = null;
|
|
334
|
+
for (const bin of candidates) {
|
|
335
|
+
const resolved = resolveOnPath(bin);
|
|
336
|
+
if (resolved) {
|
|
337
|
+
pathResolvedPath = resolved;
|
|
338
|
+
break;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
const builtInPath = packagedBuiltInExecutable(def, configuredEnv);
|
|
342
|
+
const appBundlePath = codexAppBundleExecutable(def);
|
|
343
|
+
return {
|
|
344
|
+
configuredOverridePath,
|
|
345
|
+
pathResolvedPath,
|
|
346
|
+
selectedPath: configuredOverridePath || builtInPath || pathResolvedPath || appBundlePath,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
//# sourceMappingURL=executables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executables.js","sourceRoot":"","sources":["../src/executables.ts"],"names":[],"mappings":"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"}
|