@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,26 @@
1
+ import { RuntimeBootstrapRecordSchema } from "@aria-cli/tools";
2
+ export function selectBootstrapTlsIdentity(bootstrap) {
3
+ return bootstrap.tls.loopbackIdentity;
4
+ }
5
+ function isAttachableBootstrapPhase(phase) {
6
+ return phase === "control_ready" || phase === "network_ready" || phase === "mesh_ready";
7
+ }
8
+ export function assertAttachableRuntimeBootstrap(expectedNodeId, bootstrap) {
9
+ if (bootstrap.nodeId !== expectedNodeId) {
10
+ throw new Error(`[local-control-client] Runtime bootstrap node mismatch for ${expectedNodeId}: received ${bootstrap.nodeId}`);
11
+ }
12
+ if (!isAttachableBootstrapPhase(bootstrap.phase)) {
13
+ throw new Error(`[local-control-client] Runtime bootstrap for ${expectedNodeId} is not attachable (phase=${bootstrap.phase})`);
14
+ }
15
+ return bootstrap;
16
+ }
17
+ export async function loadControlReadyRuntimeBootstrap(bootstrapSource) {
18
+ const bootstrap = RuntimeBootstrapRecordSchema.parse(typeof bootstrapSource === "function" ? await bootstrapSource() : bootstrapSource);
19
+ if (bootstrap.phase !== "control_ready" &&
20
+ bootstrap.phase !== "network_ready" &&
21
+ bootstrap.phase !== "mesh_ready") {
22
+ throw new Error(`Runtime bootstrap is not control-ready: ${bootstrap.phase}${bootstrap.degradedReason ? ` (${bootstrap.degradedReason})` : ""}`);
23
+ }
24
+ return bootstrap;
25
+ }
26
+ //# sourceMappingURL=local-control-bootstrap.js.map
@@ -0,0 +1,2 @@
1
+ export { attachExistingLocalControlClient, attachLocalControlClient, createResilientAttachedClient, requestRuntimeSocketLease, resolveLocalControlClient, resolveLocalControlClientSync, } from "./attached-local-control-client.js";
2
+ //# sourceMappingURL=local-control-client.js.map
@@ -0,0 +1,34 @@
1
+ import { getAriaDir } from "./config.js";
2
+ let trustedLocalControlErrorHandler;
3
+ async function getTrustedLocalControlErrorHandler() {
4
+ const ariaDir = getAriaDir();
5
+ if (trustedLocalControlErrorHandler?.ariaDir === ariaDir) {
6
+ return trustedLocalControlErrorHandler.handler;
7
+ }
8
+ const { CentralErrorHandler } = await import("@aria-cli/aria/error-handler");
9
+ const handler = new CentralErrorHandler({ ariaDir });
10
+ trustedLocalControlErrorHandler = { ariaDir, handler };
11
+ return handler;
12
+ }
13
+ export async function reportTrustedLocalControlFailure(error, context) {
14
+ const handler = await getTrustedLocalControlErrorHandler();
15
+ await handler.report(error, {
16
+ workingDir: process.cwd(),
17
+ providerState: {
18
+ lastProvider: "trusted-local-control",
19
+ lastModel: context.endpoint,
20
+ ...(typeof context.responseStatus === "number"
21
+ ? { lastStatusCode: context.responseStatus }
22
+ : {}),
23
+ },
24
+ configSnapshot: {
25
+ transport: context.transport,
26
+ endpoint: context.endpoint,
27
+ ...(typeof context.responseStatus === "number"
28
+ ? { responseStatus: context.responseStatus }
29
+ : {}),
30
+ payload: context.payload,
31
+ },
32
+ });
33
+ }
34
+ //# sourceMappingURL=local-control-error-reporting.js.map
@@ -0,0 +1,362 @@
1
+ import { tlsFetch } from "@aria-cli/aria/server-discovery";
2
+ import { log } from "@aria-cli/types";
3
+ import { createTrustedRuntimeError, LOCAL_HTTP_CLIENT_ID_HEADER, LOCAL_HTTP_CLIENT_PROOF_HEADER, DirectPairRequestSchema, DirectPairResponseSchema, InboxAddressSchema, InboxListRequestSchema, InvitePeerRequestSchema, InvitePeerResultSchema, NearbyPeerViewSchema, OutboundMessageSchema, PairRequestDecisionSchema, PairRequestResponseSchema, PendingInviteViewSchema, PendingPairRequestViewSchema, PeerViewEventSchema, PersistedInboxEventSchema, RepairPeerRequestSchema, RepairPeerResponseSchema, RevokePeerRequestSchema, RevokePeerResponseSchema, ResumeRunRequestSchema, RunRequestSchema, RunResultSchema, RuntimeBootstrapRecordSchema, RuntimeDeliveryReceiptSchema, RuntimeQueuedReceiptSchema, RuntimeStatusSchema, AcceptInviteRequestSchema, AcceptInviteResponseSchema, AcceptInviteTokenRequestSchema, AcceptInviteTokenResponseSchema, CancelInviteRequestSchema, CancelInviteResponseSchema, CreateInviteRequestSchema, CreateInviteResponseSchema, } from "@aria-cli/tools";
4
+ import { createPollingSubscription } from "./polling-subscription.js";
5
+ import { loadControlReadyRuntimeBootstrap, selectBootstrapTlsIdentity, } from "./local-control-bootstrap.js";
6
+ import { reportTrustedLocalControlFailure } from "./local-control-error-reporting.js";
7
+ async function fetchLocalJson(endpoint, options) {
8
+ const bootstrap = await loadControlReadyRuntimeBootstrap(options.bootstrap);
9
+ const headers = {};
10
+ if (options.body) {
11
+ headers["Content-Type"] = "application/json";
12
+ }
13
+ if (options.attachedClientId) {
14
+ headers[LOCAL_HTTP_CLIENT_ID_HEADER] = options.attachedClientId;
15
+ }
16
+ if (options.attachedClientAuthToken) {
17
+ headers[LOCAL_HTTP_CLIENT_PROOF_HEADER] = options.attachedClientAuthToken;
18
+ }
19
+ const response = await tlsFetch(`https://127.0.0.1:${bootstrap.controlEndpoint.port}${endpoint}`, {
20
+ method: options.method,
21
+ body: options.body,
22
+ signal: options.signal,
23
+ headers: Object.keys(headers).length > 0 ? headers : undefined,
24
+ ca: bootstrap.tls.caCertPem,
25
+ expectedTlsIdentity: selectBootstrapTlsIdentity(bootstrap),
26
+ });
27
+ const payload = (await response.json());
28
+ if (!response.ok) {
29
+ const trustedError = createTrustedRuntimeError(payload.error ?? `HTTP ${response.status}`, payload.diagnostic);
30
+ // Propagate the reason sub-code for stale-lease detection
31
+ if (payload.reason) {
32
+ trustedError.reason = payload.reason;
33
+ }
34
+ await reportTrustedLocalControlFailure(trustedError, {
35
+ endpoint,
36
+ responseStatus: response.status,
37
+ payload,
38
+ transport: "https",
39
+ });
40
+ throw trustedError;
41
+ }
42
+ if (!options.parse) {
43
+ return payload;
44
+ }
45
+ try {
46
+ return options.parse(payload);
47
+ }
48
+ catch (error) {
49
+ const wrappedError = new Error(`[local-control-client] Invalid trusted local-control response for ${endpoint}: ${error instanceof Error ? error.message : String(error)}`, {
50
+ cause: error instanceof Error ? error : undefined,
51
+ });
52
+ log.error("[local-control-client] Invalid trusted local-control response", {
53
+ endpoint,
54
+ status: response.status,
55
+ payload,
56
+ }, error);
57
+ await reportTrustedLocalControlFailure(wrappedError, {
58
+ endpoint,
59
+ responseStatus: response.status,
60
+ payload,
61
+ transport: "https",
62
+ });
63
+ throw wrappedError;
64
+ }
65
+ }
66
+ function parsePersistedInboxEvent(message) {
67
+ return PersistedInboxEventSchema.parse({
68
+ id: message.id,
69
+ senderNodeId: message.sender_id,
70
+ senderDisplayNameSnapshot: message.sender_name,
71
+ senderType: message.sender_type,
72
+ inboxAddress: InboxAddressSchema.parse({
73
+ kind: message.inbox_address_kind,
74
+ ...(message.inbox_address_kind === "client"
75
+ ? {
76
+ clientId: message.inbox_address_id,
77
+ }
78
+ : {
79
+ nodeId: message.inbox_address_id,
80
+ }),
81
+ }),
82
+ type: message.type,
83
+ content: message.content,
84
+ priority: message.priority,
85
+ createdAt: message.created_at,
86
+ correlationId: message.correlation_id,
87
+ replyTo: message.reply_to,
88
+ });
89
+ }
90
+ function filterInboxByCursor(messages, request) {
91
+ return messages.filter((message) => typeof request?.cursor?.afterCreatedAt === "number"
92
+ ? message.createdAt >= request.cursor.afterCreatedAt
93
+ : true);
94
+ }
95
+ function createOneShotHandle(resultPromise) {
96
+ return {
97
+ runId: `run-local-${Date.now()}`,
98
+ wait: () => resultPromise,
99
+ };
100
+ }
101
+ export function createLocalControlClient(options) {
102
+ const pollIntervalMs = options.pollIntervalMs ?? 1_000;
103
+ const listInbox = async (request) => {
104
+ const parsedRequest = InboxListRequestSchema.optional().parse(request);
105
+ const limit = parsedRequest?.limit ?? 100;
106
+ const unreadOnly = parsedRequest?.unreadOnly ?? false;
107
+ const payload = await fetchLocalJson(`/api/v1/messages?limit=${limit}&unread=${unreadOnly ? "true" : "false"}`, {
108
+ bootstrap: options.bootstrap,
109
+ attachedClientId: options.attachedClientId,
110
+ attachedClientAuthToken: options.attachedClientAuthToken,
111
+ });
112
+ return filterInboxByCursor((payload.messages ?? []).map(parsePersistedInboxEvent), parsedRequest);
113
+ };
114
+ return {
115
+ async submitRun(request) {
116
+ const payload = RunRequestSchema.parse(request);
117
+ return createOneShotHandle(fetchLocalJson("/api/v1/run", {
118
+ method: "POST",
119
+ body: JSON.stringify(payload),
120
+ bootstrap: options.bootstrap,
121
+ attachedClientId: options.attachedClientId,
122
+ attachedClientAuthToken: options.attachedClientAuthToken,
123
+ parse: (raw) => RunResultSchema.parse(raw),
124
+ }));
125
+ },
126
+ async resumeRun(request) {
127
+ const payload = ResumeRunRequestSchema.parse(request);
128
+ return fetchLocalJson("/api/v1/resume", {
129
+ method: "POST",
130
+ body: JSON.stringify(payload),
131
+ bootstrap: options.bootstrap,
132
+ attachedClientId: options.attachedClientId,
133
+ attachedClientAuthToken: options.attachedClientAuthToken,
134
+ parse: (raw) => RunResultSchema.parse(raw),
135
+ });
136
+ },
137
+ async *streamRun(_request, _signal) {
138
+ throw new Error("Local control stream surface is only available through attached runtime sockets");
139
+ },
140
+ async *subscribeRuntimeEvents(_cursor) {
141
+ throw new Error("Local control runtime event surface is only available through attached runtime sockets");
142
+ },
143
+ async sendBestEffort(message) {
144
+ const payload = OutboundMessageSchema.parse(message);
145
+ return fetchLocalJson("/api/v1/message/relay", {
146
+ method: "POST",
147
+ body: JSON.stringify({
148
+ deliveryMode: "best_effort",
149
+ ...(payload.to ? { to: payload.to } : {}),
150
+ ...(payload.content ? { content: payload.content } : {}),
151
+ ...(payload.type ? { type: payload.type } : {}),
152
+ ...(typeof payload.priority === "number" ? { priority: payload.priority } : {}),
153
+ ...(payload.correlationId ? { correlationId: payload.correlationId } : {}),
154
+ ...(payload.metadata ? { metadata: payload.metadata } : {}),
155
+ _rawMessage: payload.rawMessage,
156
+ }),
157
+ bootstrap: options.bootstrap,
158
+ attachedClientId: options.attachedClientId,
159
+ attachedClientAuthToken: options.attachedClientAuthToken,
160
+ parse: (raw) => RuntimeQueuedReceiptSchema.parse(raw),
161
+ });
162
+ },
163
+ async sendDurable(message) {
164
+ const payload = OutboundMessageSchema.parse(message);
165
+ return fetchLocalJson("/api/v1/message/relay", {
166
+ method: "POST",
167
+ body: JSON.stringify({
168
+ deliveryMode: "durable",
169
+ ...(payload.to ? { to: payload.to } : {}),
170
+ ...(payload.content ? { content: payload.content } : {}),
171
+ ...(payload.type ? { type: payload.type } : {}),
172
+ ...(typeof payload.priority === "number" ? { priority: payload.priority } : {}),
173
+ ...(payload.correlationId ? { correlationId: payload.correlationId } : {}),
174
+ ...(payload.metadata ? { metadata: payload.metadata } : {}),
175
+ _rawMessage: payload.rawMessage,
176
+ }),
177
+ bootstrap: options.bootstrap,
178
+ attachedClientId: options.attachedClientId,
179
+ attachedClientAuthToken: options.attachedClientAuthToken,
180
+ parse: (raw) => RuntimeDeliveryReceiptSchema.parse(raw),
181
+ });
182
+ },
183
+ listInbox,
184
+ subscribeInbox(cursor) {
185
+ return createPollingSubscription(() => listInbox({ limit: 100, unreadOnly: false }), {
186
+ pollIntervalMs,
187
+ initialAfterCreatedAt: cursor?.afterCreatedAt ?? 0,
188
+ getIdentityKey: (message) => message.id,
189
+ getCursor: (message) => message.createdAt,
190
+ });
191
+ },
192
+ async listPeers() {
193
+ const payload = await fetchLocalJson("/api/v1/local-control/peers", {
194
+ bootstrap: options.bootstrap,
195
+ attachedClientId: options.attachedClientId,
196
+ attachedClientAuthToken: options.attachedClientAuthToken,
197
+ });
198
+ return (payload.peers ?? []).map((peer) => PeerViewEventSchema.parse(peer));
199
+ },
200
+ async listNearbyPeers() {
201
+ const payload = await fetchLocalJson("/api/v1/local-control/nearby-peers", {
202
+ bootstrap: options.bootstrap,
203
+ attachedClientId: options.attachedClientId,
204
+ attachedClientAuthToken: options.attachedClientAuthToken,
205
+ });
206
+ return (payload.peers ?? []).map((peer) => NearbyPeerViewSchema.parse(peer));
207
+ },
208
+ subscribePeers() {
209
+ return createPollingSubscription(async () => {
210
+ const payload = await fetchLocalJson("/api/v1/local-control/peers", {
211
+ bootstrap: options.bootstrap,
212
+ attachedClientId: options.attachedClientId,
213
+ attachedClientAuthToken: options.attachedClientAuthToken,
214
+ });
215
+ return (payload.peers ?? []).map((peer) => PeerViewEventSchema.parse(peer));
216
+ }, {
217
+ pollIntervalMs,
218
+ getIdentityKey: (peer) => peer.nodeId,
219
+ getVersionKey: (peer) => [
220
+ peer.updatedAt,
221
+ peer.endpointRevision,
222
+ peer.identityState,
223
+ peer.transportState,
224
+ peer.lastSeenAt ?? "",
225
+ peer.transportPublicKey,
226
+ peer.displayNameSnapshot ?? "",
227
+ ].join("|"),
228
+ });
229
+ },
230
+ async getRuntimeStatus() {
231
+ return fetchLocalJson("/api/v1/local-control/runtime-status", {
232
+ bootstrap: options.bootstrap,
233
+ attachedClientId: options.attachedClientId,
234
+ attachedClientAuthToken: options.attachedClientAuthToken,
235
+ parse: (raw) => RuntimeStatusSchema.parse(raw),
236
+ });
237
+ },
238
+ async getRuntimeBootstrap() {
239
+ return fetchLocalJson("/api/v1/runtime/bootstrap", {
240
+ bootstrap: options.bootstrap,
241
+ parse: (raw) => RuntimeBootstrapRecordSchema.parse(raw),
242
+ });
243
+ },
244
+ async listPendingPairRequests() {
245
+ const payload = await fetchLocalJson("/api/v1/local-control/pending-pair-requests", {
246
+ bootstrap: options.bootstrap,
247
+ attachedClientId: options.attachedClientId,
248
+ attachedClientAuthToken: options.attachedClientAuthToken,
249
+ });
250
+ return (payload.requests ?? []).map((request) => PendingPairRequestViewSchema.parse(request));
251
+ },
252
+ async respondToPairRequest(input) {
253
+ return fetchLocalJson("/api/v1/local-control/respond-pair-request", {
254
+ method: "POST",
255
+ body: JSON.stringify(PairRequestDecisionSchema.parse(input)),
256
+ bootstrap: options.bootstrap,
257
+ attachedClientId: options.attachedClientId,
258
+ attachedClientAuthToken: options.attachedClientAuthToken,
259
+ parse: (raw) => PairRequestResponseSchema.parse(raw),
260
+ });
261
+ },
262
+ async createInvite(input) {
263
+ return fetchLocalJson("/api/v1/local-control/invites", {
264
+ method: "POST",
265
+ body: JSON.stringify(CreateInviteRequestSchema.parse(input)),
266
+ bootstrap: options.bootstrap,
267
+ attachedClientId: options.attachedClientId,
268
+ attachedClientAuthToken: options.attachedClientAuthToken,
269
+ parse: (raw) => CreateInviteResponseSchema.parse(raw),
270
+ });
271
+ },
272
+ async listPendingInvites() {
273
+ const payload = await fetchLocalJson("/api/v1/local-control/invites", {
274
+ bootstrap: options.bootstrap,
275
+ attachedClientId: options.attachedClientId,
276
+ attachedClientAuthToken: options.attachedClientAuthToken,
277
+ });
278
+ return (payload.invites ?? []).map((invite) => PendingInviteViewSchema.parse(invite));
279
+ },
280
+ async acceptInviteToken(input) {
281
+ return fetchLocalJson("/api/v1/local-control/accept-invite-token", {
282
+ method: "POST",
283
+ body: JSON.stringify(AcceptInviteTokenRequestSchema.parse(input)),
284
+ bootstrap: options.bootstrap,
285
+ attachedClientId: options.attachedClientId,
286
+ attachedClientAuthToken: options.attachedClientAuthToken,
287
+ parse: (raw) => AcceptInviteTokenResponseSchema.parse(raw),
288
+ });
289
+ },
290
+ async cancelInvite(input) {
291
+ return fetchLocalJson("/api/v1/local-control/cancel-invite", {
292
+ method: "POST",
293
+ body: JSON.stringify(CancelInviteRequestSchema.parse(input)),
294
+ bootstrap: options.bootstrap,
295
+ attachedClientId: options.attachedClientId,
296
+ attachedClientAuthToken: options.attachedClientAuthToken,
297
+ parse: (raw) => CancelInviteResponseSchema.parse(raw),
298
+ });
299
+ },
300
+ async invitePeer(input) {
301
+ return fetchLocalJson("/api/v1/local-control/peer-invite", {
302
+ method: "POST",
303
+ body: JSON.stringify(InvitePeerRequestSchema.parse(input)),
304
+ bootstrap: options.bootstrap,
305
+ attachedClientId: options.attachedClientId,
306
+ attachedClientAuthToken: options.attachedClientAuthToken,
307
+ parse: (raw) => InvitePeerResultSchema.parse(raw),
308
+ });
309
+ },
310
+ async acceptInvite(input) {
311
+ return fetchLocalJson("/api/v1/local-control/accept-invite", {
312
+ method: "POST",
313
+ body: JSON.stringify(AcceptInviteRequestSchema.parse(input)),
314
+ bootstrap: options.bootstrap,
315
+ attachedClientId: options.attachedClientId,
316
+ attachedClientAuthToken: options.attachedClientAuthToken,
317
+ parse: (raw) => AcceptInviteResponseSchema.parse(raw),
318
+ });
319
+ },
320
+ async directPair(input) {
321
+ return fetchLocalJson("/api/v1/local-control/direct-pair", {
322
+ method: "POST",
323
+ body: JSON.stringify(DirectPairRequestSchema.parse(input)),
324
+ bootstrap: options.bootstrap,
325
+ attachedClientId: options.attachedClientId,
326
+ attachedClientAuthToken: options.attachedClientAuthToken,
327
+ parse: (raw) => DirectPairResponseSchema.parse(raw),
328
+ });
329
+ },
330
+ async revokePeer(input) {
331
+ return fetchLocalJson("/api/v1/local-control/revoke-peer", {
332
+ method: "POST",
333
+ body: JSON.stringify(RevokePeerRequestSchema.parse(input)),
334
+ bootstrap: options.bootstrap,
335
+ attachedClientId: options.attachedClientId,
336
+ attachedClientAuthToken: options.attachedClientAuthToken,
337
+ parse: (raw) => RevokePeerResponseSchema.parse(raw),
338
+ });
339
+ },
340
+ async repairPeer(input) {
341
+ return fetchLocalJson("/api/v1/local-control/repair-peer", {
342
+ method: "POST",
343
+ body: JSON.stringify(RepairPeerRequestSchema.parse(input)),
344
+ bootstrap: options.bootstrap,
345
+ attachedClientId: options.attachedClientId,
346
+ attachedClientAuthToken: options.attachedClientAuthToken,
347
+ parse: (raw) => RepairPeerResponseSchema.parse(raw),
348
+ });
349
+ },
350
+ async appendSessionMessages(_sessionId, _messages) {
351
+ // HTTP bootstrap clients do not own the attached IPC session writer surface.
352
+ },
353
+ async markSessionCompleted(_sessionId) {
354
+ // HTTP bootstrap clients do not own the attached IPC session writer surface.
355
+ },
356
+ async replaceSessionMessages(_sessionId, _messages) {
357
+ // HTTP bootstrap clients do not own the attached IPC session writer surface.
358
+ },
359
+ };
360
+ }
361
+ export { assertAttachableRuntimeBootstrap, } from "./local-control-bootstrap.js";
362
+ //# sourceMappingURL=local-control-http-client.js.map