@within-7/minto 0.0.5-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +1097 -0
- package/README.zh-CN.md +1097 -0
- package/cli.js +59 -0
- package/dist/Tool.js +1 -0
- package/dist/Tool.js.map +7 -0
- package/dist/commands/agents.js +2086 -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/build.js +74 -0
- package/dist/commands/build.js.map +7 -0
- package/dist/commands/clear.js +37 -0
- package/dist/commands/clear.js.map +7 -0
- package/dist/commands/compact.js +82 -0
- package/dist/commands/compact.js.map +7 -0
- package/dist/commands/compression.js +57 -0
- package/dist/commands/compression.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-interactive.js +267 -0
- package/dist/commands/mcp-interactive.js.map +7 -0
- package/dist/commands/mcp.js +40 -0
- package/dist/commands/mcp.js.map +7 -0
- package/dist/commands/mcp_refresh.js +40 -0
- package/dist/commands/mcp_refresh.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/plugin/AddMarketplaceForm.js +62 -0
- package/dist/commands/plugin/AddMarketplaceForm.js.map +7 -0
- package/dist/commands/plugin/ConfirmDialog.js +71 -0
- package/dist/commands/plugin/ConfirmDialog.js.map +7 -0
- package/dist/commands/plugin/ErrorView.js +33 -0
- package/dist/commands/plugin/ErrorView.js.map +7 -0
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js +135 -0
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +7 -0
- package/dist/commands/plugin/InstalledPluginsManager.js +99 -0
- package/dist/commands/plugin/InstalledPluginsManager.js.map +7 -0
- package/dist/commands/plugin/LoadingView.js +14 -0
- package/dist/commands/plugin/LoadingView.js.map +7 -0
- package/dist/commands/plugin/MainMenu.js +57 -0
- package/dist/commands/plugin/MainMenu.js.map +7 -0
- package/dist/commands/plugin/MarketplaceManager.js +155 -0
- package/dist/commands/plugin/MarketplaceManager.js.map +7 -0
- package/dist/commands/plugin/MarketplaceSelector.js +119 -0
- package/dist/commands/plugin/MarketplaceSelector.js.map +7 -0
- package/dist/commands/plugin/PlaceholderScreen.js +16 -0
- package/dist/commands/plugin/PlaceholderScreen.js.map +7 -0
- package/dist/commands/plugin/PluginBrowser.js +180 -0
- package/dist/commands/plugin/PluginBrowser.js.map +7 -0
- package/dist/commands/plugin/PluginDetailsInstall.js +152 -0
- package/dist/commands/plugin/PluginDetailsInstall.js.map +7 -0
- package/dist/commands/plugin/PluginDetailsManage.js +200 -0
- package/dist/commands/plugin/PluginDetailsManage.js.map +7 -0
- package/dist/commands/plugin/components.js +16 -0
- package/dist/commands/plugin/components.js.map +7 -0
- package/dist/commands/plugin/example-usage.js +63 -0
- package/dist/commands/plugin/example-usage.js.map +7 -0
- package/dist/commands/plugin/types.js +1 -0
- package/dist/commands/plugin/types.js.map +7 -0
- package/dist/commands/plugin/utils.js +77 -0
- package/dist/commands/plugin/utils.js.map +7 -0
- package/dist/commands/plugin-interactive.js +446 -0
- package/dist/commands/plugin-interactive.js.map +7 -0
- package/dist/commands/plugin.js +523 -0
- package/dist/commands/plugin.js.map +7 -0
- package/dist/commands/pr_comments.js +61 -0
- package/dist/commands/pr_comments.js.map +7 -0
- package/dist/commands/quit.js +16 -0
- package/dist/commands/quit.js.map +7 -0
- package/dist/commands/refreshCommands.js +43 -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 +164 -0
- package/dist/commands/terminalSetup.js.map +7 -0
- package/dist/commands.js +104 -0
- package/dist/commands.js.map +7 -0
- package/dist/components/AgentResponseBlock.js +41 -0
- package/dist/components/AgentResponseBlock.js.map +7 -0
- package/dist/components/AgentThinkingBlock.js +40 -0
- package/dist/components/AgentThinkingBlock.js.map +7 -0
- package/dist/components/AsciiLogo.js +19 -0
- package/dist/components/AsciiLogo.js.map +7 -0
- package/dist/components/BackgroundTasksPanel.js +124 -0
- package/dist/components/BackgroundTasksPanel.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 +178 -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 +32 -0
- package/dist/components/FileEditToolUpdatedMessage.js.map +7 -0
- package/dist/components/HeaderBar.js +57 -0
- package/dist/components/HeaderBar.js.map +7 -0
- package/dist/components/Help.js +46 -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/HistorySearchOverlay.js +48 -0
- package/dist/components/HistorySearchOverlay.js.map +7 -0
- package/dist/components/InteractionRoundBlock.js +56 -0
- package/dist/components/InteractionRoundBlock.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 +96 -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 +125 -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 +2062 -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/ProjectOnboarding.js +99 -0
- package/dist/components/ProjectOnboarding.js.map +7 -0
- package/dist/components/PromptInput.js +755 -0
- package/dist/components/PromptInput.js.map +7 -0
- package/dist/components/QuitSummary.js +81 -0
- package/dist/components/QuitSummary.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/SpinnerSymbol.js +78 -0
- package/dist/components/SpinnerSymbol.js.map +7 -0
- package/dist/components/StreamingBashOutput.js +70 -0
- package/dist/components/StreamingBashOutput.js.map +7 -0
- package/dist/components/StructuredDiff.js +148 -0
- package/dist/components/StructuredDiff.js.map +7 -0
- package/dist/components/SubagentBlock.js +157 -0
- package/dist/components/SubagentBlock.js.map +7 -0
- package/dist/components/SubagentManager.js +65 -0
- package/dist/components/SubagentManager.js.map +7 -0
- package/dist/components/SubagentProgress.js +109 -0
- package/dist/components/SubagentProgress.js.map +7 -0
- package/dist/components/SubagentStatusMarker.js +37 -0
- package/dist/components/SubagentStatusMarker.js.map +7 -0
- package/dist/components/TaskCard.js +170 -0
- package/dist/components/TaskCard.js.map +7 -0
- package/dist/components/TextInput.js +100 -0
- package/dist/components/TextInput.js.map +7 -0
- package/dist/components/TimelineRenderer.js +31 -0
- package/dist/components/TimelineRenderer.js.map +7 -0
- package/dist/components/TodoChangeBlock.js +29 -0
- package/dist/components/TodoChangeBlock.js.map +7 -0
- package/dist/components/TodoChangeLine.js +22 -0
- package/dist/components/TodoChangeLine.js.map +7 -0
- package/dist/components/TodoItem.js +35 -0
- package/dist/components/TodoItem.js.map +7 -0
- package/dist/components/TodoPanel.js +55 -0
- package/dist/components/TodoPanel.js.map +7 -0
- package/dist/components/TokenWarning.js +19 -0
- package/dist/components/TokenWarning.js.map +7 -0
- package/dist/components/ToolExecutionBlock.js +18 -0
- package/dist/components/ToolExecutionBlock.js.map +7 -0
- package/dist/components/ToolUseLoader.js +24 -0
- package/dist/components/ToolUseLoader.js.map +7 -0
- package/dist/components/TrustDialog.js +71 -0
- package/dist/components/TrustDialog.js.map +7 -0
- package/dist/components/UserQueryBlock.js +12 -0
- package/dist/components/UserQueryBlock.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 +108 -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 +50 -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 +23 -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/claude-asterisk-ascii-art.js +242 -0
- package/dist/constants/claude-asterisk-ascii-art.js.map +7 -0
- package/dist/constants/colors.js +126 -0
- package/dist/constants/colors.js.map +7 -0
- package/dist/constants/compressionPrompts.js +73 -0
- package/dist/constants/compressionPrompts.js.map +7 -0
- package/dist/constants/figures.js +6 -0
- package/dist/constants/figures.js.map +7 -0
- package/dist/constants/macros.js +11 -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 +1034 -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/constants/symbols.js +50 -0
- package/dist/constants/symbols.js.map +7 -0
- package/dist/context/PermissionContext.js +111 -0
- package/dist/context/PermissionContext.js.map +7 -0
- package/dist/context.js +278 -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-wrapper.js +61 -0
- package/dist/entrypoints/cli-wrapper.js.map +7 -0
- package/dist/entrypoints/cli.js +1115 -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 +87 -0
- package/dist/hooks/useCanUseTool.js.map +7 -0
- package/dist/hooks/useCancelRequest.js +28 -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/useHistorySearch.js +62 -0
- package/dist/hooks/useHistorySearch.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 +10 -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 +23 -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 +252 -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 +5 -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 +4 -0
- package/dist/permissions.js +194 -0
- package/dist/permissions.js.map +7 -0
- package/dist/query.js +499 -0
- package/dist/query.js.map +7 -0
- package/dist/screens/Doctor.js +22 -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 +671 -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/claude.js +1573 -0
- package/dist/services/claude.js.map +7 -0
- package/dist/services/compressionService.js +210 -0
- package/dist/services/compressionService.js.map +7 -0
- package/dist/services/customCommands.js +437 -0
- package/dist/services/customCommands.js.map +7 -0
- package/dist/services/fileFreshness.js +275 -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/hookExecutor.js +276 -0
- package/dist/services/hookExecutor.js.map +7 -0
- package/dist/services/mainAgentCompressor.js +84 -0
- package/dist/services/mainAgentCompressor.js.map +7 -0
- package/dist/services/mcpClient.js +449 -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 +201 -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 +247 -0
- package/dist/services/oauth.js.map +7 -0
- package/dist/services/openai.js +995 -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/subagentAbortManager.js +95 -0
- package/dist/services/subagentAbortManager.js.map +7 -0
- package/dist/services/subagentCompressor.js +146 -0
- package/dist/services/subagentCompressor.js.map +7 -0
- package/dist/services/systemReminder.js +335 -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/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/BashOutputTool/BashOutputTool.js +120 -0
- package/dist/tools/BashOutputTool/BashOutputTool.js.map +7 -0
- package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +11 -0
- package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +7 -0
- package/dist/tools/BashOutputTool/prompt.js +13 -0
- package/dist/tools/BashOutputTool/prompt.js.map +7 -0
- package/dist/tools/BashTool/BashTool.js +209 -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 +180 -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 +226 -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 +202 -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/KillShellTool/KillShellTool.js +92 -0
- package/dist/tools/KillShellTool/KillShellTool.js.map +7 -0
- package/dist/tools/KillShellTool/KillShellToolResultMessage.js +11 -0
- package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +7 -0
- package/dist/tools/KillShellTool/prompt.js +12 -0
- package/dist/tools/KillShellTool/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 +301 -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/SkillTool/SkillTool.js +209 -0
- package/dist/tools/SkillTool/SkillTool.js.map +7 -0
- package/dist/tools/SkillTool/prompt.js +81 -0
- package/dist/tools/SkillTool/prompt.js.map +7 -0
- package/dist/tools/TaskTool/TaskTool.js +381 -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 +111 -0
- package/dist/tools/TaskTool/prompt.js.map +7 -0
- package/dist/tools/ThinkTool/ThinkTool.js +40 -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 +243 -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 +70 -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/hooks.js +38 -0
- package/dist/types/hooks.js.map +7 -0
- package/dist/types/interactionRound.js +1 -0
- package/dist/types/interactionRound.js.map +7 -0
- package/dist/types/logs.js +1 -0
- package/dist/types/logs.js.map +7 -0
- package/dist/types/marketplace.js +101 -0
- package/dist/types/marketplace.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/types/plugin.js +83 -0
- package/dist/types/plugin.js.map +7 -0
- package/dist/types/subagent.js +1 -0
- package/dist/types/subagent.js.map +7 -0
- package/dist/utils/BackgroundShellManager.js +215 -0
- package/dist/utils/BackgroundShellManager.js.map +7 -0
- package/dist/utils/Cursor.js +315 -0
- package/dist/utils/Cursor.js.map +7 -0
- package/dist/utils/PersistentShell.js +371 -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 +244 -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 +126 -0
- package/dist/utils/autoCompactCore.js.map +7 -0
- package/dist/utils/autoUpdater.js +107 -0
- package/dist/utils/autoUpdater.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/compressionMode.js +47 -0
- package/dist/utils/compressionMode.js.map +7 -0
- package/dist/utils/config.js +651 -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 +889 -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/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/hookManager.js +238 -0
- package/dist/utils/hookManager.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 +329 -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/marketplaceManager.js +474 -0
- package/dist/utils/marketplaceManager.js.map +7 -0
- package/dist/utils/messageContextManager.js +195 -0
- package/dist/utils/messageContextManager.js.map +7 -0
- package/dist/utils/messages.js +650 -0
- package/dist/utils/messages.js.map +7 -0
- package/dist/utils/model.js +677 -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/pluginInstaller.js +491 -0
- package/dist/utils/pluginInstaller.js.map +7 -0
- package/dist/utils/pluginLoader.js +582 -0
- package/dist/utils/pluginLoader.js.map +7 -0
- package/dist/utils/pluginRegistry.js +111 -0
- package/dist/utils/pluginRegistry.js.map +7 -0
- package/dist/utils/pluginValidator.js +774 -0
- package/dist/utils/pluginValidator.js.map +7 -0
- package/dist/utils/ptyCompat.js +125 -0
- package/dist/utils/ptyCompat.js.map +7 -0
- package/dist/utils/replStateMachine.js +145 -0
- package/dist/utils/replStateMachine.js.map +7 -0
- package/dist/utils/ripgrep.js +131 -0
- package/dist/utils/ripgrep.js.map +7 -0
- package/dist/utils/roundConverter.js +262 -0
- package/dist/utils/roundConverter.js.map +7 -0
- package/dist/utils/secureFile.js +483 -0
- package/dist/utils/secureFile.js.map +7 -0
- package/dist/utils/sessionState.js +22 -0
- package/dist/utils/sessionState.js.map +7 -0
- package/dist/utils/skillLoader.js +79 -0
- package/dist/utils/skillLoader.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 +47 -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 +59 -0
- package/dist/utils/thinking.js.map +7 -0
- package/dist/utils/todoChangeCalculator.js +64 -0
- package/dist/utils/todoChangeCalculator.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 +6 -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/version.js +7 -0
- package/dist/version.js.map +7 -0
- package/dist/yoga.wasm +0 -0
- package/package.json +113 -0
- package/scripts/postinstall.js +18 -0
- package/yoga.wasm +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/pluginValidator.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Plugin Validation System\n *\n * Validates plugin manifests and component files for correctness.\n * Checks for proper structure, required fields, and file existence.\n */\n\nimport fs from 'fs'\nimport path from 'path'\nimport matter from 'gray-matter'\nimport semver from 'semver'\nimport { z } from 'zod'\nimport { PluginManifestSchema, type PluginManifest, type HookEvent } from '../types/plugin.js'\n\n/**\n * Validation error details\n */\nexport interface ValidationError {\n type: 'manifest' | 'agent' | 'command' | 'skill' | 'hook' | 'mcp' | 'dependency' | 'engine'\n file?: string\n message: string\n details?: any\n}\n\n/**\n * Validation warning details\n */\nexport interface ValidationWarning {\n type: string\n file?: string\n message: string\n}\n\n/**\n * Complete validation result\n */\nexport interface ValidationResult {\n valid: boolean\n errors: ValidationError[]\n warnings: ValidationWarning[]\n}\n\n/**\n * Agent YAML frontmatter schema\n */\nconst AgentFrontmatterSchema = z.object({\n name: z.string().min(1, 'Agent name is required'),\n description: z.string().min(1, 'Agent description is required'),\n tools: z.union([\n z.string(), // \"*\" for all tools\n z.array(z.string()).min(1, 'At least one tool must be specified'),\n ]).optional(),\n model: z.string().optional(),\n})\n\n/**\n * Command YAML frontmatter schema\n */\nconst CommandFrontmatterSchema = z.object({\n name: z.string().min(1, 'Command name is required'),\n description: z.string().optional(),\n aliases: z.array(z.string()).optional(),\n enabled: z.boolean().optional(),\n hidden: z.boolean().optional(),\n progressMessage: z.string().optional(),\n argNames: z.array(z.string()).optional(),\n 'allowed-tools': z.array(z.string()).optional(),\n})\n\n/**\n * Skill YAML frontmatter schema\n */\nconst SkillFrontmatterSchema = z.object({\n name: z.string().min(1, 'Skill name is required'),\n description: z.string().min(1, 'Skill description is required'),\n})\n\n/**\n * Hook configuration schema\n */\nconst HookConfigSchema = z.object({\n event: z.enum([\n 'PreToolUse',\n 'PostToolUse',\n 'UserPromptSubmit',\n 'SessionStart',\n 'SessionEnd',\n 'Stop',\n 'SubagentStop',\n 'Notification',\n 'PreCompact',\n ] as const),\n matcher: z.string().optional(),\n type: z.enum(['command', 'message', 'notification']),\n command: z.string().optional(),\n message: z.string().optional(),\n blocking: z.boolean().optional(),\n timeout: z.number().optional(),\n})\n\n/**\n * MCP Server configuration schema\n */\nconst MCPServerConfigSchema = z.object({\n command: z.string().min(1, 'MCP server command is required'),\n args: z.array(z.string()).optional(),\n env: z.record(z.string()).optional(),\n timeout: z.number().optional(),\n})\n\n/**\n * Validate complete plugin including manifest and all components\n */\nexport async function validatePlugin(pluginPath: string): Promise<ValidationResult> {\n const errors: ValidationError[] = []\n const warnings: ValidationWarning[] = []\n\n // Check if plugin directory exists\n if (!fs.existsSync(pluginPath)) {\n return {\n valid: false,\n errors: [{\n type: 'manifest',\n message: `Plugin directory does not exist: ${pluginPath}`,\n }],\n warnings: [],\n }\n }\n\n // Check if it's a directory\n const stats = fs.statSync(pluginPath)\n if (!stats.isDirectory()) {\n return {\n valid: false,\n errors: [{\n type: 'manifest',\n message: `Plugin path is not a directory: ${pluginPath}`,\n }],\n warnings: [],\n }\n }\n\n // Validate manifest\n const manifestPath = path.join(pluginPath, 'plugin.json')\n if (!fs.existsSync(manifestPath)) {\n return {\n valid: false,\n errors: [{\n type: 'manifest',\n file: 'plugin.json',\n message: 'Plugin manifest (plugin.json) not found',\n }],\n warnings: [],\n }\n }\n\n let manifest: PluginManifest\n try {\n const manifestContent = fs.readFileSync(manifestPath, 'utf-8')\n const manifestData = JSON.parse(manifestContent)\n\n // Validate with Zod schema\n const manifestResult = validateManifest(manifestData)\n errors.push(...manifestResult.errors)\n warnings.push(...manifestResult.warnings)\n\n if (!manifestResult.valid) {\n return { valid: false, errors, warnings }\n }\n\n manifest = manifestData as PluginManifest\n } catch (error) {\n return {\n valid: false,\n errors: [{\n type: 'manifest',\n file: 'plugin.json',\n message: `Failed to parse manifest: ${error instanceof Error ? error.message : String(error)}`,\n details: error,\n }],\n warnings: [],\n }\n }\n\n // Validate engines compatibility\n if (manifest.engines) {\n const engineResult = await validateEngines(manifest.engines)\n errors.push(...engineResult.errors)\n warnings.push(...engineResult.warnings)\n }\n\n // Validate agent files\n if (manifest.agents && manifest.agents.length > 0) {\n for (const agentFile of manifest.agents) {\n const agentPath = path.join(pluginPath, agentFile)\n const result = validateAgentFile(agentPath)\n errors.push(...result.errors)\n warnings.push(...result.warnings)\n }\n }\n\n // Validate command files\n if (manifest.commands && manifest.commands.length > 0) {\n for (const commandFile of manifest.commands) {\n const commandPath = path.join(pluginPath, commandFile)\n const result = validateCommandFile(commandPath)\n errors.push(...result.errors)\n warnings.push(...result.warnings)\n }\n }\n\n // Validate skill files\n if (manifest.skills && manifest.skills.length > 0) {\n for (const skillFile of manifest.skills) {\n const skillPath = path.join(pluginPath, skillFile)\n const result = validateSkillFile(skillPath)\n errors.push(...result.errors)\n warnings.push(...result.warnings)\n }\n }\n\n // Validate hook files\n if (manifest.hooks && manifest.hooks.length > 0) {\n for (const hookFile of manifest.hooks) {\n const hookPath = path.join(pluginPath, hookFile)\n const result = validateHookFile(hookPath)\n errors.push(...result.errors)\n warnings.push(...result.warnings)\n }\n }\n\n // Validate MCP server configs\n if (manifest.mcpServers && manifest.mcpServers.length > 0) {\n for (const mcpFile of manifest.mcpServers) {\n const mcpPath = path.join(pluginPath, mcpFile)\n const result = validateMCPServerFile(mcpPath)\n errors.push(...result.errors)\n warnings.push(...result.warnings)\n }\n }\n\n // Check for unused files warning\n const componentFiles = new Set([\n ...(manifest.agents || []),\n ...(manifest.commands || []),\n ...(manifest.skills || []),\n ...(manifest.hooks || []),\n ...(manifest.mcpServers || []),\n ])\n\n if (componentFiles.size === 0) {\n warnings.push({\n type: 'manifest',\n message: 'Plugin has no components (agents, commands, skills, hooks, or MCP servers)',\n })\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n }\n}\n\n/**\n * Validate plugin manifest schema\n */\nexport function validateManifest(manifest: any): ValidationResult {\n const errors: ValidationError[] = []\n const warnings: ValidationWarning[] = []\n\n // Check if manifest is an object\n if (!manifest || typeof manifest !== 'object') {\n return {\n valid: false,\n errors: [{\n type: 'manifest',\n message: 'Manifest must be a valid JSON object',\n }],\n warnings: [],\n }\n }\n\n // Validate with Zod schema\n try {\n PluginManifestSchema.parse(manifest)\n } catch (error) {\n if (error instanceof z.ZodError) {\n for (const issue of error.errors) {\n errors.push({\n type: 'manifest',\n message: `${issue.path.join('.')}: ${issue.message}`,\n details: issue,\n })\n }\n } else {\n errors.push({\n type: 'manifest',\n message: `Manifest validation failed: ${error instanceof Error ? error.message : String(error)}`,\n details: error,\n })\n }\n }\n\n // Additional validations\n if (manifest.name && !/^[a-z0-9-]+$/.test(manifest.name)) {\n errors.push({\n type: 'manifest',\n message: 'Plugin name must be lowercase alphanumeric with hyphens only',\n details: { name: manifest.name },\n })\n }\n\n // Validate version format (semver)\n if (manifest.version && !semver.valid(manifest.version)) {\n errors.push({\n type: 'manifest',\n message: `Invalid version format: ${manifest.version}. Must follow semver (e.g., 1.0.0)`,\n details: { version: manifest.version },\n })\n }\n\n // Validate URLs\n if (manifest.homepage) {\n try {\n new URL(manifest.homepage)\n } catch {\n errors.push({\n type: 'manifest',\n message: `Invalid homepage URL: ${manifest.homepage}`,\n })\n }\n }\n\n if (manifest.repository) {\n try {\n new URL(manifest.repository)\n } catch {\n errors.push({\n type: 'manifest',\n message: `Invalid repository URL: ${manifest.repository}`,\n })\n }\n }\n\n // Warn about missing optional but recommended fields\n if (!manifest.description) {\n warnings.push({\n type: 'manifest',\n message: 'Missing recommended field: description',\n })\n }\n\n if (!manifest.author) {\n warnings.push({\n type: 'manifest',\n message: 'Missing recommended field: author',\n })\n }\n\n if (!manifest.license) {\n warnings.push({\n type: 'manifest',\n message: 'Missing recommended field: license',\n })\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n }\n}\n\n/**\n * Validate engine version requirements\n */\nasync function validateEngines(engines: { minto?: string; 'claude-code'?: string; node?: string }): Promise<ValidationResult> {\n const errors: ValidationError[] = []\n const warnings: ValidationWarning[] = []\n\n // Validate minto version\n if (engines.minto) {\n const validRange = semver.validRange(engines.minto)\n if (!validRange) {\n errors.push({\n type: 'engine',\n message: `Invalid minto version range: ${engines.minto}`,\n details: { engine: 'minto', range: engines.minto },\n })\n } else {\n // Check compatibility with current version\n try {\n const { VERSION } = await import('../version.js')\n if (!semver.satisfies(VERSION, engines.minto)) {\n warnings.push({\n type: 'engine',\n message: `Plugin requires minto ${engines.minto}, but current version is ${VERSION}`,\n })\n }\n } catch {\n // Unable to check current version, skip this validation\n }\n }\n }\n\n // Validate node version\n if (engines.node) {\n const validRange = semver.validRange(engines.node)\n if (!validRange) {\n errors.push({\n type: 'engine',\n message: `Invalid node version range: ${engines.node}`,\n details: { engine: 'node', range: engines.node },\n })\n } else {\n // Check compatibility with current node version\n if (!semver.satisfies(process.version, engines.node)) {\n warnings.push({\n type: 'engine',\n message: `Plugin requires node ${engines.node}, but current version is ${process.version}`,\n })\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n }\n}\n\n/**\n * Validate agent file\n */\nexport function validateAgentFile(filePath: string): ValidationResult {\n const errors: ValidationError[] = []\n const warnings: ValidationWarning[] = []\n\n // Check file exists\n if (!fs.existsSync(filePath)) {\n return {\n valid: false,\n errors: [{\n type: 'agent',\n file: filePath,\n message: `Agent file not found: ${filePath}`,\n }],\n warnings: [],\n }\n }\n\n // Check file extension\n const ext = path.extname(filePath)\n if (ext !== '.md' && ext !== '.markdown') {\n warnings.push({\n type: 'agent',\n file: filePath,\n message: `Agent file should have .md or .markdown extension, got: ${ext}`,\n })\n }\n\n // Parse YAML frontmatter\n try {\n const content = fs.readFileSync(filePath, 'utf-8')\n const parsed = matter(content)\n\n // Validate frontmatter exists\n if (!parsed.data || Object.keys(parsed.data).length === 0) {\n errors.push({\n type: 'agent',\n file: filePath,\n message: 'Agent file must have YAML frontmatter',\n })\n return { valid: false, errors, warnings }\n }\n\n // Validate frontmatter schema\n try {\n AgentFrontmatterSchema.parse(parsed.data)\n } catch (error) {\n if (error instanceof z.ZodError) {\n for (const issue of error.errors) {\n errors.push({\n type: 'agent',\n file: filePath,\n message: `Frontmatter ${issue.path.join('.')}: ${issue.message}`,\n details: issue,\n })\n }\n }\n }\n\n // Check for content\n if (!parsed.content || parsed.content.trim().length === 0) {\n warnings.push({\n type: 'agent',\n file: filePath,\n message: 'Agent file has no content after frontmatter',\n })\n }\n\n // Validate tools field\n if (parsed.data.tools) {\n if (Array.isArray(parsed.data.tools)) {\n if (parsed.data.tools.length === 0) {\n errors.push({\n type: 'agent',\n file: filePath,\n message: 'Tools array cannot be empty (use \"*\" for all tools or omit the field)',\n })\n }\n } else if (parsed.data.tools !== '*') {\n errors.push({\n type: 'agent',\n file: filePath,\n message: 'Tools must be an array of tool names or \"*\" for all tools',\n details: { tools: parsed.data.tools },\n })\n }\n }\n\n } catch (error) {\n errors.push({\n type: 'agent',\n file: filePath,\n message: `Failed to parse agent file: ${error instanceof Error ? error.message : String(error)}`,\n details: error,\n })\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n }\n}\n\n/**\n * Validate command file\n */\nexport function validateCommandFile(filePath: string): ValidationResult {\n const errors: ValidationError[] = []\n const warnings: ValidationWarning[] = []\n\n // Check file exists\n if (!fs.existsSync(filePath)) {\n return {\n valid: false,\n errors: [{\n type: 'command',\n file: filePath,\n message: `Command file not found: ${filePath}`,\n }],\n warnings: [],\n }\n }\n\n // Check file extension\n const ext = path.extname(filePath)\n if (ext !== '.md' && ext !== '.markdown') {\n warnings.push({\n type: 'command',\n file: filePath,\n message: `Command file should have .md or .markdown extension, got: ${ext}`,\n })\n }\n\n // Parse YAML frontmatter\n try {\n const content = fs.readFileSync(filePath, 'utf-8')\n const parsed = matter(content)\n\n // Validate frontmatter exists\n if (!parsed.data || Object.keys(parsed.data).length === 0) {\n errors.push({\n type: 'command',\n file: filePath,\n message: 'Command file must have YAML frontmatter',\n })\n return { valid: false, errors, warnings }\n }\n\n // Validate frontmatter schema\n try {\n CommandFrontmatterSchema.parse(parsed.data)\n } catch (error) {\n if (error instanceof z.ZodError) {\n for (const issue of error.errors) {\n errors.push({\n type: 'command',\n file: filePath,\n message: `Frontmatter ${issue.path.join('.')}: ${issue.message}`,\n details: issue,\n })\n }\n }\n }\n\n // Check for content\n if (!parsed.content || parsed.content.trim().length === 0) {\n warnings.push({\n type: 'command',\n file: filePath,\n message: 'Command file has no content after frontmatter',\n })\n }\n\n // Validate name matches filename\n const filename = path.basename(filePath, path.extname(filePath))\n if (parsed.data.name && parsed.data.name !== filename) {\n warnings.push({\n type: 'command',\n file: filePath,\n message: `Command name \"${parsed.data.name}\" does not match filename \"${filename}\"`,\n })\n }\n\n } catch (error) {\n errors.push({\n type: 'command',\n file: filePath,\n message: `Failed to parse command file: ${error instanceof Error ? error.message : String(error)}`,\n details: error,\n })\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n }\n}\n\n/**\n * Validate skill file\n */\nexport function validateSkillFile(filePath: string): ValidationResult {\n const errors: ValidationError[] = []\n const warnings: ValidationWarning[] = []\n\n // Check file exists\n if (!fs.existsSync(filePath)) {\n return {\n valid: false,\n errors: [{\n type: 'skill',\n file: filePath,\n message: `Skill file not found: ${filePath}`,\n }],\n warnings: [],\n }\n }\n\n // Check file extension\n const ext = path.extname(filePath)\n if (ext !== '.md' && ext !== '.markdown') {\n warnings.push({\n type: 'skill',\n file: filePath,\n message: `Skill file should have .md or .markdown extension, got: ${ext}`,\n })\n }\n\n // Parse YAML frontmatter\n try {\n const content = fs.readFileSync(filePath, 'utf-8')\n const parsed = matter(content)\n\n // Validate frontmatter exists\n if (!parsed.data || Object.keys(parsed.data).length === 0) {\n errors.push({\n type: 'skill',\n file: filePath,\n message: 'Skill file must have YAML frontmatter',\n })\n return { valid: false, errors, warnings }\n }\n\n // Validate frontmatter schema\n try {\n SkillFrontmatterSchema.parse(parsed.data)\n } catch (error) {\n if (error instanceof z.ZodError) {\n for (const issue of error.errors) {\n errors.push({\n type: 'skill',\n file: filePath,\n message: `Frontmatter ${issue.path.join('.')}: ${issue.message}`,\n details: issue,\n })\n }\n }\n }\n\n // Check for content\n if (!parsed.content || parsed.content.trim().length === 0) {\n warnings.push({\n type: 'skill',\n file: filePath,\n message: 'Skill file has no content after frontmatter',\n })\n }\n\n } catch (error) {\n errors.push({\n type: 'skill',\n file: filePath,\n message: `Failed to parse skill file: ${error instanceof Error ? error.message : String(error)}`,\n details: error,\n })\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n }\n}\n\n/**\n * Validate hook file\n */\nexport function validateHookFile(filePath: string): ValidationResult {\n const errors: ValidationError[] = []\n const warnings: ValidationWarning[] = []\n\n // Check file exists\n if (!fs.existsSync(filePath)) {\n return {\n valid: false,\n errors: [{\n type: 'hook',\n file: filePath,\n message: `Hook file not found: ${filePath}`,\n }],\n warnings: [],\n }\n }\n\n // Check file extension\n const ext = path.extname(filePath)\n const validExtensions = ['.js', '.mjs', '.ts', '.tsx', '.json']\n if (!validExtensions.includes(ext)) {\n errors.push({\n type: 'hook',\n file: filePath,\n message: `Hook file must have extension: ${validExtensions.join(', ')}. Got: ${ext}`,\n })\n return { valid: false, errors, warnings }\n }\n\n // For JSON hook configs, validate structure\n if (ext === '.json') {\n try {\n const content = fs.readFileSync(filePath, 'utf-8')\n const config = JSON.parse(content)\n\n // Validate hook config schema\n try {\n HookConfigSchema.parse(config)\n } catch (error) {\n if (error instanceof z.ZodError) {\n for (const issue of error.errors) {\n errors.push({\n type: 'hook',\n file: filePath,\n message: `Hook config ${issue.path.join('.')}: ${issue.message}`,\n details: issue,\n })\n }\n }\n }\n\n // Type-specific validation\n if (config.type === 'command' && !config.command) {\n errors.push({\n type: 'hook',\n file: filePath,\n message: 'Hook type \"command\" requires a \"command\" field',\n })\n }\n\n if (config.type === 'message' && !config.message) {\n errors.push({\n type: 'hook',\n file: filePath,\n message: 'Hook type \"message\" requires a \"message\" field',\n })\n }\n\n } catch (error) {\n errors.push({\n type: 'hook',\n file: filePath,\n message: `Failed to parse hook config: ${error instanceof Error ? error.message : String(error)}`,\n details: error,\n })\n }\n } else {\n // For JS/TS files, just check they're readable\n try {\n fs.readFileSync(filePath, 'utf-8')\n } catch (error) {\n errors.push({\n type: 'hook',\n file: filePath,\n message: `Failed to read hook file: ${error instanceof Error ? error.message : String(error)}`,\n details: error,\n })\n }\n\n // Warn about JS/TS hooks needing runtime validation\n warnings.push({\n type: 'hook',\n file: filePath,\n message: 'JavaScript/TypeScript hooks will be validated at runtime',\n })\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n }\n}\n\n/**\n * Validate MCP server configuration file\n */\nexport function validateMCPServerFile(filePath: string): ValidationResult {\n const errors: ValidationError[] = []\n const warnings: ValidationWarning[] = []\n\n // Check file exists\n if (!fs.existsSync(filePath)) {\n return {\n valid: false,\n errors: [{\n type: 'mcp',\n file: filePath,\n message: `MCP server config file not found: ${filePath}`,\n }],\n warnings: [],\n }\n }\n\n // Check file extension\n const ext = path.extname(filePath)\n if (ext !== '.json') {\n errors.push({\n type: 'mcp',\n file: filePath,\n message: `MCP server config must be a JSON file, got: ${ext}`,\n })\n return { valid: false, errors, warnings }\n }\n\n // Parse and validate JSON\n try {\n const content = fs.readFileSync(filePath, 'utf-8')\n const config = JSON.parse(content)\n\n // Validate MCP config schema\n try {\n MCPServerConfigSchema.parse(config)\n } catch (error) {\n if (error instanceof z.ZodError) {\n for (const issue of error.errors) {\n errors.push({\n type: 'mcp',\n file: filePath,\n message: `MCP config ${issue.path.join('.')}: ${issue.message}`,\n details: issue,\n })\n }\n }\n }\n\n // Validate command is not empty\n if (config.command && config.command.trim().length === 0) {\n errors.push({\n type: 'mcp',\n file: filePath,\n message: 'MCP server command cannot be empty',\n })\n }\n\n // Warn about timeout\n if (config.timeout && config.timeout < 1000) {\n warnings.push({\n type: 'mcp',\n file: filePath,\n message: `MCP server timeout is very low (${config.timeout}ms), consider increasing`,\n })\n }\n\n } catch (error) {\n errors.push({\n type: 'mcp',\n file: filePath,\n message: `Failed to parse MCP server config: ${error instanceof Error ? error.message : String(error)}`,\n details: error,\n })\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n }\n}\n\n/**\n * Validate plugin dependencies\n */\nexport function validateDependencies(\n dependencies: Record<string, string>,\n installedPackages?: Set<string>\n): ValidationResult {\n const errors: ValidationError[] = []\n const warnings: ValidationWarning[] = []\n\n for (const [pkg, version] of Object.entries(dependencies)) {\n // Validate version format\n const validRange = semver.validRange(version)\n if (!validRange) {\n errors.push({\n type: 'dependency',\n message: `Invalid version range for ${pkg}: ${version}`,\n details: { package: pkg, version },\n })\n }\n\n // Check if installed (if provided)\n if (installedPackages && !installedPackages.has(pkg)) {\n warnings.push({\n type: 'dependency',\n message: `Dependency not installed: ${pkg}@${version}`,\n })\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n }\n}\n\n/**\n * Batch validate multiple plugins\n */\nexport async function validatePlugins(pluginPaths: string[]): Promise<Map<string, ValidationResult>> {\n const results = new Map<string, ValidationResult>()\n\n await Promise.all(\n pluginPaths.map(async (pluginPath) => {\n const result = await validatePlugin(pluginPath)\n results.set(pluginPath, result)\n })\n )\n\n return results\n}\n\n/**\n * Format validation result as human-readable string\n */\nexport function formatValidationResult(result: ValidationResult, pluginName?: string): string {\n const lines: string[] = []\n\n if (pluginName) {\n lines.push(`Plugin: ${pluginName}`)\n }\n\n if (result.valid) {\n lines.push('\u2713 Validation passed')\n } else {\n lines.push(`\u2717 Validation failed with ${result.errors.length} error(s)`)\n }\n\n if (result.errors.length > 0) {\n lines.push('\\nErrors:')\n for (const error of result.errors) {\n const location = error.file ? ` (${error.file})` : ''\n lines.push(` \u2022 [${error.type}]${location} ${error.message}`)\n }\n }\n\n if (result.warnings.length > 0) {\n lines.push('\\nWarnings:')\n for (const warning of result.warnings) {\n const location = warning.file ? ` (${warning.file})` : ''\n lines.push(` \u2022 [${warning.type}]${location} ${warning.message}`)\n }\n }\n\n return lines.join('\\n')\n}\n"],
|
|
5
|
+
"mappings": "AAOA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,YAAY;AACnB,OAAO,YAAY;AACnB,SAAS,SAAS;AAClB,SAAS,4BAAiE;AAiC1E,MAAM,yBAAyB,EAAE,OAAO;AAAA,EACtC,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,wBAAwB;AAAA,EAChD,aAAa,EAAE,OAAO,EAAE,IAAI,GAAG,+BAA+B;AAAA,EAC9D,OAAO,EAAE,MAAM;AAAA,IACb,EAAE,OAAO;AAAA;AAAA,IACT,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,GAAG,qCAAqC;AAAA,EAClE,CAAC,EAAE,SAAS;AAAA,EACZ,OAAO,EAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAKD,MAAM,2BAA2B,EAAE,OAAO;AAAA,EACxC,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,0BAA0B;AAAA,EAClD,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACtC,SAAS,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC9B,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC7B,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,EACrC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACvC,iBAAiB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAChD,CAAC;AAKD,MAAM,yBAAyB,EAAE,OAAO;AAAA,EACtC,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,wBAAwB;AAAA,EAChD,aAAa,EAAE,OAAO,EAAE,IAAI,GAAG,+BAA+B;AAChE,CAAC;AAKD,MAAM,mBAAmB,EAAE,OAAO;AAAA,EAChC,OAAO,EAAE,KAAK;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAU;AAAA,EACV,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,MAAM,EAAE,KAAK,CAAC,WAAW,WAAW,cAAc,CAAC;AAAA,EACnD,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC/B,SAAS,EAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;AAKD,MAAM,wBAAwB,EAAE,OAAO;AAAA,EACrC,SAAS,EAAE,OAAO,EAAE,IAAI,GAAG,gCAAgC;AAAA,EAC3D,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,SAAS,EAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;AAKD,eAAsB,eAAe,YAA+C;AAClF,QAAM,SAA4B,CAAC;AACnC,QAAM,WAAgC,CAAC;AAGvC,MAAI,CAAC,GAAG,WAAW,UAAU,GAAG;AAC9B,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ,CAAC;AAAA,QACP,MAAM;AAAA,QACN,SAAS,oCAAoC,UAAU;AAAA,MACzD,CAAC;AAAA,MACD,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAGA,QAAM,QAAQ,GAAG,SAAS,UAAU;AACpC,MAAI,CAAC,MAAM,YAAY,GAAG;AACxB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ,CAAC;AAAA,QACP,MAAM;AAAA,QACN,SAAS,mCAAmC,UAAU;AAAA,MACxD,CAAC;AAAA,MACD,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAGA,QAAM,eAAe,KAAK,KAAK,YAAY,aAAa;AACxD,MAAI,CAAC,GAAG,WAAW,YAAY,GAAG;AAChC,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ,CAAC;AAAA,QACP,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,MACD,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,kBAAkB,GAAG,aAAa,cAAc,OAAO;AAC7D,UAAM,eAAe,KAAK,MAAM,eAAe;AAG/C,UAAM,iBAAiB,iBAAiB,YAAY;AACpD,WAAO,KAAK,GAAG,eAAe,MAAM;AACpC,aAAS,KAAK,GAAG,eAAe,QAAQ;AAExC,QAAI,CAAC,eAAe,OAAO;AACzB,aAAO,EAAE,OAAO,OAAO,QAAQ,SAAS;AAAA,IAC1C;AAEA,eAAW;AAAA,EACb,SAAS,OAAO;AACd,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ,CAAC;AAAA,QACP,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAC5F,SAAS;AAAA,MACX,CAAC;AAAA,MACD,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAGA,MAAI,SAAS,SAAS;AACpB,UAAM,eAAe,MAAM,gBAAgB,SAAS,OAAO;AAC3D,WAAO,KAAK,GAAG,aAAa,MAAM;AAClC,aAAS,KAAK,GAAG,aAAa,QAAQ;AAAA,EACxC;AAGA,MAAI,SAAS,UAAU,SAAS,OAAO,SAAS,GAAG;AACjD,eAAW,aAAa,SAAS,QAAQ;AACvC,YAAM,YAAY,KAAK,KAAK,YAAY,SAAS;AACjD,YAAM,SAAS,kBAAkB,SAAS;AAC1C,aAAO,KAAK,GAAG,OAAO,MAAM;AAC5B,eAAS,KAAK,GAAG,OAAO,QAAQ;AAAA,IAClC;AAAA,EACF;AAGA,MAAI,SAAS,YAAY,SAAS,SAAS,SAAS,GAAG;AACrD,eAAW,eAAe,SAAS,UAAU;AAC3C,YAAM,cAAc,KAAK,KAAK,YAAY,WAAW;AACrD,YAAM,SAAS,oBAAoB,WAAW;AAC9C,aAAO,KAAK,GAAG,OAAO,MAAM;AAC5B,eAAS,KAAK,GAAG,OAAO,QAAQ;AAAA,IAClC;AAAA,EACF;AAGA,MAAI,SAAS,UAAU,SAAS,OAAO,SAAS,GAAG;AACjD,eAAW,aAAa,SAAS,QAAQ;AACvC,YAAM,YAAY,KAAK,KAAK,YAAY,SAAS;AACjD,YAAM,SAAS,kBAAkB,SAAS;AAC1C,aAAO,KAAK,GAAG,OAAO,MAAM;AAC5B,eAAS,KAAK,GAAG,OAAO,QAAQ;AAAA,IAClC;AAAA,EACF;AAGA,MAAI,SAAS,SAAS,SAAS,MAAM,SAAS,GAAG;AAC/C,eAAW,YAAY,SAAS,OAAO;AACrC,YAAM,WAAW,KAAK,KAAK,YAAY,QAAQ;AAC/C,YAAM,SAAS,iBAAiB,QAAQ;AACxC,aAAO,KAAK,GAAG,OAAO,MAAM;AAC5B,eAAS,KAAK,GAAG,OAAO,QAAQ;AAAA,IAClC;AAAA,EACF;AAGA,MAAI,SAAS,cAAc,SAAS,WAAW,SAAS,GAAG;AACzD,eAAW,WAAW,SAAS,YAAY;AACzC,YAAM,UAAU,KAAK,KAAK,YAAY,OAAO;AAC7C,YAAM,SAAS,sBAAsB,OAAO;AAC5C,aAAO,KAAK,GAAG,OAAO,MAAM;AAC5B,eAAS,KAAK,GAAG,OAAO,QAAQ;AAAA,IAClC;AAAA,EACF;AAGA,QAAM,iBAAiB,oBAAI,IAAI;AAAA,IAC7B,GAAI,SAAS,UAAU,CAAC;AAAA,IACxB,GAAI,SAAS,YAAY,CAAC;AAAA,IAC1B,GAAI,SAAS,UAAU,CAAC;AAAA,IACxB,GAAI,SAAS,SAAS,CAAC;AAAA,IACvB,GAAI,SAAS,cAAc,CAAC;AAAA,EAC9B,CAAC;AAED,MAAI,eAAe,SAAS,GAAG;AAC7B,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACF;AAKO,SAAS,iBAAiB,UAAiC;AAChE,QAAM,SAA4B,CAAC;AACnC,QAAM,WAAgC,CAAC;AAGvC,MAAI,CAAC,YAAY,OAAO,aAAa,UAAU;AAC7C,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ,CAAC;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,MACD,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAGA,MAAI;AACF,yBAAqB,MAAM,QAAQ;AAAA,EACrC,SAAS,OAAO;AACd,QAAI,iBAAiB,EAAE,UAAU;AAC/B,iBAAW,SAAS,MAAM,QAAQ;AAChC,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,GAAG,MAAM,KAAK,KAAK,GAAG,CAAC,KAAK,MAAM,OAAO;AAAA,UAClD,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AACL,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAC9F,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,SAAS,QAAQ,CAAC,eAAe,KAAK,SAAS,IAAI,GAAG;AACxD,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,EAAE,MAAM,SAAS,KAAK;AAAA,IACjC,CAAC;AAAA,EACH;AAGA,MAAI,SAAS,WAAW,CAAC,OAAO,MAAM,SAAS,OAAO,GAAG;AACvD,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS,2BAA2B,SAAS,OAAO;AAAA,MACpD,SAAS,EAAE,SAAS,SAAS,QAAQ;AAAA,IACvC,CAAC;AAAA,EACH;AAGA,MAAI,SAAS,UAAU;AACrB,QAAI;AACF,UAAI,IAAI,SAAS,QAAQ;AAAA,IAC3B,QAAQ;AACN,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,yBAAyB,SAAS,QAAQ;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,SAAS,YAAY;AACvB,QAAI;AACF,UAAI,IAAI,SAAS,UAAU;AAAA,IAC7B,QAAQ;AACN,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,2BAA2B,SAAS,UAAU;AAAA,MACzD,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,CAAC,SAAS,aAAa;AACzB,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,SAAS,QAAQ;AACpB,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,SAAS,SAAS;AACrB,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACF;AAKA,eAAe,gBAAgB,SAA+F;AAC5H,QAAM,SAA4B,CAAC;AACnC,QAAM,WAAgC,CAAC;AAGvC,MAAI,QAAQ,OAAO;AACjB,UAAM,aAAa,OAAO,WAAW,QAAQ,KAAK;AAClD,QAAI,CAAC,YAAY;AACf,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,gCAAgC,QAAQ,KAAK;AAAA,QACtD,SAAS,EAAE,QAAQ,SAAS,OAAO,QAAQ,MAAM;AAAA,MACnD,CAAC;AAAA,IACH,OAAO;AAEL,UAAI;AACF,cAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,eAAe;AAChD,YAAI,CAAC,OAAO,UAAU,SAAS,QAAQ,KAAK,GAAG;AAC7C,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS,yBAAyB,QAAQ,KAAK,4BAA4B,OAAO;AAAA,UACpF,CAAC;AAAA,QACH;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ,MAAM;AAChB,UAAM,aAAa,OAAO,WAAW,QAAQ,IAAI;AACjD,QAAI,CAAC,YAAY;AACf,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,+BAA+B,QAAQ,IAAI;AAAA,QACpD,SAAS,EAAE,QAAQ,QAAQ,OAAO,QAAQ,KAAK;AAAA,MACjD,CAAC;AAAA,IACH,OAAO;AAEL,UAAI,CAAC,OAAO,UAAU,QAAQ,SAAS,QAAQ,IAAI,GAAG;AACpD,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS,wBAAwB,QAAQ,IAAI,4BAA4B,QAAQ,OAAO;AAAA,QAC1F,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACF;AAKO,SAAS,kBAAkB,UAAoC;AACpE,QAAM,SAA4B,CAAC;AACnC,QAAM,WAAgC,CAAC;AAGvC,MAAI,CAAC,GAAG,WAAW,QAAQ,GAAG;AAC5B,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ,CAAC;AAAA,QACP,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,yBAAyB,QAAQ;AAAA,MAC5C,CAAC;AAAA,MACD,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAGA,QAAM,MAAM,KAAK,QAAQ,QAAQ;AACjC,MAAI,QAAQ,SAAS,QAAQ,aAAa;AACxC,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,2DAA2D,GAAG;AAAA,IACzE,CAAC;AAAA,EACH;AAGA,MAAI;AACF,UAAM,UAAU,GAAG,aAAa,UAAU,OAAO;AACjD,UAAM,SAAS,OAAO,OAAO;AAG7B,QAAI,CAAC,OAAO,QAAQ,OAAO,KAAK,OAAO,IAAI,EAAE,WAAW,GAAG;AACzD,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AACD,aAAO,EAAE,OAAO,OAAO,QAAQ,SAAS;AAAA,IAC1C;AAGA,QAAI;AACF,6BAAuB,MAAM,OAAO,IAAI;AAAA,IAC1C,SAAS,OAAO;AACd,UAAI,iBAAiB,EAAE,UAAU;AAC/B,mBAAW,SAAS,MAAM,QAAQ;AAChC,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS,eAAe,MAAM,KAAK,KAAK,GAAG,CAAC,KAAK,MAAM,OAAO;AAAA,YAC9D,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,OAAO,WAAW,OAAO,QAAQ,KAAK,EAAE,WAAW,GAAG;AACzD,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAGA,QAAI,OAAO,KAAK,OAAO;AACrB,UAAI,MAAM,QAAQ,OAAO,KAAK,KAAK,GAAG;AACpC,YAAI,OAAO,KAAK,MAAM,WAAW,GAAG;AAClC,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF,WAAW,OAAO,KAAK,UAAU,KAAK;AACpC,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS,EAAE,OAAO,OAAO,KAAK,MAAM;AAAA,QACtC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EAEF,SAAS,OAAO;AACd,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAC9F,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACF;AAKO,SAAS,oBAAoB,UAAoC;AACtE,QAAM,SAA4B,CAAC;AACnC,QAAM,WAAgC,CAAC;AAGvC,MAAI,CAAC,GAAG,WAAW,QAAQ,GAAG;AAC5B,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ,CAAC;AAAA,QACP,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,2BAA2B,QAAQ;AAAA,MAC9C,CAAC;AAAA,MACD,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAGA,QAAM,MAAM,KAAK,QAAQ,QAAQ;AACjC,MAAI,QAAQ,SAAS,QAAQ,aAAa;AACxC,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,6DAA6D,GAAG;AAAA,IAC3E,CAAC;AAAA,EACH;AAGA,MAAI;AACF,UAAM,UAAU,GAAG,aAAa,UAAU,OAAO;AACjD,UAAM,SAAS,OAAO,OAAO;AAG7B,QAAI,CAAC,OAAO,QAAQ,OAAO,KAAK,OAAO,IAAI,EAAE,WAAW,GAAG;AACzD,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AACD,aAAO,EAAE,OAAO,OAAO,QAAQ,SAAS;AAAA,IAC1C;AAGA,QAAI;AACF,+BAAyB,MAAM,OAAO,IAAI;AAAA,IAC5C,SAAS,OAAO;AACd,UAAI,iBAAiB,EAAE,UAAU;AAC/B,mBAAW,SAAS,MAAM,QAAQ;AAChC,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS,eAAe,MAAM,KAAK,KAAK,GAAG,CAAC,KAAK,MAAM,OAAO;AAAA,YAC9D,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,OAAO,WAAW,OAAO,QAAQ,KAAK,EAAE,WAAW,GAAG;AACzD,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAGA,UAAM,WAAW,KAAK,SAAS,UAAU,KAAK,QAAQ,QAAQ,CAAC;AAC/D,QAAI,OAAO,KAAK,QAAQ,OAAO,KAAK,SAAS,UAAU;AACrD,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,iBAAiB,OAAO,KAAK,IAAI,8BAA8B,QAAQ;AAAA,MAClF,CAAC;AAAA,IACH;AAAA,EAEF,SAAS,OAAO;AACd,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,iCAAiC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAChG,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACF;AAKO,SAAS,kBAAkB,UAAoC;AACpE,QAAM,SAA4B,CAAC;AACnC,QAAM,WAAgC,CAAC;AAGvC,MAAI,CAAC,GAAG,WAAW,QAAQ,GAAG;AAC5B,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ,CAAC;AAAA,QACP,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,yBAAyB,QAAQ;AAAA,MAC5C,CAAC;AAAA,MACD,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAGA,QAAM,MAAM,KAAK,QAAQ,QAAQ;AACjC,MAAI,QAAQ,SAAS,QAAQ,aAAa;AACxC,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,2DAA2D,GAAG;AAAA,IACzE,CAAC;AAAA,EACH;AAGA,MAAI;AACF,UAAM,UAAU,GAAG,aAAa,UAAU,OAAO;AACjD,UAAM,SAAS,OAAO,OAAO;AAG7B,QAAI,CAAC,OAAO,QAAQ,OAAO,KAAK,OAAO,IAAI,EAAE,WAAW,GAAG;AACzD,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AACD,aAAO,EAAE,OAAO,OAAO,QAAQ,SAAS;AAAA,IAC1C;AAGA,QAAI;AACF,6BAAuB,MAAM,OAAO,IAAI;AAAA,IAC1C,SAAS,OAAO;AACd,UAAI,iBAAiB,EAAE,UAAU;AAC/B,mBAAW,SAAS,MAAM,QAAQ;AAChC,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS,eAAe,MAAM,KAAK,KAAK,GAAG,CAAC,KAAK,MAAM,OAAO;AAAA,YAC9D,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,OAAO,WAAW,OAAO,QAAQ,KAAK,EAAE,WAAW,GAAG;AACzD,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EAEF,SAAS,OAAO;AACd,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAC9F,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACF;AAKO,SAAS,iBAAiB,UAAoC;AACnE,QAAM,SAA4B,CAAC;AACnC,QAAM,WAAgC,CAAC;AAGvC,MAAI,CAAC,GAAG,WAAW,QAAQ,GAAG;AAC5B,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ,CAAC;AAAA,QACP,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,wBAAwB,QAAQ;AAAA,MAC3C,CAAC;AAAA,MACD,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAGA,QAAM,MAAM,KAAK,QAAQ,QAAQ;AACjC,QAAM,kBAAkB,CAAC,OAAO,QAAQ,OAAO,QAAQ,OAAO;AAC9D,MAAI,CAAC,gBAAgB,SAAS,GAAG,GAAG;AAClC,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,kCAAkC,gBAAgB,KAAK,IAAI,CAAC,UAAU,GAAG;AAAA,IACpF,CAAC;AACD,WAAO,EAAE,OAAO,OAAO,QAAQ,SAAS;AAAA,EAC1C;AAGA,MAAI,QAAQ,SAAS;AACnB,QAAI;AACF,YAAM,UAAU,GAAG,aAAa,UAAU,OAAO;AACjD,YAAM,SAAS,KAAK,MAAM,OAAO;AAGjC,UAAI;AACF,yBAAiB,MAAM,MAAM;AAAA,MAC/B,SAAS,OAAO;AACd,YAAI,iBAAiB,EAAE,UAAU;AAC/B,qBAAW,SAAS,MAAM,QAAQ;AAChC,mBAAO,KAAK;AAAA,cACV,MAAM;AAAA,cACN,MAAM;AAAA,cACN,SAAS,eAAe,MAAM,KAAK,KAAK,GAAG,CAAC,KAAK,MAAM,OAAO;AAAA,cAC9D,SAAS;AAAA,YACX,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAGA,UAAI,OAAO,SAAS,aAAa,CAAC,OAAO,SAAS;AAChD,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAEA,UAAI,OAAO,SAAS,aAAa,CAAC,OAAO,SAAS;AAChD,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAAA,IAEF,SAAS,OAAO;AACd,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,gCAAgC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAC/F,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AAEL,QAAI;AACF,SAAG,aAAa,UAAU,OAAO;AAAA,IACnC,SAAS,OAAO;AACd,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAC5F,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAGA,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACF;AAKO,SAAS,sBAAsB,UAAoC;AACxE,QAAM,SAA4B,CAAC;AACnC,QAAM,WAAgC,CAAC;AAGvC,MAAI,CAAC,GAAG,WAAW,QAAQ,GAAG;AAC5B,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ,CAAC;AAAA,QACP,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,qCAAqC,QAAQ;AAAA,MACxD,CAAC;AAAA,MACD,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAGA,QAAM,MAAM,KAAK,QAAQ,QAAQ;AACjC,MAAI,QAAQ,SAAS;AACnB,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,+CAA+C,GAAG;AAAA,IAC7D,CAAC;AACD,WAAO,EAAE,OAAO,OAAO,QAAQ,SAAS;AAAA,EAC1C;AAGA,MAAI;AACF,UAAM,UAAU,GAAG,aAAa,UAAU,OAAO;AACjD,UAAM,SAAS,KAAK,MAAM,OAAO;AAGjC,QAAI;AACF,4BAAsB,MAAM,MAAM;AAAA,IACpC,SAAS,OAAO;AACd,UAAI,iBAAiB,EAAE,UAAU;AAC/B,mBAAW,SAAS,MAAM,QAAQ;AAChC,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS,cAAc,MAAM,KAAK,KAAK,GAAG,CAAC,KAAK,MAAM,OAAO;AAAA,YAC7D,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,QAAI,OAAO,WAAW,OAAO,QAAQ,KAAK,EAAE,WAAW,GAAG;AACxD,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAGA,QAAI,OAAO,WAAW,OAAO,UAAU,KAAM;AAC3C,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,mCAAmC,OAAO,OAAO;AAAA,MAC5D,CAAC;AAAA,IACH;AAAA,EAEF,SAAS,OAAO;AACd,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,sCAAsC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACrG,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACF;AAKO,SAAS,qBACd,cACA,mBACkB;AAClB,QAAM,SAA4B,CAAC;AACnC,QAAM,WAAgC,CAAC;AAEvC,aAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,YAAY,GAAG;AAEzD,UAAM,aAAa,OAAO,WAAW,OAAO;AAC5C,QAAI,CAAC,YAAY;AACf,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,6BAA6B,GAAG,KAAK,OAAO;AAAA,QACrD,SAAS,EAAE,SAAS,KAAK,QAAQ;AAAA,MACnC,CAAC;AAAA,IACH;AAGA,QAAI,qBAAqB,CAAC,kBAAkB,IAAI,GAAG,GAAG;AACpD,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,6BAA6B,GAAG,IAAI,OAAO;AAAA,MACtD,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACF;AAKA,eAAsB,gBAAgB,aAA+D;AACnG,QAAM,UAAU,oBAAI,IAA8B;AAElD,QAAM,QAAQ;AAAA,IACZ,YAAY,IAAI,OAAO,eAAe;AACpC,YAAM,SAAS,MAAM,eAAe,UAAU;AAC9C,cAAQ,IAAI,YAAY,MAAM;AAAA,IAChC,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAKO,SAAS,uBAAuB,QAA0B,YAA6B;AAC5F,QAAM,QAAkB,CAAC;AAEzB,MAAI,YAAY;AACd,UAAM,KAAK,WAAW,UAAU,EAAE;AAAA,EACpC;AAEA,MAAI,OAAO,OAAO;AAChB,UAAM,KAAK,0BAAqB;AAAA,EAClC,OAAO;AACL,UAAM,KAAK,iCAA4B,OAAO,OAAO,MAAM,WAAW;AAAA,EACxE;AAEA,MAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,UAAM,KAAK,WAAW;AACtB,eAAW,SAAS,OAAO,QAAQ;AACjC,YAAM,WAAW,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AACnD,YAAM,KAAK,aAAQ,MAAM,IAAI,IAAI,QAAQ,IAAI,MAAM,OAAO,EAAE;AAAA,IAC9D;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,UAAM,KAAK,aAAa;AACxB,eAAW,WAAW,OAAO,UAAU;AACrC,YAAM,WAAW,QAAQ,OAAO,KAAK,QAAQ,IAAI,MAAM;AACvD,YAAM,KAAK,aAAQ,QAAQ,IAAI,IAAI,QAAQ,IAAI,QAAQ,OAAO,EAAE;AAAA,IAClE;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
function validateRawModeSupport(stream) {
|
|
2
|
+
if (!stream.isTTY) {
|
|
3
|
+
return {
|
|
4
|
+
supported: false,
|
|
5
|
+
reason: "Not a TTY device",
|
|
6
|
+
environmentHint: "piped input or redirected stream"
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
if (typeof stream.setRawMode !== "function") {
|
|
10
|
+
return {
|
|
11
|
+
supported: false,
|
|
12
|
+
reason: "setRawMode method not available",
|
|
13
|
+
environmentHint: "non-standard TTY implementation"
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
const ttyStream = stream;
|
|
18
|
+
ttyStream.setRawMode(true);
|
|
19
|
+
ttyStream.setRawMode(false);
|
|
20
|
+
return { supported: true };
|
|
21
|
+
} catch (err) {
|
|
22
|
+
const error = err;
|
|
23
|
+
const errorCode = error.code || "UNKNOWN";
|
|
24
|
+
const errorMsg = error.message || "Unknown error";
|
|
25
|
+
let environmentHint = "incompatible terminal environment";
|
|
26
|
+
if (errorCode === "EIO") {
|
|
27
|
+
environmentHint = "Docker container, VS Code terminal, or nested tmux/screen";
|
|
28
|
+
} else if (errorCode === "ENOTTY") {
|
|
29
|
+
environmentHint = "not connected to a terminal device";
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
supported: false,
|
|
33
|
+
reason: `setRawMode failed: ${errorCode} - ${errorMsg}`,
|
|
34
|
+
environmentHint
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function requireRawModeOrExit(stream, exitOnFailure = true) {
|
|
39
|
+
const result = validateRawModeSupport(stream);
|
|
40
|
+
if (!result.supported) {
|
|
41
|
+
console.error("");
|
|
42
|
+
console.error("\u274C Interactive mode is not supported in this environment");
|
|
43
|
+
console.error(` Reason: ${result.reason}`);
|
|
44
|
+
if (result.environmentHint) {
|
|
45
|
+
console.error(` Likely: ${result.environmentHint}`);
|
|
46
|
+
}
|
|
47
|
+
console.error("");
|
|
48
|
+
console.error("\u{1F4CB} Solutions:");
|
|
49
|
+
console.error(" 1. Use a native terminal application:");
|
|
50
|
+
console.error(" \u2022 macOS: Terminal.app, iTerm2, Warp");
|
|
51
|
+
console.error(" \u2022 Linux: GNOME Terminal, Konsole, xterm");
|
|
52
|
+
console.error(" \u2022 Windows: Windows Terminal, ConEmu");
|
|
53
|
+
console.error("");
|
|
54
|
+
console.error(" 2. Skip interactive onboarding:");
|
|
55
|
+
console.error(' export ANTHROPIC_API_KEY="sk-ant-..."');
|
|
56
|
+
console.error(" minto config set -g hasCompletedOnboarding true");
|
|
57
|
+
console.error("");
|
|
58
|
+
console.error(" 3. Use non-interactive mode:");
|
|
59
|
+
console.error(' minto --print "your prompt here"');
|
|
60
|
+
console.error(' echo "prompt" | minto');
|
|
61
|
+
console.error("");
|
|
62
|
+
if (exitOnFailure) {
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
function describeTerminalEnvironment() {
|
|
70
|
+
const descriptions = [];
|
|
71
|
+
if (process.stdin.isTTY) {
|
|
72
|
+
descriptions.push("TTY");
|
|
73
|
+
} else {
|
|
74
|
+
descriptions.push("non-TTY");
|
|
75
|
+
}
|
|
76
|
+
if (process.env.TERM) {
|
|
77
|
+
descriptions.push(`TERM=${process.env.TERM}`);
|
|
78
|
+
}
|
|
79
|
+
if (process.env.TERM_PROGRAM) {
|
|
80
|
+
descriptions.push(`${process.env.TERM_PROGRAM}`);
|
|
81
|
+
}
|
|
82
|
+
if (process.env.VSCODE_INJECTION) {
|
|
83
|
+
descriptions.push("VS Code terminal");
|
|
84
|
+
}
|
|
85
|
+
if (process.env.TMUX) {
|
|
86
|
+
descriptions.push("tmux session");
|
|
87
|
+
}
|
|
88
|
+
if (process.env.STY) {
|
|
89
|
+
descriptions.push("GNU screen");
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
const fs = require("fs");
|
|
93
|
+
if (fs.existsSync("/.dockerenv")) {
|
|
94
|
+
descriptions.push("Docker container");
|
|
95
|
+
}
|
|
96
|
+
} catch {
|
|
97
|
+
}
|
|
98
|
+
return descriptions.join(", ");
|
|
99
|
+
}
|
|
100
|
+
function logTerminalDiagnostics() {
|
|
101
|
+
console.log("");
|
|
102
|
+
console.log("\u{1F50D} Terminal Environment Diagnostics:");
|
|
103
|
+
console.log(` Description: ${describeTerminalEnvironment()}`);
|
|
104
|
+
console.log(` stdin.isTTY: ${process.stdin.isTTY}`);
|
|
105
|
+
console.log(` stdout.isTTY: ${process.stdout.isTTY}`);
|
|
106
|
+
console.log(
|
|
107
|
+
` setRawMode available: ${typeof process.stdin.setRawMode === "function"}`
|
|
108
|
+
);
|
|
109
|
+
const result = validateRawModeSupport(process.stdin);
|
|
110
|
+
console.log(` Raw mode supported: ${result.supported}`);
|
|
111
|
+
if (!result.supported) {
|
|
112
|
+
console.log(` Reason: ${result.reason}`);
|
|
113
|
+
if (result.environmentHint) {
|
|
114
|
+
console.log(` Hint: ${result.environmentHint}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
console.log("");
|
|
118
|
+
}
|
|
119
|
+
export {
|
|
120
|
+
describeTerminalEnvironment,
|
|
121
|
+
logTerminalDiagnostics,
|
|
122
|
+
requireRawModeOrExit,
|
|
123
|
+
validateRawModeSupport
|
|
124
|
+
};
|
|
125
|
+
//# sourceMappingURL=ptyCompat.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/ptyCompat.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * PTY Compatibility Utilities\n *\n * This module provides utilities to detect and handle environments where\n * setRawMode is not supported (e.g., Docker containers, VS Code terminals,\n * SSH sessions with incomplete TTY forwarding, etc.)\n */\n\nimport { ReadStream } from 'tty'\n\nexport interface RawModeCheckResult {\n supported: boolean\n reason?: string\n environmentHint?: string\n}\n\n/**\n * Validate if a stream truly supports raw mode\n *\n * Note: Some environments report isTTY=true but still fail on setRawMode\n * with EIO errors. This function performs an actual test.\n *\n * @param stream - The input stream to test (usually process.stdin)\n * @returns Check result with support status and diagnostic info\n */\nexport function validateRawModeSupport(\n stream: NodeJS.ReadStream,\n): RawModeCheckResult {\n // Check 1: Must be a TTY\n if (!stream.isTTY) {\n return {\n supported: false,\n reason: 'Not a TTY device',\n environmentHint: 'piped input or redirected stream',\n }\n }\n\n // Check 2: Must have setRawMode method\n if (typeof (stream as any).setRawMode !== 'function') {\n return {\n supported: false,\n reason: 'setRawMode method not available',\n environmentHint: 'non-standard TTY implementation',\n }\n }\n\n // Check 3: Actually test setRawMode (catches EIO errors)\n try {\n const ttyStream = stream as ReadStream\n ttyStream.setRawMode(true)\n ttyStream.setRawMode(false)\n return { supported: true }\n } catch (err) {\n const error = err as NodeJS.ErrnoException\n const errorCode = error.code || 'UNKNOWN'\n const errorMsg = error.message || 'Unknown error'\n\n // Detect common problematic environments\n let environmentHint = 'incompatible terminal environment'\n\n if (errorCode === 'EIO') {\n // EIO is the most common error in problematic PTY environments\n environmentHint = 'Docker container, VS Code terminal, or nested tmux/screen'\n } else if (errorCode === 'ENOTTY') {\n environmentHint = 'not connected to a terminal device'\n }\n\n return {\n supported: false,\n reason: `setRawMode failed: ${errorCode} - ${errorMsg}`,\n environmentHint,\n }\n }\n}\n\n/**\n * Quick check function that exits the process if raw mode is not supported\n * Use this for commands that absolutely require interactive mode\n *\n * @param stream - The input stream to check\n * @param exitOnFailure - Whether to exit process on failure (default: true)\n */\nexport function requireRawModeOrExit(\n stream: NodeJS.ReadStream,\n exitOnFailure = true,\n): boolean {\n const result = validateRawModeSupport(stream)\n\n if (!result.supported) {\n console.error('')\n console.error('\u274C Interactive mode is not supported in this environment')\n console.error(` Reason: ${result.reason}`)\n if (result.environmentHint) {\n console.error(` Likely: ${result.environmentHint}`)\n }\n console.error('')\n console.error('\uD83D\uDCCB Solutions:')\n console.error(' 1. Use a native terminal application:')\n console.error(' \u2022 macOS: Terminal.app, iTerm2, Warp')\n console.error(' \u2022 Linux: GNOME Terminal, Konsole, xterm')\n console.error(' \u2022 Windows: Windows Terminal, ConEmu')\n console.error('')\n console.error(' 2. Skip interactive onboarding:')\n console.error(' export ANTHROPIC_API_KEY=\"sk-ant-...\"')\n console.error(' minto config set -g hasCompletedOnboarding true')\n console.error('')\n console.error(' 3. Use non-interactive mode:')\n console.error(' minto --print \"your prompt here\"')\n console.error(' echo \"prompt\" | minto')\n console.error('')\n\n if (exitOnFailure) {\n process.exit(1)\n }\n return false\n }\n\n return true\n}\n\n/**\n * Get a user-friendly description of the current terminal environment\n */\nexport function describeTerminalEnvironment(): string {\n const descriptions: string[] = []\n\n if (process.stdin.isTTY) {\n descriptions.push('TTY')\n } else {\n descriptions.push('non-TTY')\n }\n\n if (process.env.TERM) {\n descriptions.push(`TERM=${process.env.TERM}`)\n }\n\n if (process.env.TERM_PROGRAM) {\n descriptions.push(`${process.env.TERM_PROGRAM}`)\n }\n\n // Detect common environments\n if (process.env.VSCODE_INJECTION) {\n descriptions.push('VS Code terminal')\n }\n\n if (process.env.TMUX) {\n descriptions.push('tmux session')\n }\n\n if (process.env.STY) {\n descriptions.push('GNU screen')\n }\n\n // Check if running in Docker\n try {\n const fs = require('fs')\n if (fs.existsSync('/.dockerenv')) {\n descriptions.push('Docker container')\n }\n } catch {\n // Ignore\n }\n\n return descriptions.join(', ')\n}\n\n/**\n * Log diagnostic information about the terminal environment\n * Useful for debugging PTY compatibility issues\n */\nexport function logTerminalDiagnostics(): void {\n console.log('')\n console.log('\uD83D\uDD0D Terminal Environment Diagnostics:')\n console.log(` Description: ${describeTerminalEnvironment()}`)\n console.log(` stdin.isTTY: ${process.stdin.isTTY}`)\n console.log(` stdout.isTTY: ${process.stdout.isTTY}`)\n console.log(\n ` setRawMode available: ${typeof (process.stdin as any).setRawMode === 'function'}`,\n )\n\n const result = validateRawModeSupport(process.stdin)\n console.log(` Raw mode supported: ${result.supported}`)\n if (!result.supported) {\n console.log(` Reason: ${result.reason}`)\n if (result.environmentHint) {\n console.log(` Hint: ${result.environmentHint}`)\n }\n }\n console.log('')\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { useState, useCallback } from "react";
|
|
2
|
+
function useREPLStateMachine(initialState = { type: "Idle" }) {
|
|
3
|
+
const [state, setState] = useState(initialState);
|
|
4
|
+
const transitions = {
|
|
5
|
+
/** 转到空闲状态 */
|
|
6
|
+
toIdle: useCallback(() => {
|
|
7
|
+
setState({ type: "Idle" });
|
|
8
|
+
}, []),
|
|
9
|
+
/** 转到用户输入状态 */
|
|
10
|
+
toUserTyping: useCallback(() => {
|
|
11
|
+
setState({ type: "UserTyping" });
|
|
12
|
+
}, []),
|
|
13
|
+
/** 转到用户已提交状态 */
|
|
14
|
+
toUserSubmitted: useCallback(() => {
|
|
15
|
+
setState({ type: "UserSubmitted" });
|
|
16
|
+
}, []),
|
|
17
|
+
/** 转到 AI 思考状态 */
|
|
18
|
+
toAgentThinking: useCallback((message, spinnerFrame) => {
|
|
19
|
+
setState({ type: "AgentThinking", message, spinnerFrame });
|
|
20
|
+
}, []),
|
|
21
|
+
/** 更新思考消息 (原地更新,不改变状态类型) */
|
|
22
|
+
updateThinkingMessage: useCallback(
|
|
23
|
+
(message, spinnerFrame) => {
|
|
24
|
+
setState((prev) => {
|
|
25
|
+
if (prev.type === "AgentThinking") {
|
|
26
|
+
return { ...prev, message, spinnerFrame };
|
|
27
|
+
}
|
|
28
|
+
return prev;
|
|
29
|
+
});
|
|
30
|
+
},
|
|
31
|
+
[]
|
|
32
|
+
),
|
|
33
|
+
/** 转到工具提议状态 */
|
|
34
|
+
toAgentProposingTool: useCallback(
|
|
35
|
+
(toolUse, toolJSX) => {
|
|
36
|
+
setState({ type: "AgentProposingTool", toolUse, toolJSX });
|
|
37
|
+
},
|
|
38
|
+
[]
|
|
39
|
+
),
|
|
40
|
+
/** 转到工具执行状态 */
|
|
41
|
+
toToolExecuting: useCallback(
|
|
42
|
+
(toolUse, output) => {
|
|
43
|
+
setState({ type: "ToolExecuting", toolUse, output });
|
|
44
|
+
},
|
|
45
|
+
[]
|
|
46
|
+
),
|
|
47
|
+
/** 更新工具执行输出 (原地更新) */
|
|
48
|
+
updateToolOutput: useCallback((output) => {
|
|
49
|
+
setState((prev) => {
|
|
50
|
+
if (prev.type === "ToolExecuting") {
|
|
51
|
+
return { ...prev, output };
|
|
52
|
+
}
|
|
53
|
+
return prev;
|
|
54
|
+
});
|
|
55
|
+
}, []),
|
|
56
|
+
/** 转到 AI 回答状态 */
|
|
57
|
+
toAgentResponding: useCallback(
|
|
58
|
+
(streamingText, isComplete) => {
|
|
59
|
+
setState({ type: "AgentResponding", streamingText, isComplete });
|
|
60
|
+
},
|
|
61
|
+
[]
|
|
62
|
+
),
|
|
63
|
+
/** 更新流式回答文本 (原地更新) */
|
|
64
|
+
updateStreamingText: useCallback(
|
|
65
|
+
(streamingText, isComplete) => {
|
|
66
|
+
setState((prev) => {
|
|
67
|
+
if (prev.type === "AgentResponding") {
|
|
68
|
+
return { ...prev, streamingText, isComplete };
|
|
69
|
+
}
|
|
70
|
+
return prev;
|
|
71
|
+
});
|
|
72
|
+
},
|
|
73
|
+
[]
|
|
74
|
+
),
|
|
75
|
+
/** 转到二元反馈状态 */
|
|
76
|
+
toBinaryFeedback: useCallback((context) => {
|
|
77
|
+
setState({ type: "BinaryFeedback", context });
|
|
78
|
+
}, []),
|
|
79
|
+
/** 转到错误状态 */
|
|
80
|
+
toError: useCallback((error, canRecover = true) => {
|
|
81
|
+
setState({ type: "Error", error, canRecover });
|
|
82
|
+
}, []),
|
|
83
|
+
/** 转到消息选择器状态 */
|
|
84
|
+
toMessageSelector: useCallback(() => {
|
|
85
|
+
setState({ type: "MessageSelector" });
|
|
86
|
+
}, [])
|
|
87
|
+
};
|
|
88
|
+
const is = {
|
|
89
|
+
idle: state.type === "Idle",
|
|
90
|
+
userTyping: state.type === "UserTyping",
|
|
91
|
+
userSubmitted: state.type === "UserSubmitted",
|
|
92
|
+
agentThinking: state.type === "AgentThinking",
|
|
93
|
+
agentProposingTool: state.type === "AgentProposingTool",
|
|
94
|
+
toolExecuting: state.type === "ToolExecuting",
|
|
95
|
+
agentResponding: state.type === "AgentResponding",
|
|
96
|
+
binaryFeedback: state.type === "BinaryFeedback",
|
|
97
|
+
error: state.type === "Error",
|
|
98
|
+
messageSelector: state.type === "MessageSelector",
|
|
99
|
+
/** 是否可以接受用户输入 */
|
|
100
|
+
canAcceptInput: state.type === "Idle" || state.type === "UserTyping" || state.type === "Error",
|
|
101
|
+
/** 是否正在加载 (思考、执行、回答) */
|
|
102
|
+
loading: state.type === "AgentThinking" || state.type === "ToolExecuting" || state.type === "AgentResponding" || state.type === "UserSubmitted",
|
|
103
|
+
/** 是否需要用户交互 (确认工具、二元反馈、消息选择) */
|
|
104
|
+
needsUserInteraction: state.type === "AgentProposingTool" || state.type === "BinaryFeedback" || state.type === "MessageSelector"
|
|
105
|
+
};
|
|
106
|
+
return {
|
|
107
|
+
/** 当前状态 */
|
|
108
|
+
state,
|
|
109
|
+
/** 状态转换函数 */
|
|
110
|
+
transitions,
|
|
111
|
+
/** 状态查询辅助 */
|
|
112
|
+
is,
|
|
113
|
+
/** 直接设置状态 (高级用法) */
|
|
114
|
+
setState
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
function getStateName(state) {
|
|
118
|
+
switch (state.type) {
|
|
119
|
+
case "Idle":
|
|
120
|
+
return "\u23F8 Idle";
|
|
121
|
+
case "UserTyping":
|
|
122
|
+
return "\u2328\uFE0F UserTyping";
|
|
123
|
+
case "UserSubmitted":
|
|
124
|
+
return "\u23F3 UserSubmitted";
|
|
125
|
+
case "AgentThinking":
|
|
126
|
+
return `\u{1F914} AgentThinking: ${state.message}`;
|
|
127
|
+
case "AgentProposingTool":
|
|
128
|
+
return `\u{1F527} AgentProposingTool: ${state.toolUse.name}`;
|
|
129
|
+
case "ToolExecuting":
|
|
130
|
+
return `\u2699\uFE0F ToolExecuting: ${state.toolUse.name}`;
|
|
131
|
+
case "AgentResponding":
|
|
132
|
+
return `\u{1F4AC} AgentResponding (${state.streamingText.length} chars)`;
|
|
133
|
+
case "BinaryFeedback":
|
|
134
|
+
return "\u{1F937} BinaryFeedback";
|
|
135
|
+
case "Error":
|
|
136
|
+
return `\u274C Error: ${state.error}`;
|
|
137
|
+
case "MessageSelector":
|
|
138
|
+
return "\u{1F4DC} MessageSelector";
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
export {
|
|
142
|
+
getStateName,
|
|
143
|
+
useREPLStateMachine
|
|
144
|
+
};
|
|
145
|
+
//# sourceMappingURL=replStateMachine.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/replStateMachine.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * REPL \u72B6\u6001\u673A - Claude Code CLI \u98CE\u683C\n *\n * \u6838\u5FC3\u7406\u5FF5\uFF1A\n * 1. \u663E\u5F0F\u72B6\u6001 - \u6E05\u6670\u5B9A\u4E49\u6BCF\u4E2A REPL \u72B6\u6001\n * 2. \u72B6\u6001\u8F6C\u6362 - \u660E\u786E\u7684\u72B6\u6001\u8F6C\u6362\u51FD\u6570\n * 3. \u6E32\u67D3\u9694\u79BB - \u6BCF\u4E2A\u72B6\u6001\u5BF9\u5E94\u72EC\u7ACB\u7684 UI \u6E32\u67D3\n * 4. \u4E92\u65A5\u4FDD\u8BC1 - \u540C\u4E00\u65F6\u95F4\u53EA\u6709\u4E00\u4E2A\u6D3B\u8DC3\u72B6\u6001\n *\n * \u8FD9\u6D88\u9664\u4E86 REPL.tsx \u4E2D\u590D\u6742\u7684 flag \u7EC4\u5408\u903B\u8F91\n */\n\nimport * as React from 'react'\nimport { useState, useCallback } from 'react'\nimport type { ToolUseBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport type { BinaryFeedbackContext } from '@screens/REPL'\n\n/**\n * REPL \u7684\u6240\u6709\u53EF\u80FD\u72B6\u6001\n *\n * \u57FA\u4E8E Claude Code CLI \u7684\u72B6\u6001\u673A\u8BBE\u8BA1\n */\nexport type REPLState =\n /** \u7A7A\u95F2 - \u7B49\u5F85\u7528\u6237\u8F93\u5165 */\n | { type: 'Idle' }\n\n /** \u7528\u6237\u8F93\u5165\u4E2D - \u7528\u6237\u6B63\u5728\u5E95\u90E8\u8F93\u5165\u6846\u952E\u5165 */\n | { type: 'UserTyping' }\n\n /** \u7528\u6237\u5DF2\u63D0\u4EA4 - \u7B49\u5F85 AI \u5904\u7406 */\n | { type: 'UserSubmitted' }\n\n /** AI \u601D\u8003\u4E2D - \u8BFB\u53D6\u6587\u4EF6\u3001\u5206\u6790\u4EE3\u7801\u7B49 */\n | {\n type: 'AgentThinking'\n /** \u5F53\u524D\u601D\u8003\u9636\u6BB5\u7684\u6D88\u606F (\u4F8B\u5982\uFF1A\"Reading file...\", \"Analyzing code...\") */\n message: string\n /** Spinner \u52A8\u753B\u5E27\u7D22\u5F15 */\n spinnerFrame?: number\n }\n\n /** AI \u63D0\u8BAE\u5DE5\u5177\u6267\u884C - \u7B49\u5F85\u7528\u6237\u786E\u8BA4 */\n | {\n type: 'AgentProposingTool'\n /** \u8981\u6267\u884C\u7684\u5DE5\u5177\u8C03\u7528 */\n toolUse: ToolUseBlockParam\n /** \u5DE5\u5177\u7684 JSX \u5C55\u793A (\u53EF\u9009\uFF0C\u7528\u4E8E\u590D\u6742\u7684\u5DE5\u5177 UI) */\n toolJSX?: React.ReactNode\n }\n\n /** \u5DE5\u5177\u6267\u884C\u4E2D - \u547D\u4EE4\u8FD0\u884C\u3001\u6587\u4EF6\u4FEE\u6539\u7B49 */\n | {\n type: 'ToolExecuting'\n /** \u6B63\u5728\u6267\u884C\u7684\u5DE5\u5177\u8C03\u7528 */\n toolUse: ToolUseBlockParam\n /** \u5B9E\u65F6\u8F93\u51FA */\n output?: string\n }\n\n /** AI \u56DE\u7B54\u4E2D - \u6D41\u5F0F\u8F93\u51FA\u6700\u7EC8\u56DE\u590D */\n | {\n type: 'AgentResponding'\n /** \u5F53\u524D\u5DF2\u63A5\u6536\u7684\u6587\u672C */\n streamingText: string\n /** \u662F\u5426\u5B8C\u6210 */\n isComplete: boolean\n }\n\n /** \u4E8C\u5143\u53CD\u9988 - A/B \u6D4B\u8BD5\u9009\u62E9 */\n | {\n type: 'BinaryFeedback'\n context: BinaryFeedbackContext\n }\n\n /** \u9519\u8BEF - \u663E\u793A\u9519\u8BEF\u4FE1\u606F */\n | {\n type: 'Error'\n error: string\n /** \u53EF\u4EE5\u4ECE\u9519\u8BEF\u6062\u590D\u5230\u7A7A\u95F2\u72B6\u6001 */\n canRecover: boolean\n }\n\n /** \u6D88\u606F\u9009\u62E9\u5668 - \u7528\u6237\u6D4F\u89C8\u5386\u53F2\u6D88\u606F */\n | { type: 'MessageSelector' }\n\n/**\n * REPL \u72B6\u6001\u673A Hook\n *\n * \u63D0\u4F9B\u6E05\u6670\u7684\u72B6\u6001\u7BA1\u7406\u548C\u8F6C\u6362\u63A5\u53E3\n */\nexport function useREPLStateMachine(\n initialState: REPLState = { type: 'Idle' },\n) {\n const [state, setState] = useState<REPLState>(initialState)\n\n /**\n * \u72B6\u6001\u8F6C\u6362\u51FD\u6570\u96C6\u5408\n *\n * \u6BCF\u4E2A\u51FD\u6570\u5BF9\u5E94\u4E00\u4E2A\u660E\u786E\u7684\u72B6\u6001\u8F6C\u6362\u52A8\u4F5C\n */\n const transitions = {\n /** \u8F6C\u5230\u7A7A\u95F2\u72B6\u6001 */\n toIdle: useCallback(() => {\n setState({ type: 'Idle' })\n }, []),\n\n /** \u8F6C\u5230\u7528\u6237\u8F93\u5165\u72B6\u6001 */\n toUserTyping: useCallback(() => {\n setState({ type: 'UserTyping' })\n }, []),\n\n /** \u8F6C\u5230\u7528\u6237\u5DF2\u63D0\u4EA4\u72B6\u6001 */\n toUserSubmitted: useCallback(() => {\n setState({ type: 'UserSubmitted' })\n }, []),\n\n /** \u8F6C\u5230 AI \u601D\u8003\u72B6\u6001 */\n toAgentThinking: useCallback((message: string, spinnerFrame?: number) => {\n setState({ type: 'AgentThinking', message, spinnerFrame })\n }, []),\n\n /** \u66F4\u65B0\u601D\u8003\u6D88\u606F (\u539F\u5730\u66F4\u65B0\uFF0C\u4E0D\u6539\u53D8\u72B6\u6001\u7C7B\u578B) */\n updateThinkingMessage: useCallback(\n (message: string, spinnerFrame?: number) => {\n setState(prev => {\n if (prev.type === 'AgentThinking') {\n return { ...prev, message, spinnerFrame }\n }\n return prev\n })\n },\n [],\n ),\n\n /** \u8F6C\u5230\u5DE5\u5177\u63D0\u8BAE\u72B6\u6001 */\n toAgentProposingTool: useCallback(\n (toolUse: ToolUseBlockParam, toolJSX?: React.ReactNode) => {\n setState({ type: 'AgentProposingTool', toolUse, toolJSX })\n },\n [],\n ),\n\n /** \u8F6C\u5230\u5DE5\u5177\u6267\u884C\u72B6\u6001 */\n toToolExecuting: useCallback(\n (toolUse: ToolUseBlockParam, output?: string) => {\n setState({ type: 'ToolExecuting', toolUse, output })\n },\n [],\n ),\n\n /** \u66F4\u65B0\u5DE5\u5177\u6267\u884C\u8F93\u51FA (\u539F\u5730\u66F4\u65B0) */\n updateToolOutput: useCallback((output: string) => {\n setState(prev => {\n if (prev.type === 'ToolExecuting') {\n return { ...prev, output }\n }\n return prev\n })\n }, []),\n\n /** \u8F6C\u5230 AI \u56DE\u7B54\u72B6\u6001 */\n toAgentResponding: useCallback(\n (streamingText: string, isComplete: boolean) => {\n setState({ type: 'AgentResponding', streamingText, isComplete })\n },\n [],\n ),\n\n /** \u66F4\u65B0\u6D41\u5F0F\u56DE\u7B54\u6587\u672C (\u539F\u5730\u66F4\u65B0) */\n updateStreamingText: useCallback(\n (streamingText: string, isComplete: boolean) => {\n setState(prev => {\n if (prev.type === 'AgentResponding') {\n return { ...prev, streamingText, isComplete }\n }\n return prev\n })\n },\n [],\n ),\n\n /** \u8F6C\u5230\u4E8C\u5143\u53CD\u9988\u72B6\u6001 */\n toBinaryFeedback: useCallback((context: BinaryFeedbackContext) => {\n setState({ type: 'BinaryFeedback', context })\n }, []),\n\n /** \u8F6C\u5230\u9519\u8BEF\u72B6\u6001 */\n toError: useCallback((error: string, canRecover: boolean = true) => {\n setState({ type: 'Error', error, canRecover })\n }, []),\n\n /** \u8F6C\u5230\u6D88\u606F\u9009\u62E9\u5668\u72B6\u6001 */\n toMessageSelector: useCallback(() => {\n setState({ type: 'MessageSelector' })\n }, []),\n }\n\n /**\n * \u72B6\u6001\u67E5\u8BE2\u8F85\u52A9\u51FD\u6570\n */\n const is = {\n idle: state.type === 'Idle',\n userTyping: state.type === 'UserTyping',\n userSubmitted: state.type === 'UserSubmitted',\n agentThinking: state.type === 'AgentThinking',\n agentProposingTool: state.type === 'AgentProposingTool',\n toolExecuting: state.type === 'ToolExecuting',\n agentResponding: state.type === 'AgentResponding',\n binaryFeedback: state.type === 'BinaryFeedback',\n error: state.type === 'Error',\n messageSelector: state.type === 'MessageSelector',\n\n /** \u662F\u5426\u53EF\u4EE5\u63A5\u53D7\u7528\u6237\u8F93\u5165 */\n canAcceptInput:\n state.type === 'Idle' ||\n state.type === 'UserTyping' ||\n state.type === 'Error',\n\n /** \u662F\u5426\u6B63\u5728\u52A0\u8F7D (\u601D\u8003\u3001\u6267\u884C\u3001\u56DE\u7B54) */\n loading:\n state.type === 'AgentThinking' ||\n state.type === 'ToolExecuting' ||\n state.type === 'AgentResponding' ||\n state.type === 'UserSubmitted',\n\n /** \u662F\u5426\u9700\u8981\u7528\u6237\u4EA4\u4E92 (\u786E\u8BA4\u5DE5\u5177\u3001\u4E8C\u5143\u53CD\u9988\u3001\u6D88\u606F\u9009\u62E9) */\n needsUserInteraction:\n state.type === 'AgentProposingTool' ||\n state.type === 'BinaryFeedback' ||\n state.type === 'MessageSelector',\n }\n\n return {\n /** \u5F53\u524D\u72B6\u6001 */\n state,\n /** \u72B6\u6001\u8F6C\u6362\u51FD\u6570 */\n transitions,\n /** \u72B6\u6001\u67E5\u8BE2\u8F85\u52A9 */\n is,\n /** \u76F4\u63A5\u8BBE\u7F6E\u72B6\u6001 (\u9AD8\u7EA7\u7528\u6CD5) */\n setState,\n }\n}\n\n/**\n * \u72B6\u6001\u673A\u8C03\u8BD5\u8F85\u52A9\n */\nexport function getStateName(state: REPLState): string {\n switch (state.type) {\n case 'Idle':\n return '\u23F8 Idle'\n case 'UserTyping':\n return '\u2328\uFE0F UserTyping'\n case 'UserSubmitted':\n return '\u23F3 UserSubmitted'\n case 'AgentThinking':\n return `\uD83E\uDD14 AgentThinking: ${state.message}`\n case 'AgentProposingTool':\n return `\uD83D\uDD27 AgentProposingTool: ${state.toolUse.name}`\n case 'ToolExecuting':\n return `\u2699\uFE0F ToolExecuting: ${state.toolUse.name}`\n case 'AgentResponding':\n return `\uD83D\uDCAC AgentResponding (${state.streamingText.length} chars)`\n case 'BinaryFeedback':\n return '\uD83E\uDD37 BinaryFeedback'\n case 'Error':\n return `\u274C Error: ${state.error}`\n case 'MessageSelector':\n return '\uD83D\uDCDC MessageSelector'\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { findActualExecutable } from "spawn-rx";
|
|
2
|
+
import { memoize } from "lodash-es";
|
|
3
|
+
import { fileURLToPath, resolve } from "node:url";
|
|
4
|
+
import * as path from "path";
|
|
5
|
+
import { logError } from "./log.js";
|
|
6
|
+
import { execFileNoThrow } from "./execFileNoThrow.js";
|
|
7
|
+
import { execFile } from "child_process";
|
|
8
|
+
import debug from "debug";
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const __dirname = resolve(
|
|
11
|
+
__filename,
|
|
12
|
+
process.env.NODE_ENV === "test" ? "../.." : "."
|
|
13
|
+
);
|
|
14
|
+
const d = debug("claude:ripgrep");
|
|
15
|
+
const useBuiltinRipgrep = !!process.env.USE_BUILTIN_RIPGREP;
|
|
16
|
+
if (useBuiltinRipgrep) {
|
|
17
|
+
d("Using builtin ripgrep because USE_BUILTIN_RIPGREP is set");
|
|
18
|
+
}
|
|
19
|
+
const ripgrepPath = memoize(() => {
|
|
20
|
+
const { cmd } = findActualExecutable("rg", []);
|
|
21
|
+
d(`ripgrep initially resolved as: ${cmd}`);
|
|
22
|
+
if (cmd !== "rg" && !useBuiltinRipgrep) {
|
|
23
|
+
return cmd;
|
|
24
|
+
} else {
|
|
25
|
+
const rgRoot = path.resolve(__dirname, "vendor", "ripgrep");
|
|
26
|
+
if (process.platform === "win32") {
|
|
27
|
+
return path.resolve(rgRoot, "x64-win32", "rg.exe");
|
|
28
|
+
}
|
|
29
|
+
const ret = path.resolve(
|
|
30
|
+
rgRoot,
|
|
31
|
+
`${process.arch}-${process.platform}`,
|
|
32
|
+
"rg"
|
|
33
|
+
);
|
|
34
|
+
d("internal ripgrep resolved as: %s", ret);
|
|
35
|
+
return ret;
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
async function ripGrep(args, target, abortSignal) {
|
|
39
|
+
await codesignRipgrepIfNecessary();
|
|
40
|
+
const rg = ripgrepPath();
|
|
41
|
+
d("ripgrep called: %s %o", rg, target, args);
|
|
42
|
+
return new Promise((resolve2) => {
|
|
43
|
+
execFile(
|
|
44
|
+
ripgrepPath(),
|
|
45
|
+
[...args, target],
|
|
46
|
+
{
|
|
47
|
+
maxBuffer: 1e6,
|
|
48
|
+
signal: abortSignal,
|
|
49
|
+
timeout: 1e4
|
|
50
|
+
},
|
|
51
|
+
(error, stdout) => {
|
|
52
|
+
if (error) {
|
|
53
|
+
if (error.code !== 1) {
|
|
54
|
+
d("ripgrep error: %o", error);
|
|
55
|
+
logError(error);
|
|
56
|
+
}
|
|
57
|
+
resolve2([]);
|
|
58
|
+
} else {
|
|
59
|
+
d("ripgrep succeeded with %s", stdout);
|
|
60
|
+
resolve2(stdout.trim().split("\n").filter(Boolean));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
async function listAllContentFiles(path2, abortSignal, limit) {
|
|
67
|
+
try {
|
|
68
|
+
d("listAllContentFiles called: %s", path2);
|
|
69
|
+
return (await ripGrep(["-l", ".", path2], path2, abortSignal)).slice(0, limit);
|
|
70
|
+
} catch (e) {
|
|
71
|
+
d("listAllContentFiles failed: %o", e);
|
|
72
|
+
logError(e);
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
let alreadyDoneSignCheck = false;
|
|
77
|
+
async function codesignRipgrepIfNecessary() {
|
|
78
|
+
if (process.platform !== "darwin" || alreadyDoneSignCheck) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
alreadyDoneSignCheck = true;
|
|
82
|
+
d("checking if ripgrep is already signed");
|
|
83
|
+
const lines = (await execFileNoThrow(
|
|
84
|
+
"codesign",
|
|
85
|
+
["-vv", "-d", ripgrepPath()],
|
|
86
|
+
void 0,
|
|
87
|
+
void 0,
|
|
88
|
+
false
|
|
89
|
+
)).stdout.split("\n");
|
|
90
|
+
const needsSigned = lines.find((line) => line.includes("linker-signed"));
|
|
91
|
+
if (!needsSigned) {
|
|
92
|
+
d("seems to be already signed");
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
d("signing ripgrep");
|
|
97
|
+
const signResult = await execFileNoThrow("codesign", [
|
|
98
|
+
"--sign",
|
|
99
|
+
"-",
|
|
100
|
+
"--force",
|
|
101
|
+
"--preserve-metadata=entitlements,requirements,flags,runtime",
|
|
102
|
+
ripgrepPath()
|
|
103
|
+
]);
|
|
104
|
+
if (signResult.code !== 0) {
|
|
105
|
+
d("failed to sign ripgrep: %o", signResult);
|
|
106
|
+
logError(
|
|
107
|
+
`Failed to sign ripgrep: ${signResult.stdout} ${signResult.stderr}`
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
d("removing quarantine");
|
|
111
|
+
const quarantineResult = await execFileNoThrow("xattr", [
|
|
112
|
+
"-d",
|
|
113
|
+
"com.apple.quarantine",
|
|
114
|
+
ripgrepPath()
|
|
115
|
+
]);
|
|
116
|
+
if (quarantineResult.code !== 0) {
|
|
117
|
+
d("failed to remove quarantine: %o", quarantineResult);
|
|
118
|
+
logError(
|
|
119
|
+
`Failed to remove quarantine: ${quarantineResult.stdout} ${quarantineResult.stderr}`
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
} catch (e) {
|
|
123
|
+
d("failed during sign: %o", e);
|
|
124
|
+
logError(e);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
export {
|
|
128
|
+
listAllContentFiles,
|
|
129
|
+
ripGrep
|
|
130
|
+
};
|
|
131
|
+
//# sourceMappingURL=ripgrep.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/ripgrep.ts"],
|
|
4
|
+
"sourcesContent": ["import { findActualExecutable } from 'spawn-rx'\nimport { memoize } from 'lodash-es'\nimport { fileURLToPath, resolve } from 'node:url'\nimport * as path from 'path'\nimport { logError } from './log'\nimport { execFileNoThrow } from './execFileNoThrow'\nimport { execFile } from 'child_process'\nimport debug from 'debug'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = resolve(\n __filename,\n process.env.NODE_ENV === 'test' ? '../..' : '.',\n)\n\nconst d = debug('claude:ripgrep')\n\nconst useBuiltinRipgrep = !!process.env.USE_BUILTIN_RIPGREP\nif (useBuiltinRipgrep) {\n d('Using builtin ripgrep because USE_BUILTIN_RIPGREP is set')\n}\n\nconst ripgrepPath = memoize(() => {\n const { cmd } = findActualExecutable('rg', [])\n d(`ripgrep initially resolved as: ${cmd}`)\n\n if (cmd !== 'rg' && !useBuiltinRipgrep) {\n // NB: If we're able to find ripgrep in $PATH, cmd will be an absolute\n // path rather than just returning 'rg'\n return cmd\n } else {\n // Use the one we ship in-box\n const rgRoot = path.resolve(__dirname, 'vendor', 'ripgrep')\n if (process.platform === 'win32') {\n // NB: Ripgrep doesn't ship an aarch64 binary for Windows, boooooo\n return path.resolve(rgRoot, 'x64-win32', 'rg.exe')\n }\n\n const ret = path.resolve(\n rgRoot,\n `${process.arch}-${process.platform}`,\n 'rg',\n )\n\n d('internal ripgrep resolved as: %s', ret)\n return ret\n }\n})\n\nexport async function ripGrep(\n args: string[],\n target: string,\n abortSignal: AbortSignal,\n): Promise<string[]> {\n await codesignRipgrepIfNecessary()\n const rg = ripgrepPath()\n d('ripgrep called: %s %o', rg, target, args)\n\n // NB: When running interactively, ripgrep does not require a path as its last\n // argument, but when run non-interactively, it will hang unless a path or file\n // pattern is provided\n return new Promise(resolve => {\n execFile(\n ripgrepPath(),\n [...args, target],\n {\n maxBuffer: 1_000_000,\n signal: abortSignal,\n timeout: 10_000,\n },\n (error, stdout) => {\n if (error) {\n // Exit code 1 from ripgrep means \"no matches found\" - this is normal\n if (error.code !== 1) {\n d('ripgrep error: %o', error)\n logError(error)\n }\n resolve([])\n } else {\n d('ripgrep succeeded with %s', stdout)\n resolve(stdout.trim().split('\\n').filter(Boolean))\n }\n },\n )\n })\n}\n\n// NB: We do something tricky here. We know that ripgrep processes common\n// ignore files for us, so we just ripgrep for any character, which matches\n// all non-empty files\nexport async function listAllContentFiles(\n path: string,\n abortSignal: AbortSignal,\n limit: number,\n): Promise<string[]> {\n try {\n d('listAllContentFiles called: %s', path)\n return (await ripGrep(['-l', '.', path], path, abortSignal)).slice(0, limit)\n } catch (e) {\n d('listAllContentFiles failed: %o', e)\n\n logError(e)\n return []\n }\n}\n\nlet alreadyDoneSignCheck = false\nasync function codesignRipgrepIfNecessary() {\n if (process.platform !== 'darwin' || alreadyDoneSignCheck) {\n return\n }\n\n alreadyDoneSignCheck = true\n\n // First, check to see if ripgrep is already signed\n d('checking if ripgrep is already signed')\n const lines = (\n await execFileNoThrow(\n 'codesign',\n ['-vv', '-d', ripgrepPath()],\n undefined,\n undefined,\n false,\n )\n ).stdout.split('\\n')\n\n const needsSigned = lines.find(line => line.includes('linker-signed'))\n if (!needsSigned) {\n d('seems to be already signed')\n return\n }\n\n try {\n d('signing ripgrep')\n const signResult = await execFileNoThrow('codesign', [\n '--sign',\n '-',\n '--force',\n '--preserve-metadata=entitlements,requirements,flags,runtime',\n ripgrepPath(),\n ])\n\n if (signResult.code !== 0) {\n d('failed to sign ripgrep: %o', signResult)\n logError(\n `Failed to sign ripgrep: ${signResult.stdout} ${signResult.stderr}`,\n )\n }\n\n d('removing quarantine')\n const quarantineResult = await execFileNoThrow('xattr', [\n '-d',\n 'com.apple.quarantine',\n ripgrepPath(),\n ])\n\n if (quarantineResult.code !== 0) {\n d('failed to remove quarantine: %o', quarantineResult)\n logError(\n `Failed to remove quarantine: ${quarantineResult.stdout} ${quarantineResult.stderr}`,\n )\n }\n } catch (e) {\n d('failed during sign: %o', e)\n logError(e)\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["resolve", "path"]
|
|
7
|
+
}
|