@nanocollective/nanocoder 1.22.5 → 1.24.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.md +1 -15
- package/README.md +25 -821
- package/assets/nanocoder-vscode.vsix +0 -0
- package/dist/ai-sdk-client/ai-sdk-client.d.ts +3 -2
- package/dist/ai-sdk-client/ai-sdk-client.d.ts.map +1 -1
- package/dist/ai-sdk-client/ai-sdk-client.js +16 -2
- package/dist/ai-sdk-client/ai-sdk-client.js.map +1 -1
- package/dist/ai-sdk-client/chat/chat-handler.d.ts +2 -1
- package/dist/ai-sdk-client/chat/chat-handler.d.ts.map +1 -1
- package/dist/ai-sdk-client/chat/chat-handler.js +37 -70
- package/dist/ai-sdk-client/chat/chat-handler.js.map +1 -1
- package/dist/ai-sdk-client/chat/streaming-handler.d.ts +2 -2
- package/dist/ai-sdk-client/chat/streaming-handler.d.ts.map +1 -1
- package/dist/ai-sdk-client/chat/streaming-handler.js +4 -23
- package/dist/ai-sdk-client/chat/streaming-handler.js.map +1 -1
- package/dist/ai-sdk-client/error-handling/error-parser.d.ts.map +1 -1
- package/dist/ai-sdk-client/error-handling/error-parser.js +11 -3
- package/dist/ai-sdk-client/error-handling/error-parser.js.map +1 -1
- package/dist/ai-sdk-client/providers/provider-factory.d.ts +2 -1
- package/dist/ai-sdk-client/providers/provider-factory.d.ts.map +1 -1
- package/dist/ai-sdk-client/providers/provider-factory.js +55 -0
- package/dist/ai-sdk-client/providers/provider-factory.js.map +1 -1
- package/dist/app/App.d.ts +1 -1
- package/dist/app/App.d.ts.map +1 -1
- package/dist/app/App.js +148 -37
- package/dist/app/App.js.map +1 -1
- package/dist/app/components/chat-input.d.ts +9 -1
- package/dist/app/components/chat-input.d.ts.map +1 -1
- package/dist/app/components/chat-input.js +11 -8
- package/dist/app/components/chat-input.js.map +1 -1
- package/dist/app/components/modal-selectors.d.ts +6 -7
- package/dist/app/components/modal-selectors.d.ts.map +1 -1
- package/dist/app/components/modal-selectors.js +11 -7
- package/dist/app/components/modal-selectors.js.map +1 -1
- package/dist/app/components/settings-selector.d.ts.map +1 -1
- package/dist/app/components/settings-selector.js +3 -3
- package/dist/app/components/settings-selector.js.map +1 -1
- package/dist/app/helpers.d.ts.map +1 -1
- package/dist/app/helpers.js +2 -4
- package/dist/app/helpers.js.map +1 -1
- package/dist/app/index.d.ts +0 -1
- package/dist/app/index.d.ts.map +1 -1
- package/dist/app/index.js +0 -1
- package/dist/app/index.js.map +1 -1
- package/dist/app/types.d.ts +2 -0
- package/dist/app/types.d.ts.map +1 -1
- package/dist/app/utils/app-util.d.ts +1 -0
- package/dist/app/utils/app-util.d.ts.map +1 -1
- package/dist/app/utils/app-util.js +69 -204
- package/dist/app/utils/app-util.js.map +1 -1
- package/dist/app/utils/handlers/compact-handler.d.ts +6 -0
- package/dist/app/utils/handlers/compact-handler.d.ts.map +1 -0
- package/dist/app/utils/handlers/compact-handler.js +148 -0
- package/dist/app/utils/handlers/compact-handler.js.map +1 -0
- package/dist/app/utils/handlers/context-max-handler.d.ts +11 -0
- package/dist/app/utils/handlers/context-max-handler.d.ts.map +1 -0
- package/dist/app/utils/handlers/context-max-handler.js +102 -0
- package/dist/app/utils/handlers/context-max-handler.js.map +1 -0
- package/dist/app/utils/handlers/create-handler.d.ts +17 -0
- package/dist/app/utils/handlers/create-handler.d.ts.map +1 -0
- package/dist/app/utils/handlers/create-handler.js +112 -0
- package/dist/app/utils/handlers/create-handler.js.map +1 -0
- package/dist/app/utils/handlers/session-handler.d.ts +8 -0
- package/dist/app/utils/handlers/session-handler.d.ts.map +1 -0
- package/dist/app/utils/handlers/session-handler.js +99 -0
- package/dist/app/utils/handlers/session-handler.js.map +1 -0
- package/dist/auth/github-copilot.d.ts +44 -0
- package/dist/auth/github-copilot.d.ts.map +1 -0
- package/dist/auth/github-copilot.js +178 -0
- package/dist/auth/github-copilot.js.map +1 -0
- package/dist/cli.js +64 -3
- package/dist/cli.js.map +1 -1
- package/dist/client-factory.d.ts +1 -1
- package/dist/client-factory.d.ts.map +1 -1
- package/dist/client-factory.js +42 -10
- package/dist/client-factory.js.map +1 -1
- package/dist/commands/compact.d.ts +1 -6
- package/dist/commands/compact.d.ts.map +1 -1
- package/dist/commands/compact.js +2 -13
- package/dist/commands/compact.js.map +1 -1
- package/dist/commands/context-max.d.ts +14 -0
- package/dist/commands/context-max.d.ts.map +1 -0
- package/dist/commands/context-max.js +15 -0
- package/dist/commands/context-max.js.map +1 -0
- package/dist/commands/copilot-login-command.d.ts +3 -0
- package/dist/commands/copilot-login-command.d.ts.map +1 -0
- package/dist/commands/copilot-login-command.js +9 -0
- package/dist/commands/copilot-login-command.js.map +1 -0
- package/dist/commands/copilot-login.d.ts +9 -0
- package/dist/commands/copilot-login.d.ts.map +1 -0
- package/dist/commands/copilot-login.js +70 -0
- package/dist/commands/copilot-login.js.map +1 -0
- package/dist/commands/create-stub-command.d.ts +8 -0
- package/dist/commands/create-stub-command.d.ts.map +1 -0
- package/dist/commands/create-stub-command.js +14 -0
- package/dist/commands/create-stub-command.js.map +1 -0
- package/dist/commands/custom-commands.d.ts.map +1 -1
- package/dist/commands/custom-commands.js +88 -4
- package/dist/commands/custom-commands.js.map +1 -1
- package/dist/commands/exit.d.ts.map +1 -1
- package/dist/commands/exit.js +5 -8
- package/dist/commands/exit.js.map +1 -1
- package/dist/commands/explorer.d.ts +1 -2
- package/dist/commands/explorer.d.ts.map +1 -1
- package/dist/commands/explorer.js +2 -9
- package/dist/commands/explorer.js.map +1 -1
- package/dist/commands/help.d.ts.map +1 -1
- package/dist/commands/help.js +1 -1
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/ide.d.ts +2 -0
- package/dist/commands/ide.d.ts.map +1 -0
- package/dist/commands/ide.js +3 -0
- package/dist/commands/ide.js.map +1 -0
- package/dist/commands/index.d.ts +5 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +5 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +2 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/model.d.ts +1 -2
- package/dist/commands/model.d.ts.map +1 -1
- package/dist/commands/model.js +2 -10
- package/dist/commands/model.js.map +1 -1
- package/dist/commands/provider.d.ts +1 -2
- package/dist/commands/provider.d.ts.map +1 -1
- package/dist/commands/provider.js +2 -10
- package/dist/commands/provider.js.map +1 -1
- package/dist/commands/resume.d.ts +8 -0
- package/dist/commands/resume.d.ts.map +1 -0
- package/dist/commands/resume.js +11 -0
- package/dist/commands/resume.js.map +1 -0
- package/dist/commands/schedule.d.ts +3 -0
- package/dist/commands/schedule.d.ts.map +1 -0
- package/dist/commands/schedule.js +177 -0
- package/dist/commands/schedule.js.map +1 -0
- package/dist/commands/settings.d.ts +1 -2
- package/dist/commands/settings.d.ts.map +1 -1
- package/dist/commands/settings.js +2 -10
- package/dist/commands/settings.js.map +1 -1
- package/dist/commands/status.d.ts +1 -2
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +2 -10
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/usage.d.ts.map +1 -1
- package/dist/commands/usage.js +4 -3
- package/dist/commands/usage.js.map +1 -1
- package/dist/components/assistant-message.d.ts.map +1 -1
- package/dist/components/assistant-message.js +2 -27
- package/dist/components/assistant-message.js.map +1 -1
- package/dist/components/development-mode-indicator.d.ts +3 -2
- package/dist/components/development-mode-indicator.d.ts.map +1 -1
- package/dist/components/development-mode-indicator.js +23 -9
- package/dist/components/development-mode-indicator.js.map +1 -1
- package/dist/components/ide-selector.d.ts +7 -0
- package/dist/components/ide-selector.d.ts.map +1 -0
- package/dist/components/ide-selector.js +17 -0
- package/dist/components/ide-selector.js.map +1 -0
- package/dist/components/provider-selector.d.ts.map +1 -1
- package/dist/components/provider-selector.js +4 -3
- package/dist/components/provider-selector.js.map +1 -1
- package/dist/components/question-prompt.d.ts +8 -0
- package/dist/components/question-prompt.d.ts.map +1 -0
- package/dist/components/question-prompt.js +58 -0
- package/dist/components/question-prompt.js.map +1 -0
- package/dist/components/scheduler-view.d.ts +14 -0
- package/dist/components/scheduler-view.d.ts.map +1 -0
- package/dist/components/scheduler-view.js +17 -0
- package/dist/components/scheduler-view.js.map +1 -0
- package/dist/components/session-selector.d.ts +12 -0
- package/dist/components/session-selector.d.ts.map +1 -0
- package/dist/components/session-selector.js +108 -0
- package/dist/components/session-selector.js.map +1 -0
- package/dist/components/text-input.d.ts +13 -0
- package/dist/components/text-input.d.ts.map +1 -0
- package/dist/components/text-input.js +175 -0
- package/dist/components/text-input.js.map +1 -0
- package/dist/components/tool-confirmation.d.ts.map +1 -1
- package/dist/components/tool-confirmation.js +9 -6
- package/dist/components/tool-confirmation.js.map +1 -1
- package/dist/components/ui/styled-title.js +2 -2
- package/dist/components/ui/styled-title.js.map +1 -1
- package/dist/components/user-input.d.ts +4 -1
- package/dist/components/user-input.d.ts.map +1 -1
- package/dist/components/user-input.js +29 -24
- package/dist/components/user-input.js.map +1 -1
- package/dist/components/user-message.d.ts.map +1 -1
- package/dist/components/user-message.js +1 -23
- package/dist/components/user-message.js.map +1 -1
- package/dist/components/vscode-extension-prompt.d.ts +6 -1
- package/dist/components/vscode-extension-prompt.d.ts.map +1 -1
- package/dist/components/vscode-extension-prompt.js +80 -36
- package/dist/components/vscode-extension-prompt.js.map +1 -1
- package/dist/config/copilot-credentials.d.ts +27 -0
- package/dist/config/copilot-credentials.d.ts.map +1 -0
- package/dist/config/copilot-credentials.js +81 -0
- package/dist/config/copilot-credentials.js.map +1 -0
- package/dist/config/index.d.ts +0 -2
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +63 -27
- package/dist/config/index.js.map +1 -1
- package/dist/config/mcp-config-loader.d.ts +2 -3
- package/dist/config/mcp-config-loader.d.ts.map +1 -1
- package/dist/config/mcp-config-loader.js +136 -181
- package/dist/config/mcp-config-loader.js.map +1 -1
- package/dist/config/nanocoder-tools-config.js +2 -2
- package/dist/config/nanocoder-tools-config.js.map +1 -1
- package/dist/config/themes.d.ts.map +1 -1
- package/dist/config/themes.js +9 -746
- package/dist/config/themes.js.map +1 -1
- package/dist/config/validation.d.ts.map +1 -1
- package/dist/config/validation.js +0 -19
- package/dist/config/validation.js.map +1 -1
- package/dist/custom-commands/command-integration.d.ts +24 -0
- package/dist/custom-commands/command-integration.d.ts.map +1 -0
- package/dist/custom-commands/command-integration.js +68 -0
- package/dist/custom-commands/command-integration.js.map +1 -0
- package/dist/custom-commands/executor.d.ts.map +1 -1
- package/dist/custom-commands/executor.js +12 -2
- package/dist/custom-commands/executor.js.map +1 -1
- package/dist/custom-commands/loader.d.ts +33 -5
- package/dist/custom-commands/loader.d.ts.map +1 -1
- package/dist/custom-commands/loader.js +191 -18
- package/dist/custom-commands/loader.js.map +1 -1
- package/dist/custom-commands/parser.d.ts.map +1 -1
- package/dist/custom-commands/parser.js +106 -48
- package/dist/custom-commands/parser.js.map +1 -1
- package/dist/hooks/chat-handler/conversation/conversation-loop.d.ts +6 -1
- package/dist/hooks/chat-handler/conversation/conversation-loop.d.ts.map +1 -1
- package/dist/hooks/chat-handler/conversation/conversation-loop.js +89 -76
- package/dist/hooks/chat-handler/conversation/conversation-loop.js.map +1 -1
- package/dist/hooks/chat-handler/conversation/tool-executor.d.ts +7 -2
- package/dist/hooks/chat-handler/conversation/tool-executor.d.ts.map +1 -1
- package/dist/hooks/chat-handler/conversation/tool-executor.js +109 -41
- package/dist/hooks/chat-handler/conversation/tool-executor.js.map +1 -1
- package/dist/hooks/chat-handler/types.d.ts +6 -1
- package/dist/hooks/chat-handler/types.d.ts.map +1 -1
- package/dist/hooks/chat-handler/useChatHandler.d.ts +1 -1
- package/dist/hooks/chat-handler/useChatHandler.d.ts.map +1 -1
- package/dist/hooks/chat-handler/useChatHandler.js +19 -5
- package/dist/hooks/chat-handler/useChatHandler.js.map +1 -1
- package/dist/hooks/useAppHandlers.d.ts +10 -1
- package/dist/hooks/useAppHandlers.d.ts.map +1 -1
- package/dist/hooks/useAppHandlers.js +124 -13
- package/dist/hooks/useAppHandlers.js.map +1 -1
- package/dist/hooks/useAppInitialization.d.ts +5 -3
- package/dist/hooks/useAppInitialization.d.ts.map +1 -1
- package/dist/hooks/useAppInitialization.js +54 -30
- package/dist/hooks/useAppInitialization.js.map +1 -1
- package/dist/hooks/useAppState.d.ts +27 -7
- package/dist/hooks/useAppState.d.ts.map +1 -1
- package/dist/hooks/useAppState.js +54 -22
- package/dist/hooks/useAppState.js.map +1 -1
- package/dist/hooks/useContextPercentage.d.ts +17 -0
- package/dist/hooks/useContextPercentage.d.ts.map +1 -0
- package/dist/hooks/useContextPercentage.js +71 -0
- package/dist/hooks/useContextPercentage.js.map +1 -0
- package/dist/hooks/useModeHandlers.d.ts +9 -12
- package/dist/hooks/useModeHandlers.d.ts.map +1 -1
- package/dist/hooks/useModeHandlers.js +31 -91
- package/dist/hooks/useModeHandlers.js.map +1 -1
- package/dist/hooks/useNonInteractiveMode.d.ts +7 -0
- package/dist/hooks/useNonInteractiveMode.d.ts.map +1 -1
- package/dist/hooks/useNonInteractiveMode.js +42 -3
- package/dist/hooks/useNonInteractiveMode.js.map +1 -1
- package/dist/hooks/useSchedulerMode.d.ts +30 -0
- package/dist/hooks/useSchedulerMode.d.ts.map +1 -0
- package/dist/hooks/useSchedulerMode.js +99 -0
- package/dist/hooks/useSchedulerMode.js.map +1 -0
- package/dist/hooks/useSessionAutosave.d.ts +16 -0
- package/dist/hooks/useSessionAutosave.d.ts.map +1 -0
- package/dist/hooks/useSessionAutosave.js +133 -0
- package/dist/hooks/useSessionAutosave.js.map +1 -0
- package/dist/hooks/useToolHandler.d.ts +2 -1
- package/dist/hooks/useToolHandler.d.ts.map +1 -1
- package/dist/hooks/useToolHandler.js +9 -3
- package/dist/hooks/useToolHandler.js.map +1 -1
- package/dist/lsp/lsp-manager.d.ts.map +1 -1
- package/dist/lsp/lsp-manager.js +10 -0
- package/dist/lsp/lsp-manager.js.map +1 -1
- package/dist/mcp/mcp-client.d.ts.map +1 -1
- package/dist/mcp/mcp-client.js +23 -3
- package/dist/mcp/mcp-client.js.map +1 -1
- package/dist/mcp/transport-factory.d.ts.map +1 -1
- package/dist/mcp/transport-factory.js +4 -36
- package/dist/mcp/transport-factory.js.map +1 -1
- package/dist/models/index.d.ts +1 -1
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +1 -1
- package/dist/models/index.js.map +1 -1
- package/dist/models/models-dev-client.d.ts +8 -1
- package/dist/models/models-dev-client.d.ts.map +1 -1
- package/dist/models/models-dev-client.js +71 -15
- package/dist/models/models-dev-client.js.map +1 -1
- package/dist/schedule/cron.d.ts +14 -0
- package/dist/schedule/cron.d.ts.map +1 -0
- package/dist/schedule/cron.js +107 -0
- package/dist/schedule/cron.js.map +1 -0
- package/dist/schedule/index.d.ts +4 -0
- package/dist/schedule/index.d.ts.map +1 -0
- package/dist/schedule/index.js +4 -0
- package/dist/schedule/index.js.map +1 -0
- package/dist/schedule/runner.d.ts +42 -0
- package/dist/schedule/runner.d.ts.map +1 -0
- package/dist/schedule/runner.js +136 -0
- package/dist/schedule/runner.js.map +1 -0
- package/dist/schedule/storage.d.ts +9 -0
- package/dist/schedule/storage.d.ts.map +1 -0
- package/dist/schedule/storage.js +68 -0
- package/dist/schedule/storage.js.map +1 -0
- package/dist/schedule/types.d.ts +24 -0
- package/dist/schedule/types.d.ts.map +1 -0
- package/dist/schedule/types.js +2 -0
- package/dist/schedule/types.js.map +1 -0
- package/dist/services/bash-executor.d.ts.map +1 -1
- package/dist/services/bash-executor.js +5 -0
- package/dist/services/bash-executor.js.map +1 -1
- package/dist/session/session-manager.d.ts +57 -0
- package/dist/session/session-manager.d.ts.map +1 -0
- package/dist/session/session-manager.js +361 -0
- package/dist/session/session-manager.js.map +1 -0
- package/dist/test-utils/render-with-theme.d.ts.map +1 -1
- package/dist/test-utils/render-with-theme.js +2 -1
- package/dist/test-utils/render-with-theme.js.map +1 -1
- package/dist/tool-calling/tool-parser.d.ts +4 -3
- package/dist/tool-calling/tool-parser.d.ts.map +1 -1
- package/dist/tool-calling/tool-parser.js +17 -34
- package/dist/tool-calling/tool-parser.js.map +1 -1
- package/dist/tool-calling/xml-parser.d.ts +8 -4
- package/dist/tool-calling/xml-parser.d.ts.map +1 -1
- package/dist/tool-calling/xml-parser.js +15 -5
- package/dist/tool-calling/xml-parser.js.map +1 -1
- package/dist/tools/ask-question.d.ts +3 -0
- package/dist/tools/ask-question.d.ts.map +1 -0
- package/dist/tools/ask-question.js +66 -0
- package/dist/tools/ask-question.js.map +1 -0
- package/dist/tools/execute-bash.d.ts.map +1 -1
- package/dist/tools/execute-bash.js +6 -1
- package/dist/tools/execute-bash.js.map +1 -1
- package/dist/tools/fetch-url.d.ts.map +1 -1
- package/dist/tools/fetch-url.js +11 -2
- package/dist/tools/fetch-url.js.map +1 -1
- package/dist/tools/file-ops/copy-file.d.ts +3 -0
- package/dist/tools/file-ops/copy-file.d.ts.map +1 -0
- package/dist/tools/file-ops/copy-file.js +96 -0
- package/dist/tools/file-ops/copy-file.js.map +1 -0
- package/dist/tools/file-ops/create-directory.d.ts +3 -0
- package/dist/tools/file-ops/create-directory.d.ts.map +1 -0
- package/dist/tools/file-ops/create-directory.js +59 -0
- package/dist/tools/file-ops/create-directory.js.map +1 -0
- package/dist/tools/file-ops/delete-file.d.ts +3 -0
- package/dist/tools/file-ops/delete-file.d.ts.map +1 -0
- package/dist/tools/file-ops/delete-file.js +74 -0
- package/dist/tools/file-ops/delete-file.js.map +1 -0
- package/dist/tools/file-ops/index.d.ts +3 -0
- package/dist/tools/file-ops/index.d.ts.map +1 -0
- package/dist/tools/file-ops/index.js +8 -0
- package/dist/tools/file-ops/index.js.map +1 -0
- package/dist/tools/file-ops/move-file.d.ts +3 -0
- package/dist/tools/file-ops/move-file.d.ts.map +1 -0
- package/dist/tools/file-ops/move-file.js +96 -0
- package/dist/tools/file-ops/move-file.js.map +1 -0
- package/dist/tools/file-ops/string-replace-preview.d.ts +10 -0
- package/dist/tools/file-ops/string-replace-preview.d.ts.map +1 -0
- package/dist/tools/file-ops/string-replace-preview.js +171 -0
- package/dist/tools/file-ops/string-replace-preview.js.map +1 -0
- package/dist/tools/file-ops/string-replace.d.ts +3 -0
- package/dist/tools/file-ops/string-replace.d.ts.map +1 -0
- package/dist/tools/file-ops/string-replace.js +178 -0
- package/dist/tools/file-ops/string-replace.js.map +1 -0
- package/dist/tools/file-ops/write-file.d.ts +3 -0
- package/dist/tools/file-ops/write-file.d.ts.map +1 -0
- package/dist/tools/{write-file.js → file-ops/write-file.js} +34 -79
- package/dist/tools/file-ops/write-file.js.map +1 -0
- package/dist/tools/find-files.d.ts.map +1 -1
- package/dist/tools/find-files.js +1 -0
- package/dist/tools/find-files.js.map +1 -1
- package/dist/tools/git/git-diff.d.ts.map +1 -1
- package/dist/tools/git/git-diff.js +1 -0
- package/dist/tools/git/git-diff.js.map +1 -1
- package/dist/tools/git/git-log.d.ts.map +1 -1
- package/dist/tools/git/git-log.js +1 -0
- package/dist/tools/git/git-log.js.map +1 -1
- package/dist/tools/git/git-reset.js +1 -1
- package/dist/tools/git/git-reset.js.map +1 -1
- package/dist/tools/git/git-status.d.ts.map +1 -1
- package/dist/tools/git/git-status.js +1 -0
- package/dist/tools/git/git-status.js.map +1 -1
- package/dist/tools/git/index.js +3 -3
- package/dist/tools/git/index.js.map +1 -1
- package/dist/tools/git/utils.d.ts +4 -0
- package/dist/tools/git/utils.d.ts.map +1 -1
- package/dist/tools/git/utils.js +12 -0
- package/dist/tools/git/utils.js.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +15 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/list-directory.d.ts.map +1 -1
- package/dist/tools/list-directory.js +2 -1
- package/dist/tools/list-directory.js.map +1 -1
- package/dist/tools/lsp-get-diagnostics.d.ts.map +1 -1
- package/dist/tools/lsp-get-diagnostics.js +1 -5
- package/dist/tools/lsp-get-diagnostics.js.map +1 -1
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +1 -0
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/search-file-contents.d.ts.map +1 -1
- package/dist/tools/search-file-contents.js +60 -10
- package/dist/tools/search-file-contents.js.map +1 -1
- package/dist/tools/tasks/list-tasks.d.ts.map +1 -1
- package/dist/tools/tasks/list-tasks.js +1 -0
- package/dist/tools/tasks/list-tasks.js.map +1 -1
- package/dist/tools/tool-manager.d.ts +10 -0
- package/dist/tools/tool-manager.d.ts.map +1 -1
- package/dist/tools/tool-manager.js +25 -2
- package/dist/tools/tool-manager.js.map +1 -1
- package/dist/tools/tool-registry.d.ts +9 -1
- package/dist/tools/tool-registry.d.ts.map +1 -1
- package/dist/tools/tool-registry.js +17 -1
- package/dist/tools/tool-registry.js.map +1 -1
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +1 -0
- package/dist/tools/web-search.js.map +1 -1
- package/dist/types/app.d.ts +5 -0
- package/dist/types/app.d.ts.map +1 -1
- package/dist/types/commands.d.ts +20 -1
- package/dist/types/commands.d.ts.map +1 -1
- package/dist/types/config.d.ts +11 -15
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/core.d.ts +15 -4
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/core.js +7 -0
- package/dist/types/core.js.map +1 -1
- package/dist/types/markdown-parser.d.ts +2 -10
- package/dist/types/markdown-parser.d.ts.map +1 -1
- package/dist/types/mcp.d.ts +2 -28
- package/dist/types/mcp.d.ts.map +1 -1
- package/dist/types/ui.d.ts +1 -1
- package/dist/types/ui.d.ts.map +1 -1
- package/dist/utils/ansi-truncate.d.ts +6 -0
- package/dist/utils/ansi-truncate.d.ts.map +1 -0
- package/dist/utils/ansi-truncate.js +39 -0
- package/dist/utils/ansi-truncate.js.map +1 -0
- package/dist/utils/auto-compact.d.ts.map +1 -1
- package/dist/utils/auto-compact.js +13 -7
- package/dist/utils/auto-compact.js.map +1 -1
- package/dist/utils/installation-detector.d.ts +6 -0
- package/dist/utils/installation-detector.d.ts.map +1 -1
- package/dist/utils/installation-detector.js +33 -19
- package/dist/utils/installation-detector.js.map +1 -1
- package/dist/utils/logging/health-monitor/checks/memory-check.d.ts.map +1 -1
- package/dist/utils/logging/health-monitor/checks/memory-check.js +2 -1
- package/dist/utils/logging/health-monitor/checks/memory-check.js.map +1 -1
- package/dist/utils/logging/health-monitor/core/health-monitor.d.ts.map +1 -1
- package/dist/utils/logging/health-monitor/core/health-monitor.js +3 -2
- package/dist/utils/logging/health-monitor/core/health-monitor.js.map +1 -1
- package/dist/utils/logging/index.d.ts.map +1 -1
- package/dist/utils/logging/index.js +18 -30
- package/dist/utils/logging/index.js.map +1 -1
- package/dist/utils/logging/performance.d.ts.map +1 -1
- package/dist/utils/logging/performance.js +21 -17
- package/dist/utils/logging/performance.js.map +1 -1
- package/dist/utils/logging/pino-logger.d.ts.map +1 -1
- package/dist/utils/logging/pino-logger.js +7 -8
- package/dist/utils/logging/pino-logger.js.map +1 -1
- package/dist/utils/logging/redaction.d.ts.map +1 -1
- package/dist/utils/logging/redaction.js +2 -0
- package/dist/utils/logging/redaction.js.map +1 -1
- package/dist/utils/logging/request-tracker.d.ts.map +1 -1
- package/dist/utils/logging/request-tracker.js +6 -5
- package/dist/utils/logging/request-tracker.js.map +1 -1
- package/dist/utils/logging/safe-process.d.ts +16 -0
- package/dist/utils/logging/safe-process.d.ts.map +1 -0
- package/dist/utils/logging/safe-process.js +37 -0
- package/dist/utils/logging/safe-process.js.map +1 -0
- package/dist/utils/logging/types.d.ts +0 -3
- package/dist/utils/logging/types.d.ts.map +1 -1
- package/dist/utils/message-builder.d.ts +0 -5
- package/dist/utils/message-builder.d.ts.map +1 -1
- package/dist/utils/message-builder.js +0 -8
- package/dist/utils/message-builder.js.map +1 -1
- package/dist/utils/path-validation.d.ts.map +1 -1
- package/dist/utils/path-validation.js +3 -1
- package/dist/utils/path-validation.js.map +1 -1
- package/dist/utils/path-validators.d.ts +16 -0
- package/dist/utils/path-validators.d.ts.map +1 -0
- package/dist/utils/path-validators.js +55 -0
- package/dist/utils/path-validators.js.map +1 -0
- package/dist/utils/question-queue.d.ts +15 -0
- package/dist/utils/question-queue.d.ts.map +1 -0
- package/dist/utils/question-queue.js +25 -0
- package/dist/utils/question-queue.js.map +1 -0
- package/dist/utils/response-formatter.d.ts +108 -0
- package/dist/utils/response-formatter.d.ts.map +1 -0
- package/dist/utils/response-formatter.js +372 -0
- package/dist/utils/response-formatter.js.map +1 -0
- package/dist/utils/shutdown/index.d.ts +7 -0
- package/dist/utils/shutdown/index.d.ts.map +1 -0
- package/dist/utils/shutdown/index.js +6 -0
- package/dist/utils/shutdown/index.js.map +1 -0
- package/dist/utils/shutdown/shutdown-manager.d.ts +19 -0
- package/dist/utils/shutdown/shutdown-manager.d.ts.map +1 -0
- package/dist/utils/shutdown/shutdown-manager.js +100 -0
- package/dist/utils/shutdown/shutdown-manager.js.map +1 -0
- package/dist/utils/shutdown/types.d.ts +9 -0
- package/dist/utils/shutdown/types.d.ts.map +1 -0
- package/dist/utils/shutdown/types.js +2 -0
- package/dist/utils/shutdown/types.js.map +1 -0
- package/dist/utils/text-wrapping.d.ts +8 -0
- package/dist/utils/text-wrapping.d.ts.map +1 -0
- package/dist/utils/text-wrapping.js +29 -0
- package/dist/utils/text-wrapping.js.map +1 -0
- package/dist/utils/tool-approval.d.ts +6 -0
- package/dist/utils/tool-approval.d.ts.map +1 -0
- package/dist/utils/tool-approval.js +15 -0
- package/dist/utils/tool-approval.js.map +1 -0
- package/dist/utils/tool-result-display.d.ts +15 -1
- package/dist/utils/tool-result-display.d.ts.map +1 -1
- package/dist/utils/tool-result-display.js +93 -3
- package/dist/utils/tool-result-display.js.map +1 -1
- package/dist/utils/type-helpers.d.ts +140 -0
- package/dist/utils/type-helpers.d.ts.map +1 -0
- package/dist/utils/type-helpers.js +220 -0
- package/dist/utils/type-helpers.js.map +1 -0
- package/dist/utils/url-utils.d.ts +6 -0
- package/dist/utils/url-utils.d.ts.map +1 -0
- package/dist/utils/url-utils.js +22 -0
- package/dist/utils/url-utils.js.map +1 -0
- package/dist/vscode/extension-installer.d.ts +34 -7
- package/dist/vscode/extension-installer.d.ts.map +1 -1
- package/dist/vscode/extension-installer.js +151 -64
- package/dist/vscode/extension-installer.js.map +1 -1
- package/dist/vscode/index.d.ts +1 -1
- package/dist/vscode/index.d.ts.map +1 -1
- package/dist/vscode/index.js +1 -1
- package/dist/vscode/index.js.map +1 -1
- package/dist/vscode/vscode-server.d.ts.map +1 -1
- package/dist/vscode/vscode-server.js +10 -0
- package/dist/vscode/vscode-server.js.map +1 -1
- package/dist/wizards/mcp-wizard.d.ts.map +1 -1
- package/dist/wizards/mcp-wizard.js +2 -1
- package/dist/wizards/mcp-wizard.js.map +1 -1
- package/dist/wizards/provider-wizard.d.ts.map +1 -1
- package/dist/wizards/provider-wizard.js +4 -2
- package/dist/wizards/provider-wizard.js.map +1 -1
- package/dist/wizards/steps/location-step.d.ts.map +1 -1
- package/dist/wizards/steps/location-step.js +2 -1
- package/dist/wizards/steps/location-step.js.map +1 -1
- package/dist/wizards/steps/mcp-step.d.ts.map +1 -1
- package/dist/wizards/steps/mcp-step.js +3 -2
- package/dist/wizards/steps/mcp-step.js.map +1 -1
- package/dist/wizards/steps/provider-step.d.ts.map +1 -1
- package/dist/wizards/steps/provider-step.js +5 -2
- package/dist/wizards/steps/provider-step.js.map +1 -1
- package/dist/wizards/steps/summary-step.d.ts.map +1 -1
- package/dist/wizards/steps/summary-step.js +2 -1
- package/dist/wizards/steps/summary-step.js.map +1 -1
- package/dist/wizards/templates/mcp-templates.d.ts +0 -8
- package/dist/wizards/templates/mcp-templates.d.ts.map +1 -1
- package/dist/wizards/templates/mcp-templates.js +8 -6
- package/dist/wizards/templates/mcp-templates.js.map +1 -1
- package/dist/wizards/templates/provider-templates.d.ts.map +1 -1
- package/dist/wizards/templates/provider-templates.js +59 -0
- package/dist/wizards/templates/provider-templates.js.map +1 -1
- package/dist/wizards/validation.d.ts.map +1 -1
- package/dist/wizards/validation.js +2 -4
- package/dist/wizards/validation.js.map +1 -1
- package/package.json +22 -23
- package/source/app/prompts/main-prompt.md +21 -3
- package/source/config/themes.json +787 -0
- package/dist/ai-sdk-client/chat/tool-processor.d.ts +0 -10
- package/dist/ai-sdk-client/chat/tool-processor.d.ts.map +0 -1
- package/dist/ai-sdk-client/chat/tool-processor.js +0 -53
- package/dist/ai-sdk-client/chat/tool-processor.js.map +0 -1
- package/dist/hooks/chat-handler/utils/context-checker.d.ts +0 -15
- package/dist/hooks/chat-handler/utils/context-checker.d.ts.map +0 -1
- package/dist/hooks/chat-handler/utils/context-checker.js +0 -68
- package/dist/hooks/chat-handler/utils/context-checker.js.map +0 -1
- package/dist/tool-calling/json-parser.d.ts +0 -24
- package/dist/tool-calling/json-parser.d.ts.map +0 -1
- package/dist/tool-calling/json-parser.js +0 -202
- package/dist/tool-calling/json-parser.js.map +0 -1
- package/dist/tools/string-replace.d.ts +0 -3
- package/dist/tools/string-replace.d.ts.map +0 -1
- package/dist/tools/string-replace.js +0 -461
- package/dist/tools/string-replace.js.map +0 -1
- package/dist/tools/write-file.d.ts +0 -3
- package/dist/tools/write-file.d.ts.map +0 -1
- package/dist/tools/write-file.js.map +0 -1
|
@@ -1,49 +1,61 @@
|
|
|
1
1
|
import { readFileSync } from 'fs';
|
|
2
2
|
import { logError } from '../utils/message-queue.js';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Set of frontmatter keys that are always parsed as arrays
|
|
5
|
+
*/
|
|
6
|
+
const ARRAY_KEYS = new Set([
|
|
7
|
+
'aliases',
|
|
8
|
+
'parameters',
|
|
9
|
+
'tags',
|
|
10
|
+
'triggers',
|
|
11
|
+
'examples',
|
|
12
|
+
'references',
|
|
13
|
+
'dependencies',
|
|
14
|
+
]);
|
|
15
|
+
/**
|
|
16
|
+
* Set of frontmatter keys that are parsed as numbers
|
|
17
|
+
*/
|
|
18
|
+
const NUMBER_KEYS = new Set(['estimated-tokens']);
|
|
19
|
+
/**
|
|
20
|
+
* Parse a value that may be a JSON-style array or a single item.
|
|
21
|
+
* Returns an array of strings.
|
|
22
|
+
*/
|
|
23
|
+
function parseArrayValue(value) {
|
|
24
|
+
const trimmed = value.trim();
|
|
25
|
+
if (trimmed.startsWith('[') && trimmed.endsWith(']')) {
|
|
26
|
+
const content = trimmed.slice(1, -1);
|
|
27
|
+
return content
|
|
28
|
+
.split(',')
|
|
29
|
+
.map(s => s.trim().replace(/^["']|["']$/g, ''))
|
|
30
|
+
.filter(s => s.length > 0);
|
|
31
|
+
}
|
|
32
|
+
const cleaned = trimmed.replace(/^["']|["']$/g, '');
|
|
33
|
+
return cleaned ? [cleaned] : [];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Enhanced YAML frontmatter parser with support for multi-line strings,
|
|
37
|
+
* arrays, and all command/skill metadata fields.
|
|
5
38
|
*/
|
|
6
39
|
function parseEnhancedFrontmatter(frontmatter) {
|
|
7
|
-
const
|
|
40
|
+
const raw = {};
|
|
8
41
|
const lines = frontmatter.split('\n');
|
|
9
42
|
let currentKey = null;
|
|
10
43
|
let currentValue = [];
|
|
11
44
|
let isMultiline = false;
|
|
12
45
|
let indentLevel = 0;
|
|
13
|
-
const
|
|
46
|
+
const storeValue = (key, value) => {
|
|
14
47
|
const trimmedValue = value.trim();
|
|
15
|
-
if (key
|
|
16
|
-
|
|
48
|
+
if (ARRAY_KEYS.has(key)) {
|
|
49
|
+
raw[key] = parseArrayValue(trimmedValue);
|
|
17
50
|
}
|
|
18
|
-
else if (key
|
|
19
|
-
|
|
20
|
-
if (
|
|
21
|
-
|
|
22
|
-
const content = trimmedValue.slice(1, -1);
|
|
23
|
-
metadata.aliases = content
|
|
24
|
-
.split(',')
|
|
25
|
-
.map(s => s.trim().replace(/^["']|["']$/g, ''))
|
|
26
|
-
.filter(s => s.length > 0);
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
// Single value or will be handled by dash parsing below
|
|
30
|
-
metadata.aliases = [trimmedValue.replace(/^["']|["']$/g, '')];
|
|
51
|
+
else if (NUMBER_KEYS.has(key)) {
|
|
52
|
+
const num = Number(trimmedValue);
|
|
53
|
+
if (!Number.isNaN(num)) {
|
|
54
|
+
raw[key] = num;
|
|
31
55
|
}
|
|
32
56
|
}
|
|
33
|
-
else
|
|
34
|
-
|
|
35
|
-
if (trimmedValue.startsWith('[') && trimmedValue.endsWith(']')) {
|
|
36
|
-
// JSON-style array: [param1, param2]
|
|
37
|
-
const content = trimmedValue.slice(1, -1);
|
|
38
|
-
metadata.parameters = content
|
|
39
|
-
.split(',')
|
|
40
|
-
.map(s => s.trim().replace(/^["']|["']$/g, ''))
|
|
41
|
-
.filter(s => s.length > 0);
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
// Single value or will be handled by dash parsing below
|
|
45
|
-
metadata.parameters = [trimmedValue.replace(/^["']|["']$/g, '')];
|
|
46
|
-
}
|
|
57
|
+
else {
|
|
58
|
+
raw[key] = trimmedValue.replace(/^["']|["']$/g, '');
|
|
47
59
|
}
|
|
48
60
|
};
|
|
49
61
|
for (let i = 0; i < lines.length; i++) {
|
|
@@ -56,21 +68,16 @@ function parseEnhancedFrontmatter(frontmatter) {
|
|
|
56
68
|
continue;
|
|
57
69
|
}
|
|
58
70
|
// Check for YAML dash syntax (array items)
|
|
59
|
-
if (trimmedLine.startsWith('- ') &&
|
|
71
|
+
if (trimmedLine.startsWith('- ') &&
|
|
72
|
+
currentKey &&
|
|
73
|
+
ARRAY_KEYS.has(currentKey)) {
|
|
60
74
|
const arrayItem = trimmedLine
|
|
61
75
|
.slice(2)
|
|
62
76
|
.trim()
|
|
63
77
|
.replace(/^["']|["']$/g, '');
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
metadata.aliases.push(arrayItem);
|
|
68
|
-
}
|
|
69
|
-
else if (currentKey === 'parameters') {
|
|
70
|
-
if (!metadata.parameters)
|
|
71
|
-
metadata.parameters = [];
|
|
72
|
-
metadata.parameters.push(arrayItem);
|
|
73
|
-
}
|
|
78
|
+
const arr = raw[currentKey] ?? [];
|
|
79
|
+
arr.push(arrayItem);
|
|
80
|
+
raw[currentKey] = arr;
|
|
74
81
|
continue;
|
|
75
82
|
}
|
|
76
83
|
// Check for multi-line string indicators
|
|
@@ -96,7 +103,7 @@ function parseEnhancedFrontmatter(frontmatter) {
|
|
|
96
103
|
else if (trimmedLine && lineIndent < indentLevel) {
|
|
97
104
|
// End of multi-line block
|
|
98
105
|
const multilineContent = currentValue.join('\n').trim();
|
|
99
|
-
|
|
106
|
+
storeValue(currentKey, multilineContent);
|
|
100
107
|
isMultiline = false;
|
|
101
108
|
currentKey = null;
|
|
102
109
|
currentValue = [];
|
|
@@ -111,24 +118,75 @@ function parseEnhancedFrontmatter(frontmatter) {
|
|
|
111
118
|
// If this is the last line, process the accumulated multi-line value
|
|
112
119
|
if (i === lines.length - 1 && currentValue.length > 0) {
|
|
113
120
|
const multilineContent = currentValue.join('\n').trim();
|
|
114
|
-
|
|
121
|
+
storeValue(currentKey, multilineContent);
|
|
115
122
|
}
|
|
116
123
|
continue;
|
|
117
124
|
}
|
|
118
|
-
// Handle regular key-value pairs
|
|
119
|
-
const colonIndex = line
|
|
125
|
+
// Handle regular key-value pairs — find colon outside quotes
|
|
126
|
+
const colonIndex = findColonOutsideQuotes(line);
|
|
120
127
|
if (colonIndex === -1)
|
|
121
128
|
continue;
|
|
122
129
|
const key = line.slice(0, colonIndex).trim();
|
|
123
130
|
const value = line.slice(colonIndex + 1).trim();
|
|
124
131
|
if (value) {
|
|
125
|
-
|
|
132
|
+
storeValue(key, value);
|
|
126
133
|
currentKey = key; // For potential array items following
|
|
127
134
|
}
|
|
128
135
|
else {
|
|
129
136
|
currentKey = key; // Key with no immediate value, might have array items below
|
|
130
137
|
}
|
|
131
138
|
}
|
|
139
|
+
return mapRawToMetadata(raw);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Find the first colon that is not inside single or double quotes.
|
|
143
|
+
*/
|
|
144
|
+
function findColonOutsideQuotes(line) {
|
|
145
|
+
let inSingleQuote = false;
|
|
146
|
+
let inDoubleQuote = false;
|
|
147
|
+
for (let i = 0; i < line.length; i++) {
|
|
148
|
+
const char = line[i];
|
|
149
|
+
if (char === "'" && !inDoubleQuote) {
|
|
150
|
+
inSingleQuote = !inSingleQuote;
|
|
151
|
+
}
|
|
152
|
+
else if (char === '"' && !inSingleQuote) {
|
|
153
|
+
inDoubleQuote = !inDoubleQuote;
|
|
154
|
+
}
|
|
155
|
+
else if (char === ':' && !inSingleQuote && !inDoubleQuote) {
|
|
156
|
+
return i;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return -1;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Map raw parsed key-value pairs to typed CustomCommandMetadata.
|
|
163
|
+
*/
|
|
164
|
+
function mapRawToMetadata(raw) {
|
|
165
|
+
const metadata = {};
|
|
166
|
+
if (raw.description)
|
|
167
|
+
metadata.description = raw.description;
|
|
168
|
+
if (raw.aliases)
|
|
169
|
+
metadata.aliases = raw.aliases;
|
|
170
|
+
if (raw.parameters)
|
|
171
|
+
metadata.parameters = raw.parameters;
|
|
172
|
+
if (raw.tags)
|
|
173
|
+
metadata.tags = raw.tags;
|
|
174
|
+
if (raw.triggers)
|
|
175
|
+
metadata.triggers = raw.triggers;
|
|
176
|
+
if (typeof raw['estimated-tokens'] === 'number')
|
|
177
|
+
metadata.estimatedTokens = raw['estimated-tokens'];
|
|
178
|
+
if (raw.category)
|
|
179
|
+
metadata.category = raw.category;
|
|
180
|
+
if (raw.version)
|
|
181
|
+
metadata.version = raw.version;
|
|
182
|
+
if (raw.author)
|
|
183
|
+
metadata.author = raw.author;
|
|
184
|
+
if (raw.examples)
|
|
185
|
+
metadata.examples = raw.examples;
|
|
186
|
+
if (raw.references)
|
|
187
|
+
metadata.references = raw.references;
|
|
188
|
+
if (raw.dependencies)
|
|
189
|
+
metadata.dependencies = raw.dependencies;
|
|
132
190
|
return metadata;
|
|
133
191
|
}
|
|
134
192
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../source/custom-commands/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,IAAI,CAAC;AAEhC,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAE/C;;GAEG;AACH,
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../source/custom-commands/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,13 +17,18 @@ interface ProcessAssistantResponseParams {
|
|
|
17
17
|
getNextComponentKey: () => number;
|
|
18
18
|
currentProvider: string;
|
|
19
19
|
currentModel: string;
|
|
20
|
-
developmentMode: 'normal' | 'auto-accept' | 'plan';
|
|
20
|
+
developmentMode: 'normal' | 'auto-accept' | 'plan' | 'scheduler';
|
|
21
21
|
nonInteractiveMode: boolean;
|
|
22
22
|
conversationStateManager: React.MutableRefObject<ConversationStateManager>;
|
|
23
23
|
onStartToolConfirmationFlow: (toolCalls: ToolCall[], updatedMessages: Message[], assistantMsg: Message, systemMessage: Message) => void;
|
|
24
24
|
onConversationComplete?: () => void;
|
|
25
25
|
conversationStartTime?: number;
|
|
26
|
+
compactToolDisplayRef?: React.RefObject<boolean>;
|
|
27
|
+
onSetCompactToolCounts?: (counts: Record<string, number> | null) => void;
|
|
28
|
+
compactToolCountsRef?: React.MutableRefObject<Record<string, number>>;
|
|
26
29
|
}
|
|
30
|
+
/** Reset the fallback notice flag (for testing). */
|
|
31
|
+
export declare const resetFallbackNotice: () => void;
|
|
27
32
|
/**
|
|
28
33
|
* Main conversation loop that processes assistant responses and handles tool calls.
|
|
29
34
|
* This function orchestrates the entire conversation flow including:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-loop.d.ts","sourceRoot":"","sources":["../../../../source/hooks/chat-handler/conversation/conversation-loop.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,gCAAgC,CAAC;AAM7E,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"conversation-loop.d.ts","sourceRoot":"","sources":["../../../../source/hooks/chat-handler/conversation/conversation-loop.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,gCAAgC,CAAC;AAM7E,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EACX,SAAS,EACT,OAAO,EAEP,QAAQ,EAER,MAAM,cAAc,CAAC;AAStB,UAAU,8BAA8B;IACvC,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,SAAS,CAAC;IAClB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,kBAAkB,EAAE,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;IACjE,eAAe,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,mBAAmB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,WAAW,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAC3C,cAAc,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;IACrD,mBAAmB,EAAE,MAAM,MAAM,CAAC;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,QAAQ,GAAG,aAAa,GAAG,MAAM,GAAG,WAAW,CAAC;IACjE,kBAAkB,EAAE,OAAO,CAAC;IAC5B,wBAAwB,EAAE,KAAK,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAAC;IAC3E,2BAA2B,EAAE,CAC5B,SAAS,EAAE,QAAQ,EAAE,EACrB,eAAe,EAAE,OAAO,EAAE,EAC1B,YAAY,EAAE,OAAO,EACrB,aAAa,EAAE,OAAO,KAClB,IAAI,CAAC;IACV,sBAAsB,CAAC,EAAE,MAAM,IAAI,CAAC;IACpC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,qBAAqB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACjD,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;IACzE,oBAAoB,CAAC,EAAE,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACtE;AAKD,oDAAoD;AACpD,eAAO,MAAM,mBAAmB,YAE/B,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,GACpC,QAAQ,8BAA8B,KACpC,OAAO,CAAC,IAAI,CAwfd,CAAC"}
|
|
@@ -3,15 +3,21 @@ import React from 'react';
|
|
|
3
3
|
import AssistantMessage from '../../../components/assistant-message.js';
|
|
4
4
|
import { ErrorMessage, InfoMessage } from '../../../components/message-box.js';
|
|
5
5
|
import UserMessage from '../../../components/user-message.js';
|
|
6
|
-
import {
|
|
6
|
+
import { getAppConfig } from '../../../config/index.js';
|
|
7
7
|
import { parseToolCalls } from '../../../tool-calling/index.js';
|
|
8
8
|
import { performAutoCompact } from '../../../utils/auto-compact.js';
|
|
9
9
|
import { formatElapsedTime, getRandomAdjective } from '../../../utils/completion-note.js';
|
|
10
10
|
import { MessageBuilder } from '../../../utils/message-builder.js';
|
|
11
11
|
import { parseToolArguments } from '../../../utils/tool-args-parser.js';
|
|
12
|
-
import {
|
|
12
|
+
import { displayCompactCountsSummary } from '../../../utils/tool-result-display.js';
|
|
13
13
|
import { filterValidToolCalls } from '../utils/tool-filters.js';
|
|
14
14
|
import { executeToolsDirectly } from './tool-executor.js';
|
|
15
|
+
// Module-level flag: show XML fallback notice only once per process lifetime.
|
|
16
|
+
let hasShownFallbackNotice = false;
|
|
17
|
+
/** Reset the fallback notice flag (for testing). */
|
|
18
|
+
export const resetFallbackNotice = () => {
|
|
19
|
+
hasShownFallbackNotice = false;
|
|
20
|
+
};
|
|
15
21
|
/**
|
|
16
22
|
* Main conversation loop that processes assistant responses and handles tool calls.
|
|
17
23
|
* This function orchestrates the entire conversation flow including:
|
|
@@ -22,8 +28,19 @@ import { executeToolsDirectly } from './tool-executor.js';
|
|
|
22
28
|
* - Managing the conversation state
|
|
23
29
|
*/
|
|
24
30
|
export const processAssistantResponse = async (params) => {
|
|
25
|
-
const { systemMessage, messages, client, toolManager, abortController, setAbortController, setIsGenerating, setStreamingContent, setTokenCount, setMessages, addToChatQueue, getNextComponentKey, currentProvider, currentModel,
|
|
31
|
+
const { systemMessage, messages, client, toolManager, abortController, setAbortController, setIsGenerating, setStreamingContent, setTokenCount, setMessages, addToChatQueue, getNextComponentKey, currentProvider, currentModel, nonInteractiveMode, conversationStateManager, onStartToolConfirmationFlow, onConversationComplete, conversationStartTime, compactToolDisplayRef, onSetCompactToolCounts, compactToolCountsRef, } = params;
|
|
26
32
|
const startTime = conversationStartTime ?? Date.now();
|
|
33
|
+
// Helper to flush accumulated compact counts to the static chat queue and clear live display
|
|
34
|
+
const flushCompactCounts = () => {
|
|
35
|
+
if (compactToolCountsRef) {
|
|
36
|
+
const counts = compactToolCountsRef.current;
|
|
37
|
+
if (Object.keys(counts).length > 0) {
|
|
38
|
+
displayCompactCountsSummary(counts, addToChatQueue, getNextComponentKey);
|
|
39
|
+
compactToolCountsRef.current = {};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
onSetCompactToolCounts?.(null);
|
|
43
|
+
};
|
|
27
44
|
// Ensure we have an abort controller for this request
|
|
28
45
|
let controller = abortController;
|
|
29
46
|
if (!controller) {
|
|
@@ -34,32 +51,32 @@ export const processAssistantResponse = async (params) => {
|
|
|
34
51
|
setIsGenerating(true);
|
|
35
52
|
setStreamingContent('');
|
|
36
53
|
setTokenCount(0);
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
content: result,
|
|
46
|
-
};
|
|
47
|
-
await displayToolResult(toolCall, toolResult, toolManager, addToChatQueue, getNextComponentKey);
|
|
48
|
-
})();
|
|
49
|
-
},
|
|
50
|
-
onFinish: () => {
|
|
51
|
-
setIsGenerating(false);
|
|
52
|
-
},
|
|
53
|
-
}, controller.signal);
|
|
54
|
+
// Build mode overrides for non-interactive mode
|
|
55
|
+
const modeOverrides = nonInteractiveMode
|
|
56
|
+
? {
|
|
57
|
+
nonInteractiveMode: true,
|
|
58
|
+
nonInteractiveAlwaysAllow: getAppConfig().alwaysAllow ?? [],
|
|
59
|
+
}
|
|
60
|
+
: undefined;
|
|
61
|
+
const result = await client.chat([systemMessage, ...messages], toolManager?.getAllToolsWithoutExecute() || {}, {}, controller.signal, modeOverrides);
|
|
54
62
|
if (!result || !result.choices || result.choices.length === 0) {
|
|
55
63
|
throw new Error('No response received from model');
|
|
56
64
|
}
|
|
57
65
|
const message = result.choices[0].message;
|
|
58
66
|
const toolCalls = message.tool_calls || null;
|
|
59
67
|
const fullContent = message.content || '';
|
|
60
|
-
//
|
|
61
|
-
|
|
68
|
+
// Only parse text for XML tool calls on the fallback path (non-tool-calling models).
|
|
69
|
+
// On the native path, response text is just text - no tool calls are embedded in it.
|
|
70
|
+
const parseResult = result.toolsDisabled
|
|
71
|
+
? parseToolCalls(fullContent)
|
|
72
|
+
: { success: true, toolCalls: [], cleanedContent: fullContent };
|
|
73
|
+
// Notify the user once per session when the XML fallback path is active
|
|
74
|
+
if (result.toolsDisabled && !hasShownFallbackNotice) {
|
|
75
|
+
hasShownFallbackNotice = true;
|
|
76
|
+
addToChatQueue(_jsx(InfoMessage, { message: "Model does not support native tool calling. Using XML fallback.", hideBox: true }, `xml-fallback-notice-${getNextComponentKey()}`));
|
|
77
|
+
}
|
|
62
78
|
// Check for malformed tool calls and send error back to model for self-correction
|
|
79
|
+
// (only happens on the XML fallback path)
|
|
63
80
|
if (!parseResult.success) {
|
|
64
81
|
const errorContent = `${parseResult.error}\n\n${parseResult.examples}`;
|
|
65
82
|
// Display error to user
|
|
@@ -81,9 +98,6 @@ export const processAssistantResponse = async (params) => {
|
|
|
81
98
|
.addMessage(errorFeedbackMessage);
|
|
82
99
|
const updatedMessagesWithError = malformedBuilder.build();
|
|
83
100
|
setMessages(updatedMessagesWithError);
|
|
84
|
-
// Clear streaming state before recursing
|
|
85
|
-
setIsGenerating(false);
|
|
86
|
-
setStreamingContent('');
|
|
87
101
|
// Continue the main conversation loop with error message as context
|
|
88
102
|
await processAssistantResponse({
|
|
89
103
|
...params,
|
|
@@ -94,12 +108,19 @@ export const processAssistantResponse = async (params) => {
|
|
|
94
108
|
}
|
|
95
109
|
const parsedToolCalls = parseResult.toolCalls;
|
|
96
110
|
const cleanedContent = parseResult.cleanedContent;
|
|
111
|
+
// Combine native tool calls with any parsed from content (XML fallback path)
|
|
112
|
+
// Native and parsed are mutually exclusive: native comes from tool-calling models,
|
|
113
|
+
// parsed comes from non-tool-calling models using XML in text
|
|
114
|
+
const allToolCalls = [...(toolCalls || []), ...parsedToolCalls];
|
|
115
|
+
// If this is the final response (no tool calls), flush compact counts
|
|
116
|
+
// BEFORE the assistant message so the summary appears above it
|
|
117
|
+
if (allToolCalls.length === 0) {
|
|
118
|
+
flushCompactCounts();
|
|
119
|
+
}
|
|
97
120
|
// Display the assistant response (cleaned of any tool calls)
|
|
98
121
|
if (cleanedContent.trim()) {
|
|
99
122
|
addToChatQueue(_jsx(AssistantMessage, { message: cleanedContent, model: currentModel }, `assistant-${getNextComponentKey()}`));
|
|
100
123
|
}
|
|
101
|
-
// Merge structured tool calls from AI SDK with content-parsed tool calls
|
|
102
|
-
const allToolCalls = [...(toolCalls || []), ...parsedToolCalls];
|
|
103
124
|
const { validToolCalls, errorResults } = filterValidToolCalls(allToolCalls, toolManager);
|
|
104
125
|
// Add assistant message to conversation history only if it has content or tool_calls
|
|
105
126
|
// Empty assistant messages cause API errors: "Assistant message must have either content or tool_calls"
|
|
@@ -111,11 +132,6 @@ export const processAssistantResponse = async (params) => {
|
|
|
111
132
|
const hasValidAssistantMessage = cleanedContent.trim() || validToolCalls.length > 0;
|
|
112
133
|
// Build updated messages array using MessageBuilder
|
|
113
134
|
const builder = new MessageBuilder(messages);
|
|
114
|
-
// Add auto-executed messages (assistant + tool results) from AI SDK multi-step execution
|
|
115
|
-
// This ensures they're counted in usage tracking and included in context
|
|
116
|
-
if (result.autoExecutedMessages && result.autoExecutedMessages.length > 0) {
|
|
117
|
-
builder.addAutoExecutedMessages(result.autoExecutedMessages);
|
|
118
|
-
}
|
|
119
135
|
// Add the final assistant message if it has content or tool calls
|
|
120
136
|
if (hasValidAssistantMessage) {
|
|
121
137
|
builder.addAssistantMessage(assistantMsg);
|
|
@@ -125,8 +141,7 @@ export const processAssistantResponse = async (params) => {
|
|
|
125
141
|
// Build the final messages array
|
|
126
142
|
const updatedMessages = builder.build();
|
|
127
143
|
// Update messages state once with all changes
|
|
128
|
-
if (
|
|
129
|
-
hasValidAssistantMessage) {
|
|
144
|
+
if (hasValidAssistantMessage) {
|
|
130
145
|
setMessages(updatedMessages);
|
|
131
146
|
}
|
|
132
147
|
// Check for auto-compact after messages are updated
|
|
@@ -153,8 +168,8 @@ export const processAssistantResponse = async (params) => {
|
|
|
153
168
|
catch (_error) {
|
|
154
169
|
// Silently fail auto-compact, don't interrupt the conversation
|
|
155
170
|
}
|
|
156
|
-
// Clear streaming
|
|
157
|
-
|
|
171
|
+
// Clear streaming content (but don't set isGenerating=false yet —
|
|
172
|
+
// we may still need to execute tools and recurse)
|
|
158
173
|
setStreamingContent('');
|
|
159
174
|
// Handle error results for non-existent tools
|
|
160
175
|
if (errorResults.length > 0) {
|
|
@@ -162,9 +177,20 @@ export const processAssistantResponse = async (params) => {
|
|
|
162
177
|
for (const error of errorResults) {
|
|
163
178
|
addToChatQueue(_jsx(ErrorMessage, { message: error.content, hideBox: true }, `unknown-tool-${error.tool_call_id}-${Date.now()}`));
|
|
164
179
|
}
|
|
180
|
+
// FIX: Satisfy the AI SDK's strict 1:1 Tool Call/Result mapping.
|
|
181
|
+
// If we are aborting this turn to self-correct the bad tools,
|
|
182
|
+
// we MUST provide a cancellation result for the valid tools we are skipping.
|
|
183
|
+
const abortedResults = validToolCalls.map(tc => ({
|
|
184
|
+
tool_call_id: tc.id,
|
|
185
|
+
role: 'tool',
|
|
186
|
+
name: tc.function.name,
|
|
187
|
+
content: 'Execution aborted because another tool call in this request was invalid. Please fix the invalid tool call and try again.',
|
|
188
|
+
}));
|
|
189
|
+
// Combine the actual errors with the aborted placeholders
|
|
190
|
+
const allResultsForThisTurn = [...errorResults, ...abortedResults];
|
|
165
191
|
// Send error results back to model for self-correction
|
|
166
192
|
const errorBuilder = new MessageBuilder(updatedMessages);
|
|
167
|
-
errorBuilder.addToolResults(
|
|
193
|
+
errorBuilder.addToolResults(allResultsForThisTurn);
|
|
168
194
|
const updatedMessagesWithError = errorBuilder.build();
|
|
169
195
|
setMessages(updatedMessagesWithError);
|
|
170
196
|
// Continue the main conversation loop with error messages as context
|
|
@@ -177,20 +203,14 @@ export const processAssistantResponse = async (params) => {
|
|
|
177
203
|
}
|
|
178
204
|
// Handle tool calls if present - this continues the loop
|
|
179
205
|
if (validToolCalls && validToolCalls.length > 0) {
|
|
180
|
-
//
|
|
181
|
-
// (
|
|
182
|
-
//
|
|
183
|
-
// TODO: Implement registry-based blocking for plan mode (track as separate issue).
|
|
184
|
-
// Separate tools that need confirmation vs those that don't
|
|
185
|
-
// Check tool's needsApproval property to determine if confirmation is needed
|
|
206
|
+
// Both native and XML fallback paths now use the same logic:
|
|
207
|
+
// the SDK never auto-executes tools (execute is stripped), so we
|
|
208
|
+
// evaluate needsApproval ourselves and split into direct vs confirmation.
|
|
186
209
|
const toolsNeedingConfirmation = [];
|
|
187
210
|
const toolsToExecuteDirectly = [];
|
|
188
|
-
// Tools that are permitted to auto-run in non-interactive mode
|
|
189
|
-
const nonInteractiveAllowList = new Set(appConfig.alwaysAllow ?? []);
|
|
190
211
|
for (const toolCall of validToolCalls) {
|
|
191
|
-
//
|
|
212
|
+
// Run validators (for XML fallback path, catches parse errors)
|
|
192
213
|
let validationFailed = false;
|
|
193
|
-
// XML validation errors are treated as validation failures
|
|
194
214
|
if (toolCall.function.name === '__xml_validation_error__') {
|
|
195
215
|
validationFailed = true;
|
|
196
216
|
}
|
|
@@ -205,13 +225,12 @@ export const processAssistantResponse = async (params) => {
|
|
|
205
225
|
}
|
|
206
226
|
}
|
|
207
227
|
catch {
|
|
208
|
-
// Validation threw an error - treat as validation failure
|
|
209
228
|
validationFailed = true;
|
|
210
229
|
}
|
|
211
230
|
}
|
|
212
231
|
}
|
|
213
|
-
//
|
|
214
|
-
let toolNeedsApproval = true;
|
|
232
|
+
// Evaluate needsApproval from tool definition
|
|
233
|
+
let toolNeedsApproval = true;
|
|
215
234
|
if (toolManager) {
|
|
216
235
|
const toolEntry = toolManager.getToolEntry(toolCall.function.name);
|
|
217
236
|
if (toolEntry?.tool) {
|
|
@@ -220,43 +239,35 @@ export const processAssistantResponse = async (params) => {
|
|
|
220
239
|
toolNeedsApproval = needsApprovalProp;
|
|
221
240
|
}
|
|
222
241
|
else if (typeof needsApprovalProp === 'function') {
|
|
223
|
-
// Evaluate function - our tools use getCurrentMode() internally
|
|
224
|
-
// and don't actually need the args parameter
|
|
225
242
|
try {
|
|
226
243
|
const parsedArgs = parseToolArguments(toolCall.function.arguments);
|
|
227
|
-
// Cast to any to handle AI SDK type signature mismatch
|
|
228
|
-
// Our tool implementations don't use the second parameter
|
|
229
244
|
toolNeedsApproval = await needsApprovalProp(parsedArgs);
|
|
230
245
|
}
|
|
231
246
|
catch {
|
|
232
|
-
// If evaluation fails, require approval for safety
|
|
233
247
|
toolNeedsApproval = true;
|
|
234
248
|
}
|
|
235
249
|
}
|
|
236
250
|
}
|
|
237
251
|
}
|
|
238
|
-
|
|
239
|
-
// 1. Validation failed (need to send error back to model)
|
|
240
|
-
// 2. Tool has needsApproval: false
|
|
241
|
-
// 3. Explicitly allowed in non-interactive mode
|
|
242
|
-
// 4. In auto-accept mode (except bash which always needs approval)
|
|
243
|
-
const isBashTool = toolCall.function.name === 'execute_bash';
|
|
244
|
-
const isNonInteractiveAllowed = nonInteractiveMode &&
|
|
245
|
-
nonInteractiveAllowList.has(toolCall.function.name);
|
|
246
|
-
const shouldExecuteDirectly = validationFailed ||
|
|
247
|
-
!toolNeedsApproval ||
|
|
248
|
-
isNonInteractiveAllowed ||
|
|
249
|
-
(developmentMode === 'auto-accept' && !isBashTool);
|
|
250
|
-
if (shouldExecuteDirectly) {
|
|
252
|
+
if (validationFailed || !toolNeedsApproval) {
|
|
251
253
|
toolsToExecuteDirectly.push(toolCall);
|
|
252
254
|
}
|
|
253
255
|
else {
|
|
254
256
|
toolsNeedingConfirmation.push(toolCall);
|
|
255
257
|
}
|
|
256
258
|
}
|
|
257
|
-
// Execute
|
|
259
|
+
// Execute tools that don't need confirmation (parallel via Promise.all)
|
|
258
260
|
if (toolsToExecuteDirectly.length > 0) {
|
|
259
|
-
const directResults = await executeToolsDirectly(toolsToExecuteDirectly, toolManager, conversationStateManager, addToChatQueue, getNextComponentKey
|
|
261
|
+
const directResults = await executeToolsDirectly(toolsToExecuteDirectly, toolManager, conversationStateManager, addToChatQueue, getNextComponentKey, {
|
|
262
|
+
compactDisplay: compactToolDisplayRef?.current,
|
|
263
|
+
onCompactToolCount: (toolName) => {
|
|
264
|
+
if (compactToolCountsRef) {
|
|
265
|
+
const counts = compactToolCountsRef.current;
|
|
266
|
+
counts[toolName] = (counts[toolName] ?? 0) + 1;
|
|
267
|
+
onSetCompactToolCounts?.({ ...counts });
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
});
|
|
260
271
|
if (directResults.length > 0) {
|
|
261
272
|
// Add tool results to messages
|
|
262
273
|
const directBuilder = new MessageBuilder(updatedMessages);
|
|
@@ -264,10 +275,8 @@ export const processAssistantResponse = async (params) => {
|
|
|
264
275
|
const updatedMessagesWithTools = directBuilder.build();
|
|
265
276
|
setMessages(updatedMessagesWithTools);
|
|
266
277
|
// If there are also tools needing confirmation, start that flow
|
|
267
|
-
// instead of recursing. Recursing would send messages to the API
|
|
268
|
-
// with the assistant's tool_calls for ALL tools but only results
|
|
269
|
-
// for the direct ones, causing "Tool result is missing" errors.
|
|
270
278
|
if (toolsNeedingConfirmation.length > 0) {
|
|
279
|
+
flushCompactCounts();
|
|
271
280
|
onStartToolConfirmationFlow(toolsNeedingConfirmation, updatedMessagesWithTools, assistantMsg, systemMessage);
|
|
272
281
|
return;
|
|
273
282
|
}
|
|
@@ -282,6 +291,8 @@ export const processAssistantResponse = async (params) => {
|
|
|
282
291
|
}
|
|
283
292
|
// Start confirmation flow only for tools that need it
|
|
284
293
|
if (toolsNeedingConfirmation.length > 0) {
|
|
294
|
+
// Flush compact counts before entering confirmation or exiting
|
|
295
|
+
flushCompactCounts();
|
|
285
296
|
// In non-interactive mode, exit when tool approval is required
|
|
286
297
|
if (nonInteractiveMode) {
|
|
287
298
|
const toolNames = toolsNeedingConfirmation
|
|
@@ -300,13 +311,14 @@ export const processAssistantResponse = async (params) => {
|
|
|
300
311
|
errorBuilder.addMessage(errorMessage);
|
|
301
312
|
setMessages(errorBuilder.build());
|
|
302
313
|
// Signal completion to trigger exit
|
|
314
|
+
setIsGenerating(false);
|
|
303
315
|
if (onConversationComplete) {
|
|
304
316
|
onConversationComplete();
|
|
305
317
|
}
|
|
306
318
|
return;
|
|
307
319
|
}
|
|
308
|
-
//
|
|
309
|
-
|
|
320
|
+
// Hand off to confirmation flow — it manages its own generating state
|
|
321
|
+
setIsGenerating(false);
|
|
310
322
|
onStartToolConfirmationFlow(toolsNeedingConfirmation, updatedMessages, // Includes assistant message
|
|
311
323
|
assistantMsg, systemMessage);
|
|
312
324
|
}
|
|
@@ -327,7 +339,7 @@ export const processAssistantResponse = async (params) => {
|
|
|
327
339
|
role: 'user',
|
|
328
340
|
content: nudgeContent,
|
|
329
341
|
};
|
|
330
|
-
// Display a "continue" message
|
|
342
|
+
// Display a "continue" message when the model produced empty text
|
|
331
343
|
addToChatQueue(_jsx(UserMessage, { message: "continue" }, `auto-continue-${getNextComponentKey()}`));
|
|
332
344
|
// Don't include the empty assistantMsg - it would cause API error
|
|
333
345
|
// "Assistant message must have either content or tool_calls"
|
|
@@ -344,6 +356,7 @@ export const processAssistantResponse = async (params) => {
|
|
|
344
356
|
return;
|
|
345
357
|
}
|
|
346
358
|
if (validToolCalls.length === 0 && cleanedContent.trim()) {
|
|
359
|
+
setIsGenerating(false);
|
|
347
360
|
const adjective = getRandomAdjective();
|
|
348
361
|
const elapsed = formatElapsedTime(startTime);
|
|
349
362
|
addToChatQueue(_jsx(InfoMessage, { message: `Worked for a ${adjective} ${elapsed}.`, hideBox: true, marginBottom: 2 }, `completion-time-${getNextComponentKey()}`));
|