@qduc/term2 0.3.1 → 0.5.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/dist/agent.d.ts +5 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +54 -7
- package/dist/agent.js.map +1 -1
- package/dist/agent.lite-mode.test.d.ts +2 -0
- package/dist/agent.lite-mode.test.d.ts.map +1 -0
- package/dist/agent.lite-mode.test.js +39 -0
- package/dist/agent.lite-mode.test.js.map +1 -0
- package/dist/agent.test.d.ts +2 -0
- package/dist/agent.test.d.ts.map +1 -0
- package/dist/agent.test.js +198 -0
- package/dist/agent.test.js.map +1 -0
- package/dist/app.d.ts +5 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +36 -14
- package/dist/app.js.map +1 -1
- package/dist/app.startup-banner.test.d.ts +2 -0
- package/dist/app.startup-banner.test.d.ts.map +1 -0
- package/dist/app.startup-banner.test.js +11 -0
- package/dist/app.startup-banner.test.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +18 -3
- package/dist/cli.js.map +1 -1
- package/dist/components/ApprovalPrompt.d.ts.map +1 -1
- package/dist/components/ApprovalPrompt.js +13 -12
- package/dist/components/ApprovalPrompt.js.map +1 -1
- package/dist/components/ApprovalPrompt.test.d.ts +2 -0
- package/dist/components/ApprovalPrompt.test.d.ts.map +1 -0
- package/dist/components/ApprovalPrompt.test.js +23 -0
- package/dist/components/ApprovalPrompt.test.js.map +1 -0
- package/dist/components/Banner.js +1 -1
- package/dist/components/Banner.js.map +1 -1
- package/dist/components/BottomArea.d.ts.map +1 -1
- package/dist/components/BottomArea.js +3 -4
- package/dist/components/BottomArea.js.map +1 -1
- package/dist/components/ChatMessage.d.ts +1 -0
- package/dist/components/ChatMessage.d.ts.map +1 -1
- package/dist/components/ChatMessage.js +3 -2
- package/dist/components/ChatMessage.js.map +1 -1
- package/dist/components/CommandMessage.d.ts.map +1 -1
- package/dist/components/CommandMessage.js +54 -8
- package/dist/components/CommandMessage.js.map +1 -1
- package/dist/components/CommandMessage.test.js +90 -0
- package/dist/components/CommandMessage.test.js.map +1 -1
- package/dist/components/Input/PopupManager.d.ts +3 -0
- package/dist/components/Input/PopupManager.d.ts.map +1 -1
- package/dist/components/Input/PopupManager.js +2 -2
- package/dist/components/Input/PopupManager.js.map +1 -1
- package/dist/components/Input/insertions.d.ts.map +1 -1
- package/dist/components/Input/insertions.js +2 -2
- package/dist/components/Input/insertions.js.map +1 -1
- package/dist/components/Input/popup-key-navigation.d.ts +18 -0
- package/dist/components/Input/popup-key-navigation.d.ts.map +1 -0
- package/dist/components/Input/popup-key-navigation.js +16 -0
- package/dist/components/Input/popup-key-navigation.js.map +1 -0
- package/dist/components/Input/popup-key-navigation.test.d.ts +2 -0
- package/dist/components/Input/popup-key-navigation.test.d.ts.map +1 -0
- package/dist/components/Input/popup-key-navigation.test.js +73 -0
- package/dist/components/Input/popup-key-navigation.test.js.map +1 -0
- package/dist/components/Input/popup-props.d.ts.map +1 -1
- package/dist/components/Input/popup-props.js +2 -0
- package/dist/components/Input/popup-props.js.map +1 -1
- package/dist/components/Input/triggers.d.ts +1 -0
- package/dist/components/Input/triggers.d.ts.map +1 -1
- package/dist/components/Input/triggers.js +1 -0
- package/dist/components/Input/triggers.js.map +1 -1
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +130 -6
- package/dist/components/InputBox.js.map +1 -1
- package/dist/components/InputBox.test.js +42 -1
- package/dist/components/InputBox.test.js.map +1 -1
- package/dist/components/LiveResponse.d.ts +1 -3
- package/dist/components/LiveResponse.d.ts.map +1 -1
- package/dist/components/LiveResponse.js +5 -6
- package/dist/components/LiveResponse.js.map +1 -1
- package/dist/components/LiveResponse.test.d.ts +2 -0
- package/dist/components/LiveResponse.test.d.ts.map +1 -0
- package/dist/components/LiveResponse.test.js +13 -0
- package/dist/components/LiveResponse.test.js.map +1 -0
- package/dist/components/MarkdownRenderer.d.ts +5 -2
- package/dist/components/MarkdownRenderer.d.ts.map +1 -1
- package/dist/components/MarkdownRenderer.js +77 -49
- package/dist/components/MarkdownRenderer.js.map +1 -1
- package/dist/components/MessageList.d.ts +7 -1
- package/dist/components/MessageList.d.ts.map +1 -1
- package/dist/components/MessageList.js +150 -23
- package/dist/components/MessageList.js.map +1 -1
- package/dist/components/MessageList.test.js +289 -4
- package/dist/components/MessageList.test.js.map +1 -1
- package/dist/components/ModelSelectionMenu.d.ts.map +1 -1
- package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts +2 -0
- package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts.map +1 -0
- package/dist/components/ModelSelectionMenu.error-tabs.test.js +18 -0
- package/dist/components/ModelSelectionMenu.error-tabs.test.js.map +1 -0
- package/dist/components/ModelSelectionMenu.js +54 -14
- package/dist/components/ModelSelectionMenu.js.map +1 -1
- package/dist/components/PathSelectionMenu.d.ts +2 -0
- package/dist/components/PathSelectionMenu.d.ts.map +1 -1
- package/dist/components/PathSelectionMenu.js +31 -12
- package/dist/components/PathSelectionMenu.js.map +1 -1
- package/dist/components/SettingsSelectionMenu.d.ts +1 -0
- package/dist/components/SettingsSelectionMenu.d.ts.map +1 -1
- package/dist/components/SettingsSelectionMenu.js +32 -23
- package/dist/components/SettingsSelectionMenu.js.map +1 -1
- package/dist/components/SettingsSelectionMenu.scroll.test.d.ts +2 -0
- package/dist/components/SettingsSelectionMenu.scroll.test.d.ts.map +1 -0
- package/dist/components/SettingsSelectionMenu.scroll.test.js +23 -0
- package/dist/components/SettingsSelectionMenu.scroll.test.js.map +1 -0
- package/dist/components/StatusBar.d.ts.map +1 -1
- package/dist/components/StatusBar.js +15 -15
- package/dist/components/StatusBar.js.map +1 -1
- package/dist/components/StatusBar.test.d.ts +2 -0
- package/dist/components/StatusBar.test.d.ts.map +1 -0
- package/dist/components/StatusBar.test.js +30 -0
- package/dist/components/StatusBar.test.js.map +1 -0
- package/dist/components/SubagentActivityMessage.d.ts +12 -0
- package/dist/components/SubagentActivityMessage.d.ts.map +1 -0
- package/dist/components/SubagentActivityMessage.js +15 -0
- package/dist/components/SubagentActivityMessage.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 +398 -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/components/theme.d.ts +8 -0
- package/dist/components/theme.d.ts.map +1 -0
- package/dist/components/theme.js +22 -0
- package/dist/components/theme.js.map +1 -0
- package/dist/contracts/conversation.d.ts +1 -0
- package/dist/contracts/conversation.d.ts.map +1 -1
- package/dist/debug_ask_mentor.d.ts +2 -0
- package/dist/debug_ask_mentor.d.ts.map +1 -0
- package/dist/debug_ask_mentor.js +73 -0
- package/dist/debug_ask_mentor.js.map +1 -0
- package/dist/env-setup.d.ts +2 -0
- package/dist/env-setup.d.ts.map +1 -0
- package/dist/env-setup.js +7 -0
- package/dist/env-setup.js.map +1 -0
- package/dist/env-setup.test.d.ts +2 -0
- package/dist/env-setup.test.d.ts.map +1 -0
- package/dist/env-setup.test.js +6 -0
- package/dist/env-setup.test.js.map +1 -0
- package/dist/hooks/path-completion-filter.d.ts +4 -0
- package/dist/hooks/path-completion-filter.d.ts.map +1 -0
- package/dist/hooks/path-completion-filter.js +27 -0
- package/dist/hooks/path-completion-filter.js.map +1 -0
- package/dist/hooks/path-completion-filter.test.d.ts +2 -0
- package/dist/hooks/path-completion-filter.test.d.ts.map +1 -0
- package/dist/hooks/path-completion-filter.test.js +100 -0
- package/dist/hooks/path-completion-filter.test.js.map +1 -0
- package/dist/hooks/use-app-commands.d.ts +9 -1
- package/dist/hooks/use-app-commands.d.ts.map +1 -1
- package/dist/hooks/use-app-commands.js +97 -26
- package/dist/hooks/use-app-commands.js.map +1 -1
- package/dist/hooks/use-app-commands.test.js +53 -3
- package/dist/hooks/use-app-commands.test.js.map +1 -1
- package/dist/hooks/use-conversation.d.ts +14 -8
- package/dist/hooks/use-conversation.d.ts.map +1 -1
- package/dist/hooks/use-conversation.js +59 -61
- package/dist/hooks/use-conversation.js.map +1 -1
- package/dist/hooks/use-mode-handlers.d.ts +3 -1
- package/dist/hooks/use-mode-handlers.d.ts.map +1 -1
- package/dist/hooks/use-mode-handlers.js +8 -0
- package/dist/hooks/use-mode-handlers.js.map +1 -1
- package/dist/hooks/use-model-selection.d.ts +1 -1
- package/dist/hooks/use-model-selection.d.ts.map +1 -1
- package/dist/hooks/use-model-selection.js +31 -16
- package/dist/hooks/use-model-selection.js.map +1 -1
- package/dist/hooks/use-model-selection.test.js +66 -1
- package/dist/hooks/use-model-selection.test.js.map +1 -1
- package/dist/hooks/use-path-completion.d.ts +1 -0
- package/dist/hooks/use-path-completion.d.ts.map +1 -1
- package/dist/hooks/use-path-completion.js +22 -17
- package/dist/hooks/use-path-completion.js.map +1 -1
- package/dist/hooks/use-settings-completion.d.ts +2 -2
- package/dist/hooks/use-settings-completion.d.ts.map +1 -1
- package/dist/hooks/use-settings-completion.js +53 -18
- package/dist/hooks/use-settings-completion.js.map +1 -1
- package/dist/hooks/use-settings-completion.scroll.test.d.ts +2 -0
- package/dist/hooks/use-settings-completion.scroll.test.d.ts.map +1 -0
- package/dist/hooks/use-settings-completion.scroll.test.js +55 -0
- package/dist/hooks/use-settings-completion.scroll.test.js.map +1 -0
- package/dist/hooks/use-settings-completion.test.js +69 -79
- package/dist/hooks/use-settings-completion.test.js.map +1 -1
- package/dist/hooks/use-settings-value-completion.d.ts +1 -2
- package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
- package/dist/hooks/use-settings-value-completion.js +47 -19
- package/dist/hooks/use-settings-value-completion.js.map +1 -1
- package/dist/hooks/use-settings-value-completion.test.js +5 -18
- package/dist/hooks/use-settings-value-completion.test.js.map +1 -1
- package/dist/hooks/use-slash-commands.d.ts +7 -0
- package/dist/hooks/use-slash-commands.d.ts.map +1 -1
- package/dist/hooks/use-slash-commands.js +20 -13
- package/dist/hooks/use-slash-commands.js.map +1 -1
- package/dist/hooks/use-slash-commands.test.js +52 -1
- package/dist/hooks/use-slash-commands.test.js.map +1 -1
- package/dist/hooks/use-trigger-detection.d.ts.map +1 -1
- package/dist/hooks/use-trigger-detection.js +7 -3
- package/dist/hooks/use-trigger-detection.js.map +1 -1
- package/dist/hooks/use-trigger-detection.test.d.ts +2 -0
- package/dist/hooks/use-trigger-detection.test.d.ts.map +1 -0
- package/dist/hooks/use-trigger-detection.test.js +59 -0
- package/dist/hooks/use-trigger-detection.test.js.map +1 -0
- package/dist/lib/editor-impl.test.js +63 -50
- package/dist/lib/editor-impl.test.js.map +1 -1
- package/dist/lib/openai-agent-client.d.ts +28 -0
- package/dist/lib/openai-agent-client.d.ts.map +1 -1
- package/dist/lib/openai-agent-client.js +82 -143
- package/dist/lib/openai-agent-client.js.map +1 -1
- package/dist/lib/openai-agent-client.test.js +70 -0
- package/dist/lib/openai-agent-client.test.js.map +1 -1
- 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 +3 -2
- package/dist/lib/tool-invoke.d.ts.map +1 -1
- package/dist/lib/tool-invoke.js +69 -4
- package/dist/lib/tool-invoke.js.map +1 -1
- package/dist/lib/tool-invoke.test.js +25 -0
- package/dist/lib/tool-invoke.test.js.map +1 -1
- package/dist/modes/companion/command-index.d.ts +26 -0
- package/dist/modes/companion/command-index.d.ts.map +1 -0
- package/dist/modes/companion/command-index.js +50 -0
- package/dist/modes/companion/command-index.js.map +1 -0
- package/dist/modes/companion/command-index.test.d.ts +2 -0
- package/dist/modes/companion/command-index.test.d.ts.map +1 -0
- package/dist/modes/companion/command-index.test.js +86 -0
- package/dist/modes/companion/command-index.test.js.map +1 -0
- package/dist/modes/companion/companion-app.d.ts +12 -0
- package/dist/modes/companion/companion-app.d.ts.map +1 -0
- package/dist/modes/companion/companion-app.js +297 -0
- package/dist/modes/companion/companion-app.js.map +1 -0
- package/dist/modes/companion/companion-session.d.ts +63 -0
- package/dist/modes/companion/companion-session.d.ts.map +1 -0
- package/dist/modes/companion/companion-session.js +146 -0
- package/dist/modes/companion/companion-session.js.map +1 -0
- package/dist/modes/companion/companion-session.test.d.ts +2 -0
- package/dist/modes/companion/companion-session.test.d.ts.map +1 -0
- package/dist/modes/companion/companion-session.test.js +28 -0
- package/dist/modes/companion/companion-session.test.js.map +1 -0
- package/dist/modes/companion/components/status-bar.d.ts +13 -0
- package/dist/modes/companion/components/status-bar.d.ts.map +1 -0
- package/dist/modes/companion/components/status-bar.js +26 -0
- package/dist/modes/companion/components/status-bar.js.map +1 -0
- package/dist/modes/companion/context-buffer.d.ts +65 -0
- package/dist/modes/companion/context-buffer.d.ts.map +1 -0
- package/dist/modes/companion/context-buffer.js +156 -0
- package/dist/modes/companion/context-buffer.js.map +1 -0
- package/dist/modes/companion/context-buffer.test.d.ts +2 -0
- package/dist/modes/companion/context-buffer.test.d.ts.map +1 -0
- package/dist/modes/companion/context-buffer.test.js +154 -0
- package/dist/modes/companion/context-buffer.test.js.map +1 -0
- package/dist/modes/companion/event-detector.d.ts +46 -0
- package/dist/modes/companion/event-detector.d.ts.map +1 -0
- package/dist/modes/companion/event-detector.js +169 -0
- package/dist/modes/companion/event-detector.js.map +1 -0
- package/dist/modes/companion/event-detector.test.d.ts +2 -0
- package/dist/modes/companion/event-detector.test.d.ts.map +1 -0
- package/dist/modes/companion/event-detector.test.js +121 -0
- package/dist/modes/companion/event-detector.test.js.map +1 -0
- package/dist/modes/companion/index.d.ts +33 -0
- package/dist/modes/companion/index.d.ts.map +1 -0
- package/dist/modes/companion/index.js +21 -0
- package/dist/modes/companion/index.js.map +1 -0
- package/dist/modes/companion/input-key-mapper.d.ts +3 -0
- package/dist/modes/companion/input-key-mapper.d.ts.map +1 -0
- package/dist/modes/companion/input-key-mapper.js +31 -0
- package/dist/modes/companion/input-key-mapper.js.map +1 -0
- package/dist/modes/companion/input-key-mapper.test.d.ts +2 -0
- package/dist/modes/companion/input-key-mapper.test.d.ts.map +1 -0
- package/dist/modes/companion/input-key-mapper.test.js +26 -0
- package/dist/modes/companion/input-key-mapper.test.js.map +1 -0
- package/dist/modes/companion/input-parser.d.ts +53 -0
- package/dist/modes/companion/input-parser.d.ts.map +1 -0
- package/dist/modes/companion/input-parser.js +114 -0
- package/dist/modes/companion/input-parser.js.map +1 -0
- package/dist/modes/companion/input-parser.test.d.ts +2 -0
- package/dist/modes/companion/input-parser.test.d.ts.map +1 -0
- package/dist/modes/companion/input-parser.test.js +123 -0
- package/dist/modes/companion/input-parser.test.js.map +1 -0
- package/dist/modes/companion/mode-manager.d.ts +41 -0
- package/dist/modes/companion/mode-manager.d.ts.map +1 -0
- package/dist/modes/companion/mode-manager.js +56 -0
- package/dist/modes/companion/mode-manager.js.map +1 -0
- package/dist/modes/companion/mode-manager.test.d.ts +2 -0
- package/dist/modes/companion/mode-manager.test.d.ts.map +1 -0
- package/dist/modes/companion/mode-manager.test.js +65 -0
- package/dist/modes/companion/mode-manager.test.js.map +1 -0
- package/dist/modes/companion/output-classifier.d.ts +15 -0
- package/dist/modes/companion/output-classifier.d.ts.map +1 -0
- package/dist/modes/companion/output-classifier.js +77 -0
- package/dist/modes/companion/output-classifier.js.map +1 -0
- package/dist/modes/companion/output-classifier.test.d.ts +2 -0
- package/dist/modes/companion/output-classifier.test.d.ts.map +1 -0
- package/dist/modes/companion/output-classifier.test.js +133 -0
- package/dist/modes/companion/output-classifier.test.js.map +1 -0
- package/dist/modes/companion/pty-wrapper.d.ts +46 -0
- package/dist/modes/companion/pty-wrapper.d.ts.map +1 -0
- package/dist/modes/companion/pty-wrapper.js +143 -0
- package/dist/modes/companion/pty-wrapper.js.map +1 -0
- package/dist/modes/companion/safety-classifier.d.ts +31 -0
- package/dist/modes/companion/safety-classifier.d.ts.map +1 -0
- package/dist/modes/companion/safety-classifier.js +140 -0
- package/dist/modes/companion/safety-classifier.js.map +1 -0
- package/dist/modes/companion/safety-classifier.test.d.ts +2 -0
- package/dist/modes/companion/safety-classifier.test.d.ts.map +1 -0
- package/dist/modes/companion/safety-classifier.test.js +151 -0
- package/dist/modes/companion/safety-classifier.test.js.map +1 -0
- package/dist/modes/companion/summarizer.d.ts +24 -0
- package/dist/modes/companion/summarizer.d.ts.map +1 -0
- package/dist/modes/companion/summarizer.js +132 -0
- package/dist/modes/companion/summarizer.js.map +1 -0
- package/dist/modes/companion/terminal-history.d.ts +27 -0
- package/dist/modes/companion/terminal-history.d.ts.map +1 -0
- package/dist/modes/companion/terminal-history.js +142 -0
- package/dist/modes/companion/terminal-history.js.map +1 -0
- package/dist/non-interactive.d.ts.map +1 -1
- package/dist/non-interactive.js +3 -0
- package/dist/non-interactive.js.map +1 -1
- package/dist/prompts/gpt-5-modern.md +66 -0
- package/dist/prompts/gpt-5.md +7 -0
- package/dist/prompts/lite.md +10 -27
- package/dist/prompts/prompt-selector.js +2 -2
- package/dist/prompts/prompt-selector.js.map +1 -1
- package/dist/prompts/prompt-selector.test.js +7 -2
- package/dist/prompts/prompt-selector.test.js.map +1 -1
- package/dist/prompts/prompt-selector.test.ts +22 -2
- package/dist/prompts/prompt-selector.ts +2 -2
- package/dist/prompts/search-via-shell.d.ts +7 -0
- package/dist/prompts/search-via-shell.d.ts.map +1 -0
- package/dist/prompts/search-via-shell.js +59 -0
- package/dist/prompts/search-via-shell.js.map +1 -0
- package/dist/prompts/search-via-shell.test.d.ts +2 -0
- package/dist/prompts/search-via-shell.test.d.ts.map +1 -0
- package/dist/prompts/search-via-shell.test.js +40 -0
- package/dist/prompts/search-via-shell.test.js.map +1 -0
- package/dist/prompts/search-via-shell.test.ts +47 -0
- package/dist/prompts/search-via-shell.ts +71 -0
- package/dist/prompts/simple-mentor.md +215 -0
- package/dist/prompts/simple.md +40 -186
- package/dist/prompts/subagents/explorer.md +42 -0
- package/dist/prompts/subagents/mentor.md +16 -0
- package/dist/prompts/subagents/researcher.md +40 -0
- package/dist/prompts/subagents/worker.md +41 -0
- package/dist/providers/ai-sdk-agents-adapter.d.ts +7 -0
- package/dist/providers/ai-sdk-agents-adapter.d.ts.map +1 -0
- package/dist/providers/ai-sdk-agents-adapter.js +80 -0
- package/dist/providers/ai-sdk-agents-adapter.js.map +1 -0
- package/dist/providers/ai-sdk-agents-adapter.test.d.ts +2 -0
- package/dist/providers/ai-sdk-agents-adapter.test.d.ts.map +1 -0
- package/dist/providers/ai-sdk-agents-adapter.test.js +158 -0
- package/dist/providers/ai-sdk-agents-adapter.test.js.map +1 -0
- package/dist/providers/ai-sdk-anthropic.provider.d.ts +14 -0
- package/dist/providers/ai-sdk-anthropic.provider.d.ts.map +1 -0
- package/dist/providers/ai-sdk-anthropic.provider.js +18 -0
- package/dist/providers/ai-sdk-anthropic.provider.js.map +1 -0
- package/dist/providers/ai-sdk-google.provider.d.ts +14 -0
- package/dist/providers/ai-sdk-google.provider.d.ts.map +1 -0
- package/dist/providers/ai-sdk-google.provider.js +18 -0
- package/dist/providers/ai-sdk-google.provider.js.map +1 -0
- package/dist/providers/ai-sdk-logging-fetch.d.ts +11 -0
- package/dist/providers/ai-sdk-logging-fetch.d.ts.map +1 -0
- package/dist/providers/ai-sdk-logging-fetch.js +127 -0
- package/dist/providers/ai-sdk-logging-fetch.js.map +1 -0
- package/dist/providers/ai-sdk-logging-fetch.test.d.ts +2 -0
- package/dist/providers/ai-sdk-logging-fetch.test.d.ts.map +1 -0
- package/dist/providers/ai-sdk-logging-fetch.test.js +107 -0
- package/dist/providers/ai-sdk-logging-fetch.test.js.map +1 -0
- package/dist/providers/ai-sdk-message-normalizer.d.ts +2 -2
- package/dist/providers/ai-sdk-message-normalizer.d.ts.map +1 -1
- package/dist/providers/ai-sdk-message-normalizer.js +92 -47
- package/dist/providers/ai-sdk-message-normalizer.js.map +1 -1
- package/dist/providers/ai-sdk-message-normalizer.test.js +256 -16
- package/dist/providers/ai-sdk-message-normalizer.test.js.map +1 -1
- package/dist/providers/ai-sdk-openai-compatible.provider.d.ts +4 -0
- package/dist/providers/ai-sdk-openai-compatible.provider.d.ts.map +1 -1
- package/dist/providers/ai-sdk-openai-compatible.provider.js +10 -6
- package/dist/providers/ai-sdk-openai-compatible.provider.js.map +1 -1
- package/dist/providers/ai-sdk-openai-compatible.provider.test.js +144 -1
- package/dist/providers/ai-sdk-openai-compatible.provider.test.js.map +1 -1
- package/dist/providers/ai-sdk-openai.provider.d.ts +14 -0
- package/dist/providers/ai-sdk-openai.provider.d.ts.map +1 -0
- package/dist/providers/ai-sdk-openai.provider.js +18 -0
- package/dist/providers/ai-sdk-openai.provider.js.map +1 -0
- package/dist/providers/ai-sdk-openrouter.provider.d.ts +1 -1
- package/dist/providers/ai-sdk-openrouter.provider.d.ts.map +1 -1
- package/dist/providers/ai-sdk-openrouter.provider.js +2 -3
- package/dist/providers/ai-sdk-openrouter.provider.js.map +1 -1
- package/dist/providers/ai-sdk-openrouter.provider.test.js +23 -0
- package/dist/providers/ai-sdk-openrouter.provider.test.js.map +1 -1
- package/dist/providers/common/openai-compatible-messages.d.ts +1 -2
- package/dist/providers/common/openai-compatible-messages.d.ts.map +1 -1
- package/dist/providers/common/openai-compatible-messages.js +47 -48
- package/dist/providers/common/openai-compatible-messages.js.map +1 -1
- package/dist/providers/common/openai-compatible-messages.test.js +134 -1
- package/dist/providers/common/openai-compatible-messages.test.js.map +1 -1
- package/dist/providers/custom-provider-adapter.test.d.ts +2 -0
- package/dist/providers/custom-provider-adapter.test.d.ts.map +1 -0
- package/dist/providers/custom-provider-adapter.test.js +52 -0
- package/dist/providers/custom-provider-adapter.test.js.map +1 -0
- package/dist/providers/github-copilot/converters.d.ts +45 -0
- package/dist/providers/github-copilot/converters.d.ts.map +1 -0
- package/dist/providers/github-copilot/converters.js +118 -0
- package/dist/providers/github-copilot/converters.js.map +1 -0
- package/dist/providers/github-copilot/converters.test.d.ts +2 -0
- package/dist/providers/github-copilot/converters.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/converters.test.js +162 -0
- package/dist/providers/github-copilot/converters.test.js.map +1 -0
- package/dist/providers/github-copilot/github-copilot.provider.d.ts +2 -0
- package/dist/providers/github-copilot/github-copilot.provider.d.ts.map +1 -0
- package/dist/providers/github-copilot/github-copilot.provider.js +75 -0
- package/dist/providers/github-copilot/github-copilot.provider.js.map +1 -0
- package/dist/providers/github-copilot/github-copilot.provider.test.d.ts +2 -0
- package/dist/providers/github-copilot/github-copilot.provider.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/github-copilot.provider.test.js +26 -0
- package/dist/providers/github-copilot/github-copilot.provider.test.js.map +1 -0
- package/dist/providers/github-copilot/index.d.ts +4 -0
- package/dist/providers/github-copilot/index.d.ts.map +1 -0
- package/dist/providers/github-copilot/index.js +4 -0
- package/dist/providers/github-copilot/index.js.map +1 -0
- package/dist/providers/github-copilot/model.d.ts +24 -0
- package/dist/providers/github-copilot/model.d.ts.map +1 -0
- package/dist/providers/github-copilot/model.delta.test.d.ts +2 -0
- package/dist/providers/github-copilot/model.delta.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/model.delta.test.js +15 -0
- package/dist/providers/github-copilot/model.delta.test.js.map +1 -0
- package/dist/providers/github-copilot/model.js +498 -0
- package/dist/providers/github-copilot/model.js.map +1 -0
- package/dist/providers/github-copilot/model.test.d.ts +2 -0
- package/dist/providers/github-copilot/model.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/model.test.js +63 -0
- package/dist/providers/github-copilot/model.test.js.map +1 -0
- package/dist/providers/github-copilot/provider.d.ts +15 -0
- package/dist/providers/github-copilot/provider.d.ts.map +1 -0
- package/dist/providers/github-copilot/provider.js +25 -0
- package/dist/providers/github-copilot/provider.js.map +1 -0
- package/dist/providers/github-copilot/provider.test.d.ts +2 -0
- package/dist/providers/github-copilot/provider.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/provider.test.js +52 -0
- package/dist/providers/github-copilot/provider.test.js.map +1 -0
- package/dist/providers/github-copilot/utils.d.ts +20 -0
- package/dist/providers/github-copilot/utils.d.ts.map +1 -0
- package/dist/providers/github-copilot/utils.js +142 -0
- package/dist/providers/github-copilot/utils.js.map +1 -0
- package/dist/providers/github-copilot/utils.test.d.ts +2 -0
- package/dist/providers/github-copilot/utils.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/utils.test.js +21 -0
- package/dist/providers/github-copilot/utils.test.js.map +1 -0
- package/dist/providers/openai-compatible-behavior-gate.test.d.ts +2 -0
- package/dist/providers/openai-compatible-behavior-gate.test.d.ts.map +1 -0
- package/dist/providers/openai-compatible-behavior-gate.test.js +257 -0
- package/dist/providers/openai-compatible-behavior-gate.test.js.map +1 -0
- package/dist/providers/openai-compatible.provider.d.ts +10 -1
- package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
- package/dist/providers/openai-compatible.provider.js +341 -31
- package/dist/providers/openai-compatible.provider.js.map +1 -1
- package/dist/providers/openai-compatible.provider.test.d.ts +2 -0
- package/dist/providers/openai-compatible.provider.test.d.ts.map +1 -0
- package/dist/providers/openai-compatible.provider.test.js +462 -0
- package/dist/providers/openai-compatible.provider.test.js.map +1 -0
- package/dist/providers/openai.provider.js +2 -1
- package/dist/providers/openai.provider.js.map +1 -1
- package/dist/providers/openrouter.provider.js +28 -2
- package/dist/providers/openrouter.provider.js.map +1 -1
- package/dist/safety-checker.js +57 -0
- package/dist/scripts/eval-auto-approval/dataset.d.ts +1 -1
- package/dist/services/approval-rejection-interceptor.test.js +5 -0
- package/dist/services/approval-rejection-interceptor.test.js.map +1 -1
- package/dist/services/check_mock.d.ts +2 -0
- package/dist/services/check_mock.d.ts.map +1 -0
- package/dist/services/check_mock.js +22 -0
- package/dist/services/check_mock.js.map +1 -0
- package/dist/services/conversation-events.d.ts +28 -1
- package/dist/services/conversation-events.d.ts.map +1 -1
- package/dist/services/conversation-result-builder.d.ts.map +1 -1
- package/dist/services/conversation-result-builder.js +11 -1
- package/dist/services/conversation-result-builder.js.map +1 -1
- package/dist/services/conversation-result-builder.test.js +72 -0
- package/dist/services/conversation-result-builder.test.js.map +1 -1
- package/dist/services/conversation-service.test.d.ts +2 -0
- package/dist/services/conversation-service.test.d.ts.map +1 -0
- package/dist/services/conversation-service.test.js +156 -0
- package/dist/services/conversation-service.test.js.map +1 -0
- package/dist/services/conversation-session.auto-approval.test.js +52 -0
- package/dist/services/conversation-session.auto-approval.test.js.map +1 -1
- package/dist/services/conversation-session.d.ts +2 -1
- package/dist/services/conversation-session.d.ts.map +1 -1
- package/dist/services/conversation-session.js +94 -31
- package/dist/services/conversation-session.js.map +1 -1
- package/dist/services/file-service.js +1 -1
- package/dist/services/file-service.js.map +1 -1
- package/dist/services/interruption-info.js +1 -1
- package/dist/services/interruption-info.js.map +1 -1
- package/dist/services/interruption-info.test.js +12 -0
- package/dist/services/interruption-info.test.js.map +1 -1
- package/dist/services/logging-contract.d.ts +3 -3
- package/dist/services/logging-service.d.ts.map +1 -1
- package/dist/services/logging-service.js +18 -1
- package/dist/services/logging-service.js.map +1 -1
- package/dist/services/model-service.d.ts.map +1 -1
- package/dist/services/model-service.js +16 -8
- package/dist/services/model-service.js.map +1 -1
- package/dist/services/model-service.test.js +67 -1
- package/dist/services/model-service.test.js.map +1 -1
- package/dist/services/rtk-service.d.ts +23 -0
- package/dist/services/rtk-service.d.ts.map +1 -0
- package/dist/services/rtk-service.js +260 -0
- package/dist/services/rtk-service.js.map +1 -0
- package/dist/services/rtk-service.test.d.ts +2 -0
- package/dist/services/rtk-service.test.d.ts.map +1 -0
- package/dist/services/rtk-service.test.js +274 -0
- package/dist/services/rtk-service.test.js.map +1 -0
- package/dist/services/settings-persistence.d.ts +1 -0
- package/dist/services/settings-persistence.d.ts.map +1 -1
- package/dist/services/settings-persistence.js +28 -5
- package/dist/services/settings-persistence.js.map +1 -1
- package/dist/services/settings-persistence.test.js +55 -3
- package/dist/services/settings-persistence.test.js.map +1 -1
- package/dist/services/settings-schema.d.ts +55 -16
- package/dist/services/settings-schema.d.ts.map +1 -1
- package/dist/services/settings-schema.js +35 -4
- package/dist/services/settings-schema.js.map +1 -1
- package/dist/services/settings-schema.test.d.ts +2 -0
- package/dist/services/settings-schema.test.d.ts.map +1 -0
- package/dist/services/settings-schema.test.js +77 -0
- package/dist/services/settings-schema.test.js.map +1 -0
- package/dist/services/settings-service.d.ts.map +1 -1
- package/dist/services/settings-service.js +7 -4
- package/dist/services/settings-service.js.map +1 -1
- package/dist/services/settings-sources.d.ts.map +1 -1
- package/dist/services/settings-sources.js +1 -0
- package/dist/services/settings-sources.js.map +1 -1
- package/dist/services/shell-auto-approval-evaluator.d.ts +1 -1
- package/dist/services/shell-auto-approval-evaluator.d.ts.map +1 -1
- package/dist/services/shell-auto-approval-evaluator.js +8 -2
- package/dist/services/shell-auto-approval-evaluator.js.map +1 -1
- package/dist/services/stream-event-processor.d.ts.map +1 -1
- package/dist/services/stream-event-processor.js +27 -14
- package/dist/services/stream-event-processor.js.map +1 -1
- package/dist/services/stream-event-processor.test.js +32 -0
- package/dist/services/stream-event-processor.test.js.map +1 -1
- package/dist/services/subagents/subagent-manager.d.ts +16 -0
- package/dist/services/subagents/subagent-manager.d.ts.map +1 -0
- package/dist/services/subagents/subagent-manager.js +530 -0
- package/dist/services/subagents/subagent-manager.js.map +1 -0
- package/dist/services/subagents/subagent-manager.test.d.ts +2 -0
- package/dist/services/subagents/subagent-manager.test.d.ts.map +1 -0
- package/dist/services/subagents/subagent-manager.test.js +690 -0
- package/dist/services/subagents/subagent-manager.test.js.map +1 -0
- package/dist/services/subagents/subagent-session.d.ts +26 -0
- package/dist/services/subagents/subagent-session.d.ts.map +1 -0
- package/dist/services/subagents/subagent-session.js +86 -0
- package/dist/services/subagents/subagent-session.js.map +1 -0
- package/dist/services/subagents/subagent-session.test.d.ts +2 -0
- package/dist/services/subagents/subagent-session.test.d.ts.map +1 -0
- package/dist/services/subagents/subagent-session.test.js +118 -0
- package/dist/services/subagents/subagent-session.test.js.map +1 -0
- package/dist/services/subagents/types.d.ts +35 -0
- package/dist/services/subagents/types.d.ts.map +1 -0
- package/dist/services/subagents/types.js +2 -0
- package/dist/services/subagents/types.js.map +1 -0
- package/dist/services/terminal-result-collector.d.ts.map +1 -1
- package/dist/services/terminal-result-collector.js +30 -2
- package/dist/services/terminal-result-collector.js.map +1 -1
- package/dist/services/terminal-result-collector.test.js +103 -0
- package/dist/services/terminal-result-collector.test.js.map +1 -1
- package/dist/tools/apply-patch.d.ts +14 -6
- package/dist/tools/apply-patch.d.ts.map +1 -1
- package/dist/tools/apply-patch.js +204 -208
- package/dist/tools/apply-patch.js.map +1 -1
- package/dist/tools/apply-patch.test.js +44 -0
- package/dist/tools/apply-patch.test.js.map +1 -1
- package/dist/tools/ask-mentor.d.ts +2 -2
- package/dist/tools/ask-mentor.d.ts.map +1 -1
- package/dist/tools/ask-mentor.js.map +1 -1
- 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/code-context.d.ts +27 -0
- package/dist/tools/code-context.d.ts.map +1 -0
- package/dist/tools/code-context.js +512 -0
- package/dist/tools/code-context.js.map +1 -0
- package/dist/tools/code-context.test.d.ts +2 -0
- package/dist/tools/code-context.test.d.ts.map +1 -0
- package/dist/tools/code-context.test.js +367 -0
- package/dist/tools/code-context.test.js.map +1 -0
- package/dist/tools/command-message-formatters.d.ts +5 -0
- package/dist/tools/command-message-formatters.d.ts.map +1 -0
- package/dist/tools/command-message-formatters.js +13 -0
- package/dist/tools/command-message-formatters.js.map +1 -0
- package/dist/tools/command-message-formatters.test.d.ts +2 -0
- package/dist/tools/command-message-formatters.test.d.ts.map +1 -0
- package/dist/tools/command-message-formatters.test.js +23 -0
- package/dist/tools/command-message-formatters.test.js.map +1 -0
- package/dist/tools/create-file.d.ts +2 -2
- package/dist/tools/create-file.d.ts.map +1 -1
- package/dist/tools/create-file.js +18 -11
- package/dist/tools/create-file.js.map +1 -1
- package/dist/tools/create-file.test.js +11 -0
- package/dist/tools/create-file.test.js.map +1 -1
- package/dist/tools/edit-healing.d.ts +4 -3
- package/dist/tools/edit-healing.d.ts.map +1 -1
- package/dist/tools/edit-healing.js +50 -20
- package/dist/tools/edit-healing.js.map +1 -1
- package/dist/tools/edit-healing.test.js +62 -0
- package/dist/tools/edit-healing.test.js.map +1 -1
- package/dist/tools/file-locks.d.ts +3 -0
- package/dist/tools/file-locks.d.ts.map +1 -0
- package/dist/tools/file-locks.js +37 -0
- package/dist/tools/file-locks.js.map +1 -0
- package/dist/tools/find-files.d.ts +3 -2
- package/dist/tools/find-files.d.ts.map +1 -1
- package/dist/tools/find-files.js +59 -139
- package/dist/tools/find-files.js.map +1 -1
- package/dist/tools/find-files.test.js +6 -12
- package/dist/tools/find-files.test.js.map +1 -1
- package/dist/tools/grep.d.ts +3 -2
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +10 -46
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/grep.test.d.ts +2 -0
- package/dist/tools/grep.test.d.ts.map +1 -0
- package/dist/tools/language-providers.d.ts +48 -0
- package/dist/tools/language-providers.d.ts.map +1 -0
- package/dist/tools/language-providers.js +244 -0
- package/dist/tools/language-providers.js.map +1 -0
- package/dist/tools/read-file.d.ts +2 -2
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/read-file.test.js +2 -3
- package/dist/tools/read-file.test.js.map +1 -1
- package/dist/tools/run-subagent.d.ts +14 -0
- package/dist/tools/run-subagent.d.ts.map +1 -0
- package/dist/tools/run-subagent.js +196 -0
- package/dist/tools/run-subagent.js.map +1 -0
- package/dist/tools/run-subagent.test.d.ts +2 -0
- package/dist/tools/run-subagent.test.d.ts.map +1 -0
- package/dist/tools/run-subagent.test.js +159 -0
- package/dist/tools/run-subagent.test.js.map +1 -0
- package/dist/tools/search-replace.d.ts +7 -4
- package/dist/tools/search-replace.d.ts.map +1 -1
- package/dist/tools/search-replace.js +248 -110
- package/dist/tools/search-replace.js.map +1 -1
- package/dist/tools/search-replace.test.js +189 -1
- package/dist/tools/search-replace.test.js.map +1 -1
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +5 -15
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/shell.d.ts +4 -2
- package/dist/tools/shell.d.ts.map +1 -1
- package/dist/tools/shell.js +15 -7
- package/dist/tools/shell.js.map +1 -1
- package/dist/tools/shell.test.js +154 -0
- package/dist/tools/shell.test.js.map +1 -1
- package/dist/tools/tool-names.d.ts +3 -0
- package/dist/tools/tool-names.d.ts.map +1 -1
- package/dist/tools/tool-names.js +3 -0
- package/dist/tools/tool-names.js.map +1 -1
- package/dist/tools/tool-names.test.js +4 -1
- package/dist/tools/tool-names.test.js.map +1 -1
- package/dist/tools/tool-parameter-schema.test.js +18 -0
- package/dist/tools/tool-parameter-schema.test.js.map +1 -1
- package/dist/tools/types.d.ts +2 -1
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tools/utils.js +11 -1
- package/dist/tools/utils.js.map +1 -1
- package/dist/tools/utils.test.js +13 -0
- package/dist/tools/utils.test.js.map +1 -1
- package/dist/tools/web-fetch.d.ts +2 -2
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/tools/web-search.d.ts +2 -2
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js.map +1 -1
- package/dist/utils/clipboard.d.ts +2 -2
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +58 -22
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/clipboard.test.js +25 -6
- package/dist/utils/clipboard.test.js.map +1 -1
- package/dist/utils/command-safety/constants.d.ts.map +1 -1
- package/dist/utils/command-safety/constants.js +30 -5
- package/dist/utils/command-safety/constants.js.map +1 -1
- package/dist/utils/command-safety/handlers/sed-handler.d.ts.map +1 -1
- package/dist/utils/command-safety/handlers/sed-handler.js +10 -7
- package/dist/utils/command-safety/handlers/sed-handler.js.map +1 -1
- package/dist/utils/command-safety/index.d.ts.map +1 -1
- package/dist/utils/command-safety/index.js +153 -114
- package/dist/utils/command-safety/index.js.map +1 -1
- package/dist/utils/command-safety/path-analysis.d.ts.map +1 -1
- package/dist/utils/command-safety/path-analysis.js +14 -2
- package/dist/utils/command-safety/path-analysis.js.map +1 -1
- package/dist/utils/command-safety/utils.js +2 -2
- package/dist/utils/command-safety/utils.js.map +1 -1
- package/dist/utils/command-safety.d.ts +21 -0
- package/dist/utils/command-safety.d.ts.map +1 -0
- package/dist/utils/command-safety.devnull.test.d.ts +2 -0
- package/dist/utils/command-safety.devnull.test.d.ts.map +1 -0
- package/dist/utils/command-safety.devnull.test.js +13 -0
- package/dist/utils/command-safety.devnull.test.js.map +1 -0
- package/dist/utils/command-safety.find.test.js +1 -1
- package/dist/utils/command-safety.find.test.js.map +1 -1
- package/dist/utils/command-safety.js +348 -0
- package/dist/utils/command-safety.js.map +1 -0
- package/dist/utils/command-safety.path.test.js +29 -1
- package/dist/utils/command-safety.path.test.js.map +1 -1
- package/dist/utils/command-safety.specialized-handlers.test.d.ts +2 -0
- package/dist/utils/command-safety.specialized-handlers.test.d.ts.map +1 -0
- package/dist/utils/command-safety.specialized-handlers.test.js +20 -0
- package/dist/utils/command-safety.specialized-handlers.test.js.map +1 -0
- package/dist/utils/conversation-event-handler.d.ts +23 -6
- package/dist/utils/conversation-event-handler.d.ts.map +1 -1
- package/dist/utils/conversation-event-handler.js +262 -46
- package/dist/utils/conversation-event-handler.js.map +1 -1
- package/dist/utils/conversation-event-handler.test.js +576 -14
- package/dist/utils/conversation-event-handler.test.js.map +1 -1
- package/dist/utils/conversation-utils.d.ts +3 -0
- package/dist/utils/conversation-utils.d.ts.map +1 -1
- package/dist/utils/conversation-utils.js +3 -0
- package/dist/utils/conversation-utils.js.map +1 -1
- package/dist/utils/execute-shell.d.ts +5 -6
- package/dist/utils/execute-shell.d.ts.map +1 -1
- package/dist/utils/execute-shell.js +21 -11
- package/dist/utils/execute-shell.js.map +1 -1
- package/dist/utils/execute-shell.test.js +37 -6
- package/dist/utils/execute-shell.test.js.map +1 -1
- package/dist/utils/extract-command-messages.d.ts.map +1 -1
- package/dist/utils/extract-command-messages.js +2 -18
- package/dist/utils/extract-command-messages.js.map +1 -1
- package/dist/utils/extract-command-messages.test.d.ts +2 -0
- package/dist/utils/extract-command-messages.test.d.ts.map +1 -0
- package/dist/utils/flex-service-tier.d.ts +2 -0
- package/dist/utils/flex-service-tier.d.ts.map +1 -0
- package/dist/utils/flex-service-tier.js +20 -0
- package/dist/utils/flex-service-tier.js.map +1 -0
- package/dist/utils/flex-service-tier.test.d.ts +2 -0
- package/dist/utils/flex-service-tier.test.d.ts.map +1 -0
- package/dist/utils/flex-service-tier.test.js +25 -0
- package/dist/utils/flex-service-tier.test.js.map +1 -0
- package/dist/utils/log-truncation.d.ts +4 -2
- package/dist/utils/log-truncation.d.ts.map +1 -1
- package/dist/utils/log-truncation.js +143 -41
- package/dist/utils/log-truncation.js.map +1 -1
- package/dist/utils/log-truncation.test.js +131 -1
- package/dist/utils/log-truncation.test.js.map +1 -1
- package/dist/utils/provider-traffic-extractor.d.ts.map +1 -1
- package/dist/utils/provider-traffic-extractor.js +0 -1
- package/dist/utils/provider-traffic-extractor.js.map +1 -1
- package/dist/utils/provider-traffic-extractor.repro.test.d.ts +2 -0
- package/dist/utils/provider-traffic-extractor.repro.test.d.ts.map +1 -0
- package/dist/utils/provider-traffic-extractor.repro.test.js.map +1 -0
- package/dist/utils/streaming-session-factory.d.ts +1 -3
- package/dist/utils/streaming-session-factory.d.ts.map +1 -1
- package/dist/utils/streaming-session-factory.js +45 -11
- package/dist/utils/streaming-session-factory.js.map +1 -1
- package/dist/utils/streaming-session-factory.test.js +89 -15
- package/dist/utils/streaming-session-factory.test.js.map +1 -1
- package/dist/utils/subsequence-filter.d.ts +8 -0
- package/dist/utils/subsequence-filter.d.ts.map +1 -0
- package/dist/utils/subsequence-filter.js +47 -0
- package/dist/utils/subsequence-filter.js.map +1 -0
- package/dist/utils/token-usage.d.ts +26 -1
- package/dist/utils/token-usage.d.ts.map +1 -1
- package/dist/utils/token-usage.js +210 -28
- package/dist/utils/token-usage.js.map +1 -1
- package/dist/utils/token-usage.test.js +196 -3
- package/dist/utils/token-usage.test.js.map +1 -1
- package/package.json +5 -5
|
@@ -5,6 +5,7 @@ import { resolveWorkspacePath } from './utils.js';
|
|
|
5
5
|
import { getOutputText, safeJsonParse, normalizeToolArguments, createBaseMessage } from './format-helpers.js';
|
|
6
6
|
import { healSearchReplaceParams } from './edit-healing.js';
|
|
7
7
|
import { getApprovalPresentationCapability } from './tool-capabilities.js';
|
|
8
|
+
import { withFileLock } from './file-locks.js';
|
|
8
9
|
/**
|
|
9
10
|
* Detect the predominant EOL style in file content.
|
|
10
11
|
* Returns '\r\n' if CRLF is dominant, otherwise '\n'.
|
|
@@ -66,11 +67,11 @@ function detectSummarizationMarkers(content) {
|
|
|
66
67
|
}
|
|
67
68
|
return null;
|
|
68
69
|
}
|
|
69
|
-
const
|
|
70
|
+
const searchReplaceOperationSchema = z.object({
|
|
70
71
|
path: z.string().describe('The absolute or relative path to the file'),
|
|
71
72
|
search_content: z
|
|
72
73
|
.string()
|
|
73
|
-
.describe('The exact content to search for.
|
|
74
|
+
.describe('The exact content to search for. Put <...> on its own line to match (and replace) everything between a head anchor and a tail anchor — lets you edit or delete a large block without reproducing it. The whole span between anchors is replaced, so use distinctive multi-line anchors (never a single generic line) to avoid deleting the wrong region. Omit the anchors from replace_content to delete them too.'),
|
|
74
75
|
replace_content: z.string().describe('The content to replace it with'),
|
|
75
76
|
replace_all: z
|
|
76
77
|
.boolean()
|
|
@@ -78,6 +79,52 @@ const searchReplaceParametersSchema = z.object({
|
|
|
78
79
|
.default(false)
|
|
79
80
|
.describe('Whether to replace all occurrences of the search content. If false, requires exactly one match.'),
|
|
80
81
|
});
|
|
82
|
+
const searchReplaceParametersSchema = z
|
|
83
|
+
.object({
|
|
84
|
+
path: z.string().describe('The absolute or relative path to the file').optional(),
|
|
85
|
+
search_content: z
|
|
86
|
+
.string()
|
|
87
|
+
.describe('The exact content to search for. Put <...> on its own line to match (and replace) everything between a head anchor and a tail anchor — lets you edit or delete a large block without reproducing it. The whole span between anchors is replaced, so use distinctive multi-line anchors (never a single generic line) to avoid deleting the wrong region. Omit the anchors from replace_content to delete them too.')
|
|
88
|
+
.optional(),
|
|
89
|
+
replace_content: z.string().describe('The content to replace it with').optional(),
|
|
90
|
+
replace_all: z
|
|
91
|
+
.boolean()
|
|
92
|
+
.optional()
|
|
93
|
+
.describe('Whether to replace all occurrences of the search content. If false, requires exactly one match.'),
|
|
94
|
+
replacements: z.array(searchReplaceOperationSchema).min(1).optional(),
|
|
95
|
+
})
|
|
96
|
+
.superRefine((params, ctx) => {
|
|
97
|
+
const hasBatch = Array.isArray(params.replacements);
|
|
98
|
+
const hasSingle = params.path !== undefined || params.search_content !== undefined || params.replace_content !== undefined;
|
|
99
|
+
if (hasBatch && hasSingle) {
|
|
100
|
+
ctx.addIssue({
|
|
101
|
+
code: z.ZodIssueCode.custom,
|
|
102
|
+
message: 'Provide either replacements or a single path/search_content/replace_content edit, not both.',
|
|
103
|
+
});
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (!hasBatch &&
|
|
107
|
+
(params.path === undefined || params.search_content === undefined || params.replace_content === undefined)) {
|
|
108
|
+
ctx.addIssue({
|
|
109
|
+
code: z.ZodIssueCode.custom,
|
|
110
|
+
message: 'Provide replacements or all single edit fields: path, search_content, and replace_content.',
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
function getSearchReplaceOperations(params) {
|
|
115
|
+
if ('replacements' in params && params.replacements) {
|
|
116
|
+
return params.replacements;
|
|
117
|
+
}
|
|
118
|
+
const operation = params;
|
|
119
|
+
return [
|
|
120
|
+
{
|
|
121
|
+
path: operation.path,
|
|
122
|
+
search_content: operation.search_content,
|
|
123
|
+
replace_content: operation.replace_content,
|
|
124
|
+
replace_all: operation.replace_all ?? false,
|
|
125
|
+
},
|
|
126
|
+
];
|
|
127
|
+
}
|
|
81
128
|
/**
|
|
82
129
|
* Gap marker constant used to indicate omitted middle content in search strings.
|
|
83
130
|
* When the model uses <...> in search_content, the search is split into segments
|
|
@@ -207,10 +254,15 @@ function findGapMatches(content, searchContent) {
|
|
|
207
254
|
.filter((l) => l.length > 0));
|
|
208
255
|
// Validate: all segments must have at least one non-empty line
|
|
209
256
|
if (segmentLineSets.some((lines) => lines.length === 0)) {
|
|
210
|
-
return {
|
|
257
|
+
return {
|
|
258
|
+
type: 'none',
|
|
259
|
+
diagnostic: 'Gap pattern has an empty segment — every part separated by <...> must contain at least one non-blank line.',
|
|
260
|
+
};
|
|
211
261
|
}
|
|
212
262
|
const lineInfos = parseFileLines(content);
|
|
213
263
|
const allMatches = [];
|
|
264
|
+
let headEverMatched = false;
|
|
265
|
+
let maxSegmentsMatched = 0; // best run: count of leading segments matched consecutively
|
|
214
266
|
// Try every possible starting position for the first segment
|
|
215
267
|
let searchFrom = 0;
|
|
216
268
|
while (searchFrom <= lineInfos.length - segmentLineSets[0].length) {
|
|
@@ -218,8 +270,10 @@ function findGapMatches(content, searchContent) {
|
|
|
218
270
|
const firstMatch = findSegmentInLines(lineInfos, segmentLineSets[0], searchFrom);
|
|
219
271
|
if (!firstMatch)
|
|
220
272
|
break;
|
|
273
|
+
headEverMatched = true;
|
|
221
274
|
// Try to match remaining segments sequentially after the first
|
|
222
275
|
let valid = true;
|
|
276
|
+
let segmentsMatched = 1;
|
|
223
277
|
let lastEndLineIdx = firstMatch.endLineIdx;
|
|
224
278
|
for (let s = 1; s < segmentLineSets.length; s++) {
|
|
225
279
|
const nextMatch = findSegmentInLines(lineInfos, segmentLineSets[s], lastEndLineIdx);
|
|
@@ -227,8 +281,10 @@ function findGapMatches(content, searchContent) {
|
|
|
227
281
|
valid = false;
|
|
228
282
|
break;
|
|
229
283
|
}
|
|
284
|
+
segmentsMatched++;
|
|
230
285
|
lastEndLineIdx = nextMatch.endLineIdx;
|
|
231
286
|
}
|
|
287
|
+
maxSegmentsMatched = Math.max(maxSegmentsMatched, segmentsMatched);
|
|
232
288
|
if (valid) {
|
|
233
289
|
allMatches.push({
|
|
234
290
|
startIndex: lineInfos[firstMatch.startLineIdx].start,
|
|
@@ -241,7 +297,17 @@ function findGapMatches(content, searchContent) {
|
|
|
241
297
|
if (allMatches.length > 0) {
|
|
242
298
|
return { type: 'gap', count: allMatches.length, matches: allMatches };
|
|
243
299
|
}
|
|
244
|
-
|
|
300
|
+
if (!headEverMatched) {
|
|
301
|
+
return {
|
|
302
|
+
type: 'none',
|
|
303
|
+
diagnostic: `Gap pattern did not match: the head anchor (starting ${JSON.stringify(segmentLineSets[0][0])}) was not found in the file. Recheck the first anchor's exact text.`,
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
const failedSegmentFirstLine = segmentLineSets[maxSegmentsMatched]?.[0] ?? '';
|
|
307
|
+
return {
|
|
308
|
+
type: 'none',
|
|
309
|
+
diagnostic: `Gap pattern did not match: the head anchor matched, but the next anchor (starting ${JSON.stringify(failedSegmentFirstLine)}) was not found after it. Recheck that anchor's text and that anchors appear in order.`,
|
|
310
|
+
};
|
|
245
311
|
}
|
|
246
312
|
/**
|
|
247
313
|
* Find matches in content using exact matching first, then relaxed matching.
|
|
@@ -408,9 +474,10 @@ export const formatSearchReplaceCommandMessage = (item, index, _toolCallArgument
|
|
|
408
474
|
for (const [replaceIndex, replaceResult] of replaceOutputItems.entries()) {
|
|
409
475
|
const normalizedArgs = item?.rawItem?.arguments ?? item?.arguments;
|
|
410
476
|
const args = normalizeToolArguments(normalizedArgs) ?? {};
|
|
411
|
-
const
|
|
412
|
-
const
|
|
413
|
-
const
|
|
477
|
+
const operationArgs = Array.isArray(args?.replacements) ? args.replacements[replaceIndex] : args;
|
|
478
|
+
const filePath = operationArgs?.path ?? replaceResult?.path ?? 'unknown';
|
|
479
|
+
const searchContent = operationArgs?.search_content ?? '';
|
|
480
|
+
const replaceContent = operationArgs?.replace_content ?? '';
|
|
414
481
|
const command = `search_replace "${searchContent}" → "${replaceContent}" "${filePath}"`;
|
|
415
482
|
const isHealed = replaceResult?.healed === true;
|
|
416
483
|
let output = replaceResult?.message ?? replaceResult?.error ?? 'No output';
|
|
@@ -427,7 +494,7 @@ export const formatSearchReplaceCommandMessage = (item, index, _toolCallArgument
|
|
|
427
494
|
path: filePath,
|
|
428
495
|
search_content: searchContent,
|
|
429
496
|
replace_content: replaceContent,
|
|
430
|
-
replace_all:
|
|
497
|
+
replace_all: operationArgs?.replace_all ?? false,
|
|
431
498
|
},
|
|
432
499
|
}));
|
|
433
500
|
}
|
|
@@ -440,15 +507,29 @@ export function createSearchReplaceToolDefinition(deps) {
|
|
|
440
507
|
name: 'search_replace',
|
|
441
508
|
description: 'Replace text in a file using exact or relaxed matching.\n' +
|
|
442
509
|
'Set replace_all to true to replace all occurrences instead of requiring a unique match.\n' +
|
|
443
|
-
'
|
|
510
|
+
'Gap matching: put <...> on its own line in search_content to match an unchanged region between a head anchor and a tail anchor. The entire span (both anchors plus everything between them) is what gets replaced, so a mis-placed anchor silently deletes a large region. Choose anchors that are distinctive and unambiguous — prefer a few lines of real, unique code; never anchor on a single generic line like "}", "return", or a blank line. Use this to edit or DELETE a large block without reproducing it. To delete the block including the anchors, omit them from replace_content; to delete only the middle, repeat the anchors in replace_content.\n' +
|
|
444
511
|
'Use this tool for precise edits where you know the content to be replaced.',
|
|
445
512
|
parameters: searchReplaceParametersSchema,
|
|
446
513
|
approvalPresentation: getApprovalPresentationCapability('search_replace'),
|
|
447
514
|
needsApproval: async (params) => {
|
|
448
515
|
try {
|
|
449
516
|
const editMode = settingsService.get('app.editMode');
|
|
450
|
-
const
|
|
517
|
+
const operations = getSearchReplaceOperations(params);
|
|
451
518
|
const cwd = executionContext?.getCwd() || process.cwd();
|
|
519
|
+
if (operations.length > 1) {
|
|
520
|
+
const allInsideCwd = operations.every((operation) => {
|
|
521
|
+
try {
|
|
522
|
+
const targetPath = resolveWorkspacePath(operation.path, cwd);
|
|
523
|
+
return targetPath.startsWith(cwd + path.sep);
|
|
524
|
+
}
|
|
525
|
+
catch {
|
|
526
|
+
return false;
|
|
527
|
+
}
|
|
528
|
+
});
|
|
529
|
+
return !(editMode && allInsideCwd);
|
|
530
|
+
}
|
|
531
|
+
const operation = operations[0];
|
|
532
|
+
const { path: filePath, search_content, replace_content, replace_all = false } = operation;
|
|
452
533
|
const targetPath = resolveWorkspacePath(filePath, cwd);
|
|
453
534
|
const workspaceRoot = cwd;
|
|
454
535
|
const insideCwd = targetPath.startsWith(workspaceRoot + path.sep);
|
|
@@ -486,6 +567,13 @@ export function createSearchReplaceToolDefinition(deps) {
|
|
|
486
567
|
});
|
|
487
568
|
return true;
|
|
488
569
|
}
|
|
570
|
+
if (search_content === replace_content) {
|
|
571
|
+
loggingService.warn('search_replace validation: search_content and replace_content are identical', {
|
|
572
|
+
path: filePath,
|
|
573
|
+
});
|
|
574
|
+
// Auto-approve - execute will handle the error gracefully
|
|
575
|
+
return false;
|
|
576
|
+
}
|
|
489
577
|
// Check for summarization markers
|
|
490
578
|
const markerError = detectSummarizationMarkers(search_content);
|
|
491
579
|
if (markerError) {
|
|
@@ -502,7 +590,7 @@ export function createSearchReplaceToolDefinition(deps) {
|
|
|
502
590
|
// Find matches using shared logic with normalized content
|
|
503
591
|
const matchInfo = findMatchesInContent(content, normalizedSearchContent);
|
|
504
592
|
// Cache the result for execute phase
|
|
505
|
-
editCache.set(
|
|
593
|
+
editCache.set(operation, matchInfo, content, eol);
|
|
506
594
|
if (matchInfo.type === 'exact') {
|
|
507
595
|
if (!replace_all && matchInfo.count > 1) {
|
|
508
596
|
loggingService.warn('search_replace validation: multiple exact matches, replace_all=false', {
|
|
@@ -586,77 +674,46 @@ export function createSearchReplaceToolDefinition(deps) {
|
|
|
586
674
|
},
|
|
587
675
|
execute: async (params) => {
|
|
588
676
|
const enableFileLogging = settingsService.get('tools.logFileOperations');
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
};
|
|
605
|
-
if (enableFileLogging) {
|
|
606
|
-
loggingService.debug(`File operation started: search_replace`, {
|
|
607
|
-
path: filePath,
|
|
608
|
-
targetPath,
|
|
609
|
-
replace_all,
|
|
610
|
-
});
|
|
611
|
-
}
|
|
612
|
-
let content;
|
|
613
|
-
try {
|
|
614
|
-
content = await readFileFn(targetPath);
|
|
615
|
-
}
|
|
616
|
-
catch (error) {
|
|
617
|
-
if (search_content === '' && error?.code === 'ENOENT') {
|
|
618
|
-
await writeFileFn(targetPath, replace_content);
|
|
619
|
-
if (enableFileLogging) {
|
|
620
|
-
loggingService.debug('File created (search_content empty)', {
|
|
621
|
-
path: filePath,
|
|
622
|
-
});
|
|
623
|
-
}
|
|
624
|
-
return JSON.stringify({
|
|
625
|
-
output: [
|
|
626
|
-
{
|
|
627
|
-
success: true,
|
|
628
|
-
operation: 'search_replace',
|
|
629
|
-
path: filePath,
|
|
630
|
-
message: `Created ${filePath} (new file)`,
|
|
631
|
-
},
|
|
632
|
-
],
|
|
633
|
-
});
|
|
634
|
-
}
|
|
635
|
-
throw error;
|
|
636
|
-
}
|
|
677
|
+
const cwd = executionContext?.getCwd() || process.cwd();
|
|
678
|
+
const sshService = executionContext?.getSSHService();
|
|
679
|
+
const isRemote = executionContext?.isRemote() && !!sshService;
|
|
680
|
+
const readFileFn = async (p) => {
|
|
681
|
+
if (isRemote && sshService)
|
|
682
|
+
return sshService.readFile(p);
|
|
683
|
+
return readFile(p, 'utf8');
|
|
684
|
+
};
|
|
685
|
+
const writeFileFn = async (p, c) => {
|
|
686
|
+
if (isRemote && sshService)
|
|
687
|
+
return sshService.writeFile(p, c);
|
|
688
|
+
return writeFile(p, c, 'utf8');
|
|
689
|
+
};
|
|
690
|
+
const applyToContent = async (operation, content) => {
|
|
691
|
+
const { path: filePath, search_content, replace_content, replace_all = false } = operation;
|
|
637
692
|
if (search_content === '') {
|
|
638
|
-
return
|
|
639
|
-
output:
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
693
|
+
return {
|
|
694
|
+
output: {
|
|
695
|
+
success: false,
|
|
696
|
+
error: 'search_content must not be empty when editing an existing file. Provide search text or create a new file with an empty search.',
|
|
697
|
+
},
|
|
698
|
+
};
|
|
699
|
+
}
|
|
700
|
+
if (search_content === replace_content) {
|
|
701
|
+
return {
|
|
702
|
+
output: {
|
|
703
|
+
success: false,
|
|
704
|
+
error: 'search_content and replace_content are identical.',
|
|
705
|
+
},
|
|
706
|
+
};
|
|
646
707
|
}
|
|
647
|
-
// Check for summarization markers
|
|
648
708
|
const markerError = detectSummarizationMarkers(search_content);
|
|
649
709
|
if (markerError) {
|
|
650
|
-
return
|
|
651
|
-
output:
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
],
|
|
657
|
-
});
|
|
710
|
+
return {
|
|
711
|
+
output: {
|
|
712
|
+
success: false,
|
|
713
|
+
error: markerError,
|
|
714
|
+
},
|
|
715
|
+
};
|
|
658
716
|
}
|
|
659
|
-
// Check cache first
|
|
660
717
|
let matchInfo;
|
|
661
718
|
let eol;
|
|
662
719
|
let normalizedSearchContent;
|
|
@@ -665,30 +722,38 @@ export function createSearchReplaceToolDefinition(deps) {
|
|
|
665
722
|
let healingSucceeded = false;
|
|
666
723
|
let healedSearchLength = 0;
|
|
667
724
|
let matchTypeAfterHealing = 'none';
|
|
668
|
-
|
|
725
|
+
let healingFailureReason;
|
|
726
|
+
const cachedEdit = editCache.get(operation, content);
|
|
669
727
|
if (cachedEdit) {
|
|
670
|
-
// Use cached results
|
|
671
728
|
matchInfo = cachedEdit.matchInfo;
|
|
672
729
|
eol = cachedEdit.eol;
|
|
673
730
|
normalizedSearchContent = normalizeToEOL(removeLeadingFilepathComment(search_content, filePath), eol);
|
|
674
731
|
}
|
|
675
732
|
else {
|
|
676
|
-
// Detect EOL and normalize content
|
|
677
733
|
eol = detectEOL(content);
|
|
678
734
|
normalizedSearchContent = normalizeToEOL(removeLeadingFilepathComment(search_content, filePath), eol);
|
|
679
|
-
// Find matches using shared logic
|
|
680
735
|
matchInfo = findMatchesInContent(content, normalizedSearchContent);
|
|
681
736
|
}
|
|
682
737
|
if (matchInfo.type === 'none') {
|
|
738
|
+
if (containsGapMarker(search_content)) {
|
|
739
|
+
return {
|
|
740
|
+
output: {
|
|
741
|
+
success: false,
|
|
742
|
+
error: (matchInfo.diagnostic ?? 'Gap pattern did not match. Recheck the head and tail anchor lines.') +
|
|
743
|
+
' Gap (<...>) edits are not auto-healed — fix the anchors and retry.',
|
|
744
|
+
},
|
|
745
|
+
};
|
|
746
|
+
}
|
|
683
747
|
const enableEditHealing = settingsService.get('tools.enableEditHealing') ?? true;
|
|
684
748
|
if (enableEditHealing) {
|
|
685
749
|
healingAttempted = true;
|
|
686
750
|
const healingModel = settingsService.get('tools.editHealingModel') ?? 'gpt-4o-mini';
|
|
687
|
-
const healingResult = await editHealing(
|
|
751
|
+
const healingResult = await editHealing(operation, content, healingModel, process.env.OPENAI_API_KEY ?? '', {
|
|
688
752
|
settingsService,
|
|
689
753
|
loggingService,
|
|
690
754
|
});
|
|
691
755
|
healedSearchLength = healingResult.params.search_content.length;
|
|
756
|
+
healingFailureReason = healingResult.failureReason;
|
|
692
757
|
if (healingResult.wasModified) {
|
|
693
758
|
normalizedSearchContent = normalizeToEOL(removeLeadingFilepathComment(healingResult.params.search_content, filePath), eol);
|
|
694
759
|
matchInfo = findMatchesInContent(content, normalizedSearchContent);
|
|
@@ -706,17 +771,18 @@ export function createSearchReplaceToolDefinition(deps) {
|
|
|
706
771
|
original_search_length: search_content.length,
|
|
707
772
|
healed_search_length: healedSearchLength,
|
|
708
773
|
match_type_after_healing: matchTypeAfterHealing,
|
|
774
|
+
failure_reason: healingFailureReason,
|
|
709
775
|
});
|
|
710
776
|
}
|
|
711
777
|
if (!usedHealing) {
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
}
|
|
778
|
+
const reasonSuffix = healingFailureReason ? ` Reason: ${healingFailureReason}.` : '';
|
|
779
|
+
return {
|
|
780
|
+
output: {
|
|
781
|
+
success: false,
|
|
782
|
+
error: `Search content not found. Auto-healing attempted but no match found.${reasonSuffix} Try splitting changes into smaller patterns.`,
|
|
783
|
+
healing_failure_reason: healingFailureReason,
|
|
784
|
+
},
|
|
785
|
+
};
|
|
720
786
|
}
|
|
721
787
|
}
|
|
722
788
|
}
|
|
@@ -726,16 +792,13 @@ export function createSearchReplaceToolDefinition(deps) {
|
|
|
726
792
|
replaceAll: replace_all,
|
|
727
793
|
});
|
|
728
794
|
if (!replacementResult.success) {
|
|
729
|
-
return
|
|
730
|
-
output:
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
],
|
|
736
|
-
});
|
|
795
|
+
return {
|
|
796
|
+
output: {
|
|
797
|
+
success: false,
|
|
798
|
+
error: replacementResult.error,
|
|
799
|
+
},
|
|
800
|
+
};
|
|
737
801
|
}
|
|
738
|
-
await writeFileFn(targetPath, replacementResult.newContent);
|
|
739
802
|
if (enableFileLogging) {
|
|
740
803
|
loggingService.debug(`File updated (${replacementResult.matchType} match)`, {
|
|
741
804
|
path: filePath,
|
|
@@ -745,25 +808,100 @@ export function createSearchReplaceToolDefinition(deps) {
|
|
|
745
808
|
});
|
|
746
809
|
}
|
|
747
810
|
const successMessage = usedHealing
|
|
748
|
-
? `Updated ${filePath} (
|
|
811
|
+
? `Updated ${filePath} (Search param has minor difference with actual file, auto healing was used. Reread the file to make sure the edit is correct)`
|
|
749
812
|
: `Updated ${filePath} (${replacementResult.replacedCount} ${replacementResult.matchType} match${replacementResult.replacedCount > 1 ? 'es' : ''})`;
|
|
813
|
+
return {
|
|
814
|
+
newContent: replacementResult.newContent,
|
|
815
|
+
output: {
|
|
816
|
+
success: true,
|
|
817
|
+
operation: 'search_replace',
|
|
818
|
+
path: filePath,
|
|
819
|
+
message: successMessage,
|
|
820
|
+
healed: usedHealing,
|
|
821
|
+
},
|
|
822
|
+
};
|
|
823
|
+
};
|
|
824
|
+
try {
|
|
825
|
+
const operations = getSearchReplaceOperations(params);
|
|
826
|
+
const indexedOperations = operations.map((operation, index) => ({
|
|
827
|
+
operation,
|
|
828
|
+
index,
|
|
829
|
+
targetPath: resolveWorkspacePath(operation.path, cwd),
|
|
830
|
+
}));
|
|
831
|
+
const groups = new Map();
|
|
832
|
+
for (const indexedOperation of indexedOperations) {
|
|
833
|
+
groups.set(indexedOperation.targetPath, [
|
|
834
|
+
...(groups.get(indexedOperation.targetPath) ?? []),
|
|
835
|
+
indexedOperation,
|
|
836
|
+
]);
|
|
837
|
+
}
|
|
838
|
+
const output = new Array(operations.length);
|
|
839
|
+
for (const [targetPath, group] of groups) {
|
|
840
|
+
await withFileLock(targetPath, async () => {
|
|
841
|
+
let content = '';
|
|
842
|
+
let fileExists = true;
|
|
843
|
+
try {
|
|
844
|
+
content = await readFileFn(targetPath);
|
|
845
|
+
}
|
|
846
|
+
catch (error) {
|
|
847
|
+
if (error?.code === 'ENOENT') {
|
|
848
|
+
fileExists = false;
|
|
849
|
+
}
|
|
850
|
+
else {
|
|
851
|
+
throw error;
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
if (enableFileLogging) {
|
|
855
|
+
loggingService.debug(`File operation started: search_replace`, {
|
|
856
|
+
path: group[0].operation.path,
|
|
857
|
+
targetPath,
|
|
858
|
+
operationCount: group.length,
|
|
859
|
+
});
|
|
860
|
+
}
|
|
861
|
+
let nextContent = content;
|
|
862
|
+
let changed = false;
|
|
863
|
+
for (const { operation, index } of group) {
|
|
864
|
+
if (!fileExists) {
|
|
865
|
+
if (operation.search_content === '') {
|
|
866
|
+
nextContent = operation.replace_content;
|
|
867
|
+
fileExists = true;
|
|
868
|
+
changed = true;
|
|
869
|
+
output[index] = {
|
|
870
|
+
success: true,
|
|
871
|
+
operation: 'search_replace',
|
|
872
|
+
path: operation.path,
|
|
873
|
+
message: `Created ${operation.path} (new file)`,
|
|
874
|
+
};
|
|
875
|
+
continue;
|
|
876
|
+
}
|
|
877
|
+
output[index] = {
|
|
878
|
+
success: false,
|
|
879
|
+
error: `File not found: ${operation.path}`,
|
|
880
|
+
};
|
|
881
|
+
continue;
|
|
882
|
+
}
|
|
883
|
+
const result = await applyToContent(operation, nextContent);
|
|
884
|
+
output[index] = result.output;
|
|
885
|
+
if (!result.output.success) {
|
|
886
|
+
continue;
|
|
887
|
+
}
|
|
888
|
+
nextContent = result.newContent;
|
|
889
|
+
changed = true;
|
|
890
|
+
}
|
|
891
|
+
if (changed) {
|
|
892
|
+
await writeFileFn(targetPath, nextContent);
|
|
893
|
+
}
|
|
894
|
+
});
|
|
895
|
+
}
|
|
750
896
|
return JSON.stringify({
|
|
751
|
-
output:
|
|
752
|
-
{
|
|
753
|
-
success: true,
|
|
754
|
-
operation: 'search_replace',
|
|
755
|
-
path: filePath,
|
|
756
|
-
message: successMessage,
|
|
757
|
-
healed: usedHealing,
|
|
758
|
-
},
|
|
759
|
-
],
|
|
897
|
+
output: output.filter(Boolean),
|
|
760
898
|
});
|
|
761
899
|
}
|
|
762
900
|
catch (error) {
|
|
763
901
|
if (enableFileLogging) {
|
|
764
902
|
loggingService.error('File operation failed', {
|
|
765
903
|
type: 'search_replace',
|
|
766
|
-
path: params.path,
|
|
904
|
+
path: 'replacements' in params ? 'multiple' : params.path,
|
|
767
905
|
error: error instanceof Error ? error.message : String(error),
|
|
768
906
|
});
|
|
769
907
|
}
|