@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,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module providers/sse-decode
|
|
3
|
+
*
|
|
4
|
+
* Minimal, tolerant Server-Sent-Events *frame decoder* for an INBOUND
|
|
5
|
+
* provider stream — the response body a call to the Anthropic Messages API
|
|
6
|
+
* or the OpenAI Chat Completions API sends back when `stream: true` is
|
|
7
|
+
* requested. This is deliberately not `@jini-ai/http`'s `sse.ts`: that module
|
|
8
|
+
* is the OUTBOUND channel a route uses to push events to a browser client
|
|
9
|
+
* (bounded queue, backpressure, `Last-Event-ID` replay). This module has
|
|
10
|
+
* none of that — it only turns a raw byte/text stream into `{event, data}`
|
|
11
|
+
* frames per the SSE wire format (`text/event-stream`, RFC-ish: fields
|
|
12
|
+
* separated by `\n`, records separated by a blank line), so a provider-
|
|
13
|
+
* specific turn-runner (`anthropic-messages.ts`, `openai-chat.ts`) can
|
|
14
|
+
* `JSON.parse` each frame's `data` field without re-deriving line/record
|
|
15
|
+
* framing itself.
|
|
16
|
+
*
|
|
17
|
+
* New file, not a port — chat.ts's origin used the Node `fetch` global's
|
|
18
|
+
* response body directly with ad hoc inline buffering per call site; this
|
|
19
|
+
* factors that concern into one shared, independently-tested primitive so
|
|
20
|
+
* both provider turn-runners consume the same framing logic (the same
|
|
21
|
+
* "shared mechanism, one implementation" discipline `@jini-ai/http`'s
|
|
22
|
+
* `sse.ts`/`origin-validation.ts` already apply to their own domains).
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* Decodes an inbound byte/text stream into SSE records. Accepts either
|
|
26
|
+
* `Uint8Array` chunks (a real `fetch` response body) or `string` chunks (test
|
|
27
|
+
* fixtures, or any caller that already has decoded text) in the same
|
|
28
|
+
* iterable — this keeps unit tests free of any need to construct a real web
|
|
29
|
+
* `ReadableStream`, matching this package's existing `fetch`-mocking
|
|
30
|
+
* convention (`vi.stubGlobal('fetch', ...)`, see `model-catalog.test.ts`).
|
|
31
|
+
*
|
|
32
|
+
* Tolerant per the SSE spec: accepts both `\n` and `\r\n` line endings,
|
|
33
|
+
* ignores comment lines (leading `:`) and unrecognized field names (`id`/
|
|
34
|
+
* `retry` are parsed by real SSE clients for reconnect bookkeeping, which is
|
|
35
|
+
* meaningless for a single proxied request/response pair, so this decoder
|
|
36
|
+
* intentionally drops them), and flushes a trailing unterminated record —
|
|
37
|
+
* even one whose very last line has no trailing `\n` at all — once the
|
|
38
|
+
* source iterable ends, so a provider closing the connection immediately
|
|
39
|
+
* after its last byte never silently loses that last record.
|
|
40
|
+
*/
|
|
41
|
+
export async function* decodeSseStream(source) {
|
|
42
|
+
const decoder = new TextDecoder();
|
|
43
|
+
let buffer = '';
|
|
44
|
+
let eventType = null;
|
|
45
|
+
let dataLines = [];
|
|
46
|
+
let sawAnyField = false;
|
|
47
|
+
/** Processes one already-`\r`-stripped line, mutating the in-progress record. Returns the completed record when `line` is the blank line terminating a non-empty record; `null` otherwise (including a blank line with no preceding fields, which starts no record at all). */
|
|
48
|
+
function handleLine(line) {
|
|
49
|
+
if (line === '') {
|
|
50
|
+
if (!sawAnyField)
|
|
51
|
+
return null;
|
|
52
|
+
const completed = { event: eventType, data: dataLines.join('\n') };
|
|
53
|
+
eventType = null;
|
|
54
|
+
dataLines = [];
|
|
55
|
+
sawAnyField = false;
|
|
56
|
+
return completed;
|
|
57
|
+
}
|
|
58
|
+
if (line.startsWith(':'))
|
|
59
|
+
return null; // comment line, per spec
|
|
60
|
+
const colonIndex = line.indexOf(':');
|
|
61
|
+
const field = colonIndex === -1 ? line : line.slice(0, colonIndex);
|
|
62
|
+
let value = colonIndex === -1 ? '' : line.slice(colonIndex + 1);
|
|
63
|
+
if (value.startsWith(' '))
|
|
64
|
+
value = value.slice(1);
|
|
65
|
+
if (field === 'event') {
|
|
66
|
+
eventType = value;
|
|
67
|
+
sawAnyField = true;
|
|
68
|
+
}
|
|
69
|
+
else if (field === 'data') {
|
|
70
|
+
dataLines.push(value);
|
|
71
|
+
sawAnyField = true;
|
|
72
|
+
}
|
|
73
|
+
// Every other field name (id/retry/anything a future provider adds) is
|
|
74
|
+
// intentionally ignored — see module doc.
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
function* drainCompleteLines() {
|
|
78
|
+
let newlineIndex;
|
|
79
|
+
while ((newlineIndex = buffer.indexOf('\n')) !== -1) {
|
|
80
|
+
let line = buffer.slice(0, newlineIndex);
|
|
81
|
+
buffer = buffer.slice(newlineIndex + 1);
|
|
82
|
+
if (line.endsWith('\r'))
|
|
83
|
+
line = line.slice(0, -1);
|
|
84
|
+
const completed = handleLine(line);
|
|
85
|
+
if (completed)
|
|
86
|
+
yield completed;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
for await (const chunk of source) {
|
|
90
|
+
buffer += typeof chunk === 'string' ? chunk : decoder.decode(chunk, { stream: true });
|
|
91
|
+
yield* drainCompleteLines();
|
|
92
|
+
}
|
|
93
|
+
buffer += decoder.decode();
|
|
94
|
+
yield* drainCompleteLines();
|
|
95
|
+
// Flush whatever is left: either a trailing unterminated line (no final
|
|
96
|
+
// `\n` at all — `buffer` still holds it, never having been handed to
|
|
97
|
+
// `handleLine`), or a fully-parsed-but-not-blank-line-terminated record
|
|
98
|
+
// (`buffer` is empty, but `sawAnyField` is true from lines already
|
|
99
|
+
// processed above).
|
|
100
|
+
if (buffer.length > 0) {
|
|
101
|
+
const completed = handleLine(buffer.endsWith('\r') ? buffer.slice(0, -1) : buffer);
|
|
102
|
+
if (completed)
|
|
103
|
+
yield completed;
|
|
104
|
+
}
|
|
105
|
+
if (sawAnyField) {
|
|
106
|
+
yield { event: eventType, data: dataLines.join('\n') };
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=sse-decode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-decode.js","sourceRoot":"","sources":["../../src/providers/sse-decode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module providers/token-params
|
|
3
|
+
*
|
|
4
|
+
* OpenAI chat-completions token-limit parameter selection. The
|
|
5
|
+
* `max_tokens` field was renamed `max_completion_tokens` for the
|
|
6
|
+
* GPT-5/o-series reasoning-model families, which reject the legacy field;
|
|
7
|
+
* every other OpenAI-wire-compatible model (and every OpenAI-compatible
|
|
8
|
+
* gateway) still expects `max_tokens`. Product-neutral as found in the
|
|
9
|
+
* origin — ported verbatim.
|
|
10
|
+
*/
|
|
11
|
+
/** True when `model` belongs to a family that rejects the legacy `max_tokens` field. */
|
|
12
|
+
export declare function usesMaxCompletionTokens(model: string): boolean;
|
|
13
|
+
/** Selects `max_tokens` or `max_completion_tokens` per {@link usesMaxCompletionTokens}. */
|
|
14
|
+
export declare function buildOpenAIChatTokenParam(model: string, maxTokens: number): {
|
|
15
|
+
max_tokens: number;
|
|
16
|
+
} | {
|
|
17
|
+
max_completion_tokens: number;
|
|
18
|
+
};
|
|
19
|
+
/** Always the legacy `max_tokens` shape — for callers that already know the model family. */
|
|
20
|
+
export declare function buildLegacyMaxTokensParam(maxTokens: number): {
|
|
21
|
+
max_tokens: number;
|
|
22
|
+
};
|
|
23
|
+
/** Always the newer `max_completion_tokens` shape — for callers that already know the model family. */
|
|
24
|
+
export declare function buildMaxCompletionTokensParam(maxTokens: number): {
|
|
25
|
+
max_completion_tokens: number;
|
|
26
|
+
};
|
|
27
|
+
/** Detects the provider error text a gateway returns when `max_tokens` was rejected in favor of `max_completion_tokens`. */
|
|
28
|
+
export declare function isUnsupportedMaxTokensError(detail: string): boolean;
|
|
29
|
+
//# sourceMappingURL=token-params.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-params.d.ts","sourceRoot":"","sources":["../../src/providers/token-params.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,wFAAwF;AACxF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAQ9D;AAED,2FAA2F;AAC3F,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,qBAAqB,EAAE,MAAM,CAAA;CAAE,CAK5D;AAED,6FAA6F;AAC7F,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAEnF;AAED,uGAAuG;AACvG,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,qBAAqB,EAAE,MAAM,CAAA;CAAE,CAElG;AAED,4HAA4H;AAC5H,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAOnE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module providers/token-params
|
|
3
|
+
*
|
|
4
|
+
* OpenAI chat-completions token-limit parameter selection. The
|
|
5
|
+
* `max_tokens` field was renamed `max_completion_tokens` for the
|
|
6
|
+
* GPT-5/o-series reasoning-model families, which reject the legacy field;
|
|
7
|
+
* every other OpenAI-wire-compatible model (and every OpenAI-compatible
|
|
8
|
+
* gateway) still expects `max_tokens`. Product-neutral as found in the
|
|
9
|
+
* origin — ported verbatim.
|
|
10
|
+
*/
|
|
11
|
+
/** True when `model` belongs to a family that rejects the legacy `max_tokens` field. */
|
|
12
|
+
export function usesMaxCompletionTokens(model) {
|
|
13
|
+
const normalized = model.trim().toLowerCase();
|
|
14
|
+
return (/^gpt-5(?:[.-]|$)/.test(normalized) ||
|
|
15
|
+
/^o1(?:[.-]|$)/.test(normalized) ||
|
|
16
|
+
/^o3(?:[.-]|$)/.test(normalized) ||
|
|
17
|
+
/^o4(?:[.-]|$)/.test(normalized));
|
|
18
|
+
}
|
|
19
|
+
/** Selects `max_tokens` or `max_completion_tokens` per {@link usesMaxCompletionTokens}. */
|
|
20
|
+
export function buildOpenAIChatTokenParam(model, maxTokens) {
|
|
21
|
+
if (usesMaxCompletionTokens(model)) {
|
|
22
|
+
return { max_completion_tokens: maxTokens };
|
|
23
|
+
}
|
|
24
|
+
return { max_tokens: maxTokens };
|
|
25
|
+
}
|
|
26
|
+
/** Always the legacy `max_tokens` shape — for callers that already know the model family. */
|
|
27
|
+
export function buildLegacyMaxTokensParam(maxTokens) {
|
|
28
|
+
return { max_tokens: maxTokens };
|
|
29
|
+
}
|
|
30
|
+
/** Always the newer `max_completion_tokens` shape — for callers that already know the model family. */
|
|
31
|
+
export function buildMaxCompletionTokensParam(maxTokens) {
|
|
32
|
+
return { max_completion_tokens: maxTokens };
|
|
33
|
+
}
|
|
34
|
+
/** Detects the provider error text a gateway returns when `max_tokens` was rejected in favor of `max_completion_tokens`. */
|
|
35
|
+
export function isUnsupportedMaxTokensError(detail) {
|
|
36
|
+
const normalized = detail.toLowerCase();
|
|
37
|
+
return (normalized.includes('unsupported parameter') &&
|
|
38
|
+
normalized.includes('max_tokens') &&
|
|
39
|
+
normalized.includes('max_completion_tokens'));
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=token-params.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-params.js","sourceRoot":"","sources":["../../src/providers/token-params.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,wFAAwF;AACxF,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACnD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,OAAO,CACL,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;QACnC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC;QAChC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC;QAChC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CACjC,CAAC;AACJ,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,yBAAyB,CACvC,KAAa,EACb,SAAiB;IAEjB,IAAI,uBAAuB,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,CAAC;IAC9C,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AACnC,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,yBAAyB,CAAC,SAAiB;IACzD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AACnC,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,6BAA6B,CAAC,SAAiB;IAC7D,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,CAAC;AAC9C,CAAC;AAED,4HAA4H;AAC5H,MAAM,UAAU,2BAA2B,CAAC,MAAc;IACxD,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACxC,OAAO,CACL,UAAU,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC5C,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC;QACjC,UAAU,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAC7C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module providers/turn-end-guard
|
|
3
|
+
*
|
|
4
|
+
* Extracted, directly-testable fix for OD's confirmed duplicate-`end`-event
|
|
5
|
+
* bug (see `anthropic-messages.ts`'s module doc and `ADS-memory/reports/
|
|
6
|
+
* proposals/PROP-http-route-packs-chat-model-proxy-2026-07-21.md`): a
|
|
7
|
+
* tool-loop turn-runner has multiple call sites that each *want* to end the
|
|
8
|
+
* turn's event stream (role-marker-guard contamination, normal completion,
|
|
9
|
+
* the tool-turn ceiling, a request/stream error) — this guarantees at most
|
|
10
|
+
* one of them actually reaches `onEvent`.
|
|
11
|
+
*
|
|
12
|
+
* Pulled out of `anthropic-messages.ts`/`openai-chat.ts` into its own
|
|
13
|
+
* module (rather than duplicating an identical `let ended = false` closure
|
|
14
|
+
* in both files) per this repo's "no scope cuts for coverage — extract
|
|
15
|
+
* instead" rule: both turn-runners are structured so every call site that
|
|
16
|
+
* can reach `emitEnd` is already immediately followed by a `break`/`return`
|
|
17
|
+
* (traced and documented at each call site), which makes the guard's own
|
|
18
|
+
* "already ended, no-op" branch unreachable through either turn-runner's
|
|
19
|
+
* *own* integration-level tests — not because the guard is unnecessary
|
|
20
|
+
* (the task requires it, and a future code change that adds a call site
|
|
21
|
+
* without an immediate `break` would silently regress without it), but
|
|
22
|
+
* because a correctly-written caller never exercises the redundant path.
|
|
23
|
+
* Extracting the guard into its own pure, minimal unit gives it real,
|
|
24
|
+
* direct coverage instead of leaving that branch dark or faking an
|
|
25
|
+
* artificial caller-side scenario just to trip it.
|
|
26
|
+
*/
|
|
27
|
+
/** Why a turn-runner's event stream ended. Shared verbatim by `anthropic-messages.ts#AnthropicTurnEndReason` and `openai-chat.ts#OpenAiTurnEndReason`. */
|
|
28
|
+
export type TurnEndReason = 'stop' | 'contaminated' | 'max_tool_turns' | 'error';
|
|
29
|
+
export interface TurnEndGuard {
|
|
30
|
+
/** Emits the end event via `onEvent` on the first call; every subsequent call (any reason) is a silent no-op. */
|
|
31
|
+
readonly emitEnd: (reason: TurnEndReason) => void;
|
|
32
|
+
/** True once `emitEnd` has fired. */
|
|
33
|
+
readonly hasEnded: () => boolean;
|
|
34
|
+
}
|
|
35
|
+
/** Builds a fresh, single-use end guard. `makeEndEvent` lets each turn-runner's own event union shape (`AnthropicTurnEvent`/`OpenAiTurnEvent`) stay independent — this module has no opinion on it. */
|
|
36
|
+
export declare function createTurnEndGuard<Event>(onEvent: (event: Event) => void, makeEndEvent: (reason: TurnEndReason) => Event): TurnEndGuard;
|
|
37
|
+
//# sourceMappingURL=turn-end-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-end-guard.d.ts","sourceRoot":"","sources":["../../src/providers/turn-end-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,0JAA0J;AAC1J,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,cAAc,GAAG,gBAAgB,GAAG,OAAO,CAAC;AAEjF,MAAM,WAAW,YAAY;IAC3B,iHAAiH;IACjH,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAClD,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC;CAClC;AAED,uMAAuM;AACvM,wBAAgB,kBAAkB,CAAC,KAAK,EACtC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,EAC/B,YAAY,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,KAAK,GAC7C,YAAY,CAYd"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module providers/turn-end-guard
|
|
3
|
+
*
|
|
4
|
+
* Extracted, directly-testable fix for OD's confirmed duplicate-`end`-event
|
|
5
|
+
* bug (see `anthropic-messages.ts`'s module doc and `ADS-memory/reports/
|
|
6
|
+
* proposals/PROP-http-route-packs-chat-model-proxy-2026-07-21.md`): a
|
|
7
|
+
* tool-loop turn-runner has multiple call sites that each *want* to end the
|
|
8
|
+
* turn's event stream (role-marker-guard contamination, normal completion,
|
|
9
|
+
* the tool-turn ceiling, a request/stream error) — this guarantees at most
|
|
10
|
+
* one of them actually reaches `onEvent`.
|
|
11
|
+
*
|
|
12
|
+
* Pulled out of `anthropic-messages.ts`/`openai-chat.ts` into its own
|
|
13
|
+
* module (rather than duplicating an identical `let ended = false` closure
|
|
14
|
+
* in both files) per this repo's "no scope cuts for coverage — extract
|
|
15
|
+
* instead" rule: both turn-runners are structured so every call site that
|
|
16
|
+
* can reach `emitEnd` is already immediately followed by a `break`/`return`
|
|
17
|
+
* (traced and documented at each call site), which makes the guard's own
|
|
18
|
+
* "already ended, no-op" branch unreachable through either turn-runner's
|
|
19
|
+
* *own* integration-level tests — not because the guard is unnecessary
|
|
20
|
+
* (the task requires it, and a future code change that adds a call site
|
|
21
|
+
* without an immediate `break` would silently regress without it), but
|
|
22
|
+
* because a correctly-written caller never exercises the redundant path.
|
|
23
|
+
* Extracting the guard into its own pure, minimal unit gives it real,
|
|
24
|
+
* direct coverage instead of leaving that branch dark or faking an
|
|
25
|
+
* artificial caller-side scenario just to trip it.
|
|
26
|
+
*/
|
|
27
|
+
/** Builds a fresh, single-use end guard. `makeEndEvent` lets each turn-runner's own event union shape (`AnthropicTurnEvent`/`OpenAiTurnEvent`) stay independent — this module has no opinion on it. */
|
|
28
|
+
export function createTurnEndGuard(onEvent, makeEndEvent) {
|
|
29
|
+
let ended = false;
|
|
30
|
+
return {
|
|
31
|
+
emitEnd(reason) {
|
|
32
|
+
if (ended)
|
|
33
|
+
return;
|
|
34
|
+
ended = true;
|
|
35
|
+
onEvent(makeEndEvent(reason));
|
|
36
|
+
},
|
|
37
|
+
hasEnded() {
|
|
38
|
+
return ended;
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=turn-end-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-end-guard.js","sourceRoot":"","sources":["../../src/providers/turn-end-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAYH,uMAAuM;AACvM,MAAM,UAAU,kBAAkB,CAChC,OAA+B,EAC/B,YAA8C;IAE9C,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,OAAO;QACL,OAAO,CAAC,MAAqB;YAC3B,IAAI,KAAK;gBAAE,OAAO;YAClB,KAAK,GAAG,IAAI,CAAC;YACb,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QAChC,CAAC;QACD,QAAQ;YACN,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module providers/types
|
|
3
|
+
*
|
|
4
|
+
* Vendored subset of OD's upstream contracts-package provider-connectivity
|
|
5
|
+
* shapes needed by this package's own provider modules. `@jini-ai/agent-runtime`
|
|
6
|
+
* has zero OD workspace-package imports (same policy as `types.ts`'s vendored
|
|
7
|
+
* `AgentDiagnostic`/`AgentFixIntent`) — only the fields this package's own
|
|
8
|
+
* code actually reads/writes are kept; the daemon-only surface (agent
|
|
9
|
+
* connection-test request/response shapes, reasoning-execution fields) is
|
|
10
|
+
* not ported.
|
|
11
|
+
*/
|
|
12
|
+
/** Category of outcome a provider model/connection probe can report. */
|
|
13
|
+
export type ConnectionTestKind = 'success' | 'auth_failed' | 'forbidden' | 'not_found_model' | 'invalid_model_id' | 'invalid_base_url' | 'rate_limited' | 'upstream_unavailable' | 'timeout' | 'unknown';
|
|
14
|
+
/** Wire protocol family a BYOK provider speaks. */
|
|
15
|
+
export type ConnectionTestProtocol = 'anthropic' | 'openai' | 'azure' | 'google' | 'ollama' | 'senseaudio' | 'aihubmix' | 'bedrock';
|
|
16
|
+
export interface ProviderModelOption {
|
|
17
|
+
id: string;
|
|
18
|
+
label: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ProviderModelsRequest {
|
|
21
|
+
protocol: ConnectionTestProtocol;
|
|
22
|
+
baseUrl: string;
|
|
23
|
+
apiKey: string;
|
|
24
|
+
/** Azure only. Kept for shape parity with a provider-test request. */
|
|
25
|
+
apiVersion?: string;
|
|
26
|
+
}
|
|
27
|
+
export type ProviderModelsKind = ConnectionTestKind | 'no_models' | 'unsupported_protocol';
|
|
28
|
+
export interface ProviderModelsResponse {
|
|
29
|
+
ok: boolean;
|
|
30
|
+
kind: ProviderModelsKind;
|
|
31
|
+
latencyMs: number;
|
|
32
|
+
models?: ProviderModelOption[];
|
|
33
|
+
status?: number;
|
|
34
|
+
detail?: string;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,wEAAwE;AACxE,MAAM,MAAM,kBAAkB,GAC1B,SAAS,GACT,aAAa,GACb,WAAW,GACX,iBAAiB,GACjB,kBAAkB,GAClB,kBAAkB,GAClB,cAAc,GACd,sBAAsB,GACtB,SAAS,GACT,SAAS,CAAC;AAEd,mDAAmD;AACnD,MAAM,MAAM,sBAAsB,GAC9B,WAAW,GACX,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,YAAY,GACZ,UAAU,GACV,SAAS,CAAC;AAEd,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,sBAAsB,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,kBAAkB,GAAG,kBAAkB,GAAG,WAAW,GAAG,sBAAsB,CAAC;AAE3F,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,kBAAkB,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module providers/types
|
|
3
|
+
*
|
|
4
|
+
* Vendored subset of OD's upstream contracts-package provider-connectivity
|
|
5
|
+
* shapes needed by this package's own provider modules. `@jini-ai/agent-runtime`
|
|
6
|
+
* has zero OD workspace-package imports (same policy as `types.ts`'s vendored
|
|
7
|
+
* `AgentDiagnostic`/`AgentFixIntent`) — only the fields this package's own
|
|
8
|
+
* code actually reads/writes are kept; the daemon-only surface (agent
|
|
9
|
+
* connection-test request/response shapes, reasoning-execution fields) is
|
|
10
|
+
* not ported.
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module qoder-stream
|
|
3
|
+
*
|
|
4
|
+
* Ported verbatim from OD's `apps/daemon/src/runtimes/stream/qoder-stream.ts`
|
|
5
|
+
* (only `node:buffer` as a dependency). See `source-map.md`.
|
|
6
|
+
*
|
|
7
|
+
* Parses Qoder CLI's `--output-format stream-json` JSONL stream into the
|
|
8
|
+
* small event set consumed by the chat UI. Qoder's top-level records are
|
|
9
|
+
* wrapper objects (`system`, `assistant`, `result`) with adapter-specific
|
|
10
|
+
* fields, so keep this parser separate from Claude/Codex-compatible streams.
|
|
11
|
+
*/
|
|
12
|
+
type QoderEvent = Record<string, unknown>;
|
|
13
|
+
type QoderEventSink = (event: QoderEvent) => void;
|
|
14
|
+
export declare function createQoderStreamHandler(onEvent: QoderEventSink): {
|
|
15
|
+
feed: (chunk: unknown) => void;
|
|
16
|
+
flush: () => void;
|
|
17
|
+
};
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=qoder-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qoder-stream.d.ts","sourceRoot":"","sources":["../src/qoder-stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC1C,KAAK,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAkDlD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,cAAc;kBA4FzC,OAAO;;EAmB7B"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module qoder-stream
|
|
3
|
+
*
|
|
4
|
+
* Ported verbatim from OD's `apps/daemon/src/runtimes/stream/qoder-stream.ts`
|
|
5
|
+
* (only `node:buffer` as a dependency). See `source-map.md`.
|
|
6
|
+
*
|
|
7
|
+
* Parses Qoder CLI's `--output-format stream-json` JSONL stream into the
|
|
8
|
+
* small event set consumed by the chat UI. Qoder's top-level records are
|
|
9
|
+
* wrapper objects (`system`, `assistant`, `result`) with adapter-specific
|
|
10
|
+
* fields, so keep this parser separate from Claude/Codex-compatible streams.
|
|
11
|
+
*/
|
|
12
|
+
import { Buffer } from 'node:buffer';
|
|
13
|
+
function isRecord(value) {
|
|
14
|
+
return Boolean(value) && typeof value === 'object';
|
|
15
|
+
}
|
|
16
|
+
function stringifyContent(value) {
|
|
17
|
+
if (typeof value === 'string')
|
|
18
|
+
return value;
|
|
19
|
+
if (Buffer.isBuffer(value))
|
|
20
|
+
return value.toString('utf8');
|
|
21
|
+
if (value == null)
|
|
22
|
+
return '';
|
|
23
|
+
try {
|
|
24
|
+
return JSON.stringify(value);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return String(value);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function textFromContentBlock(block) {
|
|
31
|
+
if (!isRecord(block))
|
|
32
|
+
return '';
|
|
33
|
+
if (block.type === 'text' && typeof block.text === 'string')
|
|
34
|
+
return block.text;
|
|
35
|
+
if (typeof block.text === 'string')
|
|
36
|
+
return block.text;
|
|
37
|
+
return '';
|
|
38
|
+
}
|
|
39
|
+
function messageFromError(error) {
|
|
40
|
+
if (isRecord(error) && typeof error.message === 'string') {
|
|
41
|
+
return error.message;
|
|
42
|
+
}
|
|
43
|
+
if (typeof error === 'string' && error.length > 0)
|
|
44
|
+
return error;
|
|
45
|
+
return 'Unknown Qoder error';
|
|
46
|
+
}
|
|
47
|
+
function messageFromResult(obj) {
|
|
48
|
+
if (typeof obj.error === 'string' && obj.error.length > 0)
|
|
49
|
+
return obj.error;
|
|
50
|
+
if (isRecord(obj.error) &&
|
|
51
|
+
typeof obj.error.message === 'string' &&
|
|
52
|
+
obj.error.message.length > 0) {
|
|
53
|
+
return obj.error.message;
|
|
54
|
+
}
|
|
55
|
+
if (typeof obj.message === 'string' && obj.message.length > 0) {
|
|
56
|
+
return obj.message;
|
|
57
|
+
}
|
|
58
|
+
if (typeof obj.stop_reason === 'string' && obj.stop_reason.length > 0) {
|
|
59
|
+
return `Qoder run failed: ${obj.stop_reason}`;
|
|
60
|
+
}
|
|
61
|
+
return 'Qoder run failed';
|
|
62
|
+
}
|
|
63
|
+
export function createQoderStreamHandler(onEvent) {
|
|
64
|
+
let buffer = '';
|
|
65
|
+
let emittedThinkingStart = false;
|
|
66
|
+
function handleObject(obj, rawLine) {
|
|
67
|
+
if (!isRecord(obj))
|
|
68
|
+
return;
|
|
69
|
+
if (obj.type === 'system' && obj.subtype === 'init') {
|
|
70
|
+
onEvent({
|
|
71
|
+
type: 'status',
|
|
72
|
+
label: 'initializing',
|
|
73
|
+
model: typeof obj.model === 'string' ? obj.model : undefined,
|
|
74
|
+
sessionId: typeof obj.session_id === 'string' ? obj.session_id : undefined,
|
|
75
|
+
qodercliVersion: typeof obj.qodercli_version === 'string'
|
|
76
|
+
? obj.qodercli_version
|
|
77
|
+
: undefined,
|
|
78
|
+
});
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (obj.type === 'assistant' && isRecord(obj.message)) {
|
|
82
|
+
const content = Array.isArray(obj.message.content)
|
|
83
|
+
? obj.message.content
|
|
84
|
+
: [];
|
|
85
|
+
let emittedText = false;
|
|
86
|
+
for (const block of content) {
|
|
87
|
+
const text = textFromContentBlock(block);
|
|
88
|
+
if (text.length > 0) {
|
|
89
|
+
emittedText = true;
|
|
90
|
+
onEvent({ type: 'text_delta', delta: text });
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (isRecord(block) &&
|
|
94
|
+
block.type === 'thinking' &&
|
|
95
|
+
typeof block.thinking === 'string' &&
|
|
96
|
+
block.thinking.length > 0) {
|
|
97
|
+
if (!emittedThinkingStart) {
|
|
98
|
+
emittedThinkingStart = true;
|
|
99
|
+
onEvent({ type: 'thinking_start' });
|
|
100
|
+
}
|
|
101
|
+
onEvent({ type: 'thinking_delta', delta: block.thinking });
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (!emittedText && typeof obj.message.content === 'string') {
|
|
105
|
+
onEvent({ type: 'text_delta', delta: obj.message.content });
|
|
106
|
+
emittedText = true;
|
|
107
|
+
}
|
|
108
|
+
if (obj.error && !emittedText) {
|
|
109
|
+
onEvent({
|
|
110
|
+
type: 'error',
|
|
111
|
+
message: messageFromError(obj.error),
|
|
112
|
+
raw: rawLine,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (obj.type === 'result') {
|
|
118
|
+
const isError = Boolean(obj.is_error);
|
|
119
|
+
onEvent({
|
|
120
|
+
type: 'usage',
|
|
121
|
+
usage: obj.usage ?? null,
|
|
122
|
+
modelUsage: obj.modelUsage ?? undefined,
|
|
123
|
+
costUsd: obj.total_cost_usd ?? null,
|
|
124
|
+
durationMs: typeof obj.duration_ms === 'number' ? obj.duration_ms : null,
|
|
125
|
+
stopReason: obj.stop_reason ?? null,
|
|
126
|
+
isError,
|
|
127
|
+
});
|
|
128
|
+
if (isError) {
|
|
129
|
+
onEvent({
|
|
130
|
+
type: 'error',
|
|
131
|
+
message: messageFromResult(obj),
|
|
132
|
+
raw: rawLine,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
onEvent({ type: 'raw', line: rawLine });
|
|
138
|
+
}
|
|
139
|
+
function handleLine(line) {
|
|
140
|
+
try {
|
|
141
|
+
handleObject(JSON.parse(line), line);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
onEvent({ type: 'raw', line });
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function feed(chunk) {
|
|
148
|
+
buffer += stringifyContent(chunk);
|
|
149
|
+
let nl;
|
|
150
|
+
while ((nl = buffer.indexOf('\n')) !== -1) {
|
|
151
|
+
const line = buffer.slice(0, nl).trim();
|
|
152
|
+
buffer = buffer.slice(nl + 1);
|
|
153
|
+
if (!line)
|
|
154
|
+
continue;
|
|
155
|
+
handleLine(line);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
function flush() {
|
|
159
|
+
const rem = buffer.trim();
|
|
160
|
+
buffer = '';
|
|
161
|
+
if (!rem)
|
|
162
|
+
return;
|
|
163
|
+
handleLine(rem);
|
|
164
|
+
}
|
|
165
|
+
return { feed, flush };
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=qoder-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qoder-stream.js","sourceRoot":"","sources":["../src/qoder-stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { RuntimeAgentDef } from './types.js';
|
|
2
|
+
export declare const BASE_AGENT_DEFS: RuntimeAgentDef[];
|
|
3
|
+
export declare const AGENT_DEFS: RuntimeAgentDef[];
|
|
4
|
+
export declare function getAgentDef(id: string): RuntimeAgentDef | null;
|
|
5
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AA6CA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,eAAO,MAAM,eAAe,EAAE,eAAe,EAyB5C,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,eAAe,EAAyB,CAAC;AAUlE,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAE9D"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module registry
|
|
3
|
+
*
|
|
4
|
+
* The static `BASE_AGENT_DEFS` catalog (the 24 built-in CLI adapters), a
|
|
5
|
+
* dup-id guard, and `getAgentDef(id)` lookup.
|
|
6
|
+
*
|
|
7
|
+
* Ported from OD's `apps/daemon/src/runtimes/registry/registry.ts`. Per the
|
|
8
|
+
* task's explicit scope ("`registry.ts` → `BASE_AGENT_DEFS` array + dup-id
|
|
9
|
+
* guard + `getAgentDef(id)`"), the origin's `readLocalAgentProfileDefs`
|
|
10
|
+
* local-profile-file loader is deliberately NOT ported here — it reads a
|
|
11
|
+
* product-prefixed config-path override env var, falls back to a
|
|
12
|
+
* product-branded default path under the user's home dir, reads a
|
|
13
|
+
* product-prefixed data-dir env var, and depends on OD's daemon-level
|
|
14
|
+
* sandbox-runtime-config subsystem (out of this package's charter
|
|
15
|
+
* entirely; see `source-map.md` for the exact original names). `AGENT_DEFS`
|
|
16
|
+
* here is exactly `BASE_AGENT_DEFS` (no local-profile merge). A future task
|
|
17
|
+
* can reintroduce a de-branded, sandbox-free local-profile loader as an
|
|
18
|
+
* injected port if a consumer needs it. See `source-map.md`.
|
|
19
|
+
*/
|
|
20
|
+
import { aiderAgentDef, ampAgentDef, amrAgentDef, antigravityAgentDef, claudeAgentDef, codebuddyAgentDef, codexAgentDef, copilotAgentDef, cursorAgentDef, deepseekAgentDef, devinAgentDef, grokBuildAgentDef, hermesAgentDef, kiloAgentDef, kimiAgentDef, kiroAgentDef, mimoAgentDef, opencodeAgentDef, piAgentDef, qoderAgentDef, qwenAgentDef, reasonixAgentDef, traeCliAgentDef, vibeAgentDef, } from './defs/index.js';
|
|
21
|
+
export const BASE_AGENT_DEFS = [
|
|
22
|
+
amrAgentDef,
|
|
23
|
+
claudeAgentDef,
|
|
24
|
+
codexAgentDef,
|
|
25
|
+
devinAgentDef,
|
|
26
|
+
opencodeAgentDef,
|
|
27
|
+
hermesAgentDef,
|
|
28
|
+
traeCliAgentDef,
|
|
29
|
+
grokBuildAgentDef,
|
|
30
|
+
kimiAgentDef,
|
|
31
|
+
cursorAgentDef,
|
|
32
|
+
qwenAgentDef,
|
|
33
|
+
qoderAgentDef,
|
|
34
|
+
copilotAgentDef,
|
|
35
|
+
ampAgentDef,
|
|
36
|
+
piAgentDef,
|
|
37
|
+
kiroAgentDef,
|
|
38
|
+
kiloAgentDef,
|
|
39
|
+
vibeAgentDef,
|
|
40
|
+
deepseekAgentDef,
|
|
41
|
+
aiderAgentDef,
|
|
42
|
+
antigravityAgentDef,
|
|
43
|
+
reasonixAgentDef,
|
|
44
|
+
codebuddyAgentDef,
|
|
45
|
+
mimoAgentDef,
|
|
46
|
+
];
|
|
47
|
+
export const AGENT_DEFS = [...BASE_AGENT_DEFS];
|
|
48
|
+
const ids = new Set();
|
|
49
|
+
for (const def of AGENT_DEFS) {
|
|
50
|
+
if (ids.has(def.id)) {
|
|
51
|
+
throw new Error(`Duplicate agent definition id: ${def.id}`);
|
|
52
|
+
}
|
|
53
|
+
ids.add(def.id);
|
|
54
|
+
}
|
|
55
|
+
export function getAgentDef(id) {
|
|
56
|
+
return AGENT_DEFS.find((a) => a.id === id) || null;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EACL,aAAa,EACb,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,YAAY,GACb,MAAM,iBAAiB,CAAC;AAGzB,MAAM,CAAC,MAAM,eAAe,GAAsB;IAChD,WAAW;IACX,cAAc;IACd,aAAa;IACb,aAAa;IACb,gBAAgB;IAChB,cAAc;IACd,eAAe;IACf,iBAAiB;IACjB,YAAY;IACZ,cAAc;IACd,YAAY;IACZ,aAAa;IACb,eAAe;IACf,WAAW;IACX,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,gBAAgB;IAChB,aAAa;IACb,mBAAmB;IACnB,gBAAgB;IAChB,iBAAiB;IACjB,YAAY;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAsB,CAAC,GAAG,eAAe,CAAC,CAAC;AAElE,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;AAC9B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;IAC7B,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,kCAAkC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAU;IACpC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolution.d.ts","sourceRoot":"","sources":["../src/resolution.ts"],"names":[],"mappings":"AAaA,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,aAAa,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,iBAIrF"}
|