@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.
Files changed (446) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +411 -0
  3. package/__fixtures__/responses/code-generation.json +42 -0
  4. package/__fixtures__/responses/error-response.json +20 -0
  5. package/__fixtures__/responses/hello-world.json +32 -0
  6. package/dist/auth-6MCXESOH.js +26 -0
  7. package/dist/chunk-SECXJGWA.js +597 -0
  8. package/dist/index.js +34023 -0
  9. package/package.json +67 -0
  10. package/src/__tests__/commands.e2e.test.ts +728 -0
  11. package/src/__tests__/credentials.test.ts +713 -0
  12. package/src/__tests__/mode-e2e.test.ts +391 -0
  13. package/src/__tests__/tui-integration.test.tsx +1271 -0
  14. package/src/agents/__tests__/task-persistence.test.ts +235 -0
  15. package/src/agents/commands/delegate.ts +240 -0
  16. package/src/agents/commands/index.ts +10 -0
  17. package/src/agents/commands/resume.ts +335 -0
  18. package/src/agents/index.ts +29 -0
  19. package/src/agents/task-persistence.ts +272 -0
  20. package/src/agents/task-resumption.ts +242 -0
  21. package/src/app.tsx +4737 -0
  22. package/src/commands/__tests__/.gitkeep +1 -0
  23. package/src/commands/__tests__/agents.test.ts +606 -0
  24. package/src/commands/__tests__/auth.test.ts +626 -0
  25. package/src/commands/__tests__/autocomplete.test.ts +683 -0
  26. package/src/commands/__tests__/batch.test.ts +287 -0
  27. package/src/commands/__tests__/chain-pipe-parser.test.ts +654 -0
  28. package/src/commands/__tests__/completion.test.ts +238 -0
  29. package/src/commands/__tests__/core.test.ts +363 -0
  30. package/src/commands/__tests__/executor.test.ts +496 -0
  31. package/src/commands/__tests__/exit-codes.test.ts +220 -0
  32. package/src/commands/__tests__/init.test.ts +243 -0
  33. package/src/commands/__tests__/language.test.ts +353 -0
  34. package/src/commands/__tests__/mode-cli.test.ts +667 -0
  35. package/src/commands/__tests__/model.test.ts +277 -0
  36. package/src/commands/__tests__/parser.test.ts +493 -0
  37. package/src/commands/__tests__/performance.bench.ts +380 -0
  38. package/src/commands/__tests__/registry.test.ts +534 -0
  39. package/src/commands/__tests__/resume.test.ts +449 -0
  40. package/src/commands/__tests__/security.test.ts +845 -0
  41. package/src/commands/__tests__/stream-json.test.ts +372 -0
  42. package/src/commands/__tests__/user-commands.test.ts +597 -0
  43. package/src/commands/adapters.ts +267 -0
  44. package/src/commands/agent.ts +395 -0
  45. package/src/commands/agents/generate.ts +506 -0
  46. package/src/commands/agents/index.ts +272 -0
  47. package/src/commands/agents/show.ts +271 -0
  48. package/src/commands/agents/validate.ts +387 -0
  49. package/src/commands/auth.ts +883 -0
  50. package/src/commands/autocomplete.ts +480 -0
  51. package/src/commands/batch/command.ts +388 -0
  52. package/src/commands/batch/executor.ts +361 -0
  53. package/src/commands/batch/index.ts +12 -0
  54. package/src/commands/commit.ts +235 -0
  55. package/src/commands/completion/index.ts +371 -0
  56. package/src/commands/condense.ts +191 -0
  57. package/src/commands/config.ts +344 -0
  58. package/src/commands/context-provider.ts +173 -0
  59. package/src/commands/copy.ts +329 -0
  60. package/src/commands/core/clear.ts +38 -0
  61. package/src/commands/core/exit.ts +43 -0
  62. package/src/commands/core/help.ts +354 -0
  63. package/src/commands/core/index.ts +15 -0
  64. package/src/commands/cost.ts +179 -0
  65. package/src/commands/credentials.tsx +618 -0
  66. package/src/commands/custom-agents/__tests__/custom-agents.test.ts +709 -0
  67. package/src/commands/custom-agents/create.ts +377 -0
  68. package/src/commands/custom-agents/export.ts +135 -0
  69. package/src/commands/custom-agents/import.ts +199 -0
  70. package/src/commands/custom-agents/index.ts +372 -0
  71. package/src/commands/custom-agents/info.ts +318 -0
  72. package/src/commands/custom-agents/list.ts +267 -0
  73. package/src/commands/custom-agents/validate.ts +388 -0
  74. package/src/commands/diff-mode.ts +241 -0
  75. package/src/commands/env.ts +53 -0
  76. package/src/commands/executor.ts +579 -0
  77. package/src/commands/exit-codes.ts +202 -0
  78. package/src/commands/index.ts +701 -0
  79. package/src/commands/init/index.ts +15 -0
  80. package/src/commands/init/prompts.ts +366 -0
  81. package/src/commands/init/templates/commands-readme.md +80 -0
  82. package/src/commands/init/templates/example-command.md +79 -0
  83. package/src/commands/init/templates/example-skill.md +168 -0
  84. package/src/commands/init/templates/example-workflow.md +101 -0
  85. package/src/commands/init/templates/prompts-readme.md +52 -0
  86. package/src/commands/init/templates/rules-readme.md +63 -0
  87. package/src/commands/init/templates/skills-readme.md +83 -0
  88. package/src/commands/init/templates/workflows-readme.md +94 -0
  89. package/src/commands/init.ts +391 -0
  90. package/src/commands/install.ts +90 -0
  91. package/src/commands/language.ts +191 -0
  92. package/src/commands/loaders/.gitkeep +1 -0
  93. package/src/commands/lsp.ts +199 -0
  94. package/src/commands/markdown-commands.ts +253 -0
  95. package/src/commands/mcp.ts +588 -0
  96. package/src/commands/memory/export.ts +341 -0
  97. package/src/commands/memory/index.ts +148 -0
  98. package/src/commands/memory/list.ts +261 -0
  99. package/src/commands/memory/search.ts +346 -0
  100. package/src/commands/memory/utils.ts +15 -0
  101. package/src/commands/metrics.ts +75 -0
  102. package/src/commands/migrate/index.ts +16 -0
  103. package/src/commands/migrate/prompts.ts +477 -0
  104. package/src/commands/mode.ts +331 -0
  105. package/src/commands/model.ts +298 -0
  106. package/src/commands/onboard.ts +205 -0
  107. package/src/commands/open.ts +169 -0
  108. package/src/commands/output/stream-json.ts +373 -0
  109. package/src/commands/parser/chain-parser.ts +370 -0
  110. package/src/commands/parser/index.ts +29 -0
  111. package/src/commands/parser/pipe-parser.ts +480 -0
  112. package/src/commands/parser.ts +588 -0
  113. package/src/commands/persistence.ts +355 -0
  114. package/src/commands/progress.ts +18 -0
  115. package/src/commands/prompt/index.ts +17 -0
  116. package/src/commands/prompt/validate.ts +621 -0
  117. package/src/commands/prompt-priority.ts +401 -0
  118. package/src/commands/registry.ts +374 -0
  119. package/src/commands/sandbox/index.ts +131 -0
  120. package/src/commands/security/index.ts +21 -0
  121. package/src/commands/security/input-sanitizer.ts +168 -0
  122. package/src/commands/security/permission-checker.ts +456 -0
  123. package/src/commands/security/sensitive-data.ts +350 -0
  124. package/src/commands/session/delete.ts +38 -0
  125. package/src/commands/session/export.ts +39 -0
  126. package/src/commands/session/index.ts +26 -0
  127. package/src/commands/session/list.ts +26 -0
  128. package/src/commands/session/resume.ts +562 -0
  129. package/src/commands/session/search.ts +434 -0
  130. package/src/commands/session/show.ts +26 -0
  131. package/src/commands/settings.ts +368 -0
  132. package/src/commands/setup.ts +23 -0
  133. package/src/commands/shell/index.ts +16 -0
  134. package/src/commands/shell/setup.ts +422 -0
  135. package/src/commands/shell-init.ts +50 -0
  136. package/src/commands/shell-integration/index.ts +194 -0
  137. package/src/commands/skill.ts +1220 -0
  138. package/src/commands/spec.ts +558 -0
  139. package/src/commands/status.ts +246 -0
  140. package/src/commands/theme.ts +211 -0
  141. package/src/commands/think.ts +551 -0
  142. package/src/commands/trust.ts +211 -0
  143. package/src/commands/tutorial.ts +522 -0
  144. package/src/commands/types.ts +512 -0
  145. package/src/commands/update.ts +274 -0
  146. package/src/commands/usage.ts +213 -0
  147. package/src/commands/user-commands.ts +630 -0
  148. package/src/commands/utils.ts +142 -0
  149. package/src/commands/vim.ts +152 -0
  150. package/src/commands/workflow.ts +257 -0
  151. package/src/components/header.tsx +25 -0
  152. package/src/components/input.tsx +25 -0
  153. package/src/components/message-list.tsx +32 -0
  154. package/src/components/status-bar.tsx +23 -0
  155. package/src/index.tsx +614 -0
  156. package/src/onboarding/__tests__/tutorial.test.ts +740 -0
  157. package/src/onboarding/index.ts +69 -0
  158. package/src/onboarding/tips/index.ts +9 -0
  159. package/src/onboarding/tips/tip-engine.ts +459 -0
  160. package/src/onboarding/tutorial/index.ts +88 -0
  161. package/src/onboarding/tutorial/lessons/basics.ts +151 -0
  162. package/src/onboarding/tutorial/lessons/index.ts +151 -0
  163. package/src/onboarding/tutorial/lessons/modes.ts +230 -0
  164. package/src/onboarding/tutorial/lessons/tools.ts +172 -0
  165. package/src/onboarding/tutorial/progress-tracker.ts +350 -0
  166. package/src/onboarding/tutorial/storage.ts +249 -0
  167. package/src/onboarding/tutorial/tutorial-system.ts +462 -0
  168. package/src/onboarding/tutorial/types.ts +310 -0
  169. package/src/orchestrator-singleton.ts +129 -0
  170. package/src/shutdown.ts +33 -0
  171. package/src/test/e2e/assertions.ts +267 -0
  172. package/src/test/e2e/fixtures.ts +204 -0
  173. package/src/test/e2e/harness.ts +575 -0
  174. package/src/test/e2e/index.ts +57 -0
  175. package/src/test/e2e/types.ts +228 -0
  176. package/src/test/fixtures/__tests__/fake-response-loader.test.ts +314 -0
  177. package/src/test/fixtures/fake-response-loader.ts +314 -0
  178. package/src/test/fixtures/index.ts +20 -0
  179. package/src/tui/__tests__/mcp-panel.test.tsx +82 -0
  180. package/src/tui/__tests__/mcp-wiring.test.tsx +78 -0
  181. package/src/tui/__tests__/mode-components.test.tsx +395 -0
  182. package/src/tui/__tests__/permission-ask-flow.test.tsx +138 -0
  183. package/src/tui/__tests__/sidebar-panel-data.test.tsx +148 -0
  184. package/src/tui/__tests__/tools-panel-hotkeys.test.tsx +41 -0
  185. package/src/tui/adapters/agent-adapter.ts +1008 -0
  186. package/src/tui/adapters/index.ts +48 -0
  187. package/src/tui/adapters/message-adapter.ts +315 -0
  188. package/src/tui/adapters/persistence-bridge.ts +331 -0
  189. package/src/tui/adapters/session-adapter.ts +419 -0
  190. package/src/tui/buffered-stdout.ts +223 -0
  191. package/src/tui/components/AgentProgress.tsx +424 -0
  192. package/src/tui/components/Banner/AsciiArt.ts +160 -0
  193. package/src/tui/components/Banner/Banner.tsx +355 -0
  194. package/src/tui/components/Banner/ShimmerContext.tsx +131 -0
  195. package/src/tui/components/Banner/ShimmerText.tsx +193 -0
  196. package/src/tui/components/Banner/TypeWriterGradient.tsx +321 -0
  197. package/src/tui/components/Banner/index.ts +61 -0
  198. package/src/tui/components/Banner/useShimmer.ts +241 -0
  199. package/src/tui/components/ChatView.tsx +11 -0
  200. package/src/tui/components/Checkpoint/CheckpointDiffView.tsx +371 -0
  201. package/src/tui/components/Checkpoint/SnapshotCheckpointPanel.tsx +440 -0
  202. package/src/tui/components/Checkpoint/index.ts +19 -0
  203. package/src/tui/components/CostDisplay.tsx +226 -0
  204. package/src/tui/components/InitErrorBanner.tsx +122 -0
  205. package/src/tui/components/Input/Autocomplete.tsx +603 -0
  206. package/src/tui/components/Input/EnhancedCommandInput.tsx +471 -0
  207. package/src/tui/components/Input/HighlightedText.tsx +236 -0
  208. package/src/tui/components/Input/MentionAutocomplete.tsx +375 -0
  209. package/src/tui/components/Input/TextInput.tsx +1002 -0
  210. package/src/tui/components/Input/__tests__/Autocomplete.test.tsx +374 -0
  211. package/src/tui/components/Input/__tests__/TextInput.test.tsx +241 -0
  212. package/src/tui/components/Input/__tests__/highlight.test.ts +219 -0
  213. package/src/tui/components/Input/__tests__/slash-command-utils.test.ts +104 -0
  214. package/src/tui/components/Input/highlight.ts +362 -0
  215. package/src/tui/components/Input/index.ts +36 -0
  216. package/src/tui/components/Input/slash-command-utils.ts +135 -0
  217. package/src/tui/components/Layout.tsx +432 -0
  218. package/src/tui/components/McpPanel.tsx +137 -0
  219. package/src/tui/components/MemoryPanel.tsx +448 -0
  220. package/src/tui/components/Messages/CodeBlock.tsx +527 -0
  221. package/src/tui/components/Messages/DiffView.tsx +679 -0
  222. package/src/tui/components/Messages/ImageReference.tsx +89 -0
  223. package/src/tui/components/Messages/MarkdownBlock.tsx +228 -0
  224. package/src/tui/components/Messages/MarkdownRenderer.tsx +498 -0
  225. package/src/tui/components/Messages/MessageBubble.tsx +270 -0
  226. package/src/tui/components/Messages/MessageList.tsx +1719 -0
  227. package/src/tui/components/Messages/StreamingText.tsx +216 -0
  228. package/src/tui/components/Messages/ThinkingBlock.tsx +408 -0
  229. package/src/tui/components/Messages/ToolResultPreview.tsx +243 -0
  230. package/src/tui/components/Messages/__tests__/CodeBlock.test.tsx +296 -0
  231. package/src/tui/components/Messages/__tests__/DiffView.test.tsx +239 -0
  232. package/src/tui/components/Messages/__tests__/MarkdownRenderer.test.tsx +303 -0
  233. package/src/tui/components/Messages/__tests__/MessageBubble.test.tsx +268 -0
  234. package/src/tui/components/Messages/__tests__/MessageList.test.tsx +324 -0
  235. package/src/tui/components/Messages/__tests__/StreamingText.test.tsx +215 -0
  236. package/src/tui/components/Messages/index.ts +25 -0
  237. package/src/tui/components/ModeIndicator.tsx +177 -0
  238. package/src/tui/components/ModeSelector.tsx +216 -0
  239. package/src/tui/components/ModelSelector.tsx +339 -0
  240. package/src/tui/components/OnboardingWizard.tsx +670 -0
  241. package/src/tui/components/PhaseProgressIndicator.tsx +270 -0
  242. package/src/tui/components/RateLimitIndicator.tsx +82 -0
  243. package/src/tui/components/ScreenReaderLayout.tsx +295 -0
  244. package/src/tui/components/SettingsPanel.tsx +643 -0
  245. package/src/tui/components/Sidebar/SystemStatusPanel.tsx +284 -0
  246. package/src/tui/components/Sidebar/index.ts +9 -0
  247. package/src/tui/components/Status/ModelStatusBar.tsx +270 -0
  248. package/src/tui/components/Status/index.ts +12 -0
  249. package/src/tui/components/StatusBar/AgentModeIndicator.tsx +257 -0
  250. package/src/tui/components/StatusBar/ContextProgress.tsx +167 -0
  251. package/src/tui/components/StatusBar/FileChangesIndicator.tsx +62 -0
  252. package/src/tui/components/StatusBar/GitIndicator.tsx +89 -0
  253. package/src/tui/components/StatusBar/HeaderBar.tsx +126 -0
  254. package/src/tui/components/StatusBar/ModelIndicator.tsx +157 -0
  255. package/src/tui/components/StatusBar/PersistenceStatusIndicator.tsx +210 -0
  256. package/src/tui/components/StatusBar/ResilienceIndicator.tsx +106 -0
  257. package/src/tui/components/StatusBar/SandboxIndicator.tsx +167 -0
  258. package/src/tui/components/StatusBar/StatusBar.tsx +368 -0
  259. package/src/tui/components/StatusBar/ThinkingModeIndicator.tsx +170 -0
  260. package/src/tui/components/StatusBar/TokenBreakdown.tsx +246 -0
  261. package/src/tui/components/StatusBar/TokenCounter.tsx +135 -0
  262. package/src/tui/components/StatusBar/TrustModeIndicator.tsx +130 -0
  263. package/src/tui/components/StatusBar/WorkspaceIndicator.tsx +86 -0
  264. package/src/tui/components/StatusBar/__tests__/AgentModeIndicator.test.tsx +193 -0
  265. package/src/tui/components/StatusBar/__tests__/StatusBar.test.tsx +729 -0
  266. package/src/tui/components/StatusBar/index.ts +60 -0
  267. package/src/tui/components/TipBanner.tsx +115 -0
  268. package/src/tui/components/TodoItem.tsx +208 -0
  269. package/src/tui/components/TodoPanel.tsx +455 -0
  270. package/src/tui/components/Tools/ApprovalQueue.tsx +407 -0
  271. package/src/tui/components/Tools/OptionSelector.tsx +160 -0
  272. package/src/tui/components/Tools/PermissionDialog.tsx +286 -0
  273. package/src/tui/components/Tools/ToolParams.tsx +483 -0
  274. package/src/tui/components/Tools/ToolsPanel.tsx +178 -0
  275. package/src/tui/components/Tools/__tests__/PermissionDialog.test.tsx +510 -0
  276. package/src/tui/components/Tools/__tests__/ToolParams.test.tsx +432 -0
  277. package/src/tui/components/Tools/index.ts +21 -0
  278. package/src/tui/components/TrustPrompt.tsx +279 -0
  279. package/src/tui/components/UpdateBanner.tsx +166 -0
  280. package/src/tui/components/VimModeIndicator.tsx +112 -0
  281. package/src/tui/components/backtrack/BacktrackControls.tsx +402 -0
  282. package/src/tui/components/backtrack/index.ts +13 -0
  283. package/src/tui/components/common/AutoApprovalStatus.tsx +251 -0
  284. package/src/tui/components/common/CostWarning.tsx +294 -0
  285. package/src/tui/components/common/DynamicShortcutHints.tsx +209 -0
  286. package/src/tui/components/common/EnhancedLoadingIndicator.tsx +305 -0
  287. package/src/tui/components/common/ErrorBoundary.tsx +140 -0
  288. package/src/tui/components/common/GradientText.tsx +224 -0
  289. package/src/tui/components/common/HotkeyHelpModal.tsx +193 -0
  290. package/src/tui/components/common/HotkeyHints.tsx +70 -0
  291. package/src/tui/components/common/MaxSizedBox.tsx +354 -0
  292. package/src/tui/components/common/NewMessagesBadge.tsx +65 -0
  293. package/src/tui/components/common/ProtectedFileLegend.tsx +89 -0
  294. package/src/tui/components/common/ScrollIndicator.tsx +160 -0
  295. package/src/tui/components/common/Spinner.tsx +342 -0
  296. package/src/tui/components/common/StreamingIndicator.tsx +316 -0
  297. package/src/tui/components/common/VirtualizedList/VirtualizedList.tsx +428 -0
  298. package/src/tui/components/common/VirtualizedList/hooks/index.ts +19 -0
  299. package/src/tui/components/common/VirtualizedList/hooks/useBatchedScroll.ts +64 -0
  300. package/src/tui/components/common/VirtualizedList/hooks/useScrollAnchor.ts +290 -0
  301. package/src/tui/components/common/VirtualizedList/hooks/useVirtualization.ts +340 -0
  302. package/src/tui/components/common/VirtualizedList/index.ts +30 -0
  303. package/src/tui/components/common/VirtualizedList/types.ts +107 -0
  304. package/src/tui/components/common/__tests__/NewMessagesBadge.test.tsx +74 -0
  305. package/src/tui/components/common/__tests__/ScrollIndicator.test.tsx +193 -0
  306. package/src/tui/components/common/index.ts +110 -0
  307. package/src/tui/components/index.ts +79 -0
  308. package/src/tui/components/session/CheckpointPanel.tsx +323 -0
  309. package/src/tui/components/session/RollbackDialog.tsx +169 -0
  310. package/src/tui/components/session/SessionItem.tsx +136 -0
  311. package/src/tui/components/session/SessionListPanel.tsx +252 -0
  312. package/src/tui/components/session/SessionPicker.tsx +449 -0
  313. package/src/tui/components/session/SessionPreview.tsx +240 -0
  314. package/src/tui/components/session/__tests__/session.test.tsx +408 -0
  315. package/src/tui/components/session/index.ts +28 -0
  316. package/src/tui/components/session/types.ts +116 -0
  317. package/src/tui/components/theme/__tests__/tokens.test.ts +471 -0
  318. package/src/tui/components/theme/index.ts +227 -0
  319. package/src/tui/components/theme/tokens.ts +484 -0
  320. package/src/tui/config/defaults.ts +134 -0
  321. package/src/tui/config/index.ts +17 -0
  322. package/src/tui/context/AnimationContext.tsx +284 -0
  323. package/src/tui/context/AppContext.tsx +349 -0
  324. package/src/tui/context/BracketedPasteContext.tsx +372 -0
  325. package/src/tui/context/LspContext.tsx +192 -0
  326. package/src/tui/context/McpContext.tsx +325 -0
  327. package/src/tui/context/MessagesContext.tsx +870 -0
  328. package/src/tui/context/OverflowContext.tsx +213 -0
  329. package/src/tui/context/RateLimitContext.tsx +108 -0
  330. package/src/tui/context/ResilienceContext.tsx +275 -0
  331. package/src/tui/context/RootProvider.tsx +136 -0
  332. package/src/tui/context/ScrollContext.tsx +331 -0
  333. package/src/tui/context/ToolsContext.tsx +702 -0
  334. package/src/tui/context/__tests__/BracketedPasteContext.test.tsx +416 -0
  335. package/src/tui/context/index.ts +140 -0
  336. package/src/tui/enterprise-integration.ts +282 -0
  337. package/src/tui/hooks/__tests__/useBacktrack.test.tsx +138 -0
  338. package/src/tui/hooks/__tests__/useBracketedPaste.test.tsx +222 -0
  339. package/src/tui/hooks/__tests__/useCopyMode.test.tsx +336 -0
  340. package/src/tui/hooks/__tests__/useHotkeys.ctrl-input.test.tsx +96 -0
  341. package/src/tui/hooks/__tests__/useHotkeys.test.tsx +454 -0
  342. package/src/tui/hooks/__tests__/useInputHistory.test.tsx +660 -0
  343. package/src/tui/hooks/__tests__/useLineBuffer.test.ts +295 -0
  344. package/src/tui/hooks/__tests__/useModeController.test.ts +137 -0
  345. package/src/tui/hooks/__tests__/useModeShortcuts.test.tsx +142 -0
  346. package/src/tui/hooks/__tests__/useScrollController.test.ts +464 -0
  347. package/src/tui/hooks/__tests__/useVim.test.tsx +531 -0
  348. package/src/tui/hooks/index.ts +252 -0
  349. package/src/tui/hooks/useAgentLoop.ts +712 -0
  350. package/src/tui/hooks/useAlternateBuffer.ts +398 -0
  351. package/src/tui/hooks/useAnimatedScrollbar.ts +241 -0
  352. package/src/tui/hooks/useBacktrack.ts +443 -0
  353. package/src/tui/hooks/useBracketedPaste.ts +104 -0
  354. package/src/tui/hooks/useCollapsible.ts +240 -0
  355. package/src/tui/hooks/useCopyMode.ts +382 -0
  356. package/src/tui/hooks/useCostSummary.ts +75 -0
  357. package/src/tui/hooks/useDesktopNotification.ts +414 -0
  358. package/src/tui/hooks/useDiffMode.ts +44 -0
  359. package/src/tui/hooks/useFileChangeStats.ts +110 -0
  360. package/src/tui/hooks/useFileSuggestions.ts +284 -0
  361. package/src/tui/hooks/useFlickerDetector.ts +250 -0
  362. package/src/tui/hooks/useGitStatus.ts +200 -0
  363. package/src/tui/hooks/useHotkeys.ts +579 -0
  364. package/src/tui/hooks/useImagePaste.ts +114 -0
  365. package/src/tui/hooks/useInputHighlight.ts +145 -0
  366. package/src/tui/hooks/useInputHistory.ts +246 -0
  367. package/src/tui/hooks/useKeyboardScroll.ts +209 -0
  368. package/src/tui/hooks/useLineBuffer.ts +356 -0
  369. package/src/tui/hooks/useMentionAutocomplete.ts +235 -0
  370. package/src/tui/hooks/useModeController.ts +167 -0
  371. package/src/tui/hooks/useModeShortcuts.ts +196 -0
  372. package/src/tui/hooks/usePermissionHandler.ts +146 -0
  373. package/src/tui/hooks/usePersistence.ts +480 -0
  374. package/src/tui/hooks/usePersistenceShortcuts.ts +225 -0
  375. package/src/tui/hooks/usePlaceholderRotation.ts +143 -0
  376. package/src/tui/hooks/useProviderStatus.ts +270 -0
  377. package/src/tui/hooks/useRateLimitStatus.ts +90 -0
  378. package/src/tui/hooks/useScreenReader.ts +315 -0
  379. package/src/tui/hooks/useScrollController.ts +450 -0
  380. package/src/tui/hooks/useScrollEventBatcher.ts +185 -0
  381. package/src/tui/hooks/useSidebarPanelData.ts +115 -0
  382. package/src/tui/hooks/useSmoothScroll.ts +202 -0
  383. package/src/tui/hooks/useSnapshots.ts +300 -0
  384. package/src/tui/hooks/useStateAndRef.ts +50 -0
  385. package/src/tui/hooks/useTerminalSize.ts +206 -0
  386. package/src/tui/hooks/useToolApprovalController.ts +91 -0
  387. package/src/tui/hooks/useVim.ts +334 -0
  388. package/src/tui/hooks/useWorkspace.ts +56 -0
  389. package/src/tui/i18n/__tests__/init.test.ts +278 -0
  390. package/src/tui/i18n/__tests__/language-config.test.ts +199 -0
  391. package/src/tui/i18n/__tests__/locale-detection.test.ts +250 -0
  392. package/src/tui/i18n/__tests__/settings-integration.test.ts +262 -0
  393. package/src/tui/i18n/index.ts +72 -0
  394. package/src/tui/i18n/init.ts +131 -0
  395. package/src/tui/i18n/language-config.ts +106 -0
  396. package/src/tui/i18n/locale-detection.ts +173 -0
  397. package/src/tui/i18n/settings-integration.ts +557 -0
  398. package/src/tui/i18n/tui-namespace.ts +538 -0
  399. package/src/tui/i18n/types.ts +312 -0
  400. package/src/tui/index.ts +43 -0
  401. package/src/tui/lsp-integration.ts +409 -0
  402. package/src/tui/metrics-integration.ts +366 -0
  403. package/src/tui/plugins.ts +383 -0
  404. package/src/tui/resilience.ts +342 -0
  405. package/src/tui/sandbox-integration.ts +317 -0
  406. package/src/tui/services/clipboard.ts +348 -0
  407. package/src/tui/services/fuzzy-search.ts +441 -0
  408. package/src/tui/services/index.ts +72 -0
  409. package/src/tui/services/markdown-renderer.ts +565 -0
  410. package/src/tui/services/open-external.ts +247 -0
  411. package/src/tui/services/syntax-highlighter.ts +483 -0
  412. package/src/tui/slash-commands.ts +12 -0
  413. package/src/tui/theme/index.ts +15 -0
  414. package/src/tui/theme/provider.tsx +206 -0
  415. package/src/tui/tip-integration.ts +300 -0
  416. package/src/tui/types/__tests__/ink-extended.test.ts +121 -0
  417. package/src/tui/types/ink-extended.ts +87 -0
  418. package/src/tui/utils/__tests__/bracketedPaste.test.ts +231 -0
  419. package/src/tui/utils/__tests__/heightEstimator.test.ts +157 -0
  420. package/src/tui/utils/__tests__/text-width.test.ts +158 -0
  421. package/src/tui/utils/__tests__/textSanitizer.test.ts +266 -0
  422. package/src/tui/utils/__tests__/ui-sizing.test.ts +169 -0
  423. package/src/tui/utils/bracketedPaste.ts +107 -0
  424. package/src/tui/utils/cursor-manager.ts +131 -0
  425. package/src/tui/utils/detectTerminal.ts +596 -0
  426. package/src/tui/utils/findLastSafeSplitPoint.ts +92 -0
  427. package/src/tui/utils/heightEstimator.ts +198 -0
  428. package/src/tui/utils/index.ts +91 -0
  429. package/src/tui/utils/isNarrowWidth.ts +52 -0
  430. package/src/tui/utils/stdoutGuard.ts +90 -0
  431. package/src/tui/utils/synchronized-update.ts +70 -0
  432. package/src/tui/utils/text-width.ts +225 -0
  433. package/src/tui/utils/textSanitizer.ts +225 -0
  434. package/src/tui/utils/textUtils.ts +114 -0
  435. package/src/tui/utils/ui-sizing.ts +192 -0
  436. package/src/tui-blessed/app.ts +160 -0
  437. package/src/tui-blessed/index.ts +2 -0
  438. package/src/tui-blessed/neo-blessed.d.ts +6 -0
  439. package/src/tui-blessed/test.ts +21 -0
  440. package/src/tui-blessed/types.ts +14 -0
  441. package/src/utils/icons.ts +130 -0
  442. package/src/utils/index.ts +33 -0
  443. package/src/utils/resume-hint.ts +86 -0
  444. package/src/version.ts +1 -0
  445. package/tsconfig.json +8 -0
  446. package/vitest.config.ts +35 -0
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Basics Tutorial Lesson
3
+ *
4
+ * Getting started lesson that covers fundamental Vellum concepts.
5
+ *
6
+ * @module cli/onboarding/tutorial/lessons/basics
7
+ */
8
+
9
+ import type { Lesson } from "../types.js";
10
+
11
+ /**
12
+ * Getting Started lesson - covers basic Vellum usage
13
+ */
14
+ export const basicsLesson: Lesson = {
15
+ id: "basics",
16
+ title: "Getting Started with Vellum",
17
+ description: "Learn the fundamentals of using Vellum AI coding assistant",
18
+ category: "basics",
19
+ difficulty: "beginner",
20
+ prerequisites: [],
21
+ estimatedMinutes: 5,
22
+ icon: "📚",
23
+ tags: ["beginner", "introduction", "fundamentals"],
24
+ steps: [
25
+ {
26
+ id: "basics-welcome",
27
+ title: "Welcome to Vellum",
28
+ content: `
29
+ Welcome to Vellum! 🎉
30
+
31
+ Vellum is an AI-powered coding assistant that helps you write, debug,
32
+ and understand code faster.
33
+
34
+ This tutorial will teach you the basics:
35
+ • How to interact with the AI
36
+ • How to use slash commands
37
+ • How to get the most out of Vellum
38
+
39
+ Press Enter to continue...
40
+ `.trim(),
41
+ action: "read",
42
+ estimatedDuration: 30,
43
+ },
44
+ {
45
+ id: "basics-chat",
46
+ title: "Chatting with the AI",
47
+ content: `
48
+ **Talking to Vellum**
49
+
50
+ Simply type your question or request in natural language:
51
+
52
+ • "Explain this function"
53
+ • "Write a unit test for this code"
54
+ • "Fix the bug in line 42"
55
+ • "Refactor this to use async/await"
56
+
57
+ The AI understands context from your project and current file.
58
+
59
+ 💡 Tip: Be specific about what you want for better results!
60
+ `.trim(),
61
+ action: "read",
62
+ hint: "Try asking the AI to explain something simple",
63
+ estimatedDuration: 45,
64
+ },
65
+ {
66
+ id: "basics-help",
67
+ title: "Using the Help Command",
68
+ content: `
69
+ **Slash Commands**
70
+
71
+ Vellum has built-in commands that start with "/":
72
+
73
+ Try typing: /help
74
+
75
+ This shows all available commands and their descriptions.
76
+ `.trim(),
77
+ action: "command",
78
+ command: "/help",
79
+ expectedOutcome: "You should see a list of available commands",
80
+ hint: "Type /help and press Enter",
81
+ estimatedDuration: 30,
82
+ },
83
+ {
84
+ id: "basics-clear",
85
+ title: "Clearing the Screen",
86
+ content: `
87
+ **The /clear Command**
88
+
89
+ To clear the conversation history and start fresh:
90
+
91
+ Try typing: /clear
92
+
93
+ This clears the display but keeps your session active.
94
+ `.trim(),
95
+ action: "command",
96
+ command: "/clear",
97
+ expectedOutcome: "The screen should be cleared",
98
+ hint: "Type /clear and press Enter",
99
+ estimatedDuration: 20,
100
+ },
101
+ {
102
+ id: "basics-mode",
103
+ title: "Understanding Modes",
104
+ content: `
105
+ **Coding Modes**
106
+
107
+ Vellum has different modes for different tasks:
108
+
109
+ • **code** - General coding assistance
110
+ • **architect** - System design and architecture
111
+ • **debug** - Focused debugging help
112
+ • **explain** - Code explanations
113
+ • **review** - Code review
114
+
115
+ Use /mode to see current mode or switch modes.
116
+ `.trim(),
117
+ action: "read",
118
+ hint: "Try /mode to see your current mode",
119
+ estimatedDuration: 45,
120
+ },
121
+ {
122
+ id: "basics-complete",
123
+ title: "Basics Complete!",
124
+ content: `
125
+ 🎉 **Congratulations!**
126
+
127
+ You've learned the basics of Vellum:
128
+
129
+ ✅ How to chat with the AI
130
+ ✅ How to use slash commands
131
+ ✅ How to get help
132
+ ✅ Understanding modes
133
+
134
+ **Next Steps:**
135
+ • Try the "Tools" tutorial to learn about available tools
136
+ • Try the "Modes" tutorial for advanced mode usage
137
+
138
+ Happy coding! 🚀
139
+ `.trim(),
140
+ action: "complete",
141
+ estimatedDuration: 15,
142
+ },
143
+ ],
144
+ };
145
+
146
+ /**
147
+ * Get the basics lesson
148
+ */
149
+ export function getBasicsLesson(): Lesson {
150
+ return basicsLesson;
151
+ }
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Tutorial Lessons Index
3
+ *
4
+ * Exports all available tutorial lessons.
5
+ *
6
+ * @module cli/onboarding/tutorial/lessons
7
+ */
8
+
9
+ import type { Lesson, LessonCategory } from "../types.js";
10
+ import { basicsLesson } from "./basics.js";
11
+ import { modesLesson } from "./modes.js";
12
+ import { toolsLesson } from "./tools.js";
13
+
14
+ // =============================================================================
15
+ // Lesson Exports
16
+ // =============================================================================
17
+
18
+ export { basicsLesson, getBasicsLesson } from "./basics.js";
19
+ export { getModesLesson, modesLesson } from "./modes.js";
20
+ export { getToolsLesson, toolsLesson } from "./tools.js";
21
+
22
+ // =============================================================================
23
+ // Lesson Registry
24
+ // =============================================================================
25
+
26
+ /**
27
+ * All available lessons
28
+ */
29
+ export const ALL_LESSONS: readonly Lesson[] = [basicsLesson, toolsLesson, modesLesson] as const;
30
+
31
+ /**
32
+ * Lessons indexed by ID
33
+ */
34
+ export const LESSONS_BY_ID: Readonly<Record<string, Lesson>> = Object.freeze(
35
+ ALL_LESSONS.reduce(
36
+ (acc, lesson) => {
37
+ acc[lesson.id] = lesson;
38
+ return acc;
39
+ },
40
+ {} as Record<string, Lesson>
41
+ )
42
+ );
43
+
44
+ /**
45
+ * Lessons grouped by category
46
+ */
47
+ export const LESSONS_BY_CATEGORY: Readonly<Record<LessonCategory, Lesson[]>> = Object.freeze({
48
+ basics: ALL_LESSONS.filter((l) => l.category === "basics"),
49
+ tools: ALL_LESSONS.filter((l) => l.category === "tools"),
50
+ modes: ALL_LESSONS.filter((l) => l.category === "modes"),
51
+ advanced: ALL_LESSONS.filter((l) => l.category === "advanced"),
52
+ workflow: ALL_LESSONS.filter((l) => l.category === "workflow"),
53
+ });
54
+
55
+ // =============================================================================
56
+ // Lesson Utilities
57
+ // =============================================================================
58
+
59
+ /**
60
+ * Get a lesson by ID
61
+ */
62
+ export function getLessonById(lessonId: string): Lesson | undefined {
63
+ return LESSONS_BY_ID[lessonId];
64
+ }
65
+
66
+ /**
67
+ * Get lessons by category
68
+ */
69
+ export function getLessonsByCategory(category: LessonCategory): Lesson[] {
70
+ return LESSONS_BY_CATEGORY[category] ?? [];
71
+ }
72
+
73
+ /**
74
+ * Get all lessons
75
+ */
76
+ export function getAllLessons(): Lesson[] {
77
+ return [...ALL_LESSONS];
78
+ }
79
+
80
+ /**
81
+ * Get recommended lesson order (respecting prerequisites)
82
+ */
83
+ export function getRecommendedOrder(): Lesson[] {
84
+ // Simple topological sort based on prerequisites
85
+ const visited = new Set<string>();
86
+ const result: Lesson[] = [];
87
+
88
+ function visit(lesson: Lesson): void {
89
+ if (visited.has(lesson.id)) return;
90
+
91
+ // Visit prerequisites first
92
+ for (const prereqId of lesson.prerequisites) {
93
+ const prereq = LESSONS_BY_ID[prereqId];
94
+ if (prereq) {
95
+ visit(prereq);
96
+ }
97
+ }
98
+
99
+ visited.add(lesson.id);
100
+ result.push(lesson);
101
+ }
102
+
103
+ for (const lesson of ALL_LESSONS) {
104
+ visit(lesson);
105
+ }
106
+
107
+ return result;
108
+ }
109
+
110
+ /**
111
+ * Check if a lesson's prerequisites are met
112
+ */
113
+ export function checkPrerequisites(lessonId: string, completedLessons: string[]): boolean {
114
+ const lesson = LESSONS_BY_ID[lessonId];
115
+ if (!lesson) return false;
116
+
117
+ return lesson.prerequisites.every((prereqId: string) => completedLessons.includes(prereqId));
118
+ }
119
+
120
+ /**
121
+ * Get next recommended lesson based on progress
122
+ */
123
+ export function getNextLesson(completedLessons: string[]): Lesson | undefined {
124
+ const ordered = getRecommendedOrder();
125
+
126
+ return ordered.find(
127
+ (lesson) =>
128
+ !completedLessons.includes(lesson.id) && checkPrerequisites(lesson.id, completedLessons)
129
+ );
130
+ }
131
+
132
+ /**
133
+ * Calculate total tutorial duration in minutes
134
+ */
135
+ export function getTotalDuration(): number {
136
+ return ALL_LESSONS.reduce((sum, lesson) => sum + lesson.estimatedMinutes, 0);
137
+ }
138
+
139
+ /**
140
+ * Get lesson count
141
+ */
142
+ export function getLessonCount(): number {
143
+ return ALL_LESSONS.length;
144
+ }
145
+
146
+ /**
147
+ * Get total step count across all lessons
148
+ */
149
+ export function getTotalStepCount(): number {
150
+ return ALL_LESSONS.reduce((sum, lesson) => sum + lesson.steps.length, 0);
151
+ }
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Modes Tutorial Lesson
3
+ *
4
+ * Lesson covering coding modes and when to use each.
5
+ *
6
+ * @module cli/onboarding/tutorial/lessons/modes
7
+ */
8
+
9
+ import type { Lesson } from "../types.js";
10
+
11
+ /**
12
+ * Modes lesson - understand and use coding modes
13
+ */
14
+ export const modesLesson: Lesson = {
15
+ id: "modes",
16
+ title: "Mastering Coding Modes",
17
+ description: "Learn when and how to use different coding modes",
18
+ category: "modes",
19
+ difficulty: "intermediate",
20
+ prerequisites: ["basics"],
21
+ estimatedMinutes: 8,
22
+ icon: "⚡",
23
+ tags: ["modes", "workflow", "productivity"],
24
+ steps: [
25
+ {
26
+ id: "modes-intro",
27
+ title: "What are Modes?",
28
+ content: `
29
+ **Coding Modes**
30
+
31
+ Modes customize how Vellum responds to your requests:
32
+
33
+ • Different system prompts
34
+ • Different tool permissions
35
+ • Different response styles
36
+
37
+ Think of modes as "personalities" optimized for specific tasks.
38
+ `.trim(),
39
+ action: "read",
40
+ estimatedDuration: 30,
41
+ },
42
+ {
43
+ id: "modes-check",
44
+ title: "Check Current Mode",
45
+ content: `
46
+ **The /mode Command**
47
+
48
+ To see your current mode:
49
+
50
+ Try typing: /mode
51
+
52
+ This shows your active mode and available options.
53
+ `.trim(),
54
+ action: "command",
55
+ command: "/mode",
56
+ expectedOutcome: "Your current mode and list of available modes",
57
+ hint: "Type /mode and press Enter",
58
+ estimatedDuration: 30,
59
+ },
60
+ {
61
+ id: "modes-code",
62
+ title: "Code Mode",
63
+ content: `
64
+ **Code Mode** (Default)
65
+
66
+ Best for:
67
+ • Writing new features
68
+ • General coding tasks
69
+ • Implementation work
70
+
71
+ Balanced between speed and thoroughness.
72
+ `.trim(),
73
+ action: "read",
74
+ estimatedDuration: 30,
75
+ },
76
+ {
77
+ id: "modes-architect",
78
+ title: "Architect Mode",
79
+ content: `
80
+ **Architect Mode**
81
+
82
+ Best for:
83
+ • System design
84
+ • API planning
85
+ • Architecture decisions
86
+ • Refactoring strategies
87
+
88
+ Focuses on high-level thinking before implementation.
89
+
90
+ 💡 Use when planning major features!
91
+ `.trim(),
92
+ action: "read",
93
+ hint: "Switch with: /mode architect",
94
+ estimatedDuration: 30,
95
+ },
96
+ {
97
+ id: "modes-debug",
98
+ title: "Debug Mode",
99
+ content: `
100
+ **Debug Mode**
101
+
102
+ Best for:
103
+ • Fixing bugs
104
+ • Error investigation
105
+ • Understanding failures
106
+ • Performance issues
107
+
108
+ Methodical, step-by-step analysis approach.
109
+
110
+ 💡 Great when you're stuck on an error!
111
+ `.trim(),
112
+ action: "read",
113
+ hint: "Switch with: /mode debug",
114
+ estimatedDuration: 30,
115
+ },
116
+ {
117
+ id: "modes-explain",
118
+ title: "Explain Mode",
119
+ content: `
120
+ **Explain Mode**
121
+
122
+ Best for:
123
+ • Learning new code
124
+ • Understanding complex logic
125
+ • Documentation
126
+ • Code reviews
127
+
128
+ Detailed explanations with examples.
129
+
130
+ 💡 Perfect for unfamiliar codebases!
131
+ `.trim(),
132
+ action: "read",
133
+ hint: "Switch with: /mode explain",
134
+ estimatedDuration: 30,
135
+ },
136
+ {
137
+ id: "modes-review",
138
+ title: "Review Mode",
139
+ content: `
140
+ **Review Mode**
141
+
142
+ Best for:
143
+ • Code review
144
+ • Finding issues
145
+ • Suggesting improvements
146
+ • Best practices check
147
+
148
+ Critical analysis focused on quality.
149
+
150
+ 💡 Run before submitting PRs!
151
+ `.trim(),
152
+ action: "read",
153
+ hint: "Switch with: /mode review",
154
+ estimatedDuration: 30,
155
+ },
156
+ {
157
+ id: "modes-switch",
158
+ title: "Practice: Switch Modes",
159
+ content: `
160
+ **Try Switching!**
161
+
162
+ Switch to architect mode:
163
+
164
+ /mode architect
165
+
166
+ Then switch back to code mode:
167
+
168
+ /mode code
169
+
170
+ Notice how the context changes!
171
+ `.trim(),
172
+ action: "command",
173
+ command: "/mode architect",
174
+ expectedOutcome: "Mode should change to architect",
175
+ hint: "Type /mode architect and press Enter",
176
+ estimatedDuration: 45,
177
+ },
178
+ {
179
+ id: "modes-tips",
180
+ title: "Mode Selection Tips",
181
+ content: `
182
+ **When to Use Each Mode**
183
+
184
+ | Situation | Mode |
185
+ |-----------|------|
186
+ | Writing new code | code |
187
+ | Planning features | architect |
188
+ | Fixing bugs | debug |
189
+ | Learning code | explain |
190
+ | Before merge | review |
191
+
192
+ 💡 **Pro Tip**: Start in architect mode for complex tasks,
193
+ then switch to code mode for implementation.
194
+ `.trim(),
195
+ action: "read",
196
+ estimatedDuration: 45,
197
+ },
198
+ {
199
+ id: "modes-complete",
200
+ title: "Modes Complete!",
201
+ content: `
202
+ 🎉 **Excellent Work!**
203
+
204
+ You've mastered Vellum's coding modes:
205
+
206
+ ✅ Understanding what modes do
207
+ ✅ Available modes and their purposes
208
+ ✅ How to switch between modes
209
+ ✅ When to use each mode
210
+
211
+ **Your Workflow:**
212
+ 1. Start in architect mode for planning
213
+ 2. Switch to code mode for implementation
214
+ 3. Use debug mode when things break
215
+ 4. Finish with review mode for quality
216
+
217
+ You're now a Vellum power user! 🚀
218
+ `.trim(),
219
+ action: "complete",
220
+ estimatedDuration: 15,
221
+ },
222
+ ],
223
+ };
224
+
225
+ /**
226
+ * Get the modes lesson
227
+ */
228
+ export function getModesLesson(): Lesson {
229
+ return modesLesson;
230
+ }
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Tools Tutorial Lesson
3
+ *
4
+ * Lesson covering tool usage and capabilities.
5
+ *
6
+ * @module cli/onboarding/tutorial/lessons/tools
7
+ */
8
+
9
+ import type { Lesson } from "../types.js";
10
+
11
+ /**
12
+ * Tools lesson - learn about available tools
13
+ */
14
+ export const toolsLesson: Lesson = {
15
+ id: "tools",
16
+ title: "Working with Tools",
17
+ description: "Learn how to use and manage Vellum's powerful tools",
18
+ category: "tools",
19
+ difficulty: "beginner",
20
+ prerequisites: ["basics"],
21
+ estimatedMinutes: 7,
22
+ icon: "🔧",
23
+ tags: ["tools", "commands", "capabilities"],
24
+ steps: [
25
+ {
26
+ id: "tools-intro",
27
+ title: "Introduction to Tools",
28
+ content: `
29
+ **What are Tools?**
30
+
31
+ Tools are powerful capabilities that Vellum can use to help you:
32
+
33
+ • **Read files** - Access and understand your code
34
+ • **Edit files** - Make changes to your codebase
35
+ • **Run commands** - Execute shell commands
36
+ • **Search** - Find code across your project
37
+ • **And more!**
38
+
39
+ Tools work automatically when you ask the AI to do something.
40
+ `.trim(),
41
+ action: "read",
42
+ estimatedDuration: 30,
43
+ },
44
+ {
45
+ id: "tools-list",
46
+ title: "Listing Available Tools",
47
+ content: `
48
+ **The /tools Command**
49
+
50
+ To see all available tools:
51
+
52
+ Try typing: /tools
53
+
54
+ This shows every tool Vellum can use and its description.
55
+ `.trim(),
56
+ action: "command",
57
+ command: "/tools",
58
+ expectedOutcome: "A list of available tools with descriptions",
59
+ hint: "Type /tools and press Enter",
60
+ estimatedDuration: 30,
61
+ },
62
+ {
63
+ id: "tools-categories",
64
+ title: "Tool Categories",
65
+ content: `
66
+ **Tool Categories**
67
+
68
+ Tools are organized into categories:
69
+
70
+ 📁 **Filesystem** - read, write, list files
71
+ 🔍 **Search** - grep, semantic search
72
+ 💻 **Shell** - run terminal commands
73
+ 🌐 **Web** - fetch URLs, API calls
74
+ 🔒 **Security** - permission management
75
+
76
+ Each category serves different needs.
77
+ `.trim(),
78
+ action: "read",
79
+ hint: "Tools automatically activate based on your request",
80
+ estimatedDuration: 45,
81
+ },
82
+ {
83
+ id: "tools-permissions",
84
+ title: "Tool Permissions",
85
+ content: `
86
+ **Security & Permissions**
87
+
88
+ Some tools require approval before running:
89
+
90
+ • **File edits** - Confirm before modifying files
91
+ • **Shell commands** - Approve potentially dangerous commands
92
+ • **Network** - Authorize external requests
93
+
94
+ You control what Vellum can do!
95
+
96
+ 💡 Use /permission to manage approvals.
97
+ `.trim(),
98
+ action: "read",
99
+ hint: "You can always deny a tool action",
100
+ estimatedDuration: 45,
101
+ },
102
+ {
103
+ id: "tools-natural",
104
+ title: "Natural Language Usage",
105
+ content: `
106
+ **Just Ask!**
107
+
108
+ You don't need to know tool names. Just describe what you want:
109
+
110
+ ✅ "Show me the contents of package.json"
111
+ ✅ "Find all TypeScript files with TODO comments"
112
+ ✅ "Run the tests"
113
+ ✅ "Create a new component called Button"
114
+
115
+ Vellum picks the right tools automatically.
116
+ `.trim(),
117
+ action: "read",
118
+ hint: "Be specific about what you want to achieve",
119
+ estimatedDuration: 30,
120
+ },
121
+ {
122
+ id: "tools-practice",
123
+ title: "Practice: List Files",
124
+ content: `
125
+ **Let's Try It!**
126
+
127
+ Ask Vellum to list files in the current directory:
128
+
129
+ Example prompts:
130
+ • "What files are in this directory?"
131
+ • "List the contents of this folder"
132
+ • "Show me the project structure"
133
+
134
+ Try one of these or write your own!
135
+ `.trim(),
136
+ action: "interact",
137
+ expectedOutcome: "Vellum should use the file listing tool",
138
+ hint: "Just type a natural language request",
139
+ estimatedDuration: 60,
140
+ },
141
+ {
142
+ id: "tools-complete",
143
+ title: "Tools Complete!",
144
+ content: `
145
+ 🎉 **Great Job!**
146
+
147
+ You now understand Vellum's tool system:
148
+
149
+ ✅ What tools are and how they work
150
+ ✅ How to list available tools
151
+ ✅ Tool categories and permissions
152
+ ✅ Natural language tool usage
153
+
154
+ **Pro Tips:**
155
+ • Let Vellum choose tools automatically
156
+ • Review tool actions before approving
157
+ • Use /tools to explore capabilities
158
+
159
+ Next: Try the "Modes" tutorial! 🎯
160
+ `.trim(),
161
+ action: "complete",
162
+ estimatedDuration: 15,
163
+ },
164
+ ],
165
+ };
166
+
167
+ /**
168
+ * Get the tools lesson
169
+ */
170
+ export function getToolsLesson(): Lesson {
171
+ return toolsLesson;
172
+ }