@aria-cli/cli 1.0.57 → 1.0.58

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/package.json +17 -76
  3. package/dist/.tsbuildinfo +0 -1
  4. package/dist/attached-local-control-client.js +0 -826
  5. package/dist/bootstrap-local-control-client.js +0 -2
  6. package/dist/capability-aware-method-proxy.js +0 -42
  7. package/dist/cli-context.js +0 -160
  8. package/dist/commands/arions.js +0 -174
  9. package/dist/commands/auth.js +0 -123
  10. package/dist/commands/daemon.js +0 -367
  11. package/dist/commands/definitions.js +0 -176
  12. package/dist/commands/index.js +0 -80
  13. package/dist/commands/login-handler.js +0 -1108
  14. package/dist/commands/logout-handler.js +0 -92
  15. package/dist/commands/memory-handlers.js +0 -89
  16. package/dist/commands/pairing.js +0 -60
  17. package/dist/commands/runtime-cutover-reset-command.js +0 -12
  18. package/dist/commands/runtime-cutover-reset.js +0 -265
  19. package/dist/commands/terminal-setup.js +0 -84
  20. package/dist/config/aria-config.js +0 -238
  21. package/dist/config/index.js +0 -3
  22. package/dist/config/loader.js +0 -97
  23. package/dist/config.js +0 -142
  24. package/dist/daemon-info.js +0 -10
  25. package/dist/ensure-daemon.js +0 -128
  26. package/dist/entrypoints/command-mode.js +0 -5
  27. package/dist/entrypoints/daemon.js +0 -50
  28. package/dist/entrypoints/headless-stdio.js +0 -25
  29. package/dist/entrypoints/interactive.js +0 -80
  30. package/dist/event-loop-watchdog.js +0 -73
  31. package/dist/headless/auth-orchestrator.js +0 -508
  32. package/dist/headless/auth-service.js +0 -43
  33. package/dist/headless/bootstrap-fast-path.js +0 -112
  34. package/dist/headless/call-command.js +0 -143
  35. package/dist/headless/daemon-service.js +0 -318
  36. package/dist/headless/hook-actions.js +0 -235
  37. package/dist/headless/hook-service.js +0 -42
  38. package/dist/headless/kernel-services.js +0 -216
  39. package/dist/headless/kernel.js +0 -785
  40. package/dist/headless/operations/arion.js +0 -119
  41. package/dist/headless/operations/auth.js +0 -45
  42. package/dist/headless/operations/client.js +0 -31
  43. package/dist/headless/operations/config.js +0 -69
  44. package/dist/headless/operations/daemon.js +0 -47
  45. package/dist/headless/operations/hook.js +0 -56
  46. package/dist/headless/operations/index.js +0 -11
  47. package/dist/headless/operations/memory.js +0 -102
  48. package/dist/headless/operations/message.js +0 -279
  49. package/dist/headless/operations/model.js +0 -100
  50. package/dist/headless/operations/peer.js +0 -56
  51. package/dist/headless/operations/run.js +0 -24
  52. package/dist/headless/operations/session.js +0 -90
  53. package/dist/headless/operations/system.js +0 -19
  54. package/dist/headless/operations/utils.js +0 -35
  55. package/dist/headless/run-orchestrator.js +0 -703
  56. package/dist/headless/stdio-server.js +0 -439
  57. package/dist/history/SessionHistory.js +0 -8
  58. package/dist/history/SessionHistoryClient.js +0 -186
  59. package/dist/history/conversation-message.js +0 -112
  60. package/dist/history/index.js +0 -8
  61. package/dist/history/jsonl-replay.js +0 -154
  62. package/dist/history/repair-tool-pairing.js +0 -84
  63. package/dist/history/stall-phase-bridge.js +0 -11
  64. package/dist/history/turn-accumulator.js +0 -427
  65. package/dist/index.js +0 -7
  66. package/dist/ink-repl.js +0 -4183
  67. package/dist/local-control-bootstrap.js +0 -26
  68. package/dist/local-control-client.js +0 -2
  69. package/dist/local-control-error-reporting.js +0 -34
  70. package/dist/local-control-http-client.js +0 -362
  71. package/dist/local-control-lazy-wrapper.js +0 -363
  72. package/dist/local-control-manager.js +0 -146
  73. package/dist/main.js +0 -62
  74. package/dist/network-security.js +0 -62
  75. package/dist/networking-server.js +0 -38
  76. package/dist/peer-identity.js +0 -23
  77. package/dist/polling-subscription.js +0 -34
  78. package/dist/relaunch.js +0 -617
  79. package/dist/release-notes.js +0 -35
  80. package/dist/repl-cleanup.js +0 -47
  81. package/dist/runtime/configure-bun-sqlite.js +0 -3
  82. package/dist/runtime/crash-handlers.js +0 -111
  83. package/dist/runtime/interactive-invocation.js +0 -39
  84. package/dist/runtime/internal-mode.js +0 -14
  85. package/dist/runtime/launch-spec.js +0 -64
  86. package/dist/runtime/owner-lease.js +0 -44
  87. package/dist/runtime/public-mode.js +0 -20
  88. package/dist/runtime/run-internal-mode.js +0 -18
  89. package/dist/runtime/runtime-kind.js +0 -32
  90. package/dist/runtime/spawn-aria.js +0 -38
  91. package/dist/selectable-client.js +0 -2
  92. package/dist/selectable-peer.js +0 -2
  93. package/dist/session.js +0 -203
  94. package/dist/slash-commands.js +0 -80
  95. package/dist/sounds.js +0 -210
  96. package/dist/ui/App.js +0 -526
  97. package/dist/ui/components/AnthropicMethodPicker.js +0 -6
  98. package/dist/ui/components/ArionPrompt.js +0 -15
  99. package/dist/ui/components/AutocompleteDropdown.js +0 -23
  100. package/dist/ui/components/AutonomySelector.js +0 -55
  101. package/dist/ui/components/Banner.js +0 -98
  102. package/dist/ui/components/ConversationHistory.js +0 -175
  103. package/dist/ui/components/CopilotDeviceLoginFlow.js +0 -88
  104. package/dist/ui/components/CopilotSourcePicker.js +0 -50
  105. package/dist/ui/components/Cost.js +0 -10
  106. package/dist/ui/components/CustomSelect/option-map.js +0 -30
  107. package/dist/ui/components/CustomSelect/select-option.js +0 -13
  108. package/dist/ui/components/CustomSelect/select.js +0 -42
  109. package/dist/ui/components/CustomSelect/use-select-state.js +0 -179
  110. package/dist/ui/components/CustomSelect/use-select.js +0 -15
  111. package/dist/ui/components/ErrorDisplay.js +0 -35
  112. package/dist/ui/components/FallbackToolUseRejectedMessage.js +0 -7
  113. package/dist/ui/components/FileEditToolUpdatedMessage.js +0 -57
  114. package/dist/ui/components/HandoffMarker.js +0 -18
  115. package/dist/ui/components/HighlightedCode.js +0 -21
  116. package/dist/ui/components/InputArea.js +0 -187
  117. package/dist/ui/components/Message.js +0 -25
  118. package/dist/ui/components/OAuthLoginFlow.js +0 -113
  119. package/dist/ui/components/OutputTruncation.js +0 -35
  120. package/dist/ui/components/PermissionPrompt.js +0 -79
  121. package/dist/ui/components/PipelineTimingPanel.js +0 -15
  122. package/dist/ui/components/ProviderMethodPicker.js +0 -61
  123. package/dist/ui/components/ProviderPicker.js +0 -63
  124. package/dist/ui/components/RenderItemView.js +0 -71
  125. package/dist/ui/components/Spinner.js +0 -46
  126. package/dist/ui/components/StatusBar.js +0 -95
  127. package/dist/ui/components/StreamingIndicator.js +0 -55
  128. package/dist/ui/components/StructuredDiff.js +0 -168
  129. package/dist/ui/components/TextInputOverlay.js +0 -43
  130. package/dist/ui/components/ThinkingBlock.js +0 -82
  131. package/dist/ui/components/ToolCost.js +0 -17
  132. package/dist/ui/components/ToolExecution.js +0 -61
  133. package/dist/ui/components/ToolHeader.js +0 -51
  134. package/dist/ui/components/ToolRenderLayoutContext.js +0 -14
  135. package/dist/ui/components/ToolResultWrapper.js +0 -6
  136. package/dist/ui/components/ToolUseLoader.js +0 -35
  137. package/dist/ui/components/TraceWaterfall.js +0 -91
  138. package/dist/ui/components/index.js +0 -33
  139. package/dist/ui/components/messages/AssistantTextMessage.js +0 -25
  140. package/dist/ui/components/messages/UserImageMessage.js +0 -12
  141. package/dist/ui/components/messages/UserTextMessage.js +0 -12
  142. package/dist/ui/components/overlays/ArionSelector.js +0 -68
  143. package/dist/ui/components/overlays/ClientSelector.js +0 -62
  144. package/dist/ui/components/overlays/CommandPalette.js +0 -67
  145. package/dist/ui/components/overlays/DaemonControl.js +0 -87
  146. package/dist/ui/components/overlays/InviteShareOverlay.js +0 -15
  147. package/dist/ui/components/overlays/JoinInviteOverlay.js +0 -32
  148. package/dist/ui/components/overlays/MemoryBrowser.js +0 -100
  149. package/dist/ui/components/overlays/MessageSelector.js +0 -123
  150. package/dist/ui/components/overlays/ModelSelector.js +0 -211
  151. package/dist/ui/components/overlays/PairRequestOverlay.js +0 -42
  152. package/dist/ui/components/overlays/PeerSelector.js +0 -84
  153. package/dist/ui/components/overlays/SessionSelector.js +0 -102
  154. package/dist/ui/components/overlays/SoundSelector.js +0 -86
  155. package/dist/ui/components/overlays/ThemeSelector.js +0 -139
  156. package/dist/ui/components/overlays/index.js +0 -15
  157. package/dist/ui/components/permissions/BashPermissionRequest/BashPermissionRequest.js +0 -53
  158. package/dist/ui/components/permissions/FallbackPermissionRequest.js +0 -56
  159. package/dist/ui/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.js +0 -76
  160. package/dist/ui/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js +0 -18
  161. package/dist/ui/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.js +0 -64
  162. package/dist/ui/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js +0 -26
  163. package/dist/ui/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +0 -141
  164. package/dist/ui/components/permissions/PermissionRequest.js +0 -70
  165. package/dist/ui/components/permissions/PermissionRequestTitle.js +0 -41
  166. package/dist/ui/components/permissions/hooks.js +0 -10
  167. package/dist/ui/components/permissions/toolUseOptions.js +0 -68
  168. package/dist/ui/components/permissions/utils.js +0 -10
  169. package/dist/ui/components/text-input/Cursor.js +0 -326
  170. package/dist/ui/components/text-input/TextInput.js +0 -231
  171. package/dist/ui/components/text-input/imagePaste.js +0 -28
  172. package/dist/ui/components/text-input/index.js +0 -6
  173. package/dist/ui/components/text-input/useDoublePress.js +0 -30
  174. package/dist/ui/components/text-input/useTextInput.js +0 -245
  175. package/dist/ui/components/tool-types.js +0 -9
  176. package/dist/ui/constants/figures.js +0 -4
  177. package/dist/ui/constants/index.js +0 -3
  178. package/dist/ui/display-mode.js +0 -93
  179. package/dist/ui/display-policy.js +0 -19
  180. package/dist/ui/hooks/index.js +0 -6
  181. package/dist/ui/hooks/useCommandAutocomplete.js +0 -93
  182. package/dist/ui/hooks/useDoublePress.js +0 -37
  183. package/dist/ui/hooks/useIndicatorState.js +0 -55
  184. package/dist/ui/hooks/useInterval.js +0 -23
  185. package/dist/ui/hooks/useKeyboardShortcuts.js +0 -127
  186. package/dist/ui/hooks/useTerminalSize.js +0 -55
  187. package/dist/ui/hooks/useUnifiedMessages.js +0 -117
  188. package/dist/ui/indicator-state.js +0 -44
  189. package/dist/ui/markdown/highlight.js +0 -44
  190. package/dist/ui/markdown/index.js +0 -1460
  191. package/dist/ui/markdown/tokenizer.js +0 -24
  192. package/dist/ui/render-item.js +0 -5
  193. package/dist/ui/screens/REPL.js +0 -119
  194. package/dist/ui/screens/approval-lifecycle.js +0 -38
  195. package/dist/ui/status-line.js +0 -72
  196. package/dist/ui/theme/index.js +0 -51
  197. package/dist/ui/theme/themes/claude-dark-daltonized.js +0 -51
  198. package/dist/ui/theme/themes/claude-dark.js +0 -50
  199. package/dist/ui/theme/themes/claude-light-daltonized.js +0 -51
  200. package/dist/ui/theme/themes/claude-light.js +0 -50
  201. package/dist/ui/theme/themes/dark-accessible.js +0 -18
  202. package/dist/ui/theme/themes/dark.js +0 -49
  203. package/dist/ui/theme/themes/light-accessible.js +0 -18
  204. package/dist/ui/theme/themes/light.js +0 -49
  205. package/dist/ui/theme/types.js +0 -3
  206. package/dist/ui/theme.js +0 -142
  207. package/dist/ui/to-render-items.js +0 -145
  208. package/dist/ui/tools/AgentTool/index.js +0 -30
  209. package/dist/ui/tools/ArchitectTool/index.js +0 -31
  210. package/dist/ui/tools/AskUserTool/index.js +0 -46
  211. package/dist/ui/tools/BashTool/BashToolResultMessage.js +0 -11
  212. package/dist/ui/tools/BashTool/OutputLine.js +0 -21
  213. package/dist/ui/tools/BashTool/index.js +0 -91
  214. package/dist/ui/tools/BrowseTool/index.js +0 -43
  215. package/dist/ui/tools/BrowserTool/index.js +0 -47
  216. package/dist/ui/tools/CbmTool/index.js +0 -188
  217. package/dist/ui/tools/CheckDelegationTool/index.js +0 -46
  218. package/dist/ui/tools/CheckMessagesTool/index.js +0 -85
  219. package/dist/ui/tools/CreateQuipTool/index.js +0 -30
  220. package/dist/ui/tools/CreateSkillTool/index.js +0 -22
  221. package/dist/ui/tools/CreateToolTool/index.js +0 -31
  222. package/dist/ui/tools/DelegateRemoteTool/index.js +0 -42
  223. package/dist/ui/tools/DeployTool/index.js +0 -47
  224. package/dist/ui/tools/FffTool/index.js +0 -103
  225. package/dist/ui/tools/FileEditTool/index.js +0 -67
  226. package/dist/ui/tools/FileReadTool/index.js +0 -68
  227. package/dist/ui/tools/FileWriteTool/index.js +0 -61
  228. package/dist/ui/tools/ForkTool/index.js +0 -47
  229. package/dist/ui/tools/FrgTool/index.js +0 -96
  230. package/dist/ui/tools/GetThreadTool/index.js +0 -39
  231. package/dist/ui/tools/GlobTool/index.js +0 -50
  232. package/dist/ui/tools/GrepTool/index.js +0 -84
  233. package/dist/ui/tools/HatchArionTool/index.js +0 -36
  234. package/dist/ui/tools/LearnSkillTool/index.js +0 -22
  235. package/dist/ui/tools/LearnTool/index.js +0 -43
  236. package/dist/ui/tools/LearnToolTool/index.js +0 -22
  237. package/dist/ui/tools/ListClientsTool/index.js +0 -39
  238. package/dist/ui/tools/LspTool/index.js +0 -261
  239. package/dist/ui/tools/MCPTool/index.js +0 -33
  240. package/dist/ui/tools/ManageNetworkTool/index.js +0 -53
  241. package/dist/ui/tools/MemoryReadTool/index.js +0 -64
  242. package/dist/ui/tools/MemoryWriteTool/index.js +0 -20
  243. package/dist/ui/tools/NotebookEditTool/index.js +0 -33
  244. package/dist/ui/tools/NotebookReadTool/index.js +0 -25
  245. package/dist/ui/tools/OutlookReadTool/index.js +0 -66
  246. package/dist/ui/tools/OutlookReplyTool/index.js +0 -49
  247. package/dist/ui/tools/OutlookSendTool/index.js +0 -49
  248. package/dist/ui/tools/PauseDelegationTool/index.js +0 -35
  249. package/dist/ui/tools/ProbeTool/index.js +0 -121
  250. package/dist/ui/tools/ProcessTool/index.js +0 -66
  251. package/dist/ui/tools/QuestListTool/index.js +0 -46
  252. package/dist/ui/tools/QuestReportTool/index.js +0 -49
  253. package/dist/ui/tools/QuestUpdateTool/index.js +0 -87
  254. package/dist/ui/tools/QuipCommentTool/index.js +0 -69
  255. package/dist/ui/tools/QuipReadTool/index.js +0 -71
  256. package/dist/ui/tools/RestArionTool/index.js +0 -32
  257. package/dist/ui/tools/RestartTool/index.js +0 -35
  258. package/dist/ui/tools/ResumeDelegationTool/index.js +0 -35
  259. package/dist/ui/tools/RetireArionTool/index.js +0 -32
  260. package/dist/ui/tools/RgTool/index.js +0 -73
  261. package/dist/ui/tools/SearchKnowledgeTool/index.js +0 -43
  262. package/dist/ui/tools/SearchMessagesTool/index.js +0 -43
  263. package/dist/ui/tools/SelfDiagnoseTool/index.js +0 -61
  264. package/dist/ui/tools/SendMessageTool/index.js +0 -45
  265. package/dist/ui/tools/SerenaTool/index.js +0 -124
  266. package/dist/ui/tools/SessionHistoryTool/index.js +0 -52
  267. package/dist/ui/tools/SgTool/index.js +0 -80
  268. package/dist/ui/tools/SlackReactTool/index.js +0 -41
  269. package/dist/ui/tools/SlackReadTool/index.js +0 -48
  270. package/dist/ui/tools/SlackSendTool/index.js +0 -45
  271. package/dist/ui/tools/SpawnWorkerTool/index.js +0 -33
  272. package/dist/ui/tools/StickerRequestTool/index.js +0 -19
  273. package/dist/ui/tools/ThinkTool/index.js +0 -17
  274. package/dist/ui/tools/UgTool/index.js +0 -108
  275. package/dist/ui/tools/UseSkillTool/index.js +0 -22
  276. package/dist/ui/tools/WakeArionTool/index.js +0 -32
  277. package/dist/ui/tools/WebFetchTool/index.js +0 -56
  278. package/dist/ui/tools/WebSearchTool/index.js +0 -44
  279. package/dist/ui/tools/lsTool/index.js +0 -58
  280. package/dist/ui/tools/registry.js +0 -197
  281. package/dist/ui/tools/tool-renderer.js +0 -11
  282. package/dist/ui/tools/truncation.js +0 -35
  283. package/dist/ui/types/anthropic.js +0 -4
  284. package/dist/ui/types/index.js +0 -2
  285. package/dist/ui/types/message.js +0 -3
  286. package/dist/ui/types/tool.js +0 -4
  287. package/dist/ui/utils/array.js +0 -4
  288. package/dist/ui/utils/cursor.js +0 -131
  289. package/dist/ui/utils/diff.js +0 -120
  290. package/dist/ui/utils/format.js +0 -42
  291. package/dist/ui/utils/fuzzy.js +0 -59
  292. package/dist/ui/utils/index.js +0 -11
  293. package/dist/ui/utils/keys.js +0 -8
  294. package/dist/ui/utils/patch.js +0 -17
  295. package/dist/ui/utils/risk.js +0 -114
  296. package/dist/ui/utils/terminal-image.js +0 -70
  297. package/dist/ui/utils/validation.js +0 -48
  298. package/dist/ui/verb-pairs.js +0 -248
  299. package/dist/ui.js +0 -131
  300. package/src/entrypoints/command-mode.ts +0 -5
  301. package/src/entrypoints/daemon.ts +0 -54
  302. package/src/entrypoints/headless-stdio.ts +0 -27
  303. package/src/entrypoints/interactive.ts +0 -112
  304. package/src/main.ts +0 -72
  305. package/src/runtime/configure-bun-sqlite.ts +0 -3
  306. package/src/runtime/crash-handlers.ts +0 -128
  307. package/src/runtime/interactive-invocation.test.ts +0 -42
  308. package/src/runtime/interactive-invocation.ts +0 -51
  309. package/src/runtime/internal-mode.test.ts +0 -19
  310. package/src/runtime/internal-mode.ts +0 -24
  311. package/src/runtime/launch-spec.test.ts +0 -26
  312. package/src/runtime/launch-spec.ts +0 -84
  313. package/src/runtime/owner-lease.ts +0 -52
  314. package/src/runtime/public-mode.test.ts +0 -18
  315. package/src/runtime/public-mode.ts +0 -19
  316. package/src/runtime/run-internal-mode.ts +0 -19
  317. package/src/runtime/runtime-kind.test.ts +0 -23
  318. package/src/runtime/runtime-kind.ts +0 -41
  319. package/src/runtime/spawn-aria.ts +0 -62
@@ -1,35 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- // BashTool/OutputLine.tsx
3
- // Substitutions:
4
- // - import { getTheme } from '../../utils/theme' → import { getTheme } from '../theme/index.js'
5
- // - import { MAX_RENDERED_LINES } from './prompt' → const MAX_RENDERED_LINES = 50
6
- // - theme.error → theme.colors.error
7
- // Compat: OutputTruncation exported for backward compat with ARIA callers
8
- // (simplified interface: content + maxLines + isError)
9
- import { Box, Text } from "ink";
10
- import { getTheme } from "../theme/index.js";
11
- import chalk from "chalk";
12
- import { capLine } from "../tools/truncation.js";
13
- const MAX_RENDERED_LINES = 3;
14
- function renderTruncatedContent(content, totalLines, maxLines = MAX_RENDERED_LINES) {
15
- const allLines = content.split("\n");
16
- if (allLines.length <= maxLines) {
17
- return allLines.map(capLine).join("\n");
18
- }
19
- return [
20
- ...allLines.slice(0, maxLines).map(capLine),
21
- chalk.grey(`... (+${totalLines - maxLines} lines)`),
22
- ].join("\n");
23
- }
24
- export function OutputLine({ content, lines, verbose, isError, }) {
25
- return (_jsx(Box, { justifyContent: "space-between", width: "100%", children: _jsxs(Box, { flexDirection: "row", children: [_jsx(Text, { children: "\u00A0\u00A0\u23BF \u00A0" }), _jsx(Box, { flexDirection: "column", children: _jsx(Text, { color: isError ? getTheme().colors.error : undefined, children: verbose ? content.trim() : renderTruncatedContent(content.trim(), lines) }) })] }) }));
26
- }
27
- /**
28
- * Backward-compat wrapper for ARIA callers that use the simplified interface.
29
- * Accepts content string + optional maxLines + isError, computes line count internally.
30
- */
31
- export function OutputTruncation({ content, maxLines = MAX_RENDERED_LINES, isError, }) {
32
- const lines = content.split("\n").length;
33
- return (_jsx(Box, { justifyContent: "space-between", width: "100%", children: _jsx(Box, { flexDirection: "row", children: _jsx(Box, { flexDirection: "column", children: _jsx(Text, { color: isError ? getTheme().colors.error : undefined, children: renderTruncatedContent(content.trim(), lines, maxLines) }) }) }) }));
34
- }
35
- //# sourceMappingURL=OutputTruncation.js.map
@@ -1,79 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- // packages/cli/src/ui/components/PermissionPrompt.tsx
3
- import { useState, useRef } from "react";
4
- import { Box, Text, useInput } from "ink";
5
- import { getTheme } from "../theme/index.js";
6
- import { CompactDiff } from "./StructuredDiff.js";
7
- import { isEscapeInput } from "../utils/keys.js";
8
- export function PermissionPrompt({ toolName, description, diff, riskLevel = "moderate", onChoice, isActive = true, }) {
9
- const theme = getTheme();
10
- const [selected, setSelected] = useState(0);
11
- const submittedRef = useRef(false);
12
- const options = [
13
- { key: "y", label: "Yes", choice: "yes" },
14
- { key: "n", label: "No", choice: "no" },
15
- { key: "a", label: "Always allow this session", choice: "always" },
16
- ];
17
- // Risk level colors
18
- const riskColors = {
19
- low: theme.colors.success,
20
- moderate: theme.colors.warning,
21
- high: theme.colors.error,
22
- };
23
- // Only use input handling when stdin supports raw mode
24
- const isRawModeSupported = process.stdin.isTTY ?? false;
25
- const submit = (choice) => {
26
- if (submittedRef.current)
27
- return;
28
- submittedRef.current = true;
29
- onChoice(choice);
30
- };
31
- useInput((input, key) => {
32
- if (submittedRef.current)
33
- return;
34
- const lowerInput = input.toLowerCase();
35
- // Direct key selection
36
- const directMatch = options.find((o) => o.key === lowerInput);
37
- if (directMatch) {
38
- submit(directMatch.choice);
39
- return;
40
- }
41
- // Arrow navigation
42
- if (key.leftArrow) {
43
- setSelected((s) => Math.max(0, s - 1));
44
- }
45
- else if (key.rightArrow) {
46
- setSelected((s) => Math.min(options.length - 1, s + 1));
47
- }
48
- else if (key.return) {
49
- submit(options[selected].choice);
50
- }
51
- else if (isEscapeInput(input, key)) {
52
- submit("no");
53
- }
54
- }, { isActive: isActive && isRawModeSupported });
55
- return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: riskColors[riskLevel], paddingX: 1, paddingY: 1, width: 60, children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { bold: true, color: riskColors[riskLevel], children: "Permission Required" }), riskLevel !== "low" && _jsxs(Text, { color: riskColors[riskLevel], children: [" \u2022 Risk: ", riskLevel] })] }), _jsx(Box, { marginBottom: 1, height: 6, overflowY: "hidden", children: _jsxs(Text, { wrap: "wrap", children: [_jsxs(Text, { bold: true, children: [theme.symbols.pending, " ", toolName] }), _jsxs(Text, { color: theme.colors.textMuted, children: [": ", description] })] }) }), diff && (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: theme.colors.secondary, paddingX: 1, marginBottom: 1, children: [_jsx(Text, { bold: true, dimColor: true, children: "Changes:" }), _jsx(CompactDiff, { diff: diff, maxLines: 8 })] })), _jsx(Box, { gap: 2, children: options.map((option, index) => (_jsxs(Text, { inverse: index === selected, color: index === selected ? theme.colors.primary : undefined, children: ["[", option.key.toUpperCase(), "] ", option.label] }, option.key))) })] }));
56
- }
57
- /**
58
- * Simple yes/no confirmation
59
- */
60
- export function ConfirmPrompt({ message, onConfirm, onCancel, }) {
61
- const theme = getTheme();
62
- const submittedRef = useRef(false);
63
- // Only use input handling when stdin supports raw mode
64
- const isRawModeSupported = process.stdin.isTTY ?? false;
65
- useInput((input, key) => {
66
- if (submittedRef.current)
67
- return;
68
- if (input.toLowerCase() === "y" || key.return) {
69
- submittedRef.current = true;
70
- onConfirm();
71
- }
72
- else if (input.toLowerCase() === "n" || isEscapeInput(input, key)) {
73
- submittedRef.current = true;
74
- onCancel();
75
- }
76
- }, { isActive: isRawModeSupported });
77
- return (_jsxs(Box, { children: [_jsxs(Text, { children: [message, " "] }), _jsx(Text, { color: theme.colors.textMuted, children: "[Y/n]" })] }));
78
- }
79
- //# sourceMappingURL=PermissionPrompt.js.map
@@ -1,15 +0,0 @@
1
- import { jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Box, Text } from "ink";
3
- import { getTheme } from "../theme/index.js";
4
- function formatMs(value) {
5
- if (value < 1000)
6
- return `${Math.round(value)}ms`;
7
- return `${(value / 1000).toFixed(2)}s`;
8
- }
9
- export function PipelineTimingPanel({ report, }) {
10
- const theme = getTheme();
11
- if (!report || report.phases.length === 0)
12
- return null;
13
- return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Text, { color: theme.colors.textMuted, children: [" Pipeline timing (", formatMs(report.totalMs), ")"] }), report.phases.map((phase) => (_jsxs(Box, { children: [_jsxs(Text, { color: theme.colors.info, children: [" ", phase.phase.padEnd(24)] }), _jsxs(Text, { color: theme.colors.text, children: [" ", formatMs(phase.durationMs)] }), _jsxs(Text, { color: theme.colors.textMuted, children: [" (", phase.pct, "%)"] })] }, `${phase.phase}:${phase.durationMs}`)))] }));
14
- }
15
- //# sourceMappingURL=PipelineTimingPanel.js.map
@@ -1,61 +0,0 @@
1
- import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
- import { useEffect, useRef, useState } from "react";
3
- import { Box, Text, useInput } from "ink";
4
- import { getTheme } from "../theme/index.js";
5
- import { isEscapeInput } from "../utils/keys.js";
6
- function StatusIndicator({ status }) {
7
- const theme = getTheme();
8
- if (status === "connected") {
9
- return _jsxs(Text, { color: theme.colors.success, children: ["\u2713", " connected"] });
10
- }
11
- if (status === "available") {
12
- return _jsxs(Text, { color: theme.colors.success, children: ["\u2713", " available"] });
13
- }
14
- return _jsx(Text, { color: theme.colors.textMuted, children: "\u00b7" });
15
- }
16
- export function ProviderMethodPicker({ options, onSelect, onCancel, title = "Select login method:", isActive = true, }) {
17
- const theme = getTheme();
18
- const [selected, setSelectedState] = useState(0);
19
- const selectedRef = useRef(0);
20
- const submittedRef = useRef(false);
21
- const isRawModeSupported = process.stdin.isTTY ?? false;
22
- // Reset state when options change — prevents stale submittedRef from a
23
- // previous interaction blocking input in the reused component instance
24
- // (React reconciles the same JSX position without remounting).
25
- useEffect(() => {
26
- submittedRef.current = false;
27
- selectedRef.current = 0;
28
- setSelectedState(0);
29
- }, [options]);
30
- const setSelected = (update) => {
31
- setSelectedState((current) => {
32
- const next = update(current);
33
- selectedRef.current = next;
34
- return next;
35
- });
36
- };
37
- useInput((input, key) => {
38
- if (submittedRef.current)
39
- return;
40
- if (key.upArrow) {
41
- setSelected((s) => Math.max(0, s - 1));
42
- }
43
- else if (key.downArrow) {
44
- setSelected((s) => Math.min(options.length - 1, s + 1));
45
- }
46
- else if (key.return) {
47
- submittedRef.current = true;
48
- onSelect(options[selectedRef.current]);
49
- }
50
- else if (isEscapeInput(input, key)) {
51
- submittedRef.current = true;
52
- onCancel();
53
- }
54
- }, { isActive: isActive && isRawModeSupported });
55
- return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.colors.secondary, paddingX: 1, paddingY: 1, width: 64, children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, children: title }) }), options.map((option, index) => {
56
- const isHovered = index === selected;
57
- const pointer = isHovered ? "\u25b8" : " ";
58
- return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: isHovered ? theme.colors.primary : undefined, children: pointer }), _jsx(Text, { color: isHovered ? theme.colors.primary : undefined, bold: isHovered, children: option.label }), _jsx(StatusIndicator, { status: option.status })] }), option.description && (_jsx(Box, { marginLeft: 3, children: _jsx(Text, { color: theme.colors.textMuted, dimColor: true, children: option.description }) }))] }, option.id));
59
- }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: theme.colors.textMuted, children: ["\u2191\u2193", " Navigate Enter Select Esc Cancel"] }) })] }));
60
- }
61
- //# sourceMappingURL=ProviderMethodPicker.js.map
@@ -1,63 +0,0 @@
1
- import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
- // packages/cli/src/ui/components/ProviderPicker.tsx
3
- import { useEffect, useState, useRef } from "react";
4
- import { Box, Text, useInput } from "ink";
5
- import { getTheme } from "../theme/index.js";
6
- import { isEscapeInput } from "../utils/keys.js";
7
- function StatusIndicator({ status }) {
8
- const theme = getTheme();
9
- switch (status) {
10
- case "connected":
11
- return _jsxs(Text, { color: theme.colors.success, children: ["\u2713", " connected"] });
12
- case "expired":
13
- return _jsxs(Text, { color: theme.colors.error, children: ["\u2717", " expired"] });
14
- case "none":
15
- return _jsxs(Text, { color: theme.colors.textMuted, children: ["\u00b7", " not connected"] });
16
- }
17
- }
18
- export function ProviderPicker({ providers, onSelect, onCancel, isActive = true, }) {
19
- const theme = getTheme();
20
- const [selected, setSelectedState] = useState(0);
21
- const selectedRef = useRef(0);
22
- const submittedRef = useRef(false);
23
- // Reset state when providers change — prevents stale submittedRef from a
24
- // previous interaction blocking input in a reused component instance.
25
- useEffect(() => {
26
- submittedRef.current = false;
27
- selectedRef.current = 0;
28
- setSelectedState(0);
29
- }, [providers]);
30
- const setSelected = (update) => {
31
- setSelectedState((current) => {
32
- const next = update(current);
33
- selectedRef.current = next;
34
- return next;
35
- });
36
- };
37
- // Only use input handling when stdin supports raw mode
38
- const isRawModeSupported = process.stdin.isTTY ?? false;
39
- useInput((input, key) => {
40
- if (submittedRef.current)
41
- return;
42
- if (key.upArrow) {
43
- setSelected((s) => Math.max(0, s - 1));
44
- }
45
- else if (key.downArrow) {
46
- setSelected((s) => Math.min(providers.length - 1, s + 1));
47
- }
48
- else if (key.return) {
49
- submittedRef.current = true;
50
- onSelect(providers[selectedRef.current]);
51
- }
52
- else if (isEscapeInput(input, key)) {
53
- submittedRef.current = true;
54
- onCancel();
55
- }
56
- }, { isActive: isActive && isRawModeSupported });
57
- return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.colors.secondary, paddingX: 1, paddingY: 1, width: 56, children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, children: "Select a provider:" }) }), providers.map((provider, index) => {
58
- const isHovered = index === selected;
59
- const pointer = isHovered ? "\u25b8" : " ";
60
- return (_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: isHovered ? theme.colors.primary : undefined, children: pointer }), _jsx(Text, { color: isHovered ? theme.colors.primary : undefined, bold: isHovered, children: provider.label.padEnd(28) }), _jsx(StatusIndicator, { status: provider.status })] }, provider.id));
61
- }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: theme.colors.textMuted, children: ["\u2191\u2193", " Navigate Enter Select Esc Cancel"] }) })] }));
62
- }
63
- //# sourceMappingURL=ProviderPicker.js.map
@@ -1,71 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- /**
3
- * Flat dispatcher for the new rendering pipeline.
4
- * Replaces MessageRouter — dispatches by RenderItem.kind instead of
5
- * DisplayMessage.type + ContentBlock.type.
6
- *
7
- * Reuses existing components: UserTextMessage, ThinkingBlock, ToolExecution.
8
- */
9
- import * as React from "react";
10
- import { Box, Text } from "ink";
11
- import wrapAnsi from "wrap-ansi";
12
- import { UserTextMessage } from "./messages/UserTextMessage.js";
13
- import { UserImageMessage } from "./messages/UserImageMessage.js";
14
- import { ThinkingBlock } from "./ThinkingBlock.js";
15
- import { ToolExecution } from "./ToolExecution.js";
16
- import { getTheme } from "../theme/index.js";
17
- import { applyMarkdown } from "../markdown/index.js";
18
- import { useTerminalSize } from "../hooks/useTerminalSize.js";
19
- export const RenderItemView = React.memo(function RenderItemView({ item, displayMode, showPrefix, previewTailLines }) {
20
- const verbose = displayMode === "debug";
21
- const { columns } = useTerminalSize();
22
- switch (item.kind) {
23
- case "user-message":
24
- return (_jsx(UserTextMessage, { param: { type: "text", text: item.text }, userName: item.userName, columns: columns, addMargin: showPrefix, showPrefix: showPrefix }));
25
- case "user-image":
26
- return (_jsx(UserImageMessage, { dataUri: item.dataUri, userName: item.userName, showPrefix: showPrefix }));
27
- case "assistant-text": {
28
- const BLACK_CIRCLE = process.platform === "darwin" ? "\u23FA" : "\u25CF";
29
- const arionColor = item.arion?.color ?? "cyan";
30
- const contentWidth = Math.max(columns - 4, 20);
31
- const rendered = applyMarkdown(item.text, {
32
- width: contentWidth,
33
- mode: item.committed ? "final" : "streaming",
34
- });
35
- const tailLines = !item.committed && previewTailLines
36
- ? Math.max(previewTailLines - (showPrefix && item.arion ? 1 : 0), 1)
37
- : undefined;
38
- const displayText = tailLines != null
39
- ? sliceRenderedTailByVisibleLines(rendered, contentWidth, tailLines)
40
- : rendered;
41
- return (_jsxs(Box, { flexDirection: "column", children: [showPrefix && item.arion && (_jsxs(Box, { flexDirection: "row", marginBottom: 1, children: [_jsxs(Text, { children: [item.arion.emoji, " "] }), _jsx(Text, { bold: true, color: arionColor, children: item.arion.name })] })), _jsxs(Box, { flexDirection: "row", children: [_jsx(Box, { minWidth: 2, children: _jsx(Text, { color: arionColor, children: BLACK_CIRCLE }) }), _jsx(Box, { flexShrink: 1, width: contentWidth, children: _jsx(Text, { children: displayText }) })] })] }));
42
- }
43
- case "thinking": {
44
- // Collapsed (standard mode): content is empty, durationSec preserved
45
- if (!item.content && item.durationSec != null) {
46
- return (_jsxs(Box, { flexDirection: "column", children: [showPrefix && item.arion && (_jsxs(Box, { flexDirection: "row", marginBottom: 1, children: [_jsxs(Text, { children: [item.arion.emoji, " "] }), _jsx(Text, { bold: true, color: item.arion.color, children: item.arion.name })] })), _jsxs(Text, { dimColor: true, children: ["\u273B", " Thought for ", item.durationSec.toFixed(1), "s"] })] }));
47
- }
48
- if (!item.content)
49
- return null;
50
- // Full thinking (debug mode) — delegate to existing ThinkingBlock
51
- return (_jsx(ThinkingBlock, { content: item.content, expanded: verbose, durationSeconds: item.durationSec, arionName: showPrefix ? item.arion?.name : undefined, arionEmoji: showPrefix ? item.arion?.emoji : undefined, arionColor: showPrefix ? item.arion?.color : undefined, isLive: !item.committed }));
52
- }
53
- case "tool-execution":
54
- return _jsx(ToolExecution, { item: item, verbose: verbose });
55
- case "error": {
56
- const theme = getTheme();
57
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: theme.colors.error, children: item.message }), item.suggestion && _jsxs(Text, { dimColor: true, children: [" Suggestion: ", item.suggestion] })] }));
58
- }
59
- case "handoff":
60
- return (_jsxs(Text, { dimColor: true, children: [item.direction === "outgoing" ? "\u2192" : "\u2190", " Handoff to ", item.target] }));
61
- }
62
- });
63
- function sliceRenderedTailByVisibleLines(rendered, width, tailLines) {
64
- const visibleLines = rendered.split("\n").flatMap((line) => wrapAnsi(line, width, {
65
- hard: false,
66
- trim: false,
67
- wordWrap: true,
68
- }).split("\n"));
69
- return visibleLines.slice(-tailLines).join("\n");
70
- }
71
- //# sourceMappingURL=RenderItemView.js.map
@@ -1,46 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- // packages/cli/src/ui/components/Spinner.tsx
3
- // Changes: theme → ARIA's, MESSAGES → VERB_PAIRS.map(p => p.present), removed getSessionState
4
- import { Box, Text } from "ink";
5
- import { useEffect, useRef, useState } from "react";
6
- import { getTheme } from "../theme/index.js";
7
- import { VERB_PAIRS } from "../verb-pairs.js";
8
- function sample(arr) {
9
- return arr[Math.floor(Math.random() * arr.length)];
10
- }
11
- // NB: The third character in this string is an emoji that
12
- // renders on Windows consoles with a green background
13
- const CHARACTERS = process.platform === "darwin" ? ["·", "✢", "✳", "∗", "✻", "✽"] : ["·", "✢", "*", "∗", "✻", "✽"];
14
- const MESSAGES = VERB_PAIRS.map((p) => p.present);
15
- export function Spinner() {
16
- const frames = [...CHARACTERS, ...[...CHARACTERS].reverse()];
17
- const [frame, setFrame] = useState(0);
18
- const [elapsedTime, setElapsedTime] = useState(0);
19
- const message = useRef(sample(MESSAGES));
20
- const startTime = useRef(Date.now());
21
- useEffect(() => {
22
- const timer = setInterval(() => {
23
- setFrame((f) => (f + 1) % frames.length);
24
- }, 120);
25
- return () => clearInterval(timer);
26
- }, [frames.length]);
27
- useEffect(() => {
28
- const timer = setInterval(() => {
29
- setElapsedTime(Math.floor((Date.now() - startTime.current) / 1000));
30
- }, 1000);
31
- return () => clearInterval(timer);
32
- }, []);
33
- return (_jsxs(Box, { flexDirection: "row", marginTop: 1, children: [_jsx(Box, { flexWrap: "nowrap", height: 1, width: 2, children: _jsx(Text, { color: getTheme().colors.primary, children: frames[frame] }) }), _jsxs(Text, { color: getTheme().colors.primary, children: [message.current, "\u2026 "] }), _jsxs(Text, { color: getTheme().colors.textMuted, children: ["(", elapsedTime, "s \u00B7 ", _jsx(Text, { bold: true, children: "esc" }), " to interrupt)"] })] }));
34
- }
35
- export function SimpleSpinner() {
36
- const frames = [...CHARACTERS, ...[...CHARACTERS].reverse()];
37
- const [frame, setFrame] = useState(0);
38
- useEffect(() => {
39
- const timer = setInterval(() => {
40
- setFrame((f) => (f + 1) % frames.length);
41
- }, 120);
42
- return () => clearInterval(timer);
43
- }, [frames.length]);
44
- return (_jsx(Box, { flexWrap: "nowrap", height: 1, width: 2, children: _jsx(Text, { color: getTheme().colors.primary, children: frames[frame] }) }));
45
- }
46
- //# sourceMappingURL=Spinner.js.map
@@ -1,95 +0,0 @@
1
- import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { Box, Text } from "ink";
3
- import { getArionColor, getModelColor, getModelProviderIcon, shortModelName } from "../theme.js";
4
- /** Default autonomy level — matches DEFAULT_SAFETY_CONFIG.autonomy in @aria/aria */
5
- export const DEFAULT_AUTONOMY = "balanced";
6
- /**
7
- * Format a token count into human-friendly compact notation.
8
- * Examples: 0, 842, 1.2k, 45.6k, 1.2M
9
- */
10
- export function formatTokens(tokens) {
11
- if (tokens < 1000)
12
- return String(tokens);
13
- if (tokens < 1_000_000) {
14
- const k = tokens / 1000;
15
- return k >= 100 ? `${Math.round(k)}k` : `${k.toFixed(1)}k`;
16
- }
17
- const m = tokens / 1_000_000;
18
- return m >= 100 ? `${Math.round(m)}M` : `${m.toFixed(1)}M`;
19
- }
20
- /**
21
- * Format cost in USD with 2 decimal places.
22
- * Examples: $0.00, $0.12, $1.50
23
- */
24
- export function formatCost(cost) {
25
- return `$${cost.toFixed(2)}`;
26
- }
27
- /**
28
- * Format wall-clock time in human-readable format.
29
- * Examples: 0.0s, 1.2s, 45.3s, 2m 15s
30
- */
31
- export function formatWallTime(seconds) {
32
- if (seconds < 60) {
33
- return `${seconds.toFixed(1)}s`;
34
- }
35
- const mins = Math.floor(seconds / 60);
36
- const secs = Math.round(seconds % 60);
37
- return `${mins}m ${secs}s`;
38
- }
39
- /**
40
- * Get context window fill percentage (0–100).
41
- */
42
- export function contextPercent(contextTokens, maxTokens) {
43
- if (maxTokens <= 0)
44
- return 0;
45
- return Math.min(100, Math.round((contextTokens / maxTokens) * 100));
46
- }
47
- /** Anthropic-style lavender purple for the context gauge */
48
- const GAUGE_COLOR = "#B4A0FF";
49
- /** Effort display: visual bars with semantic colors */
50
- const EFFORT_DISPLAY = {
51
- low: { bars: "▌", color: "blue" },
52
- medium: { bars: "▌▌", color: "cyan" },
53
- high: { bars: "▌▌▌", color: "yellow" },
54
- max: { bars: "▌▌▌▌", color: "magenta" },
55
- };
56
- /** Autonomy display: describes actual behavior, visually distinct per level */
57
- const AUTONOMY_DISPLAY = {
58
- minimal: { symbol: "▸", label: "confirm all", color: "green" },
59
- balanced: { symbol: "▸▸", label: "confirm risky", color: "yellow" },
60
- high: { symbol: "▸▸▸", label: "auto-approve", color: "magenta" },
61
- full: { symbol: "⏵⏵", label: "full bypass", color: "red" },
62
- };
63
- const GAUGE_WIDTH = 8;
64
- const SEP = " · ";
65
- /**
66
- * Status bar — context-first, purple gauge, with autonomy indicator.
67
- *
68
- * Idle:
69
- * 🦋 ARIA · opus-4.6 ⏵⏵ bypass ctx ░░░░░░░░ –
70
- *
71
- * During run (standard):
72
- * 🦋 ARIA · opus-4.6 · Turn 3 · 45.6k/200k ⏵⏵ bypass ctx ████░░░░ 23%
73
- *
74
- * During run (debug — adds cost + time):
75
- * 🦋 ARIA · opus-4.6 · Turn 3 · 45.6k/200k · $0.02 · 2.1s ⏵⏵ bypass ctx ████░░░░ 23%
76
- */
77
- export function StatusBar({ arion, model, maxContextTokens = 0, responseTime, metrics, showCosts = true, displayMode, activeArion, effortLevel, autonomyLevel = DEFAULT_AUTONOMY, meshMessageCount = 0, connectionState = "connected", }) {
78
- const arionHex = getArionColor(arion.color);
79
- const displayModel = shortModelName(model);
80
- const modelColor = getModelColor(displayModel);
81
- const providerIcon = getModelProviderIcon(displayModel);
82
- const isDebug = displayMode === "debug";
83
- // Show metrics when available (turn > 0 means a run has started)
84
- const hasMetrics = metrics && metrics.turnCount > 0;
85
- // Context window gauge
86
- const ctxTokens = hasMetrics ? metrics.contextTokens : 0;
87
- const pct = maxContextTokens > 0 ? contextPercent(ctxTokens, maxContextTokens) : 0;
88
- const filledBlocks = Math.min(GAUGE_WIDTH, Math.round((pct / 100) * GAUGE_WIDTH));
89
- const emptyBlocks = GAUGE_WIDTH - filledBlocks;
90
- const gaugeLabel = hasMetrics ? `${pct}%` : "–";
91
- // Autonomy indicator
92
- const auto = AUTONOMY_DISPLAY[autonomyLevel];
93
- return (_jsxs(Box, { justifyContent: "space-between", children: [_jsxs(Box, { children: [_jsxs(Text, { children: [arion.emoji, " "] }), _jsx(Text, { color: arionHex, bold: true, children: arion.name }), _jsx(Text, { dimColor: true, children: SEP }), hasMetrics ? (_jsxs(_Fragment, { children: [providerIcon && _jsxs(Text, { color: providerIcon.color, children: [providerIcon.icon, " "] }), _jsx(Text, { color: modelColor, dimColor: !modelColor, children: displayModel }), effortLevel && (_jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, children: SEP }), _jsx(Text, { color: EFFORT_DISPLAY[effortLevel].color, children: EFFORT_DISPLAY[effortLevel].bars })] })), _jsx(Text, { dimColor: true, children: SEP }), _jsxs(Text, { dimColor: true, children: ["Turn ", metrics.turnCount] }), _jsx(Text, { dimColor: true, children: SEP }), _jsxs(Text, { color: metrics.contextStale ? undefined : GAUGE_COLOR, dimColor: metrics.contextStale, children: [metrics.contextStale ? "~" : "", formatTokens(metrics.contextTokens)] }), maxContextTokens > 0 && _jsxs(Text, { dimColor: true, children: ["/", formatTokens(maxContextTokens)] }), isDebug && showCosts && (_jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, children: SEP }), _jsx(Text, { dimColor: true, children: formatCost(metrics.estimatedCost) })] })), isDebug && (_jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, children: SEP }), _jsx(Text, { dimColor: true, children: formatWallTime(metrics.wallTimeSeconds) })] })), activeArion && activeArion !== arion.name && (_jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, children: SEP }), _jsx(Text, { dimColor: true, children: activeArion })] }))] })) : (_jsxs(_Fragment, { children: [providerIcon && _jsxs(Text, { color: providerIcon.color, children: [providerIcon.icon, " "] }), _jsx(Text, { color: modelColor, dimColor: !modelColor, children: displayModel }), effortLevel && (_jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, children: SEP }), _jsx(Text, { color: EFFORT_DISPLAY[effortLevel].color, children: EFFORT_DISPLAY[effortLevel].bars })] })), responseTime !== undefined && (_jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, children: SEP }), _jsxs(Text, { dimColor: true, children: [responseTime.toFixed(1), "s"] })] }))] }))] }), _jsxs(Box, { gap: 1, children: [connectionState === "disconnected" && (_jsx(Text, { color: "red", bold: true, children: "\u26A1 offline" })), connectionState === "reconnecting" && (_jsx(Text, { color: "yellow", bold: true, children: "\u21BB reconnecting\u2026" })), meshMessageCount > 0 && (_jsxs(Text, { color: "yellow", bold: true, children: ["msg ", meshMessageCount] })), _jsxs(Text, { color: auto.color, children: [auto.symbol, " ", auto.label] }), _jsx(Text, { dimColor: true, children: "ctx" }), _jsx(Text, { color: GAUGE_COLOR, children: "█".repeat(filledBlocks) }), _jsx(Text, { dimColor: true, children: "░".repeat(emptyBlocks) }), _jsx(Text, { color: GAUGE_COLOR, children: gaugeLabel })] })] }));
94
- }
95
- //# sourceMappingURL=StatusBar.js.map
@@ -1,55 +0,0 @@
1
- import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
- // packages/cli/src/ui/components/StreamingIndicator.tsx
3
- import { useRef } from "react";
4
- import { Box, Text } from "ink";
5
- import gradient from "gradient-string";
6
- import { getTheme } from "../theme/index.js";
7
- import { pickRandomVerbPair } from "../verb-pairs.js";
8
- // Subtle gradient in the primary color family — soft shimmer effect
9
- const GRADIENT_COLORS = ["#5f97cd", "#7baed4", "#97c4db", "#7baed4"];
10
- const CHARACTERS = process.platform === "darwin" ? ["·", "✢", "✳", "∗", "✻", "✽"] : ["·", "✢", "*", "∗", "✻", "✽"];
11
- function formatElapsed(seconds) {
12
- if (seconds < 60)
13
- return `${seconds}s`;
14
- const m = Math.floor(seconds / 60);
15
- const s = seconds % 60;
16
- return `${m}m ${s}s`;
17
- }
18
- function formatTokens(tokens) {
19
- if (tokens >= 1000)
20
- return `${(tokens / 1000).toFixed(1)}k tokens`;
21
- return `${tokens} tokens`;
22
- }
23
- export function StreamingIndicator({ state, elapsedSeconds, totalTokens, thoughtForSeconds, currentVerb, }) {
24
- const frames = [...CHARACTERS, ...[...CHARACTERS].reverse()];
25
- // Derive animation frame from wall clock — no internal timer, no independent renders.
26
- // The component re-renders only when the PARENT re-renders (driven by the single
27
- // render scheduler), keeping all dynamic zone updates in one atomic write.
28
- const frame = Math.floor(Date.now() / 120) % frames.length;
29
- // Fallback from the same VERB_PAIRS list used by thinking blocks,
30
- // so the indicator and ThinkingBlock verbs are always from the same family.
31
- const fallbackVerb = useRef(pickRandomVerbPair().present);
32
- const displayVerb = currentVerb || fallbackVerb.current;
33
- const theme = getTheme();
34
- // Build gradient-colored verb text
35
- const offset = frame % GRADIENT_COLORS.length;
36
- const shifted = [...GRADIENT_COLORS.slice(offset), ...GRADIENT_COLORS.slice(0, offset)];
37
- const grad = gradient(shifted);
38
- const verbText = `${frames[frame]} ${displayVerb}…`;
39
- const coloredVerb = grad(verbText);
40
- // Build metrics string
41
- const elapsed = formatElapsed(elapsedSeconds);
42
- const tokens = formatTokens(totalTokens);
43
- let metricsStr;
44
- if (state === "thinking") {
45
- metricsStr = "(thinking)";
46
- }
47
- else if (thoughtForSeconds && thoughtForSeconds > 0) {
48
- metricsStr = `(${elapsed} · ↓ ${tokens} · thought for ${formatElapsed(thoughtForSeconds)})`;
49
- }
50
- else {
51
- metricsStr = `(${elapsed} · ↓ ${tokens} · esc to cancel)`;
52
- }
53
- return (_jsxs(Box, { flexDirection: "row", marginTop: 1, children: [_jsxs(Text, { children: [coloredVerb, " "] }), _jsx(Text, { color: theme.colors.textMuted, children: metricsStr })] }));
54
- }
55
- //# sourceMappingURL=StreamingIndicator.js.map