@qduc/term2 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/agent.d.ts +19 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +143 -0
- package/dist/agent.js.map +1 -0
- package/dist/app.d.ts +22 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +403 -0
- package/dist/app.js.map +1 -0
- package/dist/app.model-command-feedback.test.d.ts +2 -0
- package/dist/app.model-command-feedback.test.d.ts.map +1 -0
- package/dist/app.model-command-feedback.test.js +19 -0
- package/dist/app.model-command-feedback.test.js.map +1 -0
- package/dist/app.parseInput.test.d.ts +2 -0
- package/dist/app.parseInput.test.d.ts.map +1 -0
- package/dist/app.parseInput.test.js +97 -0
- package/dist/app.parseInput.test.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +241 -0
- package/dist/cli.js.map +1 -0
- package/dist/components/ApprovalPrompt.d.ts +10 -0
- package/dist/components/ApprovalPrompt.d.ts.map +1 -0
- package/dist/components/ApprovalPrompt.js +163 -0
- package/dist/components/ApprovalPrompt.js.map +1 -0
- package/dist/components/Banner.d.ts +9 -0
- package/dist/components/Banner.d.ts.map +1 -0
- package/dist/components/Banner.js +86 -0
- package/dist/components/Banner.js.map +1 -0
- package/dist/components/BottomArea.d.ts +33 -0
- package/dist/components/BottomArea.d.ts.map +1 -0
- package/dist/components/BottomArea.js +31 -0
- package/dist/components/BottomArea.js.map +1 -0
- package/dist/components/BottomArea.test.d.ts +2 -0
- package/dist/components/BottomArea.test.d.ts.map +1 -0
- package/dist/components/BottomArea.test.js +73 -0
- package/dist/components/BottomArea.test.js.map +1 -0
- package/dist/components/ChatMessage.d.ts +7 -0
- package/dist/components/ChatMessage.d.ts.map +1 -0
- package/dist/components/ChatMessage.js +10 -0
- package/dist/components/ChatMessage.js.map +1 -0
- package/dist/components/CommandMessage.d.ts +15 -0
- package/dist/components/CommandMessage.d.ts.map +1 -0
- package/dist/components/CommandMessage.js +188 -0
- package/dist/components/CommandMessage.js.map +1 -0
- package/dist/components/CommandMessage.test.d.ts +2 -0
- package/dist/components/CommandMessage.test.d.ts.map +1 -0
- package/dist/components/CommandMessage.test.js +35 -0
- package/dist/components/CommandMessage.test.js.map +1 -0
- package/dist/components/ErrorBoundary.d.ts +27 -0
- package/dist/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/components/ErrorBoundary.js +77 -0
- package/dist/components/ErrorBoundary.js.map +1 -0
- package/dist/components/ErrorBoundary.test.d.ts +2 -0
- package/dist/components/ErrorBoundary.test.d.ts.map +1 -0
- package/dist/components/ErrorBoundary.test.js +32 -0
- package/dist/components/ErrorBoundary.test.js.map +1 -0
- package/dist/components/Input/PopupManager.d.ts +42 -0
- package/dist/components/Input/PopupManager.d.ts.map +1 -0
- package/dist/components/Input/PopupManager.js +13 -0
- package/dist/components/Input/PopupManager.js.map +1 -0
- package/dist/components/InputBox.d.ts +18 -0
- package/dist/components/InputBox.d.ts.map +1 -0
- package/dist/components/InputBox.js +384 -0
- package/dist/components/InputBox.js.map +1 -0
- package/dist/components/InputBox.menu-logic.test.d.ts +2 -0
- package/dist/components/InputBox.menu-logic.test.d.ts.map +1 -0
- package/dist/components/InputBox.menu-logic.test.js +151 -0
- package/dist/components/InputBox.menu-logic.test.js.map +1 -0
- package/dist/components/InputBox.test.d.ts +2 -0
- package/dist/components/InputBox.test.d.ts.map +1 -0
- package/dist/components/InputBox.test.js +91 -0
- package/dist/components/InputBox.test.js.map +1 -0
- package/dist/components/LiveResponse.d.ts +13 -0
- package/dist/components/LiveResponse.d.ts.map +1 -0
- package/dist/components/LiveResponse.js +16 -0
- package/dist/components/LiveResponse.js.map +1 -0
- package/dist/components/MarkdownRenderer.d.ts +8 -0
- package/dist/components/MarkdownRenderer.d.ts.map +1 -0
- package/dist/components/MarkdownRenderer.js +225 -0
- package/dist/components/MarkdownRenderer.js.map +1 -0
- package/dist/components/MentorMode.test.d.ts +2 -0
- package/dist/components/MentorMode.test.d.ts.map +1 -0
- package/dist/components/MentorMode.test.js.map +1 -0
- package/dist/components/MessageList.d.ts +7 -0
- package/dist/components/MessageList.d.ts.map +1 -0
- package/dist/components/MessageList.js +29 -0
- package/dist/components/MessageList.js.map +1 -0
- package/dist/components/MessageList.test.d.ts +2 -0
- package/dist/components/MessageList.test.d.ts.map +1 -0
- package/dist/components/MessageList.test.js +15 -0
- package/dist/components/MessageList.test.js.map +1 -0
- package/dist/components/ModelSelectionMenu.d.ts +18 -0
- package/dist/components/ModelSelectionMenu.d.ts.map +1 -0
- package/dist/components/ModelSelectionMenu.js +91 -0
- package/dist/components/ModelSelectionMenu.js.map +1 -0
- package/dist/components/ModelSelectionMenu.test.d.ts +2 -0
- package/dist/components/ModelSelectionMenu.test.d.ts.map +1 -0
- package/dist/components/ModelSelectionMenu.test.js +83 -0
- package/dist/components/ModelSelectionMenu.test.js.map +1 -0
- package/dist/components/PathSelectionMenu.d.ts +12 -0
- package/dist/components/PathSelectionMenu.d.ts.map +1 -0
- package/dist/components/PathSelectionMenu.js +42 -0
- package/dist/components/PathSelectionMenu.js.map +1 -0
- package/dist/components/SettingsSelectionMenu.d.ts +9 -0
- package/dist/components/SettingsSelectionMenu.d.ts.map +1 -0
- package/dist/components/SettingsSelectionMenu.js +21 -0
- package/dist/components/SettingsSelectionMenu.js.map +1 -0
- package/dist/components/SlashCommandMenu.d.ts +15 -0
- package/dist/components/SlashCommandMenu.d.ts.map +1 -0
- package/dist/components/SlashCommandMenu.js +20 -0
- package/dist/components/SlashCommandMenu.js.map +1 -0
- package/dist/components/StatusBar.d.ts +11 -0
- package/dist/components/StatusBar.d.ts.map +1 -0
- package/dist/components/StatusBar.js +59 -0
- package/dist/components/StatusBar.js.map +1 -0
- package/dist/components/TextInput.d.ts +42 -0
- package/dist/components/TextInput.d.ts.map +1 -0
- package/dist/components/TextInput.js +397 -0
- package/dist/components/TextInput.js.map +1 -0
- package/dist/components/TextInput.test.d.ts +2 -0
- package/dist/components/TextInput.test.d.ts.map +1 -0
- package/dist/components/TextInput.test.js +75 -0
- package/dist/components/TextInput.test.js.map +1 -0
- package/dist/context/InputContext.d.ts +31 -0
- package/dist/context/InputContext.d.ts.map +1 -0
- package/dist/context/InputContext.js +36 -0
- package/dist/context/InputContext.js.map +1 -0
- package/dist/context/InputContext.stability.test.d.ts +2 -0
- package/dist/context/InputContext.stability.test.d.ts.map +1 -0
- package/dist/context/InputContext.stability.test.js +28 -0
- package/dist/context/InputContext.stability.test.js.map +1 -0
- package/dist/context/InputContext.test.d.ts +2 -0
- package/dist/context/InputContext.test.d.ts.map +1 -0
- package/dist/context/InputContext.test.js +168 -0
- package/dist/context/InputContext.test.js.map +1 -0
- package/dist/debug-schema.d.ts +2 -0
- package/dist/debug-schema.d.ts.map +1 -0
- package/dist/debug-schema.js +22 -0
- package/dist/debug-schema.js.map +1 -0
- package/dist/hooks/use-conversation.d.ts +78 -0
- package/dist/hooks/use-conversation.d.ts.map +1 -0
- package/dist/hooks/use-conversation.js +1017 -0
- package/dist/hooks/use-conversation.js.map +1 -0
- package/dist/hooks/use-input-history.d.ts +16 -0
- package/dist/hooks/use-input-history.d.ts.map +1 -0
- package/dist/hooks/use-input-history.js +71 -0
- package/dist/hooks/use-input-history.js.map +1 -0
- package/dist/hooks/use-model-selection.d.ts +27 -0
- package/dist/hooks/use-model-selection.d.ts.map +1 -0
- package/dist/hooks/use-model-selection.js +187 -0
- package/dist/hooks/use-model-selection.js.map +1 -0
- package/dist/hooks/use-model-selection.test.d.ts +2 -0
- package/dist/hooks/use-model-selection.test.d.ts.map +1 -0
- package/dist/hooks/use-model-selection.test.js +28 -0
- package/dist/hooks/use-model-selection.test.js.map +1 -0
- package/dist/hooks/use-path-completion.d.ts +22 -0
- package/dist/hooks/use-path-completion.d.ts.map +1 -0
- package/dist/hooks/use-path-completion.js +153 -0
- package/dist/hooks/use-path-completion.js.map +1 -0
- package/dist/hooks/use-path-completion.test.d.ts +2 -0
- package/dist/hooks/use-path-completion.test.d.ts.map +1 -0
- package/dist/hooks/use-path-completion.test.js +29 -0
- package/dist/hooks/use-path-completion.test.js.map +1 -0
- package/dist/hooks/use-setting.d.ts +7 -0
- package/dist/hooks/use-setting.d.ts.map +1 -0
- package/dist/hooks/use-setting.js +35 -0
- package/dist/hooks/use-setting.js.map +1 -0
- package/dist/hooks/use-settings-completion.d.ts +23 -0
- package/dist/hooks/use-settings-completion.d.ts.map +1 -0
- package/dist/hooks/use-settings-completion.js +164 -0
- package/dist/hooks/use-settings-completion.js.map +1 -0
- package/dist/hooks/use-settings-completion.test.d.ts +2 -0
- package/dist/hooks/use-settings-completion.test.d.ts.map +1 -0
- package/dist/hooks/use-settings-completion.test.js +334 -0
- package/dist/hooks/use-settings-completion.test.js.map +1 -0
- package/dist/hooks/use-slash-commands.d.ts +21 -0
- package/dist/hooks/use-slash-commands.d.ts.map +1 -0
- package/dist/hooks/use-slash-commands.js +87 -0
- package/dist/hooks/use-slash-commands.js.map +1 -0
- package/dist/hooks/use-slash-commands.test.d.ts +2 -0
- package/dist/hooks/use-slash-commands.test.d.ts.map +1 -0
- package/dist/hooks/use-slash-commands.test.js +246 -0
- package/dist/hooks/use-slash-commands.test.js.map +1 -0
- package/dist/lib/editor-impl.d.ts +23 -0
- package/dist/lib/editor-impl.d.ts.map +1 -0
- package/dist/lib/editor-impl.js +235 -0
- package/dist/lib/editor-impl.js.map +1 -0
- package/dist/lib/openai-agent-client.chat.test.d.ts +2 -0
- package/dist/lib/openai-agent-client.chat.test.d.ts.map +1 -0
- package/dist/lib/openai-agent-client.chat.test.js +68 -0
- package/dist/lib/openai-agent-client.chat.test.js.map +1 -0
- package/dist/lib/openai-agent-client.d.ts +48 -0
- package/dist/lib/openai-agent-client.d.ts.map +1 -0
- package/dist/lib/openai-agent-client.js +653 -0
- package/dist/lib/openai-agent-client.js.map +1 -0
- package/dist/lib/openai-agent-client.test.d.ts +2 -0
- package/dist/lib/openai-agent-client.test.d.ts.map +1 -0
- package/dist/lib/openai-agent-client.test.js +181 -0
- package/dist/lib/openai-agent-client.test.js.map +1 -0
- package/dist/lib/shell.d.ts +7 -0
- package/dist/lib/shell.d.ts.map +1 -0
- package/dist/lib/shell.js +56 -0
- package/dist/lib/shell.js.map +1 -0
- package/dist/lib/tool-invoke.d.ts +4 -0
- package/dist/lib/tool-invoke.d.ts.map +1 -0
- package/dist/lib/tool-invoke.js +26 -0
- package/dist/lib/tool-invoke.js.map +1 -0
- package/dist/lib/tool-invoke.test.d.ts +2 -0
- package/dist/lib/tool-invoke.test.d.ts.map +1 -0
- package/dist/lib/tool-invoke.test.js +19 -0
- package/dist/lib/tool-invoke.test.js.map +1 -0
- package/dist/no-singleton-imports.test.d.ts +2 -0
- package/dist/no-singleton-imports.test.d.ts.map +1 -0
- package/dist/no-singleton-imports.test.js +30 -0
- package/dist/no-singleton-imports.test.js.map +1 -0
- package/dist/prompts/anthropic.md +79 -0
- package/dist/prompts/codex.md +97 -0
- package/dist/prompts/default.md +77 -0
- package/dist/prompts/default.md.bak +77 -0
- package/dist/prompts/gpt-5.md +318 -0
- package/dist/prompts/lite.md +29 -0
- package/dist/prompts/simple-mentor.md +207 -0
- package/dist/prompts/simple.md +189 -0
- package/dist/providers/index.d.ts +5 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +8 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai-compatible/api.d.ts +17 -0
- package/dist/providers/openai-compatible/api.d.ts.map +1 -0
- package/dist/providers/openai-compatible/api.js +58 -0
- package/dist/providers/openai-compatible/api.js.map +1 -0
- package/dist/providers/openai-compatible/model.d.ts +17 -0
- package/dist/providers/openai-compatible/model.d.ts.map +1 -0
- package/dist/providers/openai-compatible/model.js +435 -0
- package/dist/providers/openai-compatible/model.js.map +1 -0
- package/dist/providers/openai-compatible/provider.d.ts +22 -0
- package/dist/providers/openai-compatible/provider.d.ts.map +1 -0
- package/dist/providers/openai-compatible/provider.js +43 -0
- package/dist/providers/openai-compatible/provider.js.map +1 -0
- package/dist/providers/openai-compatible/utils.d.ts +3 -0
- package/dist/providers/openai-compatible/utils.d.ts.map +1 -0
- package/dist/providers/openai-compatible/utils.js +11 -0
- package/dist/providers/openai-compatible/utils.js.map +1 -0
- package/dist/providers/openai-compatible.provider.d.ts +8 -0
- package/dist/providers/openai-compatible.provider.d.ts.map +1 -0
- package/dist/providers/openai-compatible.provider.js +71 -0
- package/dist/providers/openai-compatible.provider.js.map +1 -0
- package/dist/providers/openai.provider.d.ts +2 -0
- package/dist/providers/openai.provider.d.ts.map +1 -0
- package/dist/providers/openai.provider.js +36 -0
- package/dist/providers/openai.provider.js.map +1 -0
- package/dist/providers/openrouter/api.d.ts +39 -0
- package/dist/providers/openrouter/api.d.ts.map +1 -0
- package/dist/providers/openrouter/api.js +172 -0
- package/dist/providers/openrouter/api.js.map +1 -0
- package/dist/providers/openrouter/converters.d.ts +8 -0
- package/dist/providers/openrouter/converters.d.ts.map +1 -0
- package/dist/providers/openrouter/converters.js +382 -0
- package/dist/providers/openrouter/converters.js.map +1 -0
- package/dist/providers/openrouter/converters.test.d.ts +2 -0
- package/dist/providers/openrouter/converters.test.d.ts.map +1 -0
- package/dist/providers/openrouter/converters.test.js +158 -0
- package/dist/providers/openrouter/converters.test.js.map +1 -0
- package/dist/providers/openrouter/index.d.ts +4 -0
- package/dist/providers/openrouter/index.d.ts.map +1 -0
- package/dist/providers/openrouter/index.js +4 -0
- package/dist/providers/openrouter/index.js.map +1 -0
- package/dist/providers/openrouter/model.d.ts +14 -0
- package/dist/providers/openrouter/model.d.ts.map +1 -0
- package/dist/providers/openrouter/model.js +485 -0
- package/dist/providers/openrouter/model.js.map +1 -0
- package/dist/providers/openrouter/provider.d.ts +15 -0
- package/dist/providers/openrouter/provider.d.ts.map +1 -0
- package/dist/providers/openrouter/provider.js +21 -0
- package/dist/providers/openrouter/provider.js.map +1 -0
- package/dist/providers/openrouter/utils.d.ts +10 -0
- package/dist/providers/openrouter/utils.d.ts.map +1 -0
- package/dist/providers/openrouter/utils.js +27 -0
- package/dist/providers/openrouter/utils.js.map +1 -0
- package/dist/providers/openrouter.api.retry.test.d.ts +2 -0
- package/dist/providers/openrouter.api.retry.test.d.ts.map +1 -0
- package/dist/providers/openrouter.api.retry.test.js +148 -0
- package/dist/providers/openrouter.api.retry.test.js.map +1 -0
- package/dist/providers/openrouter.d.ts +2 -0
- package/dist/providers/openrouter.d.ts.map +1 -0
- package/dist/providers/openrouter.history.test.d.ts +2 -0
- package/dist/providers/openrouter.history.test.d.ts.map +1 -0
- package/dist/providers/openrouter.history.test.js +533 -0
- package/dist/providers/openrouter.history.test.js.map +1 -0
- package/dist/providers/openrouter.js +4 -0
- package/dist/providers/openrouter.js.map +1 -0
- package/dist/providers/openrouter.provider.createRunner.test.d.ts +2 -0
- package/dist/providers/openrouter.provider.createRunner.test.d.ts.map +1 -0
- package/dist/providers/openrouter.provider.createRunner.test.js +23 -0
- package/dist/providers/openrouter.provider.createRunner.test.js.map +1 -0
- package/dist/providers/openrouter.provider.d.ts +2 -0
- package/dist/providers/openrouter.provider.d.ts.map +1 -0
- package/dist/providers/openrouter.provider.js +56 -0
- package/dist/providers/openrouter.provider.js.map +1 -0
- package/dist/providers/openrouter.test.d.ts +2 -0
- package/dist/providers/openrouter.test.d.ts.map +1 -0
- package/dist/providers/openrouter.test.js +1382 -0
- package/dist/providers/openrouter.test.js.map +1 -0
- package/dist/providers/registry.d.ts +65 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +44 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/registry.test.d.ts +2 -0
- package/dist/providers/registry.test.d.ts.map +1 -0
- package/dist/providers/registry.test.js +76 -0
- package/dist/providers/registry.test.js.map +1 -0
- package/dist/providers/web-search/index.d.ts +8 -0
- package/dist/providers/web-search/index.d.ts.map +1 -0
- package/dist/providers/web-search/index.js +9 -0
- package/dist/providers/web-search/index.js.map +1 -0
- package/dist/providers/web-search/registry.d.ts +35 -0
- package/dist/providers/web-search/registry.d.ts.map +1 -0
- package/dist/providers/web-search/registry.js +56 -0
- package/dist/providers/web-search/registry.js.map +1 -0
- package/dist/providers/web-search/registry.test.d.ts +2 -0
- package/dist/providers/web-search/registry.test.d.ts.map +1 -0
- package/dist/providers/web-search/registry.test.js +105 -0
- package/dist/providers/web-search/registry.test.js.map +1 -0
- package/dist/providers/web-search/tavily.provider.d.ts +15 -0
- package/dist/providers/web-search/tavily.provider.d.ts.map +1 -0
- package/dist/providers/web-search/tavily.provider.js +69 -0
- package/dist/providers/web-search/tavily.provider.js.map +1 -0
- package/dist/providers/web-search/tavily.provider.test.d.ts +2 -0
- package/dist/providers/web-search/tavily.provider.test.d.ts.map +1 -0
- package/dist/providers/web-search/tavily.provider.test.js +67 -0
- package/dist/providers/web-search/tavily.provider.test.js.map +1 -0
- package/dist/providers/web-search/types.d.ts +55 -0
- package/dist/providers/web-search/types.d.ts.map +1 -0
- package/dist/providers/web-search/types.js +6 -0
- package/dist/providers/web-search/types.js.map +1 -0
- package/dist/safety-checker.js +57 -0
- package/dist/services/conversation-events.d.ts +76 -0
- package/dist/services/conversation-events.d.ts.map +1 -0
- package/dist/services/conversation-events.js +2 -0
- package/dist/services/conversation-events.js.map +1 -0
- package/dist/services/conversation-service.d.ts +31 -0
- package/dist/services/conversation-service.d.ts.map +1 -0
- package/dist/services/conversation-service.js +46 -0
- package/dist/services/conversation-service.js.map +1 -0
- package/dist/services/conversation-service.test.js +190 -0
- package/dist/services/conversation-session.d.ts +99 -0
- package/dist/services/conversation-session.d.ts.map +1 -0
- package/dist/services/conversation-session.js +978 -0
- package/dist/services/conversation-session.js.map +1 -0
- package/dist/services/conversation-store.d.ts +24 -0
- package/dist/services/conversation-store.d.ts.map +1 -0
- package/dist/services/conversation-store.js +216 -0
- package/dist/services/conversation-store.js.map +1 -0
- package/dist/services/conversation-store.test.d.ts +2 -0
- package/dist/services/conversation-store.test.d.ts.map +1 -0
- package/dist/services/conversation-store.test.js +167 -0
- package/dist/services/conversation-store.test.js.map +1 -0
- package/dist/services/execution-context.d.ts +10 -0
- package/dist/services/execution-context.d.ts.map +1 -0
- package/dist/services/execution-context.js +22 -0
- package/dist/services/execution-context.js.map +1 -0
- package/dist/services/execution-context.test.d.ts +2 -0
- package/dist/services/execution-context.test.d.ts.map +1 -0
- package/dist/services/execution-context.test.js +49 -0
- package/dist/services/execution-context.test.js.map +1 -0
- package/dist/services/file-service.d.ts +12 -0
- package/dist/services/file-service.d.ts.map +1 -0
- package/dist/services/file-service.js +90 -0
- package/dist/services/file-service.js.map +1 -0
- package/dist/services/history-service.d.ts +39 -0
- package/dist/services/history-service.d.ts.map +1 -0
- package/dist/services/history-service.js +152 -0
- package/dist/services/history-service.js.map +1 -0
- package/dist/services/logging-service.d.ts +75 -0
- package/dist/services/logging-service.d.ts.map +1 -0
- package/dist/services/logging-service.js +343 -0
- package/dist/services/logging-service.js.map +1 -0
- package/dist/services/model-service.d.ts +15 -0
- package/dist/services/model-service.d.ts.map +1 -0
- package/dist/services/model-service.js +46 -0
- package/dist/services/model-service.js.map +1 -0
- package/dist/services/model-service.test.d.ts +2 -0
- package/dist/services/model-service.test.d.ts.map +1 -0
- package/dist/services/model-service.test.js +128 -0
- package/dist/services/model-service.test.js.map +1 -0
- package/dist/services/service-interfaces.d.ts +33 -0
- package/dist/services/service-interfaces.d.ts.map +1 -0
- package/dist/services/service-interfaces.js +2 -0
- package/dist/services/service-interfaces.js.map +1 -0
- package/dist/services/settings-service.d.ts +316 -0
- package/dist/services/settings-service.d.ts.map +1 -0
- package/dist/services/settings-service.js +1128 -0
- package/dist/services/settings-service.js.map +1 -0
- package/dist/services/settings-service.mock.d.ts +20 -0
- package/dist/services/settings-service.mock.d.ts.map +1 -0
- package/dist/services/settings-service.mock.js +55 -0
- package/dist/services/settings-service.mock.js.map +1 -0
- package/dist/services/singleton-deprecation.test.d.ts +2 -0
- package/dist/services/singleton-deprecation.test.d.ts.map +1 -0
- package/dist/services/singleton-deprecation.test.js +59 -0
- package/dist/services/singleton-deprecation.test.js.map +1 -0
- package/dist/services/ssh-service.d.ts +32 -0
- package/dist/services/ssh-service.d.ts.map +1 -0
- package/dist/services/ssh-service.js +119 -0
- package/dist/services/ssh-service.js.map +1 -0
- package/dist/services/ssh-service.test.d.ts +2 -0
- package/dist/services/ssh-service.test.d.ts.map +1 -0
- package/dist/services/ssh-service.test.js +269 -0
- package/dist/services/ssh-service.test.js.map +1 -0
- package/dist/test-search-tool.d.ts +2 -0
- package/dist/test-search-tool.d.ts.map +1 -0
- package/dist/test-search-tool.js +36 -0
- package/dist/test-search-tool.js.map +1 -0
- package/dist/tools/apply-patch.d.ts +28 -0
- package/dist/tools/apply-patch.d.ts.map +1 -0
- package/dist/tools/apply-patch.js +399 -0
- package/dist/tools/apply-patch.js.map +1 -0
- package/dist/tools/apply-patch.test.d.ts +2 -0
- package/dist/tools/apply-patch.test.d.ts.map +1 -0
- package/dist/tools/apply-patch.test.js +155 -0
- package/dist/tools/apply-patch.test.js.map +1 -0
- package/dist/tools/ask-mentor.d.ts +11 -0
- package/dist/tools/ask-mentor.d.ts.map +1 -0
- package/dist/tools/ask-mentor.js +52 -0
- package/dist/tools/ask-mentor.js.map +1 -0
- package/dist/tools/ask-mentor.test.d.ts +2 -0
- package/dist/tools/ask-mentor.test.d.ts.map +1 -0
- package/dist/tools/ask-mentor.test.js +47 -0
- package/dist/tools/ask-mentor.test.js.map +1 -0
- package/dist/tools/bash.d.ts +10 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +55 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/find-files.d.ts +15 -0
- package/dist/tools/find-files.d.ts.map +1 -0
- package/dist/tools/find-files.js +179 -0
- package/dist/tools/find-files.js.map +1 -0
- package/dist/tools/find-files.test.d.ts +2 -0
- package/dist/tools/find-files.test.d.ts.map +1 -0
- package/dist/tools/find-files.test.js +131 -0
- package/dist/tools/find-files.test.js.map +1 -0
- package/dist/tools/format-helpers.d.ts +34 -0
- package/dist/tools/format-helpers.d.ts.map +1 -0
- package/dist/tools/format-helpers.js +131 -0
- package/dist/tools/format-helpers.js.map +1 -0
- package/dist/tools/grep.d.ts +16 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +211 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/read-file.d.ts +15 -0
- package/dist/tools/read-file.d.ts.map +1 -0
- package/dist/tools/read-file.js +114 -0
- package/dist/tools/read-file.js.map +1 -0
- package/dist/tools/read-file.test.d.ts +2 -0
- package/dist/tools/read-file.test.d.ts.map +1 -0
- package/dist/tools/read-file.test.js +122 -0
- package/dist/tools/read-file.test.js.map +1 -0
- package/dist/tools/search-replace.d.ts +19 -0
- package/dist/tools/search-replace.d.ts.map +1 -0
- package/dist/tools/search-replace.js +411 -0
- package/dist/tools/search-replace.js.map +1 -0
- package/dist/tools/search-replace.test.d.ts +2 -0
- package/dist/tools/search-replace.test.d.ts.map +1 -0
- package/dist/tools/search-replace.test.js +302 -0
- package/dist/tools/search-replace.test.js.map +1 -0
- package/dist/tools/search.d.ts +15 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +143 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/shell.d.ts +19 -0
- package/dist/tools/shell.d.ts.map +1 -0
- package/dist/tools/shell.js +278 -0
- package/dist/tools/shell.js.map +1 -0
- package/dist/tools/tool-execution-context.d.ts +7 -0
- package/dist/tools/tool-execution-context.d.ts.map +1 -0
- package/dist/tools/tool-execution-context.js +7 -0
- package/dist/tools/tool-execution-context.js.map +1 -0
- package/dist/tools/types.d.ts +30 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/utils.d.ts +12 -0
- package/dist/tools/utils.d.ts.map +1 -0
- package/dist/tools/utils.js +19 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/tools/web-search.d.ts +29 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +106 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tools/web-search.test.d.ts +2 -0
- package/dist/tools/web-search.test.d.ts.map +1 -0
- package/dist/tools/web-search.test.js +176 -0
- package/dist/tools/web-search.test.js.map +1 -0
- package/dist/utils/command-logger.d.ts +11 -0
- package/dist/utils/command-logger.d.ts.map +1 -0
- package/dist/utils/command-logger.js +34 -0
- package/dist/utils/command-logger.js.map +1 -0
- package/dist/utils/command-safety/constants.d.ts +21 -0
- package/dist/utils/command-safety/constants.d.ts.map +1 -0
- package/dist/utils/command-safety/constants.js +245 -0
- package/dist/utils/command-safety/constants.js.map +1 -0
- package/dist/utils/command-safety/find-helpers.d.ts +15 -0
- package/dist/utils/command-safety/find-helpers.d.ts.map +1 -0
- package/dist/utils/command-safety/find-helpers.js +218 -0
- package/dist/utils/command-safety/find-helpers.js.map +1 -0
- package/dist/utils/command-safety/handlers/find-handler.d.ts +6 -0
- package/dist/utils/command-safety/handlers/find-handler.d.ts.map +1 -0
- package/dist/utils/command-safety/handlers/find-handler.js +113 -0
- package/dist/utils/command-safety/handlers/find-handler.js.map +1 -0
- package/dist/utils/command-safety/handlers/git-handler.d.ts +6 -0
- package/dist/utils/command-safety/handlers/git-handler.d.ts.map +1 -0
- package/dist/utils/command-safety/handlers/git-handler.js +68 -0
- package/dist/utils/command-safety/handlers/git-handler.js.map +1 -0
- package/dist/utils/command-safety/handlers/index.d.ts +13 -0
- package/dist/utils/command-safety/handlers/index.d.ts.map +1 -0
- package/dist/utils/command-safety/handlers/index.js +20 -0
- package/dist/utils/command-safety/handlers/index.js.map +1 -0
- package/dist/utils/command-safety/handlers/sed-handler.d.ts +6 -0
- package/dist/utils/command-safety/handlers/sed-handler.d.ts.map +1 -0
- package/dist/utils/command-safety/handlers/sed-handler.js +94 -0
- package/dist/utils/command-safety/handlers/sed-handler.js.map +1 -0
- package/dist/utils/command-safety/handlers/types.d.ts +36 -0
- package/dist/utils/command-safety/handlers/types.d.ts.map +1 -0
- package/dist/utils/command-safety/handlers/types.js +2 -0
- package/dist/utils/command-safety/handlers/types.js.map +1 -0
- package/dist/utils/command-safety/index.d.ts +14 -0
- package/dist/utils/command-safety/index.d.ts.map +1 -0
- package/dist/utils/command-safety/index.js +183 -0
- package/dist/utils/command-safety/index.js.map +1 -0
- package/dist/utils/command-safety/path-analysis.d.ts +4 -0
- package/dist/utils/command-safety/path-analysis.d.ts.map +1 -0
- package/dist/utils/command-safety/path-analysis.js +153 -0
- package/dist/utils/command-safety/path-analysis.js.map +1 -0
- package/dist/utils/command-safety/utils.d.ts +2 -0
- package/dist/utils/command-safety/utils.d.ts.map +1 -0
- package/dist/utils/command-safety/utils.js +22 -0
- package/dist/utils/command-safety/utils.js.map +1 -0
- package/dist/utils/command-safety.d.ts +21 -0
- package/dist/utils/command-safety.d.ts.map +1 -0
- package/dist/utils/command-safety.find.test.d.ts +2 -0
- package/dist/utils/command-safety.find.test.d.ts.map +1 -0
- package/dist/utils/command-safety.find.test.js +342 -0
- package/dist/utils/command-safety.find.test.js.map +1 -0
- package/dist/utils/command-safety.js +702 -0
- package/dist/utils/command-safety.js.map +1 -0
- package/dist/utils/command-safety.path.test.d.ts +2 -0
- package/dist/utils/command-safety.path.test.d.ts.map +1 -0
- package/dist/utils/command-safety.path.test.js +360 -0
- package/dist/utils/command-safety.path.test.js.map +1 -0
- package/dist/utils/diff.d.ts +2 -0
- package/dist/utils/diff.d.ts.map +1 -0
- package/dist/utils/diff.js +44 -0
- package/dist/utils/diff.js.map +1 -0
- package/dist/utils/diff.test.d.ts +2 -0
- package/dist/utils/diff.test.d.ts.map +1 -0
- package/dist/utils/diff.test.js +85 -0
- package/dist/utils/diff.test.js.map +1 -0
- package/dist/utils/error-helpers.d.ts +6 -0
- package/dist/utils/error-helpers.d.ts.map +1 -0
- package/dist/utils/error-helpers.js +46 -0
- package/dist/utils/error-helpers.js.map +1 -0
- package/dist/utils/error-helpers.test.d.ts +2 -0
- package/dist/utils/error-helpers.test.d.ts.map +1 -0
- package/dist/utils/error-helpers.test.js +152 -0
- package/dist/utils/error-helpers.test.js.map +1 -0
- package/dist/utils/execute-shell.d.ts +15 -0
- package/dist/utils/execute-shell.d.ts.map +1 -0
- package/dist/utils/execute-shell.js +34 -0
- package/dist/utils/execute-shell.js.map +1 -0
- package/dist/utils/execute-shell.test.d.ts +2 -0
- package/dist/utils/execute-shell.test.d.ts.map +1 -0
- package/dist/utils/execute-shell.test.js +20 -0
- package/dist/utils/execute-shell.test.js.map +1 -0
- package/dist/utils/extract-command-messages.d.ts +5 -0
- package/dist/utils/extract-command-messages.d.ts.map +1 -0
- package/dist/utils/extract-command-messages.js +140 -0
- package/dist/utils/extract-command-messages.js.map +1 -0
- package/dist/utils/extract-command-messages.repro.test.d.ts +2 -0
- package/dist/utils/extract-command-messages.repro.test.d.ts.map +1 -0
- package/dist/utils/extract-command-messages.repro.test.js +31 -0
- package/dist/utils/extract-command-messages.repro.test.js.map +1 -0
- package/dist/utils/extract-command-messages.test.js +57 -0
- package/dist/utils/message-buffer.d.ts +2 -0
- package/dist/utils/message-buffer.d.ts.map +1 -0
- package/dist/utils/message-buffer.js +15 -0
- package/dist/utils/message-buffer.js.map +1 -0
- package/dist/utils/message-buffer.test.d.ts +2 -0
- package/dist/utils/message-buffer.test.d.ts.map +1 -0
- package/dist/utils/message-buffer.test.js +17 -0
- package/dist/utils/message-buffer.test.js.map +1 -0
- package/dist/utils/output-trim.d.ts +31 -0
- package/dist/utils/output-trim.d.ts.map +1 -0
- package/dist/utils/output-trim.js +71 -0
- package/dist/utils/output-trim.js.map +1 -0
- package/dist/utils/provider-credentials.d.ts +10 -0
- package/dist/utils/provider-credentials.d.ts.map +1 -0
- package/dist/utils/provider-credentials.js +22 -0
- package/dist/utils/provider-credentials.js.map +1 -0
- package/dist/utils/settings-command.d.ts +13 -0
- package/dist/utils/settings-command.d.ts.map +1 -0
- package/dist/utils/settings-command.js +173 -0
- package/dist/utils/settings-command.js.map +1 -0
- package/dist/utils/ssh-config-parser.d.ts +21 -0
- package/dist/utils/ssh-config-parser.d.ts.map +1 -0
- package/dist/utils/ssh-config-parser.js +89 -0
- package/dist/utils/ssh-config-parser.js.map +1 -0
- package/dist/utils/ssh-config-parser.test.d.ts +2 -0
- package/dist/utils/ssh-config-parser.test.d.ts.map +1 -0
- package/dist/utils/ssh-config-parser.test.js +153 -0
- package/dist/utils/ssh-config-parser.test.js.map +1 -0
- package/dist/utils/streaming-updater.d.ts +7 -0
- package/dist/utils/streaming-updater.d.ts.map +1 -0
- package/dist/utils/streaming-updater.js +41 -0
- package/dist/utils/streaming-updater.js.map +1 -0
- package/dist/utils/throttle.d.ts +7 -0
- package/dist/utils/throttle.d.ts.map +1 -0
- package/dist/utils/throttle.js +49 -0
- package/dist/utils/throttle.js.map +1 -0
- package/package.json +108 -0
- package/readme.md +428 -0
|
@@ -0,0 +1,653 @@
|
|
|
1
|
+
import { Agent, run, tool as createTool, webSearchTool, applyPatchTool, } from '@openai/agents';
|
|
2
|
+
import { APIConnectionError, APIConnectionTimeoutError, InternalServerError, RateLimitError, } from 'openai';
|
|
3
|
+
import { OpenRouterError } from '../providers/openrouter.js';
|
|
4
|
+
import { OpenAICompatibleError } from '../providers/openai-compatible/api.js';
|
|
5
|
+
import { getProvider } from '../providers/index.js';
|
|
6
|
+
import { randomUUID } from 'node:crypto';
|
|
7
|
+
import { getAgentDefinition } from '../agent.js';
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import os from 'os';
|
|
11
|
+
import { normalizeToolInput, wrapToolInvoke } from './tool-invoke.js';
|
|
12
|
+
import { createEditorImpl } from './editor-impl.js';
|
|
13
|
+
import { ConversationStore } from '../services/conversation-store.js';
|
|
14
|
+
/**
|
|
15
|
+
* Minimal adapter that isolates usage of @openai/agents.
|
|
16
|
+
* Swap this module to change the underlying agent provider without touching the UI.
|
|
17
|
+
*/
|
|
18
|
+
export class OpenAIAgentClient {
|
|
19
|
+
#agent;
|
|
20
|
+
#model;
|
|
21
|
+
// Accept 'default' here to denote 'do not pass this param; use API default'
|
|
22
|
+
#reasoningEffort;
|
|
23
|
+
#temperature;
|
|
24
|
+
#provider;
|
|
25
|
+
#maxTurns;
|
|
26
|
+
#retryAttempts;
|
|
27
|
+
#currentAbortController = null;
|
|
28
|
+
#currentCorrelationId = null;
|
|
29
|
+
#retryCallback = null;
|
|
30
|
+
#runner = null;
|
|
31
|
+
#toolInterceptors = [];
|
|
32
|
+
#logger;
|
|
33
|
+
#settings;
|
|
34
|
+
#executionContext;
|
|
35
|
+
#editor;
|
|
36
|
+
#mentorAgent = null;
|
|
37
|
+
#mentorStore = null;
|
|
38
|
+
#mentorPreviousResponseId = null;
|
|
39
|
+
constructor({ model, reasoningEffort, maxTurns, retryAttempts, deps, }) {
|
|
40
|
+
this.#logger = deps.logger;
|
|
41
|
+
this.#settings = deps.settings;
|
|
42
|
+
this.#executionContext = deps.executionContext;
|
|
43
|
+
this.#editor = createEditorImpl({
|
|
44
|
+
loggingService: this.#logger,
|
|
45
|
+
settingsService: this.#settings,
|
|
46
|
+
executionContext: this.#executionContext,
|
|
47
|
+
});
|
|
48
|
+
this.#reasoningEffort = reasoningEffort;
|
|
49
|
+
this.#temperature = this.#settings.get('agent.temperature');
|
|
50
|
+
this.#provider =
|
|
51
|
+
this.#settings.get('agent.provider') || 'openai';
|
|
52
|
+
this.#maxTurns = maxTurns ?? 20;
|
|
53
|
+
this.#retryAttempts = retryAttempts ?? 2;
|
|
54
|
+
this.#agent = this.#createAgent({ model, reasoningEffort });
|
|
55
|
+
this.#runner = this.#createRunner();
|
|
56
|
+
this.#logger.info('OpenAI Agent Client initialized', {
|
|
57
|
+
model: model || this.#settings.get('agent.model'),
|
|
58
|
+
reasoningEffort: reasoningEffort ?? 'default',
|
|
59
|
+
temperature: this.#temperature,
|
|
60
|
+
maxTurns: this.#maxTurns,
|
|
61
|
+
retryAttempts: this.#retryAttempts,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
setModel(model) {
|
|
65
|
+
this.#agent = this.#createAgent({
|
|
66
|
+
model,
|
|
67
|
+
reasoningEffort: this.#reasoningEffort,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
setReasoningEffort(effort) {
|
|
71
|
+
this.#reasoningEffort = effort;
|
|
72
|
+
this.#agent = this.#createAgent({
|
|
73
|
+
model: this.#model,
|
|
74
|
+
reasoningEffort: effort,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
setTemperature(temperature) {
|
|
78
|
+
this.#temperature = temperature;
|
|
79
|
+
this.#agent = this.#createAgent({
|
|
80
|
+
model: this.#model,
|
|
81
|
+
reasoningEffort: this.#reasoningEffort,
|
|
82
|
+
temperature,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
setProvider(provider) {
|
|
86
|
+
this.#provider = provider;
|
|
87
|
+
this.#settings.set('agent.provider', provider);
|
|
88
|
+
this.#agent = this.#createAgent({
|
|
89
|
+
model: this.#model,
|
|
90
|
+
reasoningEffort: this.#reasoningEffort,
|
|
91
|
+
});
|
|
92
|
+
this.#runner = this.#createRunner();
|
|
93
|
+
}
|
|
94
|
+
getProvider() {
|
|
95
|
+
return this.#provider;
|
|
96
|
+
}
|
|
97
|
+
addToolInterceptor(interceptor) {
|
|
98
|
+
this.#toolInterceptors.push(interceptor);
|
|
99
|
+
return () => {
|
|
100
|
+
this.#toolInterceptors = this.#toolInterceptors.filter(i => i !== interceptor);
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
async #checkToolInterceptors(name, params, toolCallId) {
|
|
104
|
+
for (const interceptor of this.#toolInterceptors) {
|
|
105
|
+
try {
|
|
106
|
+
const result = await interceptor(name, params, toolCallId);
|
|
107
|
+
if (result !== null) {
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
this.#logger.error('Tool interceptor threw an error', {
|
|
113
|
+
name,
|
|
114
|
+
params,
|
|
115
|
+
toolCallId,
|
|
116
|
+
error: error instanceof Error ? error.message : String(error),
|
|
117
|
+
});
|
|
118
|
+
return `Tool execution intercepted but failed: ${error instanceof Error ? error.message : String(error)}`;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
#createRunner() {
|
|
124
|
+
const providerDef = getProvider(this.#provider);
|
|
125
|
+
if (!providerDef?.createRunner) {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
return providerDef.createRunner({
|
|
129
|
+
settingsService: this.#settings,
|
|
130
|
+
loggingService: this.#logger,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
setRetryCallback(callback) {
|
|
134
|
+
this.#retryCallback = callback;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Abort the current running stream/operation
|
|
138
|
+
*/
|
|
139
|
+
abort() {
|
|
140
|
+
if (this.#currentAbortController) {
|
|
141
|
+
this.#currentAbortController.abort();
|
|
142
|
+
this.#currentAbortController = null;
|
|
143
|
+
}
|
|
144
|
+
if (this.#currentCorrelationId) {
|
|
145
|
+
this.#logger.clearCorrelationId();
|
|
146
|
+
this.#currentCorrelationId = null;
|
|
147
|
+
}
|
|
148
|
+
this.#logger.debug('Agent operation aborted');
|
|
149
|
+
}
|
|
150
|
+
clearConversations() {
|
|
151
|
+
const providerDef = getProvider(this.#provider);
|
|
152
|
+
if (providerDef?.clearConversations) {
|
|
153
|
+
providerDef.clearConversations();
|
|
154
|
+
}
|
|
155
|
+
// Also clear mentor conversation
|
|
156
|
+
if (this.#mentorStore) {
|
|
157
|
+
this.#mentorStore.clear();
|
|
158
|
+
}
|
|
159
|
+
this.#mentorPreviousResponseId = null;
|
|
160
|
+
this.#mentorAgent = null;
|
|
161
|
+
this.#mentorStore = null;
|
|
162
|
+
}
|
|
163
|
+
async startStream(userInput, { previousResponseId } = {}) {
|
|
164
|
+
// Abort any previous operation
|
|
165
|
+
this.abort();
|
|
166
|
+
// Create correlation ID for this stream
|
|
167
|
+
this.#currentCorrelationId = randomUUID();
|
|
168
|
+
this.#logger.setCorrelationId(this.#currentCorrelationId);
|
|
169
|
+
this.#currentAbortController = new AbortController();
|
|
170
|
+
const signal = this.#currentAbortController.signal;
|
|
171
|
+
this.#logger.info('Agent stream started', {
|
|
172
|
+
inputType: Array.isArray(userInput) ? 'array' : typeof userInput,
|
|
173
|
+
inputLength: typeof userInput === 'string' ? userInput.length : undefined,
|
|
174
|
+
inputItems: Array.isArray(userInput) ? userInput.length : undefined,
|
|
175
|
+
hasPreviousResponseId: !!previousResponseId,
|
|
176
|
+
});
|
|
177
|
+
try {
|
|
178
|
+
const options = {
|
|
179
|
+
stream: true,
|
|
180
|
+
maxTurns: this.#maxTurns,
|
|
181
|
+
signal,
|
|
182
|
+
};
|
|
183
|
+
// Only pass previousResponseId for OpenAI provider (server-managed conversation chaining)
|
|
184
|
+
if (this.#provider === 'openai' && previousResponseId) {
|
|
185
|
+
options.previousResponseId = previousResponseId;
|
|
186
|
+
}
|
|
187
|
+
const result = await this.#executeWithRetry(() => this.#runAgent(this.#agent, userInput, options));
|
|
188
|
+
return result;
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
this.#logger.error('Agent stream failed', {
|
|
192
|
+
error: error instanceof Error ? error.message : String(error),
|
|
193
|
+
inputType: Array.isArray(userInput)
|
|
194
|
+
? 'array'
|
|
195
|
+
: typeof userInput,
|
|
196
|
+
inputLength: typeof userInput === 'string'
|
|
197
|
+
? userInput.length
|
|
198
|
+
: undefined,
|
|
199
|
+
inputItems: Array.isArray(userInput)
|
|
200
|
+
? userInput.length
|
|
201
|
+
: undefined,
|
|
202
|
+
});
|
|
203
|
+
throw error;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
async continueRun(state, { previousResponseId } = {}) {
|
|
207
|
+
this.abort();
|
|
208
|
+
this.#currentAbortController = new AbortController();
|
|
209
|
+
const signal = this.#currentAbortController.signal;
|
|
210
|
+
const options = {
|
|
211
|
+
signal,
|
|
212
|
+
};
|
|
213
|
+
// Only pass previousResponseId for OpenAI provider (server-managed conversation chaining)
|
|
214
|
+
if (this.#provider === 'openai' && previousResponseId) {
|
|
215
|
+
options.previousResponseId = previousResponseId;
|
|
216
|
+
}
|
|
217
|
+
return this.#executeWithRetry(() => this.#runAgent(this.#agent, state, options));
|
|
218
|
+
}
|
|
219
|
+
async continueRunStream(state, { previousResponseId } = {}) {
|
|
220
|
+
this.abort();
|
|
221
|
+
this.#currentAbortController = new AbortController();
|
|
222
|
+
const signal = this.#currentAbortController.signal;
|
|
223
|
+
const options = {
|
|
224
|
+
stream: true,
|
|
225
|
+
maxTurns: this.#maxTurns,
|
|
226
|
+
signal,
|
|
227
|
+
};
|
|
228
|
+
// Only pass previousResponseId for OpenAI provider (server-managed conversation chaining)
|
|
229
|
+
if (this.#provider === 'openai' && previousResponseId) {
|
|
230
|
+
options.previousResponseId = previousResponseId;
|
|
231
|
+
}
|
|
232
|
+
return this.#executeWithRetry(() => this.#runAgent(this.#agent, state, options));
|
|
233
|
+
}
|
|
234
|
+
#runAgent(agent, input, options) {
|
|
235
|
+
// The Agents SDK enables tracing by default and exports spans to OpenAI.
|
|
236
|
+
// When using non-OpenAI providers (e.g., OpenRouter), this export can fail noisily
|
|
237
|
+
// (e.g., 503 errors). Disable tracing per-run for any non-OpenAI provider.
|
|
238
|
+
const effectiveOptions = options ? { ...options } : {};
|
|
239
|
+
if (this.#provider !== 'openai') {
|
|
240
|
+
effectiveOptions.tracingDisabled = true;
|
|
241
|
+
}
|
|
242
|
+
// Check if provider is configured but runner failed to initialize
|
|
243
|
+
if (!this.#runner && this.#provider !== 'openai') {
|
|
244
|
+
const providerDef = getProvider(this.#provider);
|
|
245
|
+
const providerLabel = providerDef?.label || this.#provider;
|
|
246
|
+
throw new Error(`${providerLabel} is configured but could not be initialized. ` +
|
|
247
|
+
`Please check that all required credentials are set. ` +
|
|
248
|
+
`For OpenRouter, set OPENROUTER_API_KEY environment variable. ` +
|
|
249
|
+
`Get your API key from: https://openrouter.ai/keys`);
|
|
250
|
+
}
|
|
251
|
+
// Use runner if available (custom provider), otherwise use run() directly (OpenAI)
|
|
252
|
+
if (this.#runner) {
|
|
253
|
+
return this.#runner.run(agent, input, effectiveOptions);
|
|
254
|
+
}
|
|
255
|
+
return run(agent, input, effectiveOptions);
|
|
256
|
+
}
|
|
257
|
+
async #executeWithRetry(operation, retries = this.#retryAttempts) {
|
|
258
|
+
try {
|
|
259
|
+
return await operation();
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
// Determine if the error is retryable
|
|
263
|
+
// UserError and ModelBehaviorError are NOT retried (logic errors, not transient)
|
|
264
|
+
const isTransientError = error instanceof APIConnectionError ||
|
|
265
|
+
error instanceof APIConnectionTimeoutError ||
|
|
266
|
+
error instanceof InternalServerError ||
|
|
267
|
+
error instanceof RateLimitError;
|
|
268
|
+
// Check if it's an OpenRouter error with retryable status
|
|
269
|
+
const isOpenRouterRetryable = error instanceof OpenRouterError &&
|
|
270
|
+
(error.status === 429 || error.status >= 500);
|
|
271
|
+
const isOpenAICompatibleRetryable = error instanceof OpenAICompatibleError &&
|
|
272
|
+
(error.status === 429 || error.status >= 500);
|
|
273
|
+
const isRetryable = retries > 0 &&
|
|
274
|
+
(isTransientError ||
|
|
275
|
+
isOpenRouterRetryable ||
|
|
276
|
+
isOpenAICompatibleRetryable);
|
|
277
|
+
if (isRetryable) {
|
|
278
|
+
const attemptIndex = this.#retryAttempts - retries;
|
|
279
|
+
let delay;
|
|
280
|
+
// Check for Retry-After header (both OpenAI and OpenRouter)
|
|
281
|
+
const retryAfterHeader = (error instanceof RateLimitError &&
|
|
282
|
+
error.headers?.['retry-after']) ||
|
|
283
|
+
(error instanceof OpenRouterError &&
|
|
284
|
+
error.headers['retry-after']) ||
|
|
285
|
+
(error instanceof OpenAICompatibleError &&
|
|
286
|
+
error.headers['retry-after']);
|
|
287
|
+
if (retryAfterHeader) {
|
|
288
|
+
// Respect the Retry-After header
|
|
289
|
+
delay = parseInt(retryAfterHeader, 10) * 1000;
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
// Exponential backoff with full jitter
|
|
293
|
+
// Base delay: 500-1000ms
|
|
294
|
+
// Multiplier: 2^attemptIndex
|
|
295
|
+
// Max cap: 30 seconds
|
|
296
|
+
const baseDelay = 500 + Math.random() * 500; // 500-1000ms
|
|
297
|
+
const exponentialDelay = baseDelay * Math.pow(2, attemptIndex);
|
|
298
|
+
const maxDelay = 30000; // 30 seconds
|
|
299
|
+
const cappedDelay = Math.min(exponentialDelay, maxDelay);
|
|
300
|
+
// Apply full jitter: random value between 0 and cappedDelay
|
|
301
|
+
delay = Math.random() * cappedDelay;
|
|
302
|
+
}
|
|
303
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
304
|
+
this.#logger.warn('Agent operation retry', {
|
|
305
|
+
errorType: error.constructor.name,
|
|
306
|
+
retriesRemaining: retries - 1,
|
|
307
|
+
delayMs: Math.round(delay),
|
|
308
|
+
attemptIndex,
|
|
309
|
+
errorMessage: error instanceof Error ? error.message : String(error),
|
|
310
|
+
...(error instanceof OpenRouterError && {
|
|
311
|
+
status: error.status,
|
|
312
|
+
}),
|
|
313
|
+
...(error instanceof OpenAICompatibleError && {
|
|
314
|
+
status: error.status,
|
|
315
|
+
}),
|
|
316
|
+
});
|
|
317
|
+
this.#retryCallback?.();
|
|
318
|
+
return this.#executeWithRetry(operation, retries - 1);
|
|
319
|
+
}
|
|
320
|
+
throw error;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
async chat(message, options = {}) {
|
|
324
|
+
this.#logger.debug('Agent chat request', {
|
|
325
|
+
messageLength: message.length,
|
|
326
|
+
model: options.model || this.#model,
|
|
327
|
+
});
|
|
328
|
+
try {
|
|
329
|
+
// Create a temporary agent for this specific chat request if params differ
|
|
330
|
+
let agentForChat = this.#agent;
|
|
331
|
+
if (options.model || options.reasoningEffort) {
|
|
332
|
+
const tempModel = options.model || this.#model;
|
|
333
|
+
const tempEffort = options.reasoningEffort || this.#reasoningEffort;
|
|
334
|
+
const modelSettings = {};
|
|
335
|
+
if (tempEffort && tempEffort !== 'default') {
|
|
336
|
+
modelSettings.reasoning = {
|
|
337
|
+
effort: tempEffort,
|
|
338
|
+
summary: 'auto',
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
// For simple chat, we generally don't need tools, but we keep the system instructions
|
|
342
|
+
// Actually, for mentor mode, we might want a simpler agent without tools
|
|
343
|
+
agentForChat = new Agent({
|
|
344
|
+
name: 'Mentor',
|
|
345
|
+
model: tempModel,
|
|
346
|
+
...(Object.keys(modelSettings).length > 0
|
|
347
|
+
? { modelSettings }
|
|
348
|
+
: {}),
|
|
349
|
+
instructions: options.instructions || 'You are a helpful mentor assistant.',
|
|
350
|
+
});
|
|
351
|
+
// Ensure runner is compatible or use run()
|
|
352
|
+
if (!this.#runner && this.#provider !== 'openai') {
|
|
353
|
+
// Logic to ensure runner exists... same as #runAgent
|
|
354
|
+
const providerDef = getProvider(this.#provider);
|
|
355
|
+
if (!providerDef)
|
|
356
|
+
throw new Error(`Provider ${this.#provider} not found`);
|
|
357
|
+
if (providerDef.createRunner) {
|
|
358
|
+
// We can't easily reuse the main runner if it's bound to the main agent
|
|
359
|
+
// But creating a new runner for every chat might be expensive?
|
|
360
|
+
// For now, let's assume we can just use `run` if no tools are needed,
|
|
361
|
+
// but some providers NEED a runner.
|
|
362
|
+
// Actually, most providers' runners are stateless or lightweight wrappers.
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
// We use a simplified run flow for chat
|
|
367
|
+
const result = await this.#runAgent(agentForChat, message, {
|
|
368
|
+
stream: false,
|
|
369
|
+
maxTurns: 1, // Chat is usually single turn
|
|
370
|
+
});
|
|
371
|
+
if (result.finalOutput) {
|
|
372
|
+
return result.finalOutput;
|
|
373
|
+
}
|
|
374
|
+
// Fallback: extract from messages if finalOutput is missing
|
|
375
|
+
if (result.messages && Array.isArray(result.messages)) {
|
|
376
|
+
const lastMessage = result.messages[result.messages.length - 1];
|
|
377
|
+
if (lastMessage && lastMessage.content) {
|
|
378
|
+
if (typeof lastMessage.content === 'string') {
|
|
379
|
+
return lastMessage.content;
|
|
380
|
+
}
|
|
381
|
+
if (Array.isArray(lastMessage.content)) {
|
|
382
|
+
return lastMessage.content
|
|
383
|
+
.map((part) => part.text || part.value || '')
|
|
384
|
+
.join('');
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
return '';
|
|
389
|
+
}
|
|
390
|
+
catch (error) {
|
|
391
|
+
this.#logger.error('Agent chat failed', {
|
|
392
|
+
error: error instanceof Error ? error.message : String(error),
|
|
393
|
+
});
|
|
394
|
+
throw error; // Propagate error
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
#getAgentsInstructions() {
|
|
398
|
+
const agentsPath = path.join(process.cwd(), 'AGENTS.md');
|
|
399
|
+
if (!fs.existsSync(agentsPath))
|
|
400
|
+
return '';
|
|
401
|
+
try {
|
|
402
|
+
const contents = fs.readFileSync(agentsPath, 'utf-8').trim();
|
|
403
|
+
return `\n\nAGENTS.md contents:\n${contents}`;
|
|
404
|
+
}
|
|
405
|
+
catch (e) {
|
|
406
|
+
return `\n\nFailed to read AGENTS.md: ${e.message}`;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
#getEnvInfo() {
|
|
410
|
+
return `OS: ${os.type()} ${os.release()} (${os.platform()}); shell: ${this.#settings.get('app.shellPath') || 'unknown'}; cwd: ${process.cwd()}`;
|
|
411
|
+
}
|
|
412
|
+
#createMentor = async (question) => {
|
|
413
|
+
const mentorModel = this.#settings.get('agent.mentorModel');
|
|
414
|
+
if (!mentorModel) {
|
|
415
|
+
throw new Error('Mentor model is not configured');
|
|
416
|
+
}
|
|
417
|
+
const mentorMode = this.#settings.get('app.mentorMode');
|
|
418
|
+
// Different instructions based on mode
|
|
419
|
+
let baseInstructions = mentorMode
|
|
420
|
+
? 'You are a senior architect acting as a peer reviewer. You have no codebase access—you rely on what the user reports.\n\n' +
|
|
421
|
+
'Your role is adversarial review, not rubber-stamping:\n' +
|
|
422
|
+
'- Challenge assumptions, even when reasoning sounds solid\n' +
|
|
423
|
+
'- Probe for gaps: what did they not check? What could go wrong?\n' +
|
|
424
|
+
'- Suggest alternatives they may have dismissed too quickly\n' +
|
|
425
|
+
'- Ask for evidence when confidence seems misplaced\n\n' +
|
|
426
|
+
'When satisfied, give clear approval with specific next steps. When not, say exactly what needs more investigation.\n\n' +
|
|
427
|
+
'Be concise. Push back hard, but don\'t block unnecessarily.'
|
|
428
|
+
: 'You are a helpful mentor assistant. Provide advice and guidance on technical problems. Be concise and actionable.';
|
|
429
|
+
// Add environment info and AGENTS.md context
|
|
430
|
+
const instructions = `${baseInstructions}\n\nEnvironment: ${this.#getEnvInfo()}${this.#getAgentsInstructions()}`;
|
|
431
|
+
// Initialize mentor agent and conversation store if needed
|
|
432
|
+
if (!this.#mentorAgent) {
|
|
433
|
+
const reasoningEffort = this.#settings.get('agent.mentorReasoningEffort');
|
|
434
|
+
const modelSettings = {};
|
|
435
|
+
if (reasoningEffort && reasoningEffort !== 'default') {
|
|
436
|
+
modelSettings.reasoning = {
|
|
437
|
+
effort: reasoningEffort,
|
|
438
|
+
summary: 'auto',
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
this.#mentorAgent = new Agent({
|
|
442
|
+
name: 'Mentor',
|
|
443
|
+
model: mentorModel,
|
|
444
|
+
...(Object.keys(modelSettings).length > 0
|
|
445
|
+
? { modelSettings }
|
|
446
|
+
: {}),
|
|
447
|
+
instructions,
|
|
448
|
+
});
|
|
449
|
+
this.#mentorStore = new ConversationStore();
|
|
450
|
+
}
|
|
451
|
+
try {
|
|
452
|
+
// Add user message to conversation history
|
|
453
|
+
this.#mentorStore.addUserMessage(question);
|
|
454
|
+
// Determine input based on provider
|
|
455
|
+
// OpenAI uses previousResponseId for server-side history
|
|
456
|
+
// Others need full conversation history from store
|
|
457
|
+
const input = this.#provider !== 'openai'
|
|
458
|
+
? this.#mentorStore.getHistory()
|
|
459
|
+
: question;
|
|
460
|
+
const result = await this.#runAgent(this.#mentorAgent, input, {
|
|
461
|
+
stream: false,
|
|
462
|
+
maxTurns: 1,
|
|
463
|
+
...(this.#provider === 'openai' && this.#mentorPreviousResponseId
|
|
464
|
+
? { previousResponseId: this.#mentorPreviousResponseId }
|
|
465
|
+
: {}),
|
|
466
|
+
});
|
|
467
|
+
// Update conversation store with result
|
|
468
|
+
this.#mentorStore.updateFromResult(result);
|
|
469
|
+
// Track previousResponseId for OpenAI
|
|
470
|
+
if (result.responseId) {
|
|
471
|
+
this.#mentorPreviousResponseId = result.responseId;
|
|
472
|
+
}
|
|
473
|
+
// Extract response
|
|
474
|
+
let response = '';
|
|
475
|
+
if (result.finalOutput) {
|
|
476
|
+
response = result.finalOutput;
|
|
477
|
+
}
|
|
478
|
+
else if (result.messages && Array.isArray(result.messages)) {
|
|
479
|
+
const lastMessage = result.messages[result.messages.length - 1];
|
|
480
|
+
if (lastMessage && lastMessage.content) {
|
|
481
|
+
if (typeof lastMessage.content === 'string') {
|
|
482
|
+
response = lastMessage.content;
|
|
483
|
+
}
|
|
484
|
+
else if (Array.isArray(lastMessage.content)) {
|
|
485
|
+
response = lastMessage.content
|
|
486
|
+
.map((part) => part.text || part.value || '')
|
|
487
|
+
.join('');
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
return response;
|
|
492
|
+
}
|
|
493
|
+
catch (error) {
|
|
494
|
+
this.#logger.error('Mentor consultation failed', {
|
|
495
|
+
error: error instanceof Error ? error.message : String(error),
|
|
496
|
+
});
|
|
497
|
+
throw error;
|
|
498
|
+
}
|
|
499
|
+
};
|
|
500
|
+
#createAgent({ model, reasoningEffort, temperature, } = {}) {
|
|
501
|
+
const resolvedModel = model?.trim() || this.#settings.get('agent.model');
|
|
502
|
+
this.#model = resolvedModel;
|
|
503
|
+
const resolvedTemperature = temperature ??
|
|
504
|
+
this.#settings.get('agent.temperature');
|
|
505
|
+
const { name, instructions, tools: toolDefinitions, } = getAgentDefinition({
|
|
506
|
+
settingsService: this.#settings,
|
|
507
|
+
loggingService: this.#logger,
|
|
508
|
+
executionContext: this.#executionContext,
|
|
509
|
+
// @ts-ignore - Definition update coming next
|
|
510
|
+
askMentor: this.#createMentor,
|
|
511
|
+
}, resolvedModel);
|
|
512
|
+
// Determine if we should use the native applyPatchTool
|
|
513
|
+
const shouldUseNativePatchTool = this.#provider === 'openai' && resolvedModel.startsWith('gpt-5.1');
|
|
514
|
+
const tools = toolDefinitions
|
|
515
|
+
.filter(definition => {
|
|
516
|
+
// Exclude custom apply_patch if we're using native one
|
|
517
|
+
if (shouldUseNativePatchTool &&
|
|
518
|
+
definition.name === 'apply_patch') {
|
|
519
|
+
return false;
|
|
520
|
+
}
|
|
521
|
+
return true;
|
|
522
|
+
})
|
|
523
|
+
.map(definition => wrapToolInvoke(createTool({
|
|
524
|
+
name: definition.name,
|
|
525
|
+
description: definition.description,
|
|
526
|
+
parameters: definition.parameters,
|
|
527
|
+
needsApproval: async (context, params) => definition.needsApproval(params, context),
|
|
528
|
+
execute: async (params, _context, details) => {
|
|
529
|
+
// Extract tool call ID from details if available
|
|
530
|
+
const toolCallId = details?.toolCall?.callId;
|
|
531
|
+
// Check if this execution should be intercepted
|
|
532
|
+
const rejectionMessage = await this.#checkToolInterceptors(definition.name, params, toolCallId);
|
|
533
|
+
if (rejectionMessage) {
|
|
534
|
+
this.#logger.info('Tool execution intercepted', {
|
|
535
|
+
tool: definition.name,
|
|
536
|
+
params: JSON.stringify(params).substring(0, 100),
|
|
537
|
+
});
|
|
538
|
+
// Return a failure response that all tools should understand
|
|
539
|
+
return JSON.stringify({
|
|
540
|
+
output: [
|
|
541
|
+
{
|
|
542
|
+
success: false,
|
|
543
|
+
error: rejectionMessage,
|
|
544
|
+
},
|
|
545
|
+
],
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
// Normal execution
|
|
549
|
+
return definition.execute(params, _context);
|
|
550
|
+
},
|
|
551
|
+
})));
|
|
552
|
+
// Add native applyPatchTool for gpt-5.1 on OpenAI provider
|
|
553
|
+
if (shouldUseNativePatchTool) {
|
|
554
|
+
const nativePatchTool = applyPatchTool({
|
|
555
|
+
editor: this.#editor,
|
|
556
|
+
needsApproval: false, // Default to auto-approve for now
|
|
557
|
+
}); // Type assertion needed as invoke is not in public API
|
|
558
|
+
// Wrap the native tool's invoke function to apply interceptor check
|
|
559
|
+
const originalInvoke = nativePatchTool.invoke;
|
|
560
|
+
if (originalInvoke) {
|
|
561
|
+
nativePatchTool.invoke = async (runContext, input, details) => {
|
|
562
|
+
// Extract tool call ID from details if available
|
|
563
|
+
const toolCallId = details?.toolCall?.callId;
|
|
564
|
+
// Parse input to get params for logging
|
|
565
|
+
const normalizedInput = normalizeToolInput(input);
|
|
566
|
+
let params;
|
|
567
|
+
try {
|
|
568
|
+
params =
|
|
569
|
+
typeof input === 'string'
|
|
570
|
+
? JSON.parse(input)
|
|
571
|
+
: input;
|
|
572
|
+
}
|
|
573
|
+
catch {
|
|
574
|
+
params = input;
|
|
575
|
+
}
|
|
576
|
+
const rejectionMessage = await this.#checkToolInterceptors('apply_patch', params, toolCallId);
|
|
577
|
+
if (rejectionMessage) {
|
|
578
|
+
this.#logger.info('Native tool execution intercepted', {
|
|
579
|
+
tool: 'apply_patch',
|
|
580
|
+
toolCallId,
|
|
581
|
+
params: JSON.stringify(params).substring(0, 100),
|
|
582
|
+
});
|
|
583
|
+
return JSON.stringify({
|
|
584
|
+
output: [
|
|
585
|
+
{
|
|
586
|
+
success: false,
|
|
587
|
+
error: rejectionMessage,
|
|
588
|
+
},
|
|
589
|
+
],
|
|
590
|
+
});
|
|
591
|
+
}
|
|
592
|
+
return originalInvoke.call(nativePatchTool, runContext, normalizedInput, details);
|
|
593
|
+
};
|
|
594
|
+
}
|
|
595
|
+
tools.push(nativePatchTool);
|
|
596
|
+
this.#logger.info('Using native applyPatchTool from SDK', {
|
|
597
|
+
model: resolvedModel,
|
|
598
|
+
provider: this.#provider,
|
|
599
|
+
});
|
|
600
|
+
}
|
|
601
|
+
else {
|
|
602
|
+
this.#logger.info('Using custom apply_patch implementation', {
|
|
603
|
+
model: resolvedModel,
|
|
604
|
+
provider: this.#provider,
|
|
605
|
+
});
|
|
606
|
+
}
|
|
607
|
+
// Add web search tool. If the user explicitly selected 'minimal' we
|
|
608
|
+
// disable it; if they selected 'default', we don't influence the
|
|
609
|
+
// decision and leave the web tool enabled.
|
|
610
|
+
if (reasoningEffort !== 'minimal') {
|
|
611
|
+
const webTool = webSearchTool();
|
|
612
|
+
// Note: webSearchTool is a HostedTool that runs server-side and cannot be intercepted
|
|
613
|
+
// the same way as FunctionTools. Interception for hosted tools would need to be
|
|
614
|
+
// handled differently, likely through approval mechanisms.
|
|
615
|
+
tools.push(webTool);
|
|
616
|
+
}
|
|
617
|
+
// Build modelSettings only if an explicit effort value (other than
|
|
618
|
+
// 'default') was provided. 'default' means we should not pass the
|
|
619
|
+
// effort param and allow the underlying API to choose the default.
|
|
620
|
+
const modelSettings = {};
|
|
621
|
+
if (reasoningEffort && reasoningEffort !== 'default') {
|
|
622
|
+
modelSettings.reasoning = {
|
|
623
|
+
effort: reasoningEffort,
|
|
624
|
+
summary: 'auto',
|
|
625
|
+
};
|
|
626
|
+
}
|
|
627
|
+
// Temperature: only pass when explicitly set (number). Undefined means
|
|
628
|
+
// provider/model default.
|
|
629
|
+
if (typeof resolvedTemperature === 'number' &&
|
|
630
|
+
Number.isFinite(resolvedTemperature)) {
|
|
631
|
+
modelSettings.temperature = resolvedTemperature;
|
|
632
|
+
}
|
|
633
|
+
const agent = new Agent({
|
|
634
|
+
name,
|
|
635
|
+
model: resolvedModel,
|
|
636
|
+
...(Object.keys(modelSettings).length > 0 ? { modelSettings } : {}),
|
|
637
|
+
instructions,
|
|
638
|
+
tools,
|
|
639
|
+
});
|
|
640
|
+
// Only add defaultRunOptions if an explicit effort is set (not
|
|
641
|
+
// 'default'). This ensures the API receives the param only when
|
|
642
|
+
// intended.
|
|
643
|
+
if (reasoningEffort && reasoningEffort !== 'default') {
|
|
644
|
+
agent.defaultRunOptions = {
|
|
645
|
+
...(agent.defaultRunOptions || {}),
|
|
646
|
+
// Pass through to underlying client for models that support it
|
|
647
|
+
reasoning: { effort: reasoningEffort },
|
|
648
|
+
};
|
|
649
|
+
}
|
|
650
|
+
return agent;
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
//# sourceMappingURL=openai-agent-client.js.map
|