@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,92 @@
1
+ /**
2
+ * Slash command handler for /logout -- disconnect providers and clear credentials.
3
+ *
4
+ * Supports two result modes:
5
+ * - PickerResult: `/logout` with no args -> list connected/expired providers
6
+ * - DirectResult: `/logout <provider>` or `/logout all` -> immediate disconnect
7
+ */
8
+ import { ensureAuthProfileStore, listProfilesForProvider, updateAuthProfileStoreWithLockSync, } from "@aria-cli/auth";
9
+ import { getProviderOptions } from "./login-handler.js";
10
+ // ---------------------------------------------------------------------------
11
+ // disconnectProvider -- remove all profiles for a given provider
12
+ // ---------------------------------------------------------------------------
13
+ function disconnectProvider(provider) {
14
+ const store = ensureAuthProfileStore();
15
+ const profileIds = listProfilesForProvider(store, provider);
16
+ if (profileIds.length === 0) {
17
+ return {
18
+ success: false,
19
+ message: `No credentials found for "${provider}"`,
20
+ };
21
+ }
22
+ updateAuthProfileStoreWithLockSync({
23
+ updater: (freshStore) => {
24
+ for (const id of profileIds) {
25
+ const providerKey = freshStore.profiles[id]?.provider;
26
+ delete freshStore.profiles[id];
27
+ if (providerKey && freshStore.lastGood) {
28
+ delete freshStore.lastGood[providerKey];
29
+ }
30
+ }
31
+ if (freshStore.usageStats) {
32
+ for (const id of profileIds) {
33
+ delete freshStore.usageStats[id];
34
+ }
35
+ }
36
+ return true;
37
+ },
38
+ });
39
+ const plural = profileIds.length === 1 ? "profile" : "profiles";
40
+ return {
41
+ success: true,
42
+ message: `Disconnected ${provider} (removed ${profileIds.length} ${plural})`,
43
+ };
44
+ }
45
+ // ---------------------------------------------------------------------------
46
+ // disconnectAll -- clear every profile in the store
47
+ // ---------------------------------------------------------------------------
48
+ function disconnectAll() {
49
+ const store = ensureAuthProfileStore();
50
+ const count = Object.keys(store.profiles).length;
51
+ if (count === 0) {
52
+ return { success: false, message: "No providers connected" };
53
+ }
54
+ updateAuthProfileStoreWithLockSync({
55
+ updater: (freshStore) => {
56
+ freshStore.profiles = {};
57
+ freshStore.lastGood = undefined;
58
+ freshStore.usageStats = undefined;
59
+ return true;
60
+ },
61
+ });
62
+ const plural = count === 1 ? "profile" : "profiles";
63
+ return {
64
+ success: true,
65
+ message: `Cleared all credentials (${count} ${plural} removed)`,
66
+ };
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // handleLogoutCommand -- entry point from REPL command dispatch
70
+ // ---------------------------------------------------------------------------
71
+ export function handleLogoutCommand(args) {
72
+ const trimmed = args.trim().toLowerCase();
73
+ // /logout all -> clear everything
74
+ if (trimmed === "all") {
75
+ return { mode: "direct", result: disconnectAll() };
76
+ }
77
+ // /logout <provider> -> disconnect specific provider
78
+ if (trimmed) {
79
+ return { mode: "direct", result: disconnectProvider(trimmed) };
80
+ }
81
+ // /logout (no args) -> show connected/expired providers
82
+ const allProviders = getProviderOptions();
83
+ const connected = allProviders.filter((p) => p.status !== "none");
84
+ if (connected.length === 0) {
85
+ return {
86
+ mode: "direct",
87
+ result: { success: true, message: "No providers connected" },
88
+ };
89
+ }
90
+ return { mode: "picker", providers: connected };
91
+ }
92
+ //# sourceMappingURL=logout-handler.js.map
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Slash command handlers for memory operations.
3
+ *
4
+ * Thin wrappers around Memoria API for testable command dispatch.
5
+ * Used by the REPL command pipeline and E2E tests.
6
+ */
7
+ export async function handleRememberCommand(args, memoria) {
8
+ const content = args.trim();
9
+ if (!content) {
10
+ return { success: false, message: "Usage: /remember <text to remember>" };
11
+ }
12
+ try {
13
+ const memory = await memoria.remember(content);
14
+ if (!memory || !memory.id) {
15
+ return {
16
+ success: false,
17
+ message: "Failed to store memory (system closed or degraded)",
18
+ };
19
+ }
20
+ const count = await memoria.count();
21
+ const preview = content.length > 50 ? content.slice(0, 50) + "..." : content;
22
+ return {
23
+ success: true,
24
+ message: `Remembered: "${preview}"`,
25
+ data: { id: memory.id, count },
26
+ };
27
+ }
28
+ catch (error) {
29
+ return {
30
+ success: false,
31
+ message: `Error remembering: ${error instanceof Error ? error.message : String(error)}`,
32
+ };
33
+ }
34
+ }
35
+ export async function handleRecallCommand(args, memoria) {
36
+ const query = args.trim();
37
+ if (!query) {
38
+ return { success: false, message: "Usage: /recall <query>" };
39
+ }
40
+ try {
41
+ const results = await memoria.recall(query);
42
+ if (results.memories.length === 0) {
43
+ return {
44
+ success: true,
45
+ message: "No memories found matching your query.",
46
+ data: { count: 0, memories: [] },
47
+ };
48
+ }
49
+ return {
50
+ success: true,
51
+ message: `Found ${results.memories.length} memories:`,
52
+ data: { count: results.memories.length, memories: results.memories },
53
+ };
54
+ }
55
+ catch (error) {
56
+ return {
57
+ success: false,
58
+ message: `Error recalling: ${error instanceof Error ? error.message : String(error)}`,
59
+ };
60
+ }
61
+ }
62
+ export async function handleForgetCommand(args, memoria) {
63
+ const id = args.trim();
64
+ if (!id) {
65
+ return { success: false, message: "Usage: /forget <memory-id>" };
66
+ }
67
+ try {
68
+ const deleted = await memoria.deleteMemory(id);
69
+ if (deleted) {
70
+ return {
71
+ success: true,
72
+ message: `Deleted memory ${id}.`,
73
+ data: { deleted: true },
74
+ };
75
+ }
76
+ return {
77
+ success: true,
78
+ message: `Memory ${id} not found or already deleted.`,
79
+ data: { deleted: false },
80
+ };
81
+ }
82
+ catch (error) {
83
+ return {
84
+ success: false,
85
+ message: `Error forgetting: ${error instanceof Error ? error.message : String(error)}`,
86
+ };
87
+ }
88
+ }
89
+ //# sourceMappingURL=memory-handlers.js.map
@@ -0,0 +1,60 @@
1
+ import { Command } from "commander";
2
+ import { createCliContext } from "../cli-context.js";
3
+ import { ensureDaemon } from "../ensure-daemon.js";
4
+ function parseDurationMs(rawValue) {
5
+ const parsed = Number.parseInt(rawValue, 10);
6
+ if (!Number.isFinite(parsed) || parsed < 0) {
7
+ throw new Error(`Invalid --duration-ms value: ${rawValue}`);
8
+ }
9
+ return parsed;
10
+ }
11
+ export function createPairingCommand() {
12
+ const pairing = new Command("pairing").description("Invite and join peers over the internet");
13
+ pairing
14
+ .command("invite")
15
+ .description("Create an end-user internet pairing invite")
16
+ .argument("[label]", "Optional local label for the invite")
17
+ .option("--duration-ms <ms>", "Invite lifetime in milliseconds", parseDurationMs)
18
+ .action(async (label, options) => {
19
+ const ctx = await createCliContext();
20
+ try {
21
+ const { control } = await ensureDaemon(ctx);
22
+ const result = await control.createInvite({
23
+ ...(label?.trim() ? { inviteLabel: label.trim() } : {}),
24
+ ...(typeof options?.durationMs === "number" ? { durationMs: options.durationMs } : {}),
25
+ });
26
+ console.log("Invite token:");
27
+ console.log(result.inviteToken);
28
+ console.log("");
29
+ console.log(`Join with: aria pairing join ${result.inviteToken}`);
30
+ }
31
+ catch (error) {
32
+ console.error(`Failed to create invite: ${error.message}`);
33
+ process.exit(1);
34
+ }
35
+ finally {
36
+ await ctx.pool?.closeAll?.();
37
+ }
38
+ });
39
+ pairing
40
+ .command("join")
41
+ .description("Accept an internet pairing invite token")
42
+ .argument("<token>", "Invite token to accept")
43
+ .action(async (token) => {
44
+ const ctx = await createCliContext();
45
+ try {
46
+ const { control } = await ensureDaemon(ctx);
47
+ const result = await control.acceptInviteToken({ inviteToken: token.trim() });
48
+ console.log(`Paired with ${result.displayNameSnapshot ?? result.nodeId}`);
49
+ }
50
+ catch (error) {
51
+ console.error(`Failed to accept invite: ${error.message}`);
52
+ process.exit(1);
53
+ }
54
+ finally {
55
+ await ctx.pool?.closeAll?.();
56
+ }
57
+ });
58
+ return pairing;
59
+ }
60
+ //# sourceMappingURL=pairing.js.map
@@ -0,0 +1,12 @@
1
+ import { Command } from "commander";
2
+ export function createRuntimeCutoverResetCommand() {
3
+ return new Command("runtime-cutover-reset")
4
+ .description("Destructively clear stale runtime state while preserving local node identity by default")
5
+ .option("--full-reset", "Also remove local node identity material")
6
+ .option("--json", "Emit the reset report as JSON")
7
+ .action(async (options) => {
8
+ const { runtimeCutoverResetCommand } = await import("./runtime-cutover-reset.js");
9
+ await runtimeCutoverResetCommand(options);
10
+ });
11
+ }
12
+ //# sourceMappingURL=runtime-cutover-reset-command.js.map
@@ -0,0 +1,265 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { resolveRuntimeRootDirectory, runtimeSocketsDirectory } from "@aria-cli/server";
4
+ import { openCompatSqliteDatabase } from "@aria-cli/tools";
5
+ import { getAriaDir } from "../config.js";
6
+ function canonicalizeAriaHome(ariaHome) {
7
+ const resolved = path.resolve(ariaHome);
8
+ try {
9
+ return fs.realpathSync.native(resolved);
10
+ }
11
+ catch {
12
+ return resolved;
13
+ }
14
+ }
15
+ function resolveMachineDirectory() {
16
+ return path.join(process.env.HOME ?? "/tmp", ".aria");
17
+ }
18
+ function nodeStorePathForAriaHome(ariaHome) {
19
+ return path.join(ariaHome, "node", "node-state.db");
20
+ }
21
+ function nodeStoreLockPathForAriaHome(ariaHome) {
22
+ return `${nodeStorePathForAriaHome(ariaHome)}.lock`;
23
+ }
24
+ function runtimeCutoverReportPath(ariaHome) {
25
+ return path.join(ariaHome, "node", "runtime-cutover-last-report.json");
26
+ }
27
+ function isPidAlive(pid) {
28
+ if (!Number.isFinite(pid) || pid <= 0)
29
+ return false;
30
+ try {
31
+ process.kill(pid, 0);
32
+ return true;
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ }
38
+ function removeIfExists(targetPath, report) {
39
+ if (!fs.existsSync(targetPath)) {
40
+ report.skippedPaths.push(targetPath);
41
+ return;
42
+ }
43
+ fs.rmSync(targetPath, { recursive: true, force: true });
44
+ report.removedPaths.push(targetPath);
45
+ }
46
+ function removeDatabaseFamily(dbPath, report) {
47
+ for (const candidate of [dbPath, `${dbPath}-wal`, `${dbPath}-shm`]) {
48
+ removeIfExists(candidate, report);
49
+ }
50
+ }
51
+ function listArionDirectories(ariaHome) {
52
+ const arionsDir = path.join(ariaHome, "arions");
53
+ if (!fs.existsSync(arionsDir)) {
54
+ return [];
55
+ }
56
+ return fs
57
+ .readdirSync(arionsDir, { withFileTypes: true })
58
+ .filter((entry) => entry.isDirectory())
59
+ .map((entry) => path.join(arionsDir, entry.name));
60
+ }
61
+ function collectLiveOwnerProjectionPids(runtimeRoot) {
62
+ const ownersDir = path.join(runtimeRoot, "owners");
63
+ if (!fs.existsSync(ownersDir)) {
64
+ return [];
65
+ }
66
+ const pids = new Set();
67
+ for (const entry of fs.readdirSync(ownersDir)) {
68
+ if (!entry.endsWith(".json"))
69
+ continue;
70
+ try {
71
+ const raw = fs.readFileSync(path.join(ownersDir, entry), "utf8");
72
+ const parsed = JSON.parse(raw);
73
+ if (typeof parsed.runtimePid === "number" && isPidAlive(parsed.runtimePid)) {
74
+ pids.add(parsed.runtimePid);
75
+ }
76
+ }
77
+ catch {
78
+ // Ignore malformed stale projections — reset will remove them later.
79
+ }
80
+ }
81
+ return [...pids];
82
+ }
83
+ function collectLiveJsonPidFiles(root, matcher, pidExtractor) {
84
+ if (!fs.existsSync(root)) {
85
+ return [];
86
+ }
87
+ const pids = new Set();
88
+ for (const entry of fs.readdirSync(root)) {
89
+ if (!matcher(entry))
90
+ continue;
91
+ try {
92
+ const parsed = JSON.parse(fs.readFileSync(path.join(root, entry), "utf8"));
93
+ const pid = pidExtractor(parsed);
94
+ if (pid !== null && isPidAlive(pid)) {
95
+ pids.add(pid);
96
+ }
97
+ }
98
+ catch {
99
+ // Ignore malformed or stale artifacts; reset will remove them later.
100
+ }
101
+ }
102
+ return [...pids];
103
+ }
104
+ function collectLivePresencePids(machineDir) {
105
+ return collectLiveJsonPidFiles(machineDir, (entry) => entry.startsWith("presence-") && entry.endsWith(".json"), (parsed) => {
106
+ if (typeof parsed === "object" &&
107
+ parsed !== null &&
108
+ "pid" in parsed &&
109
+ typeof parsed.pid === "number") {
110
+ return parsed.pid;
111
+ }
112
+ return null;
113
+ });
114
+ }
115
+ function collectLiveNodeStoreOwnerPids(ariaHome) {
116
+ const dbPath = nodeStorePathForAriaHome(ariaHome);
117
+ if (!fs.existsSync(dbPath)) {
118
+ return [];
119
+ }
120
+ const db = openCompatSqliteDatabase({ path: dbPath });
121
+ try {
122
+ const rows = db
123
+ .prepare(`SELECT runtime_pid
124
+ FROM runtime_owner_records`)
125
+ .all();
126
+ return rows
127
+ .map((row) => row.runtime_pid)
128
+ .filter((pid) => Number.isFinite(pid) && isPidAlive(pid));
129
+ }
130
+ catch {
131
+ return [];
132
+ }
133
+ finally {
134
+ db.close();
135
+ }
136
+ }
137
+ function assertNoLiveRuntimeArtifacts(ariaHome, runtimeRoot) {
138
+ const machineDir = resolveMachineDirectory();
139
+ const presencePids = collectLivePresencePids(machineDir);
140
+ const ownerPids = collectLiveOwnerProjectionPids(runtimeRoot);
141
+ const nodeStoreOwnerPids = collectLiveNodeStoreOwnerPids(ariaHome);
142
+ const livePids = [...new Set([...presencePids, ...ownerPids, ...nodeStoreOwnerPids])];
143
+ if (livePids.length > 0) {
144
+ throw new Error(`[runtime-cutover-reset] refuse live runtime mutation while runtime is live (pids: ${livePids.join(", ")}). Stop all ARIA daemons/clients first.`);
145
+ }
146
+ }
147
+ function clearNodeStoreRuntimeState(ariaHome, report) {
148
+ const dbPath = nodeStorePathForAriaHome(ariaHome);
149
+ if (!fs.existsSync(dbPath)) {
150
+ return { runtimeOwnerRecords: 0, runtimeEvents: 0 };
151
+ }
152
+ const db = openCompatSqliteDatabase({ path: dbPath });
153
+ try {
154
+ const runtimeOwnerRecords = db.prepare(`DELETE FROM runtime_owner_records`).run().changes;
155
+ const runtimeEvents = db.prepare(`DELETE FROM runtime_events`).run().changes;
156
+ report.preservedPaths.push(dbPath);
157
+ return { runtimeOwnerRecords, runtimeEvents };
158
+ }
159
+ finally {
160
+ db.close();
161
+ }
162
+ }
163
+ function removeMachineArtifacts(ariaHome, report) {
164
+ const machineDir = resolveMachineDirectory();
165
+ removeIfExists(path.join(machineDir, "mesh-events.db"), report);
166
+ removeIfExists(path.join(machineDir, "mesh-events.db-wal"), report);
167
+ removeIfExists(path.join(machineDir, "mesh-events.db-shm"), report);
168
+ removeIfExists(path.join(machineDir, "event_queue"), report);
169
+ removeIfExists(path.join(machineDir, "event_queue.db"), report);
170
+ removeIfExists(path.join(machineDir, "event_queue.db-wal"), report);
171
+ removeIfExists(path.join(machineDir, "event_queue.db-shm"), report);
172
+ removeIfExists(path.join(resolveRuntimeRootDirectory(), "host-supervisor.sock"), report);
173
+ const cleanupRoots = [...new Set([machineDir, ariaHome])];
174
+ for (const root of cleanupRoots) {
175
+ if (!fs.existsSync(root)) {
176
+ continue;
177
+ }
178
+ for (const entry of fs.readdirSync(root)) {
179
+ const isDaemonInfo = entry.startsWith("daemon-info-") &&
180
+ (entry.endsWith(".json") || entry.endsWith(".json.lock"));
181
+ const isPresence = root === machineDir && entry.startsWith("presence-") && entry.endsWith(".json");
182
+ if (isDaemonInfo || isPresence) {
183
+ removeIfExists(path.join(root, entry), report);
184
+ }
185
+ }
186
+ }
187
+ }
188
+ function removeAriaHomeArtifacts(ariaHome, runtimeRoot, fullReset, report) {
189
+ removeDatabaseFamily(path.join(ariaHome, "network", "state.db"), report);
190
+ removeIfExists(path.join(ariaHome, "network", "trusted-cas"), report);
191
+ removeIfExists(path.join(ariaHome, "server-session-history.json"), report);
192
+ removeIfExists(path.join(ariaHome, "sessions"), report);
193
+ removeDatabaseFamily(path.join(ariaHome, "history.db"), report);
194
+ for (const arionDir of listArionDirectories(ariaHome)) {
195
+ removeDatabaseFamily(path.join(arionDir, "memory.db"), report);
196
+ removeDatabaseFamily(path.join(arionDir, "history.db"), report);
197
+ removeIfExists(path.join(arionDir, "daemon"), report);
198
+ removeIfExists(path.join(arionDir, "logs"), report);
199
+ }
200
+ removeIfExists(path.join(runtimeRoot, "owners"), report);
201
+ removeIfExists(runtimeSocketsDirectory(runtimeRoot), report);
202
+ if (fullReset) {
203
+ removeDatabaseFamily(nodeStorePathForAriaHome(ariaHome), report);
204
+ removeIfExists(nodeStoreLockPathForAriaHome(ariaHome), report);
205
+ removeIfExists(path.join(ariaHome, "network", "config.json"), report);
206
+ removeIfExists(path.join(ariaHome, "network", "tls"), report);
207
+ return { runtimeOwnerRecords: 0, runtimeEvents: 0 };
208
+ }
209
+ report.preservedPaths.push(path.join(ariaHome, "network", "config.json"));
210
+ report.preservedPaths.push(path.join(ariaHome, "network", "tls"));
211
+ return clearNodeStoreRuntimeState(ariaHome, report);
212
+ }
213
+ function writeReport(report) {
214
+ fs.mkdirSync(path.dirname(report.reportPath), { recursive: true });
215
+ fs.writeFileSync(report.reportPath, `${JSON.stringify(report, null, 2)}\n`, "utf8");
216
+ return report;
217
+ }
218
+ function printHumanReport(report) {
219
+ console.log("[runtime-cutover-reset] completed");
220
+ console.log(` ariaHome: ${report.ariaHome}`);
221
+ console.log(` fullReset: ${report.fullReset ? "yes" : "no"}`);
222
+ console.log(` preserveLocalNodeIdentity: ${report.preserveLocalNodeIdentity ? "yes" : "no"}`);
223
+ console.log(` deleted: ${report.deletedPaths.length}`);
224
+ console.log(` preserved: ${report.preservedPaths.length}`);
225
+ console.log(` cleared runtime owner records: ${report.cleared.runtimeOwnerRecords}`);
226
+ console.log(` cleared runtime journal events: ${report.cleared.runtimeEvents}`);
227
+ console.log(` report: ${report.reportPath}`);
228
+ }
229
+ export async function runRuntimeCutoverReset(options = {}) {
230
+ const ariaHome = canonicalizeAriaHome(options.ariaHome ?? getAriaDir());
231
+ const runtimeRoot = resolveRuntimeRootDirectory();
232
+ const fullNodeReset = options.fullNodeReset ?? options.fullReset ?? false;
233
+ const preserveLocalNodeIdentity = options.preserveLocalNodeIdentity ?? !fullNodeReset;
234
+ assertNoLiveRuntimeArtifacts(ariaHome, runtimeRoot);
235
+ const report = {
236
+ ariaHome,
237
+ runtimeRoot,
238
+ generatedAt: new Date().toISOString(),
239
+ fullReset: fullNodeReset,
240
+ fullNodeReset,
241
+ preserveLocalNodeIdentity,
242
+ reportPath: runtimeCutoverReportPath(ariaHome),
243
+ removedPaths: [],
244
+ deletedPaths: [],
245
+ preservedPaths: [],
246
+ skippedPaths: [],
247
+ cleared: {
248
+ runtimeOwnerRecords: 0,
249
+ runtimeEvents: 0,
250
+ },
251
+ };
252
+ removeMachineArtifacts(ariaHome, report);
253
+ report.cleared = removeAriaHomeArtifacts(ariaHome, runtimeRoot, fullNodeReset, report);
254
+ report.deletedPaths = [...report.removedPaths];
255
+ return writeReport(report);
256
+ }
257
+ export async function runtimeCutoverResetCommand(options = {}) {
258
+ const report = await runRuntimeCutoverReset(options);
259
+ if (options.json) {
260
+ console.log(JSON.stringify(report, null, 2));
261
+ return;
262
+ }
263
+ printHumanReport(report);
264
+ }
265
+ //# sourceMappingURL=runtime-cutover-reset.js.map
@@ -0,0 +1,84 @@
1
+ import { EOL, homedir, platform } from "os";
2
+ import { readFileSync, writeFileSync } from "fs";
3
+ import { join } from "path";
4
+ import { spawnSync } from "node:child_process";
5
+ import { loadConfig, saveConfig } from "../config.js";
6
+ export function isShiftEnterKeyBindingInstalled() {
7
+ return loadConfig().shiftEnterKeyBindingInstalled === true;
8
+ }
9
+ export function isTerminalSetupSupported() {
10
+ const term = (process.env.TERM_PROGRAM ?? "").toLowerCase();
11
+ return (platform() === "darwin" && term === "iterm.app") || term === "vscode";
12
+ }
13
+ function installBindingsForITerm2() {
14
+ // Keep implementation shell-free for safety/parity with existing CLI code style.
15
+ // iTerm2 reads this defaults key for GlobalKeyMap.
16
+ const result = spawnSync("defaults", [
17
+ "write",
18
+ "com.googlecode.iterm2",
19
+ "GlobalKeyMap",
20
+ "-dict-add",
21
+ "0xd-0x20000-0x24",
22
+ `<dict>
23
+ <key>Text</key>
24
+ <string>\\n</string>
25
+ <key>Action</key>
26
+ <integer>12</integer>
27
+ <key>Version</key>
28
+ <integer>1</integer>
29
+ <key>Keycode</key>
30
+ <integer>13</integer>
31
+ <key>Modifiers</key>
32
+ <integer>131072</integer>
33
+ </dict>`,
34
+ ]);
35
+ if (result.status !== 0) {
36
+ throw new Error("Failed to install iTerm2 Shift+Enter key binding");
37
+ }
38
+ return `Installed iTerm2 Shift+Enter key binding${EOL}See iTerm2 → Preferences → Keys${EOL}`;
39
+ }
40
+ function installBindingsForVSCodeTerminal() {
41
+ const vscodeKeybindingsPath = join(homedir(), platform() === "win32"
42
+ ? join("AppData", "Roaming", "Code", "User")
43
+ : platform() === "darwin"
44
+ ? join("Library", "Application Support", "Code", "User")
45
+ : join(".config", "Code", "User"), "keybindings.json");
46
+ let keybindings = [];
47
+ try {
48
+ const content = readFileSync(vscodeKeybindingsPath, "utf-8").trim();
49
+ keybindings = content ? JSON.parse(content) : [];
50
+ if (!Array.isArray(keybindings)) {
51
+ keybindings = [];
52
+ }
53
+ }
54
+ catch {
55
+ // If file doesn't exist or parse fails, start with empty array.
56
+ keybindings = [];
57
+ }
58
+ const existingBinding = keybindings.find((binding) => binding.key === "shift+enter" &&
59
+ binding.command === "workbench.action.terminal.sendSequence" &&
60
+ binding.when === "terminalFocus");
61
+ if (existingBinding) {
62
+ return `Found existing VSCode terminal Shift+Enter key binding. Remove it to continue.${EOL}See ${vscodeKeybindingsPath}${EOL}`;
63
+ }
64
+ keybindings.push({
65
+ key: "shift+enter",
66
+ command: "workbench.action.terminal.sendSequence",
67
+ args: { text: "\\\r\n" },
68
+ when: "terminalFocus",
69
+ });
70
+ writeFileSync(vscodeKeybindingsPath, JSON.stringify(keybindings, null, 2), "utf-8");
71
+ return `Installed VSCode terminal Shift+Enter key binding${EOL}See ${vscodeKeybindingsPath}${EOL}`;
72
+ }
73
+ export function runTerminalSetup() {
74
+ if (!isTerminalSetupSupported()) {
75
+ throw new Error("terminal-setup is supported only in iTerm2 (macOS) and VSCode terminal");
76
+ }
77
+ const term = (process.env.TERM_PROGRAM ?? "").toLowerCase();
78
+ const result = term === "vscode" ? installBindingsForVSCodeTerminal() : installBindingsForITerm2();
79
+ const config = loadConfig();
80
+ config.shiftEnterKeyBindingInstalled = true;
81
+ saveConfig(config);
82
+ return result;
83
+ }
84
+ //# sourceMappingURL=terminal-setup.js.map