@aria-cli/cli 1.0.50 → 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 +1 -1
  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
package/package.json CHANGED
@@ -1,22 +1,33 @@
1
1
  {
2
2
  "name": "@aria-cli/cli",
3
- "version": "1.0.50",
4
- "description": "ARIA - Adaptive Reasoning Intelligence Agent",
3
+ "version": "1.0.51",
5
4
  "type": "module",
5
+ "main": "dist/main.js",
6
+ "types": "dist/index.d.ts",
6
7
  "bin": {
7
8
  "aria": "bin/aria.mjs"
8
9
  },
9
- "main": "bin/aria.mjs",
10
- "files": [
11
- "bin/aria.mjs"
12
- ],
13
- "engines": {
14
- "bun": ">=1.3.11"
10
+ "scripts": {
11
+ "test": "vitest run --config vitest.config.ts",
12
+ "test:list": "bun tests/print-default-test-lane.ts",
13
+ "test:watch": "vitest --config vitest.config.ts",
14
+ "test:integration": "vitest run --config vitest.integration.config.ts",
15
+ "test:native": "vitest run --config vitest.native.config.ts",
16
+ "test:e2e": "vitest run --config vitest.e2e.config.ts",
17
+ "test:e2e:watch": "vitest --config vitest.e2e.config.ts",
18
+ "test:e2e:mocked": "vitest run --config vitest.e2e.config.ts --testNamePattern='mocked|error|rejects|handles|prevents'",
19
+ "test:real": "vitest run --config vitest.real.config.ts",
20
+ "test:lanes": "bun tests/print-test-lane-manifest.ts",
21
+ "test:parity": "bun ../../scripts/run-cli-parity-tests.mjs",
22
+ "start": "bun dist/main.js",
23
+ "dev": "bun src/main.ts",
24
+ "dev:repl": "bun src/main.ts",
25
+ "smoke:binary": "bun ../../scripts/smoke-compiled-binary.mjs ../../dist-bin/aria"
15
26
  },
16
27
  "dependencies": {
17
28
  "@anthropic-ai/bedrock-sdk": "^0.26.4",
18
29
  "@anthropic-ai/sdk": "^0.78.0",
19
- "@aws-sdk/credential-providers": "^3.995.0",
30
+ "@ast-grep/napi": "^0.42.0",
20
31
  "@fastify/cors": "^11.0.1",
21
32
  "@fastify/websocket": "^11.2.0",
22
33
  "@google/genai": "^1.42.0",
@@ -27,6 +38,7 @@
27
38
  "color-name": "^2.1.0",
28
39
  "commander": "^14.0.3",
29
40
  "diff": "^8.0.3",
41
+ "dotenv": "^17.3.1",
30
42
  "eventemitter3": "^5.0.4",
31
43
  "fast-glob": "^3.3.3",
32
44
  "fastify": "^5.3.2",
@@ -35,27 +47,74 @@
35
47
  "highlight.js": "^11.11.1",
36
48
  "ink": "npm:@jrichman/ink@^6.4.11",
37
49
  "ink-spinner": "^5.0.0",
38
- "jsdom": "^26.0.0",
39
50
  "katex": "^0.16.33",
40
51
  "marked": "^17.0.3",
41
52
  "marked-terminal": "^7.3.0",
42
53
  "nanoid": "^5.1.6",
43
54
  "openai": "^6.25.0",
44
- "playwright": "^1.52.0",
45
55
  "proper-lockfile": "^4.1.2",
46
56
  "react": "^19.2.4",
57
+ "sqlite-vec": "0.1.7-alpha.2",
47
58
  "string-width": "^8.2.0",
48
59
  "turndown": "^7.2.2",
49
60
  "ulid": "^3.0.2",
61
+ "undici": "^7.22.0",
50
62
  "uuid": "^13.0.0",
63
+ "vscode-jsonrpc": "^8.2.1",
51
64
  "wrap-ansi": "^10.0.0",
65
+ "ws": "^8.19.0",
52
66
  "yaml": "^2.8.2",
53
- "zod": "^4.3.6"
67
+ "zod": "^4.3.6",
68
+ "node-pty": "^1.0.0",
69
+ "playwright": "^1.52.0",
70
+ "jsdom": "^26.0.0",
71
+ "@aws-sdk/credential-providers": "^3.995.0"
72
+ },
73
+ "devDependencies": {
74
+ "@testing-library/react": "^16.3.2",
75
+ "@types/color-name": "^2.0.0",
76
+ "@types/react": "^19.2.14",
77
+ "ink-testing-library": "^4.0.0",
78
+ "typescript": "^5.9.3",
79
+ "vitest": "^4.0.18",
80
+ "@aria-cli/aria": "1.0.50",
81
+ "@aria-cli/auth": "1.0.50",
82
+ "@aria-cli/memoria": "1.0.50",
83
+ "@aria-cli/memoria-bridge": "1.0.50",
84
+ "@aria-cli/models": "1.0.50",
85
+ "@aria-cli/server": "1.0.50",
86
+ "@aria-cli/tools": "1.0.50",
87
+ "@aria-cli/types": "1.0.50"
54
88
  },
89
+ "files": [
90
+ "bin/aria.mjs",
91
+ "src/main.ts",
92
+ "src/entrypoints/**/*",
93
+ "src/runtime/**/*",
94
+ "dist/**/*"
95
+ ],
96
+ "engines": {
97
+ "bun": ">=1.3.11"
98
+ },
99
+ "description": "ARIA — AI coding assistant with persistent memory, self-learning tools, and autonomous agent loop",
100
+ "homepage": "https://github.com/aria-cli/aria-releases",
101
+ "repository": {
102
+ "type": "git",
103
+ "url": "https://github.com/aria-cli/aria-releases.git"
104
+ },
105
+ "keywords": [
106
+ "ai",
107
+ "cli",
108
+ "coding-assistant",
109
+ "agent",
110
+ "llm",
111
+ "memory",
112
+ "tools"
113
+ ],
114
+ "module": "dist/main.js",
55
115
  "optionalDependencies": {
56
116
  "@aws-sdk/client-bedrock": "^3.997.0",
57
117
  "@aws-sdk/client-bedrock-runtime": "^3.997.0",
58
118
  "@aws-sdk/token-providers": "^3.997.0"
59
- },
60
- "license": "MIT"
119
+ }
61
120
  }
@@ -0,0 +1,5 @@
1
+ import { program } from "../commands/index.js";
2
+
3
+ export async function runCommandMode(argv = process.argv): Promise<void> {
4
+ await program.parseAsync(argv);
5
+ }
@@ -0,0 +1,54 @@
1
+ import type { DaemonLauncherCliOptions } from "@aria-cli/server/daemon-launcher";
2
+ import { runServerDaemonLauncherFromCli } from "@aria-cli/server/daemon-launcher";
3
+
4
+ function requireValue(argv: string[], index: number, flag: string): string {
5
+ const value = argv[index + 1];
6
+ if (!value) throw new Error(`${flag} requires a value`);
7
+ return value;
8
+ }
9
+
10
+ function parseDaemonArgs(argv: string[]): DaemonLauncherCliOptions {
11
+ const options: DaemonLauncherCliOptions = {};
12
+
13
+ for (let i = 0; i < argv.length; i += 1) {
14
+ const arg = argv[i];
15
+ switch (arg) {
16
+ case "--arion":
17
+ options.arion = requireValue(argv, i, arg);
18
+ i += 1;
19
+ break;
20
+ case "--port":
21
+ options.port = requireValue(argv, i, arg);
22
+ i += 1;
23
+ break;
24
+ case "--interval-ms":
25
+ options.intervalMs = requireValue(argv, i, arg);
26
+ i += 1;
27
+ break;
28
+ case "--allowed-tool-categories":
29
+ options.allowedToolCategories = requireValue(argv, i, arg);
30
+ i += 1;
31
+ break;
32
+ case "--allowed-shell-commands":
33
+ options.allowedShellCommands = requireValue(argv, i, arg);
34
+ i += 1;
35
+ break;
36
+ case "--max-write-ops-per-minute":
37
+ options.maxWriteOpsPerMinute = requireValue(argv, i, arg);
38
+ i += 1;
39
+ break;
40
+ case "--max-git-pushes-per-hour":
41
+ options.maxGitPushesPerHour = requireValue(argv, i, arg);
42
+ i += 1;
43
+ break;
44
+ default:
45
+ throw new Error(`[aria] Unknown internal daemon arg: ${arg}`);
46
+ }
47
+ }
48
+
49
+ return options;
50
+ }
51
+
52
+ export async function runDaemonEntrypoint(argv: string[]): Promise<void> {
53
+ await runServerDaemonLauncherFromCli(parseDaemonArgs(argv));
54
+ }
@@ -0,0 +1,27 @@
1
+ import { startHeadlessStdioServer } from "../headless/stdio-server.js";
2
+
3
+ function parseHeadlessArgs(argv: string[]): { arionName?: string } {
4
+ let arionName: string | undefined;
5
+
6
+ for (let i = 0; i < argv.length; i += 1) {
7
+ const arg = argv[i];
8
+ if (arg === "--arion") {
9
+ const next = argv[i + 1];
10
+ if (!next) throw new Error("--arion requires a value");
11
+ arionName = next;
12
+ i += 1;
13
+ continue;
14
+ }
15
+ throw new Error(`[aria] Unknown internal headless-stdio arg: ${arg}`);
16
+ }
17
+
18
+ return { arionName };
19
+ }
20
+
21
+ export async function runHeadlessStdioEntrypoint(argv: string[]): Promise<void> {
22
+ const parsed = parseHeadlessArgs(argv);
23
+ await startHeadlessStdioServer({
24
+ cwd: process.cwd(),
25
+ arionName: parsed.arionName,
26
+ });
27
+ }
@@ -0,0 +1,112 @@
1
+ import { ArionManager, ArionStorage } from "@aria-cli/aria";
2
+ import { Memoria } from "@aria-cli/memoria";
3
+ import { getCliModels } from "@aria-cli/models";
4
+ import type { InteractiveInvocation } from "../runtime/interactive-invocation.js";
5
+ import { createAttachedCliContext } from "../cli-context.js";
6
+ import { getAriaDir } from "../config.js";
7
+ import { ensureDaemon } from "../ensure-daemon.js";
8
+ import { startInkRepl } from "../ink-repl.js";
9
+ import { attachExistingLocalControlClient } from "../local-control-client.js";
10
+ import { SessionHistory } from "../history/index.js";
11
+ import { ArionSession } from "../session.js";
12
+
13
+ async function recallUserName(memoria: Memoria): Promise<string | null> {
14
+ try {
15
+ const raw = memoria.storage?.getConfigValue?.("user_profile");
16
+ return raw ? (JSON.parse(raw).name ?? null) : null;
17
+ } catch {
18
+ return null;
19
+ }
20
+ }
21
+
22
+ export async function runInteractiveEntrypoint(invocation: InteractiveInvocation): Promise<void> {
23
+ const ariaHome = getAriaDir();
24
+ const cli = await createAttachedCliContext();
25
+
26
+ await ensureDaemon(cli);
27
+
28
+ const attached = await attachExistingLocalControlClient({
29
+ ariaHome,
30
+ clientKind: "tui",
31
+ });
32
+
33
+ if (!attached) {
34
+ throw new Error("[aria] Attached REPL requires an existing local-control runtime");
35
+ }
36
+
37
+ const memoriaPath = process.env.ARIA_MEMORY_PATH || `${cli.ariaDir}/arions/ARIA/memory.db`;
38
+ const memoria = new Memoria({ path: memoriaPath, router: cli.router });
39
+ memoria.initialize().catch((error) => {
40
+ console.debug(
41
+ `[aria] Memoria background init failed (will retry on use): ${error?.message ?? error}`,
42
+ );
43
+ });
44
+
45
+ const aria = {
46
+ components: { memoria },
47
+ recallUserName: () => recallUserName(memoria),
48
+ shutdown: async () => {
49
+ await memoria.close();
50
+ await cli.pool.closeAll();
51
+ },
52
+ };
53
+
54
+ const storage = new ArionStorage(cli.ariaDir);
55
+ const manager = new ArionManager(storage, cli.memoriaFactory);
56
+ await manager.initialize();
57
+ manager.setRouter(cli.router);
58
+
59
+ const activeArion = cli.config.activeArion?.trim() || "ARIA";
60
+ const historyPath = SessionHistory.resolvePerArionPath(cli.ariaDir, activeArion);
61
+ SessionHistory.migrateJsonlLogs(cli.ariaDir, activeArion);
62
+ const history = new SessionHistory(historyPath);
63
+ const inputHistory = history.getInputHistory(100);
64
+ const appendInputHistory = (value: string) => history.addInputHistory(value);
65
+
66
+ let resolvedSessionId: string | undefined;
67
+ if (invocation.resumeSessionId) {
68
+ const found = history.findSessionByPrefix(invocation.resumeSessionId);
69
+ if (!found) {
70
+ throw new Error(`Error: No session found matching \"${invocation.resumeSessionId}\"`);
71
+ }
72
+ resolvedSessionId = found;
73
+ } else if (invocation.continueLatest) {
74
+ const latest = history.listSessions(1);
75
+ if (latest.length === 0) {
76
+ throw new Error("Error: No recent sessions to continue");
77
+ }
78
+ resolvedSessionId = latest[0]?.id;
79
+ }
80
+
81
+ const session = new ArionSession({
82
+ manager,
83
+ router: cli.router,
84
+ memoria,
85
+ onArionRest: async () => {},
86
+ });
87
+ await session.initialize(cli.config.activeArion);
88
+
89
+ const cachedUserName = await recallUserName(memoria);
90
+ const initialModelSnapshot = await attached.control.getModelSnapshot?.().catch(() => undefined);
91
+
92
+ await startInkRepl(
93
+ session,
94
+ manager,
95
+ cli.router,
96
+ aria,
97
+ attached,
98
+ cli,
99
+ inputHistory,
100
+ appendInputHistory,
101
+ history,
102
+ invocation.prompt,
103
+ cachedUserName,
104
+ resolvedSessionId,
105
+ (initialModelSnapshot?.models as
106
+ | readonly import("@aria-cli/models").ReadonlyModelDefinition[]
107
+ | undefined) ?? getCliModels(),
108
+ undefined,
109
+ cli.credentialHints,
110
+ cli.authResolver,
111
+ );
112
+ }
package/src/main.ts ADDED
@@ -0,0 +1,44 @@
1
+ import "./runtime/configure-bun-sqlite.js";
2
+ import { installProcessCrashHandlers } from "./runtime/crash-handlers.js";
3
+ import { installOwnerLeaseIfNeeded } from "./runtime/owner-lease.js";
4
+ import { parseInternalInvocation } from "./runtime/internal-mode.js";
5
+ import { isPublicCommandInvocation } from "./runtime/public-mode.js";
6
+ import { runInternalMode } from "./runtime/run-internal-mode.js";
7
+ import { runCommandMode } from "./entrypoints/command-mode.js";
8
+ import { runInteractiveEntrypoint } from "./entrypoints/interactive.js";
9
+ import { parseInteractiveInvocation } from "./runtime/interactive-invocation.js";
10
+ import { isChildProcess, superviseInteractiveSession } from "./relaunch.js";
11
+
12
+ export async function main(argv = process.argv): Promise<void> {
13
+ installProcessCrashHandlers();
14
+ installOwnerLeaseIfNeeded();
15
+
16
+ const userArgs = argv.slice(2);
17
+
18
+ const internal = parseInternalInvocation(userArgs);
19
+ if (internal) {
20
+ await runInternalMode(internal);
21
+ return;
22
+ }
23
+
24
+ if (isPublicCommandInvocation(userArgs)) {
25
+ await runCommandMode(argv);
26
+ return;
27
+ }
28
+
29
+ const interactive = parseInteractiveInvocation(userArgs);
30
+ if (isChildProcess()) {
31
+ await runInteractiveEntrypoint(interactive);
32
+ return;
33
+ }
34
+
35
+ await superviseInteractiveSession(interactive);
36
+ }
37
+
38
+ if ((import.meta as ImportMeta & { main?: boolean }).main) {
39
+ main(process.argv).catch((error) => {
40
+ const message = error instanceof Error ? (error.stack ?? error.message) : String(error);
41
+ process.stderr.write(`${message}\n`);
42
+ process.exit(1);
43
+ });
44
+ }
@@ -0,0 +1,3 @@
1
+ import { configureBunCustomSqlite } from "@aria-cli/tools";
2
+
3
+ configureBunCustomSqlite();
@@ -0,0 +1,128 @@
1
+ import { createHash } from "node:crypto";
2
+ import { appendFileSync, mkdirSync, writeFileSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { join } from "node:path";
5
+ import v8 from "node:v8";
6
+ import { RESUME_SESSION_ENV } from "@aria-cli/types";
7
+
8
+ function getAriaHome(): string {
9
+ return process.env.ARIA_HOME?.trim() || join(homedir(), ".aria");
10
+ }
11
+
12
+ function writeCrashReport(type: string, error: unknown): void {
13
+ try {
14
+ const crashDir = join(getAriaHome(), "crash-reports");
15
+ mkdirSync(crashDir, { recursive: true });
16
+
17
+ const err = error instanceof Error ? error : new Error(String(error));
18
+ const memory = process.memoryUsage();
19
+ const timestamp = new Date().toISOString();
20
+ const sessionId = process.env[RESUME_SESSION_ENV] || "unknown";
21
+ const payload = {
22
+ timestamp,
23
+ sessionId,
24
+ type,
25
+ error: {
26
+ message: err.message,
27
+ stack: err.stack,
28
+ name: err.name,
29
+ },
30
+ process: {
31
+ pid: process.pid,
32
+ heapUsedMb: Math.round((memory.heapUsed / 1024 / 1024) * 100) / 100,
33
+ rssMb: Math.round((memory.rss / 1024 / 1024) * 100) / 100,
34
+ uptime: Math.round(process.uptime()),
35
+ },
36
+ };
37
+
38
+ writeFileSync(join(crashDir, "latest.json"), JSON.stringify(payload, null, 2));
39
+
40
+ const stackFirst = err.stack?.split("\n")[1]?.trim() ?? "";
41
+ const bucket = Math.floor(Date.now() / 10000);
42
+ const fingerprint = createHash("sha256")
43
+ .update(`${err.message}|${stackFirst}|${bucket}`)
44
+ .digest("hex")
45
+ .slice(0, 12);
46
+
47
+ appendFileSync(
48
+ join(getAriaHome(), "error-events.jsonl"),
49
+ `${JSON.stringify({
50
+ id: `crash-${fingerprint}`,
51
+ timestamp,
52
+ severity: 0,
53
+ category: "crash",
54
+ domain: "cli",
55
+ name: err.name,
56
+ message: err.message,
57
+ stackTrace: err.stack,
58
+ recoverable: false,
59
+ status: "new",
60
+ })}\n`,
61
+ "utf-8",
62
+ );
63
+ } catch {
64
+ // Best effort only.
65
+ }
66
+ }
67
+
68
+ let installed = false;
69
+
70
+ /**
71
+ * Install V8 heap diagnostics for OOM investigation.
72
+ *
73
+ * - `setHeapSnapshotNearHeapLimit(3)`: Auto-captures up to 3 progressive heap
74
+ * snapshots as the heap approaches the V8 limit. Snapshots land in the
75
+ * diagnostic directory and survive the crash — load in Chrome DevTools
76
+ * Memory tab for retainer trace analysis.
77
+ *
78
+ * - `process.report.reportOnFatalError`: Generates a diagnostic JSON report
79
+ * on fatal errors (including OOM) with native stack, heap space breakdown,
80
+ * libuv handles, and resource usage.
81
+ *
82
+ * Both are lightweight and production-safe — zero overhead until triggered.
83
+ */
84
+ function installHeapDiagnostics(): void {
85
+ const crashDir = join(getAriaHome(), "crash-reports");
86
+ mkdirSync(crashDir, { recursive: true });
87
+
88
+ // Auto-capture heap snapshots as V8 approaches the heap limit.
89
+ // Writes .heapsnapshot files to crashDir before OOM kills the process.
90
+ try {
91
+ v8.setHeapSnapshotNearHeapLimit(3);
92
+ } catch {
93
+ // Bun or older Node without this API — non-fatal.
94
+ }
95
+
96
+ // Generate a diagnostic report JSON on fatal errors (OOM, segfault).
97
+ try {
98
+ process.report.reportOnFatalError = true;
99
+ process.report.directory = crashDir;
100
+ } catch {
101
+ // Non-fatal if report API is unavailable.
102
+ }
103
+ }
104
+
105
+ export function installProcessCrashHandlers(): void {
106
+ if (installed) return;
107
+ installed = true;
108
+
109
+ installHeapDiagnostics();
110
+
111
+ process.on("uncaughtException", (error, origin) => {
112
+ writeCrashReport("uncaughtException", error);
113
+ process.stderr.write(`[aria] FATAL uncaughtException (origin: ${origin}):\n`);
114
+ process.stderr.write(
115
+ `${error instanceof Error ? (error.stack ?? error.message) : String(error)}\n`,
116
+ );
117
+ process.exit(1);
118
+ });
119
+
120
+ process.on("unhandledRejection", (error) => {
121
+ writeCrashReport("unhandledRejection", error);
122
+ process.stderr.write("[aria] FATAL unhandledRejection:\n");
123
+ process.stderr.write(
124
+ `${error instanceof Error ? (error.stack ?? error.message) : String(error)}\n`,
125
+ );
126
+ process.exit(1);
127
+ });
128
+ }
@@ -0,0 +1,42 @@
1
+ import { afterEach, describe, expect, it } from "vitest";
2
+ import { parseInteractiveInvocation } from "./interactive-invocation.js";
3
+
4
+ describe("parseInteractiveInvocation", () => {
5
+ const originalResume = process.env.ARIA_RESUME_SESSION_ID;
6
+ const originalRestartKind = process.env.ARIA_RESTART_KIND;
7
+
8
+ afterEach(() => {
9
+ if (originalResume === undefined) delete process.env.ARIA_RESUME_SESSION_ID;
10
+ else process.env.ARIA_RESUME_SESSION_ID = originalResume;
11
+
12
+ if (originalRestartKind === undefined) delete process.env.ARIA_RESTART_KIND;
13
+ else process.env.ARIA_RESTART_KIND = originalRestartKind;
14
+ });
15
+
16
+ it("parses a prompt", () => {
17
+ expect(parseInteractiveInvocation(["hello", "world"]).prompt).toBe("hello world");
18
+ });
19
+
20
+ it("parses resume flag", () => {
21
+ expect(parseInteractiveInvocation(["--resume", "sess-1"]).resumeSessionId).toBe("sess-1");
22
+ });
23
+
24
+ it("parses continue flag", () => {
25
+ expect(parseInteractiveInvocation(["--continue"]).continueLatest).toBe(true);
26
+ });
27
+
28
+ it("consumes resume env when explicit args are absent", () => {
29
+ process.env.ARIA_RESUME_SESSION_ID = "sess-env";
30
+ process.env.ARIA_RESTART_KIND = "explicit";
31
+ const parsed = parseInteractiveInvocation([]);
32
+ expect(parsed.resumeSessionId).toBe("sess-env");
33
+ expect(process.env.ARIA_RESUME_SESSION_ID).toBeUndefined();
34
+ expect(process.env.ARIA_RESTART_KIND).toBeUndefined();
35
+ });
36
+
37
+ it("rejects resume + continue together", () => {
38
+ expect(() => parseInteractiveInvocation(["--resume", "sess-1", "--continue"])).toThrow(
39
+ /mutually exclusive/i,
40
+ );
41
+ });
42
+ });
@@ -0,0 +1,51 @@
1
+ import { RESUME_SESSION_ENV, RESTART_KIND_ENV } from "@aria-cli/types";
2
+
3
+ export interface InteractiveInvocation {
4
+ prompt?: string;
5
+ resumeSessionId?: string | null;
6
+ continueLatest?: boolean;
7
+ rawArgs: string[];
8
+ }
9
+
10
+ export function parseInteractiveInvocation(argv: string[]): InteractiveInvocation {
11
+ let resumeSessionId: string | null = null;
12
+ let continueLatest = false;
13
+ const promptParts: string[] = [];
14
+
15
+ for (let i = 0; i < argv.length; i += 1) {
16
+ const arg = argv[i];
17
+ if (arg === undefined) continue;
18
+
19
+ if (arg === "-r" || arg === "--resume") {
20
+ const next = argv[i + 1];
21
+ if (!next) throw new Error("Error: -r/--resume requires a session ID");
22
+ resumeSessionId = next;
23
+ i += 1;
24
+ continue;
25
+ }
26
+
27
+ if (arg === "-c" || arg === "--continue") {
28
+ continueLatest = true;
29
+ continue;
30
+ }
31
+
32
+ promptParts.push(arg);
33
+ }
34
+
35
+ if (resumeSessionId && continueLatest) {
36
+ throw new Error("Error: -r/--resume and -c/--continue are mutually exclusive");
37
+ }
38
+
39
+ if (!resumeSessionId && !continueLatest && process.env[RESUME_SESSION_ENV]) {
40
+ resumeSessionId = process.env[RESUME_SESSION_ENV] ?? null;
41
+ delete process.env[RESUME_SESSION_ENV];
42
+ delete process.env[RESTART_KIND_ENV];
43
+ }
44
+
45
+ return {
46
+ prompt: promptParts.length > 0 ? promptParts.join(" ") : undefined,
47
+ resumeSessionId,
48
+ continueLatest,
49
+ rawArgs: [...argv],
50
+ };
51
+ }
@@ -0,0 +1,19 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { parseInternalInvocation } from "./internal-mode.js";
3
+
4
+ describe("parseInternalInvocation", () => {
5
+ it("returns null for public args", () => {
6
+ expect(parseInternalInvocation(["auth"])).toBeNull();
7
+ });
8
+
9
+ it("parses valid internal mode", () => {
10
+ expect(parseInternalInvocation(["__internal", "daemon", "--port", "0"])).toEqual({
11
+ mode: "daemon",
12
+ args: ["--port", "0"],
13
+ });
14
+ });
15
+
16
+ it("throws on unknown internal mode", () => {
17
+ expect(() => parseInternalInvocation(["__internal", "wat"])).toThrow(/Unknown internal mode/i);
18
+ });
19
+ });
@@ -0,0 +1,24 @@
1
+ export type InternalMode = "repl" | "daemon" | "headless-stdio";
2
+
3
+ export interface InternalInvocation {
4
+ mode: InternalMode;
5
+ args: string[];
6
+ }
7
+
8
+ export const INTERNAL_SENTINEL = "__internal";
9
+
10
+ export function parseInternalInvocation(argv: string[]): InternalInvocation | null {
11
+ if (argv[0] !== INTERNAL_SENTINEL) return null;
12
+
13
+ const mode = argv[1];
14
+ if (mode !== "repl" && mode !== "daemon" && mode !== "headless-stdio") {
15
+ throw new Error(
16
+ `[aria] Unknown internal mode \"${String(mode)}\". Expected repl | daemon | headless-stdio.`,
17
+ );
18
+ }
19
+
20
+ return {
21
+ mode,
22
+ args: argv.slice(2),
23
+ };
24
+ }
@@ -0,0 +1,26 @@
1
+ import { afterEach, describe, expect, it } from "vitest";
2
+ import { resolveAriaLaunchSpec } from "./launch-spec.js";
3
+
4
+ describe("resolveAriaLaunchSpec", () => {
5
+ const originalOverride = process.env.ARIA_RUNTIME_KIND;
6
+
7
+ afterEach(() => {
8
+ if (originalOverride === undefined) delete process.env.ARIA_RUNTIME_KIND;
9
+ else process.env.ARIA_RUNTIME_KIND = originalOverride;
10
+ });
11
+
12
+ it("resolves source-bun launch spec", () => {
13
+ process.env.ARIA_RUNTIME_KIND = "source-bun";
14
+ const spec = resolveAriaLaunchSpec({ mode: "daemon", args: ["--port", "0"] });
15
+ expect(spec.command === "bun" || spec.command === "bun.exe").toBe(true);
16
+ expect(spec.args).toContain("__internal");
17
+ expect(spec.args).toContain("daemon");
18
+ });
19
+
20
+ it("resolves compiled-bun launch spec", () => {
21
+ process.env.ARIA_RUNTIME_KIND = "compiled-bun";
22
+ const spec = resolveAriaLaunchSpec({ mode: "repl", args: ["--continue"] });
23
+ expect(spec.command).toBe(process.execPath);
24
+ expect(spec.args.slice(0, 2)).toEqual(["__internal", "repl"]);
25
+ });
26
+ });