@aria-cli/cli 1.0.49 → 1.0.51

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 (319) hide show
  1. package/bin/aria.mjs +2 -2
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/attached-local-control-client.js +826 -0
  4. package/dist/bootstrap-local-control-client.js +2 -0
  5. package/dist/capability-aware-method-proxy.js +42 -0
  6. package/dist/cli-context.js +160 -0
  7. package/dist/commands/arions.js +174 -0
  8. package/dist/commands/auth.js +123 -0
  9. package/dist/commands/daemon.js +245 -0
  10. package/dist/commands/definitions.js +176 -0
  11. package/dist/commands/index.js +74 -0
  12. package/dist/commands/login-handler.js +1108 -0
  13. package/dist/commands/logout-handler.js +92 -0
  14. package/dist/commands/memory-handlers.js +89 -0
  15. package/dist/commands/pairing.js +60 -0
  16. package/dist/commands/runtime-cutover-reset-command.js +12 -0
  17. package/dist/commands/runtime-cutover-reset.js +265 -0
  18. package/dist/commands/terminal-setup.js +84 -0
  19. package/dist/config/aria-config.js +238 -0
  20. package/dist/config/index.js +3 -0
  21. package/dist/config/loader.js +97 -0
  22. package/dist/config.js +142 -0
  23. package/dist/daemon-info.js +10 -0
  24. package/dist/ensure-daemon.js +128 -0
  25. package/dist/entrypoints/command-mode.js +5 -0
  26. package/dist/entrypoints/daemon.js +50 -0
  27. package/dist/entrypoints/headless-stdio.js +25 -0
  28. package/dist/entrypoints/interactive.js +80 -0
  29. package/dist/event-loop-watchdog.js +73 -0
  30. package/dist/headless/auth-orchestrator.js +508 -0
  31. package/dist/headless/auth-service.js +43 -0
  32. package/dist/headless/bootstrap-fast-path.js +112 -0
  33. package/dist/headless/call-command.js +143 -0
  34. package/dist/headless/daemon-service.js +318 -0
  35. package/dist/headless/hook-actions.js +235 -0
  36. package/dist/headless/hook-service.js +42 -0
  37. package/dist/headless/kernel-services.js +216 -0
  38. package/dist/headless/kernel.js +785 -0
  39. package/dist/headless/operations/arion.js +119 -0
  40. package/dist/headless/operations/auth.js +45 -0
  41. package/dist/headless/operations/client.js +31 -0
  42. package/dist/headless/operations/config.js +69 -0
  43. package/dist/headless/operations/daemon.js +47 -0
  44. package/dist/headless/operations/hook.js +56 -0
  45. package/dist/headless/operations/index.js +11 -0
  46. package/dist/headless/operations/memory.js +102 -0
  47. package/dist/headless/operations/message.js +279 -0
  48. package/dist/headless/operations/model.js +100 -0
  49. package/dist/headless/operations/peer.js +56 -0
  50. package/dist/headless/operations/run.js +24 -0
  51. package/dist/headless/operations/session.js +90 -0
  52. package/dist/headless/operations/system.js +19 -0
  53. package/dist/headless/operations/utils.js +35 -0
  54. package/dist/headless/run-orchestrator.js +703 -0
  55. package/dist/headless/stdio-server.js +439 -0
  56. package/dist/history/SessionHistory.js +8 -0
  57. package/dist/history/SessionHistoryClient.js +186 -0
  58. package/dist/history/conversation-message.js +112 -0
  59. package/dist/history/index.js +8 -0
  60. package/dist/history/jsonl-replay.js +154 -0
  61. package/dist/history/repair-tool-pairing.js +84 -0
  62. package/dist/history/stall-phase-bridge.js +11 -0
  63. package/dist/history/turn-accumulator.js +427 -0
  64. package/dist/index.js +7 -0
  65. package/dist/ink-repl.js +4183 -0
  66. package/dist/local-control-bootstrap.js +26 -0
  67. package/dist/local-control-client.js +2 -0
  68. package/dist/local-control-error-reporting.js +34 -0
  69. package/dist/local-control-http-client.js +362 -0
  70. package/dist/local-control-lazy-wrapper.js +363 -0
  71. package/dist/local-control-manager.js +146 -0
  72. package/dist/main.js +38 -0
  73. package/dist/network-security.js +62 -0
  74. package/dist/networking-server.js +38 -0
  75. package/dist/peer-identity.js +23 -0
  76. package/dist/polling-subscription.js +34 -0
  77. package/dist/relaunch.js +588 -0
  78. package/dist/release-notes.js +35 -0
  79. package/dist/repl-cleanup.js +47 -0
  80. package/dist/runtime/configure-bun-sqlite.js +3 -0
  81. package/dist/runtime/crash-handlers.js +111 -0
  82. package/dist/runtime/interactive-invocation.js +39 -0
  83. package/dist/runtime/internal-mode.js +14 -0
  84. package/dist/runtime/launch-spec.js +64 -0
  85. package/dist/runtime/owner-lease.js +44 -0
  86. package/dist/runtime/public-mode.js +20 -0
  87. package/dist/runtime/run-internal-mode.js +18 -0
  88. package/dist/runtime/runtime-kind.js +32 -0
  89. package/dist/runtime/spawn-aria.js +38 -0
  90. package/dist/selectable-client.js +2 -0
  91. package/dist/selectable-peer.js +2 -0
  92. package/dist/session.js +203 -0
  93. package/dist/slash-commands.js +80 -0
  94. package/dist/sounds.js +210 -0
  95. package/dist/ui/App.js +526 -0
  96. package/dist/ui/components/AnthropicMethodPicker.js +6 -0
  97. package/dist/ui/components/ArionPrompt.js +15 -0
  98. package/dist/ui/components/AutocompleteDropdown.js +23 -0
  99. package/dist/ui/components/AutonomySelector.js +55 -0
  100. package/dist/ui/components/Banner.js +98 -0
  101. package/dist/ui/components/ConversationHistory.js +175 -0
  102. package/dist/ui/components/CopilotDeviceLoginFlow.js +88 -0
  103. package/dist/ui/components/CopilotSourcePicker.js +50 -0
  104. package/dist/ui/components/Cost.js +10 -0
  105. package/dist/ui/components/CustomSelect/option-map.js +30 -0
  106. package/dist/ui/components/CustomSelect/select-option.js +13 -0
  107. package/dist/ui/components/CustomSelect/select.js +42 -0
  108. package/dist/ui/components/CustomSelect/use-select-state.js +179 -0
  109. package/dist/ui/components/CustomSelect/use-select.js +15 -0
  110. package/dist/ui/components/ErrorDisplay.js +35 -0
  111. package/dist/ui/components/FallbackToolUseRejectedMessage.js +7 -0
  112. package/dist/ui/components/FileEditToolUpdatedMessage.js +57 -0
  113. package/dist/ui/components/HandoffMarker.js +18 -0
  114. package/dist/ui/components/HighlightedCode.js +21 -0
  115. package/dist/ui/components/InputArea.js +187 -0
  116. package/dist/ui/components/Message.js +25 -0
  117. package/dist/ui/components/OAuthLoginFlow.js +113 -0
  118. package/dist/ui/components/OutputTruncation.js +35 -0
  119. package/dist/ui/components/PermissionPrompt.js +79 -0
  120. package/dist/ui/components/PipelineTimingPanel.js +15 -0
  121. package/dist/ui/components/ProviderMethodPicker.js +61 -0
  122. package/dist/ui/components/ProviderPicker.js +63 -0
  123. package/dist/ui/components/RenderItemView.js +71 -0
  124. package/dist/ui/components/Spinner.js +46 -0
  125. package/dist/ui/components/StatusBar.js +95 -0
  126. package/dist/ui/components/StreamingIndicator.js +55 -0
  127. package/dist/ui/components/StructuredDiff.js +168 -0
  128. package/dist/ui/components/TextInputOverlay.js +43 -0
  129. package/dist/ui/components/ThinkingBlock.js +82 -0
  130. package/dist/ui/components/ToolCost.js +17 -0
  131. package/dist/ui/components/ToolExecution.js +61 -0
  132. package/dist/ui/components/ToolHeader.js +51 -0
  133. package/dist/ui/components/ToolRenderLayoutContext.js +14 -0
  134. package/dist/ui/components/ToolResultWrapper.js +6 -0
  135. package/dist/ui/components/ToolUseLoader.js +35 -0
  136. package/dist/ui/components/TraceWaterfall.js +91 -0
  137. package/dist/ui/components/index.js +33 -0
  138. package/dist/ui/components/messages/AssistantTextMessage.js +25 -0
  139. package/dist/ui/components/messages/UserImageMessage.js +12 -0
  140. package/dist/ui/components/messages/UserTextMessage.js +12 -0
  141. package/dist/ui/components/overlays/ArionSelector.js +68 -0
  142. package/dist/ui/components/overlays/ClientSelector.js +62 -0
  143. package/dist/ui/components/overlays/CommandPalette.js +67 -0
  144. package/dist/ui/components/overlays/DaemonControl.js +87 -0
  145. package/dist/ui/components/overlays/InviteShareOverlay.js +15 -0
  146. package/dist/ui/components/overlays/JoinInviteOverlay.js +32 -0
  147. package/dist/ui/components/overlays/MemoryBrowser.js +100 -0
  148. package/dist/ui/components/overlays/MessageSelector.js +123 -0
  149. package/dist/ui/components/overlays/ModelSelector.js +211 -0
  150. package/dist/ui/components/overlays/PairRequestOverlay.js +42 -0
  151. package/dist/ui/components/overlays/PeerSelector.js +84 -0
  152. package/dist/ui/components/overlays/SessionSelector.js +102 -0
  153. package/dist/ui/components/overlays/SoundSelector.js +86 -0
  154. package/dist/ui/components/overlays/ThemeSelector.js +139 -0
  155. package/dist/ui/components/overlays/index.js +15 -0
  156. package/dist/ui/components/permissions/BashPermissionRequest/BashPermissionRequest.js +53 -0
  157. package/dist/ui/components/permissions/FallbackPermissionRequest.js +56 -0
  158. package/dist/ui/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.js +76 -0
  159. package/dist/ui/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js +18 -0
  160. package/dist/ui/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.js +64 -0
  161. package/dist/ui/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js +26 -0
  162. package/dist/ui/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +141 -0
  163. package/dist/ui/components/permissions/PermissionRequest.js +70 -0
  164. package/dist/ui/components/permissions/PermissionRequestTitle.js +41 -0
  165. package/dist/ui/components/permissions/hooks.js +10 -0
  166. package/dist/ui/components/permissions/toolUseOptions.js +68 -0
  167. package/dist/ui/components/permissions/utils.js +10 -0
  168. package/dist/ui/components/text-input/Cursor.js +326 -0
  169. package/dist/ui/components/text-input/TextInput.js +231 -0
  170. package/dist/ui/components/text-input/imagePaste.js +28 -0
  171. package/dist/ui/components/text-input/index.js +6 -0
  172. package/dist/ui/components/text-input/useDoublePress.js +30 -0
  173. package/dist/ui/components/text-input/useTextInput.js +245 -0
  174. package/dist/ui/components/tool-types.js +9 -0
  175. package/dist/ui/constants/figures.js +4 -0
  176. package/dist/ui/constants/index.js +3 -0
  177. package/dist/ui/display-mode.js +93 -0
  178. package/dist/ui/display-policy.js +19 -0
  179. package/dist/ui/hooks/index.js +6 -0
  180. package/dist/ui/hooks/useCommandAutocomplete.js +93 -0
  181. package/dist/ui/hooks/useDoublePress.js +37 -0
  182. package/dist/ui/hooks/useIndicatorState.js +55 -0
  183. package/dist/ui/hooks/useInterval.js +23 -0
  184. package/dist/ui/hooks/useKeyboardShortcuts.js +127 -0
  185. package/dist/ui/hooks/useTerminalSize.js +55 -0
  186. package/dist/ui/hooks/useUnifiedMessages.js +117 -0
  187. package/dist/ui/indicator-state.js +44 -0
  188. package/dist/ui/markdown/highlight.js +44 -0
  189. package/dist/ui/markdown/index.js +1460 -0
  190. package/dist/ui/markdown/tokenizer.js +24 -0
  191. package/dist/ui/render-item.js +5 -0
  192. package/dist/ui/screens/REPL.js +119 -0
  193. package/dist/ui/screens/approval-lifecycle.js +38 -0
  194. package/dist/ui/status-line.js +72 -0
  195. package/dist/ui/theme/index.js +51 -0
  196. package/dist/ui/theme/themes/claude-dark-daltonized.js +51 -0
  197. package/dist/ui/theme/themes/claude-dark.js +50 -0
  198. package/dist/ui/theme/themes/claude-light-daltonized.js +51 -0
  199. package/dist/ui/theme/themes/claude-light.js +50 -0
  200. package/dist/ui/theme/themes/dark-accessible.js +18 -0
  201. package/dist/ui/theme/themes/dark.js +49 -0
  202. package/dist/ui/theme/themes/light-accessible.js +18 -0
  203. package/dist/ui/theme/themes/light.js +49 -0
  204. package/dist/ui/theme/types.js +3 -0
  205. package/dist/ui/theme.js +142 -0
  206. package/dist/ui/to-render-items.js +145 -0
  207. package/dist/ui/tools/AgentTool/index.js +30 -0
  208. package/dist/ui/tools/ArchitectTool/index.js +31 -0
  209. package/dist/ui/tools/AskUserTool/index.js +46 -0
  210. package/dist/ui/tools/BashTool/BashToolResultMessage.js +11 -0
  211. package/dist/ui/tools/BashTool/OutputLine.js +21 -0
  212. package/dist/ui/tools/BashTool/index.js +91 -0
  213. package/dist/ui/tools/BrowseTool/index.js +43 -0
  214. package/dist/ui/tools/BrowserTool/index.js +47 -0
  215. package/dist/ui/tools/CbmTool/index.js +188 -0
  216. package/dist/ui/tools/CheckDelegationTool/index.js +46 -0
  217. package/dist/ui/tools/CheckMessagesTool/index.js +85 -0
  218. package/dist/ui/tools/CreateQuipTool/index.js +30 -0
  219. package/dist/ui/tools/CreateSkillTool/index.js +22 -0
  220. package/dist/ui/tools/CreateToolTool/index.js +31 -0
  221. package/dist/ui/tools/DelegateRemoteTool/index.js +42 -0
  222. package/dist/ui/tools/DeployTool/index.js +47 -0
  223. package/dist/ui/tools/FffTool/index.js +103 -0
  224. package/dist/ui/tools/FileEditTool/index.js +67 -0
  225. package/dist/ui/tools/FileReadTool/index.js +68 -0
  226. package/dist/ui/tools/FileWriteTool/index.js +61 -0
  227. package/dist/ui/tools/ForkTool/index.js +47 -0
  228. package/dist/ui/tools/FrgTool/index.js +96 -0
  229. package/dist/ui/tools/GetThreadTool/index.js +39 -0
  230. package/dist/ui/tools/GlobTool/index.js +50 -0
  231. package/dist/ui/tools/GrepTool/index.js +84 -0
  232. package/dist/ui/tools/HatchArionTool/index.js +36 -0
  233. package/dist/ui/tools/LearnSkillTool/index.js +22 -0
  234. package/dist/ui/tools/LearnTool/index.js +43 -0
  235. package/dist/ui/tools/LearnToolTool/index.js +22 -0
  236. package/dist/ui/tools/ListClientsTool/index.js +39 -0
  237. package/dist/ui/tools/LspTool/index.js +261 -0
  238. package/dist/ui/tools/MCPTool/index.js +33 -0
  239. package/dist/ui/tools/ManageNetworkTool/index.js +53 -0
  240. package/dist/ui/tools/MemoryReadTool/index.js +64 -0
  241. package/dist/ui/tools/MemoryWriteTool/index.js +20 -0
  242. package/dist/ui/tools/NotebookEditTool/index.js +33 -0
  243. package/dist/ui/tools/NotebookReadTool/index.js +25 -0
  244. package/dist/ui/tools/OutlookReadTool/index.js +66 -0
  245. package/dist/ui/tools/OutlookReplyTool/index.js +49 -0
  246. package/dist/ui/tools/OutlookSendTool/index.js +49 -0
  247. package/dist/ui/tools/PauseDelegationTool/index.js +35 -0
  248. package/dist/ui/tools/ProbeTool/index.js +121 -0
  249. package/dist/ui/tools/ProcessTool/index.js +66 -0
  250. package/dist/ui/tools/QuestListTool/index.js +46 -0
  251. package/dist/ui/tools/QuestReportTool/index.js +49 -0
  252. package/dist/ui/tools/QuestUpdateTool/index.js +87 -0
  253. package/dist/ui/tools/QuipCommentTool/index.js +69 -0
  254. package/dist/ui/tools/QuipReadTool/index.js +71 -0
  255. package/dist/ui/tools/RestArionTool/index.js +32 -0
  256. package/dist/ui/tools/RestartTool/index.js +35 -0
  257. package/dist/ui/tools/ResumeDelegationTool/index.js +35 -0
  258. package/dist/ui/tools/RetireArionTool/index.js +32 -0
  259. package/dist/ui/tools/RgTool/index.js +73 -0
  260. package/dist/ui/tools/SearchKnowledgeTool/index.js +43 -0
  261. package/dist/ui/tools/SearchMessagesTool/index.js +43 -0
  262. package/dist/ui/tools/SelfDiagnoseTool/index.js +61 -0
  263. package/dist/ui/tools/SendMessageTool/index.js +45 -0
  264. package/dist/ui/tools/SerenaTool/index.js +124 -0
  265. package/dist/ui/tools/SessionHistoryTool/index.js +52 -0
  266. package/dist/ui/tools/SgTool/index.js +80 -0
  267. package/dist/ui/tools/SlackReactTool/index.js +41 -0
  268. package/dist/ui/tools/SlackReadTool/index.js +48 -0
  269. package/dist/ui/tools/SlackSendTool/index.js +45 -0
  270. package/dist/ui/tools/SpawnWorkerTool/index.js +33 -0
  271. package/dist/ui/tools/StickerRequestTool/index.js +19 -0
  272. package/dist/ui/tools/ThinkTool/index.js +17 -0
  273. package/dist/ui/tools/UgTool/index.js +108 -0
  274. package/dist/ui/tools/UseSkillTool/index.js +22 -0
  275. package/dist/ui/tools/WakeArionTool/index.js +32 -0
  276. package/dist/ui/tools/WebFetchTool/index.js +56 -0
  277. package/dist/ui/tools/WebSearchTool/index.js +44 -0
  278. package/dist/ui/tools/lsTool/index.js +58 -0
  279. package/dist/ui/tools/registry.js +197 -0
  280. package/dist/ui/tools/tool-renderer.js +11 -0
  281. package/dist/ui/tools/truncation.js +35 -0
  282. package/dist/ui/types/anthropic.js +4 -0
  283. package/dist/ui/types/index.js +2 -0
  284. package/dist/ui/types/message.js +3 -0
  285. package/dist/ui/types/tool.js +4 -0
  286. package/dist/ui/utils/array.js +4 -0
  287. package/dist/ui/utils/cursor.js +131 -0
  288. package/dist/ui/utils/diff.js +120 -0
  289. package/dist/ui/utils/format.js +42 -0
  290. package/dist/ui/utils/fuzzy.js +59 -0
  291. package/dist/ui/utils/index.js +11 -0
  292. package/dist/ui/utils/keys.js +8 -0
  293. package/dist/ui/utils/patch.js +17 -0
  294. package/dist/ui/utils/risk.js +114 -0
  295. package/dist/ui/utils/terminal-image.js +70 -0
  296. package/dist/ui/utils/validation.js +48 -0
  297. package/dist/ui/verb-pairs.js +248 -0
  298. package/dist/ui.js +131 -0
  299. package/package.json +73 -14
  300. package/src/entrypoints/command-mode.ts +5 -0
  301. package/src/entrypoints/daemon.ts +54 -0
  302. package/src/entrypoints/headless-stdio.ts +27 -0
  303. package/src/entrypoints/interactive.ts +112 -0
  304. package/src/main.ts +44 -0
  305. package/src/runtime/configure-bun-sqlite.ts +3 -0
  306. package/src/runtime/crash-handlers.ts +128 -0
  307. package/src/runtime/interactive-invocation.test.ts +42 -0
  308. package/src/runtime/interactive-invocation.ts +51 -0
  309. package/src/runtime/internal-mode.test.ts +19 -0
  310. package/src/runtime/internal-mode.ts +24 -0
  311. package/src/runtime/launch-spec.test.ts +26 -0
  312. package/src/runtime/launch-spec.ts +84 -0
  313. package/src/runtime/owner-lease.ts +52 -0
  314. package/src/runtime/public-mode.test.ts +18 -0
  315. package/src/runtime/public-mode.ts +19 -0
  316. package/src/runtime/run-internal-mode.ts +19 -0
  317. package/src/runtime/runtime-kind.test.ts +23 -0
  318. package/src/runtime/runtime-kind.ts +41 -0
  319. package/src/runtime/spawn-aria.ts +62 -0
@@ -0,0 +1,114 @@
1
+ // packages/cli/src/ui/utils/risk.ts
2
+ export function assessToolRisk(toolName, args) {
3
+ const reasons = [];
4
+ let score = 30; // Base score (moderate)
5
+ // Tool-specific risk assessment
6
+ switch (toolName.toLowerCase()) {
7
+ case "fileread":
8
+ case "glob":
9
+ case "grep":
10
+ case "ls":
11
+ case "read":
12
+ score = 10; // Low risk - read-only
13
+ break;
14
+ case "fileedit":
15
+ case "edit":
16
+ score = 40; // Moderate - modifies existing files
17
+ reasons.push("Modifies existing file");
18
+ break;
19
+ case "filewrite":
20
+ case "write":
21
+ score = 50; // Moderate-high - creates/overwrites files
22
+ reasons.push("Creates or overwrites file");
23
+ break;
24
+ case "bash":
25
+ score = assessBashRisk(typeof args.command === "string" ? args.command : undefined, reasons);
26
+ break;
27
+ default:
28
+ score = 50; // Unknown tools default to moderate-high
29
+ reasons.push("Unknown tool type");
30
+ }
31
+ // Determine level from score
32
+ let level;
33
+ if (score < 30) {
34
+ level = "low";
35
+ }
36
+ else if (score < 70) {
37
+ level = "moderate";
38
+ }
39
+ else {
40
+ level = "high";
41
+ }
42
+ return { level, score, reasons };
43
+ }
44
+ function assessBashRisk(command, reasons) {
45
+ if (!command)
46
+ return 50;
47
+ const cmd = command.toLowerCase();
48
+ let score = 40;
49
+ // High-risk patterns
50
+ const highRiskPatterns = [
51
+ { pattern: /\brm\s+-(rf|fr|r\b)|\brm\s+--recursive/, reason: "Recursive delete command" },
52
+ { pattern: /\bsudo\b/, reason: "Elevated privileges" },
53
+ { pattern: /\bchmod\b.*777/, reason: "Insecure permissions" },
54
+ { pattern: /\|\s*(bash|sh|zsh)\b/, reason: "Piped to shell execution" },
55
+ { pattern: /\b(curl|wget)\b.*\|\s*(bash|sh)/, reason: "Remote script execution" },
56
+ { pattern: /\bdd\b/, reason: "Low-level disk operation" },
57
+ { pattern: /\bmkfs\b/, reason: "Filesystem creation" },
58
+ { pattern: />\s*\/dev\//, reason: "Device file write" },
59
+ { pattern: /\bchmod\s+000/, reason: "Removes all file permissions" },
60
+ { pattern: /(?:^|[;&|])\s*>/, reason: "File truncation via redirect" },
61
+ {
62
+ pattern: /\b(curl|wget)\b.*-o.*&&\s*(bash|sh|chmod)/,
63
+ reason: "Download and execute pattern",
64
+ },
65
+ ];
66
+ for (const { pattern, reason } of highRiskPatterns) {
67
+ if (pattern.test(cmd)) {
68
+ score = Math.max(score, 80);
69
+ reasons.push(reason);
70
+ }
71
+ }
72
+ // Moderate-risk patterns
73
+ const moderateRiskPatterns = [
74
+ { pattern: /\brm\b/, reason: "Delete command" },
75
+ { pattern: /\bmv\b/, reason: "Move/rename command" },
76
+ { pattern: /\bcp\b.*-r/, reason: "Recursive copy" },
77
+ { pattern: /\bnpm\s+(install|i)\b/, reason: "Package installation" },
78
+ { pattern: /\bgit\s+(push|reset|rebase)/, reason: "Git write operation" },
79
+ { pattern: /\btruncate\b/, reason: "File truncation command" },
80
+ { pattern: /\bkill\s+-9\b|\bpkill\b/, reason: "Force kill process" },
81
+ ];
82
+ for (const { pattern, reason } of moderateRiskPatterns) {
83
+ if (pattern.test(cmd) && score < 60) {
84
+ score = Math.max(score, 50);
85
+ reasons.push(reason);
86
+ }
87
+ }
88
+ // Low-risk patterns
89
+ const lowRiskPatterns = [
90
+ /\bls\b/,
91
+ /\bcat\b/,
92
+ /\bgrep\b/,
93
+ /\bfind\b/,
94
+ /\becho\b/,
95
+ /\bpwd\b/,
96
+ /\bwhoami\b/,
97
+ /\bgit\s+(status|log|diff|branch)\b/,
98
+ ];
99
+ if (lowRiskPatterns.some((p) => p.test(cmd)) && reasons.length === 0) {
100
+ score = 20;
101
+ }
102
+ return score;
103
+ }
104
+ export function getRiskColor(level, theme) {
105
+ switch (level) {
106
+ case "low":
107
+ return theme.colors.success;
108
+ case "moderate":
109
+ return theme.colors.warning;
110
+ case "high":
111
+ return theme.colors.error;
112
+ }
113
+ }
114
+ //# sourceMappingURL=risk.js.map
@@ -0,0 +1,70 @@
1
+ import { readFileSync } from "node:fs";
2
+ const IMAGE_DATA_URI_RE = /data:image\/[a-zA-Z0-9.+-]+;base64,[a-zA-Z0-9+/=\n\r]+/g;
3
+ export function isITerm2Terminal() {
4
+ return (process.env.TERM_PROGRAM ?? "").toLowerCase() === "iterm.app";
5
+ }
6
+ export function supportsInlineImages() {
7
+ return isITerm2Terminal() && Boolean(process.stdout?.isTTY);
8
+ }
9
+ export function parseImageDataUri(text) {
10
+ const trimmed = text.trim();
11
+ const match = trimmed.match(/^data:(image\/[a-zA-Z0-9.+-]+);base64,([a-zA-Z0-9+/=\n\r]+)$/);
12
+ if (!match)
13
+ return null;
14
+ const [, mimeType, base64Payload] = match;
15
+ if (!mimeType || !base64Payload)
16
+ return null;
17
+ try {
18
+ const cleanPayload = base64Payload.replace(/\s+/g, "");
19
+ const buffer = Buffer.from(cleanPayload, "base64");
20
+ if (buffer.length === 0)
21
+ return null;
22
+ return { buffer, mimeType };
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ }
28
+ export function terminalInlineImageFromDataUri(text) {
29
+ const parsed = parseImageDataUri(text);
30
+ if (!parsed)
31
+ return null;
32
+ return terminalInlineImage(parsed.buffer, parsed.mimeType);
33
+ }
34
+ export function terminalInlineImage(buffer, mimeType = "image/png") {
35
+ if (!supportsInlineImages())
36
+ return null;
37
+ const payload = buffer.toString("base64");
38
+ // iTerm2 proprietary escape sequence (OSC 1337)
39
+ //  (BEL) terminator is widely supported in iTerm2.
40
+ return `\u001b]1337;File=inline=1;preserveAspectRatio=1;size=${buffer.length};type=${mimeType}:${payload}\u0007`;
41
+ }
42
+ export function terminalInlineImageFromPath(path, mimeType = "image/png") {
43
+ try {
44
+ const buffer = readFileSync(path);
45
+ return terminalInlineImage(buffer, mimeType);
46
+ }
47
+ catch {
48
+ return null;
49
+ }
50
+ }
51
+ export function splitTextByInlineImages(text) {
52
+ const segments = [];
53
+ let lastIndex = 0;
54
+ for (const match of text.matchAll(IMAGE_DATA_URI_RE)) {
55
+ const index = match.index ?? 0;
56
+ const matched = match[0] ?? "";
57
+ if (!matched)
58
+ continue;
59
+ if (index > lastIndex) {
60
+ segments.push({ type: "text", text: text.slice(lastIndex, index) });
61
+ }
62
+ segments.push({ type: "image", dataUri: matched });
63
+ lastIndex = index + matched.length;
64
+ }
65
+ if (lastIndex < text.length) {
66
+ segments.push({ type: "text", text: text.slice(lastIndex) });
67
+ }
68
+ return segments.length > 0 ? segments : [{ type: "text", text }];
69
+ }
70
+ //# sourceMappingURL=terminal-image.js.map
@@ -0,0 +1,48 @@
1
+ // packages/cli/src/ui/utils/validation.ts
2
+ export function success() {
3
+ return { valid: true };
4
+ }
5
+ export function failure(message, suggestion) {
6
+ return { valid: false, message, suggestion };
7
+ }
8
+ export function findSimilar(input, candidates, threshold = 0.6) {
9
+ const inputLower = input.toLowerCase();
10
+ // Exact prefix match first
11
+ const prefixMatch = candidates.find((c) => c.toLowerCase().startsWith(inputLower));
12
+ if (prefixMatch)
13
+ return prefixMatch;
14
+ // Levenshtein distance for typos
15
+ let bestMatch;
16
+ let bestScore = 0;
17
+ for (const candidate of candidates) {
18
+ const score = similarity(inputLower, candidate.toLowerCase());
19
+ if (score > threshold && score > bestScore) {
20
+ bestScore = score;
21
+ bestMatch = candidate;
22
+ }
23
+ }
24
+ return bestMatch;
25
+ }
26
+ function similarity(a, b) {
27
+ if (a === b)
28
+ return 1;
29
+ if (a.length === 0 || b.length === 0)
30
+ return 0;
31
+ const matrix = [];
32
+ for (let i = 0; i <= a.length; i++) {
33
+ matrix[i] = [i];
34
+ }
35
+ for (let j = 0; j <= b.length; j++) {
36
+ matrix[0][j] = j;
37
+ }
38
+ for (let i = 1; i <= a.length; i++) {
39
+ for (let j = 1; j <= b.length; j++) {
40
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
41
+ matrix[i][j] = Math.min(matrix[i - 1][j] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j - 1] + cost);
42
+ }
43
+ }
44
+ const distance = matrix[a.length][b.length];
45
+ const maxLen = Math.max(a.length, b.length);
46
+ return 1 - distance / maxLen;
47
+ }
48
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1,248 @@
1
+ // Shared verb pairs for thinking indicator and thinking block.
2
+ // Present tense shown in StreamingIndicator, past tense in ThinkingBlock.
3
+ export const VERB_PAIRS = [
4
+ // ── General ──────────────────────────────────────────────────────────
5
+ { present: "Accomplishing", past: "Accomplished" },
6
+ { present: "Actioning", past: "Actioned" },
7
+ { present: "Actualizing", past: "Actualized" },
8
+ { present: "Absquatulating", past: "Absquatulated" }, // archaic: departing abruptly
9
+ { present: "Brewing", past: "Brewed" },
10
+ { present: "Calculating", past: "Calculated" },
11
+ { present: "Cerebrating", past: "Cerebrated" },
12
+ { present: "Churning", past: "Churned" },
13
+ { present: "Coalescing", past: "Coalesced" },
14
+ { present: "Cogitating", past: "Cogitated" },
15
+ { present: "Conjuring", past: "Conjured" },
16
+ { present: "Considering", past: "Considered" },
17
+ { present: "Contemplating", past: "Contemplated" },
18
+ { present: "Cooking", past: "Cooked" },
19
+ { present: "Crafting", past: "Crafted" },
20
+ { present: "Crunching", past: "Crunched" },
21
+ { present: "Deliberating", past: "Deliberated" },
22
+ { present: "Determining", past: "Determined" },
23
+ { present: "Dillydallying", past: "Dillydallied" },
24
+ { present: "Discombobulating", past: "Discombobulated" },
25
+ { present: "Doing", past: "Done" },
26
+ { present: "Effecting", past: "Effected" },
27
+ { present: "Fizzwizzling", past: "Fizzwizzled" }, // Roald Dahl energy
28
+ { present: "Forging", past: "Forged" },
29
+ { present: "Frobnicating", past: "Frobnicated" }, // hacker jargon: twiddle purposelessly
30
+ { present: "Gallivanting", past: "Gallivanted" },
31
+ { present: "Generating", past: "Generated" },
32
+ { present: "Hatching", past: "Hatched" },
33
+ { present: "Herding", past: "Herded" },
34
+ { present: "Honking", past: "Honked" },
35
+ { present: "Ideating", past: "Ideated" },
36
+ { present: "Inferring", past: "Inferred" },
37
+ { present: "Lollygagging", past: "Lollygagged" },
38
+ { present: "Manifesting", past: "Manifested" },
39
+ { present: "Marinating", past: "Marinated" },
40
+ { present: "Moseying", past: "Moseyed" },
41
+ { present: "Mulling", past: "Mulled" },
42
+ { present: "Mustering", past: "Mustered" },
43
+ { present: "Musing", past: "Mused" },
44
+ { present: "Noodling", past: "Noodled" },
45
+ { present: "Perambulating", past: "Perambulated" }, // fancy strolling
46
+ { present: "Percolating", past: "Percolated" },
47
+ { present: "Pondering", past: "Pondered" },
48
+ { present: "Prestidigitating", past: "Prestidigitated" },
49
+ { present: "Processing", past: "Processed" },
50
+ { present: "Puttering", past: "Puttered" },
51
+ { present: "Reflecting", past: "Reflected" },
52
+ { present: "Reticulating", past: "Reticulated" },
53
+ { present: "Ruminating", past: "Ruminated" },
54
+ { present: "Schlepping", past: "Schlepped" },
55
+ { present: "Shenaniganing", past: "Shenaniganed" },
56
+ { present: "Skedaddling", past: "Skedaddled" },
57
+ { present: "Snozzwangling", past: "Snozzwangled" }, // made-up Dahl-esque nonsense
58
+ { present: "Simmering", past: "Simmered" },
59
+ { present: "Smooshing", past: "Smooshed" },
60
+ { present: "Spinning", past: "Spun" },
61
+ { present: "Stewing", past: "Stewed" },
62
+ { present: "Synthesizing", past: "Synthesized" },
63
+ { present: "Thaumaturging", past: "Thaumaturged" },
64
+ { present: "Thinking", past: "Thought" },
65
+ { present: "Transmogrifying", past: "Transmogrified" },
66
+ { present: "Transmuting", past: "Transmuted" },
67
+ { present: "Vibing", past: "Vibed" },
68
+ { present: "Weaving", past: "Woven" },
69
+ { present: "Working", past: "Worked" },
70
+ // ── ARIA / Arion 🦋 ─────────────────────────────────────────────────
71
+ { present: "Chrysalizing", past: "Chrysalized" }, // cocoon phase
72
+ { present: "Fluttering", past: "Fluttered" }, // butterfly vibes
73
+ { present: "Harmonizing", past: "Harmonized" }, // ARIA = music
74
+ { present: "Metamorphosing", past: "Metamorphosed" }, // butterfly transformation
75
+ { present: "Orchestrating", past: "Orchestrated" }, // conductor energy
76
+ // ── Pokémon ──────────────────────────────────────────────────────────
77
+ { present: "Catching", past: "Caught" }, // Gotta catch 'em all
78
+ { present: "Evolving", past: "Evolved" }, // What? ARIA is evolving!
79
+ { present: "Mega Evolving", past: "Mega Evolved" }, // beyond evolution
80
+ { present: "Summoning", past: "Summoned" }, // I choose you!
81
+ // ── Dragon Ball ──────────────────────────────────────────────────────
82
+ { present: "Charging", past: "Charged" }, // Kamehame…HAAA
83
+ { present: "Fusing", past: "Fused" }, // fu-sion-HA!
84
+ { present: "Kamehameha-ing", past: "Kamehameha'd" }, // KA-ME-HA-ME-HAAA
85
+ { present: "Powering Up", past: "Powered Up" }, // OVER 9000!!!
86
+ { present: "Spirit Bombing", past: "Spirit Bombed" }, // lend me your energy
87
+ { present: "Transcending", past: "Transcended" }, // ultra instinct
88
+ // ── One Piece ────────────────────────────────────────────────────────
89
+ { present: "Gear Shifting", past: "Gear Shifted" }, // GEAR FIFTH
90
+ { present: "Gum-Gum-ing", past: "Gum-Gum'd" }, // gomu gomu no~
91
+ { present: "Navigating", past: "Navigated" }, // to the Grand Line
92
+ { present: "Plundering", past: "Plundered" }, // pirate things
93
+ { present: "Sailing", past: "Sailed" }, // to the New World
94
+ { present: "Setting Sail", past: "Set Sail" }, // the king of pirates
95
+ // ── Gundam ───────────────────────────────────────────────────────────
96
+ { present: "Catapulting", past: "Catapulted" }, // Gundam, launching!
97
+ { present: "Mobilizing", past: "Mobilized" }, // mobile suit go
98
+ { present: "Newtypeing", past: "Newtyped" }, // awakened pilot sense
99
+ { present: "Trans-Am-ing", past: "Trans-Am'd" }, // 00 Gundam overdrive
100
+ // ── Marvel ───────────────────────────────────────────────────────────
101
+ { present: "Assembling", past: "Assembled" }, // Avengers, assemble!
102
+ { present: "Hulking", past: "Hulked" }, // ARIA smash
103
+ { present: "Snapping", past: "Snapped" }, // perfectly balanced
104
+ { present: "Vibranium-ing", past: "Vibranium'd" }, // Wakanda forever
105
+ // ── Sci-fi / Fantasy ────────────────────────────────────────────────
106
+ { present: "Alchemizing", past: "Alchemized" }, // equivalent exchange
107
+ { present: "Assimilating", past: "Assimilated" }, // resistance is futile
108
+ { present: "Astral Projecting", past: "Astral Projected" }, // out of body
109
+ { present: "Beaming", past: "Beamed" }, // beam me up
110
+ { present: "Cloaking", past: "Cloaked" }, // Romulan style
111
+ { present: "Dematerializing", past: "Dematerialized" }, // TARDIS vibes
112
+ { present: "Enchanting", past: "Enchanted" }, // +5 to wisdom
113
+ { present: "Engaging", past: "Engaged" }, // make it so
114
+ { present: "Ensorcelling", past: "Ensorcelled" }, // bewitching
115
+ { present: "Holographing", past: "Holographed" }, // help me Obi-Wan
116
+ { present: "Hyperjumping", past: "Hyperjumped" }, // punch it, Chewie
117
+ { present: "Morphing", past: "Morphed" }, // it's morphin' time
118
+ { present: "Nebulizing", past: "Nebulized" }, // dissolving into stardust
119
+ { present: "Phasing", past: "Phased" }, // passing through walls
120
+ { present: "Quantum Leaping", past: "Quantum Leapt" }, // oh boy
121
+ { present: "Shapeshifting", past: "Shapeshifted" }, // T-1000
122
+ { present: "Spellcasting", past: "Spellcast" }, // rolling a nat 20
123
+ { present: "Teleporting", past: "Teleported" }, // *blink*
124
+ { present: "Terraforming", past: "Terraformed" }, // making worlds
125
+ { present: "Time Traveling", past: "Time Traveled" }, // 1.21 gigawatts!
126
+ { present: "Time Warping", past: "Time Warped" }, // it's just a jump to the left
127
+ { present: "Transforming", past: "Transformed" }, // more than meets the eye
128
+ { present: "Warping", past: "Warped" }, // warp drive
129
+ { present: "Wormholing", past: "Wormholed" }, // bending spacetime
130
+ // ── Totally Made Up ──────────────────────────────────────────────────
131
+ { present: "Bepuzzling", past: "Bepuzzled" },
132
+ { present: "Blorbulating", past: "Blorbulated" },
133
+ { present: "Cattywampusing", past: "Cattywampused" },
134
+ { present: "Cromulating", past: "Cromulated" }, // perfectly cromulent
135
+ { present: "Discorbuflating", past: "Discorbuflated" },
136
+ { present: "Embiggenating", past: "Embiggenated" }, // a noble spirit embiggens
137
+ { present: "Flibbertigibbeting", past: "Flibbertigibbeted" },
138
+ { present: "Flonkifying", past: "Flonkified" },
139
+ { present: "Frobscottling", past: "Frobscottled" }, // BFG-tier nonsense
140
+ { present: "Glorpifying", past: "Glorpified" },
141
+ { present: "Gobsmacking", past: "Gobsmacked" },
142
+ { present: "Higgledy-piggling", past: "Higgledy-piggled" },
143
+ { present: "Kerfuffling", past: "Kerfuffled" },
144
+ { present: "Mumblewumbling", past: "Mumblewumbled" },
145
+ { present: "Phantasmagoring", past: "Phantasmagored" },
146
+ { present: "Quibberflasting", past: "Quibberflasted" },
147
+ { present: "Quorfluxing", past: "Quorfluxed" },
148
+ { present: "Rigmaroling", past: "Rigmaroled" },
149
+ { present: "Snizzleworfing", past: "Snizzleworfed" },
150
+ { present: "Snorfulating", past: "Snorfulated" },
151
+ { present: "Spatchcocking", past: "Spatchcocked" }, // real word, absurd out of context
152
+ { present: "Wibbling", past: "Wibbled" }, // Doctor Who vibes
153
+ { present: "Yoinking", past: "Yoinked" },
154
+ { present: "Zippledorping", past: "Zippledorped" },
155
+ { present: "Zorbinating", past: "Zorbinated" },
156
+ // ── Manga (general) ─────────────────────────────────────────────────
157
+ { present: "Awakening", past: "Awakened" }, // final form unlocked
158
+ { present: "Bankai-ing", past: "Bankai'd" }, // Bleach
159
+ { present: "Rasengan-ing", past: "Rasengan'd" }, // Naruto
160
+ { present: "Unleashing", past: "Unleashed" }, // hidden power
161
+ ];
162
+ export function pickRandomVerbPair() {
163
+ return VERB_PAIRS[Math.floor(Math.random() * VERB_PAIRS.length)] ?? VERB_PAIRS[0];
164
+ }
165
+ /**
166
+ * Convert a present-tense verb to past tense using the verb pairs table.
167
+ * Falls back to the input if not found.
168
+ */
169
+ export function presentToPast(present) {
170
+ const pair = VERB_PAIRS.find((p) => p.present === present);
171
+ return pair?.past ?? present;
172
+ }
173
+ // Words dropped entirely from display (file/web tools only)
174
+ const DROP_WORDS = new Set(["file", "web"]);
175
+ // Tool names that don't read well when naively title-cased.
176
+ // Maps the raw tool name to the word(s) used for display.
177
+ const TOOL_ALIASES = {
178
+ ls: "list",
179
+ rm: "remove",
180
+ cp: "copy",
181
+ mv: "move",
182
+ cd: "change_dir",
183
+ mkdir: "make_dir",
184
+ };
185
+ // Known nouns in tool names — never inflected with "-ing".
186
+ // Any word NOT in this set is treated as the verb.
187
+ const NOUNS = new Set([
188
+ "arion",
189
+ "delegation",
190
+ "knowledge",
191
+ "patch",
192
+ "processes",
193
+ "process",
194
+ "quest",
195
+ "skill",
196
+ "stdin",
197
+ "tool",
198
+ "user",
199
+ "worker",
200
+ ]);
201
+ /**
202
+ * Format a snake_case tool name for display.
203
+ * Drops "file" and "web" for brevity, title-cases the rest.
204
+ * When active=true, adds "-ing" to the verb word (first non-noun).
205
+ *
206
+ * Base: "create_skill" → "Create Skill", "read_file" → "Read", "quest_list" → "Quest List"
207
+ * Active: "create_skill" → "Creating Skill", "read_file" → "Reading", "quest_list" → "Quest Listing"
208
+ */
209
+ export function toolDisplayName(toolName, active = false) {
210
+ const canonical = TOOL_ALIASES[toolName] ?? toolName;
211
+ const words = canonical.split("_").filter((w) => !DROP_WORDS.has(w.toLowerCase()));
212
+ if (words.length === 0)
213
+ return active ? addIng(canonical.toLowerCase()) : capitalize(canonical);
214
+ // Find verb index: first non-noun word; fallback to first word
215
+ const verbIdx = active ? findVerbIndex(words) : -1;
216
+ return words
217
+ .map((w, i) => (i === verbIdx ? addIng(w.toLowerCase()) : capitalize(w.toLowerCase())))
218
+ .join(" ");
219
+ }
220
+ function findVerbIndex(words) {
221
+ const idx = words.findIndex((w) => !NOUNS.has(w.toLowerCase()));
222
+ return idx >= 0 ? idx : 0;
223
+ }
224
+ // Words where the final consonant doubles before "-ing" (stressed final CVC)
225
+ const DOUBLE_FINAL = new Set([
226
+ "glob",
227
+ "grep",
228
+ "run",
229
+ "get",
230
+ "set",
231
+ "put",
232
+ "stop",
233
+ "spin",
234
+ "forget",
235
+ ]);
236
+ function addIng(lower) {
237
+ if (lower.endsWith("e") && lower.length > 2) {
238
+ return capitalize(lower.slice(0, -1)) + "ing";
239
+ }
240
+ if (DOUBLE_FINAL.has(lower)) {
241
+ return capitalize(lower) + lower[lower.length - 1] + "ing";
242
+ }
243
+ return capitalize(lower) + "ing";
244
+ }
245
+ function capitalize(s) {
246
+ return s.charAt(0).toUpperCase() + s.slice(1);
247
+ }
248
+ //# sourceMappingURL=verb-pairs.js.map
package/dist/ui.js ADDED
@@ -0,0 +1,131 @@
1
+ /**
2
+ * ARIA CLI UI Components
3
+ * Polished terminal UI with colors, spinners, and system messages
4
+ */
5
+ // ANSI color codes
6
+ export const colors = {
7
+ reset: "\x1b[0m",
8
+ bold: "\x1b[1m",
9
+ dim: "\x1b[2m",
10
+ cyan: "\x1b[36m",
11
+ magenta: "\x1b[35m",
12
+ green: "\x1b[32m",
13
+ yellow: "\x1b[33m",
14
+ red: "\x1b[31m",
15
+ blue: "\x1b[34m",
16
+ white: "\x1b[37m",
17
+ gray: "\x1b[90m",
18
+ };
19
+ // Cursor control
20
+ export const cursor = {
21
+ hide: "\x1b[?25l",
22
+ show: "\x1b[?25h",
23
+ clearLine: "\x1b[2K",
24
+ moveUp: (n) => `\x1b[${n}A`,
25
+ moveDown: (n) => `\x1b[${n}B`,
26
+ moveToColumn: (n) => `\x1b[${n}G`,
27
+ };
28
+ // Box drawing characters
29
+ const box = {
30
+ topLeft: "┌",
31
+ bottomLeft: "└",
32
+ vertical: "│",
33
+ };
34
+ /**
35
+ * Animated spinner with label
36
+ */
37
+ export class Spinner {
38
+ interval = null;
39
+ frame = 0;
40
+ frames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
41
+ label;
42
+ labelColor;
43
+ lineCount = 1;
44
+ minimal;
45
+ constructor(label = "", labelColor = colors.yellow, minimal = false) {
46
+ this.label = label;
47
+ this.labelColor = labelColor;
48
+ this.minimal = minimal;
49
+ }
50
+ start() {
51
+ process.stdout.write(cursor.hide);
52
+ if (this.minimal) {
53
+ // Minimal mode: just the spinner, no prefix
54
+ this.interval = setInterval(() => {
55
+ process.stdout.write(`\r${colors.cyan}${this.frames[this.frame++ % this.frames.length]}${colors.reset}`);
56
+ }, 80);
57
+ }
58
+ else {
59
+ const prefix = `${colors.magenta}ARIA${colors.reset} ${colors.dim}${box.topLeft}${colors.reset} `;
60
+ const labelText = this.label ? `${this.labelColor}${this.label}${colors.reset} ` : "";
61
+ this.interval = setInterval(() => {
62
+ process.stdout.write(`\r${prefix}${labelText}${colors.cyan}${this.frames[this.frame++ % this.frames.length]}${colors.reset}`);
63
+ }, 80);
64
+ }
65
+ }
66
+ stop() {
67
+ if (this.interval) {
68
+ clearInterval(this.interval);
69
+ this.interval = null;
70
+ }
71
+ process.stdout.write("\r" + cursor.clearLine);
72
+ process.stdout.write(cursor.show);
73
+ }
74
+ /** Get number of lines this spinner occupies */
75
+ getLineCount() {
76
+ return this.lineCount;
77
+ }
78
+ }
79
+ /**
80
+ * System message box for displaying status and results
81
+ */
82
+ export class SystemMessage {
83
+ /**
84
+ * Display a boxed message with header and content lines
85
+ */
86
+ static show(options) {
87
+ const { header, headerColor, content = [], contentColor = `${colors.dim}${colors.gray}`, } = options;
88
+ const prefix = `${colors.magenta}ARIA${colors.reset}`;
89
+ const dimBorder = `${colors.dim}${colors.gray}`;
90
+ // Header line
91
+ console.log(`${prefix} ${dimBorder}${box.topLeft}${colors.reset} ${headerColor}${header}${colors.reset}`);
92
+ // Content lines
93
+ for (let i = 0; i < content.length; i++) {
94
+ const borderChar = i === content.length - 1 ? box.bottomLeft : box.vertical;
95
+ console.log(` ${dimBorder}${borderChar}${colors.reset} ${contentColor}${content[i]}${colors.reset}`);
96
+ }
97
+ return 1 + content.length; // Return line count
98
+ }
99
+ /**
100
+ * Show "remembered" message with learned memories
101
+ */
102
+ static showRemembered(memories) {
103
+ if (memories.length === 0)
104
+ return;
105
+ SystemMessage.show({
106
+ header: "remembered",
107
+ headerColor: colors.green,
108
+ content: memories.map((m) => m.content),
109
+ });
110
+ }
111
+ /**
112
+ * Show error message
113
+ */
114
+ static showError(message) {
115
+ SystemMessage.show({
116
+ header: `⚠ error`,
117
+ headerColor: colors.red,
118
+ content: [message],
119
+ });
120
+ }
121
+ }
122
+ /**
123
+ * Format the user prompt
124
+ */
125
+ export function formatPrompt(userName) {
126
+ if (userName) {
127
+ return `${colors.cyan}${userName}${colors.reset} `;
128
+ }
129
+ return `${colors.cyan}>${colors.reset} `;
130
+ }
131
+ //# sourceMappingURL=ui.js.map