@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,355 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistence Slash Commands
|
|
3
|
+
*
|
|
4
|
+
* Provides slash commands for session persistence management:
|
|
5
|
+
* - /checkpoint [desc] - Create a new checkpoint
|
|
6
|
+
* - /checkpoints - List all checkpoints
|
|
7
|
+
* - /rollback [id] - Rollback to a checkpoint
|
|
8
|
+
* - /save - Force save session
|
|
9
|
+
*
|
|
10
|
+
* @module cli/commands/persistence
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type { SessionCheckpoint } from "@vellum/core";
|
|
14
|
+
import { ICONS } from "../utils/icons.js";
|
|
15
|
+
import type { CommandContext, CommandResult, SlashCommand } from "./types.js";
|
|
16
|
+
import { error, success } from "./types.js";
|
|
17
|
+
|
|
18
|
+
// =============================================================================
|
|
19
|
+
// Types
|
|
20
|
+
// =============================================================================
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Persistence interface for slash commands.
|
|
24
|
+
* Matches the relevant subset of UsePersistenceReturn.
|
|
25
|
+
*/
|
|
26
|
+
export interface PersistenceCommandsRef {
|
|
27
|
+
/** Current persistence status */
|
|
28
|
+
readonly status: "idle" | "saving" | "saved" | "error";
|
|
29
|
+
/** Number of unsaved messages */
|
|
30
|
+
readonly unsavedCount: number;
|
|
31
|
+
/** All checkpoints for current session */
|
|
32
|
+
readonly checkpoints: readonly SessionCheckpoint[];
|
|
33
|
+
/** Whether advanced persistence is enabled */
|
|
34
|
+
readonly isAdvancedEnabled: boolean;
|
|
35
|
+
/** Create a checkpoint */
|
|
36
|
+
createCheckpoint: (description?: string) => Promise<string | null>;
|
|
37
|
+
/** Rollback to a checkpoint */
|
|
38
|
+
rollbackToCheckpoint: (checkpointId: string) => Promise<boolean>;
|
|
39
|
+
/** Delete a checkpoint */
|
|
40
|
+
deleteCheckpoint: (checkpointId: string) => Promise<boolean>;
|
|
41
|
+
/** Get messages that will be lost on rollback */
|
|
42
|
+
getMessagesToLose: (checkpointId: string) => number;
|
|
43
|
+
/** Force save */
|
|
44
|
+
forceSave: () => Promise<void>;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// =============================================================================
|
|
48
|
+
// Module State
|
|
49
|
+
// =============================================================================
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Reference to the active persistence instance.
|
|
53
|
+
* Set by the App component when initialized.
|
|
54
|
+
*/
|
|
55
|
+
let persistenceRef: PersistenceCommandsRef | null = null;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Set the persistence instance for commands.
|
|
59
|
+
*
|
|
60
|
+
* @param ref - The persistence instance to use
|
|
61
|
+
*/
|
|
62
|
+
export function setPersistenceRef(ref: PersistenceCommandsRef | null): void {
|
|
63
|
+
persistenceRef = ref;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Get the current persistence instance.
|
|
68
|
+
*
|
|
69
|
+
* @returns The current persistence instance or null
|
|
70
|
+
*/
|
|
71
|
+
export function getPersistenceRef(): PersistenceCommandsRef | null {
|
|
72
|
+
return persistenceRef;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// =============================================================================
|
|
76
|
+
// Helper Functions
|
|
77
|
+
// =============================================================================
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Format a checkpoint for display.
|
|
81
|
+
*/
|
|
82
|
+
function formatCheckpoint(checkpoint: SessionCheckpoint, index: number): string {
|
|
83
|
+
const date = new Date(checkpoint.createdAt);
|
|
84
|
+
const timeStr = date.toLocaleTimeString(undefined, {
|
|
85
|
+
hour: "2-digit",
|
|
86
|
+
minute: "2-digit",
|
|
87
|
+
});
|
|
88
|
+
const dateStr = date.toLocaleDateString(undefined, {
|
|
89
|
+
month: "short",
|
|
90
|
+
day: "numeric",
|
|
91
|
+
});
|
|
92
|
+
const desc = checkpoint.description ?? "(no description)";
|
|
93
|
+
const idShort = checkpoint.id.slice(0, 8);
|
|
94
|
+
|
|
95
|
+
return ` ${index + 1}. [${idShort}] ${desc} | ${dateStr} ${timeStr} | msg #${checkpoint.messageIndex}`;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Format checkpoints as a table.
|
|
100
|
+
*/
|
|
101
|
+
function formatCheckpointsTable(checkpoints: readonly SessionCheckpoint[]): string {
|
|
102
|
+
if (checkpoints.length === 0) {
|
|
103
|
+
return "📌 No checkpoints found.\n\nUse /checkpoint [description] to create one.";
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const lines = [
|
|
107
|
+
"📌 Checkpoints",
|
|
108
|
+
"",
|
|
109
|
+
" # ID Description Date Time Msg",
|
|
110
|
+
" ─────────────────────────────────────────────────────────",
|
|
111
|
+
...checkpoints.map((cp, i) => formatCheckpoint(cp, i)),
|
|
112
|
+
"",
|
|
113
|
+
"Use /rollback <id> to restore to a checkpoint.",
|
|
114
|
+
];
|
|
115
|
+
|
|
116
|
+
return lines.join("\n");
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// =============================================================================
|
|
120
|
+
// /checkpoint Command
|
|
121
|
+
// =============================================================================
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* /checkpoint [desc] - Create a new checkpoint.
|
|
125
|
+
*/
|
|
126
|
+
export const checkpointCommand: SlashCommand = {
|
|
127
|
+
name: "checkpoint",
|
|
128
|
+
description: "Create a checkpoint at current conversation state",
|
|
129
|
+
kind: "builtin",
|
|
130
|
+
category: "session",
|
|
131
|
+
aliases: ["cp"],
|
|
132
|
+
positionalArgs: [
|
|
133
|
+
{
|
|
134
|
+
name: "description",
|
|
135
|
+
type: "string",
|
|
136
|
+
description: "Optional description for the checkpoint",
|
|
137
|
+
required: false,
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
examples: [
|
|
141
|
+
"/checkpoint - Create checkpoint without description",
|
|
142
|
+
"/checkpoint 'Before refactor' - Create checkpoint with description",
|
|
143
|
+
],
|
|
144
|
+
|
|
145
|
+
execute: async (ctx: CommandContext): Promise<CommandResult> => {
|
|
146
|
+
if (!persistenceRef) {
|
|
147
|
+
return error("OPERATION_NOT_ALLOWED", "Persistence system not initialized", [
|
|
148
|
+
"Try again after the app is fully loaded.",
|
|
149
|
+
]);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (!persistenceRef.isAdvancedEnabled) {
|
|
153
|
+
return error("OPERATION_NOT_ALLOWED", "Checkpoints require advanced persistence mode", [
|
|
154
|
+
"Enable advanced persistence in your configuration.",
|
|
155
|
+
]);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const description = ctx.parsedArgs.positional[0] as string | undefined;
|
|
159
|
+
|
|
160
|
+
try {
|
|
161
|
+
const checkpointId = await persistenceRef.createCheckpoint(description);
|
|
162
|
+
|
|
163
|
+
if (!checkpointId) {
|
|
164
|
+
return error("INTERNAL_ERROR", "Failed to create checkpoint", [
|
|
165
|
+
"Try again or check the session state.",
|
|
166
|
+
]);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return success(
|
|
170
|
+
`${ICONS.success} Checkpoint created: ${checkpointId.slice(0, 8)}${description ? ` - "${description}"` : ""}`
|
|
171
|
+
);
|
|
172
|
+
} catch (err) {
|
|
173
|
+
return error(
|
|
174
|
+
"INTERNAL_ERROR",
|
|
175
|
+
`Failed to create checkpoint: ${err instanceof Error ? err.message : String(err)}`
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
// =============================================================================
|
|
182
|
+
// /checkpoints Command
|
|
183
|
+
// =============================================================================
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* /checkpoints - List all checkpoints for current session.
|
|
187
|
+
*/
|
|
188
|
+
export const checkpointsCommand: SlashCommand = {
|
|
189
|
+
name: "checkpoints",
|
|
190
|
+
description: "List all checkpoints for current session",
|
|
191
|
+
kind: "builtin",
|
|
192
|
+
category: "session",
|
|
193
|
+
aliases: ["cps", "listcp"],
|
|
194
|
+
examples: ["/checkpoints - Show all checkpoints"],
|
|
195
|
+
|
|
196
|
+
execute: async (_ctx: CommandContext): Promise<CommandResult> => {
|
|
197
|
+
if (!persistenceRef) {
|
|
198
|
+
return error("OPERATION_NOT_ALLOWED", "Persistence system not initialized", [
|
|
199
|
+
"Try again after the app is fully loaded.",
|
|
200
|
+
]);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (!persistenceRef.isAdvancedEnabled) {
|
|
204
|
+
return error("OPERATION_NOT_ALLOWED", "Checkpoints require advanced persistence mode", [
|
|
205
|
+
"Enable advanced persistence in your configuration.",
|
|
206
|
+
]);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
const checkpoints = persistenceRef.checkpoints;
|
|
210
|
+
return success(formatCheckpointsTable(checkpoints));
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
// =============================================================================
|
|
215
|
+
// /rollback Command
|
|
216
|
+
// =============================================================================
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* /rollback [id] - Rollback to a checkpoint.
|
|
220
|
+
*/
|
|
221
|
+
export const rollbackCommand: SlashCommand = {
|
|
222
|
+
name: "rollback",
|
|
223
|
+
description: "Rollback to a previous checkpoint",
|
|
224
|
+
kind: "builtin",
|
|
225
|
+
category: "session",
|
|
226
|
+
aliases: ["rb", "restore"],
|
|
227
|
+
positionalArgs: [
|
|
228
|
+
{
|
|
229
|
+
name: "checkpointId",
|
|
230
|
+
type: "string",
|
|
231
|
+
description: "Checkpoint ID (first 8 characters or full ID)",
|
|
232
|
+
required: true,
|
|
233
|
+
},
|
|
234
|
+
],
|
|
235
|
+
examples: [
|
|
236
|
+
"/rollback abc12345 - Rollback to checkpoint with ID starting with abc12345",
|
|
237
|
+
],
|
|
238
|
+
|
|
239
|
+
execute: async (ctx: CommandContext): Promise<CommandResult> => {
|
|
240
|
+
if (!persistenceRef) {
|
|
241
|
+
return error("OPERATION_NOT_ALLOWED", "Persistence system not initialized", [
|
|
242
|
+
"Try again after the app is fully loaded.",
|
|
243
|
+
]);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
if (!persistenceRef.isAdvancedEnabled) {
|
|
247
|
+
return error("OPERATION_NOT_ALLOWED", "Rollback requires advanced persistence mode", [
|
|
248
|
+
"Enable advanced persistence in your configuration.",
|
|
249
|
+
]);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const checkpointIdArg = ctx.parsedArgs.positional[0] as string | undefined;
|
|
253
|
+
|
|
254
|
+
if (!checkpointIdArg) {
|
|
255
|
+
return error("MISSING_ARGUMENT", "Checkpoint ID is required", [
|
|
256
|
+
"Usage: /rollback <checkpoint-id>",
|
|
257
|
+
"Use /checkpoints to list available checkpoints.",
|
|
258
|
+
]);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Find checkpoint by ID or ID prefix
|
|
262
|
+
const checkpoint = persistenceRef.checkpoints.find(
|
|
263
|
+
(cp) => cp.id === checkpointIdArg || cp.id.startsWith(checkpointIdArg)
|
|
264
|
+
);
|
|
265
|
+
|
|
266
|
+
if (!checkpoint) {
|
|
267
|
+
return error("RESOURCE_NOT_FOUND", `Checkpoint not found: ${checkpointIdArg}`, [
|
|
268
|
+
"Use /checkpoints to list available checkpoints.",
|
|
269
|
+
]);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// Calculate messages that will be lost
|
|
273
|
+
const messagesToLose = persistenceRef.getMessagesToLose(checkpoint.id);
|
|
274
|
+
|
|
275
|
+
if (messagesToLose === 0) {
|
|
276
|
+
return success("Already at this checkpoint. No changes needed.");
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// Perform rollback
|
|
280
|
+
try {
|
|
281
|
+
const result = await persistenceRef.rollbackToCheckpoint(checkpoint.id);
|
|
282
|
+
|
|
283
|
+
if (!result) {
|
|
284
|
+
return error("INTERNAL_ERROR", "Rollback operation failed", [
|
|
285
|
+
"The checkpoint may have been deleted or corrupted.",
|
|
286
|
+
]);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
return success(
|
|
290
|
+
`${ICONS.success} Rolled back to checkpoint ${checkpoint.id.slice(0, 8)}\n` +
|
|
291
|
+
` Removed ${messagesToLose} message${messagesToLose === 1 ? "" : "s"}.`
|
|
292
|
+
);
|
|
293
|
+
} catch (err) {
|
|
294
|
+
return error(
|
|
295
|
+
"INTERNAL_ERROR",
|
|
296
|
+
`Rollback failed: ${err instanceof Error ? err.message : String(err)}`
|
|
297
|
+
);
|
|
298
|
+
}
|
|
299
|
+
},
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
// =============================================================================
|
|
303
|
+
// /save Command
|
|
304
|
+
// =============================================================================
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* /save - Force save the current session.
|
|
308
|
+
*/
|
|
309
|
+
export const saveCommand: SlashCommand = {
|
|
310
|
+
name: "save",
|
|
311
|
+
description: "Force save the current session",
|
|
312
|
+
kind: "builtin",
|
|
313
|
+
category: "session",
|
|
314
|
+
aliases: ["s"],
|
|
315
|
+
examples: ["/save - Save session immediately"],
|
|
316
|
+
|
|
317
|
+
execute: async (_ctx: CommandContext): Promise<CommandResult> => {
|
|
318
|
+
if (!persistenceRef) {
|
|
319
|
+
return error("OPERATION_NOT_ALLOWED", "Persistence system not initialized", [
|
|
320
|
+
"Try again after the app is fully loaded.",
|
|
321
|
+
]);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
try {
|
|
325
|
+
await persistenceRef.forceSave();
|
|
326
|
+
|
|
327
|
+
const unsaved = persistenceRef.unsavedCount;
|
|
328
|
+
if (unsaved > 0) {
|
|
329
|
+
return success(`💾 Session saved. ${unsaved} changes synced.`);
|
|
330
|
+
}
|
|
331
|
+
return success("💾 Session saved.");
|
|
332
|
+
} catch (err) {
|
|
333
|
+
return error(
|
|
334
|
+
"INTERNAL_ERROR",
|
|
335
|
+
`Save failed: ${err instanceof Error ? err.message : String(err)}`
|
|
336
|
+
);
|
|
337
|
+
}
|
|
338
|
+
},
|
|
339
|
+
};
|
|
340
|
+
|
|
341
|
+
// =============================================================================
|
|
342
|
+
// Export Command Array
|
|
343
|
+
// =============================================================================
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* All persistence-related slash commands.
|
|
347
|
+
*/
|
|
348
|
+
export const persistenceCommands: readonly SlashCommand[] = [
|
|
349
|
+
checkpointCommand,
|
|
350
|
+
checkpointsCommand,
|
|
351
|
+
rollbackCommand,
|
|
352
|
+
saveCommand,
|
|
353
|
+
];
|
|
354
|
+
|
|
355
|
+
export default persistenceCommands;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Progress Command (REQ-022)
|
|
3
|
+
* @module cli/commands/progress
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { CommandResult, SlashCommand } from "./types.js";
|
|
7
|
+
import { success } from "./types.js";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Progress command
|
|
11
|
+
*/
|
|
12
|
+
export const progressCommand: SlashCommand = {
|
|
13
|
+
name: "progress",
|
|
14
|
+
description: "Show task progress",
|
|
15
|
+
kind: "builtin",
|
|
16
|
+
category: "system",
|
|
17
|
+
execute: async (): Promise<CommandResult> => success("Progress command not yet implemented"),
|
|
18
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt Commands Index
|
|
3
|
+
*
|
|
4
|
+
* Barrel exports for prompt-related commands.
|
|
5
|
+
*
|
|
6
|
+
* @module cli/commands/prompt
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export {
|
|
10
|
+
executePromptValidate,
|
|
11
|
+
type PromptValidateOptions,
|
|
12
|
+
type PromptValidateResult,
|
|
13
|
+
promptValidateCommand,
|
|
14
|
+
runPromptValidateCli,
|
|
15
|
+
type ValidationIssue,
|
|
16
|
+
type ValidationSeverity,
|
|
17
|
+
} from "./validate.js";
|