@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,6 +1,10 @@
|
|
|
1
1
|
import test from 'ava';
|
|
2
2
|
import { OpenAIAgentClient } from './openai-agent-client.js';
|
|
3
3
|
import { registerProvider } from '../providers/registry.js';
|
|
4
|
+
const createSessionContextService = () => ({
|
|
5
|
+
runWithContext: (_context, fn) => fn(),
|
|
6
|
+
getContext: () => null,
|
|
7
|
+
});
|
|
4
8
|
// ========== Mock Utilities ==========
|
|
5
9
|
function createMockLogger() {
|
|
6
10
|
return {
|
|
@@ -63,6 +67,8 @@ let chainingProviderRegistered = false;
|
|
|
63
67
|
let chainingRunnerCalls = [];
|
|
64
68
|
let codexProviderRegistered = false;
|
|
65
69
|
let codexRunnerCalls = [];
|
|
70
|
+
let openaiProviderRegistered = false;
|
|
71
|
+
let openaiRunnerCalls = [];
|
|
66
72
|
let failingProviderRegistered = false;
|
|
67
73
|
function ensureMentorProvidersRegistered() {
|
|
68
74
|
if (!mentorProviderRegistered) {
|
|
@@ -127,7 +133,7 @@ function ensureChainingProvidersRegistered() {
|
|
|
127
133
|
label: 'Mock Chaining False',
|
|
128
134
|
createRunner: () => ({
|
|
129
135
|
run: async (_agent, _input, options) => {
|
|
130
|
-
chainingRunnerCalls.push({ options, providerId: 'mock-chaining-false' });
|
|
136
|
+
chainingRunnerCalls.push({ input: _input, options, providerId: 'mock-chaining-false' });
|
|
131
137
|
return {
|
|
132
138
|
status: 'completed',
|
|
133
139
|
finalOutput: 'ok',
|
|
@@ -146,7 +152,7 @@ function ensureChainingProvidersRegistered() {
|
|
|
146
152
|
label: 'Mock Chaining True',
|
|
147
153
|
createRunner: () => ({
|
|
148
154
|
run: async (_agent, _input, options) => {
|
|
149
|
-
chainingRunnerCalls.push({ options, providerId: 'mock-chaining-true' });
|
|
155
|
+
chainingRunnerCalls.push({ input: _input, options, providerId: 'mock-chaining-true' });
|
|
150
156
|
return {
|
|
151
157
|
status: 'completed',
|
|
152
158
|
finalOutput: 'ok',
|
|
@@ -182,11 +188,37 @@ function ensureCodexProviderRegistered() {
|
|
|
182
188
|
capabilities: {
|
|
183
189
|
supportsConversationChaining: true,
|
|
184
190
|
supportsTracingControl: true,
|
|
191
|
+
supportsPromptCacheKey: true,
|
|
185
192
|
},
|
|
186
193
|
}, { allowOverride: true });
|
|
187
194
|
codexProviderRegistered = true;
|
|
188
195
|
}
|
|
189
196
|
}
|
|
197
|
+
function ensureOpenAIProviderRegistered() {
|
|
198
|
+
if (!openaiProviderRegistered) {
|
|
199
|
+
registerProvider({
|
|
200
|
+
id: 'openai',
|
|
201
|
+
label: 'Mock OpenAI',
|
|
202
|
+
createRunner: () => ({
|
|
203
|
+
run: async (agent, _input, options) => {
|
|
204
|
+
openaiRunnerCalls.push({ agent, options });
|
|
205
|
+
return {
|
|
206
|
+
status: 'completed',
|
|
207
|
+
finalOutput: 'ok',
|
|
208
|
+
messages: [],
|
|
209
|
+
};
|
|
210
|
+
},
|
|
211
|
+
}),
|
|
212
|
+
fetchModels: async () => [{ id: 'mock-model' }],
|
|
213
|
+
capabilities: {
|
|
214
|
+
supportsConversationChaining: true,
|
|
215
|
+
supportsTracingControl: true,
|
|
216
|
+
supportsPromptCacheKey: true,
|
|
217
|
+
},
|
|
218
|
+
}, { allowOverride: true });
|
|
219
|
+
openaiProviderRegistered = true;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
190
222
|
function ensureFailingProviderRegistered() {
|
|
191
223
|
if (!failingProviderRegistered) {
|
|
192
224
|
registerProvider({
|
|
@@ -210,6 +242,7 @@ test.beforeEach(() => {
|
|
|
210
242
|
ensureMentorProvidersRegistered();
|
|
211
243
|
ensureChainingProvidersRegistered();
|
|
212
244
|
ensureCodexProviderRegistered();
|
|
245
|
+
ensureOpenAIProviderRegistered();
|
|
213
246
|
ensureFailingProviderRegistered();
|
|
214
247
|
capturedMainAgentForMentorTest = null;
|
|
215
248
|
mentorInputs = [];
|
|
@@ -217,12 +250,13 @@ test.beforeEach(() => {
|
|
|
217
250
|
mentorResponseCounter = 0;
|
|
218
251
|
chainingRunnerCalls = [];
|
|
219
252
|
codexRunnerCalls = [];
|
|
253
|
+
openaiRunnerCalls = [];
|
|
220
254
|
});
|
|
221
255
|
// ========== setModel tests ==========
|
|
222
256
|
test.serial('setModel updates the internal model', async (t) => {
|
|
223
257
|
const settings = createMockSettings();
|
|
224
258
|
const client = new OpenAIAgentClient({
|
|
225
|
-
deps: { logger: createMockLogger(), settings },
|
|
259
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
226
260
|
});
|
|
227
261
|
// Set a new model
|
|
228
262
|
client.setModel('gpt-4-turbo');
|
|
@@ -237,14 +271,14 @@ test.serial('setModel updates the internal model', async (t) => {
|
|
|
237
271
|
test.serial('getProvider returns current provider', (t) => {
|
|
238
272
|
const settings = createMockSettings({ 'agent.provider': 'mock-provider-public-methods' });
|
|
239
273
|
const client = new OpenAIAgentClient({
|
|
240
|
-
deps: { logger: createMockLogger(), settings },
|
|
274
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
241
275
|
});
|
|
242
276
|
t.is(client.getProvider(), 'mock-provider-public-methods');
|
|
243
277
|
});
|
|
244
278
|
test.serial('setProvider updates provider and persists to settings', (t) => {
|
|
245
279
|
const settings = createMockSettings({ 'agent.provider': 'mock-provider-public-methods' });
|
|
246
280
|
const client = new OpenAIAgentClient({
|
|
247
|
-
deps: { logger: createMockLogger(), settings },
|
|
281
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
248
282
|
});
|
|
249
283
|
client.setProvider('openai');
|
|
250
284
|
t.is(client.getProvider(), 'openai');
|
|
@@ -253,7 +287,7 @@ test.serial('setProvider updates provider and persists to settings', (t) => {
|
|
|
253
287
|
test.serial('setProvider does not initialize provider credentials eagerly', async (t) => {
|
|
254
288
|
const settings = createMockSettings({ 'agent.provider': 'mock-provider-public-methods' });
|
|
255
289
|
const client = new OpenAIAgentClient({
|
|
256
|
-
deps: { logger: createMockLogger(), settings },
|
|
290
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
257
291
|
});
|
|
258
292
|
client.setProvider('mock-missing-creds');
|
|
259
293
|
t.is(client.getProvider(), 'mock-missing-creds');
|
|
@@ -266,7 +300,7 @@ test.serial('startStream only passes previousResponseId when provider supports c
|
|
|
266
300
|
'agent.provider': 'mock-chaining-false',
|
|
267
301
|
});
|
|
268
302
|
const client = new OpenAIAgentClient({
|
|
269
|
-
deps: { logger: createMockLogger(), settings },
|
|
303
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
270
304
|
});
|
|
271
305
|
await client.startStream('Hello', { previousResponseId: 'prev-1' });
|
|
272
306
|
t.is(chainingRunnerCalls.length, 1);
|
|
@@ -276,18 +310,203 @@ test.serial('startStream only passes previousResponseId when provider supports c
|
|
|
276
310
|
t.is(chainingRunnerCalls.length, 2);
|
|
277
311
|
t.is(chainingRunnerCalls[1].options.previousResponseId, 'prev-2');
|
|
278
312
|
});
|
|
313
|
+
test.serial('continueRunStream filters replayed history to delta input when chaining from previousResponseId', async (t) => {
|
|
314
|
+
const settings = createMockSettings({
|
|
315
|
+
'agent.provider': 'mock-chaining-true',
|
|
316
|
+
});
|
|
317
|
+
const client = new OpenAIAgentClient({
|
|
318
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
319
|
+
});
|
|
320
|
+
const state = {
|
|
321
|
+
_context: { context: { turnCount: 0 } },
|
|
322
|
+
_generatedItems: [
|
|
323
|
+
{ rawItem: { type: 'function_call', callId: 'call-read', name: 'read_file', arguments: '{}' } },
|
|
324
|
+
{ rawItem: { type: 'function_call_output', callId: 'call-read', output: 'done' } },
|
|
325
|
+
],
|
|
326
|
+
};
|
|
327
|
+
await client.continueRunStream(state, { previousResponseId: 'resp-prev' });
|
|
328
|
+
t.is(chainingRunnerCalls.length, 1);
|
|
329
|
+
const call = chainingRunnerCalls[0];
|
|
330
|
+
t.is(call.input, state);
|
|
331
|
+
t.is(call.options.previousResponseId, 'resp-prev');
|
|
332
|
+
const filtered = call.options.callModelInputFilter({
|
|
333
|
+
context: { turnCount: 0 },
|
|
334
|
+
modelData: {
|
|
335
|
+
input: [
|
|
336
|
+
{ role: 'user', type: 'message', content: 'inspect file' },
|
|
337
|
+
{ role: 'assistant', type: 'message', content: [{ type: 'output_text', text: 'I will inspect it.' }] },
|
|
338
|
+
{ type: 'function_call', callId: 'call-read', name: 'read_file', arguments: '{}' },
|
|
339
|
+
{ type: 'function_call_output', callId: 'call-read', output: 'done' },
|
|
340
|
+
],
|
|
341
|
+
instructions: 'system',
|
|
342
|
+
},
|
|
343
|
+
});
|
|
344
|
+
t.deepEqual(filtered.input, [{ type: 'function_call_output', callId: 'call-read', output: 'done' }]);
|
|
345
|
+
t.is(filtered.instructions, 'system');
|
|
346
|
+
});
|
|
347
|
+
test.serial('continueRunStream filters replayed history to delta input with function_call_output_result and tool_call_output_item', async (t) => {
|
|
348
|
+
const settings = createMockSettings({
|
|
349
|
+
'agent.provider': 'mock-chaining-true',
|
|
350
|
+
});
|
|
351
|
+
const client = new OpenAIAgentClient({
|
|
352
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
353
|
+
});
|
|
354
|
+
await client.continueRunStream({ _context: { context: { turnCount: 0 } } }, { previousResponseId: 'resp-prev' });
|
|
355
|
+
const filtered = chainingRunnerCalls[0].options.callModelInputFilter({
|
|
356
|
+
context: { turnCount: 0 },
|
|
357
|
+
modelData: {
|
|
358
|
+
input: [
|
|
359
|
+
{ role: 'user', type: 'message', content: 'inspect file' },
|
|
360
|
+
{ role: 'assistant', type: 'message', content: [{ type: 'output_text', text: 'I will inspect it.' }] },
|
|
361
|
+
{ type: 'function_call', callId: 'call-read', name: 'read_file', arguments: '{}' },
|
|
362
|
+
{ type: 'function_call_output_result', callId: 'call-read', output: 'done' },
|
|
363
|
+
{ type: 'tool_call_output_item', callId: 'call-read', output: 'done' },
|
|
364
|
+
],
|
|
365
|
+
instructions: 'system',
|
|
366
|
+
},
|
|
367
|
+
});
|
|
368
|
+
t.deepEqual(filtered.input, [
|
|
369
|
+
{ type: 'function_call_output_result', callId: 'call-read', output: 'done' },
|
|
370
|
+
{ type: 'tool_call_output_item', callId: 'call-read', output: 'done' },
|
|
371
|
+
]);
|
|
372
|
+
});
|
|
373
|
+
test.serial('continueRunStream keeps the latest user item when chained model input replays full history', async (t) => {
|
|
374
|
+
const settings = createMockSettings({
|
|
375
|
+
'agent.provider': 'mock-chaining-true',
|
|
376
|
+
});
|
|
377
|
+
const client = new OpenAIAgentClient({
|
|
378
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
379
|
+
});
|
|
380
|
+
await client.continueRunStream({ _context: { context: { turnCount: 0 } } }, { previousResponseId: 'resp-prev' });
|
|
381
|
+
const filtered = chainingRunnerCalls[0].options.callModelInputFilter({
|
|
382
|
+
context: { turnCount: 0 },
|
|
383
|
+
modelData: {
|
|
384
|
+
input: [
|
|
385
|
+
{ role: 'user', type: 'message', content: 'first' },
|
|
386
|
+
{ role: 'assistant', type: 'message', content: [{ type: 'output_text', text: 'first response' }] },
|
|
387
|
+
{ role: 'user', type: 'message', content: 'second' },
|
|
388
|
+
],
|
|
389
|
+
instructions: 'system',
|
|
390
|
+
},
|
|
391
|
+
});
|
|
392
|
+
t.deepEqual(filtered.input, [{ role: 'user', type: 'message', content: 'second' }]);
|
|
393
|
+
});
|
|
394
|
+
test.serial('startStream filters replayed history to delta input when chaining from previousResponseId', async (t) => {
|
|
395
|
+
const settings = createMockSettings({
|
|
396
|
+
'agent.provider': 'mock-chaining-true',
|
|
397
|
+
});
|
|
398
|
+
const client = new OpenAIAgentClient({
|
|
399
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
400
|
+
});
|
|
401
|
+
await client.startStream('inspect file', { previousResponseId: 'resp-prev' });
|
|
402
|
+
t.is(chainingRunnerCalls.length, 1);
|
|
403
|
+
const call = chainingRunnerCalls[0];
|
|
404
|
+
t.is(call.options.previousResponseId, 'resp-prev');
|
|
405
|
+
const filtered = call.options.callModelInputFilter({
|
|
406
|
+
context: { turnCount: 0 },
|
|
407
|
+
modelData: {
|
|
408
|
+
input: [
|
|
409
|
+
{ role: 'user', type: 'message', content: 'inspect file' },
|
|
410
|
+
{ role: 'assistant', type: 'message', content: [{ type: 'output_text', text: 'I will inspect it.' }] },
|
|
411
|
+
{ type: 'function_call', callId: 'call-read', name: 'read_file', arguments: '{}' },
|
|
412
|
+
{ type: 'function_call_output', callId: 'call-read', output: 'done' },
|
|
413
|
+
],
|
|
414
|
+
instructions: 'system',
|
|
415
|
+
},
|
|
416
|
+
});
|
|
417
|
+
t.deepEqual(filtered.input, [{ type: 'function_call_output', callId: 'call-read', output: 'done' }]);
|
|
418
|
+
t.is(filtered.instructions, 'system');
|
|
419
|
+
});
|
|
420
|
+
test.serial('continueRun filters replayed history to delta input when chaining from previousResponseId', async (t) => {
|
|
421
|
+
const settings = createMockSettings({
|
|
422
|
+
'agent.provider': 'mock-chaining-true',
|
|
423
|
+
});
|
|
424
|
+
const client = new OpenAIAgentClient({
|
|
425
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
426
|
+
});
|
|
427
|
+
const state = {
|
|
428
|
+
_context: { context: { turnCount: 0 } },
|
|
429
|
+
_generatedItems: [
|
|
430
|
+
{ rawItem: { type: 'function_call', callId: 'call-read', name: 'read_file', arguments: '{}' } },
|
|
431
|
+
{ rawItem: { type: 'function_call_output', callId: 'call-read', output: 'done' } },
|
|
432
|
+
],
|
|
433
|
+
};
|
|
434
|
+
await client.continueRun(state, { previousResponseId: 'resp-prev' });
|
|
435
|
+
t.is(chainingRunnerCalls.length, 1);
|
|
436
|
+
const call = chainingRunnerCalls[0];
|
|
437
|
+
t.is(call.input, state);
|
|
438
|
+
t.is(call.options.previousResponseId, 'resp-prev');
|
|
439
|
+
const filtered = call.options.callModelInputFilter({
|
|
440
|
+
context: { turnCount: 0 },
|
|
441
|
+
modelData: {
|
|
442
|
+
input: [
|
|
443
|
+
{ role: 'user', type: 'message', content: 'inspect file' },
|
|
444
|
+
{ role: 'assistant', type: 'message', content: [{ type: 'output_text', text: 'I will inspect it.' }] },
|
|
445
|
+
{ type: 'function_call', callId: 'call-read', name: 'read_file', arguments: '{}' },
|
|
446
|
+
{ type: 'function_call_output', callId: 'call-read', output: 'done' },
|
|
447
|
+
],
|
|
448
|
+
instructions: 'system',
|
|
449
|
+
},
|
|
450
|
+
});
|
|
451
|
+
t.deepEqual(filtered.input, [{ type: 'function_call_output', callId: 'call-read', output: 'done' }]);
|
|
452
|
+
t.is(filtered.instructions, 'system');
|
|
453
|
+
});
|
|
454
|
+
test.serial('continueRunStream filters and keeps user message even with custom type', async (t) => {
|
|
455
|
+
const settings = createMockSettings({
|
|
456
|
+
'agent.provider': 'mock-chaining-true',
|
|
457
|
+
});
|
|
458
|
+
const client = new OpenAIAgentClient({
|
|
459
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
460
|
+
});
|
|
461
|
+
await client.continueRunStream({ _context: { context: { turnCount: 0 } } }, { previousResponseId: 'resp-prev' });
|
|
462
|
+
const filtered = chainingRunnerCalls[0].options.callModelInputFilter({
|
|
463
|
+
context: { turnCount: 0 },
|
|
464
|
+
modelData: {
|
|
465
|
+
input: [
|
|
466
|
+
{ role: 'user', type: 'message', content: 'first' },
|
|
467
|
+
{ role: 'assistant', type: 'message', content: [{ type: 'output_text', text: 'first response' }] },
|
|
468
|
+
{ role: 'user', type: 'custom_input_type', content: 'second' },
|
|
469
|
+
],
|
|
470
|
+
instructions: 'system',
|
|
471
|
+
},
|
|
472
|
+
});
|
|
473
|
+
t.deepEqual(filtered.input, [{ role: 'user', type: 'custom_input_type', content: 'second' }]);
|
|
474
|
+
});
|
|
279
475
|
test.serial('codex startStream puts prompt_cache_key on agent modelSettings, not run options', async (t) => {
|
|
280
476
|
const settings = createMockSettings({
|
|
281
477
|
'agent.provider': 'codex',
|
|
282
478
|
});
|
|
283
479
|
const client = new OpenAIAgentClient({
|
|
284
|
-
deps: { logger: createMockLogger(), settings },
|
|
480
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
285
481
|
});
|
|
286
482
|
await client.startStream('Hello', { sessionId: 'session-123' });
|
|
287
483
|
t.is(codexRunnerCalls.length, 1);
|
|
288
484
|
t.is(codexRunnerCalls[0].agent.modelSettings.prompt_cache_key, 'session-123');
|
|
289
485
|
t.false('modelSettings' in codexRunnerCalls[0].options);
|
|
290
486
|
});
|
|
487
|
+
test.serial('openai startStream puts prompt_cache_key on agent modelSettings, not run options', async (t) => {
|
|
488
|
+
const settings = createMockSettings({
|
|
489
|
+
'agent.provider': 'openai',
|
|
490
|
+
});
|
|
491
|
+
const client = new OpenAIAgentClient({
|
|
492
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
493
|
+
});
|
|
494
|
+
await client.startStream('Hello', { sessionId: 'session-456' });
|
|
495
|
+
t.is(openaiRunnerCalls.length, 1);
|
|
496
|
+
t.is(openaiRunnerCalls[0].agent.modelSettings.prompt_cache_key, 'session-456');
|
|
497
|
+
t.false('modelSettings' in openaiRunnerCalls[0].options);
|
|
498
|
+
});
|
|
499
|
+
test.serial('startStream omits prompt_cache_key when provider does not support it', async (t) => {
|
|
500
|
+
const settings = createMockSettings({
|
|
501
|
+
'agent.provider': 'mock-provider-public-methods',
|
|
502
|
+
});
|
|
503
|
+
const client = new OpenAIAgentClient({
|
|
504
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
505
|
+
});
|
|
506
|
+
await client.startStream('Hello', { sessionId: 'session-789' });
|
|
507
|
+
t.is(runnerCalls.length, 1);
|
|
508
|
+
t.falsy(runnerCalls[0].agent.modelSettings?.prompt_cache_key);
|
|
509
|
+
});
|
|
291
510
|
test.serial('abort logs with active trace id before clearing correlation', async (t) => {
|
|
292
511
|
const debugLogs = [];
|
|
293
512
|
let correlationId;
|
|
@@ -312,7 +531,7 @@ test.serial('abort logs with active trace id before clearing correlation', async
|
|
|
312
531
|
'agent.provider': 'mock-chaining-false',
|
|
313
532
|
});
|
|
314
533
|
const client = new OpenAIAgentClient({
|
|
315
|
-
deps: { logger, settings },
|
|
534
|
+
deps: { logger, settings, sessionContextService: createSessionContextService() },
|
|
316
535
|
});
|
|
317
536
|
await client.startStream('Hello');
|
|
318
537
|
const activeCorrelationId = correlationId;
|
|
@@ -328,7 +547,7 @@ test.serial('abort logs with active trace id before clearing correlation', async
|
|
|
328
547
|
test.serial('addToolInterceptor returns removal function', (t) => {
|
|
329
548
|
const settings = createMockSettings();
|
|
330
549
|
const client = new OpenAIAgentClient({
|
|
331
|
-
deps: { logger: createMockLogger(), settings },
|
|
550
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
332
551
|
});
|
|
333
552
|
const remove = client.addToolInterceptor(async () => {
|
|
334
553
|
return null;
|
|
@@ -341,7 +560,7 @@ test.serial('addToolInterceptor returns removal function', (t) => {
|
|
|
341
560
|
test.serial('addToolInterceptor can be removed', (t) => {
|
|
342
561
|
const settings = createMockSettings();
|
|
343
562
|
const client = new OpenAIAgentClient({
|
|
344
|
-
deps: { logger: createMockLogger(), settings },
|
|
563
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
345
564
|
});
|
|
346
565
|
const remove = client.addToolInterceptor(async () => {
|
|
347
566
|
return null;
|
|
@@ -356,7 +575,7 @@ test.serial('addToolInterceptor can be removed', (t) => {
|
|
|
356
575
|
test.serial('abort does not throw when called without active operation', (t) => {
|
|
357
576
|
const settings = createMockSettings();
|
|
358
577
|
const client = new OpenAIAgentClient({
|
|
359
|
-
deps: { logger: createMockLogger(), settings },
|
|
578
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
360
579
|
});
|
|
361
580
|
// Should not throw
|
|
362
581
|
t.notThrows(() => client.abort());
|
|
@@ -364,7 +583,7 @@ test.serial('abort does not throw when called without active operation', (t) =>
|
|
|
364
583
|
test.serial('abort can be called multiple times', (t) => {
|
|
365
584
|
const settings = createMockSettings();
|
|
366
585
|
const client = new OpenAIAgentClient({
|
|
367
|
-
deps: { logger: createMockLogger(), settings },
|
|
586
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
368
587
|
});
|
|
369
588
|
t.notThrows(() => {
|
|
370
589
|
client.abort();
|
|
@@ -376,14 +595,14 @@ test.serial('abort can be called multiple times', (t) => {
|
|
|
376
595
|
test.serial('clearConversations does not throw', (t) => {
|
|
377
596
|
const settings = createMockSettings();
|
|
378
597
|
const client = new OpenAIAgentClient({
|
|
379
|
-
deps: { logger: createMockLogger(), settings },
|
|
598
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
380
599
|
});
|
|
381
600
|
t.notThrows(() => client.clearConversations());
|
|
382
601
|
});
|
|
383
602
|
test.serial('clearConversations can be called multiple times', (t) => {
|
|
384
603
|
const settings = createMockSettings();
|
|
385
604
|
const client = new OpenAIAgentClient({
|
|
386
|
-
deps: { logger: createMockLogger(), settings },
|
|
605
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
387
606
|
});
|
|
388
607
|
t.notThrows(() => {
|
|
389
608
|
client.clearConversations();
|
|
@@ -394,7 +613,7 @@ test.serial('clearConversations can be called multiple times', (t) => {
|
|
|
394
613
|
test.serial('setReasoningEffort accepts valid effort levels', (t) => {
|
|
395
614
|
const settings = createMockSettings();
|
|
396
615
|
const client = new OpenAIAgentClient({
|
|
397
|
-
deps: { logger: createMockLogger(), settings },
|
|
616
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
398
617
|
});
|
|
399
618
|
t.notThrows(() => client.setReasoningEffort('high'));
|
|
400
619
|
t.notThrows(() => client.setReasoningEffort('medium'));
|
|
@@ -406,7 +625,7 @@ test.serial('setReasoningEffort accepts valid effort levels', (t) => {
|
|
|
406
625
|
test.serial('setTemperature accepts numeric values', (t) => {
|
|
407
626
|
const settings = createMockSettings();
|
|
408
627
|
const client = new OpenAIAgentClient({
|
|
409
|
-
deps: { logger: createMockLogger(), settings },
|
|
628
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
410
629
|
});
|
|
411
630
|
t.notThrows(() => client.setTemperature(0.5));
|
|
412
631
|
t.notThrows(() => client.setTemperature(1.0));
|
|
@@ -417,10 +636,45 @@ test.serial('setTemperature accepts numeric values', (t) => {
|
|
|
417
636
|
test.serial('setRetryCallback accepts callback function', (t) => {
|
|
418
637
|
const settings = createMockSettings();
|
|
419
638
|
const client = new OpenAIAgentClient({
|
|
420
|
-
deps: { logger: createMockLogger(), settings },
|
|
639
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
421
640
|
});
|
|
422
641
|
t.notThrows(() => client.setRetryCallback(() => { }));
|
|
423
642
|
});
|
|
643
|
+
test.serial('setAskUserAnswer stores and consumes answers by call id', (t) => {
|
|
644
|
+
const settings = createMockSettings();
|
|
645
|
+
const client = new OpenAIAgentClient({
|
|
646
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
647
|
+
});
|
|
648
|
+
client.setAskUserAnswer('call-1', 'Use the existing config');
|
|
649
|
+
t.is(client.getAskUserAnswer('call-1'), 'Use the existing config');
|
|
650
|
+
t.is(client.getAskUserAnswer('call-1'), undefined);
|
|
651
|
+
});
|
|
652
|
+
test.serial('getAskUserAnswer returns undefined for unknown call ids', (t) => {
|
|
653
|
+
const settings = createMockSettings();
|
|
654
|
+
const client = new OpenAIAgentClient({
|
|
655
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
656
|
+
});
|
|
657
|
+
t.is(client.getAskUserAnswer('missing-call'), undefined);
|
|
658
|
+
t.is(client.getAskUserAnswer(), undefined);
|
|
659
|
+
});
|
|
660
|
+
test.serial('ask_user tool executes using the stored approval answer', async (t) => {
|
|
661
|
+
const settings = createMockSettings({
|
|
662
|
+
'agent.provider': 'mock-main-mentor-refresh',
|
|
663
|
+
'agent.model': 'mock-model',
|
|
664
|
+
'app.liteMode': false,
|
|
665
|
+
});
|
|
666
|
+
const client = new OpenAIAgentClient({
|
|
667
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
668
|
+
});
|
|
669
|
+
await client.chat('prime tools');
|
|
670
|
+
const askUserTool = capturedMainAgentForMentorTest?.tools?.find((tool) => tool?.name === 'ask_user');
|
|
671
|
+
t.truthy(askUserTool);
|
|
672
|
+
t.is(typeof askUserTool?.invoke, 'function');
|
|
673
|
+
client.setAskUserAnswer('call-bridge', 'Use the safe option');
|
|
674
|
+
const result = await askUserTool.invoke({}, JSON.stringify({ question: 'Which option should I use?', options: ['Use the safe option', 'Ask later'] }), { toolCall: { callId: 'call-bridge' } });
|
|
675
|
+
t.is(result, 'Use the safe option');
|
|
676
|
+
t.is(client.getAskUserAnswer('call-bridge'), undefined);
|
|
677
|
+
});
|
|
424
678
|
test.serial('setModel resets mentor conversation chain used by ask_mentor', async (t) => {
|
|
425
679
|
const settings = createMockSettings({
|
|
426
680
|
'agent.provider': 'mock-main-mentor-refresh',
|
|
@@ -430,7 +684,7 @@ test.serial('setModel resets mentor conversation chain used by ask_mentor', asyn
|
|
|
430
684
|
'app.liteMode': false,
|
|
431
685
|
});
|
|
432
686
|
const client = new OpenAIAgentClient({
|
|
433
|
-
deps: { logger: createMockLogger(), settings },
|
|
687
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
434
688
|
});
|
|
435
689
|
await client.chat('prime tools');
|
|
436
690
|
const askMentorTool = capturedMainAgentForMentorTest?.tools?.find((tool) => tool?.name === 'ask_mentor');
|
|
@@ -458,7 +712,7 @@ test.serial('ask_mentor resets conversation chain when mentor provider changes',
|
|
|
458
712
|
'app.liteMode': false,
|
|
459
713
|
});
|
|
460
714
|
const client = new OpenAIAgentClient({
|
|
461
|
-
deps: { logger: createMockLogger(), settings },
|
|
715
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
462
716
|
});
|
|
463
717
|
await client.chat('prime tools');
|
|
464
718
|
const askMentorTool = capturedMainAgentForMentorTest?.tools?.find((tool) => tool?.name === 'ask_mentor');
|
|
@@ -505,7 +759,7 @@ test.serial('setSubagentEventSink defers cleanup to null when subagents are acti
|
|
|
505
759
|
'app.liteMode': false,
|
|
506
760
|
});
|
|
507
761
|
const client = new OpenAIAgentClient({
|
|
508
|
-
deps: { logger: createMockLogger(), settings },
|
|
762
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
509
763
|
});
|
|
510
764
|
await client.chat('prime tools');
|
|
511
765
|
const askMentorTool = capturedMainAgentForMentorTest?.tools?.find((tool) => tool?.name === 'ask_mentor');
|
|
@@ -557,7 +811,7 @@ test.serial('codex resolves default_reasoning_level if agent.reasoningEffort is
|
|
|
557
811
|
},
|
|
558
812
|
}, { allowOverride: true });
|
|
559
813
|
const client = new OpenAIAgentClient({
|
|
560
|
-
deps: { logger: createMockLogger(), settings },
|
|
814
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
561
815
|
});
|
|
562
816
|
await client.startStream('Hello');
|
|
563
817
|
t.is(codexRunnerCalls.length, 1);
|
|
@@ -592,7 +846,7 @@ test.serial('codex chat resolves default_reasoning_level if agent.reasoningEffor
|
|
|
592
846
|
},
|
|
593
847
|
}, { allowOverride: true });
|
|
594
848
|
const client = new OpenAIAgentClient({
|
|
595
|
-
deps: { logger: createMockLogger(), settings },
|
|
849
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
596
850
|
});
|
|
597
851
|
await client.chat('Hello', { provider: 'codex', model: 'gpt-5.3-codex', reasoningEffort: 'default' });
|
|
598
852
|
t.is(codexRunnerCalls.length, 1);
|
|
@@ -600,4 +854,53 @@ test.serial('codex chat resolves default_reasoning_level if agent.reasoningEffor
|
|
|
600
854
|
t.truthy(agent);
|
|
601
855
|
t.is(agent.modelSettings?.reasoning?.effort, 'medium');
|
|
602
856
|
});
|
|
857
|
+
test.serial('main agent client injects warning into tool output when turns left <= 5', async (t) => {
|
|
858
|
+
let executeOutput = null;
|
|
859
|
+
registerProvider({
|
|
860
|
+
id: 'mock-provider-maxturns',
|
|
861
|
+
label: 'Mock Provider MaxTurns',
|
|
862
|
+
createRunner: () => ({
|
|
863
|
+
run: async (agent, _input, options) => {
|
|
864
|
+
if (options.callModelInputFilter) {
|
|
865
|
+
// Simulate 96 turns
|
|
866
|
+
for (let i = 0; i < 96; i++) {
|
|
867
|
+
await options.callModelInputFilter({
|
|
868
|
+
modelData: { input: [] },
|
|
869
|
+
agent,
|
|
870
|
+
context: options.context,
|
|
871
|
+
});
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
// Execute a tool to see if the warning is injected
|
|
875
|
+
const readFileTool = agent.tools.find((tool) => tool.name === 'read_file');
|
|
876
|
+
if (readFileTool) {
|
|
877
|
+
const mockRunContext = {
|
|
878
|
+
context: options.context,
|
|
879
|
+
};
|
|
880
|
+
executeOutput = await readFileTool.invoke(mockRunContext, JSON.stringify({ path: 'package.json' }), {});
|
|
881
|
+
}
|
|
882
|
+
return {
|
|
883
|
+
status: 'completed',
|
|
884
|
+
finalOutput: 'done',
|
|
885
|
+
history: [],
|
|
886
|
+
messages: [],
|
|
887
|
+
};
|
|
888
|
+
},
|
|
889
|
+
}),
|
|
890
|
+
fetchModels: async () => [{ id: 'mock-model' }],
|
|
891
|
+
});
|
|
892
|
+
const settings = createMockSettings({
|
|
893
|
+
'agent.provider': 'mock-provider-maxturns',
|
|
894
|
+
'agent.model': 'mock-model',
|
|
895
|
+
});
|
|
896
|
+
const client = new OpenAIAgentClient({
|
|
897
|
+
maxTurns: 100,
|
|
898
|
+
deps: { logger: createMockLogger(), settings, sessionContextService: createSessionContextService() },
|
|
899
|
+
});
|
|
900
|
+
// Trigger startStream to initiate the provider run with correct context
|
|
901
|
+
await client.startStream('Hello');
|
|
902
|
+
t.truthy(executeOutput);
|
|
903
|
+
t.true(executeOutput.includes('approaching the maximum turn limit'), 'should contain max turns warning');
|
|
904
|
+
t.true(executeOutput.includes('4 turns left'), 'should indicate correct number of turns left');
|
|
905
|
+
});
|
|
603
906
|
//# sourceMappingURL=openai-agent-client.public-methods.test.js.map
|