@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,282 @@
|
|
|
1
|
+
import {
|
|
2
|
+
readFileSync,
|
|
3
|
+
writeFileSync,
|
|
4
|
+
openSync,
|
|
5
|
+
readSync,
|
|
6
|
+
closeSync,
|
|
7
|
+
existsSync,
|
|
8
|
+
readdirSync
|
|
9
|
+
} from "fs";
|
|
10
|
+
import { logError } from "./log.js";
|
|
11
|
+
import {
|
|
12
|
+
isAbsolute,
|
|
13
|
+
normalize,
|
|
14
|
+
resolve,
|
|
15
|
+
resolve as resolvePath,
|
|
16
|
+
relative,
|
|
17
|
+
sep,
|
|
18
|
+
basename,
|
|
19
|
+
dirname,
|
|
20
|
+
extname,
|
|
21
|
+
join
|
|
22
|
+
} from "path";
|
|
23
|
+
import { glob as globLib } from "glob";
|
|
24
|
+
import { cwd } from "process";
|
|
25
|
+
import { listAllContentFiles } from "./ripgrep.js";
|
|
26
|
+
import { LRUCache } from "lru-cache";
|
|
27
|
+
import { getCwd } from "./state.js";
|
|
28
|
+
async function glob(filePattern, cwd2, { limit, offset }, abortSignal) {
|
|
29
|
+
const paths = await globLib([filePattern], {
|
|
30
|
+
cwd: cwd2,
|
|
31
|
+
nocase: true,
|
|
32
|
+
nodir: true,
|
|
33
|
+
signal: abortSignal,
|
|
34
|
+
stat: true,
|
|
35
|
+
withFileTypes: true
|
|
36
|
+
});
|
|
37
|
+
const sortedPaths = paths.sort((a, b) => (a.mtimeMs ?? 0) - (b.mtimeMs ?? 0));
|
|
38
|
+
const truncated = sortedPaths.length > offset + limit;
|
|
39
|
+
return {
|
|
40
|
+
files: sortedPaths.slice(offset, offset + limit).map((path) => path.fullpath()),
|
|
41
|
+
truncated
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function readFileSafe(filepath) {
|
|
45
|
+
try {
|
|
46
|
+
return readFileSync(filepath, "utf-8");
|
|
47
|
+
} catch (error) {
|
|
48
|
+
logError(error);
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function isInDirectory(relativePath, relativeCwd) {
|
|
53
|
+
if (relativePath === ".") {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
if (relativePath.startsWith("~")) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
if (relativePath.includes("\0") || relativeCwd.includes("\0")) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
let normalizedPath = normalize(relativePath);
|
|
63
|
+
let normalizedCwd = normalize(relativeCwd);
|
|
64
|
+
normalizedPath = normalizedPath.endsWith(sep) ? normalizedPath : normalizedPath + sep;
|
|
65
|
+
normalizedCwd = normalizedCwd.endsWith(sep) ? normalizedCwd : normalizedCwd + sep;
|
|
66
|
+
const fullPath = resolvePath(cwd(), normalizedCwd, normalizedPath);
|
|
67
|
+
const fullCwd = resolvePath(cwd(), normalizedCwd);
|
|
68
|
+
const rel = relative(fullCwd, fullPath);
|
|
69
|
+
if (!rel || rel === "") return true;
|
|
70
|
+
if (rel.startsWith("..")) return false;
|
|
71
|
+
if (isAbsolute(rel)) return false;
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
function readTextContent(filePath, offset = 0, maxLines) {
|
|
75
|
+
const enc = detectFileEncoding(filePath);
|
|
76
|
+
const content = readFileSync(filePath, enc);
|
|
77
|
+
const lines = content.split(/\r?\n/);
|
|
78
|
+
const toReturn = maxLines !== void 0 && lines.length - offset > maxLines ? lines.slice(offset, offset + maxLines) : lines.slice(offset);
|
|
79
|
+
return {
|
|
80
|
+
content: toReturn.join("\n"),
|
|
81
|
+
// TODO: This probably won't work for Windows
|
|
82
|
+
lineCount: toReturn.length,
|
|
83
|
+
totalLines: lines.length
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function writeTextContent(filePath, content, encoding, endings) {
|
|
87
|
+
let toWrite = content;
|
|
88
|
+
if (endings === "CRLF") {
|
|
89
|
+
toWrite = content.split("\n").join("\r\n");
|
|
90
|
+
}
|
|
91
|
+
writeFileSync(filePath, toWrite, { encoding, flush: true });
|
|
92
|
+
}
|
|
93
|
+
const repoEndingCache = new LRUCache({
|
|
94
|
+
fetchMethod: (path) => detectRepoLineEndingsDirect(path),
|
|
95
|
+
ttl: 5 * 60 * 1e3,
|
|
96
|
+
ttlAutopurge: false,
|
|
97
|
+
max: 1e3
|
|
98
|
+
});
|
|
99
|
+
async function detectRepoLineEndings(filePath) {
|
|
100
|
+
return repoEndingCache.fetch(resolve(filePath));
|
|
101
|
+
}
|
|
102
|
+
async function detectRepoLineEndingsDirect(cwd2) {
|
|
103
|
+
const abortController = new AbortController();
|
|
104
|
+
setTimeout(() => {
|
|
105
|
+
abortController.abort();
|
|
106
|
+
}, 1e3);
|
|
107
|
+
const allFiles = await listAllContentFiles(cwd2, abortController.signal, 15);
|
|
108
|
+
let crlfCount = 0;
|
|
109
|
+
for (const file of allFiles) {
|
|
110
|
+
const lineEnding = detectLineEndings(file);
|
|
111
|
+
if (lineEnding === "CRLF") {
|
|
112
|
+
crlfCount++;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return crlfCount > 3 ? "CRLF" : "LF";
|
|
116
|
+
}
|
|
117
|
+
function fetch(cache, key, value) {
|
|
118
|
+
if (cache.has(key)) {
|
|
119
|
+
return cache.get(key);
|
|
120
|
+
}
|
|
121
|
+
const v = value();
|
|
122
|
+
cache.set(key, v);
|
|
123
|
+
return v;
|
|
124
|
+
}
|
|
125
|
+
const fileEncodingCache = new LRUCache({
|
|
126
|
+
fetchMethod: (path) => detectFileEncodingDirect(path),
|
|
127
|
+
ttl: 5 * 60 * 1e3,
|
|
128
|
+
ttlAutopurge: false,
|
|
129
|
+
max: 1e3
|
|
130
|
+
});
|
|
131
|
+
function detectFileEncoding(filePath) {
|
|
132
|
+
const k = resolve(filePath);
|
|
133
|
+
return fetch(fileEncodingCache, k, () => detectFileEncodingDirect(k));
|
|
134
|
+
}
|
|
135
|
+
function detectFileEncodingDirect(filePath) {
|
|
136
|
+
const BUFFER_SIZE = 4096;
|
|
137
|
+
const buffer = Buffer.alloc(BUFFER_SIZE);
|
|
138
|
+
let fd = void 0;
|
|
139
|
+
try {
|
|
140
|
+
fd = openSync(filePath, "r");
|
|
141
|
+
const bytesRead = readSync(fd, buffer, 0, BUFFER_SIZE, 0);
|
|
142
|
+
if (bytesRead >= 2) {
|
|
143
|
+
if (buffer[0] === 255 && buffer[1] === 254) return "utf16le";
|
|
144
|
+
}
|
|
145
|
+
if (bytesRead >= 3 && buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191) {
|
|
146
|
+
return "utf8";
|
|
147
|
+
}
|
|
148
|
+
const isUtf8 = buffer.slice(0, bytesRead).toString("utf8").length > 0;
|
|
149
|
+
return isUtf8 ? "utf8" : "ascii";
|
|
150
|
+
} catch (error) {
|
|
151
|
+
logError(`Error detecting encoding for file ${filePath}: ${error}`);
|
|
152
|
+
return "utf8";
|
|
153
|
+
} finally {
|
|
154
|
+
if (fd) closeSync(fd);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
const lineEndingCache = new LRUCache({
|
|
158
|
+
fetchMethod: (path) => detectLineEndingsDirect(path),
|
|
159
|
+
ttl: 5 * 60 * 1e3,
|
|
160
|
+
ttlAutopurge: false,
|
|
161
|
+
max: 1e3
|
|
162
|
+
});
|
|
163
|
+
function detectLineEndings(filePath) {
|
|
164
|
+
const k = resolve(filePath);
|
|
165
|
+
return fetch(lineEndingCache, k, () => detectLineEndingsDirect(k));
|
|
166
|
+
}
|
|
167
|
+
function detectLineEndingsDirect(filePath, encoding = "utf8") {
|
|
168
|
+
try {
|
|
169
|
+
const buffer = Buffer.alloc(4096);
|
|
170
|
+
const fd = openSync(filePath, "r");
|
|
171
|
+
const bytesRead = readSync(fd, buffer, 0, 4096, 0);
|
|
172
|
+
closeSync(fd);
|
|
173
|
+
const content = buffer.toString(encoding, 0, bytesRead);
|
|
174
|
+
let crlfCount = 0;
|
|
175
|
+
let lfCount = 0;
|
|
176
|
+
for (let i = 0; i < content.length; i++) {
|
|
177
|
+
if (content[i] === "\n") {
|
|
178
|
+
if (i > 0 && content[i - 1] === "\r") {
|
|
179
|
+
crlfCount++;
|
|
180
|
+
} else {
|
|
181
|
+
lfCount++;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return crlfCount > lfCount ? "CRLF" : "LF";
|
|
186
|
+
} catch (error) {
|
|
187
|
+
logError(`Error detecting line endings for file ${filePath}: ${error}`);
|
|
188
|
+
return "LF";
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
function normalizeFilePath(filePath) {
|
|
192
|
+
const absoluteFilePath = isAbsolute(filePath) ? filePath : resolve(getCwd(), filePath);
|
|
193
|
+
if (absoluteFilePath.endsWith(" AM.png")) {
|
|
194
|
+
return absoluteFilePath.replace(
|
|
195
|
+
" AM.png",
|
|
196
|
+
`${String.fromCharCode(8239)}AM.png`
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
if (absoluteFilePath.endsWith(" PM.png")) {
|
|
200
|
+
return absoluteFilePath.replace(
|
|
201
|
+
" PM.png",
|
|
202
|
+
`${String.fromCharCode(8239)}PM.png`
|
|
203
|
+
);
|
|
204
|
+
}
|
|
205
|
+
return absoluteFilePath;
|
|
206
|
+
}
|
|
207
|
+
function getAbsolutePath(path) {
|
|
208
|
+
return path ? isAbsolute(path) ? path : resolve(getCwd(), path) : void 0;
|
|
209
|
+
}
|
|
210
|
+
function getAbsoluteAndRelativePaths(path) {
|
|
211
|
+
const absolutePath = getAbsolutePath(path);
|
|
212
|
+
const relativePath = absolutePath ? relative(getCwd(), absolutePath) : void 0;
|
|
213
|
+
return { absolutePath, relativePath };
|
|
214
|
+
}
|
|
215
|
+
function findSimilarFile(filePath) {
|
|
216
|
+
try {
|
|
217
|
+
const dir = dirname(filePath);
|
|
218
|
+
const fileBaseName = basename(filePath, extname(filePath));
|
|
219
|
+
if (!existsSync(dir)) {
|
|
220
|
+
return void 0;
|
|
221
|
+
}
|
|
222
|
+
const files = readdirSync(dir);
|
|
223
|
+
const similarFiles = files.filter(
|
|
224
|
+
(file) => basename(file, extname(file)) === fileBaseName && join(dir, file) !== filePath
|
|
225
|
+
);
|
|
226
|
+
const firstMatch = similarFiles[0];
|
|
227
|
+
if (firstMatch) {
|
|
228
|
+
return firstMatch;
|
|
229
|
+
}
|
|
230
|
+
return void 0;
|
|
231
|
+
} catch (error) {
|
|
232
|
+
logError(`Error finding similar file for ${filePath}: ${error}`);
|
|
233
|
+
return void 0;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
function addLineNumbers({
|
|
237
|
+
content,
|
|
238
|
+
// 1-indexed
|
|
239
|
+
startLine
|
|
240
|
+
}) {
|
|
241
|
+
if (!content) {
|
|
242
|
+
return "";
|
|
243
|
+
}
|
|
244
|
+
return content.split(/\r?\n/).map((line, index) => {
|
|
245
|
+
const lineNum = index + startLine;
|
|
246
|
+
const numStr = String(lineNum);
|
|
247
|
+
if (numStr.length >= 6) {
|
|
248
|
+
return `${numStr} ${line}`;
|
|
249
|
+
}
|
|
250
|
+
const n = numStr.padStart(6, " ");
|
|
251
|
+
return `${n} ${line}`;
|
|
252
|
+
}).join("\n");
|
|
253
|
+
}
|
|
254
|
+
function isDirEmpty(dirPath) {
|
|
255
|
+
try {
|
|
256
|
+
const entries = readdirSync(dirPath);
|
|
257
|
+
return entries.length === 0;
|
|
258
|
+
} catch (error) {
|
|
259
|
+
logError(`Error checking directory: ${error}`);
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
export {
|
|
264
|
+
addLineNumbers,
|
|
265
|
+
detectFileEncoding,
|
|
266
|
+
detectFileEncodingDirect,
|
|
267
|
+
detectLineEndings,
|
|
268
|
+
detectLineEndingsDirect,
|
|
269
|
+
detectRepoLineEndings,
|
|
270
|
+
detectRepoLineEndingsDirect,
|
|
271
|
+
findSimilarFile,
|
|
272
|
+
getAbsoluteAndRelativePaths,
|
|
273
|
+
getAbsolutePath,
|
|
274
|
+
glob,
|
|
275
|
+
isDirEmpty,
|
|
276
|
+
isInDirectory,
|
|
277
|
+
normalizeFilePath,
|
|
278
|
+
readFileSafe,
|
|
279
|
+
readTextContent,
|
|
280
|
+
writeTextContent
|
|
281
|
+
};
|
|
282
|
+
//# sourceMappingURL=file.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/file.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n readFileSync,\n writeFileSync,\n openSync,\n readSync,\n closeSync,\n existsSync,\n readdirSync,\n} from 'fs'\nimport { logError } from './log'\nimport {\n isAbsolute,\n normalize,\n resolve,\n resolve as resolvePath,\n relative,\n sep,\n basename,\n dirname,\n extname,\n join,\n} from 'path'\nimport { glob as globLib } from 'glob'\nimport { cwd } from 'process'\nimport { listAllContentFiles } from './ripgrep'\nimport { LRUCache } from 'lru-cache'\nimport { getCwd } from './state'\n\nexport type File = {\n filename: string\n content: string\n}\n\nexport type LineEndingType = 'CRLF' | 'LF'\n\nexport async function glob(\n filePattern: string,\n cwd: string,\n { limit, offset }: { limit: number; offset: number },\n abortSignal: AbortSignal,\n): Promise<{ files: string[]; truncated: boolean }> {\n // TODO: Use worker threads\n const paths = await globLib([filePattern], {\n cwd,\n nocase: true,\n nodir: true,\n signal: abortSignal,\n stat: true,\n withFileTypes: true,\n })\n const sortedPaths = paths.sort((a, b) => (a.mtimeMs ?? 0) - (b.mtimeMs ?? 0))\n const truncated = sortedPaths.length > offset + limit\n return {\n files: sortedPaths\n .slice(offset, offset + limit)\n .map(path => path.fullpath()),\n truncated,\n }\n}\n\nexport function readFileSafe(filepath: string): string | null {\n try {\n return readFileSync(filepath, 'utf-8')\n } catch (error) {\n logError(error)\n return null\n }\n}\n\nexport function isInDirectory(\n relativePath: string,\n relativeCwd: string,\n): boolean {\n if (relativePath === '.') {\n return true\n }\n\n // Reject paths starting with ~ (home directory)\n if (relativePath.startsWith('~')) {\n return false\n }\n\n // Reject paths containing null bytes or other sneaky characters\n if (relativePath.includes('\\0') || relativeCwd.includes('\\0')) {\n return false\n }\n\n // Normalize paths to resolve any '..' or '.' segments\n // and add trailing slashes\n let normalizedPath = normalize(relativePath)\n let normalizedCwd = normalize(relativeCwd)\n\n normalizedPath = normalizedPath.endsWith(sep)\n ? normalizedPath\n : normalizedPath + sep\n normalizedCwd = normalizedCwd.endsWith(sep)\n ? normalizedCwd\n : normalizedCwd + sep\n\n // Join with a base directory to make them absolute-like for comparison\n const fullPath = resolvePath(cwd(), normalizedCwd, normalizedPath)\n const fullCwd = resolvePath(cwd(), normalizedCwd)\n\n // Robust subpath check using path.relative (case-insensitive on Windows)\n const rel = relative(fullCwd, fullPath)\n if (!rel || rel === '') return true\n if (rel.startsWith('..')) return false\n if (isAbsolute(rel)) return false\n return true\n}\n\nexport function readTextContent(\n filePath: string,\n offset = 0,\n maxLines?: number,\n): { content: string; lineCount: number; totalLines: number } {\n const enc = detectFileEncoding(filePath)\n const content = readFileSync(filePath, enc)\n const lines = content.split(/\\r?\\n/)\n\n // Truncate number of lines if needed\n const toReturn =\n maxLines !== undefined && lines.length - offset > maxLines\n ? lines.slice(offset, offset + maxLines)\n : lines.slice(offset)\n\n return {\n content: toReturn.join('\\n'), // TODO: This probably won't work for Windows\n lineCount: toReturn.length,\n totalLines: lines.length,\n }\n}\n\nexport function writeTextContent(\n filePath: string,\n content: string,\n encoding: BufferEncoding,\n endings: LineEndingType,\n): void {\n let toWrite = content\n if (endings === 'CRLF') {\n toWrite = content.split('\\n').join('\\r\\n')\n }\n\n writeFileSync(filePath, toWrite, { encoding, flush: true })\n}\n\nconst repoEndingCache = new LRUCache<string, LineEndingType>({\n fetchMethod: path => detectRepoLineEndingsDirect(path),\n ttl: 5 * 60 * 1000,\n ttlAutopurge: false,\n max: 1000,\n})\n\nexport async function detectRepoLineEndings(\n filePath: string,\n): Promise<LineEndingType | undefined> {\n return repoEndingCache.fetch(resolve(filePath))\n}\n\nexport async function detectRepoLineEndingsDirect(\n cwd: string,\n): Promise<LineEndingType> {\n const abortController = new AbortController()\n setTimeout(() => {\n abortController.abort()\n }, 1_000)\n const allFiles = await listAllContentFiles(cwd, abortController.signal, 15)\n\n let crlfCount = 0\n for (const file of allFiles) {\n const lineEnding = detectLineEndings(file)\n if (lineEnding === 'CRLF') {\n crlfCount++\n }\n }\n\n return crlfCount > 3 ? 'CRLF' : 'LF'\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nfunction fetch<K extends {}, V extends {}>(\n cache: LRUCache<K, V>,\n key: K,\n value: () => V,\n): V {\n if (cache.has(key)) {\n return cache.get(key)!\n }\n\n const v = value()\n cache.set(key, v)\n return v\n}\n\nconst fileEncodingCache = new LRUCache<string, BufferEncoding>({\n fetchMethod: path => detectFileEncodingDirect(path),\n ttl: 5 * 60 * 1000,\n ttlAutopurge: false,\n max: 1000,\n})\n\nexport function detectFileEncoding(filePath: string): BufferEncoding {\n const k = resolve(filePath)\n return fetch(fileEncodingCache, k, () => detectFileEncodingDirect(k))\n}\n\nexport function detectFileEncodingDirect(filePath: string): BufferEncoding {\n const BUFFER_SIZE = 4096\n const buffer = Buffer.alloc(BUFFER_SIZE)\n\n let fd: number | undefined = undefined\n try {\n fd = openSync(filePath, 'r')\n const bytesRead = readSync(fd, buffer, 0, BUFFER_SIZE, 0)\n\n if (bytesRead >= 2) {\n if (buffer[0] === 0xff && buffer[1] === 0xfe) return 'utf16le'\n }\n\n if (\n bytesRead >= 3 &&\n buffer[0] === 0xef &&\n buffer[1] === 0xbb &&\n buffer[2] === 0xbf\n ) {\n return 'utf8'\n }\n\n const isUtf8 = buffer.slice(0, bytesRead).toString('utf8').length > 0\n return isUtf8 ? 'utf8' : 'ascii'\n } catch (error) {\n logError(`Error detecting encoding for file ${filePath}: ${error}`)\n return 'utf8'\n } finally {\n if (fd) closeSync(fd)\n }\n}\n\nconst lineEndingCache = new LRUCache<string, LineEndingType>({\n fetchMethod: path => detectLineEndingsDirect(path),\n ttl: 5 * 60 * 1000,\n ttlAutopurge: false,\n max: 1000,\n})\n\nexport function detectLineEndings(filePath: string): LineEndingType {\n const k = resolve(filePath)\n return fetch(lineEndingCache, k, () => detectLineEndingsDirect(k))\n}\n\nexport function detectLineEndingsDirect(\n filePath: string,\n encoding: BufferEncoding = 'utf8',\n): LineEndingType {\n try {\n const buffer = Buffer.alloc(4096)\n const fd = openSync(filePath, 'r')\n const bytesRead = readSync(fd, buffer, 0, 4096, 0)\n closeSync(fd)\n\n const content = buffer.toString(encoding, 0, bytesRead)\n let crlfCount = 0\n let lfCount = 0\n\n for (let i = 0; i < content.length; i++) {\n if (content[i] === '\\n') {\n if (i > 0 && content[i - 1] === '\\r') {\n crlfCount++\n } else {\n lfCount++\n }\n }\n }\n\n return crlfCount > lfCount ? 'CRLF' : 'LF'\n } catch (error) {\n logError(`Error detecting line endings for file ${filePath}: ${error}`)\n return 'LF'\n }\n}\n\nexport function normalizeFilePath(filePath: string): string {\n const absoluteFilePath = isAbsolute(filePath)\n ? filePath\n : resolve(getCwd(), filePath)\n\n // One weird trick for half-width space characters in MacOS screenshot filenames\n if (absoluteFilePath.endsWith(' AM.png')) {\n return absoluteFilePath.replace(\n ' AM.png',\n `${String.fromCharCode(8239)}AM.png`,\n )\n }\n\n // One weird trick for half-width space characters in MacOS screenshot filenames\n if (absoluteFilePath.endsWith(' PM.png')) {\n return absoluteFilePath.replace(\n ' PM.png',\n `${String.fromCharCode(8239)}PM.png`,\n )\n }\n\n return absoluteFilePath\n}\n\nexport function getAbsolutePath(path: string | undefined): string | undefined {\n return path ? (isAbsolute(path) ? path : resolve(getCwd(), path)) : undefined\n}\n\nexport function getAbsoluteAndRelativePaths(path: string | undefined): {\n absolutePath: string | undefined\n relativePath: string | undefined\n} {\n const absolutePath = getAbsolutePath(path)\n const relativePath = absolutePath\n ? relative(getCwd(), absolutePath)\n : undefined\n return { absolutePath, relativePath }\n}\n\n/**\n * Find files with the same name but different extensions in the same directory\n * @param filePath The path to the file that doesn't exist\n * @returns The found file with a different extension, or undefined if none found\n */\n\nexport function findSimilarFile(filePath: string): string | undefined {\n try {\n const dir = dirname(filePath)\n const fileBaseName = basename(filePath, extname(filePath))\n\n // Check if directory exists\n if (!existsSync(dir)) {\n return undefined\n }\n\n // Get all files in the directory\n const files = readdirSync(dir)\n\n // Find files with the same base name but different extension\n const similarFiles = files.filter(\n file =>\n basename(file, extname(file)) === fileBaseName &&\n join(dir, file) !== filePath,\n )\n\n // Return just the filename of the first match if found\n const firstMatch = similarFiles[0]\n if (firstMatch) {\n return firstMatch\n }\n return undefined\n } catch (error) {\n // In case of any errors, return undefined\n logError(`Error finding similar file for ${filePath}: ${error}`)\n return undefined\n }\n}\n\n/**\n * Adds cat -n style line numbers to the content\n */\nexport function addLineNumbers({\n content,\n // 1-indexed\n startLine,\n}: {\n content: string\n startLine: number\n}): string {\n if (!content) {\n return ''\n }\n\n return content\n .split(/\\r?\\n/)\n .map((line, index) => {\n const lineNum = index + startLine\n const numStr = String(lineNum)\n // Handle large numbers differently\n if (numStr.length >= 6) {\n return `${numStr}\\t${line}`\n }\n // Regular numbers get padding to 6 characters\n const n = numStr.padStart(6, ' ')\n return `${n}\\t${line}`\n })\n .join('\\n') // TODO: This probably won't work for Windows\n}\n\n/**\n * Checks if a directory is empty by efficiently reading just the first entry\n * @param dirPath The path to the directory to check\n * @returns true if the directory is empty, false otherwise\n */\nexport function isDirEmpty(dirPath: string): boolean {\n try {\n const entries = readdirSync(dirPath)\n return entries.length === 0\n } catch (error) {\n logError(`Error checking directory: ${error}`)\n return false\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["cwd"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { readTextContent } from "./file.js";
|
|
2
|
+
import { fileFreshnessService } from "../services/fileFreshness.js";
|
|
3
|
+
const MAX_FILES_TO_RECOVER = 5;
|
|
4
|
+
const MAX_TOKENS_PER_FILE = 1e4;
|
|
5
|
+
const MAX_TOTAL_FILE_TOKENS = 5e4;
|
|
6
|
+
async function selectAndReadFiles() {
|
|
7
|
+
const importantFiles = fileFreshnessService.getImportantFiles(MAX_FILES_TO_RECOVER);
|
|
8
|
+
const results = [];
|
|
9
|
+
let totalTokens = 0;
|
|
10
|
+
for (const fileInfo of importantFiles) {
|
|
11
|
+
try {
|
|
12
|
+
const { content } = readTextContent(fileInfo.path);
|
|
13
|
+
const estimatedTokens = Math.ceil(content.length * 0.25);
|
|
14
|
+
let finalContent = content;
|
|
15
|
+
let truncated = false;
|
|
16
|
+
if (estimatedTokens > MAX_TOKENS_PER_FILE) {
|
|
17
|
+
const maxChars = Math.floor(MAX_TOKENS_PER_FILE / 0.25);
|
|
18
|
+
finalContent = content.substring(0, maxChars);
|
|
19
|
+
truncated = true;
|
|
20
|
+
}
|
|
21
|
+
const finalTokens = Math.min(estimatedTokens, MAX_TOKENS_PER_FILE);
|
|
22
|
+
if (totalTokens + finalTokens > MAX_TOTAL_FILE_TOKENS) {
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
totalTokens += finalTokens;
|
|
26
|
+
results.push({
|
|
27
|
+
path: fileInfo.path,
|
|
28
|
+
content: finalContent,
|
|
29
|
+
tokens: finalTokens,
|
|
30
|
+
truncated
|
|
31
|
+
});
|
|
32
|
+
} catch (error) {
|
|
33
|
+
console.error(`Failed to read file for recovery: ${fileInfo.path}`, error);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return results;
|
|
37
|
+
}
|
|
38
|
+
export {
|
|
39
|
+
selectAndReadFiles
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=fileRecoveryCore.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/fileRecoveryCore.ts"],
|
|
4
|
+
"sourcesContent": ["import { readTextContent } from './file'\nimport { fileFreshnessService } from '../services/fileFreshness'\n\n/**\n * File recovery configuration for auto-compact feature\n * These limits ensure recovered files don't overwhelm the compressed context\n */\nconst MAX_FILES_TO_RECOVER = 5\nconst MAX_TOKENS_PER_FILE = 10_000\nconst MAX_TOTAL_FILE_TOKENS = 50_000\n\n/**\n * Selects and reads recently accessed files for context recovery\n *\n * During auto-compact, this function preserves development context by:\n * - Selecting files based on recent access patterns\n * - Enforcing token budgets to prevent context bloat\n * - Truncating large files while preserving essential content\n *\n * @returns Array of file data with content, token counts, and truncation flags\n */\nexport async function selectAndReadFiles(): Promise<\n Array<{\n path: string\n content: string\n tokens: number\n truncated: boolean\n }>\n> {\n const importantFiles =\n fileFreshnessService.getImportantFiles(MAX_FILES_TO_RECOVER)\n const results = []\n let totalTokens = 0\n\n for (const fileInfo of importantFiles) {\n try {\n const { content } = readTextContent(fileInfo.path)\n const estimatedTokens = Math.ceil(content.length * 0.25)\n\n // Apply per-file token limit to prevent any single file from dominating context\n let finalContent = content\n let truncated = false\n\n if (estimatedTokens > MAX_TOKENS_PER_FILE) {\n const maxChars = Math.floor(MAX_TOKENS_PER_FILE / 0.25)\n finalContent = content.substring(0, maxChars)\n truncated = true\n }\n\n const finalTokens = Math.min(estimatedTokens, MAX_TOKENS_PER_FILE)\n\n // Enforce total token budget to maintain auto-compact effectiveness\n if (totalTokens + finalTokens > MAX_TOTAL_FILE_TOKENS) {\n break\n }\n\n totalTokens += finalTokens\n results.push({\n path: fileInfo.path,\n content: finalContent,\n tokens: finalTokens,\n truncated,\n })\n } catch (error) {\n // Skip files that cannot be read, don't let one failure stop the process\n console.error(`Failed to read file for recovery: ${fileInfo.path}`, error)\n }\n }\n\n return results\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,uBAAuB;AAChC,SAAS,4BAA4B;AAMrC,MAAM,uBAAuB;AAC7B,MAAM,sBAAsB;AAC5B,MAAM,wBAAwB;AAY9B,eAAsB,qBAOpB;AACA,QAAM,iBACJ,qBAAqB,kBAAkB,oBAAoB;AAC7D,QAAM,UAAU,CAAC;AACjB,MAAI,cAAc;AAElB,aAAW,YAAY,gBAAgB;AACrC,QAAI;AACF,YAAM,EAAE,QAAQ,IAAI,gBAAgB,SAAS,IAAI;AACjD,YAAM,kBAAkB,KAAK,KAAK,QAAQ,SAAS,IAAI;AAGvD,UAAI,eAAe;AACnB,UAAI,YAAY;AAEhB,UAAI,kBAAkB,qBAAqB;AACzC,cAAM,WAAW,KAAK,MAAM,sBAAsB,IAAI;AACtD,uBAAe,QAAQ,UAAU,GAAG,QAAQ;AAC5C,oBAAY;AAAA,MACd;AAEA,YAAM,cAAc,KAAK,IAAI,iBAAiB,mBAAmB;AAGjE,UAAI,cAAc,cAAc,uBAAuB;AACrD;AAAA,MACF;AAEA,qBAAe;AACf,cAAQ,KAAK;AAAA,QACX,MAAM,SAAS;AAAA,QACf,SAAS;AAAA,QACT,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AAEd,cAAQ,MAAM,qCAAqC,SAAS,IAAI,IAAI,KAAK;AAAA,IAC3E;AAAA,EACF;AAEA,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
function wrapText(text, width) {
|
|
2
|
+
const lines = [];
|
|
3
|
+
let currentLine = "";
|
|
4
|
+
for (const char of text) {
|
|
5
|
+
if ([...currentLine].length < width) {
|
|
6
|
+
currentLine += char;
|
|
7
|
+
} else {
|
|
8
|
+
lines.push(currentLine);
|
|
9
|
+
currentLine = char;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
if (currentLine) lines.push(currentLine);
|
|
13
|
+
return lines;
|
|
14
|
+
}
|
|
15
|
+
function formatDuration(ms) {
|
|
16
|
+
if (ms < 6e4) {
|
|
17
|
+
return `${(ms / 1e3).toFixed(1)}s`;
|
|
18
|
+
}
|
|
19
|
+
const hours = Math.floor(ms / 36e5);
|
|
20
|
+
const minutes = Math.floor(ms % 36e5 / 6e4);
|
|
21
|
+
const seconds = (ms % 6e4 / 1e3).toFixed(1);
|
|
22
|
+
if (hours > 0) {
|
|
23
|
+
return `${hours}h ${minutes}m ${seconds}s`;
|
|
24
|
+
}
|
|
25
|
+
if (minutes > 0) {
|
|
26
|
+
return `${minutes}m ${seconds}s`;
|
|
27
|
+
}
|
|
28
|
+
return `${seconds}s`;
|
|
29
|
+
}
|
|
30
|
+
function formatNumber(number) {
|
|
31
|
+
return new Intl.NumberFormat("en", {
|
|
32
|
+
notation: "compact",
|
|
33
|
+
maximumFractionDigits: 1
|
|
34
|
+
}).format(number).toLowerCase();
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
formatDuration,
|
|
38
|
+
formatNumber,
|
|
39
|
+
wrapText
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/format.tsx"],
|
|
4
|
+
"sourcesContent": ["export function wrapText(text: string, width: number): string[] {\n const lines: string[] = []\n let currentLine = ''\n\n for (const char of text) {\n // Important: we need the spread to properly count multi-plane UTF-8 characters (eg. \uD805\uDE96)\n if ([...currentLine].length < width) {\n currentLine += char\n } else {\n lines.push(currentLine)\n currentLine = char\n }\n }\n\n if (currentLine) lines.push(currentLine)\n return lines\n}\n\nexport function formatDuration(ms: number): string {\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`\n }\n\n const hours = Math.floor(ms / 3600000)\n const minutes = Math.floor((ms % 3600000) / 60000)\n const seconds = ((ms % 60000) / 1000).toFixed(1)\n\n if (hours > 0) {\n return `${hours}h ${minutes}m ${seconds}s`\n }\n if (minutes > 0) {\n return `${minutes}m ${seconds}s`\n }\n return `${seconds}s`\n}\n\nexport function formatNumber(number: number): string {\n return new Intl.NumberFormat('en', {\n notation: 'compact',\n maximumFractionDigits: 1,\n })\n .format(number) // eg. \"1321\" => \"1.3K\"\n .toLowerCase() // eg. \"1.3K\" => \"1.3k\"\n}\n"],
|
|
5
|
+
"mappings": "AAAO,SAAS,SAAS,MAAc,OAAyB;AAC9D,QAAM,QAAkB,CAAC;AACzB,MAAI,cAAc;AAElB,aAAW,QAAQ,MAAM;AAEvB,QAAI,CAAC,GAAG,WAAW,EAAE,SAAS,OAAO;AACnC,qBAAe;AAAA,IACjB,OAAO;AACL,YAAM,KAAK,WAAW;AACtB,oBAAc;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,YAAa,OAAM,KAAK,WAAW;AACvC,SAAO;AACT;AAEO,SAAS,eAAe,IAAoB;AACjD,MAAI,KAAK,KAAO;AACd,WAAO,IAAI,KAAK,KAAM,QAAQ,CAAC,CAAC;AAAA,EAClC;AAEA,QAAM,QAAQ,KAAK,MAAM,KAAK,IAAO;AACrC,QAAM,UAAU,KAAK,MAAO,KAAK,OAAW,GAAK;AACjD,QAAM,WAAY,KAAK,MAAS,KAAM,QAAQ,CAAC;AAE/C,MAAI,QAAQ,GAAG;AACb,WAAO,GAAG,KAAK,KAAK,OAAO,KAAK,OAAO;AAAA,EACzC;AACA,MAAI,UAAU,GAAG;AACf,WAAO,GAAG,OAAO,KAAK,OAAO;AAAA,EAC/B;AACA,SAAO,GAAG,OAAO;AACnB;AAEO,SAAS,aAAa,QAAwB;AACnD,SAAO,IAAI,KAAK,aAAa,MAAM;AAAA,IACjC,UAAU;AAAA,IACV,uBAAuB;AAAA,EACzB,CAAC,EACE,OAAO,MAAM,EACb,YAAY;AACjB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
const DEFAULT_CONFIG = {
|
|
2
|
+
weights: {
|
|
3
|
+
prefix: 0.35,
|
|
4
|
+
// Strong weight for prefix matching
|
|
5
|
+
substring: 0.2,
|
|
6
|
+
// Good for partial matches
|
|
7
|
+
abbreviation: 0.3,
|
|
8
|
+
// Key for "nde"→"node" cases
|
|
9
|
+
editDistance: 0.1,
|
|
10
|
+
// Typo tolerance
|
|
11
|
+
popularity: 0.05
|
|
12
|
+
// Slight bias for common commands
|
|
13
|
+
},
|
|
14
|
+
minScore: 10,
|
|
15
|
+
// Lower threshold for better matching
|
|
16
|
+
maxEditDistance: 2,
|
|
17
|
+
popularCommands: [
|
|
18
|
+
"node",
|
|
19
|
+
"npm",
|
|
20
|
+
"git",
|
|
21
|
+
"ls",
|
|
22
|
+
"cd",
|
|
23
|
+
"cat",
|
|
24
|
+
"grep",
|
|
25
|
+
"find",
|
|
26
|
+
"cp",
|
|
27
|
+
"mv",
|
|
28
|
+
"python",
|
|
29
|
+
"java",
|
|
30
|
+
"docker",
|
|
31
|
+
"curl",
|
|
32
|
+
"wget",
|
|
33
|
+
"vim",
|
|
34
|
+
"nano"
|
|
35
|
+
]
|
|
36
|
+
};
|
|
37
|
+
class FuzzyMatcher {
|
|
38
|
+
config;
|
|
39
|
+
constructor(config = {}) {
|
|
40
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
41
|
+
const weightSum = Object.values(this.config.weights).reduce((a, b) => a + b, 0);
|
|
42
|
+
if (Math.abs(weightSum - 1) > 0.01) {
|
|
43
|
+
Object.keys(this.config.weights).forEach((key) => {
|
|
44
|
+
this.config.weights[key] /= weightSum;
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Calculate fuzzy match score for a candidate against a query
|
|
50
|
+
*/
|
|
51
|
+
match(candidate, query) {
|
|
52
|
+
const text = candidate.toLowerCase();
|
|
53
|
+
const pattern = query.toLowerCase();
|
|
54
|
+
if (text === pattern) {
|
|
55
|
+
return { score: 1e3, algorithm: "exact", confidence: 1 };
|
|
56
|
+
}
|
|
57
|
+
if (text.startsWith(pattern)) {
|
|
58
|
+
return {
|
|
59
|
+
score: 900 + (10 - pattern.length),
|
|
60
|
+
algorithm: "prefix-exact",
|
|
61
|
+
confidence: 0.95
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const scores = {
|
|
65
|
+
prefix: this.prefixScore(text, pattern),
|
|
66
|
+
substring: this.substringScore(text, pattern),
|
|
67
|
+
abbreviation: this.abbreviationScore(text, pattern),
|
|
68
|
+
editDistance: this.editDistanceScore(text, pattern),
|
|
69
|
+
popularity: this.popularityScore(text)
|
|
70
|
+
};
|
|
71
|
+
const rawScore = Object.entries(scores).reduce((total, [algorithm, score]) => {
|
|
72
|
+
const weight = this.config.weights[algorithm];
|
|
73
|
+
return total + score * weight;
|
|
74
|
+
}, 0);
|
|
75
|
+
const lengthPenalty = Math.max(0, text.length - 6) * 1.5;
|
|
76
|
+
const finalScore = Math.max(0, rawScore - lengthPenalty);
|
|
77
|
+
const maxAlgorithm = Object.entries(scores).reduce(
|
|
78
|
+
(max, [alg, score]) => score > max.score ? { algorithm: alg, score } : max,
|
|
79
|
+
{ algorithm: "none", score: 0 }
|
|
80
|
+
);
|
|
81
|
+
const confidence = Math.min(1, finalScore / 100);
|
|
82
|
+
return {
|
|
83
|
+
score: finalScore,
|
|
84
|
+
algorithm: maxAlgorithm.algorithm,
|
|
85
|
+
confidence
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Algorithm 1: Prefix Matching (like pinyin prefix)
|
|
90
|
+
* Handles cases like "nod" → "node"
|
|
91
|
+
*/
|
|
92
|
+
prefixScore(text, pattern) {
|
|
93
|
+
if (!text.startsWith(pattern)) return 0;
|
|
94
|
+
const coverage = pattern.length / text.length;
|
|
95
|
+
return 100 * coverage;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Algorithm 2: Substring Matching (like pinyin contains)
|
|
99
|
+
* Handles cases like "ode" → "node", "py3" → "python3"
|
|
100
|
+
*/
|
|
101
|
+
substringScore(text, pattern) {
|
|
102
|
+
const index = text.indexOf(pattern);
|
|
103
|
+
if (index !== -1) {
|
|
104
|
+
const positionFactor = Math.max(0, 10 - index) / 10;
|
|
105
|
+
const coverageFactor = pattern.length / text.length;
|
|
106
|
+
return 80 * positionFactor * coverageFactor;
|
|
107
|
+
}
|
|
108
|
+
const numMatch = pattern.match(/^(.+?)(\d+)$/);
|
|
109
|
+
if (numMatch) {
|
|
110
|
+
const [, prefix, num] = numMatch;
|
|
111
|
+
if (text.startsWith(prefix) && text.endsWith(num)) {
|
|
112
|
+
const coverageFactor = pattern.length / text.length;
|
|
113
|
+
return 70 * coverageFactor + 20;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return 0;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Algorithm 3: Abbreviation Matching (key innovation)
|
|
120
|
+
* Handles cases like "nde" → "node", "pyt3" → "python3", "gp5" → "gpt-5"
|
|
121
|
+
*/
|
|
122
|
+
abbreviationScore(text, pattern) {
|
|
123
|
+
let score = 0;
|
|
124
|
+
let textPos = 0;
|
|
125
|
+
let perfectStart = false;
|
|
126
|
+
let consecutiveMatches = 0;
|
|
127
|
+
let wordBoundaryMatches = 0;
|
|
128
|
+
const textWords = text.split("-");
|
|
129
|
+
const textClean = text.replace(/-/g, "").toLowerCase();
|
|
130
|
+
for (let i = 0; i < pattern.length; i++) {
|
|
131
|
+
const char = pattern[i];
|
|
132
|
+
let charFound = false;
|
|
133
|
+
for (let j = textPos; j < textClean.length; j++) {
|
|
134
|
+
if (textClean[j] === char) {
|
|
135
|
+
charFound = true;
|
|
136
|
+
let originalPos = 0;
|
|
137
|
+
let cleanPos = 0;
|
|
138
|
+
for (let k = 0; k < text.length; k++) {
|
|
139
|
+
if (text[k] === "-") continue;
|
|
140
|
+
if (cleanPos === j) {
|
|
141
|
+
originalPos = k;
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
cleanPos++;
|
|
145
|
+
}
|
|
146
|
+
if (j === textPos) {
|
|
147
|
+
consecutiveMatches++;
|
|
148
|
+
} else {
|
|
149
|
+
consecutiveMatches = 1;
|
|
150
|
+
}
|
|
151
|
+
if (i === 0 && j === 0) {
|
|
152
|
+
score += 50;
|
|
153
|
+
perfectStart = true;
|
|
154
|
+
} else if (originalPos === 0 || text[originalPos - 1] === "-") {
|
|
155
|
+
score += 35;
|
|
156
|
+
wordBoundaryMatches++;
|
|
157
|
+
} else if (j <= 2) {
|
|
158
|
+
score += 20;
|
|
159
|
+
} else if (j <= 6) {
|
|
160
|
+
score += 10;
|
|
161
|
+
} else {
|
|
162
|
+
score += 5;
|
|
163
|
+
}
|
|
164
|
+
if (consecutiveMatches > 1) {
|
|
165
|
+
score += consecutiveMatches * 5;
|
|
166
|
+
}
|
|
167
|
+
textPos = j + 1;
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (!charFound) return 0;
|
|
172
|
+
}
|
|
173
|
+
if (perfectStart) score += 30;
|
|
174
|
+
if (wordBoundaryMatches >= 2) score += 25;
|
|
175
|
+
if (textPos <= textClean.length * 0.8) score += 15;
|
|
176
|
+
const lastPatternChar = pattern[pattern.length - 1];
|
|
177
|
+
const lastTextChar = text[text.length - 1];
|
|
178
|
+
if (/\d/.test(lastPatternChar) && lastPatternChar === lastTextChar) {
|
|
179
|
+
score += 25;
|
|
180
|
+
}
|
|
181
|
+
return score;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Algorithm 4: Edit Distance (typo tolerance)
|
|
185
|
+
* Handles cases like "noda" → "node"
|
|
186
|
+
*/
|
|
187
|
+
editDistanceScore(text, pattern) {
|
|
188
|
+
if (pattern.length > text.length + this.config.maxEditDistance) return 0;
|
|
189
|
+
const dp = [];
|
|
190
|
+
const m = pattern.length;
|
|
191
|
+
const n = text.length;
|
|
192
|
+
for (let i = 0; i <= m; i++) {
|
|
193
|
+
dp[i] = [];
|
|
194
|
+
for (let j = 0; j <= n; j++) {
|
|
195
|
+
if (i === 0) dp[i][j] = j;
|
|
196
|
+
else if (j === 0) dp[i][j] = i;
|
|
197
|
+
else {
|
|
198
|
+
const cost = pattern[i - 1] === text[j - 1] ? 0 : 1;
|
|
199
|
+
dp[i][j] = Math.min(
|
|
200
|
+
dp[i - 1][j] + 1,
|
|
201
|
+
// deletion
|
|
202
|
+
dp[i][j - 1] + 1,
|
|
203
|
+
// insertion
|
|
204
|
+
dp[i - 1][j - 1] + cost
|
|
205
|
+
// substitution
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
const distance = dp[m][n];
|
|
211
|
+
if (distance > this.config.maxEditDistance) return 0;
|
|
212
|
+
return Math.max(0, 30 - distance * 10);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Algorithm 5: Command Popularity (like frequency in input method)
|
|
216
|
+
* Boost common commands that users frequently type
|
|
217
|
+
*/
|
|
218
|
+
popularityScore(text) {
|
|
219
|
+
if (this.config.popularCommands.includes(text)) {
|
|
220
|
+
return 40;
|
|
221
|
+
}
|
|
222
|
+
if (text.length <= 5) return 10;
|
|
223
|
+
return 0;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Batch match multiple candidates and return sorted results
|
|
227
|
+
*/
|
|
228
|
+
matchMany(candidates, query) {
|
|
229
|
+
return candidates.map((candidate) => ({
|
|
230
|
+
candidate,
|
|
231
|
+
result: this.match(candidate, query)
|
|
232
|
+
})).filter((item) => item.result.score >= this.config.minScore).sort((a, b) => b.result.score - a.result.score);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
const defaultMatcher = new FuzzyMatcher();
|
|
236
|
+
function matchCommand(command, query) {
|
|
237
|
+
return defaultMatcher.match(command, query);
|
|
238
|
+
}
|
|
239
|
+
import { matchManyAdvanced } from "./advancedFuzzyMatcher.js";
|
|
240
|
+
function matchCommands(commands, query) {
|
|
241
|
+
return matchManyAdvanced(commands, query, 5).map((item) => ({
|
|
242
|
+
command: item.candidate,
|
|
243
|
+
score: item.score
|
|
244
|
+
}));
|
|
245
|
+
}
|
|
246
|
+
export {
|
|
247
|
+
FuzzyMatcher,
|
|
248
|
+
defaultMatcher,
|
|
249
|
+
matchCommand,
|
|
250
|
+
matchCommands
|
|
251
|
+
};
|
|
252
|
+
//# sourceMappingURL=fuzzyMatcher.js.map
|