@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,512 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command System Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* Core types for the slash command system including:
|
|
5
|
+
* - Command definitions and metadata
|
|
6
|
+
* - Argument parsing types
|
|
7
|
+
* - Command execution context
|
|
8
|
+
* - Result types with discriminated unions
|
|
9
|
+
*
|
|
10
|
+
* @module cli/commands/types
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type { CredentialManager, ToolRegistry } from "@vellum/core";
|
|
14
|
+
|
|
15
|
+
import type { CommandSecurityPolicy } from "./security/permission-checker.js";
|
|
16
|
+
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// T005: Argument Types
|
|
19
|
+
// =============================================================================
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Supported argument value types
|
|
23
|
+
*
|
|
24
|
+
* - string: Text value
|
|
25
|
+
* - number: Numeric value (parsed from string)
|
|
26
|
+
* - boolean: Flag value (true/false)
|
|
27
|
+
* - path: File system path (validated)
|
|
28
|
+
*/
|
|
29
|
+
export type ArgType = "string" | "number" | "boolean" | "path";
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Definition for a positional argument
|
|
33
|
+
*
|
|
34
|
+
* Positional arguments are identified by their order in the command.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* const arg: PositionalArg = {
|
|
39
|
+
* name: 'provider',
|
|
40
|
+
* type: 'string',
|
|
41
|
+
* description: 'Provider name (e.g., anthropic)',
|
|
42
|
+
* required: true,
|
|
43
|
+
* };
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export interface PositionalArg {
|
|
47
|
+
/** Argument name for display and reference */
|
|
48
|
+
readonly name: string;
|
|
49
|
+
/** Expected value type */
|
|
50
|
+
readonly type: ArgType;
|
|
51
|
+
/** Help text describing the argument */
|
|
52
|
+
readonly description: string;
|
|
53
|
+
/** Whether the argument must be provided */
|
|
54
|
+
readonly required: boolean;
|
|
55
|
+
/** Default value if not provided */
|
|
56
|
+
readonly default?: string | number | boolean;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Definition for a named (flag) argument
|
|
61
|
+
*
|
|
62
|
+
* Named arguments use --flag or -f syntax.
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```typescript
|
|
66
|
+
* const arg: NamedArg = {
|
|
67
|
+
* name: 'store',
|
|
68
|
+
* shorthand: 's',
|
|
69
|
+
* type: 'string',
|
|
70
|
+
* description: 'Credential store to use',
|
|
71
|
+
* required: false,
|
|
72
|
+
* default: 'keychain',
|
|
73
|
+
* };
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export interface NamedArg {
|
|
77
|
+
/** Long form name (used as --name) */
|
|
78
|
+
readonly name: string;
|
|
79
|
+
/** Optional short form (used as -x) */
|
|
80
|
+
readonly shorthand?: string;
|
|
81
|
+
/** Expected value type */
|
|
82
|
+
readonly type: ArgType;
|
|
83
|
+
/** Help text describing the argument */
|
|
84
|
+
readonly description: string;
|
|
85
|
+
/** Whether the argument must be provided */
|
|
86
|
+
readonly required: boolean;
|
|
87
|
+
/** Default value if not provided */
|
|
88
|
+
readonly default?: string | number | boolean;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// =============================================================================
|
|
92
|
+
// T004: Command Category and Kind
|
|
93
|
+
// =============================================================================
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Command categories for grouping related commands
|
|
97
|
+
*
|
|
98
|
+
* Used for help display organization and command filtering.
|
|
99
|
+
*/
|
|
100
|
+
export type CommandCategory =
|
|
101
|
+
| "system" // /help, /clear, /version
|
|
102
|
+
| "workflow" // /mode, /vibe, /plan, /spec, /tutorial
|
|
103
|
+
| "auth" // /login, /logout, /credentials
|
|
104
|
+
| "session" // /new, /history, /export
|
|
105
|
+
| "navigation" // /cd, /pwd, /ls
|
|
106
|
+
| "tools" // /tools, /enable, /disable
|
|
107
|
+
| "config" // /config, /theme
|
|
108
|
+
| "debug"; // /debug, /metrics
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Command source/origin kind
|
|
112
|
+
*
|
|
113
|
+
* - builtin: Core commands shipped with Vellum
|
|
114
|
+
* - plugin: Commands from installed plugins
|
|
115
|
+
* - mcp: Commands exposed via MCP servers
|
|
116
|
+
* - user: User-defined custom commands
|
|
117
|
+
*/
|
|
118
|
+
export type CommandKind = "builtin" | "plugin" | "mcp" | "user";
|
|
119
|
+
|
|
120
|
+
// =============================================================================
|
|
121
|
+
// T004: Subcommand Definition
|
|
122
|
+
// =============================================================================
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Definition for a subcommand within a parent command
|
|
126
|
+
*
|
|
127
|
+
* Used for two-level autocomplete and help display.
|
|
128
|
+
*
|
|
129
|
+
* @example
|
|
130
|
+
* ```typescript
|
|
131
|
+
* const subcommand: SubcommandDef = {
|
|
132
|
+
* name: 'list',
|
|
133
|
+
* description: 'List all items',
|
|
134
|
+
* aliases: ['ls'],
|
|
135
|
+
* };
|
|
136
|
+
* ```
|
|
137
|
+
*/
|
|
138
|
+
export interface SubcommandDef {
|
|
139
|
+
/** Subcommand name */
|
|
140
|
+
readonly name: string;
|
|
141
|
+
/** Human-readable description for help text */
|
|
142
|
+
readonly description: string;
|
|
143
|
+
/** Alternative names for the subcommand */
|
|
144
|
+
readonly aliases?: readonly string[];
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// =============================================================================
|
|
148
|
+
// T004: SlashCommand Interface
|
|
149
|
+
// =============================================================================
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Complete definition of a slash command
|
|
153
|
+
*
|
|
154
|
+
* Defines the command's metadata, arguments, and execution handler.
|
|
155
|
+
*
|
|
156
|
+
* @example
|
|
157
|
+
* ```typescript
|
|
158
|
+
* const loginCommand: SlashCommand = {
|
|
159
|
+
* name: 'login',
|
|
160
|
+
* description: 'Add credential for a provider',
|
|
161
|
+
* kind: 'builtin',
|
|
162
|
+
* category: 'auth',
|
|
163
|
+
* aliases: ['signin'],
|
|
164
|
+
* positionalArgs: [{
|
|
165
|
+
* name: 'provider',
|
|
166
|
+
* type: 'string',
|
|
167
|
+
* description: 'Provider name',
|
|
168
|
+
* required: false,
|
|
169
|
+
* }],
|
|
170
|
+
* namedArgs: [{
|
|
171
|
+
* name: 'store',
|
|
172
|
+
* shorthand: 's',
|
|
173
|
+
* type: 'string',
|
|
174
|
+
* description: 'Credential store',
|
|
175
|
+
* required: false,
|
|
176
|
+
* default: 'keychain',
|
|
177
|
+
* }],
|
|
178
|
+
* execute: async (ctx) => {
|
|
179
|
+
* // Implementation
|
|
180
|
+
* return { kind: 'success', message: 'Logged in' };
|
|
181
|
+
* },
|
|
182
|
+
* };
|
|
183
|
+
* ```
|
|
184
|
+
*/
|
|
185
|
+
export interface SlashCommand {
|
|
186
|
+
/** Command name without leading slash */
|
|
187
|
+
readonly name: string;
|
|
188
|
+
/** Human-readable description for help text */
|
|
189
|
+
readonly description: string;
|
|
190
|
+
/** Source/origin of the command */
|
|
191
|
+
readonly kind: CommandKind;
|
|
192
|
+
/** Grouping category for organization */
|
|
193
|
+
readonly category: CommandCategory;
|
|
194
|
+
/** Alternative names for the command */
|
|
195
|
+
readonly aliases?: readonly string[];
|
|
196
|
+
/** Position-based arguments */
|
|
197
|
+
readonly positionalArgs?: readonly PositionalArg[];
|
|
198
|
+
/** Flag-based arguments (--flag) */
|
|
199
|
+
readonly namedArgs?: readonly NamedArg[];
|
|
200
|
+
/** Example usages for help display */
|
|
201
|
+
readonly examples?: readonly string[];
|
|
202
|
+
/** Security policy for resource access control (T052) */
|
|
203
|
+
readonly securityPolicy?: CommandSecurityPolicy;
|
|
204
|
+
/** Subcommands for two-level autocomplete */
|
|
205
|
+
readonly subcommands?: readonly SubcommandDef[];
|
|
206
|
+
/** Command execution handler */
|
|
207
|
+
readonly execute: (ctx: CommandContext) => Promise<CommandResult>;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// =============================================================================
|
|
211
|
+
// T006: Command Error Codes
|
|
212
|
+
// =============================================================================
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Standardized error codes for command failures
|
|
216
|
+
*
|
|
217
|
+
* Used for programmatic error handling and user-friendly messages.
|
|
218
|
+
*/
|
|
219
|
+
export type CommandErrorCode =
|
|
220
|
+
// Argument errors
|
|
221
|
+
| "INVALID_ARGUMENT"
|
|
222
|
+
| "MISSING_ARGUMENT"
|
|
223
|
+
| "ARGUMENT_TYPE_ERROR"
|
|
224
|
+
// Provider/auth errors
|
|
225
|
+
| "PROVIDER_NOT_FOUND"
|
|
226
|
+
| "CREDENTIAL_NOT_FOUND"
|
|
227
|
+
| "AUTHENTICATION_FAILED"
|
|
228
|
+
// Permission errors
|
|
229
|
+
| "PERMISSION_DENIED"
|
|
230
|
+
| "OPERATION_NOT_ALLOWED"
|
|
231
|
+
// Resource errors
|
|
232
|
+
| "FILE_NOT_FOUND"
|
|
233
|
+
| "PATH_NOT_ALLOWED"
|
|
234
|
+
| "RESOURCE_NOT_FOUND"
|
|
235
|
+
// Command errors
|
|
236
|
+
| "COMMAND_NOT_FOUND"
|
|
237
|
+
| "COMMAND_DISABLED"
|
|
238
|
+
| "COMMAND_ABORTED"
|
|
239
|
+
// System errors
|
|
240
|
+
| "INTERNAL_ERROR"
|
|
241
|
+
| "TIMEOUT"
|
|
242
|
+
| "NETWORK_ERROR"
|
|
243
|
+
// Generic
|
|
244
|
+
| "UNKNOWN_ERROR";
|
|
245
|
+
|
|
246
|
+
// =============================================================================
|
|
247
|
+
// T006: Interactive Prompt Types
|
|
248
|
+
// =============================================================================
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Configuration for interactive user input
|
|
252
|
+
*
|
|
253
|
+
* Used when a command needs additional user input to complete.
|
|
254
|
+
*/
|
|
255
|
+
export interface InteractivePrompt {
|
|
256
|
+
/** Type of input to collect */
|
|
257
|
+
readonly inputType: "text" | "password" | "confirm" | "select";
|
|
258
|
+
/** Prompt message to display */
|
|
259
|
+
readonly message: string;
|
|
260
|
+
/** Placeholder text for input field */
|
|
261
|
+
readonly placeholder?: string;
|
|
262
|
+
/** Options for select input type */
|
|
263
|
+
readonly options?: readonly string[];
|
|
264
|
+
/** Default value for the input */
|
|
265
|
+
readonly defaultValue?: string;
|
|
266
|
+
/** Handler for submitted input */
|
|
267
|
+
readonly handler: (value: string) => Promise<CommandResult>;
|
|
268
|
+
/** Handler for cancelled input */
|
|
269
|
+
readonly onCancel?: () => CommandResult;
|
|
270
|
+
/** Provider name (for credential-related prompts) */
|
|
271
|
+
readonly provider?: string;
|
|
272
|
+
/** Form title (e.g., "🔐 Set API Key for Anthropic") */
|
|
273
|
+
readonly title?: string;
|
|
274
|
+
/** Help hint (e.g., "Your key starts with sk-ant-...") */
|
|
275
|
+
readonly helpText?: string;
|
|
276
|
+
/** Format example for the input */
|
|
277
|
+
readonly formatHint?: string;
|
|
278
|
+
/** Link to provider documentation */
|
|
279
|
+
readonly documentationUrl?: string;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Configuration for an async operation started by a command
|
|
284
|
+
*/
|
|
285
|
+
export interface AsyncOperation {
|
|
286
|
+
/** Status message to display */
|
|
287
|
+
readonly message: string;
|
|
288
|
+
/** Promise that resolves when operation completes */
|
|
289
|
+
readonly promise: Promise<CommandResult>;
|
|
290
|
+
/** Whether to show a progress indicator */
|
|
291
|
+
readonly showProgress?: boolean;
|
|
292
|
+
/** Function to cancel the operation */
|
|
293
|
+
readonly cancel?: () => void;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// =============================================================================
|
|
297
|
+
// T006: CommandResult Discriminated Union
|
|
298
|
+
// =============================================================================
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Successful command execution result
|
|
302
|
+
*/
|
|
303
|
+
export interface CommandSuccess {
|
|
304
|
+
/** Discriminator for type narrowing */
|
|
305
|
+
readonly kind: "success";
|
|
306
|
+
/** Optional success message to display */
|
|
307
|
+
readonly message?: string;
|
|
308
|
+
/** Result data for programmatic access */
|
|
309
|
+
readonly data?: unknown;
|
|
310
|
+
/** Whether to clear the screen after execution */
|
|
311
|
+
readonly clearScreen?: boolean;
|
|
312
|
+
/** Whether to refresh the UI state */
|
|
313
|
+
readonly refresh?: boolean;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Failed command execution result
|
|
318
|
+
*/
|
|
319
|
+
export interface CommandError {
|
|
320
|
+
/** Discriminator for type narrowing */
|
|
321
|
+
readonly kind: "error";
|
|
322
|
+
/** Standardized error code */
|
|
323
|
+
readonly code: CommandErrorCode;
|
|
324
|
+
/** Human-readable error message */
|
|
325
|
+
readonly message: string;
|
|
326
|
+
/** Suggested commands or actions to resolve the error */
|
|
327
|
+
readonly suggestions?: readonly string[];
|
|
328
|
+
/** Related help command */
|
|
329
|
+
readonly helpCommand?: string;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Command requires additional user input
|
|
334
|
+
*/
|
|
335
|
+
export interface CommandInteractive {
|
|
336
|
+
/** Discriminator for type narrowing */
|
|
337
|
+
readonly kind: "interactive";
|
|
338
|
+
/** Interactive input configuration */
|
|
339
|
+
readonly prompt: InteractivePrompt;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Command started an async operation
|
|
344
|
+
*/
|
|
345
|
+
export interface CommandPending {
|
|
346
|
+
/** Discriminator for type narrowing */
|
|
347
|
+
readonly kind: "pending";
|
|
348
|
+
/** Async operation details */
|
|
349
|
+
readonly operation: AsyncOperation;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Command execution result
|
|
354
|
+
*
|
|
355
|
+
* Discriminated union representing all possible command outcomes.
|
|
356
|
+
* Use the `kind` field to narrow the type.
|
|
357
|
+
*
|
|
358
|
+
* @example
|
|
359
|
+
* ```typescript
|
|
360
|
+
* const result = await command.execute(ctx);
|
|
361
|
+
*
|
|
362
|
+
* switch (result.kind) {
|
|
363
|
+
* case 'success':
|
|
364
|
+
* console.log(result.message);
|
|
365
|
+
* break;
|
|
366
|
+
* case 'error':
|
|
367
|
+
* console.error(`[${result.code}] ${result.message}`);
|
|
368
|
+
* break;
|
|
369
|
+
* case 'interactive':
|
|
370
|
+
* // Show input prompt
|
|
371
|
+
* break;
|
|
372
|
+
* case 'pending':
|
|
373
|
+
* // Wait for operation
|
|
374
|
+
* break;
|
|
375
|
+
* }
|
|
376
|
+
* ```
|
|
377
|
+
*/
|
|
378
|
+
export type CommandResult = CommandSuccess | CommandError | CommandInteractive | CommandPending;
|
|
379
|
+
|
|
380
|
+
// =============================================================================
|
|
381
|
+
// T007: Parsed Arguments
|
|
382
|
+
// =============================================================================
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Parsed command arguments after processing
|
|
386
|
+
*
|
|
387
|
+
* Contains resolved positional and named argument values.
|
|
388
|
+
*/
|
|
389
|
+
export interface ParsedArgs {
|
|
390
|
+
/** Command name (without leading slash) */
|
|
391
|
+
readonly command: string;
|
|
392
|
+
/** Resolved positional argument values */
|
|
393
|
+
readonly positional: readonly unknown[];
|
|
394
|
+
/** Resolved named argument values */
|
|
395
|
+
readonly named: Readonly<Record<string, unknown>>;
|
|
396
|
+
/** Original raw input string */
|
|
397
|
+
readonly raw: string;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
// =============================================================================
|
|
401
|
+
// T007: CommandContext Interface
|
|
402
|
+
// =============================================================================
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* Session interface for command execution
|
|
406
|
+
*
|
|
407
|
+
* Minimal session interface needed by commands.
|
|
408
|
+
* Full Session type is defined in @vellum/core.
|
|
409
|
+
*/
|
|
410
|
+
export interface Session {
|
|
411
|
+
/** Unique session identifier */
|
|
412
|
+
readonly id: string;
|
|
413
|
+
/** Current provider name */
|
|
414
|
+
readonly provider: string;
|
|
415
|
+
/** Current working directory */
|
|
416
|
+
readonly cwd: string;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Execution context passed to command handlers
|
|
421
|
+
*
|
|
422
|
+
* Provides access to session state, credentials, tools, and utilities
|
|
423
|
+
* needed by commands during execution.
|
|
424
|
+
*
|
|
425
|
+
* @example
|
|
426
|
+
* ```typescript
|
|
427
|
+
* const handler: SlashCommand['execute'] = async (ctx) => {
|
|
428
|
+
* const { session, credentials, parsedArgs } = ctx;
|
|
429
|
+
*
|
|
430
|
+
* // Check credential exists
|
|
431
|
+
* const cred = await credentials.resolve(session.provider);
|
|
432
|
+
* if (!cred.ok || !cred.value) {
|
|
433
|
+
* return {
|
|
434
|
+
* kind: 'error',
|
|
435
|
+
* code: 'CREDENTIAL_NOT_FOUND',
|
|
436
|
+
* message: `No credential for ${session.provider}`,
|
|
437
|
+
* };
|
|
438
|
+
* }
|
|
439
|
+
*
|
|
440
|
+
* // Emit event
|
|
441
|
+
* ctx.emit('command:executed', { command: parsedArgs.command });
|
|
442
|
+
*
|
|
443
|
+
* return { kind: 'success' };
|
|
444
|
+
* };
|
|
445
|
+
* ```
|
|
446
|
+
*/
|
|
447
|
+
export interface CommandContext {
|
|
448
|
+
/** Current session state */
|
|
449
|
+
readonly session: Session;
|
|
450
|
+
/** Credential manager for authentication */
|
|
451
|
+
readonly credentials: CredentialManager;
|
|
452
|
+
/** Tool registry for available tools */
|
|
453
|
+
readonly toolRegistry: ToolRegistry;
|
|
454
|
+
/** Parsed command arguments */
|
|
455
|
+
readonly parsedArgs: ParsedArgs;
|
|
456
|
+
/** Abort signal for cancellation support */
|
|
457
|
+
readonly signal?: AbortSignal;
|
|
458
|
+
/**
|
|
459
|
+
* Emit an event
|
|
460
|
+
*
|
|
461
|
+
* @param event - Event name
|
|
462
|
+
* @param data - Optional event data
|
|
463
|
+
*/
|
|
464
|
+
readonly emit: (event: string, data?: unknown) => void;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
// =============================================================================
|
|
468
|
+
// Result Factory Helpers
|
|
469
|
+
// =============================================================================
|
|
470
|
+
|
|
471
|
+
/**
|
|
472
|
+
* Create a success result
|
|
473
|
+
*
|
|
474
|
+
* @param message - Optional success message
|
|
475
|
+
* @param data - Optional result data
|
|
476
|
+
*/
|
|
477
|
+
export function success(message?: string, data?: unknown): CommandSuccess {
|
|
478
|
+
return { kind: "success", message, data };
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* Create an error result
|
|
483
|
+
*
|
|
484
|
+
* @param code - Error code
|
|
485
|
+
* @param message - Error message
|
|
486
|
+
* @param suggestions - Optional suggestions
|
|
487
|
+
*/
|
|
488
|
+
export function error(
|
|
489
|
+
code: CommandErrorCode,
|
|
490
|
+
message: string,
|
|
491
|
+
suggestions?: readonly string[]
|
|
492
|
+
): CommandError {
|
|
493
|
+
return { kind: "error", code, message, suggestions };
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
/**
|
|
497
|
+
* Create an interactive result
|
|
498
|
+
*
|
|
499
|
+
* @param prompt - Interactive prompt configuration
|
|
500
|
+
*/
|
|
501
|
+
export function interactive(prompt: InteractivePrompt): CommandInteractive {
|
|
502
|
+
return { kind: "interactive", prompt };
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
/**
|
|
506
|
+
* Create a pending result
|
|
507
|
+
*
|
|
508
|
+
* @param operation - Async operation configuration
|
|
509
|
+
*/
|
|
510
|
+
export function pending(operation: AsyncOperation): CommandPending {
|
|
511
|
+
return { kind: "pending", operation };
|
|
512
|
+
}
|