@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,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module mmd-routes
|
|
3
|
+
*
|
|
4
|
+
* Loads a user-configurable "model routes" file (an on-disk JSON map of
|
|
5
|
+
* synthetic model ids to a provider base-URL + key) and merges its ids into
|
|
6
|
+
* an agent's model list, so a Claude-Code-shaped adapter can be pointed at a
|
|
7
|
+
* routed/self-hosted endpoint per model. Ported verbatim from OD's
|
|
8
|
+
* `apps/daemon/src/runtimes/core/mmd-routes.ts` — no product coupling.
|
|
9
|
+
*/
|
|
10
|
+
import { readFile } from 'node:fs/promises';
|
|
11
|
+
import { homedir } from 'node:os';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import { DEFAULT_MODEL_OPTION, sanitizeCustomModel } from './models.js';
|
|
14
|
+
const DEFAULT_MMD_MODEL_ROUTES_FILE = join('.config', 'mms', 'model-routes.json');
|
|
15
|
+
const MMD_MODEL_ROUTES_FILE_ENV = 'MMD_MODEL_ROUTES_FILE';
|
|
16
|
+
function stringEnv(env, key) {
|
|
17
|
+
const value = env[key];
|
|
18
|
+
if (typeof value !== 'string')
|
|
19
|
+
return null;
|
|
20
|
+
const trimmed = value.trim();
|
|
21
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
22
|
+
}
|
|
23
|
+
function resolveHome(env) {
|
|
24
|
+
return stringEnv(env, 'HOME') ?? homedir() ?? null;
|
|
25
|
+
}
|
|
26
|
+
function expandRoutesFileOverride(raw, env) {
|
|
27
|
+
if (raw === '~')
|
|
28
|
+
return resolveHome(env);
|
|
29
|
+
if (raw.startsWith('~/') || raw.startsWith('~\\')) {
|
|
30
|
+
const home = resolveHome(env);
|
|
31
|
+
return home ? join(home, raw.slice(2)) : null;
|
|
32
|
+
}
|
|
33
|
+
return raw;
|
|
34
|
+
}
|
|
35
|
+
export function resolveMmdRoutesFile(env) {
|
|
36
|
+
const override = stringEnv(env, MMD_MODEL_ROUTES_FILE_ENV);
|
|
37
|
+
if (override)
|
|
38
|
+
return expandRoutesFileOverride(override, env);
|
|
39
|
+
const home = resolveHome(env);
|
|
40
|
+
if (!home)
|
|
41
|
+
return null;
|
|
42
|
+
return join(home, DEFAULT_MMD_MODEL_ROUTES_FILE);
|
|
43
|
+
}
|
|
44
|
+
function isRecord(value) {
|
|
45
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
46
|
+
}
|
|
47
|
+
export function parseMmdRouteModelIds(raw) {
|
|
48
|
+
if (!isRecord(raw) || !isRecord(raw.routes))
|
|
49
|
+
return [];
|
|
50
|
+
const seen = new Set();
|
|
51
|
+
const ids = [];
|
|
52
|
+
for (const rawId of Object.keys(raw.routes)) {
|
|
53
|
+
const id = sanitizeCustomModel(rawId);
|
|
54
|
+
if (!id || seen.has(id))
|
|
55
|
+
continue;
|
|
56
|
+
seen.add(id);
|
|
57
|
+
ids.push(id);
|
|
58
|
+
}
|
|
59
|
+
return ids;
|
|
60
|
+
}
|
|
61
|
+
export function resolveMmdRouteLaunchEnv(raw, modelId) {
|
|
62
|
+
const id = sanitizeCustomModel(modelId);
|
|
63
|
+
if (!id || !isRecord(raw) || !isRecord(raw.routes))
|
|
64
|
+
return null;
|
|
65
|
+
const route = raw.routes[id];
|
|
66
|
+
if (!isRecord(route) || !isRecord(route.primary))
|
|
67
|
+
return null;
|
|
68
|
+
const baseUrl = typeof route.primary.anthropic_base_url === 'string'
|
|
69
|
+
? route.primary.anthropic_base_url.trim()
|
|
70
|
+
: '';
|
|
71
|
+
if (!baseUrl)
|
|
72
|
+
return null;
|
|
73
|
+
const apiKey = typeof route.primary.api_key === 'string'
|
|
74
|
+
? route.primary.api_key.trim()
|
|
75
|
+
: '';
|
|
76
|
+
return {
|
|
77
|
+
ANTHROPIC_BASE_URL: baseUrl,
|
|
78
|
+
...(apiKey ? { ANTHROPIC_AUTH_TOKEN: apiKey } : {}),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function addModel(out, seen, option) {
|
|
82
|
+
const id = sanitizeCustomModel(option.id);
|
|
83
|
+
if (!id || seen.has(id))
|
|
84
|
+
return;
|
|
85
|
+
seen.add(id);
|
|
86
|
+
const label = typeof option.label === 'string' && option.label.trim().length > 0
|
|
87
|
+
? option.label
|
|
88
|
+
: id;
|
|
89
|
+
out.push({ id, label });
|
|
90
|
+
}
|
|
91
|
+
export function mergeMmdRouteModels(routeIds, fallbackModels) {
|
|
92
|
+
const out = [];
|
|
93
|
+
const seen = new Set();
|
|
94
|
+
addModel(out, seen, DEFAULT_MODEL_OPTION);
|
|
95
|
+
for (const routeId of routeIds) {
|
|
96
|
+
addModel(out, seen, { id: routeId, label: routeId });
|
|
97
|
+
}
|
|
98
|
+
for (const model of fallbackModels) {
|
|
99
|
+
addModel(out, seen, model);
|
|
100
|
+
}
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
export async function loadMmdRouteModels(env, fallbackModels) {
|
|
104
|
+
const routesFile = resolveMmdRoutesFile(env);
|
|
105
|
+
if (!routesFile)
|
|
106
|
+
return null;
|
|
107
|
+
let text;
|
|
108
|
+
try {
|
|
109
|
+
text = await readFile(routesFile, 'utf8');
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
let parsed;
|
|
115
|
+
try {
|
|
116
|
+
parsed = JSON.parse(text);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
const routeIds = parseMmdRouteModelIds(parsed);
|
|
122
|
+
if (routeIds.length === 0)
|
|
123
|
+
return null;
|
|
124
|
+
return mergeMmdRouteModels(routeIds, fallbackModels);
|
|
125
|
+
}
|
|
126
|
+
export async function loadMmdRouteLaunchEnv(env, modelId) {
|
|
127
|
+
const routesFile = resolveMmdRoutesFile(env);
|
|
128
|
+
if (!routesFile)
|
|
129
|
+
return null;
|
|
130
|
+
let text;
|
|
131
|
+
try {
|
|
132
|
+
text = await readFile(routesFile, 'utf8');
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
let parsed;
|
|
138
|
+
try {
|
|
139
|
+
parsed = JSON.parse(text);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
return resolveMmdRouteLaunchEnv(parsed, modelId);
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=mmd-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mmd-routes.js","sourceRoot":"","sources":["../src/mmd-routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module model-registry
|
|
3
|
+
*
|
|
4
|
+
* The provider/model/agent vocabulary that any Jini consumer picking "which
|
|
5
|
+
* model" or "which coding agent" to run needs, plus the handful of pure
|
|
6
|
+
* helpers (credential-status resolution, model-list merging, a stable cache
|
|
7
|
+
* key, model-choice normalization against a live catalogue) those pickers
|
|
8
|
+
* all independently re-derive today.
|
|
9
|
+
*
|
|
10
|
+
* Ported and generified from OD's `apps/web/src/state/config.ts`
|
|
11
|
+
* (`KnownProvider`/`KNOWN_PROVIDERS`), `packages/contracts/src/api/registry.ts`
|
|
12
|
+
* (`AgentInfo`/`AgentDiagnostic`/`AgentFixIntent`/`AgentModelOption`),
|
|
13
|
+
* `packages/contracts/src/api/providerModels.ts` (`ProviderModelOption`),
|
|
14
|
+
* `packages/contracts/src/api/app-config.ts` (`AgentModelPrefs`),
|
|
15
|
+
* `apps/web/src/components/providerModelsCache.ts`, and
|
|
16
|
+
* `apps/web/src/components/agentModelSelection.ts` — see
|
|
17
|
+
* `packages/agent-runtime/source-map.md` for the full per-symbol mapping.
|
|
18
|
+
* No OD product-identity strings or OD-specific gating (e.g. the original's
|
|
19
|
+
* hardcoded `agent.id === 'amr'` carve-out) survived the port.
|
|
20
|
+
*
|
|
21
|
+
* Named `model-registry.ts`, not `registry.ts`: this package already has a
|
|
22
|
+
* `registry.ts` (the `BASE_AGENT_DEFS` static CLI-adapter catalog +
|
|
23
|
+
* `getAgentDef(id)`) — a different concept that happens to share the word
|
|
24
|
+
* "registry". `AgentDiagnostic`/`AgentDiagnosticSeverity`/`AgentFixIntent`
|
|
25
|
+
* are NOT redefined here either, for the same reason `ModelOption` isn't:
|
|
26
|
+
* this package already has real, more complete versions of all three
|
|
27
|
+
* (`./types.js`, vendored from the same OD `packages/contracts/src/api/
|
|
28
|
+
* registry.ts` source this module cites above — main's `AgentFixIntent`
|
|
29
|
+
* adds a `launchOAuth` case this port's copy lacked, and its
|
|
30
|
+
* `AgentDiagnostic.reason` is the specific `AgentDiagnosticReason` literal
|
|
31
|
+
* union rather than a bare `string`). Reusing them keeps one canonical
|
|
32
|
+
* diagnostic shape in the package instead of two divergent ones under the
|
|
33
|
+
* same names. `ModelOption` alone is renamed (to `ModelCatalogOption`)
|
|
34
|
+
* rather than reused, because the package's existing `ModelOption`
|
|
35
|
+
* (`agent-protocol/acp/models.ts`, `{ id, label }`) is a narrower,
|
|
36
|
+
* genuinely different shape for ACP model-probe results, not a compatible
|
|
37
|
+
* version of this module's `{ id, label, hint, providerId, default, caps }`
|
|
38
|
+
* model-catalogue entry.
|
|
39
|
+
*/
|
|
40
|
+
import type { AgentDiagnostic } from './types.js';
|
|
41
|
+
/**
|
|
42
|
+
* Where a provider stands relative to a consumer's stored credentials.
|
|
43
|
+
* `available` covers providers that don't need a credential at all (a local
|
|
44
|
+
* or already-authenticated integration); `configured` and `unconfigured`
|
|
45
|
+
* both require one, differing only in whether it's present.
|
|
46
|
+
*/
|
|
47
|
+
export type CredentialStatus = 'configured' | 'available' | 'unconfigured';
|
|
48
|
+
export interface ModelProvider {
|
|
49
|
+
id: string;
|
|
50
|
+
label: string;
|
|
51
|
+
hint?: string;
|
|
52
|
+
/** False for providers that need no user-supplied credential (e.g. a local integration). */
|
|
53
|
+
credentialsRequired?: boolean;
|
|
54
|
+
docsUrl?: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* A single selectable model/reasoning-mode entry in a provider's catalogue.
|
|
58
|
+
* Named `ModelCatalogOption`, not `ModelOption` — this package's
|
|
59
|
+
* `agent-protocol/acp/models.ts` already owns the plain `ModelOption` name
|
|
60
|
+
* for its narrower `{ id, label }` ACP model-probe shape; see this file's
|
|
61
|
+
* module doc comment.
|
|
62
|
+
*/
|
|
63
|
+
export interface ModelCatalogOption {
|
|
64
|
+
id: string;
|
|
65
|
+
label: string;
|
|
66
|
+
hint?: string;
|
|
67
|
+
providerId: string;
|
|
68
|
+
/** Marks the recommended/default-checked option within its provider group. */
|
|
69
|
+
default?: boolean;
|
|
70
|
+
caps?: string[];
|
|
71
|
+
}
|
|
72
|
+
export interface AgentDefinition {
|
|
73
|
+
id: string;
|
|
74
|
+
name: string;
|
|
75
|
+
available: boolean;
|
|
76
|
+
version?: string | null;
|
|
77
|
+
models?: ModelCatalogOption[];
|
|
78
|
+
reasoningOptions?: ModelCatalogOption[];
|
|
79
|
+
diagnostics?: AgentDiagnostic[];
|
|
80
|
+
installUrl?: string;
|
|
81
|
+
docsUrl?: string;
|
|
82
|
+
/** False hides free-text/custom model entry for agents whose CLI can't accept one. */
|
|
83
|
+
supportsCustomModel?: boolean;
|
|
84
|
+
}
|
|
85
|
+
export interface AgentModelChoice {
|
|
86
|
+
model?: string;
|
|
87
|
+
reasoning?: string;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Resolves a provider's credential status for display. A provider that
|
|
91
|
+
* doesn't require credentials is always `available`; otherwise the status
|
|
92
|
+
* depends on whether a credential has actually been stored.
|
|
93
|
+
*/
|
|
94
|
+
export declare function resolveCredentialStatus(provider: Pick<ModelProvider, 'credentialsRequired'>, hasStoredCredential: boolean): CredentialStatus;
|
|
95
|
+
/**
|
|
96
|
+
* Merges a live-fetched model list with a static suggestion list, keeping
|
|
97
|
+
* fetched entries first and deduping by id (first write wins). Blank ids are
|
|
98
|
+
* dropped; blank labels fall back to the id.
|
|
99
|
+
*/
|
|
100
|
+
export declare function mergeModelOptions(fetchedModels: readonly ModelCatalogOption[], suggestedModels: readonly ModelCatalogOption[]): ModelCatalogOption[];
|
|
101
|
+
/** Deterministic, non-reversible fingerprint — never persist or transmit the raw credential. */
|
|
102
|
+
export declare function fingerprintCredential(value: string): string;
|
|
103
|
+
/**
|
|
104
|
+
* A stable key for caching a fetched model catalogue, scoped to the
|
|
105
|
+
* provider, endpoint, and credential in use — so switching any one of them
|
|
106
|
+
* misses the cache instead of silently reusing another provider's list.
|
|
107
|
+
* `variant` covers protocols that key on more than credential + endpoint
|
|
108
|
+
* (e.g. an API version).
|
|
109
|
+
*/
|
|
110
|
+
export declare function modelCatalogCacheKey(providerId: string, baseUrl: string, credential: string, variant?: string): string;
|
|
111
|
+
/**
|
|
112
|
+
* If `choice` names a model no longer in the agent's current catalogue,
|
|
113
|
+
* falls back to the agent's first available model. Returns `null` when no
|
|
114
|
+
* normalization is needed (nothing to change) or possible (no configured
|
|
115
|
+
* model, or the agent has no models to fall back to).
|
|
116
|
+
*/
|
|
117
|
+
export declare function normalizeAgentModelChoice(agent: Pick<AgentDefinition, 'models'> | null | undefined, choice: AgentModelChoice | undefined): AgentModelChoice | null;
|
|
118
|
+
/** `normalizeAgentModelChoice`'s result if normalization applied, else the original choice. */
|
|
119
|
+
export declare function effectiveAgentModelChoice(agent: Pick<AgentDefinition, 'models'> | null | undefined, choice: AgentModelChoice | undefined): AgentModelChoice | undefined;
|
|
120
|
+
//# sourceMappingURL=model-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-registry.d.ts","sourceRoot":"","sources":["../src/model-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,CAAC;AAE3E,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4FAA4F;IAC5F,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC9B,gBAAgB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACxC,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,qBAAqB,CAAC,EACpD,mBAAmB,EAAE,OAAO,GAC3B,gBAAgB,CAGlB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,SAAS,kBAAkB,EAAE,EAC5C,eAAe,EAAE,SAAS,kBAAkB,EAAE,GAC7C,kBAAkB,EAAE,CAYtB;AAED,gGAAgG;AAChG,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO3D;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,SAAK,GACX,MAAM,CAOR;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,GAAG,IAAI,GAAG,SAAS,EACzD,MAAM,EAAE,gBAAgB,GAAG,SAAS,GACnC,gBAAgB,GAAG,IAAI,CAUzB;AAED,+FAA+F;AAC/F,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,GAAG,IAAI,GAAG,SAAS,EACzD,MAAM,EAAE,gBAAgB,GAAG,SAAS,GACnC,gBAAgB,GAAG,SAAS,CAE9B"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves a provider's credential status for display. A provider that
|
|
3
|
+
* doesn't require credentials is always `available`; otherwise the status
|
|
4
|
+
* depends on whether a credential has actually been stored.
|
|
5
|
+
*/
|
|
6
|
+
export function resolveCredentialStatus(provider, hasStoredCredential) {
|
|
7
|
+
if (provider.credentialsRequired === false)
|
|
8
|
+
return 'available';
|
|
9
|
+
return hasStoredCredential ? 'configured' : 'unconfigured';
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Merges a live-fetched model list with a static suggestion list, keeping
|
|
13
|
+
* fetched entries first and deduping by id (first write wins). Blank ids are
|
|
14
|
+
* dropped; blank labels fall back to the id.
|
|
15
|
+
*/
|
|
16
|
+
export function mergeModelOptions(fetchedModels, suggestedModels) {
|
|
17
|
+
const seen = new Set();
|
|
18
|
+
const merged = [];
|
|
19
|
+
const add = (model) => {
|
|
20
|
+
const id = model.id.trim();
|
|
21
|
+
if (!id || seen.has(id))
|
|
22
|
+
return;
|
|
23
|
+
seen.add(id);
|
|
24
|
+
merged.push({ ...model, id, label: model.label.trim() || id });
|
|
25
|
+
};
|
|
26
|
+
for (const model of fetchedModels)
|
|
27
|
+
add(model);
|
|
28
|
+
for (const model of suggestedModels)
|
|
29
|
+
add(model);
|
|
30
|
+
return merged;
|
|
31
|
+
}
|
|
32
|
+
/** Deterministic, non-reversible fingerprint — never persist or transmit the raw credential. */
|
|
33
|
+
export function fingerprintCredential(value) {
|
|
34
|
+
let hash = 0x811c9dc5;
|
|
35
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
36
|
+
hash ^= value.charCodeAt(i);
|
|
37
|
+
hash = Math.imul(hash, 0x01000193);
|
|
38
|
+
}
|
|
39
|
+
return `${value.length}:${(hash >>> 0).toString(36)}`;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* A stable key for caching a fetched model catalogue, scoped to the
|
|
43
|
+
* provider, endpoint, and credential in use — so switching any one of them
|
|
44
|
+
* misses the cache instead of silently reusing another provider's list.
|
|
45
|
+
* `variant` covers protocols that key on more than credential + endpoint
|
|
46
|
+
* (e.g. an API version).
|
|
47
|
+
*/
|
|
48
|
+
export function modelCatalogCacheKey(providerId, baseUrl, credential, variant = '') {
|
|
49
|
+
return [
|
|
50
|
+
providerId,
|
|
51
|
+
baseUrl.trim().replace(/\/+$/, ''),
|
|
52
|
+
fingerprintCredential(credential.trim()),
|
|
53
|
+
variant.trim(),
|
|
54
|
+
].join('\n');
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* If `choice` names a model no longer in the agent's current catalogue,
|
|
58
|
+
* falls back to the agent's first available model. Returns `null` when no
|
|
59
|
+
* normalization is needed (nothing to change) or possible (no configured
|
|
60
|
+
* model, or the agent has no models to fall back to).
|
|
61
|
+
*/
|
|
62
|
+
export function normalizeAgentModelChoice(agent, choice) {
|
|
63
|
+
const configuredModel = typeof choice?.model === 'string' && choice.model ? choice.model : null;
|
|
64
|
+
if (!configuredModel)
|
|
65
|
+
return null;
|
|
66
|
+
const modelIds = agent?.models?.map((model) => model.id) ?? [];
|
|
67
|
+
if (modelIds.length === 0 || modelIds.includes(configuredModel))
|
|
68
|
+
return null;
|
|
69
|
+
// modelIds.length === 0 already returned above, so index 0 always exists;
|
|
70
|
+
// the `| undefined` in its type is only `noUncheckedIndexedAccess` noise.
|
|
71
|
+
return { ...choice, model: modelIds[0] };
|
|
72
|
+
}
|
|
73
|
+
/** `normalizeAgentModelChoice`'s result if normalization applied, else the original choice. */
|
|
74
|
+
export function effectiveAgentModelChoice(agent, choice) {
|
|
75
|
+
return normalizeAgentModelChoice(agent, choice) ?? choice;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=model-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-registry.js","sourceRoot":"","sources":["../src/model-registry.ts"],"names":[],"mappings":"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"}
|
package/dist/models.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module models
|
|
3
|
+
*
|
|
4
|
+
* Model-option defaults, a per-agent "last surfaced to the UI" live-model
|
|
5
|
+
* cache, and model-id sanitization. Ported verbatim from OD's
|
|
6
|
+
* `apps/daemon/src/runtimes/core/models.ts` — no product coupling.
|
|
7
|
+
*/
|
|
8
|
+
import type { RuntimeAgentDef, RuntimeModelOption } from './types.js';
|
|
9
|
+
export declare const DEFAULT_MODEL_OPTION: RuntimeModelOption;
|
|
10
|
+
export declare function rememberLiveModels(agentId: string, models: RuntimeModelOption[], scope?: string | null): void;
|
|
11
|
+
export declare function getRememberedLiveModels(agentId: string, scope?: string | null): RuntimeModelOption[];
|
|
12
|
+
export declare function preferFreshLiveModels(freshModels: RuntimeModelOption[], rememberedModels: RuntimeModelOption[]): RuntimeModelOption[];
|
|
13
|
+
export declare function isKnownModel(def: RuntimeAgentDef, modelId: string | null | undefined, scope?: string | null): boolean;
|
|
14
|
+
export declare function resolveModelForAgent(def: RuntimeAgentDef, resolved: string | null, env?: Record<string, string | undefined>, liveModelScope?: string | null): string | null;
|
|
15
|
+
export declare function sanitizeCustomModel(id: string | null | undefined): string | null;
|
|
16
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEtE,eAAO,MAAM,oBAAoB,EAAE,kBAGlC,CAAC;AAeF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,QAQtG;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,kBAAkB,EAAE,CAGpG;AAED,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,kBAAkB,EAAE,EACjC,gBAAgB,EAAE,kBAAkB,EAAE,GACrC,kBAAkB,EAAE,CAEtB;AAED,wBAAgB,YAAY,CAC1B,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAClC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,WAStB;AAUD,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,eAAe,EACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,EACrD,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,GAC7B,MAAM,GAAG,IAAI,CAmBf;AAQD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,iBAMhE"}
|
package/dist/models.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
export const DEFAULT_MODEL_OPTION = {
|
|
2
|
+
id: 'default',
|
|
3
|
+
label: 'Default (CLI config)',
|
|
4
|
+
};
|
|
5
|
+
// A host's chat endpoint needs to validate the user's model pick against
|
|
6
|
+
// the list last surfaced to the UI. We keep a per-agent cache of the most
|
|
7
|
+
// recent live list (refreshed every detectAgents() call) and additionally
|
|
8
|
+
// trust any value present in the static fallback. A model that's neither
|
|
9
|
+
// gets rejected so a stale or hostile value can't smuggle arbitrary flags.
|
|
10
|
+
const liveModelCache = new Map();
|
|
11
|
+
const liveModelOrder = new Map();
|
|
12
|
+
function liveModelCacheKey(agentId, scope) {
|
|
13
|
+
const trimmedScope = typeof scope === 'string' ? scope.trim() : '';
|
|
14
|
+
return trimmedScope ? `${agentId}\0${trimmedScope}` : agentId;
|
|
15
|
+
}
|
|
16
|
+
export function rememberLiveModels(agentId, models, scope) {
|
|
17
|
+
if (!Array.isArray(models))
|
|
18
|
+
return;
|
|
19
|
+
const ids = models
|
|
20
|
+
.map((m) => m && m.id)
|
|
21
|
+
.filter((id) => typeof id === 'string');
|
|
22
|
+
const key = liveModelCacheKey(agentId, scope);
|
|
23
|
+
liveModelCache.set(key, new Set(ids));
|
|
24
|
+
liveModelOrder.set(key, ids);
|
|
25
|
+
}
|
|
26
|
+
export function getRememberedLiveModels(agentId, scope) {
|
|
27
|
+
const ids = liveModelOrder.get(liveModelCacheKey(agentId, scope)) ?? [];
|
|
28
|
+
return ids.map((id) => ({ id, label: id }));
|
|
29
|
+
}
|
|
30
|
+
export function preferFreshLiveModels(freshModels, rememberedModels) {
|
|
31
|
+
return freshModels.length > 0 ? freshModels : rememberedModels;
|
|
32
|
+
}
|
|
33
|
+
export function isKnownModel(def, modelId, scope) {
|
|
34
|
+
if (!modelId)
|
|
35
|
+
return false;
|
|
36
|
+
const live = liveModelCache.get(liveModelCacheKey(def.id, scope));
|
|
37
|
+
if (live && live.has(modelId))
|
|
38
|
+
return true;
|
|
39
|
+
if (Array.isArray(def.fallbackModels)) {
|
|
40
|
+
return def.fallbackModels.some((m) => m.id === modelId);
|
|
41
|
+
}
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
// Some adapters reject the synthetic `'default'` model id (they require an
|
|
45
|
+
// explicit model-selection call before the first prompt). Those defs
|
|
46
|
+
// declare it by omitting DEFAULT_MODEL_OPTION from `fallbackModels`
|
|
47
|
+
// entirely. When the chat run produces a null or 'default' model for one
|
|
48
|
+
// of those adapters, prefer the first model from the live list last
|
|
49
|
+
// surfaced to the UI, then fall back to the def's first concrete fallback
|
|
50
|
+
// id so the spawn layer always has a real model to forward. Defs that DO
|
|
51
|
+
// list 'default' (the common case) are left untouched.
|
|
52
|
+
export function resolveModelForAgent(def, resolved, env = process.env, liveModelScope) {
|
|
53
|
+
if (resolved && resolved !== 'default')
|
|
54
|
+
return resolved;
|
|
55
|
+
// Host-process env override. Lets an operator pin a different fallback
|
|
56
|
+
// id without a code change when the hardcoded default goes away
|
|
57
|
+
// upstream.
|
|
58
|
+
if (def.defaultModelEnvVar) {
|
|
59
|
+
const raw = env[def.defaultModelEnvVar];
|
|
60
|
+
if (typeof raw === 'string' && raw.trim())
|
|
61
|
+
return raw.trim();
|
|
62
|
+
}
|
|
63
|
+
// `def.fallbackModels` is typed `RuntimeModelOption[]` (never optional/non-array) and every
|
|
64
|
+
// entry is a well-formed object — no defensive Array.isArray/truthy-entry guard needed for a
|
|
65
|
+
// state the type system already excludes (CR-R7).
|
|
66
|
+
const fallbacks = def.fallbackModels;
|
|
67
|
+
if (fallbacks.some((m) => m.id === 'default'))
|
|
68
|
+
return resolved;
|
|
69
|
+
const liveModels = liveModelOrder.get(liveModelCacheKey(def.id, liveModelScope)) ?? [];
|
|
70
|
+
const firstLive = liveModels[0];
|
|
71
|
+
if (firstLive)
|
|
72
|
+
return firstLive;
|
|
73
|
+
if (fallbacks.length === 0)
|
|
74
|
+
return resolved;
|
|
75
|
+
return fallbacks[0].id;
|
|
76
|
+
}
|
|
77
|
+
// Permit user-typed model ids that didn't appear in either the live
|
|
78
|
+
// listing or the static fallback (e.g. the user is on a brand-new model
|
|
79
|
+
// the CLI's `models` command hasn't surfaced yet). The CLI gets the value
|
|
80
|
+
// as a child-process arg — not a shell string — so injection isn't a
|
|
81
|
+
// concern, but we still reject anything that could be misread as a flag
|
|
82
|
+
// by a downstream CLI or that contains whitespace / control chars.
|
|
83
|
+
export function sanitizeCustomModel(id) {
|
|
84
|
+
if (typeof id !== 'string')
|
|
85
|
+
return null;
|
|
86
|
+
const trimmed = id.trim();
|
|
87
|
+
if (trimmed.length === 0 || trimmed.length > 200)
|
|
88
|
+
return null;
|
|
89
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._/:@-]*$/.test(trimmed))
|
|
90
|
+
return null;
|
|
91
|
+
return trimmed;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type AgentServiceFailureCode } from './auth.js';
|
|
2
|
+
export interface OpenCodeServiceFailure {
|
|
3
|
+
code: AgentServiceFailureCode;
|
|
4
|
+
message: string;
|
|
5
|
+
statusCode: number | null;
|
|
6
|
+
}
|
|
7
|
+
export declare function resolveOpenCodeLogDir(env: Record<string, string | undefined>): string | null;
|
|
8
|
+
export declare function readLatestOpenCodeLogTail(logDir: string, options?: {
|
|
9
|
+
maxBytes?: number;
|
|
10
|
+
since?: number;
|
|
11
|
+
}): string | null;
|
|
12
|
+
export declare function extractOpenCodeServiceFailure(logTail: string): OpenCodeServiceFailure | null;
|
|
13
|
+
export declare function readOpenCodeServiceFailure(env: Record<string, string | undefined>, options?: {
|
|
14
|
+
since?: number;
|
|
15
|
+
}): OpenCodeServiceFailure | null;
|
|
16
|
+
//# sourceMappingURL=opencode-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-log.d.ts","sourceRoot":"","sources":["../src/opencode-log.ts"],"names":[],"mappings":"AAgBA,OAAO,EAA+B,KAAK,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAEtF,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,uBAAuB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAMD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,GAAG,IAAI,CAM5F;AAaD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAClD,MAAM,GAAG,IAAI,CA2Bf;AAuDD,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB,GAAG,IAAI,CAsB5F;AAKD,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,sBAAsB,GAAG,IAAI,CAM/B"}
|