@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
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { getAppConfig } from '../config/index.js';
|
|
5
|
+
import { getAppDataPath } from '../config/paths.js';
|
|
6
|
+
/** UUID v4 pattern for session ID validation (prevents path traversal) */
|
|
7
|
+
const SESSION_ID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
|
|
8
|
+
function isValidSessionId(id) {
|
|
9
|
+
return SESSION_ID_PATTERN.test(id);
|
|
10
|
+
}
|
|
11
|
+
function isRecord(obj) {
|
|
12
|
+
return typeof obj === 'object' && obj !== null && !Array.isArray(obj);
|
|
13
|
+
}
|
|
14
|
+
function isValidSessionMetadata(obj) {
|
|
15
|
+
if (!isRecord(obj))
|
|
16
|
+
return false;
|
|
17
|
+
return (typeof obj.id === 'string' &&
|
|
18
|
+
typeof obj.title === 'string' &&
|
|
19
|
+
typeof obj.createdAt === 'string' &&
|
|
20
|
+
typeof obj.lastAccessedAt === 'string' &&
|
|
21
|
+
typeof obj.messageCount === 'number' &&
|
|
22
|
+
typeof obj.provider === 'string' &&
|
|
23
|
+
typeof obj.model === 'string' &&
|
|
24
|
+
typeof obj.workingDirectory === 'string');
|
|
25
|
+
}
|
|
26
|
+
function isValidSession(obj) {
|
|
27
|
+
if (!isRecord(obj))
|
|
28
|
+
return false;
|
|
29
|
+
return isValidSessionMetadata(obj) && Array.isArray(obj.messages);
|
|
30
|
+
}
|
|
31
|
+
/** Write data to a temp file then atomically rename into place. */
|
|
32
|
+
async function atomicWriteFile(filePath, data, mode) {
|
|
33
|
+
const tmpPath = `${filePath}.${crypto.randomUUID()}.tmp`;
|
|
34
|
+
try {
|
|
35
|
+
await fs.writeFile(tmpPath, data, { mode });
|
|
36
|
+
await fs.rename(tmpPath, filePath);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
// Clean up temp file on failure
|
|
40
|
+
try {
|
|
41
|
+
await fs.unlink(tmpPath);
|
|
42
|
+
}
|
|
43
|
+
catch (_cleanupError) {
|
|
44
|
+
// Ignore cleanup errors
|
|
45
|
+
}
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function isEnoent(error) {
|
|
50
|
+
return error instanceof Error && 'code' in error && error.code === 'ENOENT';
|
|
51
|
+
}
|
|
52
|
+
export class SessionManager {
|
|
53
|
+
sessionsDir;
|
|
54
|
+
sessionsIndexPath;
|
|
55
|
+
initialized = false;
|
|
56
|
+
/** Serializes read-modify-write of sessions.json to prevent lost updates from concurrent autosave/resume. */
|
|
57
|
+
indexWriteLock = Promise.resolve();
|
|
58
|
+
/** Optional explicit directory override (used by tests). */
|
|
59
|
+
overrideDir;
|
|
60
|
+
constructor(sessionsDir) {
|
|
61
|
+
this.overrideDir = sessionsDir;
|
|
62
|
+
}
|
|
63
|
+
resolveSessionsDir() {
|
|
64
|
+
if (this.overrideDir) {
|
|
65
|
+
this.sessionsDir = this.overrideDir;
|
|
66
|
+
this.sessionsIndexPath = path.join(this.sessionsDir, 'sessions.json');
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const config = getAppConfig();
|
|
70
|
+
const sessionConfig = config.sessions;
|
|
71
|
+
const configuredDir = sessionConfig?.directory;
|
|
72
|
+
if (configuredDir) {
|
|
73
|
+
// User explicitly configured a directory — expand tilde
|
|
74
|
+
let sessionDirPath = configuredDir;
|
|
75
|
+
if (sessionDirPath === '~') {
|
|
76
|
+
sessionDirPath = path.resolve(process.env.HOME || process.env.USERPROFILE || '.');
|
|
77
|
+
}
|
|
78
|
+
else if (sessionDirPath.startsWith('~/')) {
|
|
79
|
+
sessionDirPath = path.join(process.env.HOME || process.env.USERPROFILE || '.', sessionDirPath.slice(2));
|
|
80
|
+
}
|
|
81
|
+
this.sessionsDir = sessionDirPath;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// Default: use platform-aware app data path
|
|
85
|
+
this.sessionsDir = path.join(getAppDataPath(), 'sessions');
|
|
86
|
+
}
|
|
87
|
+
this.sessionsIndexPath = path.join(this.sessionsDir, 'sessions.json');
|
|
88
|
+
}
|
|
89
|
+
async initialize() {
|
|
90
|
+
if (this.initialized)
|
|
91
|
+
return;
|
|
92
|
+
this.resolveSessionsDir();
|
|
93
|
+
try {
|
|
94
|
+
await fs.mkdir(this.sessionsDir, { recursive: true, mode: 0o700 });
|
|
95
|
+
await fs.chmod(this.sessionsDir, 0o700);
|
|
96
|
+
try {
|
|
97
|
+
await fs.access(this.sessionsIndexPath);
|
|
98
|
+
}
|
|
99
|
+
catch (_error) {
|
|
100
|
+
await atomicWriteFile(this.sessionsIndexPath, JSON.stringify([]), 0o600);
|
|
101
|
+
}
|
|
102
|
+
this.initialized = true;
|
|
103
|
+
// Perform cleanup of old sessions if configured
|
|
104
|
+
await this.cleanupOldSessions();
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
console.error('Failed to initialize session directory:', error);
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async createSession(sessionData) {
|
|
112
|
+
const sessionId = crypto.randomUUID();
|
|
113
|
+
const timestamp = new Date().toISOString();
|
|
114
|
+
const session = {
|
|
115
|
+
id: sessionId,
|
|
116
|
+
title: sessionData.title,
|
|
117
|
+
createdAt: timestamp,
|
|
118
|
+
lastAccessedAt: timestamp,
|
|
119
|
+
messageCount: sessionData.messageCount,
|
|
120
|
+
provider: sessionData.provider,
|
|
121
|
+
model: sessionData.model,
|
|
122
|
+
workingDirectory: sessionData.workingDirectory,
|
|
123
|
+
messages: sessionData.messages,
|
|
124
|
+
};
|
|
125
|
+
await this.saveSession(session);
|
|
126
|
+
await this.enforceSessionLimits();
|
|
127
|
+
return session;
|
|
128
|
+
}
|
|
129
|
+
async saveSession(session) {
|
|
130
|
+
if (!isValidSessionId(session.id)) {
|
|
131
|
+
throw new Error(`Invalid session ID: ${session.id}`);
|
|
132
|
+
}
|
|
133
|
+
// File write and index update happen together under the lock
|
|
134
|
+
// to prevent orphaned files if the process dies between them.
|
|
135
|
+
await this.withIndexLock(async () => {
|
|
136
|
+
const sessionFilePath = path.join(this.sessionsDir, `${session.id}.json`);
|
|
137
|
+
// Write session file atomically
|
|
138
|
+
await atomicWriteFile(sessionFilePath, JSON.stringify(session, null, 2), 0o600);
|
|
139
|
+
// Update index
|
|
140
|
+
const sessions = await this.readIndex();
|
|
141
|
+
const existingSessionIndex = sessions.findIndex(s => s.id === session.id);
|
|
142
|
+
const sessionMetadata = {
|
|
143
|
+
id: session.id,
|
|
144
|
+
title: session.title,
|
|
145
|
+
createdAt: session.createdAt,
|
|
146
|
+
lastAccessedAt: session.lastAccessedAt,
|
|
147
|
+
messageCount: session.messageCount,
|
|
148
|
+
provider: session.provider,
|
|
149
|
+
model: session.model,
|
|
150
|
+
workingDirectory: session.workingDirectory,
|
|
151
|
+
};
|
|
152
|
+
if (existingSessionIndex >= 0) {
|
|
153
|
+
sessions[existingSessionIndex] = sessionMetadata;
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
sessions.push(sessionMetadata);
|
|
157
|
+
}
|
|
158
|
+
await atomicWriteFile(this.sessionsIndexPath, JSON.stringify(sessions, null, 2), 0o600);
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
/** Read the index file (internal helper — not locked). */
|
|
162
|
+
async readIndex() {
|
|
163
|
+
try {
|
|
164
|
+
const data = await fs.readFile(this.sessionsIndexPath, 'utf-8');
|
|
165
|
+
const parsed = JSON.parse(data);
|
|
166
|
+
if (!Array.isArray(parsed))
|
|
167
|
+
return this.rebuildIndex();
|
|
168
|
+
const valid = parsed.filter(isValidSessionMetadata);
|
|
169
|
+
if (valid.length === 0 && parsed.length > 0) {
|
|
170
|
+
// Index had entries but none were valid — try recovery
|
|
171
|
+
return this.rebuildIndex();
|
|
172
|
+
}
|
|
173
|
+
return valid;
|
|
174
|
+
}
|
|
175
|
+
catch (_error) {
|
|
176
|
+
return this.rebuildIndex();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Rebuild the index by scanning session files on disk.
|
|
181
|
+
* Called when the index is missing, corrupt, or empty despite files existing.
|
|
182
|
+
*/
|
|
183
|
+
async rebuildIndex() {
|
|
184
|
+
try {
|
|
185
|
+
const entries = await fs.readdir(this.sessionsDir);
|
|
186
|
+
const sessionFiles = entries.filter(e => e.endsWith('.json') && e !== 'sessions.json');
|
|
187
|
+
if (sessionFiles.length === 0)
|
|
188
|
+
return [];
|
|
189
|
+
const metadata = [];
|
|
190
|
+
for (const file of sessionFiles) {
|
|
191
|
+
try {
|
|
192
|
+
const filePath = path.join(this.sessionsDir, file);
|
|
193
|
+
const data = await fs.readFile(filePath, 'utf-8');
|
|
194
|
+
const parsed = JSON.parse(data);
|
|
195
|
+
if (isValidSession(parsed)) {
|
|
196
|
+
metadata.push({
|
|
197
|
+
id: parsed.id,
|
|
198
|
+
title: parsed.title,
|
|
199
|
+
createdAt: parsed.createdAt,
|
|
200
|
+
lastAccessedAt: parsed.lastAccessedAt,
|
|
201
|
+
messageCount: parsed.messageCount,
|
|
202
|
+
provider: parsed.provider,
|
|
203
|
+
model: parsed.model,
|
|
204
|
+
workingDirectory: parsed.workingDirectory,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
catch (_fileError) {
|
|
209
|
+
// Skip unreadable files
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Persist rebuilt index
|
|
213
|
+
if (metadata.length > 0) {
|
|
214
|
+
await atomicWriteFile(this.sessionsIndexPath, JSON.stringify(metadata, null, 2), 0o600);
|
|
215
|
+
}
|
|
216
|
+
return metadata;
|
|
217
|
+
}
|
|
218
|
+
catch (_error) {
|
|
219
|
+
return [];
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
async listSessions(options) {
|
|
223
|
+
const sessions = await this.readIndex();
|
|
224
|
+
if (options?.workingDirectory) {
|
|
225
|
+
const normalized = path.normalize(options.workingDirectory);
|
|
226
|
+
return sessions.filter(s => path.normalize(s.workingDirectory) === normalized);
|
|
227
|
+
}
|
|
228
|
+
return sessions;
|
|
229
|
+
}
|
|
230
|
+
/** Read a session from disk without updating lastAccessedAt (no write). */
|
|
231
|
+
async readSession(sessionId) {
|
|
232
|
+
if (!isValidSessionId(sessionId))
|
|
233
|
+
return null;
|
|
234
|
+
try {
|
|
235
|
+
const sessionFilePath = path.join(this.sessionsDir, `${sessionId}.json`);
|
|
236
|
+
const data = await fs.readFile(sessionFilePath, 'utf-8');
|
|
237
|
+
const parsed = JSON.parse(data);
|
|
238
|
+
if (!isValidSession(parsed))
|
|
239
|
+
return null;
|
|
240
|
+
return parsed;
|
|
241
|
+
}
|
|
242
|
+
catch (_error) {
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
async loadSession(sessionId) {
|
|
247
|
+
const session = await this.readSession(sessionId);
|
|
248
|
+
if (!session)
|
|
249
|
+
return null;
|
|
250
|
+
// Update last accessed time
|
|
251
|
+
const updatedSession = {
|
|
252
|
+
...session,
|
|
253
|
+
lastAccessedAt: new Date().toISOString(),
|
|
254
|
+
};
|
|
255
|
+
await this.saveSession(updatedSession);
|
|
256
|
+
return updatedSession;
|
|
257
|
+
}
|
|
258
|
+
async deleteSession(sessionId) {
|
|
259
|
+
if (!isValidSessionId(sessionId)) {
|
|
260
|
+
throw new Error(`Invalid session ID: ${sessionId}`);
|
|
261
|
+
}
|
|
262
|
+
const sessionFilePath = path.join(this.sessionsDir, `${sessionId}.json`);
|
|
263
|
+
// Delete file — only ignore ENOENT
|
|
264
|
+
try {
|
|
265
|
+
await fs.unlink(sessionFilePath);
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
if (!isEnoent(error)) {
|
|
269
|
+
throw error;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Update index — let errors propagate
|
|
273
|
+
await this.withIndexLock(async () => {
|
|
274
|
+
const sessions = await this.readIndex();
|
|
275
|
+
const filteredSessions = sessions.filter(s => s.id !== sessionId);
|
|
276
|
+
await atomicWriteFile(this.sessionsIndexPath, JSON.stringify(filteredSessions, null, 2), 0o600);
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
getSessionDirectory() {
|
|
280
|
+
return this.sessionsDir;
|
|
281
|
+
}
|
|
282
|
+
/** Run a read-modify-write on the index one at a time to avoid lost updates. */
|
|
283
|
+
async withIndexLock(fn) {
|
|
284
|
+
const prev = this.indexWriteLock;
|
|
285
|
+
let release;
|
|
286
|
+
this.indexWriteLock = new Promise(r => {
|
|
287
|
+
release = r;
|
|
288
|
+
});
|
|
289
|
+
await prev;
|
|
290
|
+
try {
|
|
291
|
+
return await fn();
|
|
292
|
+
}
|
|
293
|
+
finally {
|
|
294
|
+
release();
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
async enforceSessionLimits() {
|
|
298
|
+
const config = getAppConfig();
|
|
299
|
+
const sessionConfig = config.sessions;
|
|
300
|
+
const maxSessions = sessionConfig?.maxSessions || 100;
|
|
301
|
+
await this.withIndexLock(async () => {
|
|
302
|
+
const sessions = await this.readIndex();
|
|
303
|
+
if (sessions.length <= maxSessions)
|
|
304
|
+
return;
|
|
305
|
+
// Sort by lastAccessedAt ascending (oldest first)
|
|
306
|
+
const sortedSessions = sessions.sort((a, b) => new Date(a.lastAccessedAt).getTime() -
|
|
307
|
+
new Date(b.lastAccessedAt).getTime());
|
|
308
|
+
const sessionsToDelete = sortedSessions.slice(0, sessions.length - maxSessions);
|
|
309
|
+
const idsToDelete = new Set(sessionsToDelete.map(s => s.id));
|
|
310
|
+
// Rewrite index first so sessions are deregistered even if
|
|
311
|
+
// file deletion partially fails.
|
|
312
|
+
const remaining = sortedSessions.filter(s => !idsToDelete.has(s.id));
|
|
313
|
+
await atomicWriteFile(this.sessionsIndexPath, JSON.stringify(remaining, null, 2), 0o600);
|
|
314
|
+
// Then delete files — only ignore ENOENT
|
|
315
|
+
for (const session of sessionsToDelete) {
|
|
316
|
+
const filePath = path.join(this.sessionsDir, `${session.id}.json`);
|
|
317
|
+
try {
|
|
318
|
+
await fs.unlink(filePath);
|
|
319
|
+
}
|
|
320
|
+
catch (error) {
|
|
321
|
+
if (!isEnoent(error)) {
|
|
322
|
+
throw error;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
async cleanupOldSessions() {
|
|
329
|
+
const config = getAppConfig();
|
|
330
|
+
const sessionConfig = config.sessions;
|
|
331
|
+
const retentionDays = sessionConfig?.retentionDays || 30;
|
|
332
|
+
const cutoffDate = new Date();
|
|
333
|
+
cutoffDate.setDate(cutoffDate.getDate() - retentionDays);
|
|
334
|
+
await this.withIndexLock(async () => {
|
|
335
|
+
const sessions = await this.readIndex();
|
|
336
|
+
const oldSessions = sessions.filter(session => new Date(session.lastAccessedAt) < cutoffDate);
|
|
337
|
+
if (oldSessions.length === 0)
|
|
338
|
+
return;
|
|
339
|
+
const idsToDelete = new Set(oldSessions.map(s => s.id));
|
|
340
|
+
// Rewrite index first so sessions are deregistered even if
|
|
341
|
+
// file deletion partially fails.
|
|
342
|
+
const remaining = sessions.filter(s => !idsToDelete.has(s.id));
|
|
343
|
+
await atomicWriteFile(this.sessionsIndexPath, JSON.stringify(remaining, null, 2), 0o600);
|
|
344
|
+
// Then delete files — only ignore ENOENT
|
|
345
|
+
for (const session of oldSessions) {
|
|
346
|
+
const filePath = path.join(this.sessionsDir, `${session.id}.json`);
|
|
347
|
+
try {
|
|
348
|
+
await fs.unlink(filePath);
|
|
349
|
+
}
|
|
350
|
+
catch (error) {
|
|
351
|
+
if (!isEnoent(error)) {
|
|
352
|
+
throw error;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
// Export singleton instance — config is deferred to initialize()
|
|
360
|
+
export const sessionManager = new SessionManager();
|
|
361
|
+
//# sourceMappingURL=session-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../source/session/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-with-theme.d.ts","sourceRoot":"","sources":["../../source/test-utils/render-with-theme.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"render-with-theme.d.ts","sourceRoot":"","sources":["../../source/test-utils/render-with-theme.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAC;AAiD1B;;GAEG;AACH,wBAAgB,eAAe,CAC9B,OAAO,EAAE,KAAK,CAAC,YAAY,GACzB,UAAU,CAAC,OAAO,MAAM,CAAC,CAE3B"}
|
|
@@ -2,6 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { render } from 'ink-testing-library';
|
|
3
3
|
import { ThemeContext } from '../hooks/useTheme.js';
|
|
4
4
|
import { TitleShapeContext } from '../hooks/useTitleShape.js';
|
|
5
|
+
import { UIStateProvider } from '../hooks/useUIState.js';
|
|
5
6
|
// Default test colors that match the structure used in the app
|
|
6
7
|
const testColors = {
|
|
7
8
|
primary: 'blue',
|
|
@@ -33,7 +34,7 @@ const testTitleShapeContext = {
|
|
|
33
34
|
* Wrapper component that provides ThemeContext and TitleShapeContext for tests
|
|
34
35
|
*/
|
|
35
36
|
function TestThemeProvider({ children }) {
|
|
36
|
-
return (_jsx(TitleShapeContext.Provider, { value: testTitleShapeContext, children: _jsx(ThemeContext.Provider, { value: testThemeContext, children: children }) }));
|
|
37
|
+
return (_jsx(TitleShapeContext.Provider, { value: testTitleShapeContext, children: _jsx(ThemeContext.Provider, { value: testThemeContext, children: _jsx(UIStateProvider, { children: children }) }) }));
|
|
37
38
|
}
|
|
38
39
|
/**
|
|
39
40
|
* Render a component wrapped with ThemeContext and TitleShapeContext for testing
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-with-theme.js","sourceRoot":"","sources":["../../source/test-utils/render-with-theme.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAE3C,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"render-with-theme.js","sourceRoot":"","sources":["../../source/test-utils/render-with-theme.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAE3C,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAC,eAAe,EAAC,MAAM,oBAAoB,CAAC;AAGnD,+DAA+D;AAC/D,MAAM,UAAU,GAAW;IAC1B,OAAO,EAAE,MAAM;IACf,SAAS,EAAE,MAAM;IACjB,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,QAAQ;IACjB,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE,OAAO;IAChB,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,OAAO;IAClB,WAAW,EAAE,KAAK;IAClB,aAAa,EAAE,MAAM;IACrB,eAAe,EAAE,MAAM;CACvB,CAAC;AAEF,2BAA2B;AAC3B,MAAM,gBAAgB,GAAG;IACxB,YAAY,EAAE,aAA4B;IAC1C,MAAM,EAAE,UAAU;IAClB,eAAe,EAAE,GAAG,EAAE,GAAE,CAAC;CACzB,CAAC;AAEF,iCAAiC;AACjC,MAAM,qBAAqB,GAAG;IAC7B,iBAAiB,EAAE,MAAe;IAClC,oBAAoB,EAAE,GAAG,EAAE,GAAE,CAAC;CAC9B,CAAC;AAEF;;GAEG;AACH,SAAS,iBAAiB,CAAC,EAAC,QAAQ,EAA8B;IACjE,OAAO,CACN,KAAC,iBAAiB,CAAC,QAAQ,IAAC,KAAK,EAAE,qBAAqB,YACvD,KAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,gBAAgB,YAC7C,KAAC,eAAe,cAAE,QAAQ,GAAmB,GACtB,GACI,CAC7B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC9B,OAA2B;IAE3B,OAAO,MAAM,CAAC,KAAC,iBAAiB,cAAE,OAAO,GAAqB,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -12,9 +12,10 @@ type ParseResult = {
|
|
|
12
12
|
examples: string;
|
|
13
13
|
};
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
15
|
+
* Parses XML tool calls from content (used for non-tool-calling models).
|
|
16
|
+
* Only runs on the XML fallback path when native tool calling is disabled.
|
|
17
|
+
* Type-preserving: Accepts unknown type, converts to string for processing.
|
|
17
18
|
*/
|
|
18
|
-
export declare function parseToolCalls(content:
|
|
19
|
+
export declare function parseToolCalls(content: unknown): ParseResult;
|
|
19
20
|
export {};
|
|
20
21
|
//# sourceMappingURL=tool-parser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-parser.d.ts","sourceRoot":"","sources":["../../source/tool-calling/tool-parser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tool-parser.d.ts","sourceRoot":"","sources":["../../source/tool-calling/tool-parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAC;AAmC5C;;GAEG;AACH,KAAK,WAAW,GACb;IACA,OAAO,EAAE,IAAI,CAAC;IACd,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACtB,GACD;IACA,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAChB,CAAC;AAEL;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,CAyC5D"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { cleanJSONToolCalls, detectMalformedJSONToolCall, parseJSONToolCalls, } from '../tool-calling/json-parser.js';
|
|
2
1
|
import { XMLToolCallParser } from '../tool-calling/xml-parser.js';
|
|
2
|
+
import { ensureString } from '../utils/type-helpers.js';
|
|
3
3
|
/**
|
|
4
|
-
* Strip
|
|
4
|
+
* Strip tags from content (some models output thinking that shouldn't be shown)
|
|
5
5
|
*/
|
|
6
6
|
function stripThinkTags(content) {
|
|
7
7
|
return (content
|
|
8
|
-
// Strip complete
|
|
8
|
+
// Strip complete blocks
|
|
9
9
|
.replace(/<think>[\s\S]*?<\/think>/gi, '')
|
|
10
10
|
// Strip orphaned/incomplete think tags
|
|
11
11
|
.replace(/<think>[\s\S]*$/gi, '')
|
|
@@ -27,22 +27,16 @@ function normalizeWhitespace(content) {
|
|
|
27
27
|
.trim());
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
30
|
+
* Parses XML tool calls from content (used for non-tool-calling models).
|
|
31
|
+
* Only runs on the XML fallback path when native tool calling is disabled.
|
|
32
|
+
* Type-preserving: Accepts unknown type, converts to string for processing.
|
|
32
33
|
*/
|
|
33
34
|
export function parseToolCalls(content) {
|
|
34
|
-
//
|
|
35
|
-
const
|
|
36
|
-
//
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
return {
|
|
40
|
-
success: false,
|
|
41
|
-
error: xmlMalformed.error,
|
|
42
|
-
examples: xmlMalformed.examples,
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
// 2. Try XML parser for valid tool calls
|
|
35
|
+
// 1. Safety Coercion
|
|
36
|
+
const contentStr = ensureString(content);
|
|
37
|
+
// Strip tags first - some models (like GLM-4) emit these for chain-of-thought
|
|
38
|
+
const strippedContent = stripThinkTags(contentStr);
|
|
39
|
+
// 2. Try XML parser for valid tool calls (OPTIMISTIC: Success first!)
|
|
46
40
|
if (XMLToolCallParser.hasToolCalls(strippedContent)) {
|
|
47
41
|
// Parse valid XML tool calls
|
|
48
42
|
const parsedCalls = XMLToolCallParser.parseToolCalls(strippedContent);
|
|
@@ -56,27 +50,16 @@ export function parseToolCalls(content) {
|
|
|
56
50
|
};
|
|
57
51
|
}
|
|
58
52
|
}
|
|
59
|
-
// 3.
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
if (jsonMalformed) {
|
|
53
|
+
// 3. Check for malformed XML patterns (DEFENSIVE: Error second!)
|
|
54
|
+
const xmlMalformed = XMLToolCallParser.detectMalformedToolCall(strippedContent);
|
|
55
|
+
if (xmlMalformed) {
|
|
63
56
|
return {
|
|
64
57
|
success: false,
|
|
65
|
-
error:
|
|
66
|
-
examples:
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
// Parse valid JSON tool calls
|
|
70
|
-
const jsonCalls = parseJSONToolCalls(strippedContent);
|
|
71
|
-
if (jsonCalls.length > 0) {
|
|
72
|
-
const cleanedContent = cleanJSONToolCalls(strippedContent, jsonCalls);
|
|
73
|
-
return {
|
|
74
|
-
success: true,
|
|
75
|
-
toolCalls: jsonCalls,
|
|
76
|
-
cleanedContent,
|
|
58
|
+
error: xmlMalformed.error,
|
|
59
|
+
examples: xmlMalformed.examples,
|
|
77
60
|
};
|
|
78
61
|
}
|
|
79
|
-
// 4. No tool calls found -
|
|
62
|
+
// 4. No tool calls found - normalize whitespace in content
|
|
80
63
|
return {
|
|
81
64
|
success: true,
|
|
82
65
|
toolCalls: [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-parser.js","sourceRoot":"","sources":["../../source/tool-calling/tool-parser.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"tool-parser.js","sourceRoot":"","sources":["../../source/tool-calling/tool-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAC,YAAY,EAAC,MAAM,sBAAsB,CAAC;AAElD;;GAEG;AACH,SAAS,cAAc,CAAC,OAAe;IACtC,OAAO,CACN,OAAO;QACN,yBAAyB;SACxB,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC;QAC1C,uCAAuC;SACtC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;SAChC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAC5B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,OAAe;IAC3C,OAAO,CACN,OAAO;QACN,4CAA4C;SAC3C,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;QACzB,sEAAsE;SACrE,OAAO,CAAC,kBAAkB,EAAE,KAAK,CAAC;QACnC,wCAAwC;SACvC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;QAC1B,iEAAiE;SAChE,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;SAC1B,IAAI,EAAE,CACR,CAAC;AACH,CAAC;AAiBD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC9C,qBAAqB;IACrB,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAEzC,8EAA8E;IAC9E,MAAM,eAAe,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAEnD,sEAAsE;IACtE,IAAI,iBAAiB,CAAC,YAAY,CAAC,eAAe,CAAC,EAAE,CAAC;QACrD,6BAA6B;QAC7B,MAAM,WAAW,GAAG,iBAAiB,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QACtE,MAAM,cAAc,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAEzE,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,cAAc,GACnB,iBAAiB,CAAC,0BAA0B,CAAC,eAAe,CAAC,CAAC;YAC/D,OAAO;gBACN,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,cAAc;gBACzB,cAAc;aACd,CAAC;QACH,CAAC;IACF,CAAC;IAED,iEAAiE;IACjE,MAAM,YAAY,GACjB,iBAAiB,CAAC,uBAAuB,CAAC,eAAe,CAAC,CAAC;IAC5D,IAAI,YAAY,EAAE,CAAC;QAClB,OAAO;YACN,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,YAAY,CAAC,KAAK;YACzB,QAAQ,EAAE,YAAY,CAAC,QAAQ;SAC/B,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,OAAO;QACN,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,EAAE;QACb,cAAc,EAAE,mBAAmB,CAAC,eAAe,CAAC;KACpD,CAAC;AACH,CAAC"}
|
|
@@ -12,8 +12,9 @@ export declare class XMLToolCallParser {
|
|
|
12
12
|
private static readonly PARAMETER_REGEX;
|
|
13
13
|
/**
|
|
14
14
|
* Extracts tool calls from text content containing XML-formatted tool calls
|
|
15
|
+
* Type-preserving: Accepts unknown type, converts to string for processing
|
|
15
16
|
*/
|
|
16
|
-
static parseToolCalls(content:
|
|
17
|
+
static parseToolCalls(content: unknown): ParsedToolCall[];
|
|
17
18
|
/**
|
|
18
19
|
* Validates that a matched string is a proper tool call
|
|
19
20
|
* Rejects partial matches, malformed syntax, and invalid structures
|
|
@@ -29,17 +30,20 @@ export declare class XMLToolCallParser {
|
|
|
29
30
|
static convertToToolCalls(parsedCalls: ParsedToolCall[]): ToolCall[];
|
|
30
31
|
/**
|
|
31
32
|
* Removes XML tool call blocks from content, leaving only the text
|
|
33
|
+
* Type-preserving: Accepts unknown type, converts to string for processing
|
|
32
34
|
*/
|
|
33
|
-
static removeToolCallsFromContent(content:
|
|
35
|
+
static removeToolCallsFromContent(content: unknown): string;
|
|
34
36
|
/**
|
|
35
37
|
* Checks if content contains XML-formatted tool calls
|
|
38
|
+
* Type-preserving: Accepts unknown type, converts to string for processing
|
|
36
39
|
*/
|
|
37
|
-
static hasToolCalls(content:
|
|
40
|
+
static hasToolCalls(content: unknown): boolean;
|
|
38
41
|
/**
|
|
39
42
|
* Detects malformed XML tool call attempts and returns error details
|
|
40
43
|
* Returns null if no malformed tool calls detected
|
|
44
|
+
* Type-preserving: Accepts unknown type, converts to string for processing
|
|
41
45
|
*/
|
|
42
|
-
static detectMalformedToolCall(content:
|
|
46
|
+
static detectMalformedToolCall(content: unknown): {
|
|
43
47
|
error: string;
|
|
44
48
|
examples: string;
|
|
45
49
|
} | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xml-parser.d.ts","sourceRoot":"","sources":["../../source/tool-calling/xml-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"xml-parser.d.ts","sourceRoot":"","sources":["../../source/tool-calling/xml-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAC;AAG5C,UAAU,cAAc;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;GAGG;AACH,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAA0B;IACjE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAA0B;IAEjE;;;OAGG;IACH,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,EAAE;IA0CzD;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAyE9B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAyB9B;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,QAAQ,EAAE;IAUpE;;;OAGG;IACH,MAAM,CAAC,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;IA4C3D;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO;IAM9C;;;;OAIG;IACH,MAAM,CAAC,uBAAuB,CAC7B,OAAO,EAAE,OAAO,GACd;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI;IAiD3C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;CAGvC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ensureString } from '../utils/type-helpers.js';
|
|
1
2
|
/**
|
|
2
3
|
* Parses XML-formatted tool calls from non-function-calling models
|
|
3
4
|
* Expected format: <tool_name><param1>value1</param1><param2>value2</param2></tool_name>
|
|
@@ -7,13 +8,14 @@ export class XMLToolCallParser {
|
|
|
7
8
|
static PARAMETER_REGEX = /<(\w+)>(.*?)<\/\1>/gs;
|
|
8
9
|
/**
|
|
9
10
|
* Extracts tool calls from text content containing XML-formatted tool calls
|
|
11
|
+
* Type-preserving: Accepts unknown type, converts to string for processing
|
|
10
12
|
*/
|
|
11
13
|
static parseToolCalls(content) {
|
|
12
14
|
const toolCalls = [];
|
|
13
15
|
let match;
|
|
14
16
|
// Handle content that might be wrapped in markdown code blocks
|
|
15
|
-
let processedContent = content;
|
|
16
|
-
const codeBlockMatch =
|
|
17
|
+
let processedContent = ensureString(content);
|
|
18
|
+
const codeBlockMatch = processedContent.match(/```(?:\w+)?\s*\n?([\s\S]*?)\n?```/);
|
|
17
19
|
if (codeBlockMatch && codeBlockMatch[1]) {
|
|
18
20
|
processedContent = codeBlockMatch[1].trim();
|
|
19
21
|
}
|
|
@@ -142,15 +144,18 @@ export class XMLToolCallParser {
|
|
|
142
144
|
}
|
|
143
145
|
/**
|
|
144
146
|
* Removes XML tool call blocks from content, leaving only the text
|
|
147
|
+
* Type-preserving: Accepts unknown type, converts to string for processing
|
|
145
148
|
*/
|
|
146
149
|
static removeToolCallsFromContent(content) {
|
|
147
|
-
let cleanedContent = content;
|
|
150
|
+
let cleanedContent = ensureString(content);
|
|
148
151
|
// Remove all markdown code blocks that contain XML tool calls (using global flag)
|
|
149
152
|
cleanedContent = cleanedContent.replace(/```(?:\w+)?\s*\n?([\s\S]*?)\n?```/g, (match, blockContent) => {
|
|
150
153
|
if (blockContent) {
|
|
151
154
|
// Reset regex and check if this block contains XML tool calls
|
|
152
155
|
this.TOOL_CALL_REGEX.lastIndex = 0;
|
|
153
|
-
|
|
156
|
+
const testResult = this.TOOL_CALL_REGEX.test(blockContent);
|
|
157
|
+
this.TOOL_CALL_REGEX.lastIndex = 0; // Reset again after test
|
|
158
|
+
if (testResult) {
|
|
154
159
|
// This code block contains XML tool calls, remove it entirely
|
|
155
160
|
return '';
|
|
156
161
|
}
|
|
@@ -178,6 +183,7 @@ export class XMLToolCallParser {
|
|
|
178
183
|
}
|
|
179
184
|
/**
|
|
180
185
|
* Checks if content contains XML-formatted tool calls
|
|
186
|
+
* Type-preserving: Accepts unknown type, converts to string for processing
|
|
181
187
|
*/
|
|
182
188
|
static hasToolCalls(content) {
|
|
183
189
|
// Use parseToolCalls with validation to ensure we only detect valid tool calls
|
|
@@ -187,8 +193,12 @@ export class XMLToolCallParser {
|
|
|
187
193
|
/**
|
|
188
194
|
* Detects malformed XML tool call attempts and returns error details
|
|
189
195
|
* Returns null if no malformed tool calls detected
|
|
196
|
+
* Type-preserving: Accepts unknown type, converts to string for processing
|
|
190
197
|
*/
|
|
191
198
|
static detectMalformedToolCall(content) {
|
|
199
|
+
// Type guard: ensure content is string for processing operations
|
|
200
|
+
// BUT original type is preserved in memory via the ToolCall structure
|
|
201
|
+
const contentStr = ensureString(content);
|
|
192
202
|
// Common malformed patterns
|
|
193
203
|
const patterns = [
|
|
194
204
|
{
|
|
@@ -218,7 +228,7 @@ export class XMLToolCallParser {
|
|
|
218
228
|
},
|
|
219
229
|
];
|
|
220
230
|
for (const pattern of patterns) {
|
|
221
|
-
const match =
|
|
231
|
+
const match = contentStr.match(pattern.regex);
|
|
222
232
|
if (match) {
|
|
223
233
|
return {
|
|
224
234
|
error: pattern.error,
|