@butlerw/vellum 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +411 -0
- package/__fixtures__/responses/code-generation.json +42 -0
- package/__fixtures__/responses/error-response.json +20 -0
- package/__fixtures__/responses/hello-world.json +32 -0
- package/dist/auth-6MCXESOH.js +26 -0
- package/dist/chunk-SECXJGWA.js +597 -0
- package/dist/index.js +34023 -0
- package/package.json +67 -0
- package/src/__tests__/commands.e2e.test.ts +728 -0
- package/src/__tests__/credentials.test.ts +713 -0
- package/src/__tests__/mode-e2e.test.ts +391 -0
- package/src/__tests__/tui-integration.test.tsx +1271 -0
- package/src/agents/__tests__/task-persistence.test.ts +235 -0
- package/src/agents/commands/delegate.ts +240 -0
- package/src/agents/commands/index.ts +10 -0
- package/src/agents/commands/resume.ts +335 -0
- package/src/agents/index.ts +29 -0
- package/src/agents/task-persistence.ts +272 -0
- package/src/agents/task-resumption.ts +242 -0
- package/src/app.tsx +4737 -0
- package/src/commands/__tests__/.gitkeep +1 -0
- package/src/commands/__tests__/agents.test.ts +606 -0
- package/src/commands/__tests__/auth.test.ts +626 -0
- package/src/commands/__tests__/autocomplete.test.ts +683 -0
- package/src/commands/__tests__/batch.test.ts +287 -0
- package/src/commands/__tests__/chain-pipe-parser.test.ts +654 -0
- package/src/commands/__tests__/completion.test.ts +238 -0
- package/src/commands/__tests__/core.test.ts +363 -0
- package/src/commands/__tests__/executor.test.ts +496 -0
- package/src/commands/__tests__/exit-codes.test.ts +220 -0
- package/src/commands/__tests__/init.test.ts +243 -0
- package/src/commands/__tests__/language.test.ts +353 -0
- package/src/commands/__tests__/mode-cli.test.ts +667 -0
- package/src/commands/__tests__/model.test.ts +277 -0
- package/src/commands/__tests__/parser.test.ts +493 -0
- package/src/commands/__tests__/performance.bench.ts +380 -0
- package/src/commands/__tests__/registry.test.ts +534 -0
- package/src/commands/__tests__/resume.test.ts +449 -0
- package/src/commands/__tests__/security.test.ts +845 -0
- package/src/commands/__tests__/stream-json.test.ts +372 -0
- package/src/commands/__tests__/user-commands.test.ts +597 -0
- package/src/commands/adapters.ts +267 -0
- package/src/commands/agent.ts +395 -0
- package/src/commands/agents/generate.ts +506 -0
- package/src/commands/agents/index.ts +272 -0
- package/src/commands/agents/show.ts +271 -0
- package/src/commands/agents/validate.ts +387 -0
- package/src/commands/auth.ts +883 -0
- package/src/commands/autocomplete.ts +480 -0
- package/src/commands/batch/command.ts +388 -0
- package/src/commands/batch/executor.ts +361 -0
- package/src/commands/batch/index.ts +12 -0
- package/src/commands/commit.ts +235 -0
- package/src/commands/completion/index.ts +371 -0
- package/src/commands/condense.ts +191 -0
- package/src/commands/config.ts +344 -0
- package/src/commands/context-provider.ts +173 -0
- package/src/commands/copy.ts +329 -0
- package/src/commands/core/clear.ts +38 -0
- package/src/commands/core/exit.ts +43 -0
- package/src/commands/core/help.ts +354 -0
- package/src/commands/core/index.ts +15 -0
- package/src/commands/cost.ts +179 -0
- package/src/commands/credentials.tsx +618 -0
- package/src/commands/custom-agents/__tests__/custom-agents.test.ts +709 -0
- package/src/commands/custom-agents/create.ts +377 -0
- package/src/commands/custom-agents/export.ts +135 -0
- package/src/commands/custom-agents/import.ts +199 -0
- package/src/commands/custom-agents/index.ts +372 -0
- package/src/commands/custom-agents/info.ts +318 -0
- package/src/commands/custom-agents/list.ts +267 -0
- package/src/commands/custom-agents/validate.ts +388 -0
- package/src/commands/diff-mode.ts +241 -0
- package/src/commands/env.ts +53 -0
- package/src/commands/executor.ts +579 -0
- package/src/commands/exit-codes.ts +202 -0
- package/src/commands/index.ts +701 -0
- package/src/commands/init/index.ts +15 -0
- package/src/commands/init/prompts.ts +366 -0
- package/src/commands/init/templates/commands-readme.md +80 -0
- package/src/commands/init/templates/example-command.md +79 -0
- package/src/commands/init/templates/example-skill.md +168 -0
- package/src/commands/init/templates/example-workflow.md +101 -0
- package/src/commands/init/templates/prompts-readme.md +52 -0
- package/src/commands/init/templates/rules-readme.md +63 -0
- package/src/commands/init/templates/skills-readme.md +83 -0
- package/src/commands/init/templates/workflows-readme.md +94 -0
- package/src/commands/init.ts +391 -0
- package/src/commands/install.ts +90 -0
- package/src/commands/language.ts +191 -0
- package/src/commands/loaders/.gitkeep +1 -0
- package/src/commands/lsp.ts +199 -0
- package/src/commands/markdown-commands.ts +253 -0
- package/src/commands/mcp.ts +588 -0
- package/src/commands/memory/export.ts +341 -0
- package/src/commands/memory/index.ts +148 -0
- package/src/commands/memory/list.ts +261 -0
- package/src/commands/memory/search.ts +346 -0
- package/src/commands/memory/utils.ts +15 -0
- package/src/commands/metrics.ts +75 -0
- package/src/commands/migrate/index.ts +16 -0
- package/src/commands/migrate/prompts.ts +477 -0
- package/src/commands/mode.ts +331 -0
- package/src/commands/model.ts +298 -0
- package/src/commands/onboard.ts +205 -0
- package/src/commands/open.ts +169 -0
- package/src/commands/output/stream-json.ts +373 -0
- package/src/commands/parser/chain-parser.ts +370 -0
- package/src/commands/parser/index.ts +29 -0
- package/src/commands/parser/pipe-parser.ts +480 -0
- package/src/commands/parser.ts +588 -0
- package/src/commands/persistence.ts +355 -0
- package/src/commands/progress.ts +18 -0
- package/src/commands/prompt/index.ts +17 -0
- package/src/commands/prompt/validate.ts +621 -0
- package/src/commands/prompt-priority.ts +401 -0
- package/src/commands/registry.ts +374 -0
- package/src/commands/sandbox/index.ts +131 -0
- package/src/commands/security/index.ts +21 -0
- package/src/commands/security/input-sanitizer.ts +168 -0
- package/src/commands/security/permission-checker.ts +456 -0
- package/src/commands/security/sensitive-data.ts +350 -0
- package/src/commands/session/delete.ts +38 -0
- package/src/commands/session/export.ts +39 -0
- package/src/commands/session/index.ts +26 -0
- package/src/commands/session/list.ts +26 -0
- package/src/commands/session/resume.ts +562 -0
- package/src/commands/session/search.ts +434 -0
- package/src/commands/session/show.ts +26 -0
- package/src/commands/settings.ts +368 -0
- package/src/commands/setup.ts +23 -0
- package/src/commands/shell/index.ts +16 -0
- package/src/commands/shell/setup.ts +422 -0
- package/src/commands/shell-init.ts +50 -0
- package/src/commands/shell-integration/index.ts +194 -0
- package/src/commands/skill.ts +1220 -0
- package/src/commands/spec.ts +558 -0
- package/src/commands/status.ts +246 -0
- package/src/commands/theme.ts +211 -0
- package/src/commands/think.ts +551 -0
- package/src/commands/trust.ts +211 -0
- package/src/commands/tutorial.ts +522 -0
- package/src/commands/types.ts +512 -0
- package/src/commands/update.ts +274 -0
- package/src/commands/usage.ts +213 -0
- package/src/commands/user-commands.ts +630 -0
- package/src/commands/utils.ts +142 -0
- package/src/commands/vim.ts +152 -0
- package/src/commands/workflow.ts +257 -0
- package/src/components/header.tsx +25 -0
- package/src/components/input.tsx +25 -0
- package/src/components/message-list.tsx +32 -0
- package/src/components/status-bar.tsx +23 -0
- package/src/index.tsx +614 -0
- package/src/onboarding/__tests__/tutorial.test.ts +740 -0
- package/src/onboarding/index.ts +69 -0
- package/src/onboarding/tips/index.ts +9 -0
- package/src/onboarding/tips/tip-engine.ts +459 -0
- package/src/onboarding/tutorial/index.ts +88 -0
- package/src/onboarding/tutorial/lessons/basics.ts +151 -0
- package/src/onboarding/tutorial/lessons/index.ts +151 -0
- package/src/onboarding/tutorial/lessons/modes.ts +230 -0
- package/src/onboarding/tutorial/lessons/tools.ts +172 -0
- package/src/onboarding/tutorial/progress-tracker.ts +350 -0
- package/src/onboarding/tutorial/storage.ts +249 -0
- package/src/onboarding/tutorial/tutorial-system.ts +462 -0
- package/src/onboarding/tutorial/types.ts +310 -0
- package/src/orchestrator-singleton.ts +129 -0
- package/src/shutdown.ts +33 -0
- package/src/test/e2e/assertions.ts +267 -0
- package/src/test/e2e/fixtures.ts +204 -0
- package/src/test/e2e/harness.ts +575 -0
- package/src/test/e2e/index.ts +57 -0
- package/src/test/e2e/types.ts +228 -0
- package/src/test/fixtures/__tests__/fake-response-loader.test.ts +314 -0
- package/src/test/fixtures/fake-response-loader.ts +314 -0
- package/src/test/fixtures/index.ts +20 -0
- package/src/tui/__tests__/mcp-panel.test.tsx +82 -0
- package/src/tui/__tests__/mcp-wiring.test.tsx +78 -0
- package/src/tui/__tests__/mode-components.test.tsx +395 -0
- package/src/tui/__tests__/permission-ask-flow.test.tsx +138 -0
- package/src/tui/__tests__/sidebar-panel-data.test.tsx +148 -0
- package/src/tui/__tests__/tools-panel-hotkeys.test.tsx +41 -0
- package/src/tui/adapters/agent-adapter.ts +1008 -0
- package/src/tui/adapters/index.ts +48 -0
- package/src/tui/adapters/message-adapter.ts +315 -0
- package/src/tui/adapters/persistence-bridge.ts +331 -0
- package/src/tui/adapters/session-adapter.ts +419 -0
- package/src/tui/buffered-stdout.ts +223 -0
- package/src/tui/components/AgentProgress.tsx +424 -0
- package/src/tui/components/Banner/AsciiArt.ts +160 -0
- package/src/tui/components/Banner/Banner.tsx +355 -0
- package/src/tui/components/Banner/ShimmerContext.tsx +131 -0
- package/src/tui/components/Banner/ShimmerText.tsx +193 -0
- package/src/tui/components/Banner/TypeWriterGradient.tsx +321 -0
- package/src/tui/components/Banner/index.ts +61 -0
- package/src/tui/components/Banner/useShimmer.ts +241 -0
- package/src/tui/components/ChatView.tsx +11 -0
- package/src/tui/components/Checkpoint/CheckpointDiffView.tsx +371 -0
- package/src/tui/components/Checkpoint/SnapshotCheckpointPanel.tsx +440 -0
- package/src/tui/components/Checkpoint/index.ts +19 -0
- package/src/tui/components/CostDisplay.tsx +226 -0
- package/src/tui/components/InitErrorBanner.tsx +122 -0
- package/src/tui/components/Input/Autocomplete.tsx +603 -0
- package/src/tui/components/Input/EnhancedCommandInput.tsx +471 -0
- package/src/tui/components/Input/HighlightedText.tsx +236 -0
- package/src/tui/components/Input/MentionAutocomplete.tsx +375 -0
- package/src/tui/components/Input/TextInput.tsx +1002 -0
- package/src/tui/components/Input/__tests__/Autocomplete.test.tsx +374 -0
- package/src/tui/components/Input/__tests__/TextInput.test.tsx +241 -0
- package/src/tui/components/Input/__tests__/highlight.test.ts +219 -0
- package/src/tui/components/Input/__tests__/slash-command-utils.test.ts +104 -0
- package/src/tui/components/Input/highlight.ts +362 -0
- package/src/tui/components/Input/index.ts +36 -0
- package/src/tui/components/Input/slash-command-utils.ts +135 -0
- package/src/tui/components/Layout.tsx +432 -0
- package/src/tui/components/McpPanel.tsx +137 -0
- package/src/tui/components/MemoryPanel.tsx +448 -0
- package/src/tui/components/Messages/CodeBlock.tsx +527 -0
- package/src/tui/components/Messages/DiffView.tsx +679 -0
- package/src/tui/components/Messages/ImageReference.tsx +89 -0
- package/src/tui/components/Messages/MarkdownBlock.tsx +228 -0
- package/src/tui/components/Messages/MarkdownRenderer.tsx +498 -0
- package/src/tui/components/Messages/MessageBubble.tsx +270 -0
- package/src/tui/components/Messages/MessageList.tsx +1719 -0
- package/src/tui/components/Messages/StreamingText.tsx +216 -0
- package/src/tui/components/Messages/ThinkingBlock.tsx +408 -0
- package/src/tui/components/Messages/ToolResultPreview.tsx +243 -0
- package/src/tui/components/Messages/__tests__/CodeBlock.test.tsx +296 -0
- package/src/tui/components/Messages/__tests__/DiffView.test.tsx +239 -0
- package/src/tui/components/Messages/__tests__/MarkdownRenderer.test.tsx +303 -0
- package/src/tui/components/Messages/__tests__/MessageBubble.test.tsx +268 -0
- package/src/tui/components/Messages/__tests__/MessageList.test.tsx +324 -0
- package/src/tui/components/Messages/__tests__/StreamingText.test.tsx +215 -0
- package/src/tui/components/Messages/index.ts +25 -0
- package/src/tui/components/ModeIndicator.tsx +177 -0
- package/src/tui/components/ModeSelector.tsx +216 -0
- package/src/tui/components/ModelSelector.tsx +339 -0
- package/src/tui/components/OnboardingWizard.tsx +670 -0
- package/src/tui/components/PhaseProgressIndicator.tsx +270 -0
- package/src/tui/components/RateLimitIndicator.tsx +82 -0
- package/src/tui/components/ScreenReaderLayout.tsx +295 -0
- package/src/tui/components/SettingsPanel.tsx +643 -0
- package/src/tui/components/Sidebar/SystemStatusPanel.tsx +284 -0
- package/src/tui/components/Sidebar/index.ts +9 -0
- package/src/tui/components/Status/ModelStatusBar.tsx +270 -0
- package/src/tui/components/Status/index.ts +12 -0
- package/src/tui/components/StatusBar/AgentModeIndicator.tsx +257 -0
- package/src/tui/components/StatusBar/ContextProgress.tsx +167 -0
- package/src/tui/components/StatusBar/FileChangesIndicator.tsx +62 -0
- package/src/tui/components/StatusBar/GitIndicator.tsx +89 -0
- package/src/tui/components/StatusBar/HeaderBar.tsx +126 -0
- package/src/tui/components/StatusBar/ModelIndicator.tsx +157 -0
- package/src/tui/components/StatusBar/PersistenceStatusIndicator.tsx +210 -0
- package/src/tui/components/StatusBar/ResilienceIndicator.tsx +106 -0
- package/src/tui/components/StatusBar/SandboxIndicator.tsx +167 -0
- package/src/tui/components/StatusBar/StatusBar.tsx +368 -0
- package/src/tui/components/StatusBar/ThinkingModeIndicator.tsx +170 -0
- package/src/tui/components/StatusBar/TokenBreakdown.tsx +246 -0
- package/src/tui/components/StatusBar/TokenCounter.tsx +135 -0
- package/src/tui/components/StatusBar/TrustModeIndicator.tsx +130 -0
- package/src/tui/components/StatusBar/WorkspaceIndicator.tsx +86 -0
- package/src/tui/components/StatusBar/__tests__/AgentModeIndicator.test.tsx +193 -0
- package/src/tui/components/StatusBar/__tests__/StatusBar.test.tsx +729 -0
- package/src/tui/components/StatusBar/index.ts +60 -0
- package/src/tui/components/TipBanner.tsx +115 -0
- package/src/tui/components/TodoItem.tsx +208 -0
- package/src/tui/components/TodoPanel.tsx +455 -0
- package/src/tui/components/Tools/ApprovalQueue.tsx +407 -0
- package/src/tui/components/Tools/OptionSelector.tsx +160 -0
- package/src/tui/components/Tools/PermissionDialog.tsx +286 -0
- package/src/tui/components/Tools/ToolParams.tsx +483 -0
- package/src/tui/components/Tools/ToolsPanel.tsx +178 -0
- package/src/tui/components/Tools/__tests__/PermissionDialog.test.tsx +510 -0
- package/src/tui/components/Tools/__tests__/ToolParams.test.tsx +432 -0
- package/src/tui/components/Tools/index.ts +21 -0
- package/src/tui/components/TrustPrompt.tsx +279 -0
- package/src/tui/components/UpdateBanner.tsx +166 -0
- package/src/tui/components/VimModeIndicator.tsx +112 -0
- package/src/tui/components/backtrack/BacktrackControls.tsx +402 -0
- package/src/tui/components/backtrack/index.ts +13 -0
- package/src/tui/components/common/AutoApprovalStatus.tsx +251 -0
- package/src/tui/components/common/CostWarning.tsx +294 -0
- package/src/tui/components/common/DynamicShortcutHints.tsx +209 -0
- package/src/tui/components/common/EnhancedLoadingIndicator.tsx +305 -0
- package/src/tui/components/common/ErrorBoundary.tsx +140 -0
- package/src/tui/components/common/GradientText.tsx +224 -0
- package/src/tui/components/common/HotkeyHelpModal.tsx +193 -0
- package/src/tui/components/common/HotkeyHints.tsx +70 -0
- package/src/tui/components/common/MaxSizedBox.tsx +354 -0
- package/src/tui/components/common/NewMessagesBadge.tsx +65 -0
- package/src/tui/components/common/ProtectedFileLegend.tsx +89 -0
- package/src/tui/components/common/ScrollIndicator.tsx +160 -0
- package/src/tui/components/common/Spinner.tsx +342 -0
- package/src/tui/components/common/StreamingIndicator.tsx +316 -0
- package/src/tui/components/common/VirtualizedList/VirtualizedList.tsx +428 -0
- package/src/tui/components/common/VirtualizedList/hooks/index.ts +19 -0
- package/src/tui/components/common/VirtualizedList/hooks/useBatchedScroll.ts +64 -0
- package/src/tui/components/common/VirtualizedList/hooks/useScrollAnchor.ts +290 -0
- package/src/tui/components/common/VirtualizedList/hooks/useVirtualization.ts +340 -0
- package/src/tui/components/common/VirtualizedList/index.ts +30 -0
- package/src/tui/components/common/VirtualizedList/types.ts +107 -0
- package/src/tui/components/common/__tests__/NewMessagesBadge.test.tsx +74 -0
- package/src/tui/components/common/__tests__/ScrollIndicator.test.tsx +193 -0
- package/src/tui/components/common/index.ts +110 -0
- package/src/tui/components/index.ts +79 -0
- package/src/tui/components/session/CheckpointPanel.tsx +323 -0
- package/src/tui/components/session/RollbackDialog.tsx +169 -0
- package/src/tui/components/session/SessionItem.tsx +136 -0
- package/src/tui/components/session/SessionListPanel.tsx +252 -0
- package/src/tui/components/session/SessionPicker.tsx +449 -0
- package/src/tui/components/session/SessionPreview.tsx +240 -0
- package/src/tui/components/session/__tests__/session.test.tsx +408 -0
- package/src/tui/components/session/index.ts +28 -0
- package/src/tui/components/session/types.ts +116 -0
- package/src/tui/components/theme/__tests__/tokens.test.ts +471 -0
- package/src/tui/components/theme/index.ts +227 -0
- package/src/tui/components/theme/tokens.ts +484 -0
- package/src/tui/config/defaults.ts +134 -0
- package/src/tui/config/index.ts +17 -0
- package/src/tui/context/AnimationContext.tsx +284 -0
- package/src/tui/context/AppContext.tsx +349 -0
- package/src/tui/context/BracketedPasteContext.tsx +372 -0
- package/src/tui/context/LspContext.tsx +192 -0
- package/src/tui/context/McpContext.tsx +325 -0
- package/src/tui/context/MessagesContext.tsx +870 -0
- package/src/tui/context/OverflowContext.tsx +213 -0
- package/src/tui/context/RateLimitContext.tsx +108 -0
- package/src/tui/context/ResilienceContext.tsx +275 -0
- package/src/tui/context/RootProvider.tsx +136 -0
- package/src/tui/context/ScrollContext.tsx +331 -0
- package/src/tui/context/ToolsContext.tsx +702 -0
- package/src/tui/context/__tests__/BracketedPasteContext.test.tsx +416 -0
- package/src/tui/context/index.ts +140 -0
- package/src/tui/enterprise-integration.ts +282 -0
- package/src/tui/hooks/__tests__/useBacktrack.test.tsx +138 -0
- package/src/tui/hooks/__tests__/useBracketedPaste.test.tsx +222 -0
- package/src/tui/hooks/__tests__/useCopyMode.test.tsx +336 -0
- package/src/tui/hooks/__tests__/useHotkeys.ctrl-input.test.tsx +96 -0
- package/src/tui/hooks/__tests__/useHotkeys.test.tsx +454 -0
- package/src/tui/hooks/__tests__/useInputHistory.test.tsx +660 -0
- package/src/tui/hooks/__tests__/useLineBuffer.test.ts +295 -0
- package/src/tui/hooks/__tests__/useModeController.test.ts +137 -0
- package/src/tui/hooks/__tests__/useModeShortcuts.test.tsx +142 -0
- package/src/tui/hooks/__tests__/useScrollController.test.ts +464 -0
- package/src/tui/hooks/__tests__/useVim.test.tsx +531 -0
- package/src/tui/hooks/index.ts +252 -0
- package/src/tui/hooks/useAgentLoop.ts +712 -0
- package/src/tui/hooks/useAlternateBuffer.ts +398 -0
- package/src/tui/hooks/useAnimatedScrollbar.ts +241 -0
- package/src/tui/hooks/useBacktrack.ts +443 -0
- package/src/tui/hooks/useBracketedPaste.ts +104 -0
- package/src/tui/hooks/useCollapsible.ts +240 -0
- package/src/tui/hooks/useCopyMode.ts +382 -0
- package/src/tui/hooks/useCostSummary.ts +75 -0
- package/src/tui/hooks/useDesktopNotification.ts +414 -0
- package/src/tui/hooks/useDiffMode.ts +44 -0
- package/src/tui/hooks/useFileChangeStats.ts +110 -0
- package/src/tui/hooks/useFileSuggestions.ts +284 -0
- package/src/tui/hooks/useFlickerDetector.ts +250 -0
- package/src/tui/hooks/useGitStatus.ts +200 -0
- package/src/tui/hooks/useHotkeys.ts +579 -0
- package/src/tui/hooks/useImagePaste.ts +114 -0
- package/src/tui/hooks/useInputHighlight.ts +145 -0
- package/src/tui/hooks/useInputHistory.ts +246 -0
- package/src/tui/hooks/useKeyboardScroll.ts +209 -0
- package/src/tui/hooks/useLineBuffer.ts +356 -0
- package/src/tui/hooks/useMentionAutocomplete.ts +235 -0
- package/src/tui/hooks/useModeController.ts +167 -0
- package/src/tui/hooks/useModeShortcuts.ts +196 -0
- package/src/tui/hooks/usePermissionHandler.ts +146 -0
- package/src/tui/hooks/usePersistence.ts +480 -0
- package/src/tui/hooks/usePersistenceShortcuts.ts +225 -0
- package/src/tui/hooks/usePlaceholderRotation.ts +143 -0
- package/src/tui/hooks/useProviderStatus.ts +270 -0
- package/src/tui/hooks/useRateLimitStatus.ts +90 -0
- package/src/tui/hooks/useScreenReader.ts +315 -0
- package/src/tui/hooks/useScrollController.ts +450 -0
- package/src/tui/hooks/useScrollEventBatcher.ts +185 -0
- package/src/tui/hooks/useSidebarPanelData.ts +115 -0
- package/src/tui/hooks/useSmoothScroll.ts +202 -0
- package/src/tui/hooks/useSnapshots.ts +300 -0
- package/src/tui/hooks/useStateAndRef.ts +50 -0
- package/src/tui/hooks/useTerminalSize.ts +206 -0
- package/src/tui/hooks/useToolApprovalController.ts +91 -0
- package/src/tui/hooks/useVim.ts +334 -0
- package/src/tui/hooks/useWorkspace.ts +56 -0
- package/src/tui/i18n/__tests__/init.test.ts +278 -0
- package/src/tui/i18n/__tests__/language-config.test.ts +199 -0
- package/src/tui/i18n/__tests__/locale-detection.test.ts +250 -0
- package/src/tui/i18n/__tests__/settings-integration.test.ts +262 -0
- package/src/tui/i18n/index.ts +72 -0
- package/src/tui/i18n/init.ts +131 -0
- package/src/tui/i18n/language-config.ts +106 -0
- package/src/tui/i18n/locale-detection.ts +173 -0
- package/src/tui/i18n/settings-integration.ts +557 -0
- package/src/tui/i18n/tui-namespace.ts +538 -0
- package/src/tui/i18n/types.ts +312 -0
- package/src/tui/index.ts +43 -0
- package/src/tui/lsp-integration.ts +409 -0
- package/src/tui/metrics-integration.ts +366 -0
- package/src/tui/plugins.ts +383 -0
- package/src/tui/resilience.ts +342 -0
- package/src/tui/sandbox-integration.ts +317 -0
- package/src/tui/services/clipboard.ts +348 -0
- package/src/tui/services/fuzzy-search.ts +441 -0
- package/src/tui/services/index.ts +72 -0
- package/src/tui/services/markdown-renderer.ts +565 -0
- package/src/tui/services/open-external.ts +247 -0
- package/src/tui/services/syntax-highlighter.ts +483 -0
- package/src/tui/slash-commands.ts +12 -0
- package/src/tui/theme/index.ts +15 -0
- package/src/tui/theme/provider.tsx +206 -0
- package/src/tui/tip-integration.ts +300 -0
- package/src/tui/types/__tests__/ink-extended.test.ts +121 -0
- package/src/tui/types/ink-extended.ts +87 -0
- package/src/tui/utils/__tests__/bracketedPaste.test.ts +231 -0
- package/src/tui/utils/__tests__/heightEstimator.test.ts +157 -0
- package/src/tui/utils/__tests__/text-width.test.ts +158 -0
- package/src/tui/utils/__tests__/textSanitizer.test.ts +266 -0
- package/src/tui/utils/__tests__/ui-sizing.test.ts +169 -0
- package/src/tui/utils/bracketedPaste.ts +107 -0
- package/src/tui/utils/cursor-manager.ts +131 -0
- package/src/tui/utils/detectTerminal.ts +596 -0
- package/src/tui/utils/findLastSafeSplitPoint.ts +92 -0
- package/src/tui/utils/heightEstimator.ts +198 -0
- package/src/tui/utils/index.ts +91 -0
- package/src/tui/utils/isNarrowWidth.ts +52 -0
- package/src/tui/utils/stdoutGuard.ts +90 -0
- package/src/tui/utils/synchronized-update.ts +70 -0
- package/src/tui/utils/text-width.ts +225 -0
- package/src/tui/utils/textSanitizer.ts +225 -0
- package/src/tui/utils/textUtils.ts +114 -0
- package/src/tui/utils/ui-sizing.ts +192 -0
- package/src/tui-blessed/app.ts +160 -0
- package/src/tui-blessed/index.ts +2 -0
- package/src/tui-blessed/neo-blessed.d.ts +6 -0
- package/src/tui-blessed/test.ts +21 -0
- package/src/tui-blessed/types.ts +14 -0
- package/src/utils/icons.ts +130 -0
- package/src/utils/index.ts +33 -0
- package/src/utils/resume-hint.ts +86 -0
- package/src/version.ts +1 -0
- package/tsconfig.json +8 -0
- package/vitest.config.ts +35 -0
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LSP Integration Module
|
|
3
|
+
*
|
|
4
|
+
* Provides LSP (Language Server Protocol) integration for the CLI.
|
|
5
|
+
* Initializes the LspHub, registers LSP tools with the tool registry,
|
|
6
|
+
* and provides graceful fallback when language servers are unavailable.
|
|
7
|
+
*
|
|
8
|
+
* @module cli/tui/lsp-integration
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { homedir } from "node:os";
|
|
12
|
+
import { join, resolve } from "node:path";
|
|
13
|
+
|
|
14
|
+
import {
|
|
15
|
+
createLspTools,
|
|
16
|
+
type LspHub,
|
|
17
|
+
LspHub as LspHubClass,
|
|
18
|
+
registerLspTools,
|
|
19
|
+
type ToolRegistryLike,
|
|
20
|
+
unregisterLspTools,
|
|
21
|
+
} from "@vellum/lsp";
|
|
22
|
+
|
|
23
|
+
// =============================================================================
|
|
24
|
+
// Types
|
|
25
|
+
// =============================================================================
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Options for LSP integration initialization
|
|
29
|
+
*/
|
|
30
|
+
export interface LspIntegrationOptions {
|
|
31
|
+
/**
|
|
32
|
+
* Workspace root directory for project-local LSP configuration.
|
|
33
|
+
* @default process.cwd()
|
|
34
|
+
*/
|
|
35
|
+
workspaceRoot?: string;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Tool registry to register LSP tools with.
|
|
39
|
+
* If provided, LSP tools will be automatically registered.
|
|
40
|
+
*/
|
|
41
|
+
toolRegistry?: ToolRegistryLike;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Whether to automatically install missing language servers.
|
|
45
|
+
* @default false
|
|
46
|
+
*/
|
|
47
|
+
autoInstall?: boolean;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Callback for LSP events (server start/stop, errors, etc.)
|
|
51
|
+
*/
|
|
52
|
+
onEvent?: (event: string, data: unknown) => void;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Logger for LSP operations
|
|
56
|
+
*/
|
|
57
|
+
logger?: {
|
|
58
|
+
debug?: (message: string, meta?: Record<string, unknown>) => void;
|
|
59
|
+
info?: (message: string, meta?: Record<string, unknown>) => void;
|
|
60
|
+
warn?: (message: string, meta?: Record<string, unknown>) => void;
|
|
61
|
+
error?: (message: string, meta?: Record<string, unknown>) => void;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Maximum number of concurrent language servers.
|
|
66
|
+
* @default 5
|
|
67
|
+
*/
|
|
68
|
+
maxConcurrentServers?: number;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Idle timeout before stopping unused servers (ms).
|
|
72
|
+
* @default 300000 (5 minutes)
|
|
73
|
+
*/
|
|
74
|
+
idleTimeoutMs?: number;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Result of LSP integration initialization
|
|
79
|
+
*/
|
|
80
|
+
export interface LspIntegrationResult {
|
|
81
|
+
/** The initialized LspHub instance (null if initialization failed) */
|
|
82
|
+
hub: LspHub | null;
|
|
83
|
+
|
|
84
|
+
/** Number of LSP tools registered */
|
|
85
|
+
toolCount: number;
|
|
86
|
+
|
|
87
|
+
/** Whether initialization was successful */
|
|
88
|
+
success: boolean;
|
|
89
|
+
|
|
90
|
+
/** Error message if initialization failed */
|
|
91
|
+
error?: string;
|
|
92
|
+
|
|
93
|
+
/** Available language server IDs */
|
|
94
|
+
availableServers: string[];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* LSP integration state
|
|
99
|
+
*/
|
|
100
|
+
export interface LspIntegrationState {
|
|
101
|
+
/** Whether LSP is initialized */
|
|
102
|
+
initialized: boolean;
|
|
103
|
+
|
|
104
|
+
/** Currently running server IDs */
|
|
105
|
+
runningServers: string[];
|
|
106
|
+
|
|
107
|
+
/** Tool registration status */
|
|
108
|
+
toolsRegistered: boolean;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// =============================================================================
|
|
112
|
+
// LSP Integration Manager
|
|
113
|
+
// =============================================================================
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Manages LSP integration lifecycle
|
|
117
|
+
*
|
|
118
|
+
* Provides methods to initialize, configure, and dispose of LSP services.
|
|
119
|
+
* Handles graceful degradation when language servers are unavailable.
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```typescript
|
|
123
|
+
* const lspManager = new LspIntegrationManager();
|
|
124
|
+
*
|
|
125
|
+
* const result = await lspManager.initialize({
|
|
126
|
+
* workspaceRoot: process.cwd(),
|
|
127
|
+
* toolRegistry: registry,
|
|
128
|
+
* autoInstall: true,
|
|
129
|
+
* });
|
|
130
|
+
*
|
|
131
|
+
* if (result.success) {
|
|
132
|
+
* console.log(`LSP initialized with ${result.toolCount} tools`);
|
|
133
|
+
* }
|
|
134
|
+
*
|
|
135
|
+
* // Later: cleanup
|
|
136
|
+
* await lspManager.dispose();
|
|
137
|
+
* ```
|
|
138
|
+
*/
|
|
139
|
+
export class LspIntegrationManager {
|
|
140
|
+
private hub: LspHub | null = null;
|
|
141
|
+
private toolRegistry: ToolRegistryLike | null = null;
|
|
142
|
+
private initialized = false;
|
|
143
|
+
private options: LspIntegrationOptions = {};
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Initialize LSP integration
|
|
147
|
+
*
|
|
148
|
+
* @param options - Initialization options
|
|
149
|
+
* @returns Initialization result
|
|
150
|
+
*/
|
|
151
|
+
async initialize(options: LspIntegrationOptions = {}): Promise<LspIntegrationResult> {
|
|
152
|
+
this.options = options;
|
|
153
|
+
const workspaceRoot = options.workspaceRoot ?? process.cwd();
|
|
154
|
+
|
|
155
|
+
try {
|
|
156
|
+
// Create LspHub instance
|
|
157
|
+
this.hub = LspHubClass.getInstance({
|
|
158
|
+
getGlobalConfigPath: async () => join(homedir(), ".vellum", "lsp.json"),
|
|
159
|
+
getProjectConfigPath: async () => join(resolve(workspaceRoot), ".vellum", "lsp.json"),
|
|
160
|
+
toolRegistry: options.toolRegistry,
|
|
161
|
+
onEvent: options.onEvent ? (event, data) => options.onEvent?.(event, data) : undefined,
|
|
162
|
+
logger: options.logger,
|
|
163
|
+
autoInstall: options.autoInstall ?? false,
|
|
164
|
+
idleTimeoutMs: options.idleTimeoutMs ?? 300000,
|
|
165
|
+
maxRestartAttempts: 3,
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
// Initialize the hub
|
|
169
|
+
await this.hub.initialize();
|
|
170
|
+
|
|
171
|
+
// Get available servers
|
|
172
|
+
const servers = this.hub.getServers();
|
|
173
|
+
const availableServers = servers.map((s) => s.id);
|
|
174
|
+
|
|
175
|
+
// Register tools if registry provided
|
|
176
|
+
let toolCount = 0;
|
|
177
|
+
if (options.toolRegistry) {
|
|
178
|
+
this.toolRegistry = options.toolRegistry;
|
|
179
|
+
toolCount = registerLspTools(options.toolRegistry, this.hub);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
this.initialized = true;
|
|
183
|
+
|
|
184
|
+
return {
|
|
185
|
+
hub: this.hub,
|
|
186
|
+
toolCount,
|
|
187
|
+
success: true,
|
|
188
|
+
availableServers,
|
|
189
|
+
};
|
|
190
|
+
} catch (error) {
|
|
191
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
192
|
+
|
|
193
|
+
// Log the error but don't fail - LSP is optional
|
|
194
|
+
options.logger?.warn?.("LSP initialization failed (non-critical)", {
|
|
195
|
+
error: errorMessage,
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
return {
|
|
199
|
+
hub: null,
|
|
200
|
+
toolCount: 0,
|
|
201
|
+
success: false,
|
|
202
|
+
error: errorMessage,
|
|
203
|
+
availableServers: [],
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Get the current integration state
|
|
210
|
+
*/
|
|
211
|
+
getState(): LspIntegrationState {
|
|
212
|
+
if (!this.hub || !this.initialized) {
|
|
213
|
+
return {
|
|
214
|
+
initialized: false,
|
|
215
|
+
runningServers: [],
|
|
216
|
+
toolsRegistered: false,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const servers = this.hub.getServers();
|
|
221
|
+
const runningServers = servers.filter((s) => s.status.status === "running").map((s) => s.id);
|
|
222
|
+
|
|
223
|
+
return {
|
|
224
|
+
initialized: true,
|
|
225
|
+
runningServers,
|
|
226
|
+
toolsRegistered: this.toolRegistry !== null,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Get the LspHub instance
|
|
232
|
+
*
|
|
233
|
+
* @returns LspHub instance or null if not initialized
|
|
234
|
+
*/
|
|
235
|
+
getHub(): LspHub | null {
|
|
236
|
+
return this.hub;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Get LSP tools without auto-registration
|
|
241
|
+
*
|
|
242
|
+
* @returns Array of LSP tool definitions, or empty array if not initialized
|
|
243
|
+
*/
|
|
244
|
+
getTools(): unknown[] {
|
|
245
|
+
if (!this.hub) {
|
|
246
|
+
return [];
|
|
247
|
+
}
|
|
248
|
+
return createLspTools(this.hub);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Start a specific language server
|
|
253
|
+
*
|
|
254
|
+
* @param serverId - Language server ID (e.g., "typescript", "python")
|
|
255
|
+
* @param workspaceRoot - Optional workspace root override
|
|
256
|
+
* @returns Whether the server started successfully
|
|
257
|
+
*/
|
|
258
|
+
async startServer(serverId: string, workspaceRoot?: string): Promise<boolean> {
|
|
259
|
+
if (!this.hub) {
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
try {
|
|
264
|
+
await this.hub.startServer(serverId, workspaceRoot);
|
|
265
|
+
return true;
|
|
266
|
+
} catch (error) {
|
|
267
|
+
this.options.logger?.warn?.(`Failed to start LSP server: ${serverId}`, {
|
|
268
|
+
error: error instanceof Error ? error.message : String(error),
|
|
269
|
+
});
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Stop a specific language server
|
|
276
|
+
*
|
|
277
|
+
* @param serverId - Language server ID
|
|
278
|
+
* @returns Whether the server stopped successfully
|
|
279
|
+
*/
|
|
280
|
+
async stopServer(serverId: string): Promise<boolean> {
|
|
281
|
+
if (!this.hub) {
|
|
282
|
+
return false;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
try {
|
|
286
|
+
await this.hub.stopServer(serverId);
|
|
287
|
+
return true;
|
|
288
|
+
} catch (error) {
|
|
289
|
+
this.options.logger?.warn?.(`Failed to stop LSP server: ${serverId}`, {
|
|
290
|
+
error: error instanceof Error ? error.message : String(error),
|
|
291
|
+
});
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Dispose of all LSP resources
|
|
298
|
+
*
|
|
299
|
+
* Stops all running servers and unregisters tools.
|
|
300
|
+
*/
|
|
301
|
+
async dispose(): Promise<void> {
|
|
302
|
+
// Unregister tools
|
|
303
|
+
if (this.toolRegistry) {
|
|
304
|
+
unregisterLspTools(this.toolRegistry);
|
|
305
|
+
this.toolRegistry = null;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// Dispose hub
|
|
309
|
+
if (this.hub) {
|
|
310
|
+
try {
|
|
311
|
+
await this.hub.dispose();
|
|
312
|
+
} catch {
|
|
313
|
+
// Ignore dispose errors
|
|
314
|
+
}
|
|
315
|
+
this.hub = null;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
this.initialized = false;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// =============================================================================
|
|
323
|
+
// Singleton Instance
|
|
324
|
+
// =============================================================================
|
|
325
|
+
|
|
326
|
+
let globalManager: LspIntegrationManager | null = null;
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Get or create the global LSP integration manager
|
|
330
|
+
*/
|
|
331
|
+
export function getLspManager(): LspIntegrationManager {
|
|
332
|
+
if (!globalManager) {
|
|
333
|
+
globalManager = new LspIntegrationManager();
|
|
334
|
+
}
|
|
335
|
+
return globalManager;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Initialize LSP integration with the global manager
|
|
340
|
+
*
|
|
341
|
+
* @param options - Initialization options
|
|
342
|
+
* @returns Initialization result
|
|
343
|
+
*/
|
|
344
|
+
export async function initializeLsp(
|
|
345
|
+
options: LspIntegrationOptions = {}
|
|
346
|
+
): Promise<LspIntegrationResult> {
|
|
347
|
+
return getLspManager().initialize(options);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Dispose of the global LSP manager
|
|
352
|
+
*/
|
|
353
|
+
export async function disposeLsp(): Promise<void> {
|
|
354
|
+
if (globalManager) {
|
|
355
|
+
await globalManager.dispose();
|
|
356
|
+
globalManager = null;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// =============================================================================
|
|
361
|
+
// React Hook (for use in components)
|
|
362
|
+
// =============================================================================
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* LSP hook state
|
|
366
|
+
*/
|
|
367
|
+
export interface UseLspState {
|
|
368
|
+
/** Whether LSP is initialized */
|
|
369
|
+
initialized: boolean;
|
|
370
|
+
|
|
371
|
+
/** Whether LSP is loading */
|
|
372
|
+
loading: boolean;
|
|
373
|
+
|
|
374
|
+
/** Error message if initialization failed */
|
|
375
|
+
error: string | null;
|
|
376
|
+
|
|
377
|
+
/** Number of registered LSP tools */
|
|
378
|
+
toolCount: number;
|
|
379
|
+
|
|
380
|
+
/** Available language servers */
|
|
381
|
+
availableServers: string[];
|
|
382
|
+
|
|
383
|
+
/** Currently running servers */
|
|
384
|
+
runningServers: string[];
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* LSP hook actions
|
|
389
|
+
*/
|
|
390
|
+
export interface UseLspActions {
|
|
391
|
+
/** Start a language server */
|
|
392
|
+
startServer: (serverId: string) => Promise<boolean>;
|
|
393
|
+
|
|
394
|
+
/** Stop a language server */
|
|
395
|
+
stopServer: (serverId: string) => Promise<boolean>;
|
|
396
|
+
|
|
397
|
+
/** Refresh LSP state */
|
|
398
|
+
refresh: () => void;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* LSP hook return type
|
|
403
|
+
*/
|
|
404
|
+
export type UseLspReturn = UseLspState & UseLspActions;
|
|
405
|
+
|
|
406
|
+
// Note: The actual React hook implementation would go in a separate file
|
|
407
|
+
// under hooks/ to avoid importing React in this module.
|
|
408
|
+
// This module provides the core integration logic that can be used
|
|
409
|
+
// both in React components (via a hook wrapper) and in non-React code.
|