@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,310 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tutorial System Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* Core types for the interactive tutorial system that guides
|
|
5
|
+
* users through learning Vellum features.
|
|
6
|
+
*
|
|
7
|
+
* @module cli/onboarding/tutorial/types
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
|
|
12
|
+
// =============================================================================
|
|
13
|
+
// Step Types
|
|
14
|
+
// =============================================================================
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Action types for tutorial steps
|
|
18
|
+
*/
|
|
19
|
+
export type TutorialAction =
|
|
20
|
+
| "read" // User reads content
|
|
21
|
+
| "command" // User executes a command
|
|
22
|
+
| "navigate" // User navigates (e.g., change mode)
|
|
23
|
+
| "interact" // User interacts with UI
|
|
24
|
+
| "complete"; // Completion marker
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Tutorial step schema
|
|
28
|
+
*/
|
|
29
|
+
export const TutorialStepSchema = z.object({
|
|
30
|
+
/** Unique step identifier */
|
|
31
|
+
id: z.string(),
|
|
32
|
+
/** Step title */
|
|
33
|
+
title: z.string(),
|
|
34
|
+
/** Step content/instructions */
|
|
35
|
+
content: z.string(),
|
|
36
|
+
/** Required action type */
|
|
37
|
+
action: z.enum(["read", "command", "navigate", "interact", "complete"]),
|
|
38
|
+
/** Command to execute (for action: 'command') */
|
|
39
|
+
command: z.string().optional(),
|
|
40
|
+
/** Expected outcome description */
|
|
41
|
+
expectedOutcome: z.string().optional(),
|
|
42
|
+
/** Hint for user if stuck */
|
|
43
|
+
hint: z.string().optional(),
|
|
44
|
+
/** Duration estimate in seconds */
|
|
45
|
+
estimatedDuration: z.number().optional(),
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
export type TutorialStep = z.infer<typeof TutorialStepSchema>;
|
|
49
|
+
|
|
50
|
+
// =============================================================================
|
|
51
|
+
// Lesson Types
|
|
52
|
+
// =============================================================================
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Lesson difficulty levels
|
|
56
|
+
*/
|
|
57
|
+
export type LessonDifficulty = "beginner" | "intermediate" | "advanced";
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Lesson categories
|
|
61
|
+
*/
|
|
62
|
+
export type LessonCategory = "basics" | "tools" | "modes" | "advanced" | "workflow";
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Lesson schema
|
|
66
|
+
*/
|
|
67
|
+
export const LessonSchema = z.object({
|
|
68
|
+
/** Unique lesson identifier */
|
|
69
|
+
id: z.string(),
|
|
70
|
+
/** Lesson title */
|
|
71
|
+
title: z.string(),
|
|
72
|
+
/** Brief description */
|
|
73
|
+
description: z.string(),
|
|
74
|
+
/** Lesson category */
|
|
75
|
+
category: z.enum(["basics", "tools", "modes", "advanced", "workflow"]),
|
|
76
|
+
/** Difficulty level */
|
|
77
|
+
difficulty: z.enum(["beginner", "intermediate", "advanced"]),
|
|
78
|
+
/** Prerequisites (other lesson IDs) */
|
|
79
|
+
prerequisites: z.array(z.string()).default([]),
|
|
80
|
+
/** Steps in this lesson */
|
|
81
|
+
steps: z.array(TutorialStepSchema),
|
|
82
|
+
/** Tags for filtering */
|
|
83
|
+
tags: z.array(z.string()).default([]),
|
|
84
|
+
/** Estimated total duration in minutes */
|
|
85
|
+
estimatedMinutes: z.number(),
|
|
86
|
+
/** Icon for display */
|
|
87
|
+
icon: z.string().optional(),
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
export type Lesson = z.infer<typeof LessonSchema>;
|
|
91
|
+
|
|
92
|
+
// =============================================================================
|
|
93
|
+
// Progress Types
|
|
94
|
+
// =============================================================================
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Step completion status
|
|
98
|
+
*/
|
|
99
|
+
export interface StepProgress {
|
|
100
|
+
/** Step ID */
|
|
101
|
+
stepId: string;
|
|
102
|
+
/** Whether step is completed */
|
|
103
|
+
completed: boolean;
|
|
104
|
+
/** When step was completed */
|
|
105
|
+
completedAt?: string;
|
|
106
|
+
/** Time spent on step in seconds */
|
|
107
|
+
timeSpent?: number;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Lesson progress schema
|
|
112
|
+
*/
|
|
113
|
+
export const LessonProgressSchema = z.object({
|
|
114
|
+
/** Lesson ID */
|
|
115
|
+
lessonId: z.string(),
|
|
116
|
+
/** Whether lesson is started */
|
|
117
|
+
started: z.boolean().default(false),
|
|
118
|
+
/** Whether lesson is completed */
|
|
119
|
+
completed: z.boolean().default(false),
|
|
120
|
+
/** When lesson was started */
|
|
121
|
+
startedAt: z.string().datetime().optional(),
|
|
122
|
+
/** When lesson was completed */
|
|
123
|
+
completedAt: z.string().datetime().optional(),
|
|
124
|
+
/** Current step index (0-based) */
|
|
125
|
+
currentStepIndex: z.number().default(0),
|
|
126
|
+
/** Completed step IDs */
|
|
127
|
+
completedSteps: z.array(z.string()).default([]),
|
|
128
|
+
/** Total time spent in seconds */
|
|
129
|
+
totalTimeSpent: z.number().default(0),
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
export type LessonProgress = z.infer<typeof LessonProgressSchema>;
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Overall tutorial progress schema
|
|
136
|
+
*/
|
|
137
|
+
export const TutorialProgressSchema = z.object({
|
|
138
|
+
/** User ID or anonymous identifier */
|
|
139
|
+
userId: z.string().optional(),
|
|
140
|
+
/** When tutorial was started */
|
|
141
|
+
startedAt: z.string().datetime().optional(),
|
|
142
|
+
/** Total lessons completed */
|
|
143
|
+
lessonsCompleted: z.number().default(0),
|
|
144
|
+
/** Total steps completed */
|
|
145
|
+
stepsCompleted: z.number().default(0),
|
|
146
|
+
/** Progress by lesson */
|
|
147
|
+
lessons: z.record(z.string(), LessonProgressSchema).default({}),
|
|
148
|
+
/** Last active lesson */
|
|
149
|
+
lastActiveLessonId: z.string().optional(),
|
|
150
|
+
/** Last activity timestamp */
|
|
151
|
+
lastActivityAt: z.string().datetime().optional(),
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
export type TutorialProgress = z.infer<typeof TutorialProgressSchema>;
|
|
155
|
+
|
|
156
|
+
// =============================================================================
|
|
157
|
+
// Storage Types
|
|
158
|
+
// =============================================================================
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Tutorial storage interface
|
|
162
|
+
*/
|
|
163
|
+
export interface TutorialStorage {
|
|
164
|
+
/** Load tutorial progress */
|
|
165
|
+
loadProgress(): Promise<TutorialProgress>;
|
|
166
|
+
|
|
167
|
+
/** Save tutorial progress */
|
|
168
|
+
saveProgress(progress: TutorialProgress): Promise<void>;
|
|
169
|
+
|
|
170
|
+
/** Reset all progress */
|
|
171
|
+
resetProgress(): Promise<void>;
|
|
172
|
+
|
|
173
|
+
/** Get lesson progress */
|
|
174
|
+
getLessonProgress(lessonId: string): Promise<LessonProgress | undefined>;
|
|
175
|
+
|
|
176
|
+
/** Update lesson progress */
|
|
177
|
+
updateLessonProgress(lessonId: string, progress: Partial<LessonProgress>): Promise<void>;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// =============================================================================
|
|
181
|
+
// Tip Types
|
|
182
|
+
// =============================================================================
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Context for tip display
|
|
186
|
+
*/
|
|
187
|
+
export interface TipContext {
|
|
188
|
+
/** Current command being executed */
|
|
189
|
+
command?: string;
|
|
190
|
+
/** Current mode */
|
|
191
|
+
mode?: string;
|
|
192
|
+
/** Current screen/panel */
|
|
193
|
+
screen?: string;
|
|
194
|
+
/** User experience level */
|
|
195
|
+
experienceLevel?: "new" | "beginner" | "intermediate" | "advanced";
|
|
196
|
+
/** Features used count */
|
|
197
|
+
featuresUsedCount?: number;
|
|
198
|
+
/** Session duration in seconds */
|
|
199
|
+
sessionDuration?: number;
|
|
200
|
+
/** Error just occurred */
|
|
201
|
+
hasError?: boolean;
|
|
202
|
+
/** Custom context data */
|
|
203
|
+
custom?: Record<string, unknown>;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Tip schema
|
|
208
|
+
*/
|
|
209
|
+
export const TipSchema = z.object({
|
|
210
|
+
/** Unique tip identifier */
|
|
211
|
+
id: z.string(),
|
|
212
|
+
/** Tip title (short) */
|
|
213
|
+
title: z.string(),
|
|
214
|
+
/** Tip content */
|
|
215
|
+
content: z.string(),
|
|
216
|
+
/** Category */
|
|
217
|
+
category: z.enum(["shortcuts", "features", "best-practices", "errors", "performance"]),
|
|
218
|
+
/** When to show this tip */
|
|
219
|
+
trigger: z.object({
|
|
220
|
+
/** Commands that trigger this tip */
|
|
221
|
+
commands: z.array(z.string()).optional(),
|
|
222
|
+
/** Modes that trigger this tip */
|
|
223
|
+
modes: z.array(z.string()).optional(),
|
|
224
|
+
/** Screens that trigger this tip */
|
|
225
|
+
screens: z.array(z.string()).optional(),
|
|
226
|
+
/** Show on errors */
|
|
227
|
+
onError: z.boolean().optional(),
|
|
228
|
+
/** Required feature usage count */
|
|
229
|
+
minFeatureUsage: z.number().optional(),
|
|
230
|
+
/** Maximum times to show (0 = always) */
|
|
231
|
+
maxShows: z.number().optional(),
|
|
232
|
+
}),
|
|
233
|
+
/** Priority (higher = more important) */
|
|
234
|
+
priority: z.number().default(0),
|
|
235
|
+
/** Whether tip is dismissable */
|
|
236
|
+
dismissable: z.boolean().default(true),
|
|
237
|
+
/** Related lesson ID */
|
|
238
|
+
relatedLessonId: z.string().optional(),
|
|
239
|
+
/** Icon */
|
|
240
|
+
icon: z.string().optional(),
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
export type Tip = z.infer<typeof TipSchema>;
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Tip display state
|
|
247
|
+
*/
|
|
248
|
+
export interface TipState {
|
|
249
|
+
/** Tip ID */
|
|
250
|
+
tipId: string;
|
|
251
|
+
/** Times shown */
|
|
252
|
+
showCount: number;
|
|
253
|
+
/** Whether dismissed */
|
|
254
|
+
dismissed: boolean;
|
|
255
|
+
/** Last shown timestamp */
|
|
256
|
+
lastShownAt?: string;
|
|
257
|
+
/** First shown timestamp */
|
|
258
|
+
firstShownAt?: string;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// =============================================================================
|
|
262
|
+
// Event Types
|
|
263
|
+
// =============================================================================
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Tutorial system events
|
|
267
|
+
*/
|
|
268
|
+
export interface TutorialEvents {
|
|
269
|
+
/** Lesson started */
|
|
270
|
+
onLessonStart?: (lesson: Lesson) => void;
|
|
271
|
+
/** Step completed */
|
|
272
|
+
onStepComplete?: (step: TutorialStep, lesson: Lesson) => void;
|
|
273
|
+
/** Lesson completed */
|
|
274
|
+
onLessonComplete?: (lesson: Lesson, progress: LessonProgress) => void;
|
|
275
|
+
/** Tutorial completed (all lessons) */
|
|
276
|
+
onTutorialComplete?: (progress: TutorialProgress) => void;
|
|
277
|
+
/** Error occurred */
|
|
278
|
+
onError?: (error: Error) => void;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// =============================================================================
|
|
282
|
+
// Constants
|
|
283
|
+
// =============================================================================
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Initial tutorial progress
|
|
287
|
+
*/
|
|
288
|
+
export const INITIAL_TUTORIAL_PROGRESS: TutorialProgress = {
|
|
289
|
+
userId: undefined,
|
|
290
|
+
startedAt: undefined,
|
|
291
|
+
lessonsCompleted: 0,
|
|
292
|
+
stepsCompleted: 0,
|
|
293
|
+
lessons: {},
|
|
294
|
+
lastActiveLessonId: undefined,
|
|
295
|
+
lastActivityAt: undefined,
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Initial lesson progress
|
|
300
|
+
*/
|
|
301
|
+
export const INITIAL_LESSON_PROGRESS: LessonProgress = {
|
|
302
|
+
lessonId: "",
|
|
303
|
+
started: false,
|
|
304
|
+
completed: false,
|
|
305
|
+
startedAt: undefined,
|
|
306
|
+
completedAt: undefined,
|
|
307
|
+
currentStepIndex: 0,
|
|
308
|
+
completedSteps: [],
|
|
309
|
+
totalTimeSpent: 0,
|
|
310
|
+
};
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orchestrator singleton for CLI
|
|
3
|
+
*
|
|
4
|
+
* Provides access to OrchestratorCore instance across CLI components.
|
|
5
|
+
* This module ensures a single orchestrator instance is used throughout
|
|
6
|
+
* the CLI lifecycle for task resumption, delegation, and multi-agent
|
|
7
|
+
* orchestration.
|
|
8
|
+
*
|
|
9
|
+
* @module cli/orchestrator-singleton
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
createModeRegistry,
|
|
14
|
+
createOrchestrator,
|
|
15
|
+
type ModeRegistry,
|
|
16
|
+
type OrchestratorCore,
|
|
17
|
+
} from "@vellum/core";
|
|
18
|
+
|
|
19
|
+
// =============================================================================
|
|
20
|
+
// Singleton State
|
|
21
|
+
// =============================================================================
|
|
22
|
+
|
|
23
|
+
let orchestratorInstance: OrchestratorCore | null = null;
|
|
24
|
+
let modeRegistryInstance: ModeRegistry | null = null;
|
|
25
|
+
|
|
26
|
+
// =============================================================================
|
|
27
|
+
// Configuration Interface
|
|
28
|
+
// =============================================================================
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Configuration options for orchestrator initialization.
|
|
32
|
+
*/
|
|
33
|
+
export interface OrchestratorSingletonConfig {
|
|
34
|
+
/** Maximum number of concurrent subagents (default: 3) */
|
|
35
|
+
maxConcurrentSubagents?: number;
|
|
36
|
+
/** Task timeout in milliseconds (default: 300000) */
|
|
37
|
+
taskTimeout?: number;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// =============================================================================
|
|
41
|
+
// Singleton Access Functions
|
|
42
|
+
// =============================================================================
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Get or create the orchestrator singleton instance.
|
|
46
|
+
*
|
|
47
|
+
* This function lazily initializes the orchestrator on first call.
|
|
48
|
+
* Subsequent calls return the same instance.
|
|
49
|
+
*
|
|
50
|
+
* @param config - Optional configuration for first-time initialization
|
|
51
|
+
* @returns The OrchestratorCore instance
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```typescript
|
|
55
|
+
* // First call initializes with config
|
|
56
|
+
* const orchestrator = getOrCreateOrchestrator({
|
|
57
|
+
* maxConcurrentSubagents: 5,
|
|
58
|
+
* taskTimeout: 600_000,
|
|
59
|
+
* });
|
|
60
|
+
*
|
|
61
|
+
* // Subsequent calls return the same instance
|
|
62
|
+
* const same = getOrCreateOrchestrator();
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export function getOrCreateOrchestrator(config?: OrchestratorSingletonConfig): OrchestratorCore {
|
|
66
|
+
if (!orchestratorInstance) {
|
|
67
|
+
modeRegistryInstance = createModeRegistry();
|
|
68
|
+
orchestratorInstance = createOrchestrator({
|
|
69
|
+
modeRegistry: modeRegistryInstance,
|
|
70
|
+
maxConcurrentSubagents: config?.maxConcurrentSubagents ?? 3,
|
|
71
|
+
taskTimeout: config?.taskTimeout ?? 300_000,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return orchestratorInstance;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Get the orchestrator singleton if it exists.
|
|
79
|
+
*
|
|
80
|
+
* Unlike getOrCreateOrchestrator, this function does not create
|
|
81
|
+
* the instance if it doesn't exist.
|
|
82
|
+
*
|
|
83
|
+
* @returns The OrchestratorCore instance or null if not initialized
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```typescript
|
|
87
|
+
* const orchestrator = getOrchestrator();
|
|
88
|
+
* if (orchestrator) {
|
|
89
|
+
* // Use orchestrator
|
|
90
|
+
* } else {
|
|
91
|
+
* // Handle not initialized case
|
|
92
|
+
* }
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
export function getOrchestrator(): OrchestratorCore | null {
|
|
96
|
+
return orchestratorInstance;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Get the mode registry singleton if it exists.
|
|
101
|
+
*
|
|
102
|
+
* The mode registry is created alongside the orchestrator.
|
|
103
|
+
*
|
|
104
|
+
* @returns The ModeRegistry instance or null if not initialized
|
|
105
|
+
*/
|
|
106
|
+
export function getModeRegistry(): ModeRegistry | null {
|
|
107
|
+
return modeRegistryInstance;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Reset the orchestrator singleton.
|
|
112
|
+
*
|
|
113
|
+
* This cancels any active tasks and clears the singleton instances.
|
|
114
|
+
* Primarily used for testing or when reinitializing the CLI.
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* ```typescript
|
|
118
|
+
* // Cleanup before exit
|
|
119
|
+
* resetOrchestrator();
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
export function resetOrchestrator(): void {
|
|
123
|
+
if (orchestratorInstance) {
|
|
124
|
+
// Cancel any active tasks
|
|
125
|
+
orchestratorInstance.cancelAll();
|
|
126
|
+
}
|
|
127
|
+
orchestratorInstance = null;
|
|
128
|
+
modeRegistryInstance = null;
|
|
129
|
+
}
|
package/src/shutdown.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shutdown cleanup state module
|
|
3
|
+
* Extracted to break circular dependency between index.tsx and app.tsx
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/** Cleanup function to be called on shutdown */
|
|
7
|
+
let shutdownCleanup: (() => void) | null = null;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Set the shutdown cleanup function.
|
|
11
|
+
* Called by App component when agent loop is created.
|
|
12
|
+
*/
|
|
13
|
+
export function setShutdownCleanup(cleanup: (() => void) | null): void {
|
|
14
|
+
shutdownCleanup = cleanup;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Get the current shutdown cleanup function
|
|
19
|
+
*/
|
|
20
|
+
export function getShutdownCleanup(): (() => void) | null {
|
|
21
|
+
return shutdownCleanup;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Execute shutdown cleanup if set.
|
|
26
|
+
* Clears the cleanup function after execution.
|
|
27
|
+
*/
|
|
28
|
+
export function executeShutdownCleanup(): void {
|
|
29
|
+
if (shutdownCleanup) {
|
|
30
|
+
shutdownCleanup();
|
|
31
|
+
shutdownCleanup = null;
|
|
32
|
+
}
|
|
33
|
+
}
|