@qduc/term2 0.7.2 → 0.7.3
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/dist/agent.d.ts +1 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +17 -1
- package/dist/agent.js.map +1 -1
- package/dist/agent.test.js +36 -0
- package/dist/agent.test.js.map +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +57 -12
- package/dist/app.js.map +1 -1
- package/dist/cli.integration.test.js +60 -4
- package/dist/cli.integration.test.js.map +1 -1
- package/dist/cli.js +33 -2
- package/dist/cli.js.map +1 -1
- package/dist/components/ApprovalPrompt.ask-user.test.d.ts +2 -0
- package/dist/components/ApprovalPrompt.ask-user.test.d.ts.map +1 -0
- package/dist/components/ApprovalPrompt.ask-user.test.js +108 -0
- package/dist/components/ApprovalPrompt.ask-user.test.js.map +1 -0
- package/dist/components/ApprovalPrompt.d.ts +4 -4
- package/dist/components/ApprovalPrompt.d.ts.map +1 -1
- package/dist/components/ApprovalPrompt.js +76 -13
- package/dist/components/ApprovalPrompt.js.map +1 -1
- package/dist/components/BottomArea.d.ts +7 -2
- package/dist/components/BottomArea.d.ts.map +1 -1
- package/dist/components/BottomArea.js +11 -6
- package/dist/components/BottomArea.js.map +1 -1
- package/dist/components/BottomArea.test.js +4 -3
- package/dist/components/BottomArea.test.js.map +1 -1
- package/dist/components/Common/MenuContainer.d.ts +3 -2
- package/dist/components/Common/MenuContainer.d.ts.map +1 -1
- package/dist/components/Common/MenuContainer.js +14 -2
- package/dist/components/Common/MenuContainer.js.map +1 -1
- package/dist/components/Common/MenuContainer.test.d.ts +2 -0
- package/dist/components/Common/MenuContainer.test.d.ts.map +1 -0
- package/dist/components/Common/MenuContainer.test.js +66 -0
- package/dist/components/Common/MenuContainer.test.js.map +1 -0
- package/dist/components/Input/PopupManager.d.ts +14 -0
- package/dist/components/Input/PopupManager.d.ts.map +1 -1
- package/dist/components/Input/PopupManager.js +6 -4
- package/dist/components/Input/PopupManager.js.map +1 -1
- package/dist/components/Input/popup-props.d.ts +3 -1
- package/dist/components/Input/popup-props.d.ts.map +1 -1
- package/dist/components/Input/popup-props.js +12 -1
- package/dist/components/Input/popup-props.js.map +1 -1
- package/dist/components/Input/popup-props.test.js +9 -0
- package/dist/components/Input/popup-props.test.js.map +1 -1
- package/dist/components/InputBox.d.ts +7 -0
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +81 -30
- package/dist/components/InputBox.js.map +1 -1
- package/dist/components/InputBox.test.js +133 -10
- package/dist/components/InputBox.test.js.map +1 -1
- package/dist/components/LargeUncachedConfirmationPrompt.d.ts +2 -1
- package/dist/components/LargeUncachedConfirmationPrompt.d.ts.map +1 -1
- package/dist/components/LargeUncachedConfirmationPrompt.js +8 -3
- package/dist/components/LargeUncachedConfirmationPrompt.js.map +1 -1
- package/dist/components/LargeUncachedConfirmationPrompt.test.js +5 -4
- package/dist/components/LargeUncachedConfirmationPrompt.test.js.map +1 -1
- package/dist/components/MessageList.d.ts +2 -1
- package/dist/components/MessageList.d.ts.map +1 -1
- package/dist/components/MessageList.js +6 -1
- package/dist/components/MessageList.js.map +1 -1
- package/dist/components/MessageList.test.js +26 -0
- package/dist/components/MessageList.test.js.map +1 -1
- package/dist/components/PathSelectionMenu.d.ts +1 -0
- package/dist/components/PathSelectionMenu.d.ts.map +1 -1
- package/dist/components/PathSelectionMenu.js +11 -9
- package/dist/components/PathSelectionMenu.js.map +1 -1
- package/dist/components/PathSelectionMenu.test.d.ts +2 -0
- package/dist/components/PathSelectionMenu.test.d.ts.map +1 -0
- package/dist/components/PathSelectionMenu.test.js +17 -0
- package/dist/components/PathSelectionMenu.test.js.map +1 -0
- package/dist/components/ProviderSelectionMenu.d.ts +15 -0
- package/dist/components/ProviderSelectionMenu.d.ts.map +1 -0
- package/dist/components/ProviderSelectionMenu.js +172 -0
- package/dist/components/ProviderSelectionMenu.js.map +1 -0
- package/dist/components/ProviderSelectionMenu.test.d.ts +2 -0
- package/dist/components/ProviderSelectionMenu.test.d.ts.map +1 -0
- package/dist/components/ProviderSelectionMenu.test.js +97 -0
- package/dist/components/ProviderSelectionMenu.test.js.map +1 -0
- package/dist/components/SettingsValueSelectionMenu.d.ts +2 -1
- package/dist/components/SettingsValueSelectionMenu.d.ts.map +1 -1
- package/dist/components/SettingsValueSelectionMenu.js +12 -6
- package/dist/components/SettingsValueSelectionMenu.js.map +1 -1
- package/dist/components/StatusBar.d.ts +1 -0
- package/dist/components/StatusBar.d.ts.map +1 -1
- package/dist/components/StatusBar.js +3 -2
- package/dist/components/StatusBar.js.map +1 -1
- package/dist/components/StatusBar.test.js +11 -0
- package/dist/components/StatusBar.test.js.map +1 -1
- package/dist/context/InputContext.d.ts +1 -1
- package/dist/context/InputContext.d.ts.map +1 -1
- package/dist/context/InputContext.js.map +1 -1
- package/dist/hooks/use-app-commands.d.ts +2 -1
- package/dist/hooks/use-app-commands.d.ts.map +1 -1
- package/dist/hooks/use-app-commands.js +11 -2
- package/dist/hooks/use-app-commands.js.map +1 -1
- package/dist/hooks/use-app-commands.test.js +2 -0
- package/dist/hooks/use-app-commands.test.js.map +1 -1
- package/dist/hooks/use-conversation.clear.test.js +31 -0
- package/dist/hooks/use-conversation.clear.test.js.map +1 -1
- package/dist/hooks/use-conversation.d.ts +4 -1
- package/dist/hooks/use-conversation.d.ts.map +1 -1
- package/dist/hooks/use-conversation.js +18 -2
- package/dist/hooks/use-conversation.js.map +1 -1
- package/dist/hooks/use-escape-key.d.ts +12 -3
- package/dist/hooks/use-escape-key.d.ts.map +1 -1
- package/dist/hooks/use-escape-key.js +25 -11
- package/dist/hooks/use-escape-key.js.map +1 -1
- package/dist/hooks/use-escape-key.test.js +154 -14
- package/dist/hooks/use-escape-key.test.js.map +1 -1
- package/dist/hooks/use-mode-handlers.d.ts +13 -1
- package/dist/hooks/use-mode-handlers.d.ts.map +1 -1
- package/dist/hooks/use-mode-handlers.js +22 -1
- package/dist/hooks/use-mode-handlers.js.map +1 -1
- package/dist/hooks/use-mode-handlers.test.d.ts +2 -0
- package/dist/hooks/use-mode-handlers.test.d.ts.map +1 -0
- package/dist/hooks/use-mode-handlers.test.js +119 -0
- package/dist/hooks/use-mode-handlers.test.js.map +1 -0
- package/dist/hooks/use-path-completion.d.ts +10 -3
- package/dist/hooks/use-path-completion.d.ts.map +1 -1
- package/dist/hooks/use-path-completion.js +53 -9
- package/dist/hooks/use-path-completion.js.map +1 -1
- package/dist/hooks/use-path-completion.test.js +61 -49
- package/dist/hooks/use-path-completion.test.js.map +1 -1
- package/dist/hooks/use-provider-selection.d.ts +60 -0
- package/dist/hooks/use-provider-selection.d.ts.map +1 -0
- package/dist/hooks/use-provider-selection.js +767 -0
- package/dist/hooks/use-provider-selection.js.map +1 -0
- package/dist/hooks/use-provider-selection.test.d.ts +2 -0
- package/dist/hooks/use-provider-selection.test.d.ts.map +1 -0
- package/dist/hooks/use-provider-selection.test.js +793 -0
- package/dist/hooks/use-provider-selection.test.js.map +1 -0
- package/dist/hooks/use-runtime-settings.d.ts.map +1 -1
- package/dist/hooks/use-runtime-settings.js +2 -2
- package/dist/hooks/use-runtime-settings.js.map +1 -1
- package/dist/hooks/use-selection.d.ts +3 -1
- package/dist/hooks/use-selection.d.ts.map +1 -1
- package/dist/hooks/use-selection.js +115 -24
- package/dist/hooks/use-selection.js.map +1 -1
- package/dist/hooks/use-selection.test.js +96 -2
- package/dist/hooks/use-selection.test.js.map +1 -1
- package/dist/hooks/use-settings-value-completion.d.ts +3 -0
- package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
- package/dist/hooks/use-settings-value-completion.js +140 -18
- package/dist/hooks/use-settings-value-completion.js.map +1 -1
- package/dist/hooks/use-settings-value-completion.test.js +71 -1
- package/dist/hooks/use-settings-value-completion.test.js.map +1 -1
- package/dist/hooks/use-trigger-detection.d.ts +4 -2
- package/dist/hooks/use-trigger-detection.d.ts.map +1 -1
- package/dist/hooks/use-trigger-detection.js +42 -8
- package/dist/hooks/use-trigger-detection.js.map +1 -1
- package/dist/hooks/use-trigger-detection.test.js +2 -1
- package/dist/hooks/use-trigger-detection.test.js.map +1 -1
- package/dist/lib/openai-agent-client.chat.test.js +8 -0
- package/dist/lib/openai-agent-client.chat.test.js.map +1 -1
- package/dist/lib/openai-agent-client.d.ts +11 -6
- package/dist/lib/openai-agent-client.d.ts.map +1 -1
- package/dist/lib/openai-agent-client.js +199 -15
- package/dist/lib/openai-agent-client.js.map +1 -1
- package/dist/lib/openai-agent-client.public-methods.test.js +326 -23
- package/dist/lib/openai-agent-client.public-methods.test.js.map +1 -1
- package/dist/lib/openai-agent-client.test.js +62 -0
- package/dist/lib/openai-agent-client.test.js.map +1 -1
- package/dist/lib/tool-invoke.d.ts +27 -0
- package/dist/lib/tool-invoke.d.ts.map +1 -1
- package/dist/lib/tool-invoke.js +124 -95
- package/dist/lib/tool-invoke.js.map +1 -1
- package/dist/lib/tool-invoke.test.js +84 -22
- package/dist/lib/tool-invoke.test.js.map +1 -1
- package/dist/non-interactive.d.ts +2 -1
- package/dist/non-interactive.d.ts.map +1 -1
- package/dist/non-interactive.js +10 -2
- package/dist/non-interactive.js.map +1 -1
- package/dist/prompts/orchestrator.md +27 -41
- package/dist/prompts/plan-mode-info.md +2 -0
- package/dist/prompts/prompt-constructor.d.ts.map +1 -1
- package/dist/prompts/prompt-constructor.js +8 -0
- package/dist/prompts/prompt-constructor.js.map +1 -1
- package/dist/prompts/prompt-constructor.test.js +13 -0
- package/dist/prompts/prompt-constructor.test.js.map +1 -1
- package/dist/prompts/prompt-constructor.test.ts +16 -0
- package/dist/prompts/prompt-constructor.ts +10 -0
- package/dist/prompts/subagent-delegation.d.ts.map +1 -1
- package/dist/prompts/subagent-delegation.js +17 -1
- package/dist/prompts/subagent-delegation.js.map +1 -1
- package/dist/prompts/subagent-delegation.test.js +21 -0
- package/dist/prompts/subagent-delegation.test.js.map +1 -1
- package/dist/prompts/subagent-delegation.test.ts +26 -0
- package/dist/prompts/subagent-delegation.ts +17 -1
- package/dist/prompts/subagents/base-anthropic.md +3 -0
- package/dist/prompts/subagents/base-codex.md +3 -0
- package/dist/prompts/subagents/base-gpt-5-modern.md +3 -0
- package/dist/prompts/subagents/base-simple.md +3 -0
- package/dist/prompts/subagents/explorer.md +8 -10
- package/dist/prompts/subagents/researcher.md +2 -1
- package/dist/prompts/subagents/worker.md +12 -3
- package/dist/prompts/subagents/worktree-hygiene.md +6 -0
- package/dist/providers/ai-sdk-anthropic.provider.d.ts +4 -1
- package/dist/providers/ai-sdk-anthropic.provider.d.ts.map +1 -1
- package/dist/providers/ai-sdk-anthropic.provider.js +65 -22
- package/dist/providers/ai-sdk-anthropic.provider.js.map +1 -1
- package/dist/providers/ai-sdk-anthropic.provider.test.js +24 -1
- package/dist/providers/ai-sdk-anthropic.provider.test.js.map +1 -1
- package/dist/providers/anthropic-middleware.d.ts +25 -0
- package/dist/providers/anthropic-middleware.d.ts.map +1 -0
- package/dist/providers/anthropic-middleware.js +32 -0
- package/dist/providers/anthropic-middleware.js.map +1 -0
- package/dist/providers/anthropic-middleware.test.d.ts +2 -0
- package/dist/providers/anthropic-middleware.test.d.ts.map +1 -0
- package/dist/providers/anthropic-middleware.test.js +142 -0
- package/dist/providers/anthropic-middleware.test.js.map +1 -0
- package/dist/providers/codex-responses-model.d.ts.map +1 -1
- package/dist/providers/codex-responses-model.js +47 -30
- package/dist/providers/codex-responses-model.js.map +1 -1
- package/dist/providers/codex-responses-model.test.js +31 -0
- package/dist/providers/codex-responses-model.test.js.map +1 -1
- package/dist/providers/codex.provider.d.ts.map +1 -1
- package/dist/providers/codex.provider.js +16 -9
- package/dist/providers/codex.provider.js.map +1 -1
- package/dist/providers/codex.provider.test.js +2 -1
- package/dist/providers/codex.provider.test.js.map +1 -1
- package/dist/providers/custom-provider-adapter.test.js +6 -2
- package/dist/providers/custom-provider-adapter.test.js.map +1 -1
- package/dist/providers/fallback-responses-model.d.ts +3 -1
- package/dist/providers/fallback-responses-model.d.ts.map +1 -1
- package/dist/providers/fallback-responses-model.js +22 -3
- package/dist/providers/fallback-responses-model.js.map +1 -1
- package/dist/providers/fallback-responses-model.test.js +36 -8
- package/dist/providers/fallback-responses-model.test.js.map +1 -1
- package/dist/providers/fetch/composer.d.ts +1 -0
- package/dist/providers/fetch/composer.d.ts.map +1 -1
- package/dist/providers/fetch/composer.js +1 -0
- package/dist/providers/fetch/composer.js.map +1 -1
- package/dist/providers/fetch/composer.test.js +58 -17
- package/dist/providers/fetch/composer.test.js.map +1 -1
- package/dist/providers/fetch/logging-middleware.d.ts +3 -2
- package/dist/providers/fetch/logging-middleware.d.ts.map +1 -1
- package/dist/providers/fetch/logging-middleware.js +5 -2
- package/dist/providers/fetch/logging-middleware.js.map +1 -1
- package/dist/providers/openai-compatible-lazy.d.ts.map +1 -1
- package/dist/providers/openai-compatible-lazy.js +2 -1
- package/dist/providers/openai-compatible-lazy.js.map +1 -1
- package/dist/providers/openai-compatible-middleware.d.ts +5 -2
- package/dist/providers/openai-compatible-middleware.d.ts.map +1 -1
- package/dist/providers/openai-compatible-middleware.js +8 -11
- package/dist/providers/openai-compatible-middleware.js.map +1 -1
- package/dist/providers/openai-compatible.provider.d.ts +5 -1
- package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
- package/dist/providers/openai-compatible.provider.js +59 -37
- package/dist/providers/openai-compatible.provider.js.map +1 -1
- package/dist/providers/openai-compatible.provider.test.js +67 -3
- package/dist/providers/openai-compatible.provider.test.js.map +1 -1
- package/dist/providers/openai.provider.d.ts +8 -1
- package/dist/providers/openai.provider.d.ts.map +1 -1
- package/dist/providers/openai.provider.js +43 -10
- package/dist/providers/openai.provider.js.map +1 -1
- package/dist/providers/openai.provider.test.js +53 -16
- package/dist/providers/openai.provider.test.js.map +1 -1
- package/dist/providers/opencode-routing.d.ts +4 -0
- package/dist/providers/opencode-routing.d.ts.map +1 -0
- package/dist/providers/opencode-routing.js +14 -0
- package/dist/providers/opencode-routing.js.map +1 -0
- package/dist/providers/opencode-session.d.ts +19 -0
- package/dist/providers/opencode-session.d.ts.map +1 -0
- package/dist/providers/opencode-session.js +76 -0
- package/dist/providers/opencode-session.js.map +1 -0
- package/dist/providers/opencode.provider.d.ts +0 -8
- package/dist/providers/opencode.provider.d.ts.map +1 -1
- package/dist/providers/opencode.provider.js +0 -32
- package/dist/providers/opencode.provider.js.map +1 -1
- package/dist/providers/opencode.provider.test.d.ts +2 -0
- package/dist/providers/opencode.provider.test.d.ts.map +1 -0
- package/dist/providers/opencode.provider.test.js +186 -0
- package/dist/providers/opencode.provider.test.js.map +1 -0
- package/dist/providers/openrouter.provider.createRunner.test.js +5 -0
- package/dist/providers/openrouter.provider.createRunner.test.js.map +1 -1
- package/dist/providers/openrouter.provider.d.ts.map +1 -1
- package/dist/providers/openrouter.provider.js +8 -4
- package/dist/providers/openrouter.provider.js.map +1 -1
- package/dist/providers/registry.d.ts +3 -0
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/registry.test.js +1 -0
- package/dist/providers/registry.test.js.map +1 -1
- package/dist/scripts/eval-auto-approval/runner.js +4 -0
- package/dist/scripts/eval-auto-approval/runner.js.map +1 -1
- package/dist/services/conversation-integration.test.js +8 -4
- package/dist/services/conversation-integration.test.js.map +1 -1
- package/dist/services/conversation-persistence.test.js +7 -0
- package/dist/services/conversation-persistence.test.js.map +1 -1
- package/dist/services/conversation-replay.d.ts.map +1 -1
- package/dist/services/conversation-replay.js +95 -4
- package/dist/services/conversation-replay.js.map +1 -1
- package/dist/services/conversation-replay.test.js +312 -0
- package/dist/services/conversation-replay.test.js.map +1 -1
- package/dist/services/conversation-result-builder.test.js +9 -0
- package/dist/services/conversation-result-builder.test.js.map +1 -1
- package/dist/services/conversation-service.d.ts +3 -1
- package/dist/services/conversation-service.d.ts.map +1 -1
- package/dist/services/conversation-service.js +3 -0
- package/dist/services/conversation-service.js.map +1 -1
- package/dist/services/conversation-session-reasoning.test.js +5 -1
- package/dist/services/conversation-session-reasoning.test.js.map +1 -1
- package/dist/services/conversation-session.auto-approval.test.js +25 -1
- package/dist/services/conversation-session.auto-approval.test.js.map +1 -1
- package/dist/services/conversation-session.d.ts +7 -2
- package/dist/services/conversation-session.d.ts.map +1 -1
- package/dist/services/conversation-session.js +70 -45
- package/dist/services/conversation-session.js.map +1 -1
- package/dist/services/file-service.d.ts +20 -4
- package/dist/services/file-service.d.ts.map +1 -1
- package/dist/services/file-service.js +111 -52
- package/dist/services/file-service.js.map +1 -1
- package/dist/services/file-service.test.d.ts +2 -0
- package/dist/services/file-service.test.d.ts.map +1 -0
- package/dist/services/file-service.test.js +60 -0
- package/dist/services/file-service.test.js.map +1 -0
- package/dist/services/logging-service.d.ts +0 -3
- package/dist/services/logging-service.d.ts.map +1 -1
- package/dist/services/logging-service.js +12 -8
- package/dist/services/logging-service.js.map +1 -1
- package/dist/services/mode-notices.d.ts +4 -5
- package/dist/services/mode-notices.d.ts.map +1 -1
- package/dist/services/mode-notices.js +4 -5
- package/dist/services/mode-notices.js.map +1 -1
- package/dist/services/notification-service.d.ts +31 -11
- package/dist/services/notification-service.d.ts.map +1 -1
- package/dist/services/notification-service.js +88 -40
- package/dist/services/notification-service.js.map +1 -1
- package/dist/services/notification-service.test.js +135 -62
- package/dist/services/notification-service.test.js.map +1 -1
- package/dist/services/provider-traffic.d.ts +8 -9
- package/dist/services/provider-traffic.d.ts.map +1 -1
- package/dist/services/provider-traffic.js +24 -12
- package/dist/services/provider-traffic.js.map +1 -1
- package/dist/services/provider-traffic.test.js +51 -1
- package/dist/services/provider-traffic.test.js.map +1 -1
- package/dist/services/service-interfaces.d.ts +12 -16
- package/dist/services/service-interfaces.d.ts.map +1 -1
- package/dist/services/session-context-service.d.ts +8 -0
- package/dist/services/session-context-service.d.ts.map +1 -0
- package/dist/services/session-context-service.js +19 -0
- package/dist/services/session-context-service.js.map +1 -0
- package/dist/services/session-context-service.test.d.ts +2 -0
- package/dist/services/session-context-service.test.d.ts.map +1 -0
- package/dist/services/session-context-service.test.js +38 -0
- package/dist/services/session-context-service.test.js.map +1 -0
- package/dist/services/settings-env.d.ts.map +1 -1
- package/dist/services/settings-env.js +4 -1
- package/dist/services/settings-env.js.map +1 -1
- package/dist/services/settings-persistence.d.ts.map +1 -1
- package/dist/services/settings-persistence.js +0 -1
- package/dist/services/settings-persistence.js.map +1 -1
- package/dist/services/settings-persistence.test.js +2 -2
- package/dist/services/settings-persistence.test.js.map +1 -1
- package/dist/services/settings-schema.d.ts +9 -0
- package/dist/services/settings-schema.d.ts.map +1 -1
- package/dist/services/settings-schema.js +15 -4
- package/dist/services/settings-schema.js.map +1 -1
- package/dist/services/settings-service.d.ts +8 -0
- package/dist/services/settings-service.d.ts.map +1 -1
- package/dist/services/settings-service.js +58 -21
- package/dist/services/settings-service.js.map +1 -1
- package/dist/services/shell-auto-approval-evaluator.d.ts +3 -2
- package/dist/services/shell-auto-approval-evaluator.d.ts.map +1 -1
- package/dist/services/shell-auto-approval-evaluator.js +3 -3
- package/dist/services/shell-auto-approval-evaluator.js.map +1 -1
- package/dist/services/shell-auto-approval-evaluator.test.js +20 -0
- package/dist/services/shell-auto-approval-evaluator.test.js.map +1 -1
- package/dist/services/shell-auto-approval-resolver.d.ts +2 -1
- package/dist/services/shell-auto-approval-resolver.d.ts.map +1 -1
- package/dist/services/shell-auto-approval-resolver.js +2 -0
- package/dist/services/shell-auto-approval-resolver.js.map +1 -1
- package/dist/services/shell-auto-approval-resolver.test.js +10 -0
- package/dist/services/shell-auto-approval-resolver.test.js.map +1 -1
- package/dist/services/subagents/subagent-manager.d.ts +2 -1
- package/dist/services/subagents/subagent-manager.d.ts.map +1 -1
- package/dist/services/subagents/subagent-manager.js +182 -13
- package/dist/services/subagents/subagent-manager.js.map +1 -1
- package/dist/services/subagents/subagent-manager.test.js +548 -17
- package/dist/services/subagents/subagent-manager.test.js.map +1 -1
- package/dist/tools/apply-patch.d.ts.map +1 -1
- package/dist/tools/apply-patch.js +2 -2
- package/dist/tools/apply-patch.js.map +1 -1
- package/dist/tools/ask-user-constants.d.ts +7 -0
- package/dist/tools/ask-user-constants.d.ts.map +1 -0
- package/dist/tools/ask-user-constants.js +7 -0
- package/dist/tools/ask-user-constants.js.map +1 -0
- package/dist/tools/ask-user.d.ts +11 -0
- package/dist/tools/ask-user.d.ts.map +1 -0
- package/dist/tools/ask-user.js +56 -0
- package/dist/tools/ask-user.js.map +1 -0
- package/dist/tools/ask-user.test.d.ts +2 -0
- package/dist/tools/ask-user.test.d.ts.map +1 -0
- package/dist/tools/ask-user.test.js +129 -0
- package/dist/tools/ask-user.test.js.map +1 -0
- package/dist/tools/format-helpers.d.ts +13 -0
- package/dist/tools/format-helpers.d.ts.map +1 -1
- package/dist/tools/format-helpers.js +34 -0
- package/dist/tools/format-helpers.js.map +1 -1
- package/dist/tools/format-helpers.test.d.ts +2 -0
- package/dist/tools/format-helpers.test.d.ts.map +1 -0
- package/dist/tools/format-helpers.test.js +51 -0
- package/dist/tools/format-helpers.test.js.map +1 -0
- package/dist/tools/search-replace.d.ts.map +1 -1
- package/dist/tools/search-replace.js +2 -2
- package/dist/tools/search-replace.js.map +1 -1
- package/dist/tools/tool-names.d.ts +1 -0
- package/dist/tools/tool-names.d.ts.map +1 -1
- package/dist/tools/tool-names.js +1 -0
- package/dist/tools/tool-names.js.map +1 -1
- package/dist/utils/command-safety/_scratch-classify.test.d.ts +2 -0
- package/dist/utils/command-safety/_scratch-classify.test.d.ts.map +1 -0
- package/dist/utils/command-safety/_scratch-classify.test.js +22 -0
- package/dist/utils/command-safety/_scratch-classify.test.js.map +1 -0
- package/dist/utils/command-safety/constants.d.ts.map +1 -1
- package/dist/utils/command-safety/constants.js +21 -0
- package/dist/utils/command-safety/constants.js.map +1 -1
- package/dist/utils/command-safety/handlers/git-handler.d.ts.map +1 -1
- package/dist/utils/command-safety/handlers/git-handler.js +28 -2
- package/dist/utils/command-safety/handlers/git-handler.js.map +1 -1
- package/dist/utils/command-safety/path-analysis.d.ts.map +1 -1
- package/dist/utils/command-safety/path-analysis.js +6 -0
- package/dist/utils/command-safety/path-analysis.js.map +1 -1
- package/dist/utils/command-safety/scratch-classify.test.d.ts +2 -0
- package/dist/utils/command-safety/scratch-classify.test.d.ts.map +1 -0
- package/dist/utils/command-safety/scratch-classify.test.js +22 -0
- package/dist/utils/command-safety/scratch-classify.test.js.map +1 -0
- package/dist/utils/command-safety/scratch-tally.test.d.ts +2 -0
- package/dist/utils/command-safety/scratch-tally.test.d.ts.map +1 -0
- package/dist/utils/command-safety/scratch-tally.test.js +68 -0
- package/dist/utils/command-safety/scratch-tally.test.js.map +1 -0
- package/dist/utils/command-safety.evaluator-false-positives.test.d.ts +2 -0
- package/dist/utils/command-safety.evaluator-false-positives.test.d.ts.map +1 -0
- package/dist/utils/command-safety.evaluator-false-positives.test.js +72 -0
- package/dist/utils/command-safety.evaluator-false-positives.test.js.map +1 -0
- package/dist/utils/header-sanitizer.d.ts +2 -0
- package/dist/utils/header-sanitizer.d.ts.map +1 -0
- package/dist/utils/header-sanitizer.js +38 -0
- package/dist/utils/header-sanitizer.js.map +1 -0
- package/dist/utils/header-sanitizer.test.d.ts +2 -0
- package/dist/utils/header-sanitizer.test.d.ts.map +1 -0
- package/dist/utils/header-sanitizer.test.js +56 -0
- package/dist/utils/header-sanitizer.test.js.map +1 -0
- package/dist/utils/home-directory-start-guard.d.ts +10 -0
- package/dist/utils/home-directory-start-guard.d.ts.map +1 -0
- package/dist/utils/home-directory-start-guard.js +20 -0
- package/dist/utils/home-directory-start-guard.js.map +1 -0
- package/dist/utils/home-directory-start-guard.test.d.ts +2 -0
- package/dist/utils/home-directory-start-guard.test.d.ts.map +1 -0
- package/dist/utils/home-directory-start-guard.test.js +40 -0
- package/dist/utils/home-directory-start-guard.test.js.map +1 -0
- package/dist/utils/inject-warning-into-tool-output.d.ts +2 -0
- package/dist/utils/inject-warning-into-tool-output.d.ts.map +1 -0
- package/dist/utils/inject-warning-into-tool-output.js +66 -0
- package/dist/utils/inject-warning-into-tool-output.js.map +1 -0
- package/dist/utils/provider-traffic-extractor.d.ts +1 -0
- package/dist/utils/provider-traffic-extractor.d.ts.map +1 -1
- package/dist/utils/provider-traffic-extractor.js +1 -0
- package/dist/utils/provider-traffic-extractor.js.map +1 -1
- package/dist/utils/provider-traffic-extractor.test.js +2 -0
- package/dist/utils/provider-traffic-extractor.test.js.map +1 -1
- package/dist/utils/token-usage.d.ts +3 -1
- package/dist/utils/token-usage.d.ts.map +1 -1
- package/dist/utils/token-usage.js +7 -2
- package/dist/utils/token-usage.js.map +1 -1
- package/dist/utils/token-usage.test.js +15 -0
- package/dist/utils/token-usage.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,22 +1,59 @@
|
|
|
1
1
|
import test from 'ava';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const calls = [];
|
|
8
|
-
const fakeFetch = async (url, options) => {
|
|
9
|
-
calls.push({ url, options });
|
|
2
|
+
import { OpenAIResponsesModel, OpenAIResponsesWSModel } from '@openai/agents-openai';
|
|
3
|
+
import { OpenAIResponsesModelWithPromptCacheKey, TimedOpenAIResponsesWSModel } from './openai.provider.js';
|
|
4
|
+
test.serial('OpenAIResponsesModelWithPromptCacheKey forwards prompt_cache_key from modelSettings', (t) => {
|
|
5
|
+
const original = OpenAIResponsesModel.prototype._buildResponsesCreateRequest;
|
|
6
|
+
OpenAIResponsesModel.prototype._buildResponsesCreateRequest = function () {
|
|
10
7
|
return {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
8
|
+
requestData: {
|
|
9
|
+
include: [],
|
|
10
|
+
temperature: 0.4,
|
|
11
|
+
},
|
|
12
|
+
sdkRequestHeaders: {},
|
|
13
|
+
signal: undefined,
|
|
15
14
|
};
|
|
16
15
|
};
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
try {
|
|
17
|
+
const model = new OpenAIResponsesModelWithPromptCacheKey({}, 'gpt-4o');
|
|
18
|
+
const built = model._buildResponsesCreateRequest({
|
|
19
|
+
modelSettings: {
|
|
20
|
+
prompt_cache_key: 'conv_123',
|
|
21
|
+
},
|
|
22
|
+
}, true);
|
|
23
|
+
t.is(built.requestData.prompt_cache_key, 'conv_123');
|
|
24
|
+
t.is(built.requestData.temperature, 0.4);
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
OpenAIResponsesModel.prototype._buildResponsesCreateRequest = original;
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
test.serial('TimedOpenAIResponsesWSModel forwards prompt_cache_key from modelSettings', (t) => {
|
|
31
|
+
const original = OpenAIResponsesWSModel.prototype._buildResponsesCreateRequest;
|
|
32
|
+
OpenAIResponsesWSModel.prototype._buildResponsesCreateRequest = function () {
|
|
33
|
+
return {
|
|
34
|
+
requestData: {
|
|
35
|
+
include: [],
|
|
36
|
+
temperature: 0.4,
|
|
37
|
+
},
|
|
38
|
+
sdkRequestHeaders: {},
|
|
39
|
+
signal: undefined,
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
try {
|
|
43
|
+
const model = new TimedOpenAIResponsesWSModel({}, 'gpt-4o', {
|
|
44
|
+
connectTimeoutMs: 1,
|
|
45
|
+
idleTimeoutMs: 1,
|
|
46
|
+
});
|
|
47
|
+
const built = model._buildResponsesCreateRequest({
|
|
48
|
+
modelSettings: {
|
|
49
|
+
prompt_cache_key: 'conv_456',
|
|
50
|
+
},
|
|
51
|
+
}, true);
|
|
52
|
+
t.is(built.requestData.prompt_cache_key, 'conv_456');
|
|
53
|
+
t.is(built.requestData.temperature, 0.4);
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
OpenAIResponsesWSModel.prototype._buildResponsesCreateRequest = original;
|
|
57
|
+
}
|
|
21
58
|
});
|
|
22
59
|
//# sourceMappingURL=openai.provider.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.provider.test.js","sourceRoot":"","sources":["../../source/providers/openai.provider.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"openai.provider.test.js","sourceRoot":"","sources":["../../source/providers/openai.provider.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,sCAAsC,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAE3G,IAAI,CAAC,MAAM,CAAC,qFAAqF,EAAE,CAAC,CAAC,EAAE,EAAE;IACvG,MAAM,QAAQ,GAAI,oBAAoB,CAAC,SAAiB,CAAC,4BAA4B,CAAC;IACrF,oBAAoB,CAAC,SAAiB,CAAC,4BAA4B,GAAG;QACrE,OAAO;YACL,WAAW,EAAE;gBACX,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,GAAG;aACjB;YACD,iBAAiB,EAAE,EAAE;YACrB,MAAM,EAAE,SAAS;SAClB,CAAC;IACJ,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,sCAAsC,CAAC,EAAS,EAAE,QAAQ,CAAC,CAAC;QAC9E,MAAM,KAAK,GAAI,KAAa,CAAC,4BAA4B,CACvD;YACE,aAAa,EAAE;gBACb,gBAAgB,EAAE,UAAU;aAC7B;SACF,EACD,IAAI,CACL,CAAC;QAEF,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC;YAAS,CAAC;QACR,oBAAoB,CAAC,SAAiB,CAAC,4BAA4B,GAAG,QAAQ,CAAC;IAClF,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,0EAA0E,EAAE,CAAC,CAAC,EAAE,EAAE;IAC5F,MAAM,QAAQ,GAAI,sBAAsB,CAAC,SAAiB,CAAC,4BAA4B,CAAC;IACvF,sBAAsB,CAAC,SAAiB,CAAC,4BAA4B,GAAG;QACvE,OAAO;YACL,WAAW,EAAE;gBACX,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,GAAG;aACjB;YACD,iBAAiB,EAAE,EAAE;YACrB,MAAM,EAAE,SAAS;SAClB,CAAC;IACJ,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,2BAA2B,CAAC,EAAS,EAAE,QAAQ,EAAE;YACjE,gBAAgB,EAAE,CAAC;YACnB,aAAa,EAAE,CAAC;SACjB,CAAC,CAAC;QACH,MAAM,KAAK,GAAI,KAAa,CAAC,4BAA4B,CACvD;YACE,aAAa,EAAE;gBACb,gBAAgB,EAAE,UAAU;aAC7B;SACF,EACD,IAAI,CACL,CAAC;QAEF,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC;YAAS,CAAC;QACR,sBAAsB,CAAC,SAAiB,CAAC,4BAA4B,GAAG,QAAQ,CAAC;IACpF,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type OpencodeModelTransport = 'anthropic-messages' | 'openai-chat-completions';
|
|
2
|
+
export declare function selectOpencodeModelTransport(modelId: string): OpencodeModelTransport;
|
|
3
|
+
export declare function shouldApplyOpencodeAnthropicPromptCaching(modelId: string): boolean;
|
|
4
|
+
//# sourceMappingURL=opencode-routing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-routing.d.ts","sourceRoot":"","sources":["../../source/providers/opencode-routing.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,sBAAsB,GAAG,oBAAoB,GAAG,yBAAyB,CAAC;AAItF,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB,CAKpF;AAED,wBAAgB,yCAAyC,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAOlF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const ANTHROPIC_FORMAT_MODEL_FRAGMENTS = ['minimax', 'qwen'];
|
|
2
|
+
export function selectOpencodeModelTransport(modelId) {
|
|
3
|
+
const normalizedModelId = modelId.toLowerCase();
|
|
4
|
+
return ANTHROPIC_FORMAT_MODEL_FRAGMENTS.some((fragment) => normalizedModelId.includes(fragment))
|
|
5
|
+
? 'anthropic-messages'
|
|
6
|
+
: 'openai-chat-completions';
|
|
7
|
+
}
|
|
8
|
+
export function shouldApplyOpencodeAnthropicPromptCaching(modelId) {
|
|
9
|
+
const normalizedModelId = modelId.toLowerCase();
|
|
10
|
+
return (normalizedModelId.includes('anthropic') ||
|
|
11
|
+
normalizedModelId.includes('claude') ||
|
|
12
|
+
normalizedModelId.includes('qwen'));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=opencode-routing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-routing.js","sourceRoot":"","sources":["../../source/providers/opencode-routing.ts"],"names":[],"mappings":"AAEA,MAAM,gCAAgC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAE7D,MAAM,UAAU,4BAA4B,CAAC,OAAe;IAC1D,MAAM,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAChD,OAAO,gCAAgC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9F,CAAC,CAAC,oBAAoB;QACtB,CAAC,CAAC,yBAAyB,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,yCAAyC,CAAC,OAAe;IACvE,MAAM,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAChD,OAAO,CACL,iBAAiB,CAAC,QAAQ,CAAC,WAAW,CAAC;QACvC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACpC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,CACnC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ISessionContextService } from '../services/service-interfaces.js';
|
|
2
|
+
import { type OpencodeProviderIdentity } from './opencode.provider.js';
|
|
3
|
+
/**
|
|
4
|
+
* Generates a session ID in the format `ses_<12_hex_timestamp><14_base62_random>`.
|
|
5
|
+
* Total length: 30 characters.
|
|
6
|
+
*/
|
|
7
|
+
export declare function generateOpencodeSessionId(effectiveSessionId?: string): string;
|
|
8
|
+
export declare function resolveOpencodeSessionId(options: {
|
|
9
|
+
sessionContextService?: ISessionContextService;
|
|
10
|
+
fallbackSessionId?: string;
|
|
11
|
+
fallbackSessionIdOverride?: string;
|
|
12
|
+
}): string | undefined;
|
|
13
|
+
export declare function withOpencodeSessionHeader(init: RequestInit, sessionId: string): RequestInit;
|
|
14
|
+
export type OpencodeSessionInjector = (init: RequestInit) => RequestInit | null;
|
|
15
|
+
export declare function createOpencodeSessionInjector(identity: OpencodeProviderIdentity, options?: {
|
|
16
|
+
sessionContextService?: ISessionContextService;
|
|
17
|
+
fallbackSessionIdOverride?: string;
|
|
18
|
+
}): OpencodeSessionInjector | null;
|
|
19
|
+
//# sourceMappingURL=opencode-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-session.d.ts","sourceRoot":"","sources":["../../source/providers/opencode-session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAEhF,OAAO,EAAsB,KAAK,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAI3F;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,MAAM,CAkC7E;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,qBAAqB,CAAC,EAAE,sBAAsB,CAAC;IAC/C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACpC,GAAG,MAAM,GAAG,SAAS,CAWrB;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,CAO3F;AAED,MAAM,MAAM,uBAAuB,GAAG,CAAC,IAAI,EAAE,WAAW,KAAK,WAAW,GAAG,IAAI,CAAC;AAEhF,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,wBAAwB,EAClC,OAAO,CAAC,EAAE;IACR,qBAAqB,CAAC,EAAE,sBAAsB,CAAC;IAC/C,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACpC,GACA,uBAAuB,GAAG,IAAI,CAchC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { randomBytes } from 'node:crypto';
|
|
2
|
+
import { injectHeaders } from './fetch/logging-middleware.js';
|
|
3
|
+
import { isOpencodeProvider } from './opencode.provider.js';
|
|
4
|
+
const BASE62_ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
5
|
+
/**
|
|
6
|
+
* Generates a session ID in the format `ses_<12_hex_timestamp><14_base62_random>`.
|
|
7
|
+
* Total length: 30 characters.
|
|
8
|
+
*/
|
|
9
|
+
export function generateOpencodeSessionId(effectiveSessionId) {
|
|
10
|
+
if (effectiveSessionId) {
|
|
11
|
+
const hexPool = '0123456789abcdef';
|
|
12
|
+
let seed = 0;
|
|
13
|
+
for (let i = 0; i < effectiveSessionId.length; i++) {
|
|
14
|
+
seed = (seed * 31 + effectiveSessionId.charCodeAt(i)) | 0;
|
|
15
|
+
}
|
|
16
|
+
let state = Math.abs(seed);
|
|
17
|
+
const nextRand = () => {
|
|
18
|
+
state = (state * 1103515245 + 12345) & 0x7fffffff;
|
|
19
|
+
return state;
|
|
20
|
+
};
|
|
21
|
+
let result = '';
|
|
22
|
+
for (let i = 0; i < 12; i++) {
|
|
23
|
+
result += hexPool[nextRand() % 16];
|
|
24
|
+
}
|
|
25
|
+
for (let i = 0; i < 14; i++) {
|
|
26
|
+
result += BASE62_ALPHABET[nextRand() % 62];
|
|
27
|
+
}
|
|
28
|
+
return `ses_${result}`;
|
|
29
|
+
}
|
|
30
|
+
const timestamp = Date.now().toString(16).padStart(12, '0').slice(0, 12);
|
|
31
|
+
const bytes = randomBytes(11);
|
|
32
|
+
let value = 0n;
|
|
33
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
34
|
+
value = (value << 8n) + BigInt(bytes[i]);
|
|
35
|
+
}
|
|
36
|
+
let random = '';
|
|
37
|
+
for (let i = 0; i < 14; i++) {
|
|
38
|
+
random += BASE62_ALPHABET[Number(value % 62n)];
|
|
39
|
+
value /= 62n;
|
|
40
|
+
}
|
|
41
|
+
return `ses_${timestamp}${random}`;
|
|
42
|
+
}
|
|
43
|
+
export function resolveOpencodeSessionId(options) {
|
|
44
|
+
if (options.fallbackSessionIdOverride) {
|
|
45
|
+
return options.fallbackSessionIdOverride;
|
|
46
|
+
}
|
|
47
|
+
const trafficSessionId = options.sessionContextService?.getContext()?.sessionId;
|
|
48
|
+
if (trafficSessionId) {
|
|
49
|
+
return generateOpencodeSessionId(trafficSessionId);
|
|
50
|
+
}
|
|
51
|
+
return options.fallbackSessionId;
|
|
52
|
+
}
|
|
53
|
+
export function withOpencodeSessionHeader(init, sessionId) {
|
|
54
|
+
return {
|
|
55
|
+
...init,
|
|
56
|
+
headers: injectHeaders(init.headers, {
|
|
57
|
+
'x-opencode-session': sessionId,
|
|
58
|
+
}),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export function createOpencodeSessionInjector(identity, options) {
|
|
62
|
+
if (!isOpencodeProvider(identity))
|
|
63
|
+
return null;
|
|
64
|
+
const fallbackSessionId = generateOpencodeSessionId();
|
|
65
|
+
return (init) => {
|
|
66
|
+
const sessionId = resolveOpencodeSessionId({
|
|
67
|
+
sessionContextService: options?.sessionContextService,
|
|
68
|
+
fallbackSessionId,
|
|
69
|
+
fallbackSessionIdOverride: options?.fallbackSessionIdOverride,
|
|
70
|
+
});
|
|
71
|
+
if (!sessionId)
|
|
72
|
+
return null;
|
|
73
|
+
return withOpencodeSessionHeader(init, sessionId);
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=opencode-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-session.js","sourceRoot":"","sources":["../../source/providers/opencode-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,9 @@
|
|
|
1
|
-
import type { ILoggingService } from '../services/service-interfaces.js';
|
|
2
1
|
export type OpencodeProviderIdentity = {
|
|
3
2
|
type?: string;
|
|
4
3
|
name?: string;
|
|
5
4
|
baseUrl?: string;
|
|
6
5
|
};
|
|
7
6
|
export declare function isOpencodeProvider(identity: OpencodeProviderIdentity): boolean;
|
|
8
|
-
/**
|
|
9
|
-
* Generates a session ID in the format `ses_<12_hex_timestamp><14_base62_random>`.
|
|
10
|
-
* Total length: 30 characters.
|
|
11
|
-
*/
|
|
12
|
-
export declare function generateOpencodeSessionId(): string;
|
|
13
|
-
export declare function resolveOpencodeSessionId(loggingService?: ILoggingService, fallbackSessionId?: string): string | undefined;
|
|
14
|
-
export declare function withOpencodeSessionHeader(init: RequestInit, sessionId: string): RequestInit;
|
|
15
7
|
export declare function resolveOpencodeRuntimeConfig(baseUrl?: string, apiKey?: string): {
|
|
16
8
|
baseUrl: string;
|
|
17
9
|
apiKey: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode.provider.d.ts","sourceRoot":"","sources":["../../source/providers/opencode.provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"opencode.provider.d.ts","sourceRoot":"","sources":["../../source/providers/opencode.provider.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,wBAAwB,GAAG,OAAO,CAM9E;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,GACd;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B,CAKA"}
|
|
@@ -1,41 +1,9 @@
|
|
|
1
|
-
import { randomBytes } from 'node:crypto';
|
|
2
|
-
import { injectHeaders } from './fetch/logging-middleware.js';
|
|
3
|
-
const BASE62_ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
4
1
|
const OPENCODE_HOST_FRAGMENT = 'opencode.ai';
|
|
5
2
|
export function isOpencodeProvider(identity) {
|
|
6
3
|
return (identity.type === 'opencode' ||
|
|
7
4
|
identity.name === 'opencode' ||
|
|
8
5
|
(typeof identity.baseUrl === 'string' && identity.baseUrl.toLowerCase().includes(OPENCODE_HOST_FRAGMENT)));
|
|
9
6
|
}
|
|
10
|
-
/**
|
|
11
|
-
* Generates a session ID in the format `ses_<12_hex_timestamp><14_base62_random>`.
|
|
12
|
-
* Total length: 30 characters.
|
|
13
|
-
*/
|
|
14
|
-
export function generateOpencodeSessionId() {
|
|
15
|
-
const timestamp = Date.now().toString(16).padStart(12, '0').slice(0, 12);
|
|
16
|
-
const bytes = randomBytes(11);
|
|
17
|
-
let value = 0n;
|
|
18
|
-
for (let i = 0; i < bytes.length; i++) {
|
|
19
|
-
value = (value << 8n) + BigInt(bytes[i]);
|
|
20
|
-
}
|
|
21
|
-
let random = '';
|
|
22
|
-
for (let i = 0; i < 14; i++) {
|
|
23
|
-
random += BASE62_ALPHABET[Number(value % 62n)];
|
|
24
|
-
value /= 62n;
|
|
25
|
-
}
|
|
26
|
-
return `ses_${timestamp}${random}`;
|
|
27
|
-
}
|
|
28
|
-
export function resolveOpencodeSessionId(loggingService, fallbackSessionId) {
|
|
29
|
-
return fallbackSessionId || loggingService?.getTrafficContext?.()?.sessionId;
|
|
30
|
-
}
|
|
31
|
-
export function withOpencodeSessionHeader(init, sessionId) {
|
|
32
|
-
return {
|
|
33
|
-
...init,
|
|
34
|
-
headers: injectHeaders(init.headers, {
|
|
35
|
-
'x-opencode-session': sessionId,
|
|
36
|
-
}),
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
7
|
export function resolveOpencodeRuntimeConfig(baseUrl, apiKey) {
|
|
40
8
|
return {
|
|
41
9
|
baseUrl: baseUrl ?? 'https://opencode.ai/v1',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode.provider.js","sourceRoot":"","sources":["../../source/providers/opencode.provider.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"opencode.provider.js","sourceRoot":"","sources":["../../source/providers/opencode.provider.ts"],"names":[],"mappings":"AAAA,MAAM,sBAAsB,GAAG,aAAa,CAAC;AAQ7C,MAAM,UAAU,kBAAkB,CAAC,QAAkC;IACnE,OAAO,CACL,QAAQ,CAAC,IAAI,KAAK,UAAU;QAC5B,QAAQ,CAAC,IAAI,KAAK,UAAU;QAC5B,CAAC,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAC1G,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,OAAgB,EAChB,MAAe;IAKf,OAAO;QACL,OAAO,EAAE,OAAO,IAAI,wBAAwB;QAC5C,MAAM,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB;KAC/C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.provider.test.d.ts","sourceRoot":"","sources":["../../source/providers/opencode.provider.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { isOpencodeProvider } from './opencode.provider.js';
|
|
3
|
+
import { createOpencodeSessionInjector, generateOpencodeSessionId } from './opencode-session.js';
|
|
4
|
+
import { selectOpencodeModelTransport, shouldApplyOpencodeAnthropicPromptCaching } from './opencode-routing.js';
|
|
5
|
+
const makeSessionContextService = (sessionId) => ({
|
|
6
|
+
runWithContext: (_context, fn) => fn(),
|
|
7
|
+
getContext: () => (sessionId ? { sessionId, sessionStartedAt: '2026-01-01T00:00:00.000Z' } : null),
|
|
8
|
+
});
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// createOpencodeSessionInjector
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
test('createOpencodeSessionInjector returns null for non-opencode provider', (t) => {
|
|
13
|
+
const injector = createOpencodeSessionInjector({ type: 'anthropic', baseUrl: 'https://api.anthropic.com' });
|
|
14
|
+
t.is(injector, null);
|
|
15
|
+
});
|
|
16
|
+
test('createOpencodeSessionInjector returns injector for opencode type', (t) => {
|
|
17
|
+
const injector = createOpencodeSessionInjector({ type: 'opencode' });
|
|
18
|
+
t.not(injector, null);
|
|
19
|
+
});
|
|
20
|
+
test('createOpencodeSessionInjector returns injector when baseUrl contains opencode.ai', (t) => {
|
|
21
|
+
const injector = createOpencodeSessionInjector({ type: 'anthropic', baseUrl: 'https://opencode.ai/v1' });
|
|
22
|
+
t.not(injector, null);
|
|
23
|
+
});
|
|
24
|
+
test('createOpencodeSessionInjector returns injector when baseUrl contains OPENCODE.AI case-insensitively', (t) => {
|
|
25
|
+
const injector = createOpencodeSessionInjector({ type: 'anthropic', baseUrl: 'https://OPENCODE.AI/v1' });
|
|
26
|
+
t.not(injector, null);
|
|
27
|
+
});
|
|
28
|
+
test('createOpencodeSessionInjector returns injector when name is opencode', (t) => {
|
|
29
|
+
const injector = createOpencodeSessionInjector({ name: 'opencode' });
|
|
30
|
+
t.not(injector, null);
|
|
31
|
+
});
|
|
32
|
+
test('createOpencodeSessionInjector injects x-opencode-session header', (t) => {
|
|
33
|
+
const injector = createOpencodeSessionInjector({ type: 'opencode' });
|
|
34
|
+
const result = injector({ headers: { 'Content-Type': 'application/json' } });
|
|
35
|
+
t.not(result, null);
|
|
36
|
+
t.truthy(result?.headers);
|
|
37
|
+
// Find x-opencode-session in the headers
|
|
38
|
+
const rawHeaders = result.headers;
|
|
39
|
+
const keys = Object.keys(rawHeaders);
|
|
40
|
+
const sessionHeader = keys.find((k) => k.toLowerCase() === 'x-opencode-session');
|
|
41
|
+
t.truthy(sessionHeader, 'should have x-opencode-session header');
|
|
42
|
+
t.regex(rawHeaders[sessionHeader], /^ses_[0-9a-f]{12}[0-9a-zA-Z]{14}$/);
|
|
43
|
+
});
|
|
44
|
+
test('createOpencodeSessionInjector session ID is stable across multiple calls', (t) => {
|
|
45
|
+
const injector = createOpencodeSessionInjector({ type: 'opencode' });
|
|
46
|
+
const first = injector({});
|
|
47
|
+
const second = injector({});
|
|
48
|
+
const getHeader = (r) => {
|
|
49
|
+
const h = r.headers;
|
|
50
|
+
return Object.values(h).find((v) => v.startsWith('ses_'));
|
|
51
|
+
};
|
|
52
|
+
t.is(getHeader(first), getHeader(second), 'session ID should be stable');
|
|
53
|
+
});
|
|
54
|
+
test('createOpencodeSessionInjector preserves existing headers', (t) => {
|
|
55
|
+
const injector = createOpencodeSessionInjector({ type: 'opencode' });
|
|
56
|
+
const result = injector({
|
|
57
|
+
headers: { 'anthropic-version': '2023-06-01', 'x-api-key': 'sk-test' },
|
|
58
|
+
});
|
|
59
|
+
const h = result.headers;
|
|
60
|
+
t.is(h['anthropic-version'], '2023-06-01');
|
|
61
|
+
t.is(h['x-api-key'], 'sk-test');
|
|
62
|
+
t.truthy(Object.keys(h).find((k) => k.toLowerCase() === 'x-opencode-session'));
|
|
63
|
+
});
|
|
64
|
+
test('createOpencodeSessionInjector uses fallbackSessionIdOverride when provided', (t) => {
|
|
65
|
+
const injector = createOpencodeSessionInjector({ type: 'opencode' }, { fallbackSessionIdOverride: 'ses_123456789012abcABC0abcABC0ab' });
|
|
66
|
+
const result = injector({});
|
|
67
|
+
const h = result.headers;
|
|
68
|
+
const sessionKey = Object.keys(h).find((k) => k.toLowerCase() === 'x-opencode-session');
|
|
69
|
+
t.is(h[sessionKey], 'ses_123456789012abcABC0abcABC0ab');
|
|
70
|
+
});
|
|
71
|
+
test('createOpencodeSessionInjector generated fallback takes precedence over traffic context session ID', (t) => {
|
|
72
|
+
const injector = createOpencodeSessionInjector({ type: 'opencode' }, { sessionContextService: makeSessionContextService('conversation-session-abc') });
|
|
73
|
+
const result = injector({});
|
|
74
|
+
const h = result.headers;
|
|
75
|
+
const sessionKey = Object.keys(h).find((k) => k.toLowerCase() === 'x-opencode-session');
|
|
76
|
+
// The injector always generates a fresh fallback ID for opencode providers,
|
|
77
|
+
// so we should get a generated ses_* ID, not the traffic context one.
|
|
78
|
+
t.not(h[sessionKey], 'conversation-session-abc');
|
|
79
|
+
t.regex(h[sessionKey], /^ses_/);
|
|
80
|
+
});
|
|
81
|
+
test('createOpencodeSessionInjector generated ID is stable for same traffic context sessionId', (t) => {
|
|
82
|
+
let trafficSessionId = 'stable-session-id';
|
|
83
|
+
const sessionContextService = {
|
|
84
|
+
runWithContext: (_context, fn) => fn(),
|
|
85
|
+
getContext: () => ({
|
|
86
|
+
sessionId: trafficSessionId,
|
|
87
|
+
sessionStartedAt: '2026-01-01T00:00:00.000Z',
|
|
88
|
+
}),
|
|
89
|
+
};
|
|
90
|
+
const injector1 = createOpencodeSessionInjector({ type: 'opencode' }, { sessionContextService });
|
|
91
|
+
const injector2 = createOpencodeSessionInjector({ type: 'opencode' }, { sessionContextService });
|
|
92
|
+
const h1 = injector1({}).headers;
|
|
93
|
+
const h2 = injector2({}).headers;
|
|
94
|
+
const key1 = Object.keys(h1).find((k) => k.toLowerCase() === 'x-opencode-session');
|
|
95
|
+
const key2 = Object.keys(h2).find((k) => k.toLowerCase() === 'x-opencode-session');
|
|
96
|
+
t.is(h1[key1], h2[key2], 'Session IDs generated for the same traffic context sessionId should be equal');
|
|
97
|
+
// Change trafficSessionId
|
|
98
|
+
trafficSessionId = 'different-session-id';
|
|
99
|
+
const h3 = injector1({}).headers;
|
|
100
|
+
const key3 = Object.keys(h3).find((k) => k.toLowerCase() === 'x-opencode-session');
|
|
101
|
+
t.not(h1[key1], h3[key3], 'Session IDs for different traffic context sessionIds should be different');
|
|
102
|
+
});
|
|
103
|
+
test('createOpencodeSessionInjector fallbackSessionIdOverride takes precedence over traffic context', (t) => {
|
|
104
|
+
const injector = createOpencodeSessionInjector({ type: 'opencode' }, {
|
|
105
|
+
sessionContextService: makeSessionContextService('conversation-session-abc'),
|
|
106
|
+
fallbackSessionIdOverride: 'ses_overridden1234567890123456',
|
|
107
|
+
});
|
|
108
|
+
const result = injector({});
|
|
109
|
+
const h = result.headers;
|
|
110
|
+
const sessionKey = Object.keys(h).find((k) => k.toLowerCase() === 'x-opencode-session');
|
|
111
|
+
t.is(h[sessionKey], 'ses_overridden1234567890123456');
|
|
112
|
+
});
|
|
113
|
+
test('createOpencodeSessionInjector preserves existing body and other init fields', (t) => {
|
|
114
|
+
const injector = createOpencodeSessionInjector({ type: 'opencode' });
|
|
115
|
+
const result = injector({
|
|
116
|
+
method: 'POST',
|
|
117
|
+
body: JSON.stringify({ model: 'claude-sonnet-4-5', messages: [] }),
|
|
118
|
+
headers: { 'content-type': 'application/json' },
|
|
119
|
+
});
|
|
120
|
+
t.is(result?.method, 'POST');
|
|
121
|
+
t.is(result?.body, JSON.stringify({ model: 'claude-sonnet-4-5', messages: [] }));
|
|
122
|
+
});
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
// generateOpencodeSessionId
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
test('generateOpencodeSessionId produces a 30-char session ID', (t) => {
|
|
127
|
+
const id = generateOpencodeSessionId();
|
|
128
|
+
t.regex(id, /^ses_[0-9a-f]{12}[0-9a-zA-Z]{14}$/);
|
|
129
|
+
t.is(id.length, 30);
|
|
130
|
+
});
|
|
131
|
+
test('generateOpencodeSessionId produces unique values', (t) => {
|
|
132
|
+
const ids = new Set(Array.from({ length: 100 }, () => generateOpencodeSessionId()));
|
|
133
|
+
t.is(ids.size, 100);
|
|
134
|
+
});
|
|
135
|
+
test('generateOpencodeSessionId is deterministic for same effectiveSessionId', (t) => {
|
|
136
|
+
const id1 = generateOpencodeSessionId('session-123');
|
|
137
|
+
const id2 = generateOpencodeSessionId('session-123');
|
|
138
|
+
t.is(id1, id2);
|
|
139
|
+
});
|
|
140
|
+
test('generateOpencodeSessionId is different for different effectiveSessionIds', (t) => {
|
|
141
|
+
const id1 = generateOpencodeSessionId('session-123');
|
|
142
|
+
const id2 = generateOpencodeSessionId('session-456');
|
|
143
|
+
t.not(id1, id2);
|
|
144
|
+
});
|
|
145
|
+
test('generateOpencodeSessionId matches length and character pools for deterministic generation', (t) => {
|
|
146
|
+
const id = generateOpencodeSessionId('some-test-session-id-with-long-length-and-special-chars-!@#');
|
|
147
|
+
t.regex(id, /^ses_[0-9a-f]{12}[0-9a-zA-Z]{14}$/);
|
|
148
|
+
t.is(id.length, 30);
|
|
149
|
+
});
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
// isOpencodeProvider
|
|
152
|
+
// ---------------------------------------------------------------------------
|
|
153
|
+
test('isOpencodeProvider detects opencode type', (t) => {
|
|
154
|
+
t.true(isOpencodeProvider({ type: 'opencode' }));
|
|
155
|
+
});
|
|
156
|
+
test('isOpencodeProvider detects opencode name', (t) => {
|
|
157
|
+
t.true(isOpencodeProvider({ name: 'opencode' }));
|
|
158
|
+
});
|
|
159
|
+
test('isOpencodeProvider detects opencode.ai in baseUrl', (t) => {
|
|
160
|
+
t.true(isOpencodeProvider({ baseUrl: 'https://opencode.ai/v1' }));
|
|
161
|
+
});
|
|
162
|
+
test('isOpencodeProvider detects OPENCODE.AI case-insensitively', (t) => {
|
|
163
|
+
t.true(isOpencodeProvider({ baseUrl: 'https://OPENCODE.AI/v1' }));
|
|
164
|
+
});
|
|
165
|
+
test('isOpencodeProvider returns false for non-opencode providers', (t) => {
|
|
166
|
+
t.false(isOpencodeProvider({ type: 'anthropic', baseUrl: 'https://api.anthropic.com' }));
|
|
167
|
+
t.false(isOpencodeProvider({ type: 'openai', baseUrl: 'https://api.openai.com' }));
|
|
168
|
+
t.false(isOpencodeProvider({}));
|
|
169
|
+
});
|
|
170
|
+
// ---------------------------------------------------------------------------
|
|
171
|
+
// selectOpencodeModelTransport
|
|
172
|
+
// ---------------------------------------------------------------------------
|
|
173
|
+
test('selectOpencodeModelTransport routes minimax and qwen models through Anthropic messages', (t) => {
|
|
174
|
+
t.is(selectOpencodeModelTransport('Minimax-3.5-Turbo'), 'anthropic-messages');
|
|
175
|
+
t.is(selectOpencodeModelTransport('qwen3-coder'), 'anthropic-messages');
|
|
176
|
+
});
|
|
177
|
+
test('selectOpencodeModelTransport routes other models through OpenAI chat completions', (t) => {
|
|
178
|
+
t.is(selectOpencodeModelTransport('gpt-oss-120b'), 'openai-chat-completions');
|
|
179
|
+
});
|
|
180
|
+
test('shouldApplyOpencodeAnthropicPromptCaching applies only to Anthropic Claude and qwen model IDs', (t) => {
|
|
181
|
+
t.true(shouldApplyOpencodeAnthropicPromptCaching('claude-sonnet-4-5'));
|
|
182
|
+
t.true(shouldApplyOpencodeAnthropicPromptCaching('qwen3-coder'));
|
|
183
|
+
t.false(shouldApplyOpencodeAnthropicPromptCaching('Minimax-3.5-Turbo'));
|
|
184
|
+
t.false(shouldApplyOpencodeAnthropicPromptCaching('gpt-oss-120b'));
|
|
185
|
+
});
|
|
186
|
+
//# sourceMappingURL=opencode.provider.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.provider.test.js","sourceRoot":"","sources":["../../source/providers/opencode.provider.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import test from 'ava';
|
|
2
2
|
import { getProvider } from './index.js';
|
|
3
3
|
test('openrouter createRunner does not crash in ESM when api key is missing', (t) => {
|
|
4
|
+
const originalKey = process.env.OPENROUTER_API_KEY;
|
|
5
|
+
delete process.env.OPENROUTER_API_KEY;
|
|
6
|
+
t.teardown(() => {
|
|
7
|
+
process.env.OPENROUTER_API_KEY = originalKey;
|
|
8
|
+
});
|
|
4
9
|
const provider = getProvider('openrouter');
|
|
5
10
|
t.truthy(provider, 'openrouter provider should be registered');
|
|
6
11
|
t.is(typeof provider?.createRunner, 'function');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openrouter.provider.createRunner.test.js","sourceRoot":"","sources":["../../source/providers/openrouter.provider.createRunner.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,IAAI,CAAC,uEAAuE,EAAE,CAAC,CAAC,EAAE,EAAE;IAClF,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAC3C,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,0CAA0C,CAAC,CAAC;IAC/D,CAAC,CAAC,EAAE,CAAC,OAAO,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;IAEhD,MAAM,IAAI,GAAiB;QACzB,eAAe,EAAE;YACf,GAAG,EAAE,GAAY,EAAE,CAAC,SAAc;YAClC,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC;SACd;QACD,cAAc,EAAE;YACd,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;YACd,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;YACd,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;YACf,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;YACf,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;YAClB,gBAAgB,EAAE,GAAG,EAAE,GAAE,CAAC;YAC1B,gBAAgB,EAAE,GAAG,EAAE,CAAC,SAAS;YACjC,kBAAkB,EAAE,GAAG,EAAE,GAAE,CAAC;SAC7B;KACF,CAAC;IAEF,0EAA0E;IAC1E,IAAI,MAAM,GAAQ,OAAO,CAAC;IAC1B,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;QACf,MAAM,GAAG,QAAS,CAAC,YAAa,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,yEAAyE;IACzE,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACrB,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qEAAqE,EAAE,CAAC,CAAC,EAAE,EAAE;IAChF,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAC3C,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,0CAA0C,CAAC,CAAC;IAE/D,MAAM,IAAI,GAAiB;QACzB,eAAe,EAAE;YACf,GAAG,EAAE,CAAU,GAAW,EAAE,EAAE;gBAC5B,MAAM,MAAM,GAAwB;oBAClC,yBAAyB,EAAE,SAAS;oBACpC,aAAa,EAAE,iBAAiB;iBACjC,CAAC;gBACF,OAAO,MAAM,CAAC,GAAG,CAAM,CAAC;YAC1B,CAAC;YACD,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC;SACd;QACD,cAAc,EAAE;YACd,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;YACd,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;YACd,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;YACf,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;YACf,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;YAClB,gBAAgB,EAAE,GAAG,EAAE,GAAE,CAAC;YAC1B,gBAAgB,EAAE,GAAG,EAAE,CAAC,SAAS;YACjC,kBAAkB,EAAE,GAAG,EAAE,GAAE,CAAC;SAC7B;KACF,CAAC;IAEF,MAAM,MAAM,GAAG,QAAS,CAAC,YAAa,CAAC,IAAI,CAAC,CAAC;IAE7C,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACnB,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"openrouter.provider.createRunner.test.js","sourceRoot":"","sources":["../../source/providers/openrouter.provider.createRunner.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,IAAI,CAAC,uEAAuE,EAAE,CAAC,CAAC,EAAE,EAAE;IAClF,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACnD,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACtC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE;QACd,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,WAAW,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAC3C,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,0CAA0C,CAAC,CAAC;IAC/D,CAAC,CAAC,EAAE,CAAC,OAAO,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;IAEhD,MAAM,IAAI,GAAiB;QACzB,eAAe,EAAE;YACf,GAAG,EAAE,GAAY,EAAE,CAAC,SAAc;YAClC,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC;SACd;QACD,cAAc,EAAE;YACd,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;YACd,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;YACd,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;YACf,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;YACf,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;YAClB,gBAAgB,EAAE,GAAG,EAAE,GAAE,CAAC;YAC1B,gBAAgB,EAAE,GAAG,EAAE,CAAC,SAAS;YACjC,kBAAkB,EAAE,GAAG,EAAE,GAAE,CAAC;SAC7B;KACF,CAAC;IAEF,0EAA0E;IAC1E,IAAI,MAAM,GAAQ,OAAO,CAAC;IAC1B,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;QACf,MAAM,GAAG,QAAS,CAAC,YAAa,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,yEAAyE;IACzE,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACrB,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qEAAqE,EAAE,CAAC,CAAC,EAAE,EAAE;IAChF,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAC3C,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,0CAA0C,CAAC,CAAC;IAE/D,MAAM,IAAI,GAAiB;QACzB,eAAe,EAAE;YACf,GAAG,EAAE,CAAU,GAAW,EAAE,EAAE;gBAC5B,MAAM,MAAM,GAAwB;oBAClC,yBAAyB,EAAE,SAAS;oBACpC,aAAa,EAAE,iBAAiB;iBACjC,CAAC;gBACF,OAAO,MAAM,CAAC,GAAG,CAAM,CAAC;YAC1B,CAAC;YACD,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC;SACd;QACD,cAAc,EAAE;YACd,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;YACd,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;YACd,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;YACf,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;YACf,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;YAClB,gBAAgB,EAAE,GAAG,EAAE,GAAE,CAAC;YAC1B,gBAAgB,EAAE,GAAG,EAAE,CAAC,SAAS;YACjC,kBAAkB,EAAE,GAAG,EAAE,GAAE,CAAC;SAC7B;KACF,CAAC;IAEF,MAAM,MAAM,GAAG,QAAS,CAAC,YAAa,CAAC,IAAI,CAAC,CAAC;IAE7C,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACnB,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openrouter.provider.d.ts","sourceRoot":"","sources":["../../source/providers/openrouter.provider.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"openrouter.provider.d.ts","sourceRoot":"","sources":["../../source/providers/openrouter.provider.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAsB1D,eAAO,MAAM,iCAAiC,EAAE,eAc/C,CAAC"}
|
|
@@ -3,6 +3,7 @@ import { registerProvider } from './registry.js';
|
|
|
3
3
|
import { AiSdkOpenRouterProvider } from './ai-sdk-openrouter.provider.js';
|
|
4
4
|
import { createProviderFetch } from './fetch/composer.js';
|
|
5
5
|
import { addCacheControlToLastTwoMessages } from './common/openai-compatible-messages.js';
|
|
6
|
+
import { NULL_SESSION_CONTEXT_SERVICE } from '../services/session-context-service.js';
|
|
6
7
|
function sanitizeOpenRouterReasoningDetails(messages) {
|
|
7
8
|
const requiresSignature = new Set(['google-gemini-v1', 'anthropic-claude-v1']);
|
|
8
9
|
for (const message of messages) {
|
|
@@ -39,7 +40,7 @@ export const openRouterPreprocessingMiddleware = async (ctx, next) => {
|
|
|
39
40
|
async function fetchOpenRouterModels(deps, fetchImpl = fetch) {
|
|
40
41
|
const { settingsService } = deps;
|
|
41
42
|
const baseUrl = settingsService.get('agent.openrouter.baseUrl') || 'https://openrouter.ai/api/v1';
|
|
42
|
-
const apiKey = settingsService.get('agent.openrouter.apiKey');
|
|
43
|
+
const apiKey = settingsService.get('agent.openrouter.apiKey') || process.env.OPENROUTER_API_KEY;
|
|
43
44
|
const headers = {
|
|
44
45
|
'Content-Type': 'application/json',
|
|
45
46
|
};
|
|
@@ -66,8 +67,8 @@ async function fetchOpenRouterModels(deps, fetchImpl = fetch) {
|
|
|
66
67
|
registerProvider({
|
|
67
68
|
id: 'openrouter',
|
|
68
69
|
label: 'OpenRouter',
|
|
69
|
-
createRunner: ({ settingsService, loggingService }) => {
|
|
70
|
-
const apiKey = settingsService.get('agent.openrouter.apiKey');
|
|
70
|
+
createRunner: ({ settingsService, loggingService, sessionContextService }) => {
|
|
71
|
+
const apiKey = settingsService.get('agent.openrouter.apiKey') || process.env.OPENROUTER_API_KEY;
|
|
71
72
|
if (!apiKey) {
|
|
72
73
|
return null;
|
|
73
74
|
}
|
|
@@ -88,7 +89,10 @@ registerProvider({
|
|
|
88
89
|
fetch: createProviderFetch({
|
|
89
90
|
providerId: 'openrouter',
|
|
90
91
|
defaultModel: settingsService.get('agent.model') || defaultModel,
|
|
91
|
-
deps: {
|
|
92
|
+
deps: {
|
|
93
|
+
loggingService,
|
|
94
|
+
sessionContextService: sessionContextService ?? NULL_SESSION_CONTEXT_SERVICE,
|
|
95
|
+
},
|
|
92
96
|
middlewares: [openRouterPreprocessingMiddleware],
|
|
93
97
|
}),
|
|
94
98
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openrouter.provider.js","sourceRoot":"","sources":["../../source/providers/openrouter.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAE,gCAAgC,EAAE,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"openrouter.provider.js","sourceRoot":"","sources":["../../source/providers/openrouter.provider.ts"],"names":[],"mappings":"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"}
|