@shareai-lab/kode 1.1.12 → 1.1.13
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/cli.js +44 -23
- package/dist/ProjectOnboarding.js +99 -0
- package/dist/ProjectOnboarding.js.map +7 -0
- package/dist/Tool.js +1 -0
- package/dist/Tool.js.map +7 -0
- package/dist/commands/agents.js +2087 -0
- package/dist/commands/agents.js.map +7 -0
- package/dist/commands/approvedTools.js +36 -0
- package/dist/commands/approvedTools.js.map +7 -0
- package/dist/commands/bug.js +21 -0
- package/dist/commands/bug.js.map +7 -0
- package/dist/commands/clear.js +37 -0
- package/dist/commands/clear.js.map +7 -0
- package/dist/commands/compact.js +104 -0
- package/dist/commands/compact.js.map +7 -0
- package/dist/commands/config.js +20 -0
- package/dist/commands/config.js.map +7 -0
- package/dist/commands/cost.js +19 -0
- package/dist/commands/cost.js.map +7 -0
- package/dist/commands/ctx_viz.js +152 -0
- package/dist/commands/ctx_viz.js.map +7 -0
- package/dist/commands/doctor.js +25 -0
- package/dist/commands/doctor.js.map +7 -0
- package/dist/commands/help.js +20 -0
- package/dist/commands/help.js.map +7 -0
- package/dist/commands/init.js +38 -0
- package/dist/commands/init.js.map +7 -0
- package/dist/commands/listen.js +37 -0
- package/dist/commands/listen.js.map +7 -0
- package/dist/commands/login.js +37 -0
- package/dist/commands/login.js.map +7 -0
- package/dist/commands/logout.js +33 -0
- package/dist/commands/logout.js.map +7 -0
- package/dist/commands/mcp.js +34 -0
- package/dist/commands/mcp.js.map +7 -0
- package/dist/commands/model.js +41 -0
- package/dist/commands/model.js.map +7 -0
- package/dist/commands/modelstatus.js +21 -0
- package/dist/commands/modelstatus.js.map +7 -0
- package/dist/commands/onboarding.js +36 -0
- package/dist/commands/onboarding.js.map +7 -0
- package/dist/commands/pr_comments.js +61 -0
- package/dist/commands/pr_comments.js.map +7 -0
- package/dist/commands/refreshCommands.js +37 -0
- package/dist/commands/refreshCommands.js.map +7 -0
- package/dist/commands/release-notes.js +30 -0
- package/dist/commands/release-notes.js.map +7 -0
- package/dist/commands/resume.js +35 -0
- package/dist/commands/resume.js.map +7 -0
- package/dist/commands/review.js +51 -0
- package/dist/commands/review.js.map +7 -0
- package/dist/commands/terminalSetup.js +163 -0
- package/dist/commands/terminalSetup.js.map +7 -0
- package/dist/commands.js +84 -0
- package/dist/commands.js.map +7 -0
- package/dist/components/ApproveApiKey.js +74 -0
- package/dist/components/ApproveApiKey.js.map +7 -0
- package/dist/components/AsciiLogo.js +12 -0
- package/dist/components/AsciiLogo.js.map +7 -0
- package/dist/components/AutoUpdater.js +74 -0
- package/dist/components/AutoUpdater.js.map +7 -0
- package/dist/components/Bug.js +147 -0
- package/dist/components/Bug.js.map +7 -0
- package/dist/components/Config.js +166 -0
- package/dist/components/Config.js.map +7 -0
- package/dist/components/ConsoleOAuthFlow.js +188 -0
- package/dist/components/ConsoleOAuthFlow.js.map +7 -0
- package/dist/components/Cost.js +13 -0
- package/dist/components/Cost.js.map +7 -0
- package/dist/components/CostThresholdDialog.js +38 -0
- package/dist/components/CostThresholdDialog.js.map +7 -0
- package/dist/components/CustomSelect/option-map.js +32 -0
- package/dist/components/CustomSelect/option-map.js.map +7 -0
- package/dist/components/CustomSelect/select-option.js +34 -0
- package/dist/components/CustomSelect/select-option.js.map +7 -0
- package/dist/components/CustomSelect/select.js +64 -0
- package/dist/components/CustomSelect/select.js.map +7 -0
- package/dist/components/CustomSelect/theme.js +1 -0
- package/dist/components/CustomSelect/theme.js.map +7 -0
- package/dist/components/CustomSelect/use-select-state.js +220 -0
- package/dist/components/CustomSelect/use-select-state.js.map +7 -0
- package/dist/components/CustomSelect/use-select.js +21 -0
- package/dist/components/CustomSelect/use-select.js.map +7 -0
- package/dist/components/FallbackToolUseRejectedMessage.js +11 -0
- package/dist/components/FallbackToolUseRejectedMessage.js.map +7 -0
- package/dist/components/FileEditToolUpdatedMessage.js +31 -0
- package/dist/components/FileEditToolUpdatedMessage.js.map +7 -0
- package/dist/components/Help.js +41 -0
- package/dist/components/Help.js.map +7 -0
- package/dist/components/HighlightedCode.js +30 -0
- package/dist/components/HighlightedCode.js.map +7 -0
- package/dist/components/InvalidConfigDialog.js +83 -0
- package/dist/components/InvalidConfigDialog.js.map +7 -0
- package/dist/components/Link.js +18 -0
- package/dist/components/Link.js.map +7 -0
- package/dist/components/LogSelector.js +50 -0
- package/dist/components/LogSelector.js.map +7 -0
- package/dist/components/Logo.js +89 -0
- package/dist/components/Logo.js.map +7 -0
- package/dist/components/MCPServerApprovalDialog.js +79 -0
- package/dist/components/MCPServerApprovalDialog.js.map +7 -0
- package/dist/components/MCPServerDialogCopy.js +11 -0
- package/dist/components/MCPServerDialogCopy.js.map +7 -0
- package/dist/components/MCPServerMultiselectDialog.js +80 -0
- package/dist/components/MCPServerMultiselectDialog.js.map +7 -0
- package/dist/components/Message.js +146 -0
- package/dist/components/Message.js.map +7 -0
- package/dist/components/MessageResponse.js +9 -0
- package/dist/components/MessageResponse.js.map +7 -0
- package/dist/components/MessageSelector.js +133 -0
- package/dist/components/MessageSelector.js.map +7 -0
- package/dist/components/ModeIndicator.js +38 -0
- package/dist/components/ModeIndicator.js.map +7 -0
- package/dist/components/ModelConfig.js +208 -0
- package/dist/components/ModelConfig.js.map +7 -0
- package/dist/components/ModelListManager.js +140 -0
- package/dist/components/ModelListManager.js.map +7 -0
- package/dist/components/ModelSelector.js +1985 -0
- package/dist/components/ModelSelector.js.map +7 -0
- package/dist/components/ModelStatusDisplay.js +87 -0
- package/dist/components/ModelStatusDisplay.js.map +7 -0
- package/dist/components/Onboarding.js +153 -0
- package/dist/components/Onboarding.js.map +7 -0
- package/dist/components/PressEnterToContinue.js +10 -0
- package/dist/components/PressEnterToContinue.js.map +7 -0
- package/dist/components/PromptInput.js +501 -0
- package/dist/components/PromptInput.js.map +7 -0
- package/dist/components/SentryErrorBoundary.js +27 -0
- package/dist/components/SentryErrorBoundary.js.map +7 -0
- package/dist/components/Spinner.js +101 -0
- package/dist/components/Spinner.js.map +7 -0
- package/dist/components/StickerRequestForm.js +7 -0
- package/dist/components/StickerRequestForm.js.map +7 -0
- package/dist/components/StructuredDiff.js +148 -0
- package/dist/components/StructuredDiff.js.map +7 -0
- package/dist/components/TextInput.js +100 -0
- package/dist/components/TextInput.js.map +7 -0
- package/dist/components/TodoItem.js +35 -0
- package/dist/components/TodoItem.js.map +7 -0
- package/dist/components/TokenWarning.js +19 -0
- package/dist/components/TokenWarning.js.map +7 -0
- package/dist/components/ToolUseLoader.js +24 -0
- package/dist/components/ToolUseLoader.js.map +7 -0
- package/dist/components/TrustDialog.js +76 -0
- package/dist/components/TrustDialog.js.map +7 -0
- package/dist/components/binary-feedback/BinaryFeedback.js +50 -0
- package/dist/components/binary-feedback/BinaryFeedback.js.map +7 -0
- package/dist/components/binary-feedback/BinaryFeedbackOption.js +94 -0
- package/dist/components/binary-feedback/BinaryFeedbackOption.js.map +7 -0
- package/dist/components/binary-feedback/BinaryFeedbackView.js +139 -0
- package/dist/components/binary-feedback/BinaryFeedbackView.js.map +7 -0
- package/dist/components/binary-feedback/utils.js +161 -0
- package/dist/components/binary-feedback/utils.js.map +7 -0
- package/dist/components/messages/AssistantBashOutputMessage.js +23 -0
- package/dist/components/messages/AssistantBashOutputMessage.js.map +7 -0
- package/dist/components/messages/AssistantLocalCommandOutputMessage.js +36 -0
- package/dist/components/messages/AssistantLocalCommandOutputMessage.js.map +7 -0
- package/dist/components/messages/AssistantRedactedThinkingMessage.js +12 -0
- package/dist/components/messages/AssistantRedactedThinkingMessage.js.map +7 -0
- package/dist/components/messages/AssistantTextMessage.js +78 -0
- package/dist/components/messages/AssistantTextMessage.js.map +7 -0
- package/dist/components/messages/AssistantThinkingMessage.js +27 -0
- package/dist/components/messages/AssistantThinkingMessage.js.map +7 -0
- package/dist/components/messages/AssistantToolUseMessage.js +91 -0
- package/dist/components/messages/AssistantToolUseMessage.js.map +7 -0
- package/dist/components/messages/TaskProgressMessage.js +11 -0
- package/dist/components/messages/TaskProgressMessage.js.map +7 -0
- package/dist/components/messages/TaskToolMessage.js +39 -0
- package/dist/components/messages/TaskToolMessage.js.map +7 -0
- package/dist/components/messages/UserBashInputMessage.js +18 -0
- package/dist/components/messages/UserBashInputMessage.js.map +7 -0
- package/dist/components/messages/UserCommandMessage.js +20 -0
- package/dist/components/messages/UserCommandMessage.js.map +7 -0
- package/dist/components/messages/UserKodingInputMessage.js +18 -0
- package/dist/components/messages/UserKodingInputMessage.js.map +7 -0
- package/dist/components/messages/UserPromptMessage.js +20 -0
- package/dist/components/messages/UserPromptMessage.js.map +7 -0
- package/dist/components/messages/UserTextMessage.js +25 -0
- package/dist/components/messages/UserTextMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js +10 -0
- package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/UserToolErrorMessage.js +15 -0
- package/dist/components/messages/UserToolResultMessage/UserToolErrorMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js +25 -0
- package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js +47 -0
- package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +23 -0
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/utils.js +42 -0
- package/dist/components/messages/UserToolResultMessage/utils.js.map +7 -0
- package/dist/components/permissions/BashPermissionRequest/BashPermissionRequest.js +112 -0
- package/dist/components/permissions/BashPermissionRequest/BashPermissionRequest.js.map +7 -0
- package/dist/components/permissions/FallbackPermissionRequest.js +131 -0
- package/dist/components/permissions/FallbackPermissionRequest.js.map +7 -0
- package/dist/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.js +159 -0
- package/dist/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.js.map +7 -0
- package/dist/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js +58 -0
- package/dist/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js.map +7 -0
- package/dist/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.js +153 -0
- package/dist/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.js.map +7 -0
- package/dist/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js +70 -0
- package/dist/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js.map +7 -0
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +212 -0
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +7 -0
- package/dist/components/permissions/PermissionRequest.js +70 -0
- package/dist/components/permissions/PermissionRequest.js.map +7 -0
- package/dist/components/permissions/PermissionRequestTitle.js +52 -0
- package/dist/components/permissions/PermissionRequestTitle.js.map +7 -0
- package/dist/components/permissions/hooks.js +28 -0
- package/dist/components/permissions/hooks.js.map +7 -0
- package/dist/components/permissions/toolUseOptions.js +46 -0
- package/dist/components/permissions/toolUseOptions.js.map +7 -0
- package/dist/components/permissions/utils.js +21 -0
- package/dist/components/permissions/utils.js.map +7 -0
- package/dist/constants/betas.js +11 -0
- package/dist/constants/betas.js.map +7 -0
- package/dist/constants/claude-asterisk-ascii-art.js +242 -0
- package/dist/constants/claude-asterisk-ascii-art.js.map +7 -0
- package/dist/constants/figures.js +6 -0
- package/dist/constants/figures.js.map +7 -0
- package/dist/constants/keys.js +7 -0
- package/dist/constants/keys.js.map +7 -0
- package/dist/constants/macros.js +13 -0
- package/dist/constants/macros.js.map +7 -0
- package/dist/constants/modelCapabilities.js +154 -0
- package/dist/constants/modelCapabilities.js.map +7 -0
- package/dist/constants/models.js +1029 -0
- package/dist/constants/models.js.map +7 -0
- package/dist/constants/oauth.js +18 -0
- package/dist/constants/oauth.js.map +7 -0
- package/dist/constants/product.js +26 -0
- package/dist/constants/product.js.map +7 -0
- package/dist/constants/prompts.js +168 -0
- package/dist/constants/prompts.js.map +7 -0
- package/dist/constants/releaseNotes.js +9 -0
- package/dist/constants/releaseNotes.js.map +7 -0
- package/dist/context/PermissionContext.js +111 -0
- package/dist/context/PermissionContext.js.map +7 -0
- package/dist/context.js +259 -0
- package/dist/context.js.map +7 -0
- package/dist/cost-tracker.js +76 -0
- package/dist/cost-tracker.js.map +7 -0
- package/dist/entrypoints/cli.js +1101 -0
- package/dist/entrypoints/cli.js.map +7 -0
- package/dist/entrypoints/mcp.js +150 -0
- package/dist/entrypoints/mcp.js.map +7 -0
- package/dist/history.js +25 -0
- package/dist/history.js.map +7 -0
- package/dist/hooks/useApiKeyVerification.js +12 -0
- package/dist/hooks/useApiKeyVerification.js.map +7 -0
- package/dist/hooks/useArrowKeyHistory.js +50 -0
- package/dist/hooks/useArrowKeyHistory.js.map +7 -0
- package/dist/hooks/useCanUseTool.js +112 -0
- package/dist/hooks/useCanUseTool.js.map +7 -0
- package/dist/hooks/useCancelRequest.js +30 -0
- package/dist/hooks/useCancelRequest.js.map +7 -0
- package/dist/hooks/useDoublePress.js +31 -0
- package/dist/hooks/useDoublePress.js.map +7 -0
- package/dist/hooks/useExitOnCtrlCD.js +26 -0
- package/dist/hooks/useExitOnCtrlCD.js.map +7 -0
- package/dist/hooks/useInterval.js +18 -0
- package/dist/hooks/useInterval.js.map +7 -0
- package/dist/hooks/useLogMessages.js +14 -0
- package/dist/hooks/useLogMessages.js.map +7 -0
- package/dist/hooks/useLogStartupTime.js +15 -0
- package/dist/hooks/useLogStartupTime.js.map +7 -0
- package/dist/hooks/useNotifyAfterTimeout.js +42 -0
- package/dist/hooks/useNotifyAfterTimeout.js.map +7 -0
- package/dist/hooks/usePermissionRequestLogging.js +28 -0
- package/dist/hooks/usePermissionRequestLogging.js.map +7 -0
- package/dist/hooks/useTerminalSize.js +38 -0
- package/dist/hooks/useTerminalSize.js.map +7 -0
- package/dist/hooks/useTextInput.js +250 -0
- package/dist/hooks/useTextInput.js.map +7 -0
- package/dist/hooks/useUnifiedCompletion.js +929 -0
- package/dist/hooks/useUnifiedCompletion.js.map +7 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +7 -0
- package/dist/messages.js +33 -0
- package/dist/messages.js.map +7 -0
- package/dist/package.json +1 -0
- package/dist/permissions.js +194 -0
- package/dist/permissions.js.map +7 -0
- package/dist/query.js +492 -0
- package/dist/query.js.map +7 -0
- package/dist/screens/ConfigureNpmPrefix.js +128 -0
- package/dist/screens/ConfigureNpmPrefix.js.map +7 -0
- package/dist/screens/Doctor.js +143 -0
- package/dist/screens/Doctor.js.map +7 -0
- package/dist/screens/LogList.js +55 -0
- package/dist/screens/LogList.js.map +7 -0
- package/dist/screens/REPL.js +596 -0
- package/dist/screens/REPL.js.map +7 -0
- package/dist/screens/ResumeConversation.js +56 -0
- package/dist/screens/ResumeConversation.js.map +7 -0
- package/dist/services/adapters/base.js +29 -0
- package/dist/services/adapters/base.js.map +7 -0
- package/dist/services/adapters/chatCompletions.js +69 -0
- package/dist/services/adapters/chatCompletions.js.map +7 -0
- package/dist/services/adapters/responsesAPI.js +126 -0
- package/dist/services/adapters/responsesAPI.js.map +7 -0
- package/dist/services/browserMocks.js +48 -0
- package/dist/services/browserMocks.js.map +7 -0
- package/dist/services/claude.js +1605 -0
- package/dist/services/claude.js.map +7 -0
- package/dist/services/customCommands.js +359 -0
- package/dist/services/customCommands.js.map +7 -0
- package/dist/services/fileFreshness.js +280 -0
- package/dist/services/fileFreshness.js.map +7 -0
- package/dist/services/gpt5ConnectionTest.js +248 -0
- package/dist/services/gpt5ConnectionTest.js.map +7 -0
- package/dist/services/mcpClient.js +435 -0
- package/dist/services/mcpClient.js.map +7 -0
- package/dist/services/mcpServerApproval.js +55 -0
- package/dist/services/mcpServerApproval.js.map +7 -0
- package/dist/services/mentionProcessor.js +200 -0
- package/dist/services/mentionProcessor.js.map +7 -0
- package/dist/services/modelAdapterFactory.js +47 -0
- package/dist/services/modelAdapterFactory.js.map +7 -0
- package/dist/services/notifier.js +35 -0
- package/dist/services/notifier.js.map +7 -0
- package/dist/services/oauth.js +259 -0
- package/dist/services/oauth.js.map +7 -0
- package/dist/services/openai.js +998 -0
- package/dist/services/openai.js.map +7 -0
- package/dist/services/responseStateManager.js +68 -0
- package/dist/services/responseStateManager.js.map +7 -0
- package/dist/services/sentry.js +9 -0
- package/dist/services/sentry.js.map +7 -0
- package/dist/services/statsig.js +112 -0
- package/dist/services/statsig.js.map +7 -0
- package/dist/services/statsigStorage.js +75 -0
- package/dist/services/statsigStorage.js.map +7 -0
- package/dist/services/systemReminder.js +353 -0
- package/dist/services/systemReminder.js.map +7 -0
- package/dist/services/vcr.js +133 -0
- package/dist/services/vcr.js.map +7 -0
- package/dist/test/testAdapters.js +88 -0
- package/dist/test/testAdapters.js.map +1 -0
- package/dist/tools/ArchitectTool/ArchitectTool.js +119 -0
- package/dist/tools/ArchitectTool/ArchitectTool.js.map +7 -0
- package/dist/tools/ArchitectTool/prompt.js +18 -0
- package/dist/tools/ArchitectTool/prompt.js.map +7 -0
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +423 -0
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +7 -0
- package/dist/tools/BashTool/BashTool.js +188 -0
- package/dist/tools/BashTool/BashTool.js.map +7 -0
- package/dist/tools/BashTool/BashToolResultMessage.js +21 -0
- package/dist/tools/BashTool/BashToolResultMessage.js.map +7 -0
- package/dist/tools/BashTool/OutputLine.js +30 -0
- package/dist/tools/BashTool/OutputLine.js.map +7 -0
- package/dist/tools/BashTool/prompt.js +179 -0
- package/dist/tools/BashTool/prompt.js.map +7 -0
- package/dist/tools/BashTool/utils.js +51 -0
- package/dist/tools/BashTool/utils.js.map +7 -0
- package/dist/tools/FileEditTool/FileEditTool.js +228 -0
- package/dist/tools/FileEditTool/FileEditTool.js.map +7 -0
- package/dist/tools/FileEditTool/prompt.js +54 -0
- package/dist/tools/FileEditTool/prompt.js.map +7 -0
- package/dist/tools/FileEditTool/utils.js +42 -0
- package/dist/tools/FileEditTool/utils.js.map +7 -0
- package/dist/tools/FileReadTool/FileReadTool.js +272 -0
- package/dist/tools/FileReadTool/FileReadTool.js.map +7 -0
- package/dist/tools/FileReadTool/prompt.js +10 -0
- package/dist/tools/FileReadTool/prompt.js.map +7 -0
- package/dist/tools/FileWriteTool/FileWriteTool.js +204 -0
- package/dist/tools/FileWriteTool/FileWriteTool.js.map +7 -0
- package/dist/tools/FileWriteTool/prompt.js +14 -0
- package/dist/tools/FileWriteTool/prompt.js.map +7 -0
- package/dist/tools/GlobTool/GlobTool.js +88 -0
- package/dist/tools/GlobTool/GlobTool.js.map +7 -0
- package/dist/tools/GlobTool/prompt.js +12 -0
- package/dist/tools/GlobTool/prompt.js.map +7 -0
- package/dist/tools/GrepTool/GrepTool.js +107 -0
- package/dist/tools/GrepTool/GrepTool.js.map +7 -0
- package/dist/tools/GrepTool/prompt.js +15 -0
- package/dist/tools/GrepTool/prompt.js.map +7 -0
- package/dist/tools/MCPTool/MCPTool.js +90 -0
- package/dist/tools/MCPTool/MCPTool.js.map +7 -0
- package/dist/tools/MCPTool/prompt.js +7 -0
- package/dist/tools/MCPTool/prompt.js.map +7 -0
- package/dist/tools/MemoryReadTool/MemoryReadTool.js +103 -0
- package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +7 -0
- package/dist/tools/MemoryReadTool/prompt.js +7 -0
- package/dist/tools/MemoryReadTool/prompt.js.map +7 -0
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +77 -0
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +7 -0
- package/dist/tools/MemoryWriteTool/prompt.js +7 -0
- package/dist/tools/MemoryWriteTool/prompt.js.map +7 -0
- package/dist/tools/MultiEditTool/MultiEditTool.js +293 -0
- package/dist/tools/MultiEditTool/MultiEditTool.js.map +7 -0
- package/dist/tools/MultiEditTool/prompt.js +48 -0
- package/dist/tools/MultiEditTool/prompt.js.map +7 -0
- package/dist/tools/NotebookEditTool/NotebookEditTool.js +238 -0
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +7 -0
- package/dist/tools/NotebookEditTool/prompt.js +7 -0
- package/dist/tools/NotebookEditTool/prompt.js.map +7 -0
- package/dist/tools/NotebookReadTool/NotebookReadTool.js +212 -0
- package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +7 -0
- package/dist/tools/NotebookReadTool/prompt.js +7 -0
- package/dist/tools/NotebookReadTool/prompt.js.map +7 -0
- package/dist/tools/StickerRequestTool/StickerRequestTool.js +86 -0
- package/dist/tools/StickerRequestTool/StickerRequestTool.js.map +7 -0
- package/dist/tools/StickerRequestTool/prompt.js +23 -0
- package/dist/tools/StickerRequestTool/prompt.js.map +7 -0
- package/dist/tools/TaskTool/TaskTool.js +308 -0
- package/dist/tools/TaskTool/TaskTool.js.map +7 -0
- package/dist/tools/TaskTool/constants.js +5 -0
- package/dist/tools/TaskTool/constants.js.map +7 -0
- package/dist/tools/TaskTool/prompt.js +82 -0
- package/dist/tools/TaskTool/prompt.js.map +7 -0
- package/dist/tools/ThinkTool/ThinkTool.js +48 -0
- package/dist/tools/ThinkTool/ThinkTool.js.map +7 -0
- package/dist/tools/ThinkTool/prompt.js +16 -0
- package/dist/tools/ThinkTool/prompt.js.map +7 -0
- package/dist/tools/TodoWriteTool/TodoWriteTool.js +216 -0
- package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +7 -0
- package/dist/tools/TodoWriteTool/prompt.js +66 -0
- package/dist/tools/TodoWriteTool/prompt.js.map +7 -0
- package/dist/tools/URLFetcherTool/URLFetcherTool.js +137 -0
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +7 -0
- package/dist/tools/URLFetcherTool/cache.js +45 -0
- package/dist/tools/URLFetcherTool/cache.js.map +7 -0
- package/dist/tools/URLFetcherTool/htmlToMarkdown.js +42 -0
- package/dist/tools/URLFetcherTool/htmlToMarkdown.js.map +7 -0
- package/dist/tools/URLFetcherTool/prompt.js +22 -0
- package/dist/tools/URLFetcherTool/prompt.js.map +7 -0
- package/dist/tools/WebSearchTool/WebSearchTool.js +86 -0
- package/dist/tools/WebSearchTool/WebSearchTool.js.map +7 -0
- package/dist/tools/WebSearchTool/prompt.js +17 -0
- package/dist/tools/WebSearchTool/prompt.js.map +7 -0
- package/dist/tools/WebSearchTool/searchProviders.js +48 -0
- package/dist/tools/WebSearchTool/searchProviders.js.map +7 -0
- package/dist/tools/lsTool/lsTool.js +201 -0
- package/dist/tools/lsTool/lsTool.js.map +7 -0
- package/dist/tools/lsTool/prompt.js +5 -0
- package/dist/tools/lsTool/prompt.js.map +7 -0
- package/dist/tools.js +64 -0
- package/dist/tools.js.map +7 -0
- package/dist/types/PermissionMode.js +82 -0
- package/dist/types/PermissionMode.js.map +7 -0
- package/dist/types/RequestContext.js +47 -0
- package/dist/types/RequestContext.js.map +7 -0
- package/dist/types/common.d.js +1 -0
- package/dist/types/common.d.js.map +7 -0
- package/dist/types/conversation.js +1 -0
- package/dist/types/conversation.js.map +7 -0
- package/dist/types/logs.js +1 -0
- package/dist/types/logs.js.map +7 -0
- package/dist/types/modelCapabilities.js +1 -0
- package/dist/types/modelCapabilities.js.map +7 -0
- package/dist/types/notebook.js +1 -0
- package/dist/types/notebook.js.map +7 -0
- package/dist/utils/Cursor.js +313 -0
- package/dist/utils/Cursor.js.map +7 -0
- package/dist/utils/PersistentShell.js +382 -0
- package/dist/utils/PersistentShell.js.map +7 -0
- package/dist/utils/advancedFuzzyMatcher.js +206 -0
- package/dist/utils/advancedFuzzyMatcher.js.map +7 -0
- package/dist/utils/agentLoader.js +199 -0
- package/dist/utils/agentLoader.js.map +7 -0
- package/dist/utils/agentStorage.js +59 -0
- package/dist/utils/agentStorage.js.map +7 -0
- package/dist/utils/array.js +7 -0
- package/dist/utils/array.js.map +7 -0
- package/dist/utils/ask.js +77 -0
- package/dist/utils/ask.js.map +7 -0
- package/dist/utils/auth.js +11 -0
- package/dist/utils/auth.js.map +7 -0
- package/dist/utils/autoCompactCore.js +149 -0
- package/dist/utils/autoCompactCore.js.map +7 -0
- package/dist/utils/autoUpdater.js +362 -0
- package/dist/utils/autoUpdater.js.map +7 -0
- package/dist/utils/betas.js +21 -0
- package/dist/utils/betas.js.map +7 -0
- package/dist/utils/browser.js +15 -0
- package/dist/utils/browser.js.map +7 -0
- package/dist/utils/cleanup.js +54 -0
- package/dist/utils/cleanup.js.map +7 -0
- package/dist/utils/commands.js +207 -0
- package/dist/utils/commands.js.map +7 -0
- package/dist/utils/commonUnixCommands.js +687 -0
- package/dist/utils/commonUnixCommands.js.map +7 -0
- package/dist/utils/config.js +655 -0
- package/dist/utils/config.js.map +7 -0
- package/dist/utils/conversationRecovery.js +35 -0
- package/dist/utils/conversationRecovery.js.map +7 -0
- package/dist/utils/debugLogger.js +891 -0
- package/dist/utils/debugLogger.js.map +7 -0
- package/dist/utils/diff.js +32 -0
- package/dist/utils/diff.js.map +7 -0
- package/dist/utils/env.js +44 -0
- package/dist/utils/env.js.map +7 -0
- package/dist/utils/errors.js +23 -0
- package/dist/utils/errors.js.map +7 -0
- package/dist/utils/exampleCommands.js +80 -0
- package/dist/utils/exampleCommands.js.map +7 -0
- package/dist/utils/execFileNoThrow.js +44 -0
- package/dist/utils/execFileNoThrow.js.map +7 -0
- package/dist/utils/expertChatStorage.js +78 -0
- package/dist/utils/expertChatStorage.js.map +7 -0
- package/dist/utils/file.js +282 -0
- package/dist/utils/file.js.map +7 -0
- package/dist/utils/fileRecoveryCore.js +41 -0
- package/dist/utils/fileRecoveryCore.js.map +7 -0
- package/dist/utils/format.js +41 -0
- package/dist/utils/format.js.map +7 -0
- package/dist/utils/fuzzyMatcher.js +252 -0
- package/dist/utils/fuzzyMatcher.js.map +7 -0
- package/dist/utils/generators.js +46 -0
- package/dist/utils/generators.js.map +7 -0
- package/dist/utils/git.js +83 -0
- package/dist/utils/git.js.map +7 -0
- package/dist/utils/globalLogger.js +54 -0
- package/dist/utils/globalLogger.js.map +7 -0
- package/dist/utils/http.js +7 -0
- package/dist/utils/http.js.map +7 -0
- package/dist/utils/imagePaste.js +29 -0
- package/dist/utils/imagePaste.js.map +7 -0
- package/dist/utils/json.js +16 -0
- package/dist/utils/json.js.map +7 -0
- package/dist/utils/log.js +298 -0
- package/dist/utils/log.js.map +7 -0
- package/dist/utils/markdown.js +187 -0
- package/dist/utils/markdown.js.map +7 -0
- package/dist/utils/messageContextManager.js +195 -0
- package/dist/utils/messageContextManager.js.map +7 -0
- package/dist/utils/messages.js +633 -0
- package/dist/utils/messages.js.map +7 -0
- package/dist/utils/model.js +687 -0
- package/dist/utils/model.js.map +7 -0
- package/dist/utils/permissions/filesystem.js +80 -0
- package/dist/utils/permissions/filesystem.js.map +7 -0
- package/dist/utils/responseState.js +20 -0
- package/dist/utils/responseState.js.map +7 -0
- package/dist/utils/ripgrep.js +131 -0
- package/dist/utils/ripgrep.js.map +7 -0
- package/dist/utils/secureFile.js +483 -0
- package/dist/utils/secureFile.js.map +7 -0
- package/dist/utils/sessionState.js +31 -0
- package/dist/utils/sessionState.js.map +7 -0
- package/dist/utils/state.js +24 -0
- package/dist/utils/state.js.map +7 -0
- package/dist/utils/style.js +31 -0
- package/dist/utils/style.js.map +7 -0
- package/dist/utils/terminal.js +43 -0
- package/dist/utils/terminal.js.map +7 -0
- package/dist/utils/theme.js +102 -0
- package/dist/utils/theme.js.map +7 -0
- package/dist/utils/thinking.js +103 -0
- package/dist/utils/thinking.js.map +7 -0
- package/dist/utils/todoStorage.js +291 -0
- package/dist/utils/todoStorage.js.map +7 -0
- package/dist/utils/tokens.js +30 -0
- package/dist/utils/tokens.js.map +7 -0
- package/dist/utils/toolExecutionController.js +109 -0
- package/dist/utils/toolExecutionController.js.map +7 -0
- package/dist/utils/unaryLogging.js +14 -0
- package/dist/utils/unaryLogging.js.map +7 -0
- package/dist/utils/user.js +40 -0
- package/dist/utils/user.js.map +7 -0
- package/dist/utils/validate.js +132 -0
- package/dist/utils/validate.js.map +7 -0
- package/dist/yoga.wasm +0 -0
- package/package.json +28 -7
- package/src/Tool.ts +4 -3
- package/src/commands/agents.tsx +10 -4
- package/src/components/messages/AssistantToolUseMessage.tsx +5 -6
- package/src/constants/macros.ts +5 -2
- package/src/entrypoints/cli.tsx +38 -19
- package/src/entrypoints/mcp.ts +1 -2
- package/src/hooks/useDoublePress.ts +0 -1
- package/src/hooks/useTextInput.ts +4 -5
- package/src/hooks/useUnifiedCompletion.ts +2 -2
- package/src/index.ts +34 -0
- package/src/query.ts +13 -8
- package/src/screens/Doctor.tsx +1 -1
- package/src/screens/REPL.tsx +13 -9
- package/src/services/openai.ts +25 -4
- package/src/tools/ArchitectTool/ArchitectTool.tsx +18 -5
- package/src/tools/AskExpertModelTool/AskExpertModelTool.tsx +21 -14
- package/src/tools/FileEditTool/FileEditTool.tsx +6 -2
- package/src/tools/FileWriteTool/FileWriteTool.tsx +7 -3
- package/src/tools/MultiEditTool/MultiEditTool.tsx +26 -4
- package/src/tools/NotebookReadTool/NotebookReadTool.tsx +1 -1
- package/src/tools/StickerRequestTool/StickerRequestTool.tsx +28 -14
- package/src/tools/TaskTool/TaskTool.tsx +8 -36
- package/src/types/common.d.ts +2 -0
- package/src/utils/generators.ts +1 -1
- package/src/utils/messageContextManager.ts +5 -0
- package/src/utils/messages.tsx +8 -2
- package/src/utils/thinking.ts +1 -1
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { Box } from "ink";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { FallbackToolUseRejectedMessage } from "../../components/FallbackToolUseRejectedMessage.js";
|
|
5
|
+
import { HighlightedCode } from "../../components/HighlightedCode.js";
|
|
6
|
+
import { getContext } from "../../context.js";
|
|
7
|
+
import { query } from "../../query.js";
|
|
8
|
+
import { lastX } from "../../utils/generators.js";
|
|
9
|
+
import { createUserMessage } from "../../utils/messages.js";
|
|
10
|
+
import { BashTool } from "../BashTool/BashTool.js";
|
|
11
|
+
import { FileReadTool } from "../FileReadTool/FileReadTool.js";
|
|
12
|
+
import { FileWriteTool } from "../FileWriteTool/FileWriteTool.js";
|
|
13
|
+
import { GlobTool } from "../GlobTool/GlobTool.js";
|
|
14
|
+
import { GrepTool } from "../GrepTool/GrepTool.js";
|
|
15
|
+
import { LSTool } from "../lsTool/lsTool.js";
|
|
16
|
+
import { ARCHITECT_SYSTEM_PROMPT, DESCRIPTION } from "./prompt.js";
|
|
17
|
+
const FS_EXPLORATION_TOOLS = [
|
|
18
|
+
BashTool,
|
|
19
|
+
LSTool,
|
|
20
|
+
FileReadTool,
|
|
21
|
+
FileWriteTool,
|
|
22
|
+
GlobTool,
|
|
23
|
+
GrepTool
|
|
24
|
+
];
|
|
25
|
+
const inputSchema = z.strictObject({
|
|
26
|
+
prompt: z.string().describe("The technical request or coding task to analyze"),
|
|
27
|
+
context: z.string().describe("Optional context from previous conversation or system state").optional()
|
|
28
|
+
});
|
|
29
|
+
const ArchitectTool = {
|
|
30
|
+
name: "Architect",
|
|
31
|
+
async description() {
|
|
32
|
+
return DESCRIPTION;
|
|
33
|
+
},
|
|
34
|
+
inputSchema,
|
|
35
|
+
isReadOnly() {
|
|
36
|
+
return true;
|
|
37
|
+
},
|
|
38
|
+
isConcurrencySafe() {
|
|
39
|
+
return true;
|
|
40
|
+
},
|
|
41
|
+
userFacingName() {
|
|
42
|
+
return "Architect";
|
|
43
|
+
},
|
|
44
|
+
async isEnabled() {
|
|
45
|
+
return false;
|
|
46
|
+
},
|
|
47
|
+
needsPermissions() {
|
|
48
|
+
return false;
|
|
49
|
+
},
|
|
50
|
+
async *call({ prompt, context }, toolUseContext) {
|
|
51
|
+
const content = context ? `<context>${context}</context>
|
|
52
|
+
|
|
53
|
+
${prompt}` : prompt;
|
|
54
|
+
const userMessage = createUserMessage(content);
|
|
55
|
+
const messages = [userMessage];
|
|
56
|
+
const allowedTools = (toolUseContext.options?.tools ?? []).filter(
|
|
57
|
+
(_) => FS_EXPLORATION_TOOLS.map((_2) => _2.name).includes(_.name)
|
|
58
|
+
);
|
|
59
|
+
const canUseTool = async () => ({ result: true });
|
|
60
|
+
const lastResponse = await lastX(
|
|
61
|
+
query(
|
|
62
|
+
messages,
|
|
63
|
+
[ARCHITECT_SYSTEM_PROMPT],
|
|
64
|
+
await getContext(),
|
|
65
|
+
canUseTool,
|
|
66
|
+
{
|
|
67
|
+
...toolUseContext,
|
|
68
|
+
setToolJSX: () => {
|
|
69
|
+
},
|
|
70
|
+
// Dummy function since ArchitectTool doesn't use UI
|
|
71
|
+
options: {
|
|
72
|
+
commands: toolUseContext.options?.commands || [],
|
|
73
|
+
forkNumber: toolUseContext.options?.forkNumber || 0,
|
|
74
|
+
messageLogName: toolUseContext.options?.messageLogName || "default",
|
|
75
|
+
verbose: toolUseContext.options?.verbose || false,
|
|
76
|
+
safeMode: toolUseContext.options?.safeMode || false,
|
|
77
|
+
maxThinkingTokens: toolUseContext.options?.maxThinkingTokens || 0,
|
|
78
|
+
...toolUseContext.options,
|
|
79
|
+
tools: allowedTools
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
)
|
|
83
|
+
);
|
|
84
|
+
if (lastResponse.type !== "assistant") {
|
|
85
|
+
throw new Error(`Invalid response from API`);
|
|
86
|
+
}
|
|
87
|
+
const data = lastResponse.message.content.filter((_) => _.type === "text");
|
|
88
|
+
yield {
|
|
89
|
+
type: "result",
|
|
90
|
+
data,
|
|
91
|
+
resultForAssistant: this.renderResultForAssistant(data)
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
async prompt() {
|
|
95
|
+
return DESCRIPTION;
|
|
96
|
+
},
|
|
97
|
+
renderResultForAssistant(data) {
|
|
98
|
+
return data.map((block) => block.text).join("\n");
|
|
99
|
+
},
|
|
100
|
+
renderToolUseMessage(input) {
|
|
101
|
+
return Object.entries(input).map(([key, value]) => `${key}: ${JSON.stringify(value)}`).join(", ");
|
|
102
|
+
},
|
|
103
|
+
renderToolResultMessage(content) {
|
|
104
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", gap: 1 }, /* @__PURE__ */ React.createElement(
|
|
105
|
+
HighlightedCode,
|
|
106
|
+
{
|
|
107
|
+
code: content.map((_) => _.text).join("\n"),
|
|
108
|
+
language: "markdown"
|
|
109
|
+
}
|
|
110
|
+
));
|
|
111
|
+
},
|
|
112
|
+
renderToolUseRejectedMessage() {
|
|
113
|
+
return /* @__PURE__ */ React.createElement(FallbackToolUseRejectedMessage, null);
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
export {
|
|
117
|
+
ArchitectTool
|
|
118
|
+
};
|
|
119
|
+
//# sourceMappingURL=ArchitectTool.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/tools/ArchitectTool/ArchitectTool.tsx"],
|
|
4
|
+
"sourcesContent": ["import type { TextBlock } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Box } from 'ink'\nimport * as React from 'react'\nimport { z } from 'zod'\nimport type { Tool } from '../../Tool'\nimport { FallbackToolUseRejectedMessage } from '../../components/FallbackToolUseRejectedMessage'\nimport { HighlightedCode } from '../../components/HighlightedCode'\nimport { getContext } from '../../context'\nimport { Message, query } from '../../query'\nimport { lastX } from '../../utils/generators'\nimport { createUserMessage } from '../../utils/messages'\nimport { BashTool } from '../BashTool/BashTool'\nimport { FileReadTool } from '../FileReadTool/FileReadTool'\nimport { FileWriteTool } from '../FileWriteTool/FileWriteTool'\nimport { GlobTool } from '../GlobTool/GlobTool'\nimport { GrepTool } from '../GrepTool/GrepTool'\nimport { LSTool } from '../lsTool/lsTool'\nimport { ARCHITECT_SYSTEM_PROMPT, DESCRIPTION } from './prompt'\n\nconst FS_EXPLORATION_TOOLS: Tool[] = [\n BashTool,\n LSTool,\n FileReadTool,\n FileWriteTool,\n GlobTool,\n GrepTool,\n]\n\nconst inputSchema = z.strictObject({\n prompt: z\n .string()\n .describe('The technical request or coding task to analyze'),\n context: z\n .string()\n .describe('Optional context from previous conversation or system state')\n .optional(),\n})\n\nexport const ArchitectTool = {\n name: 'Architect',\n async description() {\n return DESCRIPTION\n },\n inputSchema,\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true // ArchitectTool is read-only, safe for concurrent execution\n },\n userFacingName() {\n return 'Architect'\n },\n async isEnabled() {\n return false\n },\n needsPermissions() {\n return false\n },\n async *call({ prompt, context }, toolUseContext) {\n const content = context\n ? `<context>${context}</context>\\n\\n${prompt}`\n : prompt\n\n const userMessage = createUserMessage(content)\n\n const messages: Message[] = [userMessage]\n\n // We only allow the file exploration tools to be used in the architect tool\n const allowedTools = (toolUseContext.options?.tools ?? []).filter(_ =>\n FS_EXPLORATION_TOOLS.map(_ => _.name).includes(_.name),\n )\n\n // Create a dummy canUseTool function since this tool controls its own tool usage\n const canUseTool = async () => ({ result: true as const })\n\n const lastResponse = await lastX(\n query(\n messages,\n [ARCHITECT_SYSTEM_PROMPT],\n await getContext(),\n canUseTool,\n {\n ...toolUseContext,\n setToolJSX: () => {}, // Dummy function since ArchitectTool doesn't use UI\n options: { \n commands: toolUseContext.options?.commands || [],\n forkNumber: toolUseContext.options?.forkNumber || 0,\n messageLogName: toolUseContext.options?.messageLogName || 'default',\n verbose: toolUseContext.options?.verbose || false,\n safeMode: toolUseContext.options?.safeMode || false,\n maxThinkingTokens: toolUseContext.options?.maxThinkingTokens || 0,\n ...toolUseContext.options, \n tools: allowedTools \n },\n },\n ),\n )\n\n if (lastResponse.type !== 'assistant') {\n throw new Error(`Invalid response from API`)\n }\n\n const data = lastResponse.message.content.filter(_ => _.type === 'text')\n yield {\n type: 'result',\n data,\n resultForAssistant: this.renderResultForAssistant(data),\n }\n },\n async prompt() {\n return DESCRIPTION\n },\n renderResultForAssistant(data: TextBlock[]): string {\n return data.map(block => block.text).join('\\n')\n },\n renderToolUseMessage(input) {\n return Object.entries(input)\n .map(([key, value]) => `${key}: ${JSON.stringify(value)}`)\n .join(', ')\n },\n renderToolResultMessage(content) {\n return (\n <Box flexDirection=\"column\" gap={1}>\n <HighlightedCode\n code={content.map(_ => _.text).join('\\n')}\n language=\"markdown\"\n />\n </Box>\n )\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n} satisfies Tool<typeof inputSchema, TextBlock[]>\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,WAAW;AACpB,YAAY,WAAW;AACvB,SAAS,SAAS;AAElB,SAAS,sCAAsC;AAC/C,SAAS,uBAAuB;AAChC,SAAS,kBAAkB;AAC3B,SAAkB,aAAa;AAC/B,SAAS,aAAa;AACtB,SAAS,yBAAyB;AAClC,SAAS,gBAAgB;AACzB,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,SAAS,yBAAyB,mBAAmB;AAErD,MAAM,uBAA+B;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,cAAc,EAAE,aAAa;AAAA,EACjC,QAAQ,EACL,OAAO,EACP,SAAS,iDAAiD;AAAA,EAC7D,SAAS,EACN,OAAO,EACP,SAAS,6DAA6D,EACtE,SAAS;AACd,CAAC;AAEM,MAAM,gBAAgB;AAAA,EAC3B,MAAM;AAAA,EACN,MAAM,cAAc;AAClB,WAAO;AAAA,EACT;AAAA,EACA;AAAA,EACA,aAAa;AACX,WAAO;AAAA,EACT;AAAA,EACA,oBAAoB;AAClB,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,YAAY;AAChB,WAAO;AAAA,EACT;AAAA,EACA,mBAAmB;AACjB,WAAO;AAAA,EACT;AAAA,EACA,OAAO,KAAK,EAAE,QAAQ,QAAQ,GAAG,gBAAgB;AAC/C,UAAM,UAAU,UACZ,YAAY,OAAO;AAAA;AAAA,EAAiB,MAAM,KAC1C;AAEJ,UAAM,cAAc,kBAAkB,OAAO;AAE7C,UAAM,WAAsB,CAAC,WAAW;AAGxC,UAAM,gBAAgB,eAAe,SAAS,SAAS,CAAC,GAAG;AAAA,MAAO,OAChE,qBAAqB,IAAI,CAAAA,OAAKA,GAAE,IAAI,EAAE,SAAS,EAAE,IAAI;AAAA,IACvD;AAGA,UAAM,aAAa,aAAa,EAAE,QAAQ,KAAc;AAExD,UAAM,eAAe,MAAM;AAAA,MACzB;AAAA,QACE;AAAA,QACA,CAAC,uBAAuB;AAAA,QACxB,MAAM,WAAW;AAAA,QACjB;AAAA,QACA;AAAA,UACE,GAAG;AAAA,UACH,YAAY,MAAM;AAAA,UAAC;AAAA;AAAA,UACnB,SAAS;AAAA,YACP,UAAU,eAAe,SAAS,YAAY,CAAC;AAAA,YAC/C,YAAY,eAAe,SAAS,cAAc;AAAA,YAClD,gBAAgB,eAAe,SAAS,kBAAkB;AAAA,YAC1D,SAAS,eAAe,SAAS,WAAW;AAAA,YAC5C,UAAU,eAAe,SAAS,YAAY;AAAA,YAC9C,mBAAmB,eAAe,SAAS,qBAAqB;AAAA,YAChE,GAAG,eAAe;AAAA,YAClB,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,aAAa,SAAS,aAAa;AACrC,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,UAAM,OAAO,aAAa,QAAQ,QAAQ,OAAO,OAAK,EAAE,SAAS,MAAM;AACvE,UAAM;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA,oBAAoB,KAAK,yBAAyB,IAAI;AAAA,IACxD;AAAA,EACF;AAAA,EACA,MAAM,SAAS;AACb,WAAO;AAAA,EACT;AAAA,EACA,yBAAyB,MAA2B;AAClD,WAAO,KAAK,IAAI,WAAS,MAAM,IAAI,EAAE,KAAK,IAAI;AAAA,EAChD;AAAA,EACA,qBAAqB,OAAO;AAC1B,WAAO,OAAO,QAAQ,KAAK,EACxB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,KAAK,KAAK,UAAU,KAAK,CAAC,EAAE,EACxD,KAAK,IAAI;AAAA,EACd;AAAA,EACA,wBAAwB,SAAS;AAC/B,WACE,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,QAAQ,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI;AAAA,QACxC,UAAS;AAAA;AAAA,IACX,CACF;AAAA,EAEJ;AAAA,EACA,+BAA+B;AAC7B,WAAO,oCAAC,oCAA+B;AAAA,EACzC;AACF;",
|
|
6
|
+
"names": ["_"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const ARCHITECT_SYSTEM_PROMPT = `You are an expert software architect. Your role is to analyze technical requirements and produce clear, actionable implementation plans.
|
|
2
|
+
These plans will then be carried out by a junior software engineer so you need to be specific and detailed. However do not actually write the code, just explain the plan.
|
|
3
|
+
|
|
4
|
+
Follow these steps for each request:
|
|
5
|
+
1. Carefully analyze requirements to identify core functionality and constraints
|
|
6
|
+
2. Define clear technical approach with specific technologies and patterns
|
|
7
|
+
3. Break down implementation into concrete, actionable steps at the appropriate level of abstraction
|
|
8
|
+
|
|
9
|
+
Keep responses focused, specific and actionable.
|
|
10
|
+
|
|
11
|
+
IMPORTANT: Do not ask the user if you should implement the changes at the end. Just provide the plan as described above.
|
|
12
|
+
IMPORTANT: Do not attempt to write the code or use any string modification tools. Just provide the plan.`;
|
|
13
|
+
const DESCRIPTION = "Your go-to tool for any technical or coding task. Analyzes requirements and breaks them down into clear, actionable implementation steps. Use this whenever you need help planning how to implement a feature, solve a technical problem, or structure your code.";
|
|
14
|
+
export {
|
|
15
|
+
ARCHITECT_SYSTEM_PROMPT,
|
|
16
|
+
DESCRIPTION
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/tools/ArchitectTool/prompt.ts"],
|
|
4
|
+
"sourcesContent": ["export const ARCHITECT_SYSTEM_PROMPT = `You are an expert software architect. Your role is to analyze technical requirements and produce clear, actionable implementation plans.\nThese plans will then be carried out by a junior software engineer so you need to be specific and detailed. However do not actually write the code, just explain the plan.\n\nFollow these steps for each request:\n1. Carefully analyze requirements to identify core functionality and constraints\n2. Define clear technical approach with specific technologies and patterns\n3. Break down implementation into concrete, actionable steps at the appropriate level of abstraction\n\nKeep responses focused, specific and actionable. \n\nIMPORTANT: Do not ask the user if you should implement the changes at the end. Just provide the plan as described above.\nIMPORTANT: Do not attempt to write the code or use any string modification tools. Just provide the plan.`\n\nexport const DESCRIPTION =\n 'Your go-to tool for any technical or coding task. Analyzes requirements and breaks them down into clear, actionable implementation steps. Use this whenever you need help planning how to implement a feature, solve a technical problem, or structure your code.'\n"],
|
|
5
|
+
"mappings": "AAAO,MAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAahC,MAAM,cACX;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { FallbackToolUseRejectedMessage } from "../../components/FallbackToolUseRejectedMessage.js";
|
|
5
|
+
import { getModelManager } from "../../utils/model.js";
|
|
6
|
+
import { getTheme } from "../../utils/theme.js";
|
|
7
|
+
import {
|
|
8
|
+
createUserMessage,
|
|
9
|
+
createAssistantMessage,
|
|
10
|
+
INTERRUPT_MESSAGE
|
|
11
|
+
} from "../../utils/messages.js";
|
|
12
|
+
import { logError } from "../../utils/log.js";
|
|
13
|
+
import {
|
|
14
|
+
createExpertChatSession,
|
|
15
|
+
loadExpertChatSession,
|
|
16
|
+
getSessionMessages,
|
|
17
|
+
addMessageToSession
|
|
18
|
+
} from "../../utils/expertChatStorage.js";
|
|
19
|
+
import { queryLLM } from "../../services/claude.js";
|
|
20
|
+
import { debug as debugLogger } from "../../utils/debugLogger.js";
|
|
21
|
+
import { applyMarkdown } from "../../utils/markdown.js";
|
|
22
|
+
const inputSchema = z.strictObject({
|
|
23
|
+
question: z.string().describe(
|
|
24
|
+
"COMPLETE SELF-CONTAINED QUESTION: Must include full background context, relevant details, and a clear independent question. The expert model will receive ONLY this content with no access to previous conversation or external context. Structure as: 1) Background/Context 2) Specific situation/problem 3) Clear question. Ensure the expert can fully understand and respond without needing additional information."
|
|
25
|
+
),
|
|
26
|
+
expert_model: z.string().describe(
|
|
27
|
+
"The expert model to use (e.g., gpt-5, claude-3-5-sonnet-20241022)"
|
|
28
|
+
),
|
|
29
|
+
chat_session_id: z.string().describe(
|
|
30
|
+
'Chat session ID: use "new" for new session or existing session ID'
|
|
31
|
+
)
|
|
32
|
+
});
|
|
33
|
+
const AskExpertModelTool = {
|
|
34
|
+
name: "AskExpertModel",
|
|
35
|
+
async description() {
|
|
36
|
+
return "Consult external AI models for expert opinions and analysis";
|
|
37
|
+
},
|
|
38
|
+
async prompt() {
|
|
39
|
+
return `Ask a question to a specific external AI model for expert analysis.
|
|
40
|
+
|
|
41
|
+
This tool allows you to consult different AI models for their unique perspectives and expertise.
|
|
42
|
+
|
|
43
|
+
CRITICAL REQUIREMENT FOR QUESTION PARAMETER:
|
|
44
|
+
The question MUST be completely self-contained and include:
|
|
45
|
+
1. FULL BACKGROUND CONTEXT - All relevant information the expert needs
|
|
46
|
+
2. SPECIFIC SITUATION - Clear description of the current scenario/problem
|
|
47
|
+
3. INDEPENDENT QUESTION - What exactly you want the expert to analyze/answer
|
|
48
|
+
|
|
49
|
+
The expert model receives ONLY your question content with NO access to:
|
|
50
|
+
- Previous conversation history (unless using existing session)
|
|
51
|
+
- Current codebase or file context
|
|
52
|
+
- User's current task or project details
|
|
53
|
+
|
|
54
|
+
IMPORTANT: This tool is for asking questions to models, not for task execution.
|
|
55
|
+
- Use when you need a specific model's opinion or analysis
|
|
56
|
+
- Use when you want to compare different models' responses
|
|
57
|
+
- Use the @ask-[model] format when available
|
|
58
|
+
|
|
59
|
+
The expert_model parameter accepts:
|
|
60
|
+
- OpenAI: gpt-4, gpt-5, o1-preview
|
|
61
|
+
- Anthropic: claude-3-5-sonnet, claude-3-opus
|
|
62
|
+
- Others: kimi, gemini-pro, mixtral
|
|
63
|
+
|
|
64
|
+
Example of well-structured question:
|
|
65
|
+
"Background: I'm working on a React TypeScript application with performance issues. The app renders a large list of 10,000 items using a simple map() function, causing UI freezing.
|
|
66
|
+
|
|
67
|
+
Current situation: Users report 3-5 second delays when scrolling through the list. The component re-renders the entire list on every state change.
|
|
68
|
+
|
|
69
|
+
Question: What are the most effective React optimization techniques for handling large lists, and how should I prioritize implementing virtualization vs memoization vs other approaches?"`;
|
|
70
|
+
},
|
|
71
|
+
isReadOnly() {
|
|
72
|
+
return true;
|
|
73
|
+
},
|
|
74
|
+
isConcurrencySafe() {
|
|
75
|
+
return true;
|
|
76
|
+
},
|
|
77
|
+
inputSchema,
|
|
78
|
+
userFacingName() {
|
|
79
|
+
return "AskExpertModel";
|
|
80
|
+
},
|
|
81
|
+
async isEnabled() {
|
|
82
|
+
return true;
|
|
83
|
+
},
|
|
84
|
+
needsPermissions() {
|
|
85
|
+
return false;
|
|
86
|
+
},
|
|
87
|
+
async validateInput({
|
|
88
|
+
question,
|
|
89
|
+
expert_model,
|
|
90
|
+
chat_session_id
|
|
91
|
+
}, context) {
|
|
92
|
+
if (!question.trim()) {
|
|
93
|
+
return { result: false, message: "Question cannot be empty" };
|
|
94
|
+
}
|
|
95
|
+
if (!expert_model.trim()) {
|
|
96
|
+
return { result: false, message: "Expert model must be specified" };
|
|
97
|
+
}
|
|
98
|
+
if (!chat_session_id.trim()) {
|
|
99
|
+
return {
|
|
100
|
+
result: false,
|
|
101
|
+
message: 'Chat session ID must be specified (use "new" for new session)'
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
const modelManager = getModelManager();
|
|
106
|
+
let currentModel;
|
|
107
|
+
if (context?.agentId && context?.options?.model) {
|
|
108
|
+
currentModel = context.options.model;
|
|
109
|
+
} else {
|
|
110
|
+
currentModel = modelManager.getModelName("main") || "";
|
|
111
|
+
}
|
|
112
|
+
const normalizedExpert = expert_model.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
113
|
+
const normalizedCurrent = currentModel.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
114
|
+
if (normalizedExpert === normalizedCurrent) {
|
|
115
|
+
return {
|
|
116
|
+
result: false,
|
|
117
|
+
message: `You are already running as ${currentModel}. Consulting the same model would be redundant. Please choose a different model or handle the task directly.`
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
} catch (e) {
|
|
121
|
+
debugLogger.error("AskExpertModel", { message: "Could not determine current model", error: e });
|
|
122
|
+
}
|
|
123
|
+
try {
|
|
124
|
+
const modelManager = getModelManager();
|
|
125
|
+
const modelResolution = modelManager.resolveModelWithInfo(expert_model);
|
|
126
|
+
if (!modelResolution.success) {
|
|
127
|
+
const availableModels = modelManager.getAllAvailableModelNames();
|
|
128
|
+
if (availableModels.length > 0) {
|
|
129
|
+
return {
|
|
130
|
+
result: false,
|
|
131
|
+
message: `Model '${expert_model}' is not configured. Available models: ${availableModels.join(", ")}. Check if any available model closely matches the user's request (e.g., 'kimi' matches 'kimi-k2-0711-preview'). If there's a strong match, auto retry using the correct model name. If no close match exists, inform the user that '${expert_model}' needs to be configured using /model command.`
|
|
132
|
+
};
|
|
133
|
+
} else {
|
|
134
|
+
return {
|
|
135
|
+
result: false,
|
|
136
|
+
message: `Model '${expert_model}' not found and no models are currently configured in the system. Inform the user that models need to be configured first using the /model command.`
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
} catch (error) {
|
|
141
|
+
console.error("Model validation error in AskExpertModelTool:", error);
|
|
142
|
+
logError(error);
|
|
143
|
+
return {
|
|
144
|
+
result: false,
|
|
145
|
+
message: `Failed to validate expert model '${expert_model}'. Please check your model configuration.`
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
return { result: true };
|
|
149
|
+
},
|
|
150
|
+
renderToolUseMessage({ question, expert_model, chat_session_id }, { verbose }) {
|
|
151
|
+
if (!question || !expert_model) return null;
|
|
152
|
+
const isNewSession = chat_session_id === "new";
|
|
153
|
+
const sessionDisplay = isNewSession ? "new session" : `session ${chat_session_id.substring(0, 5)}...`;
|
|
154
|
+
const theme = getTheme();
|
|
155
|
+
if (verbose) {
|
|
156
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: "yellow" }, expert_model), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, sessionDisplay), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.text }, question.length > 300 ? question.substring(0, 300) + "..." : question)));
|
|
157
|
+
}
|
|
158
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: "yellow" }, expert_model, " "), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText, dimColor: true }, "(", sessionDisplay, ")"));
|
|
159
|
+
},
|
|
160
|
+
renderToolResultMessage(content) {
|
|
161
|
+
const verbose = true;
|
|
162
|
+
const theme = getTheme();
|
|
163
|
+
if (typeof content === "object" && content && "expertAnswer" in content) {
|
|
164
|
+
const expertResult = content;
|
|
165
|
+
const isError = expertResult.expertAnswer.startsWith("Error") || expertResult.expertAnswer.includes("failed");
|
|
166
|
+
const isInterrupted = expertResult.chatSessionId === "interrupted";
|
|
167
|
+
if (isInterrupted) {
|
|
168
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "Consultation interrupted"));
|
|
169
|
+
}
|
|
170
|
+
const answerText = verbose ? expertResult.expertAnswer.trim() : expertResult.expertAnswer.length > 500 ? expertResult.expertAnswer.substring(0, 500) + "..." : expertResult.expertAnswer.trim();
|
|
171
|
+
if (isError) {
|
|
172
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: "red" }, answerText));
|
|
173
|
+
}
|
|
174
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.text }, "Response from ", expertResult.expertModelName, ":"), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.text }, applyMarkdown(answerText))), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText, dimColor: true }, "Session: ", expertResult.chatSessionId.substring(0, 8))));
|
|
175
|
+
}
|
|
176
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "Consultation completed"));
|
|
177
|
+
},
|
|
178
|
+
renderResultForAssistant(output) {
|
|
179
|
+
return `[Expert consultation completed]
|
|
180
|
+
Expert Model: ${output.expertModelName}
|
|
181
|
+
Session ID: ${output.chatSessionId}
|
|
182
|
+
To continue this conversation with context preservation, use this Session ID in your next AskExpertModel call to maintain the full conversation history and context.
|
|
183
|
+
|
|
184
|
+
${output.expertAnswer}`;
|
|
185
|
+
},
|
|
186
|
+
renderToolUseRejectedMessage() {
|
|
187
|
+
return /* @__PURE__ */ React.createElement(FallbackToolUseRejectedMessage, null);
|
|
188
|
+
},
|
|
189
|
+
async *call({ question, expert_model, chat_session_id }, { abortController, readFileTimestamps }) {
|
|
190
|
+
const expertModel = expert_model;
|
|
191
|
+
let sessionId;
|
|
192
|
+
let isInterrupted = false;
|
|
193
|
+
const abortListener = () => {
|
|
194
|
+
isInterrupted = true;
|
|
195
|
+
};
|
|
196
|
+
abortController.signal.addEventListener("abort", abortListener);
|
|
197
|
+
try {
|
|
198
|
+
if (abortController.signal.aborted) {
|
|
199
|
+
return yield* this.handleInterrupt();
|
|
200
|
+
}
|
|
201
|
+
if (chat_session_id === "new") {
|
|
202
|
+
try {
|
|
203
|
+
const session = createExpertChatSession(expertModel);
|
|
204
|
+
sessionId = session.sessionId;
|
|
205
|
+
} catch (error) {
|
|
206
|
+
console.error("Failed to create new expert chat session:", error);
|
|
207
|
+
logError(error);
|
|
208
|
+
throw new Error("Failed to create new chat session");
|
|
209
|
+
}
|
|
210
|
+
} else {
|
|
211
|
+
sessionId = chat_session_id;
|
|
212
|
+
try {
|
|
213
|
+
const session = loadExpertChatSession(sessionId);
|
|
214
|
+
if (!session) {
|
|
215
|
+
const newSession = createExpertChatSession(expertModel);
|
|
216
|
+
sessionId = newSession.sessionId;
|
|
217
|
+
}
|
|
218
|
+
} catch (error) {
|
|
219
|
+
console.error("Failed to load expert chat session:", error);
|
|
220
|
+
logError(error);
|
|
221
|
+
try {
|
|
222
|
+
const newSession = createExpertChatSession(expertModel);
|
|
223
|
+
sessionId = newSession.sessionId;
|
|
224
|
+
} catch (createError) {
|
|
225
|
+
console.error("Failed to create fallback expert chat session:", createError);
|
|
226
|
+
logError(createError);
|
|
227
|
+
throw new Error("Unable to create or load chat session");
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (isInterrupted || abortController.signal.aborted) {
|
|
232
|
+
return yield* this.handleInterrupt();
|
|
233
|
+
}
|
|
234
|
+
let historyMessages;
|
|
235
|
+
try {
|
|
236
|
+
historyMessages = getSessionMessages(sessionId);
|
|
237
|
+
} catch (error) {
|
|
238
|
+
console.error("Failed to load session messages:", error);
|
|
239
|
+
logError(error);
|
|
240
|
+
historyMessages = [];
|
|
241
|
+
}
|
|
242
|
+
const messages = [...historyMessages, { role: "user", content: question }];
|
|
243
|
+
let systemMessages;
|
|
244
|
+
try {
|
|
245
|
+
systemMessages = messages.map(
|
|
246
|
+
(msg) => msg.role === "user" ? createUserMessage(msg.content) : createAssistantMessage(msg.content)
|
|
247
|
+
);
|
|
248
|
+
} catch (error) {
|
|
249
|
+
console.error("Failed to create system messages:", error);
|
|
250
|
+
logError(error);
|
|
251
|
+
throw new Error("Failed to prepare conversation messages");
|
|
252
|
+
}
|
|
253
|
+
if (isInterrupted || abortController.signal.aborted) {
|
|
254
|
+
return yield* this.handleInterrupt();
|
|
255
|
+
}
|
|
256
|
+
yield {
|
|
257
|
+
type: "progress",
|
|
258
|
+
content: createAssistantMessage(
|
|
259
|
+
`Connecting to ${expertModel}... (timeout: 5 minutes)`
|
|
260
|
+
)
|
|
261
|
+
};
|
|
262
|
+
let response;
|
|
263
|
+
try {
|
|
264
|
+
const modelManager = getModelManager();
|
|
265
|
+
const modelResolution = modelManager.resolveModelWithInfo(expertModel);
|
|
266
|
+
debugLogger.api("EXPERT_MODEL_RESOLUTION", {
|
|
267
|
+
requestedModel: expertModel,
|
|
268
|
+
success: modelResolution.success,
|
|
269
|
+
profileName: modelResolution.profile?.name,
|
|
270
|
+
profileModelName: modelResolution.profile?.modelName,
|
|
271
|
+
provider: modelResolution.profile?.provider,
|
|
272
|
+
isActive: modelResolution.profile?.isActive,
|
|
273
|
+
error: modelResolution.error
|
|
274
|
+
});
|
|
275
|
+
const timeoutMs = 3e5;
|
|
276
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
277
|
+
setTimeout(() => {
|
|
278
|
+
reject(new Error(`Expert model query timed out after ${timeoutMs / 1e3}s`));
|
|
279
|
+
}, timeoutMs);
|
|
280
|
+
});
|
|
281
|
+
response = await Promise.race([
|
|
282
|
+
queryLLM(
|
|
283
|
+
systemMessages,
|
|
284
|
+
[],
|
|
285
|
+
// no system prompt - let expert model use its default behavior
|
|
286
|
+
0,
|
|
287
|
+
// no thinking tokens needed
|
|
288
|
+
[],
|
|
289
|
+
// no tools needed
|
|
290
|
+
abortController.signal,
|
|
291
|
+
{
|
|
292
|
+
safeMode: false,
|
|
293
|
+
model: expertModel,
|
|
294
|
+
prependCLISysprompt: false
|
|
295
|
+
// KEY: avoid injecting CLI context
|
|
296
|
+
}
|
|
297
|
+
),
|
|
298
|
+
timeoutPromise
|
|
299
|
+
]);
|
|
300
|
+
} catch (error) {
|
|
301
|
+
console.error("Expert model query failed:", error);
|
|
302
|
+
logError(error);
|
|
303
|
+
if (error.name === "AbortError" || abortController.signal?.aborted || isInterrupted) {
|
|
304
|
+
return yield* this.handleInterrupt();
|
|
305
|
+
}
|
|
306
|
+
if (error.message?.includes("timed out")) {
|
|
307
|
+
throw new Error(
|
|
308
|
+
`Expert model '${expertModel}' timed out after 5 minutes.
|
|
309
|
+
|
|
310
|
+
Suggestions:
|
|
311
|
+
- The model might be experiencing high load
|
|
312
|
+
- Try a different model or retry later
|
|
313
|
+
- Consider breaking down your question into smaller parts`
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
if (error.message?.includes("rate limit")) {
|
|
317
|
+
throw new Error(
|
|
318
|
+
`Rate limit exceeded for ${expertModel}.
|
|
319
|
+
|
|
320
|
+
Please wait a moment and try again, or use a different model.`
|
|
321
|
+
);
|
|
322
|
+
}
|
|
323
|
+
if (error.message?.includes("invalid api key")) {
|
|
324
|
+
throw new Error(
|
|
325
|
+
`Invalid API key for ${expertModel}.
|
|
326
|
+
|
|
327
|
+
Please check your model configuration with /model command.`
|
|
328
|
+
);
|
|
329
|
+
}
|
|
330
|
+
if (error.message?.includes("model not found") || error.message?.includes("Failed to resolve model")) {
|
|
331
|
+
try {
|
|
332
|
+
const modelManager = getModelManager();
|
|
333
|
+
const availableModels = modelManager.getAllAvailableModelNames();
|
|
334
|
+
if (availableModels.length > 0) {
|
|
335
|
+
throw new Error(
|
|
336
|
+
`Model '${expertModel}' is not configured. Available models: ${availableModels.join(", ")}. Check if any available model closely matches the user's request (e.g., 'kimi' matches 'kimi-k2-0711-preview'). If there's a strong match, auto retry using the correct model name. If no close match exists, inform the user that '${expertModel}' needs to be configured using /model command.`
|
|
337
|
+
);
|
|
338
|
+
} else {
|
|
339
|
+
throw new Error(
|
|
340
|
+
`Model '${expertModel}' not found and no models are currently configured in the system. Inform the user that models need to be configured first using the /model command.`
|
|
341
|
+
);
|
|
342
|
+
}
|
|
343
|
+
} catch (modelError) {
|
|
344
|
+
throw new Error(
|
|
345
|
+
`Model '${expertModel}' not found. Please check model configuration or inform user about the issue.`
|
|
346
|
+
);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
throw new Error(
|
|
350
|
+
`Expert model query failed: ${error.message || "Unknown error"}`
|
|
351
|
+
);
|
|
352
|
+
}
|
|
353
|
+
let expertAnswer;
|
|
354
|
+
try {
|
|
355
|
+
if (!response?.message?.content) {
|
|
356
|
+
throw new Error("No content in expert response");
|
|
357
|
+
}
|
|
358
|
+
expertAnswer = response.message.content.filter((block) => block.type === "text").map((block) => block.text).join("\n");
|
|
359
|
+
if (!expertAnswer.trim()) {
|
|
360
|
+
throw new Error("Expert response was empty");
|
|
361
|
+
}
|
|
362
|
+
} catch (error) {
|
|
363
|
+
console.error("Failed to extract expert answer:", error);
|
|
364
|
+
logError(error);
|
|
365
|
+
throw new Error("Failed to process expert response");
|
|
366
|
+
}
|
|
367
|
+
try {
|
|
368
|
+
addMessageToSession(sessionId, "user", question);
|
|
369
|
+
addMessageToSession(sessionId, "assistant", expertAnswer);
|
|
370
|
+
} catch (error) {
|
|
371
|
+
console.error("Failed to save conversation to session:", error);
|
|
372
|
+
logError(error);
|
|
373
|
+
}
|
|
374
|
+
const result = {
|
|
375
|
+
chatSessionId: sessionId,
|
|
376
|
+
expertModelName: expertModel,
|
|
377
|
+
expertAnswer
|
|
378
|
+
};
|
|
379
|
+
yield {
|
|
380
|
+
type: "result",
|
|
381
|
+
data: result,
|
|
382
|
+
resultForAssistant: this.renderResultForAssistant(result)
|
|
383
|
+
};
|
|
384
|
+
} catch (error) {
|
|
385
|
+
if (error.name === "AbortError" || abortController.signal?.aborted || isInterrupted) {
|
|
386
|
+
return yield* this.handleInterrupt();
|
|
387
|
+
}
|
|
388
|
+
console.error("AskExpertModelTool execution failed:", error);
|
|
389
|
+
logError(error);
|
|
390
|
+
const errorSessionId = sessionId || "error-session";
|
|
391
|
+
const errorMessage = error.message || "Expert consultation failed with unknown error";
|
|
392
|
+
const result = {
|
|
393
|
+
chatSessionId: errorSessionId,
|
|
394
|
+
expertModelName: expertModel,
|
|
395
|
+
expertAnswer: `\u274C ${errorMessage}`
|
|
396
|
+
};
|
|
397
|
+
yield {
|
|
398
|
+
type: "result",
|
|
399
|
+
data: result,
|
|
400
|
+
resultForAssistant: this.renderResultForAssistant(result)
|
|
401
|
+
};
|
|
402
|
+
} finally {
|
|
403
|
+
abortController.signal.removeEventListener("abort", abortListener);
|
|
404
|
+
}
|
|
405
|
+
},
|
|
406
|
+
// Unified interrupt handling method (following TaskTool pattern)
|
|
407
|
+
async *handleInterrupt() {
|
|
408
|
+
yield {
|
|
409
|
+
type: "result",
|
|
410
|
+
data: {
|
|
411
|
+
chatSessionId: "interrupted",
|
|
412
|
+
expertModelName: "cancelled",
|
|
413
|
+
expertAnswer: INTERRUPT_MESSAGE
|
|
414
|
+
},
|
|
415
|
+
resultForAssistant: INTERRUPT_MESSAGE
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
};
|
|
419
|
+
export {
|
|
420
|
+
AskExpertModelTool,
|
|
421
|
+
inputSchema
|
|
422
|
+
};
|
|
423
|
+
//# sourceMappingURL=AskExpertModelTool.js.map
|