@shareai-lab/kode 1.1.12 → 1.1.14
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 +83 -57
- 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
package/dist/query.js
ADDED
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
import {
|
|
2
|
+
messagePairValidForBinaryFeedback,
|
|
3
|
+
shouldUseBinaryFeedback
|
|
4
|
+
} from "./components/binary-feedback/utils.js";
|
|
5
|
+
import {
|
|
6
|
+
formatSystemPromptWithContext,
|
|
7
|
+
queryLLM
|
|
8
|
+
} from "./services/claude.js";
|
|
9
|
+
import { emitReminderEvent } from "./services/systemReminder.js";
|
|
10
|
+
import { logEvent } from "./services/statsig.js";
|
|
11
|
+
import { all } from "./utils/generators.js";
|
|
12
|
+
import { logError } from "./utils/log.js";
|
|
13
|
+
import {
|
|
14
|
+
debug as debugLogger,
|
|
15
|
+
markPhase,
|
|
16
|
+
getCurrentRequest,
|
|
17
|
+
logUserFriendly
|
|
18
|
+
} from "./utils/debugLogger.js";
|
|
19
|
+
import {
|
|
20
|
+
createAssistantMessage,
|
|
21
|
+
createProgressMessage,
|
|
22
|
+
createToolResultStopMessage,
|
|
23
|
+
createUserMessage,
|
|
24
|
+
INTERRUPT_MESSAGE,
|
|
25
|
+
INTERRUPT_MESSAGE_FOR_TOOL_USE,
|
|
26
|
+
normalizeMessagesForAPI
|
|
27
|
+
} from "./utils/messages.js";
|
|
28
|
+
import { BashTool } from "./tools/BashTool/BashTool.js";
|
|
29
|
+
import { getCwd } from "./utils/state.js";
|
|
30
|
+
import { checkAutoCompact } from "./utils/autoCompactCore.js";
|
|
31
|
+
const MAX_TOOL_USE_CONCURRENCY = 10;
|
|
32
|
+
async function queryWithBinaryFeedback(toolUseContext, getAssistantResponse, getBinaryFeedbackResponse) {
|
|
33
|
+
if (process.env.USER_TYPE !== "ant" || !getBinaryFeedbackResponse || !await shouldUseBinaryFeedback()) {
|
|
34
|
+
const assistantMessage = await getAssistantResponse();
|
|
35
|
+
if (toolUseContext.abortController.signal.aborted) {
|
|
36
|
+
return { message: null, shouldSkipPermissionCheck: false };
|
|
37
|
+
}
|
|
38
|
+
return { message: assistantMessage, shouldSkipPermissionCheck: false };
|
|
39
|
+
}
|
|
40
|
+
const [m1, m2] = await Promise.all([
|
|
41
|
+
getAssistantResponse(),
|
|
42
|
+
getAssistantResponse()
|
|
43
|
+
]);
|
|
44
|
+
if (toolUseContext.abortController.signal.aborted) {
|
|
45
|
+
return { message: null, shouldSkipPermissionCheck: false };
|
|
46
|
+
}
|
|
47
|
+
if (m2.isApiErrorMessage) {
|
|
48
|
+
return { message: m1, shouldSkipPermissionCheck: false };
|
|
49
|
+
}
|
|
50
|
+
if (m1.isApiErrorMessage) {
|
|
51
|
+
return { message: m2, shouldSkipPermissionCheck: false };
|
|
52
|
+
}
|
|
53
|
+
if (!messagePairValidForBinaryFeedback(m1, m2)) {
|
|
54
|
+
return { message: m1, shouldSkipPermissionCheck: false };
|
|
55
|
+
}
|
|
56
|
+
return await getBinaryFeedbackResponse(m1, m2);
|
|
57
|
+
}
|
|
58
|
+
async function* query(messages, systemPrompt, context, canUseTool, toolUseContext, getBinaryFeedbackResponse) {
|
|
59
|
+
const currentRequest = getCurrentRequest();
|
|
60
|
+
markPhase("QUERY_INIT");
|
|
61
|
+
const { messages: processedMessages, wasCompacted } = await checkAutoCompact(
|
|
62
|
+
messages,
|
|
63
|
+
toolUseContext
|
|
64
|
+
);
|
|
65
|
+
if (wasCompacted) {
|
|
66
|
+
messages = processedMessages;
|
|
67
|
+
}
|
|
68
|
+
markPhase("SYSTEM_PROMPT_BUILD");
|
|
69
|
+
const { systemPrompt: fullSystemPrompt, reminders } = formatSystemPromptWithContext(systemPrompt, context, toolUseContext.agentId);
|
|
70
|
+
emitReminderEvent("session:startup", {
|
|
71
|
+
agentId: toolUseContext.agentId,
|
|
72
|
+
messages: messages.length,
|
|
73
|
+
timestamp: Date.now()
|
|
74
|
+
});
|
|
75
|
+
if (reminders && messages.length > 0) {
|
|
76
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
77
|
+
const msg = messages[i];
|
|
78
|
+
if (msg?.type === "user") {
|
|
79
|
+
const lastUserMessage = msg;
|
|
80
|
+
messages[i] = {
|
|
81
|
+
...lastUserMessage,
|
|
82
|
+
message: {
|
|
83
|
+
...lastUserMessage.message,
|
|
84
|
+
content: typeof lastUserMessage.message.content === "string" ? reminders + lastUserMessage.message.content : [
|
|
85
|
+
...Array.isArray(lastUserMessage.message.content) ? lastUserMessage.message.content : [],
|
|
86
|
+
{ type: "text", text: reminders }
|
|
87
|
+
]
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
markPhase("LLM_PREPARATION");
|
|
95
|
+
function getAssistantResponse() {
|
|
96
|
+
return queryLLM(
|
|
97
|
+
normalizeMessagesForAPI(messages),
|
|
98
|
+
fullSystemPrompt,
|
|
99
|
+
toolUseContext.options.maxThinkingTokens,
|
|
100
|
+
toolUseContext.options.tools,
|
|
101
|
+
toolUseContext.abortController.signal,
|
|
102
|
+
{
|
|
103
|
+
safeMode: toolUseContext.options.safeMode ?? false,
|
|
104
|
+
model: toolUseContext.options.model || "main",
|
|
105
|
+
prependCLISysprompt: true,
|
|
106
|
+
toolUseContext
|
|
107
|
+
}
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
const result = await queryWithBinaryFeedback(
|
|
111
|
+
toolUseContext,
|
|
112
|
+
getAssistantResponse,
|
|
113
|
+
getBinaryFeedbackResponse
|
|
114
|
+
);
|
|
115
|
+
if (toolUseContext.abortController.signal.aborted) {
|
|
116
|
+
yield createAssistantMessage(INTERRUPT_MESSAGE);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (result.message === null) {
|
|
120
|
+
yield createAssistantMessage(INTERRUPT_MESSAGE);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const assistantMessage = result.message;
|
|
124
|
+
const shouldSkipPermissionCheck = result.shouldSkipPermissionCheck;
|
|
125
|
+
yield assistantMessage;
|
|
126
|
+
const toolUseMessages = assistantMessage.message.content.filter(
|
|
127
|
+
(_) => _.type === "tool_use"
|
|
128
|
+
);
|
|
129
|
+
if (!toolUseMessages.length) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const toolResults = [];
|
|
133
|
+
const canRunConcurrently = toolUseMessages.every(
|
|
134
|
+
(msg) => toolUseContext.options.tools.find((t) => t.name === msg.name)?.isReadOnly()
|
|
135
|
+
);
|
|
136
|
+
if (canRunConcurrently) {
|
|
137
|
+
for await (const message of runToolsConcurrently(
|
|
138
|
+
toolUseMessages,
|
|
139
|
+
assistantMessage,
|
|
140
|
+
canUseTool,
|
|
141
|
+
toolUseContext,
|
|
142
|
+
shouldSkipPermissionCheck
|
|
143
|
+
)) {
|
|
144
|
+
yield message;
|
|
145
|
+
if (message.type === "user") {
|
|
146
|
+
toolResults.push(message);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
} else {
|
|
150
|
+
for await (const message of runToolsSerially(
|
|
151
|
+
toolUseMessages,
|
|
152
|
+
assistantMessage,
|
|
153
|
+
canUseTool,
|
|
154
|
+
toolUseContext,
|
|
155
|
+
shouldSkipPermissionCheck
|
|
156
|
+
)) {
|
|
157
|
+
yield message;
|
|
158
|
+
if (message.type === "user") {
|
|
159
|
+
toolResults.push(message);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (toolUseContext.abortController.signal.aborted) {
|
|
164
|
+
yield createAssistantMessage(INTERRUPT_MESSAGE_FOR_TOOL_USE);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const orderedToolResults = toolResults.sort((a, b) => {
|
|
168
|
+
const aIndex = toolUseMessages.findIndex(
|
|
169
|
+
(tu) => tu.id === a.message.content[0].id
|
|
170
|
+
);
|
|
171
|
+
const bIndex = toolUseMessages.findIndex(
|
|
172
|
+
(tu) => tu.id === b.message.content[0].id
|
|
173
|
+
);
|
|
174
|
+
return aIndex - bIndex;
|
|
175
|
+
});
|
|
176
|
+
try {
|
|
177
|
+
yield* await query(
|
|
178
|
+
[...messages, assistantMessage, ...orderedToolResults],
|
|
179
|
+
systemPrompt,
|
|
180
|
+
context,
|
|
181
|
+
canUseTool,
|
|
182
|
+
toolUseContext,
|
|
183
|
+
getBinaryFeedbackResponse
|
|
184
|
+
);
|
|
185
|
+
} catch (error) {
|
|
186
|
+
throw error;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
async function* runToolsConcurrently(toolUseMessages, assistantMessage, canUseTool, toolUseContext, shouldSkipPermissionCheck) {
|
|
190
|
+
yield* all(
|
|
191
|
+
toolUseMessages.map(
|
|
192
|
+
(toolUse) => runToolUse(
|
|
193
|
+
toolUse,
|
|
194
|
+
new Set(toolUseMessages.map((_) => _.id)),
|
|
195
|
+
assistantMessage,
|
|
196
|
+
canUseTool,
|
|
197
|
+
toolUseContext,
|
|
198
|
+
shouldSkipPermissionCheck
|
|
199
|
+
)
|
|
200
|
+
),
|
|
201
|
+
MAX_TOOL_USE_CONCURRENCY
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
async function* runToolsSerially(toolUseMessages, assistantMessage, canUseTool, toolUseContext, shouldSkipPermissionCheck) {
|
|
205
|
+
for (const toolUse of toolUseMessages) {
|
|
206
|
+
yield* runToolUse(
|
|
207
|
+
toolUse,
|
|
208
|
+
new Set(toolUseMessages.map((_) => _.id)),
|
|
209
|
+
assistantMessage,
|
|
210
|
+
canUseTool,
|
|
211
|
+
toolUseContext,
|
|
212
|
+
shouldSkipPermissionCheck
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
async function* runToolUse(toolUse, siblingToolUseIDs, assistantMessage, canUseTool, toolUseContext, shouldSkipPermissionCheck) {
|
|
217
|
+
const currentRequest = getCurrentRequest();
|
|
218
|
+
debugLogger.flow("TOOL_USE_START", {
|
|
219
|
+
toolName: toolUse.name,
|
|
220
|
+
toolUseID: toolUse.id,
|
|
221
|
+
inputSize: JSON.stringify(toolUse.input).length,
|
|
222
|
+
siblingToolCount: siblingToolUseIDs.size,
|
|
223
|
+
shouldSkipPermissionCheck: !!shouldSkipPermissionCheck,
|
|
224
|
+
requestId: currentRequest?.id
|
|
225
|
+
});
|
|
226
|
+
logUserFriendly(
|
|
227
|
+
"TOOL_EXECUTION",
|
|
228
|
+
{
|
|
229
|
+
toolName: toolUse.name,
|
|
230
|
+
action: "Starting",
|
|
231
|
+
target: toolUse.input ? Object.keys(toolUse.input).join(", ") : ""
|
|
232
|
+
},
|
|
233
|
+
currentRequest?.id
|
|
234
|
+
);
|
|
235
|
+
logEvent("tengu_tool_use_start", {
|
|
236
|
+
toolName: toolUse.name,
|
|
237
|
+
toolUseID: toolUse.id
|
|
238
|
+
});
|
|
239
|
+
const toolName = toolUse.name;
|
|
240
|
+
const tool = toolUseContext.options.tools.find((t) => t.name === toolName);
|
|
241
|
+
if (!tool) {
|
|
242
|
+
debugLogger.error("TOOL_NOT_FOUND", {
|
|
243
|
+
requestedTool: toolName,
|
|
244
|
+
availableTools: toolUseContext.options.tools.map((t) => t.name),
|
|
245
|
+
toolUseID: toolUse.id,
|
|
246
|
+
requestId: currentRequest?.id
|
|
247
|
+
});
|
|
248
|
+
logEvent("tengu_tool_use_error", {
|
|
249
|
+
error: `No such tool available: ${toolName}`,
|
|
250
|
+
messageID: assistantMessage.message.id,
|
|
251
|
+
toolName,
|
|
252
|
+
toolUseID: toolUse.id
|
|
253
|
+
});
|
|
254
|
+
yield createUserMessage([
|
|
255
|
+
{
|
|
256
|
+
type: "tool_result",
|
|
257
|
+
content: `Error: No such tool available: ${toolName}`,
|
|
258
|
+
is_error: true,
|
|
259
|
+
tool_use_id: toolUse.id
|
|
260
|
+
}
|
|
261
|
+
]);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
const toolInput = toolUse.input;
|
|
265
|
+
debugLogger.flow("TOOL_VALIDATION_START", {
|
|
266
|
+
toolName: tool.name,
|
|
267
|
+
toolUseID: toolUse.id,
|
|
268
|
+
inputKeys: Object.keys(toolInput),
|
|
269
|
+
requestId: currentRequest?.id
|
|
270
|
+
});
|
|
271
|
+
try {
|
|
272
|
+
if (toolUseContext.abortController.signal.aborted) {
|
|
273
|
+
debugLogger.flow("TOOL_USE_CANCELLED_BEFORE_START", {
|
|
274
|
+
toolName: tool.name,
|
|
275
|
+
toolUseID: toolUse.id,
|
|
276
|
+
abortReason: "AbortController signal",
|
|
277
|
+
requestId: currentRequest?.id
|
|
278
|
+
});
|
|
279
|
+
logEvent("tengu_tool_use_cancelled", {
|
|
280
|
+
toolName: tool.name,
|
|
281
|
+
toolUseID: toolUse.id
|
|
282
|
+
});
|
|
283
|
+
const message = createUserMessage([
|
|
284
|
+
createToolResultStopMessage(toolUse.id)
|
|
285
|
+
]);
|
|
286
|
+
yield message;
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
let hasProgressMessages = false;
|
|
290
|
+
for await (const message of checkPermissionsAndCallTool(
|
|
291
|
+
tool,
|
|
292
|
+
toolUse.id,
|
|
293
|
+
siblingToolUseIDs,
|
|
294
|
+
toolInput,
|
|
295
|
+
toolUseContext,
|
|
296
|
+
canUseTool,
|
|
297
|
+
assistantMessage,
|
|
298
|
+
shouldSkipPermissionCheck
|
|
299
|
+
)) {
|
|
300
|
+
if (toolUseContext.abortController.signal.aborted) {
|
|
301
|
+
debugLogger.flow("TOOL_USE_CANCELLED_DURING_EXECUTION", {
|
|
302
|
+
toolName: tool.name,
|
|
303
|
+
toolUseID: toolUse.id,
|
|
304
|
+
hasProgressMessages,
|
|
305
|
+
abortReason: "AbortController signal during execution",
|
|
306
|
+
requestId: currentRequest?.id
|
|
307
|
+
});
|
|
308
|
+
if (hasProgressMessages && message.type === "progress") {
|
|
309
|
+
yield message;
|
|
310
|
+
}
|
|
311
|
+
const cancelMessage = createUserMessage([
|
|
312
|
+
createToolResultStopMessage(toolUse.id)
|
|
313
|
+
]);
|
|
314
|
+
yield cancelMessage;
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
if (message.type === "progress") {
|
|
318
|
+
hasProgressMessages = true;
|
|
319
|
+
}
|
|
320
|
+
yield message;
|
|
321
|
+
}
|
|
322
|
+
} catch (e) {
|
|
323
|
+
logError(e);
|
|
324
|
+
const errorMessage = createUserMessage([
|
|
325
|
+
{
|
|
326
|
+
type: "tool_result",
|
|
327
|
+
content: `Tool execution failed: ${e instanceof Error ? e.message : String(e)}`,
|
|
328
|
+
is_error: true,
|
|
329
|
+
tool_use_id: toolUse.id
|
|
330
|
+
}
|
|
331
|
+
]);
|
|
332
|
+
yield errorMessage;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
function normalizeToolInput(tool, input) {
|
|
336
|
+
switch (tool) {
|
|
337
|
+
case BashTool: {
|
|
338
|
+
const { command, timeout } = BashTool.inputSchema.parse(input);
|
|
339
|
+
return {
|
|
340
|
+
command: command.replace(`cd ${getCwd()} && `, ""),
|
|
341
|
+
...timeout ? { timeout } : {}
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
default:
|
|
345
|
+
return input;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
async function* checkPermissionsAndCallTool(tool, toolUseID, siblingToolUseIDs, input, context, canUseTool, assistantMessage, shouldSkipPermissionCheck) {
|
|
349
|
+
const isValidInput = tool.inputSchema.safeParse(input);
|
|
350
|
+
if (!isValidInput.success) {
|
|
351
|
+
let errorMessage = `InputValidationError: ${isValidInput.error.message}`;
|
|
352
|
+
if (tool.name === "View" && Object.keys(input).length === 0) {
|
|
353
|
+
errorMessage = `Error: The View tool requires a 'file_path' parameter to specify which file to read. Please provide the absolute path to the file you want to view. For example: {"file_path": "/path/to/file.txt"}`;
|
|
354
|
+
}
|
|
355
|
+
logEvent("tengu_tool_use_error", {
|
|
356
|
+
error: errorMessage,
|
|
357
|
+
messageID: assistantMessage.message.id,
|
|
358
|
+
toolName: tool.name,
|
|
359
|
+
toolInput: JSON.stringify(input).slice(0, 200)
|
|
360
|
+
});
|
|
361
|
+
yield createUserMessage([
|
|
362
|
+
{
|
|
363
|
+
type: "tool_result",
|
|
364
|
+
content: errorMessage,
|
|
365
|
+
is_error: true,
|
|
366
|
+
tool_use_id: toolUseID
|
|
367
|
+
}
|
|
368
|
+
]);
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
const normalizedInput = normalizeToolInput(tool, input);
|
|
372
|
+
const isValidCall = await tool.validateInput?.(
|
|
373
|
+
normalizedInput,
|
|
374
|
+
context
|
|
375
|
+
);
|
|
376
|
+
if (isValidCall?.result === false) {
|
|
377
|
+
logEvent("tengu_tool_use_error", {
|
|
378
|
+
error: isValidCall?.message.slice(0, 2e3),
|
|
379
|
+
messageID: assistantMessage.message.id,
|
|
380
|
+
toolName: tool.name,
|
|
381
|
+
toolInput: JSON.stringify(input).slice(0, 200),
|
|
382
|
+
...isValidCall?.meta ?? {}
|
|
383
|
+
});
|
|
384
|
+
yield createUserMessage([
|
|
385
|
+
{
|
|
386
|
+
type: "tool_result",
|
|
387
|
+
content: isValidCall.message,
|
|
388
|
+
is_error: true,
|
|
389
|
+
tool_use_id: toolUseID
|
|
390
|
+
}
|
|
391
|
+
]);
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
const permissionResult = shouldSkipPermissionCheck ? { result: true } : await canUseTool(tool, normalizedInput, context, assistantMessage);
|
|
395
|
+
if (permissionResult.result === false) {
|
|
396
|
+
yield createUserMessage([
|
|
397
|
+
{
|
|
398
|
+
type: "tool_result",
|
|
399
|
+
content: permissionResult.message,
|
|
400
|
+
is_error: true,
|
|
401
|
+
tool_use_id: toolUseID
|
|
402
|
+
}
|
|
403
|
+
]);
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
try {
|
|
407
|
+
const generator = tool.call(normalizedInput, context);
|
|
408
|
+
for await (const result of generator) {
|
|
409
|
+
switch (result.type) {
|
|
410
|
+
case "result":
|
|
411
|
+
logEvent("tengu_tool_use_success", {
|
|
412
|
+
messageID: assistantMessage.message.id,
|
|
413
|
+
toolName: tool.name
|
|
414
|
+
});
|
|
415
|
+
yield createUserMessage(
|
|
416
|
+
[
|
|
417
|
+
{
|
|
418
|
+
type: "tool_result",
|
|
419
|
+
content: result.resultForAssistant || String(result.data),
|
|
420
|
+
tool_use_id: toolUseID
|
|
421
|
+
}
|
|
422
|
+
],
|
|
423
|
+
{
|
|
424
|
+
data: result.data,
|
|
425
|
+
resultForAssistant: result.resultForAssistant || String(result.data)
|
|
426
|
+
}
|
|
427
|
+
);
|
|
428
|
+
return;
|
|
429
|
+
case "progress":
|
|
430
|
+
logEvent("tengu_tool_use_progress", {
|
|
431
|
+
messageID: assistantMessage.message.id,
|
|
432
|
+
toolName: tool.name
|
|
433
|
+
});
|
|
434
|
+
yield createProgressMessage(
|
|
435
|
+
toolUseID,
|
|
436
|
+
siblingToolUseIDs,
|
|
437
|
+
result.content,
|
|
438
|
+
result.normalizedMessages || [],
|
|
439
|
+
result.tools || []
|
|
440
|
+
);
|
|
441
|
+
break;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
} catch (error) {
|
|
445
|
+
const content = formatError(error);
|
|
446
|
+
logError(error);
|
|
447
|
+
logEvent("tengu_tool_use_error", {
|
|
448
|
+
error: content.slice(0, 2e3),
|
|
449
|
+
messageID: assistantMessage.message.id,
|
|
450
|
+
toolName: tool.name,
|
|
451
|
+
toolInput: JSON.stringify(input).slice(0, 1e3)
|
|
452
|
+
});
|
|
453
|
+
yield createUserMessage([
|
|
454
|
+
{
|
|
455
|
+
type: "tool_result",
|
|
456
|
+
content,
|
|
457
|
+
is_error: true,
|
|
458
|
+
tool_use_id: toolUseID
|
|
459
|
+
}
|
|
460
|
+
]);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
function formatError(error) {
|
|
464
|
+
if (!(error instanceof Error)) {
|
|
465
|
+
return String(error);
|
|
466
|
+
}
|
|
467
|
+
const parts = [error.message];
|
|
468
|
+
if ("stderr" in error && typeof error.stderr === "string") {
|
|
469
|
+
parts.push(error.stderr);
|
|
470
|
+
}
|
|
471
|
+
if ("stdout" in error && typeof error.stdout === "string") {
|
|
472
|
+
parts.push(error.stdout);
|
|
473
|
+
}
|
|
474
|
+
const fullMessage = parts.filter(Boolean).join("\n");
|
|
475
|
+
if (fullMessage.length <= 1e4) {
|
|
476
|
+
return fullMessage;
|
|
477
|
+
}
|
|
478
|
+
const halfLength = 5e3;
|
|
479
|
+
const start = fullMessage.slice(0, halfLength);
|
|
480
|
+
const end = fullMessage.slice(-halfLength);
|
|
481
|
+
return `${start}
|
|
482
|
+
|
|
483
|
+
... [${fullMessage.length - 1e4} characters truncated] ...
|
|
484
|
+
|
|
485
|
+
${end}`;
|
|
486
|
+
}
|
|
487
|
+
export {
|
|
488
|
+
normalizeToolInput,
|
|
489
|
+
query,
|
|
490
|
+
runToolUse
|
|
491
|
+
};
|
|
492
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/query.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n Message as APIAssistantMessage,\n MessageParam,\n ToolUseBlock,\n} from '@anthropic-ai/sdk/resources/index.mjs'\nimport type { UUID } from './types/common'\nimport type { Tool, ToolUseContext } from './Tool'\nimport {\n messagePairValidForBinaryFeedback,\n shouldUseBinaryFeedback,\n} from './components/binary-feedback/utils.js'\nimport { CanUseToolFn } from './hooks/useCanUseTool'\nimport {\n formatSystemPromptWithContext,\n queryLLM,\n queryModel,\n} from './services/claude.js'\nimport { emitReminderEvent } from './services/systemReminder'\nimport { logEvent } from './services/statsig'\nimport { all } from './utils/generators'\nimport { logError } from './utils/log'\nimport {\n debug as debugLogger,\n markPhase,\n getCurrentRequest,\n logUserFriendly,\n} from './utils/debugLogger'\nimport { getModelManager } from './utils/model.js'\nimport {\n createAssistantMessage,\n createProgressMessage,\n createToolResultStopMessage,\n createUserMessage,\n FullToolUseResult,\n INTERRUPT_MESSAGE,\n INTERRUPT_MESSAGE_FOR_TOOL_USE,\n NormalizedMessage,\n normalizeMessagesForAPI,\n} from './utils/messages.js'\nimport { createToolExecutionController } from './utils/toolExecutionController'\nimport { BashTool } from './tools/BashTool/BashTool'\nimport { getCwd } from './utils/state'\nimport { checkAutoCompact } from './utils/autoCompactCore'\n\n// Extended ToolUseContext for query functions\ninterface ExtendedToolUseContext extends ToolUseContext {\n abortController: AbortController\n options: {\n commands: any[]\n forkNumber: number\n messageLogName: string\n tools: Tool[]\n verbose: boolean\n safeMode: boolean\n maxThinkingTokens: number\n isKodingRequest?: boolean\n model?: string | import('./utils/config').ModelPointerType\n }\n readFileTimestamps: { [filename: string]: number }\n setToolJSX: (jsx: any) => void\n requestId?: string\n}\n\nexport type Response = { costUSD: number; response: string }\nexport type UserMessage = {\n message: MessageParam\n type: 'user'\n uuid: UUID\n toolUseResult?: FullToolUseResult\n options?: {\n isKodingRequest?: boolean\n kodingContext?: string\n isCustomCommand?: boolean\n commandName?: string\n commandArgs?: string\n }\n}\n\nexport type AssistantMessage = {\n costUSD: number\n durationMs: number\n message: APIAssistantMessage\n type: 'assistant'\n uuid: UUID\n isApiErrorMessage?: boolean\n responseId?: string // For GPT-5 Responses API state management\n}\n\nexport type BinaryFeedbackResult =\n | { message: AssistantMessage | null; shouldSkipPermissionCheck: false }\n | { message: AssistantMessage; shouldSkipPermissionCheck: true }\n\nexport type ProgressMessage = {\n content: AssistantMessage\n normalizedMessages: NormalizedMessage[]\n siblingToolUseIDs: Set<string>\n tools: Tool[]\n toolUseID: string\n type: 'progress'\n uuid: UUID\n}\n\n// Each array item is either a single message or a message-and-response pair\nexport type Message = UserMessage | AssistantMessage | ProgressMessage\n\nconst MAX_TOOL_USE_CONCURRENCY = 10\n\n// Returns a message if we got one, or `null` if the user cancelled\nasync function queryWithBinaryFeedback(\n toolUseContext: ExtendedToolUseContext,\n getAssistantResponse: () => Promise<AssistantMessage>,\n getBinaryFeedbackResponse?: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>,\n): Promise<BinaryFeedbackResult> {\n if (\n process.env.USER_TYPE !== 'ant' ||\n !getBinaryFeedbackResponse ||\n !(await shouldUseBinaryFeedback())\n ) {\n const assistantMessage = await getAssistantResponse()\n if (toolUseContext.abortController.signal.aborted) {\n return { message: null, shouldSkipPermissionCheck: false }\n }\n return { message: assistantMessage, shouldSkipPermissionCheck: false }\n }\n const [m1, m2] = await Promise.all([\n getAssistantResponse(),\n getAssistantResponse(),\n ])\n if (toolUseContext.abortController.signal.aborted) {\n return { message: null, shouldSkipPermissionCheck: false }\n }\n if (m2.isApiErrorMessage) {\n // If m2 is an error, we might as well return m1, even if it's also an error --\n // the UI will display it as an error as it would in the non-feedback path.\n return { message: m1, shouldSkipPermissionCheck: false }\n }\n if (m1.isApiErrorMessage) {\n return { message: m2, shouldSkipPermissionCheck: false }\n }\n if (!messagePairValidForBinaryFeedback(m1, m2)) {\n return { message: m1, shouldSkipPermissionCheck: false }\n }\n return await getBinaryFeedbackResponse(m1, m2)\n}\n\n/**\n * The rules of thinking are lengthy and fortuitous. They require plenty of thinking\n * of most long duration and deep meditation for a wizard to wrap one's noggin around.\n *\n * The rules follow:\n * 1. A message that contains a thinking or redacted_thinking block must be part of a query whose max_thinking_length > 0\n * 2. A thinking block may not be the last message in a block\n * 3. Thinking blocks must be preserved for the duration of an assistant trajectory (a single turn, or if that turn includes a tool_use block then also its subsequent tool_result and the following assistant message)\n *\n * Heed these rules well, young wizard. For they are the rules of thinking, and\n * the rules of thinking are the rules of the universe. If ye does not heed these\n * rules, ye will be punished with an entire day of debugging and hair pulling.\n */\nexport async function* query(\n messages: Message[],\n systemPrompt: string[],\n context: { [k: string]: string },\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n getBinaryFeedbackResponse?: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>,\n): AsyncGenerator<Message, void> {\n const currentRequest = getCurrentRequest()\n\n markPhase('QUERY_INIT')\n\n // Auto-compact check\n const { messages: processedMessages, wasCompacted } = await checkAutoCompact(\n messages,\n toolUseContext,\n )\n if (wasCompacted) {\n messages = processedMessages\n }\n\n markPhase('SYSTEM_PROMPT_BUILD')\n \n const { systemPrompt: fullSystemPrompt, reminders } =\n formatSystemPromptWithContext(systemPrompt, context, toolUseContext.agentId)\n\n // Emit session startup event\n emitReminderEvent('session:startup', {\n agentId: toolUseContext.agentId,\n messages: messages.length,\n timestamp: Date.now(),\n })\n\n // Inject reminders into the latest user message\n if (reminders && messages.length > 0) {\n // Find the last user message\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i]\n if (msg?.type === 'user') {\n const lastUserMessage = msg as UserMessage\n messages[i] = {\n ...lastUserMessage,\n message: {\n ...lastUserMessage.message,\n content:\n typeof lastUserMessage.message.content === 'string'\n ? reminders + lastUserMessage.message.content\n : [\n ...(Array.isArray(lastUserMessage.message.content)\n ? lastUserMessage.message.content\n : []),\n { type: 'text', text: reminders },\n ],\n },\n }\n break\n }\n }\n }\n\n markPhase('LLM_PREPARATION')\n\n function getAssistantResponse() {\n return queryLLM(\n normalizeMessagesForAPI(messages),\n fullSystemPrompt,\n toolUseContext.options.maxThinkingTokens,\n toolUseContext.options.tools,\n toolUseContext.abortController.signal,\n {\n safeMode: toolUseContext.options.safeMode ?? false,\n model: toolUseContext.options.model || 'main',\n prependCLISysprompt: true,\n toolUseContext: toolUseContext,\n },\n )\n }\n\n const result = await queryWithBinaryFeedback(\n toolUseContext,\n getAssistantResponse,\n getBinaryFeedbackResponse,\n )\n\n // If request was cancelled, return immediately with interrupt message \n if (toolUseContext.abortController.signal.aborted) {\n yield createAssistantMessage(INTERRUPT_MESSAGE)\n return\n }\n\n if (result.message === null) {\n yield createAssistantMessage(INTERRUPT_MESSAGE)\n return\n }\n\n const assistantMessage = result.message\n const shouldSkipPermissionCheck = result.shouldSkipPermissionCheck\n\n yield assistantMessage\n\n // @see https://docs.anthropic.com/en/docs/build-with-claude/tool-use\n // Note: stop_reason === 'tool_use' is unreliable -- it's not always set correctly\n const toolUseMessages = assistantMessage.message.content.filter(\n _ => _.type === 'tool_use',\n )\n\n // If there's no more tool use, we're done\n if (!toolUseMessages.length) {\n return\n }\n\n const toolResults: UserMessage[] = []\n \n // Simple concurrency check like original system\n const canRunConcurrently = toolUseMessages.every(msg =>\n toolUseContext.options.tools.find(t => t.name === msg.name)?.isReadOnly(),\n )\n\n if (canRunConcurrently) {\n for await (const message of runToolsConcurrently(\n toolUseMessages,\n assistantMessage,\n canUseTool,\n toolUseContext,\n shouldSkipPermissionCheck,\n )) {\n yield message\n // progress messages are not sent to the server, so don't need to be accumulated for the next turn\n if (message.type === 'user') {\n toolResults.push(message)\n }\n }\n } else {\n for await (const message of runToolsSerially(\n toolUseMessages,\n assistantMessage,\n canUseTool,\n toolUseContext,\n shouldSkipPermissionCheck,\n )) {\n yield message\n // progress messages are not sent to the server, so don't need to be accumulated for the next turn\n if (message.type === 'user') {\n toolResults.push(message)\n }\n }\n }\n\n if (toolUseContext.abortController.signal.aborted) {\n yield createAssistantMessage(INTERRUPT_MESSAGE_FOR_TOOL_USE)\n return\n }\n\n // Sort toolResults to match the order of toolUseMessages\n const orderedToolResults = toolResults.sort((a, b) => {\n const aIndex = toolUseMessages.findIndex(\n tu => tu.id === (a.message.content[0] as ToolUseBlock).id,\n )\n const bIndex = toolUseMessages.findIndex(\n tu => tu.id === (b.message.content[0] as ToolUseBlock).id,\n )\n return aIndex - bIndex\n })\n\n // Recursive query\n\n try {\n yield* await query(\n [...messages, assistantMessage, ...orderedToolResults],\n systemPrompt,\n context,\n canUseTool,\n toolUseContext,\n getBinaryFeedbackResponse,\n )\n } catch (error) {\n // Re-throw the error to maintain the original behavior\n throw error\n }\n}\n\nasync function* runToolsConcurrently(\n toolUseMessages: ToolUseBlock[],\n assistantMessage: AssistantMessage,\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<Message, void> {\n yield* all(\n toolUseMessages.map(toolUse =>\n runToolUse(\n toolUse,\n new Set(toolUseMessages.map(_ => _.id)),\n assistantMessage,\n canUseTool,\n toolUseContext,\n shouldSkipPermissionCheck,\n ),\n ),\n MAX_TOOL_USE_CONCURRENCY,\n )\n}\n\nasync function* runToolsSerially(\n toolUseMessages: ToolUseBlock[],\n assistantMessage: AssistantMessage,\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<Message, void> {\n for (const toolUse of toolUseMessages) {\n yield* runToolUse(\n toolUse,\n new Set(toolUseMessages.map(_ => _.id)),\n assistantMessage,\n canUseTool,\n toolUseContext,\n shouldSkipPermissionCheck,\n )\n }\n}\n\nexport async function* runToolUse(\n toolUse: ToolUseBlock,\n siblingToolUseIDs: Set<string>,\n assistantMessage: AssistantMessage,\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<Message, void> {\n const currentRequest = getCurrentRequest()\n\n // \uD83D\uDD0D Debug: \u5DE5\u5177\u8C03\u7528\u5F00\u59CB\n debugLogger.flow('TOOL_USE_START', {\n toolName: toolUse.name,\n toolUseID: toolUse.id,\n inputSize: JSON.stringify(toolUse.input).length,\n siblingToolCount: siblingToolUseIDs.size,\n shouldSkipPermissionCheck: !!shouldSkipPermissionCheck,\n requestId: currentRequest?.id,\n })\n\n logUserFriendly(\n 'TOOL_EXECUTION',\n {\n toolName: toolUse.name,\n action: 'Starting',\n target: toolUse.input ? Object.keys(toolUse.input).join(', ') : '',\n },\n currentRequest?.id,\n )\n\n\n logEvent('tengu_tool_use_start', {\n toolName: toolUse.name,\n toolUseID: toolUse.id,\n })\n\n const toolName = toolUse.name\n const tool = toolUseContext.options.tools.find(t => t.name === toolName)\n\n // Check if the tool exists\n if (!tool) {\n debugLogger.error('TOOL_NOT_FOUND', {\n requestedTool: toolName,\n availableTools: toolUseContext.options.tools.map(t => t.name),\n toolUseID: toolUse.id,\n requestId: currentRequest?.id,\n })\n\n logEvent('tengu_tool_use_error', {\n error: `No such tool available: ${toolName}`,\n messageID: assistantMessage.message.id,\n toolName,\n toolUseID: toolUse.id,\n })\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content: `Error: No such tool available: ${toolName}`,\n is_error: true,\n tool_use_id: toolUse.id,\n },\n ])\n return\n }\n\n const toolInput = toolUse.input as { [key: string]: string }\n\n debugLogger.flow('TOOL_VALIDATION_START', {\n toolName: tool.name,\n toolUseID: toolUse.id,\n inputKeys: Object.keys(toolInput),\n requestId: currentRequest?.id,\n })\n\n try {\n // \uD83D\uDD27 Check for cancellation before starting tool execution\n if (toolUseContext.abortController.signal.aborted) {\n debugLogger.flow('TOOL_USE_CANCELLED_BEFORE_START', {\n toolName: tool.name,\n toolUseID: toolUse.id,\n abortReason: 'AbortController signal',\n requestId: currentRequest?.id,\n })\n\n logEvent('tengu_tool_use_cancelled', {\n toolName: tool.name,\n toolUseID: toolUse.id,\n })\n\n const message = createUserMessage([\n createToolResultStopMessage(toolUse.id),\n ])\n yield message\n return\n }\n\n // Track if any progress messages were yielded\n let hasProgressMessages = false\n \n for await (const message of checkPermissionsAndCallTool(\n tool,\n toolUse.id,\n siblingToolUseIDs,\n toolInput,\n toolUseContext,\n canUseTool,\n assistantMessage,\n shouldSkipPermissionCheck,\n )) {\n // \uD83D\uDD27 Check for cancellation during tool execution\n if (toolUseContext.abortController.signal.aborted) {\n debugLogger.flow('TOOL_USE_CANCELLED_DURING_EXECUTION', {\n toolName: tool.name,\n toolUseID: toolUse.id,\n hasProgressMessages,\n abortReason: 'AbortController signal during execution',\n requestId: currentRequest?.id,\n })\n\n // If we yielded progress messages but got cancelled, yield a cancellation result\n if (hasProgressMessages && message.type === 'progress') {\n yield message // yield the last progress message first\n }\n \n // Always yield a tool result message for cancellation to clear UI state\n const cancelMessage = createUserMessage([\n createToolResultStopMessage(toolUse.id),\n ])\n yield cancelMessage\n return\n }\n\n if (message.type === 'progress') {\n hasProgressMessages = true\n }\n \n yield message\n }\n } catch (e) {\n logError(e)\n \n // \uD83D\uDD27 Even on error, ensure we yield a tool result to clear UI state\n const errorMessage = createUserMessage([\n {\n type: 'tool_result',\n content: `Tool execution failed: ${e instanceof Error ? e.message : String(e)}`,\n is_error: true,\n tool_use_id: toolUse.id,\n },\n ])\n yield errorMessage\n }\n}\n\n// TODO: Generalize this to all tools\nexport function normalizeToolInput(\n tool: Tool,\n input: { [key: string]: boolean | string | number },\n): { [key: string]: boolean | string | number } {\n switch (tool) {\n case BashTool: {\n const { command, timeout } = BashTool.inputSchema.parse(input) // already validated upstream, won't throw\n return {\n command: command.replace(`cd ${getCwd()} && `, ''),\n ...(timeout ? { timeout } : {}),\n }\n }\n default:\n return input\n }\n}\n\nasync function* checkPermissionsAndCallTool(\n tool: Tool,\n toolUseID: string,\n siblingToolUseIDs: Set<string>,\n input: { [key: string]: boolean | string | number },\n context: ToolUseContext,\n canUseTool: CanUseToolFn,\n assistantMessage: AssistantMessage,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<UserMessage | ProgressMessage, void> {\n // Validate input types with zod\n // (surprisingly, the model is not great at generating valid input)\n const isValidInput = tool.inputSchema.safeParse(input)\n if (!isValidInput.success) {\n // Create a more helpful error message for common cases\n let errorMessage = `InputValidationError: ${isValidInput.error.message}`\n \n // Special handling for the \"View\" tool (FileReadTool) being called with empty parameters\n if (tool.name === 'View' && Object.keys(input).length === 0) {\n errorMessage = `Error: The View tool requires a 'file_path' parameter to specify which file to read. Please provide the absolute path to the file you want to view. For example: {\"file_path\": \"/path/to/file.txt\"}`\n }\n \n logEvent('tengu_tool_use_error', {\n error: errorMessage,\n messageID: assistantMessage.message.id,\n toolName: tool.name,\n toolInput: JSON.stringify(input).slice(0, 200),\n })\n yield createUserMessage([\n {\n type: 'tool_result',\n content: errorMessage,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n const normalizedInput = normalizeToolInput(tool, input)\n\n // Validate input values. Each tool has its own validation logic\n const isValidCall = await tool.validateInput?.(\n normalizedInput as never,\n context,\n )\n if (isValidCall?.result === false) {\n logEvent('tengu_tool_use_error', {\n error: isValidCall?.message.slice(0, 2000),\n messageID: assistantMessage.message.id,\n toolName: tool.name,\n toolInput: JSON.stringify(input).slice(0, 200),\n ...(isValidCall?.meta ?? {}),\n })\n yield createUserMessage([\n {\n type: 'tool_result',\n content: isValidCall!.message,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n // Check whether we have permission to use the tool,\n // and ask the user for permission if we don't\n const permissionResult = shouldSkipPermissionCheck\n ? ({ result: true } as const)\n : await canUseTool(tool, normalizedInput, context, assistantMessage)\n if (permissionResult.result === false) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: permissionResult.message,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n // Call the tool\n try {\n const generator = tool.call(normalizedInput as never, context)\n for await (const result of generator) {\n switch (result.type) {\n case 'result':\n logEvent('tengu_tool_use_success', {\n messageID: assistantMessage.message.id,\n toolName: tool.name,\n })\n yield createUserMessage(\n [\n {\n type: 'tool_result',\n content: result.resultForAssistant || String(result.data),\n tool_use_id: toolUseID,\n },\n ],\n {\n data: result.data,\n resultForAssistant: result.resultForAssistant || String(result.data),\n },\n )\n return\n case 'progress':\n logEvent('tengu_tool_use_progress', {\n messageID: assistantMessage.message.id,\n toolName: tool.name,\n })\n yield createProgressMessage(\n toolUseID,\n siblingToolUseIDs,\n result.content,\n result.normalizedMessages || [],\n result.tools || [],\n )\n break\n }\n }\n } catch (error) {\n const content = formatError(error)\n logError(error)\n logEvent('tengu_tool_use_error', {\n error: content.slice(0, 2000),\n messageID: assistantMessage.message.id,\n toolName: tool.name,\n toolInput: JSON.stringify(input).slice(0, 1000),\n })\n yield createUserMessage([\n {\n type: 'tool_result',\n content,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n }\n}\n\nfunction formatError(error: unknown): string {\n if (!(error instanceof Error)) {\n return String(error)\n }\n const parts = [error.message]\n if ('stderr' in error && typeof error.stderr === 'string') {\n parts.push(error.stderr)\n }\n if ('stdout' in error && typeof error.stdout === 'string') {\n parts.push(error.stdout)\n }\n const fullMessage = parts.filter(Boolean).join('\\n')\n if (fullMessage.length <= 10000) {\n return fullMessage\n }\n const halfLength = 5000\n const start = fullMessage.slice(0, halfLength)\n const end = fullMessage.slice(-halfLength)\n return `${start}\\n\\n... [${fullMessage.length - 10000} characters truncated] ...\\n\\n${end}`\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|