@songsid/agend 2.3.5-alpha.5 → 2.3.5-beta.1

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 (976) hide show
  1. package/README.md +0 -2
  2. package/README.zh-TW.md +0 -2
  3. package/THIRD_PARTY_NOTICES.md +0 -68
  4. package/dist/agent-endpoint.d.ts +1 -5
  5. package/dist/agent-endpoint.js +2 -12
  6. package/dist/agent-endpoint.js.map +1 -1
  7. package/dist/agent-file-read.js +1 -1
  8. package/dist/agent-file-read.js.map +1 -1
  9. package/dist/auth-api.d.ts +0 -48
  10. package/dist/auth-api.js +4 -250
  11. package/dist/auth-api.js.map +1 -1
  12. package/dist/authority/session-authorizations.d.ts +2 -0
  13. package/dist/authority/session-authorizations.js +7 -1
  14. package/dist/authority/session-authorizations.js.map +1 -1
  15. package/dist/authority/web-authority.d.ts +2 -12
  16. package/dist/authority/web-authority.js +4 -25
  17. package/dist/authority/web-authority.js.map +1 -1
  18. package/dist/backend/claude-code.d.ts +12 -15
  19. package/dist/backend/claude-code.js +133 -152
  20. package/dist/backend/claude-code.js.map +1 -1
  21. package/dist/backend/codex-footer-hints.d.ts +0 -3
  22. package/dist/backend/codex-footer-hints.js +0 -14
  23. package/dist/backend/codex-footer-hints.js.map +1 -1
  24. package/dist/backend/codex-package.d.ts +2 -5
  25. package/dist/backend/codex-package.js +5 -1
  26. package/dist/backend/codex-package.js.map +1 -1
  27. package/dist/backend/codex-quota-history.js +19 -4
  28. package/dist/backend/codex-quota-history.js.map +1 -1
  29. package/dist/backend/codex.d.ts +115 -142
  30. package/dist/backend/codex.js +1094 -1187
  31. package/dist/backend/codex.js.map +1 -1
  32. package/dist/backend/grok.d.ts +0 -2
  33. package/dist/backend/grok.js +0 -22
  34. package/dist/backend/grok.js.map +1 -1
  35. package/dist/backend/types.d.ts +2 -7
  36. package/dist/backend/types.js.map +1 -1
  37. package/dist/bundled-tmux-guard.d.ts +21 -0
  38. package/dist/bundled-tmux-guard.js +96 -0
  39. package/dist/bundled-tmux-guard.js.map +1 -0
  40. package/dist/channel/ipc-bridge.d.ts +0 -2
  41. package/dist/channel/mcp-tools.js +2 -2
  42. package/dist/channel/mcp-tools.js.map +1 -1
  43. package/dist/classic-channel-manager.d.ts +2 -0
  44. package/dist/classic-channel-manager.js +5 -1
  45. package/dist/classic-channel-manager.js.map +1 -1
  46. package/dist/cli.js +30 -127
  47. package/dist/cli.js.map +1 -1
  48. package/dist/config-validator.js +13 -74
  49. package/dist/config-validator.js.map +1 -1
  50. package/dist/config.js +3 -17
  51. package/dist/config.js.map +1 -1
  52. package/dist/daemon.d.ts +5 -72
  53. package/dist/daemon.js +275 -869
  54. package/dist/daemon.js.map +1 -1
  55. package/dist/delivery-consumed-watch.d.ts +3 -15
  56. package/dist/delivery-consumed-watch.js +1 -23
  57. package/dist/delivery-consumed-watch.js.map +1 -1
  58. package/dist/delivery-outbox.d.ts +0 -5
  59. package/dist/delivery-outbox.js +4 -32
  60. package/dist/delivery-outbox.js.map +1 -1
  61. package/dist/delivery-reconciliation.d.ts +42 -2
  62. package/dist/delivery-reconciliation.js +164 -2
  63. package/dist/delivery-reconciliation.js.map +1 -1
  64. package/dist/doctor.js +9 -20
  65. package/dist/doctor.js.map +1 -1
  66. package/dist/fleet-context.d.ts +2 -2
  67. package/dist/fleet-level-config.d.ts +1 -1
  68. package/dist/fleet-level-config.js +0 -2
  69. package/dist/fleet-level-config.js.map +1 -1
  70. package/dist/fleet-manager.d.ts +9 -498
  71. package/dist/fleet-manager.js +202 -2849
  72. package/dist/fleet-manager.js.map +1 -1
  73. package/dist/general-instance.d.ts +0 -7
  74. package/dist/general-instance.js +3 -20
  75. package/dist/general-instance.js.map +1 -1
  76. package/dist/general-knowledge/skills/concepts/SKILL.md +18 -50
  77. package/dist/general-knowledge/skills/credential-profiles/SKILL.md +2 -5
  78. package/dist/general-knowledge/skills/fleet-health/SKILL.md +2 -2
  79. package/dist/general-knowledge/skills/session-management/SKILL.md +1 -1
  80. package/dist/general-knowledge/skills/tui-effort/SKILL.md +10 -10
  81. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +13 -23
  82. package/dist/instance-config-impact.js +4 -8
  83. package/dist/instance-config-impact.js.map +1 -1
  84. package/dist/instance-lifecycle.d.ts +3 -22
  85. package/dist/instance-lifecycle.js +176 -393
  86. package/dist/instance-lifecycle.js.map +1 -1
  87. package/dist/instructions.d.ts +0 -2
  88. package/dist/instructions.js +0 -6
  89. package/dist/instructions.js.map +1 -1
  90. package/dist/locale.js +2 -147
  91. package/dist/locale.js.map +1 -1
  92. package/dist/login-flows.d.ts +7 -8
  93. package/dist/login-flows.js +1 -24
  94. package/dist/login-flows.js.map +1 -1
  95. package/dist/ls-rows.js +4 -3
  96. package/dist/ls-rows.js.map +1 -1
  97. package/dist/muse-usage-relay.d.ts +2 -0
  98. package/dist/muse-usage-relay.js +5 -3
  99. package/dist/muse-usage-relay.js.map +1 -1
  100. package/dist/needs-you-hub.d.ts +0 -5
  101. package/dist/needs-you-hub.js +2 -18
  102. package/dist/needs-you-hub.js.map +1 -1
  103. package/dist/needs-you.d.ts +2 -45
  104. package/dist/needs-you.js +2 -26
  105. package/dist/needs-you.js.map +1 -1
  106. package/dist/office-share-page.js +3 -3
  107. package/dist/office-share-page.js.map +1 -1
  108. package/dist/office-share.d.ts +0 -11
  109. package/dist/office-share.js +0 -14
  110. package/dist/office-share.js.map +1 -1
  111. package/dist/outbound-handlers.d.ts +2 -30
  112. package/dist/outbound-handlers.js +4 -109
  113. package/dist/outbound-handlers.js.map +1 -1
  114. package/dist/outbound-schemas.d.ts +1 -71
  115. package/dist/outbound-schemas.js +14 -36
  116. package/dist/outbound-schemas.js.map +1 -1
  117. package/dist/pane-quota-history.d.ts +0 -2
  118. package/dist/pane-quota-history.js +0 -20
  119. package/dist/pane-quota-history.js.map +1 -1
  120. package/dist/pause-marker.d.ts +1 -1
  121. package/dist/pause-marker.js +1 -1
  122. package/dist/pause-marker.js.map +1 -1
  123. package/dist/public-web-gateway.js +0 -16
  124. package/dist/public-web-gateway.js.map +1 -1
  125. package/dist/public-web-link.d.ts +0 -11
  126. package/dist/public-web-link.js +0 -13
  127. package/dist/public-web-link.js.map +1 -1
  128. package/dist/quickstart-api.js +5 -9
  129. package/dist/quickstart-api.js.map +1 -1
  130. package/dist/quickstart.d.ts +0 -6
  131. package/dist/quickstart.js +6 -44
  132. package/dist/quickstart.js.map +1 -1
  133. package/dist/quota-notice-config.d.ts +22 -0
  134. package/dist/quota-notice-config.js +41 -0
  135. package/dist/quota-notice-config.js.map +1 -0
  136. package/dist/scheduler/task-board-text.js +1 -1
  137. package/dist/scheduler/task-board-text.js.map +1 -1
  138. package/dist/scheduler/task-board.d.ts +0 -4
  139. package/dist/scheduler/task-board.js +3 -9
  140. package/dist/scheduler/task-board.js.map +1 -1
  141. package/dist/service-installer.d.ts +2 -7
  142. package/dist/service-installer.js +10 -13
  143. package/dist/service-installer.js.map +1 -1
  144. package/dist/settings-api.d.ts +0 -12
  145. package/dist/settings-api.js +7 -487
  146. package/dist/settings-api.js.map +1 -1
  147. package/dist/settings-baseline.d.ts +0 -7
  148. package/dist/settings-baseline.js +1 -3
  149. package/dist/settings-baseline.js.map +1 -1
  150. package/dist/settings-change.js +7 -35
  151. package/dist/settings-change.js.map +1 -1
  152. package/dist/settings-confirmation.d.ts +1 -16
  153. package/dist/settings-confirmation.js +9 -47
  154. package/dist/settings-confirmation.js.map +1 -1
  155. package/dist/settings-effect.d.ts +0 -17
  156. package/dist/settings-effect.js +1 -155
  157. package/dist/settings-effect.js.map +1 -1
  158. package/dist/settings-http-confirmation.d.ts +0 -4
  159. package/dist/settings-http-confirmation.js +3 -43
  160. package/dist/settings-http-confirmation.js.map +1 -1
  161. package/dist/settings-instance-patch.js +1 -1
  162. package/dist/settings-instance-patch.js.map +1 -1
  163. package/dist/settings-request-capability.d.ts +0 -2
  164. package/dist/settings-request-capability.js +0 -4
  165. package/dist/settings-request-capability.js.map +1 -1
  166. package/dist/settings-transaction.d.ts +0 -4
  167. package/dist/settings-transaction.js +0 -9
  168. package/dist/settings-transaction.js.map +1 -1
  169. package/dist/setup-form.js +3 -6
  170. package/dist/setup-form.js.map +1 -1
  171. package/dist/setup-i18n.js +0 -3
  172. package/dist/setup-i18n.js.map +1 -1
  173. package/dist/setup-wizard.js +2 -6
  174. package/dist/setup-wizard.js.map +1 -1
  175. package/dist/task-board-tool.d.ts +1 -2
  176. package/dist/task-board-tool.js +6 -62
  177. package/dist/task-board-tool.js.map +1 -1
  178. package/dist/tmux-control.d.ts +1 -2
  179. package/dist/tmux-control.js +4 -4
  180. package/dist/tmux-control.js.map +1 -1
  181. package/dist/tmux-exec-helper.js +1 -32
  182. package/dist/tmux-exec-helper.js.map +1 -1
  183. package/dist/tmux-manager.d.ts +2 -3
  184. package/dist/tmux-manager.js +36 -45
  185. package/dist/tmux-manager.js.map +1 -1
  186. package/dist/tmux-read.js +3 -4
  187. package/dist/tmux-read.js.map +1 -1
  188. package/dist/tool-permissions.js +1 -2
  189. package/dist/tool-permissions.js.map +1 -1
  190. package/dist/topic-commands.js +5 -9
  191. package/dist/topic-commands.js.map +1 -1
  192. package/dist/transcript-delta-reader.d.ts +1 -1
  193. package/dist/transcript-delta-reader.js +1 -1
  194. package/dist/transcript-delta-reader.js.map +1 -1
  195. package/dist/transcript-monitor.d.ts +0 -3
  196. package/dist/transcript-monitor.js +51 -27
  197. package/dist/transcript-monitor.js.map +1 -1
  198. package/dist/transcript-sources.d.ts +0 -5
  199. package/dist/transcript-sources.js +79 -8
  200. package/dist/transcript-sources.js.map +1 -1
  201. package/dist/types.d.ts +3 -29
  202. package/dist/ui/app.html +8 -1
  203. package/dist/ui/backend-signin.js +21 -39
  204. package/dist/ui/chat-ambient.js +1 -1
  205. package/dist/ui/chat-md-strings.js +9 -3
  206. package/dist/ui/chat-render.js +670 -3
  207. package/dist/ui/chat-store.js +3 -14
  208. package/dist/ui/chat-strings.js +285 -3
  209. package/dist/ui/chat-thread.js +969 -3
  210. package/dist/ui/chat-time.js +80 -3
  211. package/dist/ui/chat-tour.js +1 -1
  212. package/dist/ui/fleet-office-pack.d.ts +0 -9
  213. package/dist/ui/fleet-office-pack.js +4 -76
  214. package/dist/ui/fleet-office-skin.js +5 -23
  215. package/dist/ui/fleet-office-store.js +0 -5
  216. package/dist/ui/fleet-office.js +6 -173
  217. package/dist/ui/fleet-task-card.js +4 -8
  218. package/dist/ui/fleet-task-common.js +2 -2
  219. package/dist/ui/fleet-tasks.js +39 -125
  220. package/dist/ui/html-attachment.js +40 -3
  221. package/dist/ui/office-share-page.js +2 -4
  222. package/dist/ui/panel-chat.js +75 -90
  223. package/dist/ui/panel-details.js +2 -3
  224. package/dist/ui/panel-fleet.js +18 -105
  225. package/dist/ui/panel-log.js +2 -2
  226. package/dist/ui/panel-needs.js +4 -162
  227. package/dist/ui/panel-notices.js +4 -3
  228. package/dist/ui/panel-settings.js +202 -281
  229. package/dist/ui/preview-pages.js +1 -1
  230. package/dist/ui/preview-panel.js +13 -21
  231. package/dist/ui/preview-versions.js +1 -1
  232. package/dist/ui/preview.js +476 -3
  233. package/dist/ui/search-dialog.js +3 -4
  234. package/dist/ui/settings-appearance.js +23 -122
  235. package/dist/ui/settings-catalog.js +10 -37
  236. package/dist/ui/settings-confirm.js +1 -3
  237. package/dist/ui/settings-dialogs.js +20 -48
  238. package/dist/ui/settings-guests.js +14 -27
  239. package/dist/ui/settings-model.js +1 -10
  240. package/dist/ui/settings-quota-notice.js +100 -0
  241. package/dist/ui/settings-registry.js +5 -15
  242. package/dist/ui/settings-strings.js +32 -105
  243. package/dist/ui/settings-web-authority.js +13 -18
  244. package/dist/ui/shared/app-i18n.js +2 -2
  245. package/dist/ui/shared/app-route.js +3 -12
  246. package/dist/ui/shared/app-session.js +2 -6
  247. package/dist/ui/shared/app-shell.js +26 -87
  248. package/dist/ui/shared/app-store.js +2 -3
  249. package/dist/ui/shared/app-stream.js +1 -3
  250. package/dist/ui/shared/app.css +5 -1368
  251. package/dist/ui/shared/app.js +5 -17
  252. package/dist/ui/shared/header-tools.js +9 -9
  253. package/dist/ui/shared/instance-nav.js +7 -34
  254. package/dist/ui/shared/instance-switch.js +3 -4
  255. package/dist/ui/shared/loading.css +37 -0
  256. package/dist/ui/shared/signin.js +6 -211
  257. package/dist/ui/shared/tokens.css +0 -1
  258. package/dist/ui/shared/ui-dialog.js +2 -2
  259. package/dist/ui/shared/ui-menu.js +10 -30
  260. package/dist/ui/shared/ui-states.js +14 -3
  261. package/dist/ui/shared/vendor/vendor.json +2 -19
  262. package/dist/ui/shared/view-strings.js +0 -8
  263. package/dist/ui/signin.html +5 -23
  264. package/dist/unattended-install.js +1 -2
  265. package/dist/unattended-install.js.map +1 -1
  266. package/dist/usage/providers.d.ts +5 -0
  267. package/dist/usage/providers.js +6 -2
  268. package/dist/usage/providers.js.map +1 -1
  269. package/dist/usage/quota-notices.d.ts +38 -0
  270. package/dist/usage/quota-notices.js +160 -0
  271. package/dist/usage/quota-notices.js.map +1 -0
  272. package/dist/usage/usage-api.d.ts +1 -0
  273. package/dist/usage/usage-api.js +16 -0
  274. package/dist/usage/usage-api.js.map +1 -1
  275. package/dist/view-api.js +7 -5
  276. package/dist/view-api.js.map +1 -1
  277. package/dist/web-api.d.ts +2 -80
  278. package/dist/web-api.js +10 -513
  279. package/dist/web-api.js.map +1 -1
  280. package/dist/web-backend-login.d.ts +1 -23
  281. package/dist/web-backend-login.js +17 -11
  282. package/dist/web-backend-login.js.map +1 -1
  283. package/dist/web-chat-history.d.ts +2 -19
  284. package/dist/web-chat-history.js +3 -72
  285. package/dist/web-chat-history.js.map +1 -1
  286. package/dist/web-office-skins.d.ts +0 -9
  287. package/dist/web-office-skins.js +1 -16
  288. package/dist/web-office-skins.js.map +1 -1
  289. package/dist/web-only-fleet.d.ts +0 -20
  290. package/dist/web-only-fleet.js +0 -21
  291. package/dist/web-only-fleet.js.map +1 -1
  292. package/dist/web-session.d.ts +0 -42
  293. package/dist/web-session.js +0 -9
  294. package/dist/web-session.js.map +1 -1
  295. package/dist/web-settings-patch.d.ts +1 -3
  296. package/dist/web-settings-patch.js +1 -4
  297. package/dist/web-settings-patch.js.map +1 -1
  298. package/dist/web-shell-routes.d.ts +1 -10
  299. package/dist/web-shell-routes.js +2 -14
  300. package/dist/web-shell-routes.js.map +1 -1
  301. package/dist/web-terminal.d.ts +30 -4
  302. package/dist/web-terminal.js +6 -9
  303. package/dist/web-terminal.js.map +1 -1
  304. package/dist/yaml-shared-nodes.js +3 -8
  305. package/dist/yaml-shared-nodes.js.map +1 -1
  306. package/launcher/agend-install.cjs +1 -8
  307. package/launcher/postinstall.cjs +2 -27
  308. package/package.json +3 -10
  309. package/templates/launchd.plist.ejs +1 -3
  310. package/dist/accounts-view.d.ts +0 -97
  311. package/dist/accounts-view.js +0 -116
  312. package/dist/accounts-view.js.map +0 -1
  313. package/dist/agent-runtime-api.d.ts +0 -4
  314. package/dist/agent-runtime-api.js +0 -59
  315. package/dist/agent-runtime-api.js.map +0 -1
  316. package/dist/agent-runtime-change.d.ts +0 -76
  317. package/dist/agent-runtime-change.js +0 -114
  318. package/dist/agent-runtime-change.js.map +0 -1
  319. package/dist/agent-workspace.d.ts +0 -93
  320. package/dist/agent-workspace.js +0 -353
  321. package/dist/agent-workspace.js.map +0 -1
  322. package/dist/backend/grok-model-cache.d.ts +0 -7
  323. package/dist/backend/grok-model-cache.js +0 -65
  324. package/dist/backend/grok-model-cache.js.map +0 -1
  325. package/dist/backend/native-pane.d.ts +0 -11
  326. package/dist/backend/native-pane.js +0 -59
  327. package/dist/backend/native-pane.js.map +0 -1
  328. package/dist/build-provenance-cli.d.ts +0 -3
  329. package/dist/build-provenance-cli.js +0 -11
  330. package/dist/build-provenance-cli.js.map +0 -1
  331. package/dist/build-provenance.d.ts +0 -20
  332. package/dist/build-provenance.js +0 -67
  333. package/dist/build-provenance.js.map +0 -1
  334. package/dist/build-provenance.json +0 -1
  335. package/dist/claude-auth-status.d.ts +0 -48
  336. package/dist/claude-auth-status.js +0 -149
  337. package/dist/claude-auth-status.js.map +0 -1
  338. package/dist/fleet-windows-runtime.d.ts +0 -98
  339. package/dist/fleet-windows-runtime.js +0 -467
  340. package/dist/fleet-windows-runtime.js.map +0 -1
  341. package/dist/general-binding.d.ts +0 -85
  342. package/dist/general-binding.js +0 -298
  343. package/dist/general-binding.js.map +0 -1
  344. package/dist/general-host-owner.d.ts +0 -8
  345. package/dist/general-host-owner.js +0 -26
  346. package/dist/general-host-owner.js.map +0 -1
  347. package/dist/general-role.d.ts +0 -5
  348. package/dist/general-role.js +0 -27
  349. package/dist/general-role.js.map +0 -1
  350. package/dist/hub/admission.d.ts +0 -28
  351. package/dist/hub/admission.js +0 -62
  352. package/dist/hub/admission.js.map +0 -1
  353. package/dist/hub/attachments/limits.d.ts +0 -20
  354. package/dist/hub/attachments/limits.js +0 -48
  355. package/dist/hub/attachments/limits.js.map +0 -1
  356. package/dist/hub/attachments/store.d.ts +0 -116
  357. package/dist/hub/attachments/store.js +0 -246
  358. package/dist/hub/attachments/store.js.map +0 -1
  359. package/dist/hub/audit/index.d.ts +0 -62
  360. package/dist/hub/audit/index.js +0 -344
  361. package/dist/hub/audit/index.js.map +0 -1
  362. package/dist/hub/browser-certificate.d.ts +0 -38
  363. package/dist/hub/browser-certificate.js +0 -247
  364. package/dist/hub/browser-certificate.js.map +0 -1
  365. package/dist/hub/buttons-model.d.ts +0 -9
  366. package/dist/hub/buttons-model.js +0 -42
  367. package/dist/hub/buttons-model.js.map +0 -1
  368. package/dist/hub/buttons.d.ts +0 -54
  369. package/dist/hub/buttons.js +0 -346
  370. package/dist/hub/buttons.js.map +0 -1
  371. package/dist/hub/catalog.d.ts +0 -74
  372. package/dist/hub/catalog.js +0 -195
  373. package/dist/hub/catalog.js.map +0 -1
  374. package/dist/hub/client.d.ts +0 -69
  375. package/dist/hub/client.js +0 -300
  376. package/dist/hub/client.js.map +0 -1
  377. package/dist/hub/compose/member.d.ts +0 -139
  378. package/dist/hub/compose/member.js +0 -450
  379. package/dist/hub/compose/member.js.map +0 -1
  380. package/dist/hub/compose/server.d.ts +0 -77
  381. package/dist/hub/compose/server.js +0 -349
  382. package/dist/hub/compose/server.js.map +0 -1
  383. package/dist/hub/compose/views.d.ts +0 -12
  384. package/dist/hub/compose/views.js +0 -4
  385. package/dist/hub/compose/views.js.map +0 -1
  386. package/dist/hub/db.d.ts +0 -56
  387. package/dist/hub/db.js +0 -188
  388. package/dist/hub/db.js.map +0 -1
  389. package/dist/hub/directory/config.d.ts +0 -39
  390. package/dist/hub/directory/config.js +0 -108
  391. package/dist/hub/directory/config.js.map +0 -1
  392. package/dist/hub/directory/directory.d.ts +0 -18
  393. package/dist/hub/directory/directory.js +0 -320
  394. package/dist/hub/directory/directory.js.map +0 -1
  395. package/dist/hub/directory/index.d.ts +0 -7
  396. package/dist/hub/directory/index.js +0 -4
  397. package/dist/hub/directory/index.js.map +0 -1
  398. package/dist/hub/directory/profiles.d.ts +0 -41
  399. package/dist/hub/directory/profiles.js +0 -90
  400. package/dist/hub/directory/profiles.js.map +0 -1
  401. package/dist/hub/directory/types.d.ts +0 -71
  402. package/dist/hub/directory/types.js +0 -14
  403. package/dist/hub/directory/types.js.map +0 -1
  404. package/dist/hub/execution/cli-provider.d.ts +0 -23
  405. package/dist/hub/execution/cli-provider.js +0 -341
  406. package/dist/hub/execution/cli-provider.js.map +0 -1
  407. package/dist/hub/execution/index.d.ts +0 -13
  408. package/dist/hub/execution/index.js +0 -8
  409. package/dist/hub/execution/index.js.map +0 -1
  410. package/dist/hub/execution/model-broker.d.ts +0 -24
  411. package/dist/hub/execution/model-broker.js +0 -208
  412. package/dist/hub/execution/model-broker.js.map +0 -1
  413. package/dist/hub/execution/provider-setup.d.ts +0 -11
  414. package/dist/hub/execution/provider-setup.js +0 -21
  415. package/dist/hub/execution/provider-setup.js.map +0 -1
  416. package/dist/hub/execution/sandbox-runner.d.ts +0 -1
  417. package/dist/hub/execution/sandbox-runner.js +0 -221
  418. package/dist/hub/execution/sandbox-runner.js.map +0 -1
  419. package/dist/hub/execution/service.d.ts +0 -136
  420. package/dist/hub/execution/service.js +0 -459
  421. package/dist/hub/execution/service.js.map +0 -1
  422. package/dist/hub/execution/store.d.ts +0 -61
  423. package/dist/hub/execution/store.js +0 -182
  424. package/dist/hub/execution/store.js.map +0 -1
  425. package/dist/hub/execution/views.d.ts +0 -20
  426. package/dist/hub/execution/views.js +0 -48
  427. package/dist/hub/execution/views.js.map +0 -1
  428. package/dist/hub/http/compose.d.ts +0 -20
  429. package/dist/hub/http/compose.js +0 -518
  430. package/dist/hub/http/compose.js.map +0 -1
  431. package/dist/hub/http/core.d.ts +0 -49
  432. package/dist/hub/http/core.js +0 -124
  433. package/dist/hub/http/core.js.map +0 -1
  434. package/dist/hub/http/deps.d.ts +0 -61
  435. package/dist/hub/http/deps.js +0 -2
  436. package/dist/hub/http/deps.js.map +0 -1
  437. package/dist/hub/http/schema.d.ts +0 -14
  438. package/dist/hub/http/schema.js +0 -80
  439. package/dist/hub/http/schema.js.map +0 -1
  440. package/dist/hub/identity.d.ts +0 -32
  441. package/dist/hub/identity.js +0 -80
  442. package/dist/hub/identity.js.map +0 -1
  443. package/dist/hub/init/browser-certificate.d.ts +0 -9
  444. package/dist/hub/init/browser-certificate.js +0 -78
  445. package/dist/hub/init/browser-certificate.js.map +0 -1
  446. package/dist/hub/init/browser-tls.d.ts +0 -18
  447. package/dist/hub/init/browser-tls.js +0 -62
  448. package/dist/hub/init/browser-tls.js.map +0 -1
  449. package/dist/hub/init/cli.d.ts +0 -3
  450. package/dist/hub/init/cli.js +0 -83
  451. package/dist/hub/init/cli.js.map +0 -1
  452. package/dist/hub/init/directory-certificate.d.ts +0 -24
  453. package/dist/hub/init/directory-certificate.js +0 -222
  454. package/dist/hub/init/directory-certificate.js.map +0 -1
  455. package/dist/hub/init/existing-fleet.d.ts +0 -6
  456. package/dist/hub/init/existing-fleet.js +0 -58
  457. package/dist/hub/init/existing-fleet.js.map +0 -1
  458. package/dist/hub/init/handoff.d.ts +0 -8
  459. package/dist/hub/init/handoff.js +0 -36
  460. package/dist/hub/init/handoff.js.map +0 -1
  461. package/dist/hub/init/identity.d.ts +0 -5
  462. package/dist/hub/init/identity.js +0 -24
  463. package/dist/hub/init/identity.js.map +0 -1
  464. package/dist/hub/init/initializer.d.ts +0 -24
  465. package/dist/hub/init/initializer.js +0 -385
  466. package/dist/hub/init/initializer.js.map +0 -1
  467. package/dist/hub/init/inventory.d.ts +0 -17
  468. package/dist/hub/init/inventory.js +0 -33
  469. package/dist/hub/init/inventory.js.map +0 -1
  470. package/dist/hub/init/layout.d.ts +0 -32
  471. package/dist/hub/init/layout.js +0 -53
  472. package/dist/hub/init/layout.js.map +0 -1
  473. package/dist/hub/init/network.d.ts +0 -18
  474. package/dist/hub/init/network.js +0 -104
  475. package/dist/hub/init/network.js.map +0 -1
  476. package/dist/hub/init/plan-digest.d.ts +0 -5
  477. package/dist/hub/init/plan-digest.js +0 -47
  478. package/dist/hub/init/plan-digest.js.map +0 -1
  479. package/dist/hub/init/prompt.d.ts +0 -26
  480. package/dist/hub/init/prompt.js +0 -110
  481. package/dist/hub/init/prompt.js.map +0 -1
  482. package/dist/hub/init/secret-file.d.ts +0 -1
  483. package/dist/hub/init/secret-file.js +0 -59
  484. package/dist/hub/init/secret-file.js.map +0 -1
  485. package/dist/hub/init/text.d.ts +0 -127
  486. package/dist/hub/init/text.js +0 -247
  487. package/dist/hub/init/text.js.map +0 -1
  488. package/dist/hub/init/types.d.ts +0 -114
  489. package/dist/hub/init/types.js +0 -9
  490. package/dist/hub/init/types.js.map +0 -1
  491. package/dist/hub/init/wizard.d.ts +0 -34
  492. package/dist/hub/init/wizard.js +0 -554
  493. package/dist/hub/init/wizard.js.map +0 -1
  494. package/dist/hub/initialization.d.ts +0 -23
  495. package/dist/hub/initialization.js +0 -28
  496. package/dist/hub/initialization.js.map +0 -1
  497. package/dist/hub/member/agent-mode.d.ts +0 -6
  498. package/dist/hub/member/agent-mode.js +0 -23
  499. package/dist/hub/member/agent-mode.js.map +0 -1
  500. package/dist/hub/member/attachments.d.ts +0 -29
  501. package/dist/hub/member/attachments.js +0 -107
  502. package/dist/hub/member/attachments.js.map +0 -1
  503. package/dist/hub/member/exposure-api.d.ts +0 -87
  504. package/dist/hub/member/exposure-api.js +0 -64
  505. package/dist/hub/member/exposure-api.js.map +0 -1
  506. package/dist/hub/member/exposures.d.ts +0 -123
  507. package/dist/hub/member/exposures.js +0 -282
  508. package/dist/hub/member/exposures.js.map +0 -1
  509. package/dist/hub/member/pairing-api.d.ts +0 -85
  510. package/dist/hub/member/pairing-api.js +0 -385
  511. package/dist/hub/member/pairing-api.js.map +0 -1
  512. package/dist/hub/member/quota.d.ts +0 -20
  513. package/dist/hub/member/quota.js +0 -98
  514. package/dist/hub/member/quota.js.map +0 -1
  515. package/dist/hub/member-journal.d.ts +0 -104
  516. package/dist/hub/member-journal.js +0 -336
  517. package/dist/hub/member-journal.js.map +0 -1
  518. package/dist/hub/member-reconciliation.d.ts +0 -14
  519. package/dist/hub/member-reconciliation.js +0 -97
  520. package/dist/hub/member-reconciliation.js.map +0 -1
  521. package/dist/hub/mount.d.ts +0 -39
  522. package/dist/hub/mount.js +0 -123
  523. package/dist/hub/mount.js.map +0 -1
  524. package/dist/hub/pairing-client.d.ts +0 -17
  525. package/dist/hub/pairing-client.js +0 -108
  526. package/dist/hub/pairing-client.js.map +0 -1
  527. package/dist/hub/pairing.d.ts +0 -65
  528. package/dist/hub/pairing.js +0 -211
  529. package/dist/hub/pairing.js.map +0 -1
  530. package/dist/hub/policy.d.ts +0 -63
  531. package/dist/hub/policy.js +0 -147
  532. package/dist/hub/policy.js.map +0 -1
  533. package/dist/hub/preview.d.ts +0 -32
  534. package/dist/hub/preview.js +0 -64
  535. package/dist/hub/preview.js.map +0 -1
  536. package/dist/hub/private-files.d.ts +0 -5
  537. package/dist/hub/private-files.js +0 -44
  538. package/dist/hub/private-files.js.map +0 -1
  539. package/dist/hub/profile.d.ts +0 -59
  540. package/dist/hub/profile.js +0 -73
  541. package/dist/hub/profile.js.map +0 -1
  542. package/dist/hub/protocol.d.ts +0 -779
  543. package/dist/hub/protocol.js +0 -93
  544. package/dist/hub/protocol.js.map +0 -1
  545. package/dist/hub/quota.d.ts +0 -24
  546. package/dist/hub/quota.js +0 -112
  547. package/dist/hub/quota.js.map +0 -1
  548. package/dist/hub/representative.d.ts +0 -141
  549. package/dist/hub/representative.js +0 -528
  550. package/dist/hub/representative.js.map +0 -1
  551. package/dist/hub/retention.d.ts +0 -17
  552. package/dist/hub/retention.js +0 -45
  553. package/dist/hub/retention.js.map +0 -1
  554. package/dist/hub/rooms.d.ts +0 -120
  555. package/dist/hub/rooms.js +0 -535
  556. package/dist/hub/rooms.js.map +0 -1
  557. package/dist/hub/runtime.d.ts +0 -106
  558. package/dist/hub/runtime.js +0 -298
  559. package/dist/hub/runtime.js.map +0 -1
  560. package/dist/hub/server.d.ts +0 -56
  561. package/dist/hub/server.js +0 -202
  562. package/dist/hub/server.js.map +0 -1
  563. package/dist/hub/service-start.d.ts +0 -17
  564. package/dist/hub/service-start.js +0 -109
  565. package/dist/hub/service-start.js.map +0 -1
  566. package/dist/hub/sessions.d.ts +0 -53
  567. package/dist/hub/sessions.js +0 -196
  568. package/dist/hub/sessions.js.map +0 -1
  569. package/dist/hub/socket.d.ts +0 -24
  570. package/dist/hub/socket.js +0 -79
  571. package/dist/hub/socket.js.map +0 -1
  572. package/dist/hub/store.d.ts +0 -77
  573. package/dist/hub/store.js +0 -88
  574. package/dist/hub/store.js.map +0 -1
  575. package/dist/hub/tls.d.ts +0 -31
  576. package/dist/hub/tls.js +0 -135
  577. package/dist/hub/tls.js.map +0 -1
  578. package/dist/hub/types.d.ts +0 -401
  579. package/dist/hub/types.js +0 -2
  580. package/dist/hub/types.js.map +0 -1
  581. package/dist/hub/validation.d.ts +0 -33
  582. package/dist/hub/validation.js +0 -136
  583. package/dist/hub/validation.js.map +0 -1
  584. package/dist/hub/version-floor.d.ts +0 -10
  585. package/dist/hub/version-floor.js +0 -45
  586. package/dist/hub/version-floor.js.map +0 -1
  587. package/dist/hub-browser-certificate-policy.d.ts +0 -31
  588. package/dist/hub-browser-certificate-policy.js +0 -25
  589. package/dist/hub-browser-certificate-policy.js.map +0 -1
  590. package/dist/hub-membership-settings.d.ts +0 -6
  591. package/dist/hub-membership-settings.js +0 -21
  592. package/dist/hub-membership-settings.js.map +0 -1
  593. package/dist/hub-mode.d.ts +0 -15
  594. package/dist/hub-mode.js +0 -17
  595. package/dist/hub-mode.js.map +0 -1
  596. package/dist/hub-pairing-summary.d.ts +0 -48
  597. package/dist/hub-pairing-summary.js +0 -36
  598. package/dist/hub-pairing-summary.js.map +0 -1
  599. package/dist/hub-report-target.d.ts +0 -32
  600. package/dist/hub-report-target.js +0 -33
  601. package/dist/hub-report-target.js.map +0 -1
  602. package/dist/hub-retention-policy.d.ts +0 -14
  603. package/dist/hub-retention-policy.js +0 -15
  604. package/dist/hub-retention-policy.js.map +0 -1
  605. package/dist/launchd-service-domain.d.ts +0 -5
  606. package/dist/launchd-service-domain.js +0 -21
  607. package/dist/launchd-service-domain.js.map +0 -1
  608. package/dist/local-pane-endpoint.d.ts +0 -46
  609. package/dist/local-pane-endpoint.js +0 -189
  610. package/dist/local-pane-endpoint.js.map +0 -1
  611. package/dist/local-pane-launcher.d.ts +0 -2
  612. package/dist/local-pane-launcher.js +0 -38
  613. package/dist/local-pane-launcher.js.map +0 -1
  614. package/dist/local-pane-stage.ps1 +0 -101
  615. package/dist/model-catalog-defaults.d.ts +0 -14
  616. package/dist/model-catalog-defaults.js +0 -20
  617. package/dist/model-catalog-defaults.js.map +0 -1
  618. package/dist/native-agent-admission.d.ts +0 -7
  619. package/dist/native-agent-admission.js +0 -26
  620. package/dist/native-agent-admission.js.map +0 -1
  621. package/dist/native-daemon-client.d.ts +0 -13
  622. package/dist/native-daemon-client.js +0 -28
  623. package/dist/native-daemon-client.js.map +0 -1
  624. package/dist/native-instance-api.d.ts +0 -13
  625. package/dist/native-instance-api.js +0 -217
  626. package/dist/native-instance-api.js.map +0 -1
  627. package/dist/native-instance-input.d.ts +0 -87
  628. package/dist/native-instance-input.js +0 -59
  629. package/dist/native-instance-input.js.map +0 -1
  630. package/dist/native-instance-registry.d.ts +0 -38
  631. package/dist/native-instance-registry.js +0 -129
  632. package/dist/native-instance-registry.js.map +0 -1
  633. package/dist/native-mcp.d.ts +0 -43
  634. package/dist/native-mcp.js +0 -291
  635. package/dist/native-mcp.js.map +0 -1
  636. package/dist/native-model-catalog.d.ts +0 -5
  637. package/dist/native-model-catalog.js +0 -76
  638. package/dist/native-model-catalog.js.map +0 -1
  639. package/dist/native-pane-crash-budget.d.ts +0 -20
  640. package/dist/native-pane-crash-budget.js +0 -60
  641. package/dist/native-pane-crash-budget.js.map +0 -1
  642. package/dist/native-pane-create.d.ts +0 -26
  643. package/dist/native-pane-create.js +0 -53
  644. package/dist/native-pane-create.js.map +0 -1
  645. package/dist/native-pane-lifecycle.d.ts +0 -73
  646. package/dist/native-pane-lifecycle.js +0 -239
  647. package/dist/native-pane-lifecycle.js.map +0 -1
  648. package/dist/native-pane-manager.d.ts +0 -59
  649. package/dist/native-pane-manager.js +0 -592
  650. package/dist/native-pane-manager.js.map +0 -1
  651. package/dist/native-pane-output-log.d.ts +0 -15
  652. package/dist/native-pane-output-log.js +0 -108
  653. package/dist/native-pane-output-log.js.map +0 -1
  654. package/dist/native-pane-reconciliation.d.ts +0 -4
  655. package/dist/native-pane-reconciliation.js +0 -40
  656. package/dist/native-pane-reconciliation.js.map +0 -1
  657. package/dist/native-pane-recovery.d.ts +0 -12
  658. package/dist/native-pane-recovery.js +0 -10
  659. package/dist/native-pane-recovery.js.map +0 -1
  660. package/dist/native-pane-tools.d.ts +0 -2
  661. package/dist/native-pane-tools.js +0 -14
  662. package/dist/native-pane-tools.js.map +0 -1
  663. package/dist/office-talk.d.ts +0 -26
  664. package/dist/office-talk.js +0 -50
  665. package/dist/office-talk.js.map +0 -1
  666. package/dist/pane-port.d.ts +0 -118
  667. package/dist/pane-port.js +0 -2
  668. package/dist/pane-port.js.map +0 -1
  669. package/dist/runtime-api.d.ts +0 -10
  670. package/dist/runtime-api.js +0 -189
  671. package/dist/runtime-api.js.map +0 -1
  672. package/dist/runtime-assets/@xterm/addon-serialize/LICENSE +0 -21
  673. package/dist/runtime-assets/@xterm/addon-serialize/lib/addon-serialize.js +0 -2
  674. package/dist/runtime-assets/@xterm/addon-serialize/lib/addon-serialize.mjs +0 -19
  675. package/dist/runtime-assets/@xterm/addon-serialize/package.json +0 -29
  676. package/dist/runtime-assets/@xterm/headless/LICENSE +0 -21
  677. package/dist/runtime-assets/@xterm/headless/lib-headless/xterm-headless.js +0 -2
  678. package/dist/runtime-assets/@xterm/headless/lib-headless/xterm-headless.mjs +0 -46
  679. package/dist/runtime-assets/@xterm/headless/package.json +0 -29
  680. package/dist/runtime-assets/node-pty/CONPTY-LICENSE +0 -21
  681. package/dist/runtime-assets/node-pty/CONPTY-NOTICE.md +0 -503
  682. package/dist/runtime-assets/node-pty/LICENSE +0 -69
  683. package/dist/runtime-assets/node-pty/lib/conpty_console_list_agent.js +0 -16
  684. package/dist/runtime-assets/node-pty/lib/eventEmitter2.js +0 -47
  685. package/dist/runtime-assets/node-pty/lib/index.js +0 -52
  686. package/dist/runtime-assets/node-pty/lib/interfaces.js +0 -7
  687. package/dist/runtime-assets/node-pty/lib/shared/conout.js +0 -11
  688. package/dist/runtime-assets/node-pty/lib/terminal.js +0 -190
  689. package/dist/runtime-assets/node-pty/lib/types.js +0 -7
  690. package/dist/runtime-assets/node-pty/lib/unixTerminal.js +0 -346
  691. package/dist/runtime-assets/node-pty/lib/utils.js +0 -39
  692. package/dist/runtime-assets/node-pty/lib/windowsConoutConnection.js +0 -125
  693. package/dist/runtime-assets/node-pty/lib/windowsPtyAgent.js +0 -320
  694. package/dist/runtime-assets/node-pty/lib/windowsTerminal.js +0 -199
  695. package/dist/runtime-assets/node-pty/lib/worker/conoutSocketWorker.js +0 -22
  696. package/dist/runtime-assets/node-pty/package.json +0 -64
  697. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
  698. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
  699. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
  700. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  701. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
  702. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
  703. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty.node +0 -0
  704. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
  705. package/dist/runtime-build-info.d.ts +0 -9
  706. package/dist/runtime-build-info.js +0 -59
  707. package/dist/runtime-build-info.js.map +0 -1
  708. package/dist/runtime-bundle.d.ts +0 -22
  709. package/dist/runtime-bundle.js +0 -158
  710. package/dist/runtime-bundle.js.map +0 -1
  711. package/dist/runtime-cli.d.ts +0 -14
  712. package/dist/runtime-cli.js +0 -271
  713. package/dist/runtime-cli.js.map +0 -1
  714. package/dist/runtime-client-store.d.ts +0 -75
  715. package/dist/runtime-client-store.js +0 -372
  716. package/dist/runtime-client-store.js.map +0 -1
  717. package/dist/runtime-client.d.ts +0 -174
  718. package/dist/runtime-client.js +0 -1010
  719. package/dist/runtime-client.js.map +0 -1
  720. package/dist/runtime-connection.d.ts +0 -22
  721. package/dist/runtime-connection.js +0 -93
  722. package/dist/runtime-connection.js.map +0 -1
  723. package/dist/runtime-coordinator.d.ts +0 -98
  724. package/dist/runtime-coordinator.js +0 -1089
  725. package/dist/runtime-coordinator.js.map +0 -1
  726. package/dist/runtime-credential-profiles.d.ts +0 -78
  727. package/dist/runtime-credential-profiles.js +0 -280
  728. package/dist/runtime-credential-profiles.js.map +0 -1
  729. package/dist/runtime-general-protocol.d.ts +0 -22
  730. package/dist/runtime-general-protocol.js +0 -57
  731. package/dist/runtime-general-protocol.js.map +0 -1
  732. package/dist/runtime-general-workspace.d.ts +0 -17
  733. package/dist/runtime-general-workspace.js +0 -213
  734. package/dist/runtime-general-workspace.js.map +0 -1
  735. package/dist/runtime-install.d.ts +0 -50
  736. package/dist/runtime-install.js +0 -186
  737. package/dist/runtime-install.js.map +0 -1
  738. package/dist/runtime-pane-assets.d.ts +0 -17
  739. package/dist/runtime-pane-assets.js +0 -23
  740. package/dist/runtime-pane-assets.js.map +0 -1
  741. package/dist/runtime-pane-boot.d.ts +0 -9
  742. package/dist/runtime-pane-boot.js +0 -47
  743. package/dist/runtime-pane-boot.js.map +0 -1
  744. package/dist/runtime-pane-codex-index.d.ts +0 -10
  745. package/dist/runtime-pane-codex-index.js +0 -151
  746. package/dist/runtime-pane-codex-index.js.map +0 -1
  747. package/dist/runtime-pane-config.d.ts +0 -16
  748. package/dist/runtime-pane-config.js +0 -54
  749. package/dist/runtime-pane-config.js.map +0 -1
  750. package/dist/runtime-pane-host.d.ts +0 -63
  751. package/dist/runtime-pane-host.js +0 -467
  752. package/dist/runtime-pane-host.js.map +0 -1
  753. package/dist/runtime-pane-job-owner.d.ts +0 -1
  754. package/dist/runtime-pane-job-owner.js +0 -29
  755. package/dist/runtime-pane-job-owner.js.map +0 -1
  756. package/dist/runtime-pane-job.ps1 +0 -116
  757. package/dist/runtime-pane-link.d.ts +0 -47
  758. package/dist/runtime-pane-link.js +0 -337
  759. package/dist/runtime-pane-link.js.map +0 -1
  760. package/dist/runtime-pane-mcp-protocol.d.ts +0 -32
  761. package/dist/runtime-pane-mcp-protocol.js +0 -39
  762. package/dist/runtime-pane-mcp-protocol.js.map +0 -1
  763. package/dist/runtime-pane-mcp-relay.d.ts +0 -18
  764. package/dist/runtime-pane-mcp-relay.js +0 -80
  765. package/dist/runtime-pane-mcp-relay.js.map +0 -1
  766. package/dist/runtime-pane-mcp.d.ts +0 -55
  767. package/dist/runtime-pane-mcp.js +0 -153
  768. package/dist/runtime-pane-mcp.js.map +0 -1
  769. package/dist/runtime-pane-native.d.ts +0 -75
  770. package/dist/runtime-pane-native.js +0 -114
  771. package/dist/runtime-pane-native.js.map +0 -1
  772. package/dist/runtime-pane-output.d.ts +0 -19
  773. package/dist/runtime-pane-output.js +0 -53
  774. package/dist/runtime-pane-output.js.map +0 -1
  775. package/dist/runtime-pane-port.d.ts +0 -144
  776. package/dist/runtime-pane-port.js +0 -574
  777. package/dist/runtime-pane-port.js.map +0 -1
  778. package/dist/runtime-pane-private.d.ts +0 -14
  779. package/dist/runtime-pane-private.js +0 -51
  780. package/dist/runtime-pane-private.js.map +0 -1
  781. package/dist/runtime-pane-private.ps1 +0 -14
  782. package/dist/runtime-pane-process.d.ts +0 -4
  783. package/dist/runtime-pane-process.js +0 -117
  784. package/dist/runtime-pane-process.js.map +0 -1
  785. package/dist/runtime-pane-protocol.d.ts +0 -182
  786. package/dist/runtime-pane-protocol.js +0 -217
  787. package/dist/runtime-pane-protocol.js.map +0 -1
  788. package/dist/runtime-pane-quota-history.d.ts +0 -6
  789. package/dist/runtime-pane-quota-history.js +0 -44
  790. package/dist/runtime-pane-quota-history.js.map +0 -1
  791. package/dist/runtime-pane-screen.d.ts +0 -19
  792. package/dist/runtime-pane-screen.js +0 -76
  793. package/dist/runtime-pane-screen.js.map +0 -1
  794. package/dist/runtime-pane-service.d.ts +0 -16
  795. package/dist/runtime-pane-service.js +0 -256
  796. package/dist/runtime-pane-service.js.map +0 -1
  797. package/dist/runtime-pane-stdio-protocol.d.ts +0 -54
  798. package/dist/runtime-pane-stdio-protocol.js +0 -94
  799. package/dist/runtime-pane-stdio-protocol.js.map +0 -1
  800. package/dist/runtime-pane-stdio.d.ts +0 -3
  801. package/dist/runtime-pane-stdio.js +0 -123
  802. package/dist/runtime-pane-stdio.js.map +0 -1
  803. package/dist/runtime-pane-store.d.ts +0 -33
  804. package/dist/runtime-pane-store.js +0 -164
  805. package/dist/runtime-pane-store.js.map +0 -1
  806. package/dist/runtime-pane-transcript-protocol.d.ts +0 -43
  807. package/dist/runtime-pane-transcript-protocol.js +0 -58
  808. package/dist/runtime-pane-transcript-protocol.js.map +0 -1
  809. package/dist/runtime-pane-transcript.d.ts +0 -50
  810. package/dist/runtime-pane-transcript.js +0 -666
  811. package/dist/runtime-pane-transcript.js.map +0 -1
  812. package/dist/runtime-pane-worker.d.ts +0 -1
  813. package/dist/runtime-pane-worker.js +0 -167
  814. package/dist/runtime-pane-worker.js.map +0 -1
  815. package/dist/runtime-protocol.d.ts +0 -177
  816. package/dist/runtime-protocol.js +0 -49
  817. package/dist/runtime-protocol.js.map +0 -1
  818. package/dist/runtime-switches.d.ts +0 -79
  819. package/dist/runtime-switches.js +0 -90
  820. package/dist/runtime-switches.js.map +0 -1
  821. package/dist/runtime-transcript-delta-reader.d.ts +0 -23
  822. package/dist/runtime-transcript-delta-reader.js +0 -74
  823. package/dist/runtime-transcript-delta-reader.js.map +0 -1
  824. package/dist/runtime-transcript-source.d.ts +0 -36
  825. package/dist/runtime-transcript-source.js +0 -189
  826. package/dist/runtime-transcript-source.js.map +0 -1
  827. package/dist/runtime-update-activity.d.ts +0 -21
  828. package/dist/runtime-update-activity.js +0 -51
  829. package/dist/runtime-update-activity.js.map +0 -1
  830. package/dist/runtime-update-artifact.d.ts +0 -31
  831. package/dist/runtime-update-artifact.js +0 -252
  832. package/dist/runtime-update-artifact.js.map +0 -1
  833. package/dist/runtime-update-install.d.ts +0 -31
  834. package/dist/runtime-update-install.js +0 -205
  835. package/dist/runtime-update-install.js.map +0 -1
  836. package/dist/runtime-update-journal.d.ts +0 -44
  837. package/dist/runtime-update-journal.js +0 -121
  838. package/dist/runtime-update-journal.js.map +0 -1
  839. package/dist/runtime-update-lock.d.ts +0 -48
  840. package/dist/runtime-update-lock.js +0 -217
  841. package/dist/runtime-update-lock.js.map +0 -1
  842. package/dist/runtime-update-owners.d.ts +0 -29
  843. package/dist/runtime-update-owners.js +0 -240
  844. package/dist/runtime-update-owners.js.map +0 -1
  845. package/dist/runtime-update-protocol.d.ts +0 -15
  846. package/dist/runtime-update-protocol.js +0 -13
  847. package/dist/runtime-update-protocol.js.map +0 -1
  848. package/dist/runtime-windows-bridge.d.ts +0 -42
  849. package/dist/runtime-windows-bridge.js +0 -167
  850. package/dist/runtime-windows-bridge.js.map +0 -1
  851. package/dist/service-drain.d.ts +0 -19
  852. package/dist/service-drain.js +0 -64
  853. package/dist/service-drain.js.map +0 -1
  854. package/dist/settings-route-lifetime.d.ts +0 -14
  855. package/dist/settings-route-lifetime.js +0 -48
  856. package/dist/settings-route-lifetime.js.map +0 -1
  857. package/dist/tmux-binary.d.ts +0 -59
  858. package/dist/tmux-binary.js +0 -200
  859. package/dist/tmux-binary.js.map +0 -1
  860. package/dist/tmux-pane-host.d.ts +0 -26
  861. package/dist/tmux-pane-host.js +0 -25
  862. package/dist/tmux-pane-host.js.map +0 -1
  863. package/dist/transcript-needles.d.ts +0 -42
  864. package/dist/transcript-needles.js +0 -166
  865. package/dist/transcript-needles.js.map +0 -1
  866. package/dist/transcript-records.d.ts +0 -21
  867. package/dist/transcript-records.js +0 -141
  868. package/dist/transcript-records.js.map +0 -1
  869. package/dist/ui/account-identity.js +0 -27
  870. package/dist/ui/accounts-view.js +0 -214
  871. package/dist/ui/agent-proposals.js +0 -90
  872. package/dist/ui/agent-runtime-settings.js +0 -68
  873. package/dist/ui/agent-runtime.js +0 -124
  874. package/dist/ui/cli-picker.js +0 -42
  875. package/dist/ui/credential-profile-select.js +0 -54
  876. package/dist/ui/fleet-office-dialogue.d.ts +0 -30
  877. package/dist/ui/fleet-office-dialogue.js +0 -382
  878. package/dist/ui/fleet-task-menu.js +0 -188
  879. package/dist/ui/fleet-task-stats.js +0 -124
  880. package/dist/ui/fleet-task-view.js +0 -340
  881. package/dist/ui/general-location.js +0 -71
  882. package/dist/ui/hub-agent-copy.js +0 -23
  883. package/dist/ui/hub-button-actions.js +0 -65
  884. package/dist/ui/hub-chat-store.js +0 -158
  885. package/dist/ui/hub-chat-strings.js +0 -77
  886. package/dist/ui/hub-client.js +0 -329
  887. package/dist/ui/hub-owner-strings.js +0 -51
  888. package/dist/ui/hub-provider-guidance.js +0 -31
  889. package/dist/ui/hub-quota.js +0 -85
  890. package/dist/ui/hub-strings.js +0 -162
  891. package/dist/ui/hub-switcher.js +0 -27
  892. package/dist/ui/native-instance-settings.js +0 -44
  893. package/dist/ui/native-pane-recovery.js +0 -45
  894. package/dist/ui/panel-hub.js +0 -619
  895. package/dist/ui/panel-runtimes.js +0 -425
  896. package/dist/ui/panel-windows-agent.js +0 -86
  897. package/dist/ui/panel-windows-cli.js +0 -189
  898. package/dist/ui/provider-marks.js +0 -83
  899. package/dist/ui/runtime-catalog.js +0 -55
  900. package/dist/ui/runtime-commands.d.ts +0 -4
  901. package/dist/ui/runtime-commands.js +0 -59
  902. package/dist/ui/settings-access-strings.js +0 -42
  903. package/dist/ui/settings-agent-filters.js +0 -94
  904. package/dist/ui/settings-build-version.js +0 -35
  905. package/dist/ui/settings-devices.js +0 -253
  906. package/dist/ui/settings-hub-browser-certificate.js +0 -74
  907. package/dist/ui/settings-hub-membership.js +0 -72
  908. package/dist/ui/settings-hub-retention.js +0 -52
  909. package/dist/ui/settings-hub.js +0 -196
  910. package/dist/ui/settings-layout.js +0 -242
  911. package/dist/ui/settings-outside.js +0 -242
  912. package/dist/ui/settings-shared-strings.js +0 -143
  913. package/dist/ui/settings-shared.js +0 -345
  914. package/dist/ui/settings-shortcuts.js +0 -65
  915. package/dist/ui/shared/accounts.css +0 -15
  916. package/dist/ui/shared/chat-composer.js +0 -68
  917. package/dist/ui/shared/chat-md-strings.js +0 -9
  918. package/dist/ui/shared/chat-render.js +0 -682
  919. package/dist/ui/shared/chat-strings.js +0 -333
  920. package/dist/ui/shared/chat-thread.js +0 -969
  921. package/dist/ui/shared/chat-time.js +0 -80
  922. package/dist/ui/shared/html-attachment.js +0 -42
  923. package/dist/ui/shared/hub-chat.css +0 -85
  924. package/dist/ui/shared/hub-owner.css +0 -33
  925. package/dist/ui/shared/hub-quota.css +0 -8
  926. package/dist/ui/shared/hub.css +0 -71
  927. package/dist/ui/shared/machine-name.js +0 -13
  928. package/dist/ui/shared/page-head.js +0 -8
  929. package/dist/ui/shared/preview.js +0 -476
  930. package/dist/ui/shared/qrcode.module.js +0 -2237
  931. package/dist/ui/shared/runtime-install.css +0 -26
  932. package/dist/ui/shared/settings-width.js +0 -31
  933. package/dist/ui/shared/side-rail.js +0 -15
  934. package/dist/ui/shared/task-board.css +0 -95
  935. package/dist/ui/shared/vendor/qrcode-generator.LICENSE +0 -27
  936. package/dist/ui/shared/workspace.css +0 -20
  937. package/dist/ui/windows-agents-nav.js +0 -2
  938. package/dist/ui/windows-cli-catalog.js +0 -108
  939. package/dist/ui/workspace-panel.js +0 -189
  940. package/dist/ui/workspace-strings.js +0 -35
  941. package/dist/web-device-login.d.ts +0 -153
  942. package/dist/web-device-login.js +0 -278
  943. package/dist/web-device-login.js.map +0 -1
  944. package/dist/web-remote-access.d.ts +0 -152
  945. package/dist/web-remote-access.js +0 -368
  946. package/dist/web-remote-access.js.map +0 -1
  947. package/dist/windows-agents.d.ts +0 -127
  948. package/dist/windows-agents.js +0 -491
  949. package/dist/windows-agents.js.map +0 -1
  950. package/dist/windows-cli-api.d.ts +0 -34
  951. package/dist/windows-cli-api.js +0 -185
  952. package/dist/windows-cli-api.js.map +0 -1
  953. package/dist/windows-cli-providers.d.ts +0 -106
  954. package/dist/windows-cli-providers.js +0 -424
  955. package/dist/windows-cli-providers.js.map +0 -1
  956. package/dist/windows-cli-worker.d.ts +0 -83
  957. package/dist/windows-cli-worker.js +0 -570
  958. package/dist/windows-cli-worker.js.map +0 -1
  959. package/dist/windows-cli.d.ts +0 -126
  960. package/dist/windows-cli.js +0 -416
  961. package/dist/windows-cli.js.map +0 -1
  962. package/dist/windows-native-mcp.d.ts +0 -19
  963. package/dist/windows-native-mcp.js +0 -143
  964. package/dist/windows-native-mcp.js.map +0 -1
  965. package/dist/windows-pane-mcp.d.ts +0 -26
  966. package/dist/windows-pane-mcp.js +0 -187
  967. package/dist/windows-pane-mcp.js.map +0 -1
  968. package/launcher/launchd-session-type.cjs +0 -14
  969. package/launcher/tmux-bundle.cjs +0 -247
  970. package/templates/runtime-assets/conpty-LICENSE +0 -21
  971. package/templates/runtime-assets/conpty-NOTICE.md +0 -503
  972. package/templates/runtime-assets/local-pane-stage.ps1 +0 -101
  973. package/templates/runtime-assets/runtime-pane-job.ps1 +0 -116
  974. package/templates/runtime-assets/runtime-pane-private.ps1 +0 -14
  975. package/templates/runtime-assets/xterm-LICENSE +0 -21
  976. package/templates/runtime-install/install.ps1 +0 -270
@@ -1,1089 +0,0 @@
1
- /** Durable machine registration and outbound-client transport; never starts a remote shell. */
2
- import { createHash, randomBytes, randomUUID, timingSafeEqual } from "node:crypto";
3
- import { existsSync, lstatSync, mkdirSync, readFileSync } from "node:fs";
4
- import { join } from "node:path";
5
- import { WebSocket, WebSocketServer } from "ws";
6
- import { readBoundedWebBody } from "./web-body.js";
7
- import { atomicWriteFileSync } from "./atomic-write.js";
8
- import { validateNativeTask } from "./windows-cli-worker.js";
9
- import { inventoryProbed } from "./windows-cli.js";
10
- import { isNativeProviderId } from "./windows-cli-providers.js";
11
- import { assertCredentialProfileCli, assertCredentialProfileName, parseCredentialProfileReport } from "./runtime-credential-profiles.js";
12
- import { parseAccountIdentity } from "./claude-auth-status.js";
13
- import { RuntimeUpdateActivity } from "./runtime-update-activity.js";
14
- import { parseRuntimeUpdateControl, RUNTIME_MANAGED_UPDATE_CAPABILITY, validRuntimeUpdateId } from "./runtime-update-protocol.js";
15
- import { validatePaneMcpBody } from "./runtime-pane-mcp-protocol.js";
16
- import { validateRuntimePaneRequest, validateRuntimePaneSnapshot, validateRuntimePaneShutdown } from "./runtime-pane-protocol.js";
17
- import { withNativePaneVerification } from "./runtime-pane-native.js";
18
- import { RUNTIME_CLAIM_PATH, RUNTIME_CONNECT_PATH, RUNTIME_MAX_FRAME_BYTES, RUNTIME_PAIR_PATH, RUNTIME_ROTATE_PATH, runtimeFingerprintFromHash, parseRuntimeInfo, runtimeInfoCompatible, RUNTIME_REINSTALL_CLOSE_REASON } from "./runtime-protocol.js";
19
- const PAIR_TTL = 10 * 60_000;
20
- const MAX_STORE_BYTES = 64 * 1024 * 1024;
21
- const UUID = /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i;
22
- const secret = () => randomBytes(32).toString("hex");
23
- const hash = (value) => createHash("sha256").update(value).digest("hex");
24
- const equal = (value, digest) => /^[a-f0-9]{64}$/i.test(digest) && timingSafeEqual(Buffer.from(hash(value), "hex"), Buffer.from(digest, "hex"));
25
- const record = (v) => !!v && typeof v === "object" && !Array.isArray(v);
26
- /** A deliberate validation failure whose static message is safe to show the runtime; every other error (I/O, internal) is not. */
27
- class RuntimeProtocolError extends Error {
28
- }
29
- const text = (v, max) => typeof v === "string" && v.length > 0 && v.length <= max && !/[\0\r\n]/.test(v);
30
- const terminal = (task) => !!task.finishedAt && ["completed", "failed", "cancelled"].includes(task.status);
31
- const loopback = (address) => address === "127.0.0.1" || address === "::1" || address === "::ffff:127.0.0.1";
32
- function privateTransport(req) {
33
- return req.headers.origin === undefined && req.headers.cookie === undefined
34
- && (loopback(req.socket.remoteAddress) || req.socket.encrypted === true);
35
- }
36
- function stable(value, depth = 0) {
37
- if (depth > 64)
38
- throw Error("Runtime request is too deeply nested");
39
- if (Array.isArray(value))
40
- return `[${value.map(value => stable(value, depth + 1)).join(",")}]`;
41
- if (record(value))
42
- return `{${Object.keys(value).sort().map(key => `${JSON.stringify(key)}:${stable(value[key], depth + 1)}`).join(",")}}`;
43
- return JSON.stringify(value) ?? "null";
44
- }
45
- /** The CLI rows' `supports` flags AgEnD knows; any other key a Runtime adds is not kept. */
46
- const SUPPORT_KEYS = ["execution", "resume", "model", "mcp"];
47
- const MODEL_SOURCES = ["cli-cache", "official-catalog", "cli-list", "unavailable"];
48
- /**
49
- * A Runtime's inventory, copied field by field from an allowlist: a field AgEnD does not know is not kept (so it can never be stored or served back
50
- * by /ui/runtimes), every text field has a length limit, and the account identity and the credential profile report are accepted in their
51
- * closed, masked form only. A refusal names the field and the reason, never the rejected value: an unmasked e-mail must not reach a log, a close
52
- * reason or an error message from here.
53
- */
54
- function inventory(value) {
55
- if (!record(value) || typeof value.home !== "string" || value.home.length > 1024 || !Array.isArray(value.clis) || value.clis.length > 16)
56
- throw new RuntimeProtocolError("Invalid runtime inventory");
57
- const seen = new Set(), clis = [];
58
- for (const row of value.clis) {
59
- if (!record(row) || !isNativeProviderId(row.id) || seen.has(row.id) || !record(row.supports)
60
- || typeof row.runnable !== "boolean" || typeof row.readOnlySupport !== "boolean"
61
- || ![true, false, null].includes(row.authenticated)
62
- || !(row.path === null || text(row.path, 2048)) || !(row.version === null || text(row.version, 256))
63
- || typeof row.permissionNote !== "string" || row.permissionNote.length > 2048
64
- || !Array.isArray(row.models) || row.models.length > 256)
65
- throw new RuntimeProtocolError("Invalid runtime CLI inventory");
66
- const models = row.models.map(model => {
67
- if (!record(model) || !text(model.id, 256) || model.name !== undefined && !text(model.name, 256)
68
- || model.description !== undefined && (typeof model.description !== "string" || model.description.length > 2048))
69
- throw new RuntimeProtocolError("Invalid runtime model inventory");
70
- return { id: model.id, ...(model.name !== undefined ? { name: model.name } : {}), ...(model.description !== undefined ? { description: model.description } : {}) };
71
- });
72
- if (Object.values(row.supports).some(v => typeof v !== "boolean"))
73
- throw new RuntimeProtocolError("Invalid runtime capabilities");
74
- if (row.reason !== undefined && (typeof row.reason !== "string" || row.reason.length > 1024))
75
- throw new RuntimeProtocolError("Invalid runtime CLI inventory");
76
- const supports = Object.fromEntries(SUPPORT_KEYS.filter(key => Object.hasOwn(row.supports, key)).map(key => [key, row.supports[key]]));
77
- const entry = { id: row.id, path: row.path, version: row.version, authenticated: row.authenticated, runnable: row.runnable, supports: supports,
78
- readOnlySupport: row.readOnlySupport, permissionNote: row.permissionNote, models,
79
- ...(row.reason !== undefined ? { reason: row.reason } : {}),
80
- ...(MODEL_SOURCES.includes(row.modelsSource) ? { modelsSource: row.modelsSource } : {}) };
81
- seen.add(row.id);
82
- clis.push(entry);
83
- }
84
- if (Buffer.byteLength(JSON.stringify(value)) > RUNTIME_MAX_FRAME_BYTES / 2)
85
- throw new RuntimeProtocolError("Runtime inventory is too large");
86
- if (value.probedAt !== undefined && value.probedAt !== null && (typeof value.probedAt !== "number" || !Number.isFinite(value.probedAt)))
87
- throw new RuntimeProtocolError("Invalid runtime inventory");
88
- const probe = { clis, home: value.home, ...(value.probedAt !== undefined ? { probedAt: value.probedAt } : {}),
89
- ...(typeof value.hostname === "string" && value.hostname.trim() && value.hostname.length <= 255 && !/[\x00-\x1f\x7f]/.test(value.hostname) ? { hostname: value.hostname.trim() } : {}) };
90
- const field = (error) => /^Invalid (?:credential profile report|account identity): [A-Za-z ,.]{1,48}$/.test(String(error?.message)) ? String(error.message).replace(/^Invalid (?:credential profile report|account identity): /, "") : "invalid";
91
- if (value.credentialProfiles !== undefined) {
92
- try {
93
- probe.credentialProfiles = parseCredentialProfileReport(value.credentialProfiles);
94
- }
95
- catch (error) {
96
- throw new RuntimeProtocolError(`Invalid runtime credential profiles (${field(error)})`);
97
- }
98
- }
99
- const identities = new Map(value.clis.map(row => [row.id, row.identity]));
100
- for (const row of probe.clis) {
101
- const identity = identities.get(row.id);
102
- if (identity === undefined)
103
- continue;
104
- if (row.id !== "claude-code" || row.authenticated !== true)
105
- throw new RuntimeProtocolError("Invalid runtime CLI identity (only a signed-in Claude Code has one)");
106
- try {
107
- row.identity = parseAccountIdentity(identity);
108
- }
109
- catch (error) {
110
- throw new RuntimeProtocolError(`Invalid runtime CLI identity (${field(error)})`);
111
- }
112
- }
113
- return probe;
114
- }
115
- function machineView(machine) {
116
- return { ...structuredClone(machine), ...(machine.inventory ? { inventory: withNativePaneVerification(machine.inventory) } : {}), runtimeCompatibility: machine.runtimeInfo
117
- ? runtimeInfoCompatible(machine.runtimeInfo) ? "compatible" : "incompatible"
118
- : machine.bootId ? "legacy" : "unknown" };
119
- }
120
- /**
121
- * M-2239 P2-1 (#2936 review): the journal is compacted, never just capped. A settled command (failed, or accepted with a
122
- * terminal, process-confirmed outcome) older than COMMAND_KEEP_MS, or the oldest settled ones beyond COMMAND_SOFT_CAP,
123
- * become tombstones; pending and uncertain commands are never compacted. Tombstones are evicted only beyond
124
- * TOMBSTONE_CAP and only when older than TOMBSTONE_KEEP_MS — a replayed id is refused for at least that long.
125
- */
126
- const COMMAND_HARD_CAP = 4096, COMMAND_SOFT_CAP = 2048, COMMAND_KEEP_MS = 7 * 24 * 3_600_000;
127
- const TOMBSTONE_CAP = 65_536, TOMBSTONE_KEEP_MS = 30 * 24 * 3_600_000;
128
- /**
129
- * alpha.2 polish: what an interrupted command becomes. A probe only reads the runner's CLI inventory — nothing to reconcile
130
- * if its answer was lost — so it settles as failed (compacted like any settled command); every other operation stays
131
- * uncertain (never compacted, never sent again). The automatic probe on connect must not leave a trail in the journal.
132
- */
133
- const interrupted = (command) => command.operation === "probe" ? "failed" : "uncertain";
134
- export class RuntimeCoordinator {
135
- options;
136
- paneEpoch = randomUUID();
137
- path;
138
- state;
139
- server = new WebSocketServer({ noServer: true, maxPayload: RUNTIME_MAX_FRAME_BYTES, perMessageDeflate: false });
140
- connections = new Map();
141
- pending = new Map();
142
- paneToolPending = new Set();
143
- panePending = new Map();
144
- /** Physical handler ownership survives socket replacement and transport deadlines. */
145
- machineActivity = new Map();
146
- listeners = new Set();
147
- limits = new Map();
148
- heartbeat;
149
- closed = false;
150
- constructor(home, options = {}) {
151
- this.options = options;
152
- mkdirSync(home, { recursive: true, mode: 0o700 });
153
- this.path = join(home, "runtime-machines.json");
154
- if (existsSync(this.path)) {
155
- const stat = lstatSync(this.path);
156
- if (!stat.isFile() || stat.isSymbolicLink() || stat.size > MAX_STORE_BYTES)
157
- throw Error("Invalid runtime machine store file");
158
- }
159
- this.state = existsSync(this.path) ? JSON.parse(readFileSync(this.path, "utf8")) : { version: 1, machines: [], pairings: [], commands: [] };
160
- if (this.state.version !== 1 || !Array.isArray(this.state.machines) || !Array.isArray(this.state.pairings) || !Array.isArray(this.state.commands)
161
- || this.state.tombstones !== undefined && !Array.isArray(this.state.tombstones))
162
- throw Error("Invalid runtime machine store");
163
- this.state.tombstones ??= [];
164
- if (this.state.machines.length > 256 || this.state.pairings.length > 16 || this.state.commands.length > COMMAND_HARD_CAP || this.state.tombstones.length > TOMBSTONE_CAP
165
- || this.state.tombstones.some(row => !record(row) || !text(row.id, 128) || !UUID.test(String(row.machineId)) || !/^[a-f0-9]{64}$/.test(row.digest) || !Number.isFinite(row.at))
166
- || this.state.machines.some(row => !record(row) || !record(row.machine) || !UUID.test(String(row.machine.id)) || !text(row.machine.name, 100)
167
- || row.machine.platform !== "win32" || !["pending", "offline", "online", "revoked"].includes(String(row.machine.status))
168
- || !Number.isSafeInteger(row.machine.generation) || row.machine.generation < 0
169
- || row.machine.pairingFingerprint !== undefined && (typeof row.machine.pairingFingerprint !== "string" || !/^[A-F0-9]{4}(?:-[A-F0-9]{4}){2}$/.test(row.machine.pairingFingerprint))
170
- || row.credentialHash !== undefined && !/^[a-f0-9]{64}$/.test(row.credentialHash)
171
- || row.claimHash !== undefined && !/^[a-f0-9]{64}$/.test(row.claimHash))
172
- || new Set(this.state.machines.map(row => row.machine.id)).size !== this.state.machines.length
173
- || this.state.pairings.some(row => !record(row) || !UUID.test(String(row.id)) || !/^[a-f0-9]{64}$/.test(row.codeHash) || !Number.isFinite(row.expiresAt))
174
- || this.state.commands.some(row => !record(row) || !text(row.id, 128) || !UUID.test(String(row.machineId)) || !/^[a-f0-9]{64}$/.test(row.digest)
175
- || !["probe", "workspace", "run", "cancel", "reconcile", "recover"].includes(row.operation)
176
- || !["pending", "accepted", "failed", "uncertain"].includes(row.state) || !Number.isSafeInteger(row.seq) || row.seq < 0))
177
- throw Error("Malformed runtime machine store");
178
- // A coordinator restart never grants execution authority or redelivers an in-flight command.
179
- for (const row of this.state.machines) {
180
- if (row.machine.status === "online")
181
- row.machine.status = "offline";
182
- if (row.claimHash)
183
- row.machine.pairingFingerprint = runtimeFingerprintFromHash(row.claimHash);
184
- }
185
- for (const command of this.state.commands)
186
- if (command.state === "pending")
187
- command.state = interrupted(command);
188
- for (const row of this.state.machines)
189
- if (row.machine.runtimeInfo !== undefined)
190
- row.machine.runtimeInfo = parseRuntimeInfo(row.machine.runtimeInfo);
191
- this.save();
192
- this.heartbeat = setInterval(() => {
193
- for (const connection of this.connections.values()) {
194
- if (!connection.alive) {
195
- connection.ws.terminate();
196
- continue;
197
- }
198
- connection.alive = false;
199
- connection.ws.ping();
200
- }
201
- }, 15_000);
202
- this.heartbeat.unref();
203
- }
204
- now() { return this.options.now?.() ?? Date.now(); }
205
- save() {
206
- const value = JSON.stringify(this.state);
207
- if (Buffer.byteLength(value) > MAX_STORE_BYTES)
208
- throw Error("Runtime machine journal limit reached");
209
- for (let attempt = 0;; attempt++) {
210
- try {
211
- atomicWriteFileSync(this.path, value, { mode: 0o600 });
212
- return;
213
- }
214
- catch (error) {
215
- // Windows scanners can briefly hold a destination open; retain atomic replacement and a bounded retry.
216
- if (process.platform !== "win32" || attempt >= 4 || !["EPERM", "EACCES", "EBUSY"].includes(error.code ?? ""))
217
- throw error;
218
- Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 10 * (attempt + 1));
219
- }
220
- }
221
- }
222
- emit(event) {
223
- try {
224
- this.options.changed?.(event);
225
- }
226
- catch { /* UI observers cannot change the durable verdict. */ }
227
- for (const listener of this.listeners) {
228
- try {
229
- listener(structuredClone(event));
230
- }
231
- catch { /* Observer isolation. */ }
232
- }
233
- }
234
- entry(id) { const row = this.state.machines.find(v => v.machine.id === id); if (!row)
235
- throw Error("Runtime machine not found"); return row; }
236
- listMachines() { return this.state.machines.map(row => machineView(row.machine)); }
237
- machine(id) { const row = this.state.machines.find(v => v.machine.id === id); return row ? machineView(row.machine) : null; }
238
- subscribe(listener) { this.listeners.add(listener); return () => this.listeners.delete(listener); }
239
- createPairing() {
240
- this.state.pairings = this.state.pairings.filter(row => row.expiresAt > this.now());
241
- if (this.state.pairings.length >= 16)
242
- throw Error("Too many pending runtime pairing codes");
243
- const code = randomBytes(6).toString("hex").toUpperCase(), pairingId = randomUUID(), expiresAt = this.now() + PAIR_TTL;
244
- this.state.pairings.push({ id: pairingId, codeHash: hash(code), expiresAt });
245
- this.save();
246
- return { pairingId, code: code.match(/.{4}/g).join("-"), expiresAt };
247
- }
248
- pair(input) {
249
- if (!record(input) || Object.keys(input).some(k => !["code", "name", "platform", "hostname"].includes(k))
250
- || !text(input.code, 32) || !text(input.name, 100) || !input.name.trim() || input.platform !== "win32"
251
- || input.hostname !== undefined && !text(input.hostname, 255))
252
- throw Error("Invalid runtime pairing request");
253
- if (this.state.machines.length >= 256 || this.state.machines.filter(row => row.machine.status !== "revoked").length >= 64)
254
- throw Error("Runtime machine limit reached");
255
- const code = input.code.replaceAll("-", "").toUpperCase();
256
- const pairing = this.state.pairings.find(row => row.expiresAt > this.now() && equal(code, row.codeHash));
257
- if (!pairing)
258
- throw Error("Pairing code is invalid, used or expired");
259
- const machineId = randomUUID(), claimSecret = secret();
260
- this.state.pairings = this.state.pairings.filter(row => row !== pairing);
261
- this.state.machines.push({ machine: { id: machineId, name: input.name.trim(), platform: "win32", ...(input.hostname ? { hostname: input.hostname } : {}), status: "pending", createdAt: this.now(), generation: 0, pairingFingerprint: runtimeFingerprintFromHash(hash(claimSecret)) }, claimHash: hash(claimSecret), claimExpiresAt: pairing.expiresAt });
262
- this.save();
263
- this.emit({ type: "machine", machineId });
264
- return { machineId, claimSecret, status: "pending", expiresAt: pairing.expiresAt };
265
- }
266
- claim(input) {
267
- if (!record(input) || Object.keys(input).some(k => !["machineId", "claimSecret"].includes(k)) || !text(input.machineId, 64) || !text(input.claimSecret, 128))
268
- throw Error("Invalid runtime claim");
269
- const row = this.state.machines.find(row => row.machine.id === input.machineId);
270
- if (!row?.claimHash || !row.claimExpiresAt || row.claimExpiresAt <= this.now() || !equal(input.claimSecret, row.claimHash) || row.machine.status === "revoked")
271
- throw Error("Runtime claim is invalid or expired");
272
- if (!row.machine.approvedAt)
273
- return { status: "pending" };
274
- const credential = secret();
275
- row.credentialHash = hash(credential);
276
- delete row.claimHash;
277
- delete row.claimExpiresAt;
278
- this.save();
279
- return { machineId: row.machine.id, credential, status: "approved" };
280
- }
281
- approve(id, fingerprint) {
282
- const row = this.entry(id);
283
- if (row.machine.status !== "pending" || !row.claimExpiresAt || row.claimExpiresAt <= this.now())
284
- throw Error("Runtime pairing is no longer pending");
285
- if (!fingerprint || fingerprint !== row.machine.pairingFingerprint)
286
- throw Error("Compare the pairing fingerprint shown by this Runtime before approving");
287
- row.machine.approvedAt = this.now();
288
- row.machine.status = "offline";
289
- this.save();
290
- this.emit({ type: "machine", machineId: id });
291
- return structuredClone(row.machine);
292
- }
293
- rename(id, name) {
294
- if (!text(name, 100) || !name.trim())
295
- throw Error("Invalid runtime machine name");
296
- const row = this.entry(id);
297
- row.machine.name = name.trim();
298
- this.save();
299
- this.emit({ type: "machine", machineId: id });
300
- return structuredClone(row.machine);
301
- }
302
- revoke(id) {
303
- const row = this.entry(id);
304
- row.machine.status = "revoked";
305
- delete row.credentialHash;
306
- delete row.claimHash;
307
- delete row.claimExpiresAt;
308
- this.save();
309
- const connection = this.connections.get(id);
310
- if (connection) {
311
- this.connections.delete(id);
312
- this.rejectPending(connection, "Runtime machine was revoked");
313
- this.options.warn?.({ machineId: id, code: 1008, reason: "Machine revoked" }, "Runtime connection closed because the machine was revoked");
314
- connection.ws.close(1008, "Machine revoked");
315
- }
316
- this.emit({ type: "machine", machineId: id });
317
- return structuredClone(row.machine);
318
- }
319
- credentialOwner(auth) {
320
- if (typeof auth !== "string" || !/^Bearer [a-f0-9]{64}$/i.test(auth))
321
- return;
322
- return this.state.machines.find(row => row.credentialHash && row.machine.status !== "revoked" && row.machine.approvedAt && equal(auth.slice(7), row.credentialHash));
323
- }
324
- /** Valid capabilities never share the invalid-traffic bucket of a loopback proxy. Forwarding headers are untrusted. */
325
- rate(key, limit) {
326
- const now = this.now();
327
- for (const [id, value] of this.limits)
328
- if (value.until <= now)
329
- this.limits.delete(id);
330
- if (!this.limits.has(key) && this.limits.size >= 512) {
331
- const invalid = [...this.limits.keys()].find(id => id.startsWith("invalid:"));
332
- if (!invalid || key.startsWith("invalid:"))
333
- return false;
334
- this.limits.delete(invalid);
335
- }
336
- const old = this.limits.get(key), row = old && old.until > now ? old : { count: 0, until: now + 60_000 };
337
- this.limits.set(key, row);
338
- return ++row.count <= limit;
339
- }
340
- requestRateKey(path, input, req) {
341
- if (path === RUNTIME_ROTATE_PATH) {
342
- const row = this.credentialOwner(req.headers.authorization);
343
- if (row)
344
- return `rotate:${row.machine.id}`;
345
- }
346
- else if (record(input)) {
347
- if (path === RUNTIME_PAIR_PATH && text(input.code, 32)) {
348
- const code = input.code.replaceAll("-", "").toUpperCase();
349
- const row = this.state.pairings.find(row => row.expiresAt > this.now() && equal(code, row.codeHash));
350
- if (row)
351
- return `pair:${row.id}`;
352
- }
353
- if (path === RUNTIME_CLAIM_PATH && text(input.claimSecret, 128)) {
354
- const row = this.state.machines.find(row => row.machine.id === input.machineId && row.claimHash && row.claimExpiresAt > this.now()
355
- && row.machine.status !== "revoked" && equal(input.claimSecret, row.claimHash));
356
- if (row)
357
- return `claim:${row.machine.id}`;
358
- }
359
- }
360
- return `invalid:${req.socket.remoteAddress ?? "unknown"}`;
361
- }
362
- rotateCredential(auth, input) {
363
- const row = this.credentialOwner(auth);
364
- if (!row || !record(input) || Object.keys(input).some(key => !["machineId", "credential"].includes(key))
365
- || input.machineId !== row.machine.id || typeof input.credential !== "string" || !/^[a-f0-9]{64}$/.test(input.credential))
366
- throw Error("Invalid runtime credential rotation");
367
- if (!equal(input.credential, row.credentialHash)) {
368
- const before = { credentialHash: row.credentialHash, status: row.machine.status };
369
- row.credentialHash = hash(input.credential);
370
- row.machine.status = "offline";
371
- try {
372
- this.save();
373
- }
374
- catch (error) {
375
- row.credentialHash = before.credentialHash;
376
- row.machine.status = before.status;
377
- throw error;
378
- }
379
- const connection = this.connections.get(row.machine.id);
380
- if (connection) {
381
- this.connections.delete(row.machine.id);
382
- this.rejectPending(connection, "Runtime credential rotated; reconnect to reconcile");
383
- connection.ws.close(1012, "Credential rotated");
384
- }
385
- this.emit({ type: "machine", machineId: row.machine.id });
386
- }
387
- return { machineId: row.machine.id, status: "rotated" };
388
- }
389
- handlePublicRequest(req, res, url) {
390
- if (![RUNTIME_PAIR_PATH, RUNTIME_CLAIM_PATH, RUNTIME_ROTATE_PATH].includes(url.pathname))
391
- return false;
392
- const answer = (status, body) => { if (!res.destroyed && !res.writableEnded) {
393
- res.writeHead(status, { "Content-Type": "application/json", "Cache-Control": "no-store" });
394
- res.end(JSON.stringify(body));
395
- } };
396
- if (this.closed || req.method !== "POST" || url.search || !privateTransport(req)) {
397
- answer(403, { error: "Runtime pairing requires a protected non-browser connection" });
398
- return true;
399
- }
400
- let charged = false;
401
- void readBoundedWebBody(req, 4096).then(bytes => {
402
- const value = JSON.parse(bytes.toString("utf8"));
403
- if (this.closed) {
404
- answer(403, { error: "Runtime coordinator is closed" });
405
- return;
406
- }
407
- const key = this.requestRateKey(url.pathname, value, req);
408
- charged = true;
409
- if (!this.rate(key, key.startsWith("claim:") ? 120 : 30)) {
410
- answer(429, { error: "Too many runtime pairing requests" });
411
- return;
412
- }
413
- if (url.pathname === RUNTIME_ROTATE_PATH) {
414
- if (!this.credentialOwner(req.headers.authorization)) {
415
- answer(401, { error: "Runtime credential was refused" });
416
- return;
417
- }
418
- answer(200, this.rotateCredential(req.headers.authorization, value));
419
- return;
420
- }
421
- if (url.pathname === RUNTIME_PAIR_PATH)
422
- answer(201, this.pair(value));
423
- else {
424
- const result = this.claim(value);
425
- answer(result.status === "pending" ? 202 : 200, result);
426
- }
427
- }).catch(() => {
428
- const allowed = charged || this.rate(`invalid:${req.socket.remoteAddress ?? "unknown"}`, 30);
429
- answer(allowed ? 400 : 429, { error: "Runtime pairing request is invalid, expired or already used" });
430
- });
431
- return true;
432
- }
433
- handleUpgrade(req, socket, head) {
434
- let url;
435
- try {
436
- url = new URL(req.url ?? "", "http://localhost");
437
- }
438
- catch {
439
- return false;
440
- }
441
- if (url.pathname !== RUNTIME_CONNECT_PATH)
442
- return false;
443
- const refuse = () => { socket.end("HTTP/1.1 401 Unauthorized\r\nConnection: close\r\nContent-Length: 0\r\n\r\n"); };
444
- const auth = req.headers.authorization;
445
- if (this.closed || req.method !== "GET" || url.search || !privateTransport(req) || typeof auth !== "string" || !/^Bearer [a-f0-9]{64}$/i.test(auth)) {
446
- refuse();
447
- return true;
448
- }
449
- const row = this.credentialOwner(auth);
450
- if (!row) {
451
- refuse();
452
- return true;
453
- }
454
- this.server.handleUpgrade(req, socket, head, ws => this.attach(ws, row));
455
- return true;
456
- }
457
- current(connection) { return !this.closed && this.connections.get(connection.machineId) === connection && this.entry(connection.machineId).machine.status !== "revoked"; }
458
- attach(ws, row) {
459
- const old = this.connections.get(row.machine.id);
460
- if (old) {
461
- this.rejectPending(old, "Runtime connection was replaced; execution must be reconciled");
462
- this.options.warn?.({ machineId: row.machine.id, code: 1008, reason: "Connection replaced" }, "Runtime connection closed because the same machine credential connected again");
463
- old.ws.close(1008, "Connection replaced");
464
- }
465
- row.machine.generation++;
466
- row.machine.status = "offline";
467
- this.save();
468
- const activity = this.machineActivity.get(row.machine.id) ?? new RuntimeUpdateActivity();
469
- this.machineActivity.set(row.machine.id, activity);
470
- const connection = { ws, machineId: row.machine.id, generation: row.machine.generation, ready: false, alive: true, activity, helloTimer: setTimeout(() => ws.close(1008, "Runtime hello required"), 10_000) };
471
- connection.helloTimer.unref();
472
- this.connections.set(row.machine.id, connection);
473
- ws.on("pong", () => { connection.alive = true; if (this.current(connection))
474
- row.machine.lastSeenAt = this.now(); });
475
- ws.on("message", (data, binary) => {
476
- if (binary) {
477
- ws.close(1008, "Runtime requires JSON text frames");
478
- return;
479
- }
480
- void this.message(connection, data).catch(error => {
481
- // The cause (a static validation message) goes to the log and, trimmed, to the runtime so its terminal can show it.
482
- const reason = error instanceof RuntimeProtocolError ? `Invalid runtime message: ${error.message}`.replace(/[^ -~]/g, "?").slice(0, 120) : "Invalid runtime message";
483
- this.options.warn?.({ machineId: connection.machineId, code: 1008, reason, detail: error instanceof Error ? error.message : String(error) }, "Runtime connection closed because of an invalid runtime message");
484
- ws.close(1008, reason);
485
- });
486
- });
487
- ws.on("error", () => { });
488
- ws.on("close", () => {
489
- clearTimeout(connection.helloTimer);
490
- if (this.connections.get(row.machine.id) !== connection)
491
- return;
492
- this.connections.delete(row.machine.id);
493
- this.rejectPending(connection, "Runtime disconnected; reconcile before retrying");
494
- if (row.machine.status !== "revoked")
495
- row.machine.status = "offline";
496
- this.save();
497
- this.emit({ type: "machine", machineId: row.machine.id });
498
- });
499
- }
500
- send(connection, value) {
501
- if (!this.current(connection) || connection.ws.readyState !== WebSocket.OPEN)
502
- throw Error("Runtime machine is offline");
503
- const frame = JSON.stringify(value);
504
- if (Buffer.byteLength(frame) > RUNTIME_MAX_FRAME_BYTES)
505
- throw Error("Runtime response exceeds the frame limit");
506
- if (connection.ws.bufferedAmount > RUNTIME_MAX_FRAME_BYTES * 2) {
507
- connection.ws.close(1013, "Runtime backpressure");
508
- throw Error("Runtime connection is too slow");
509
- }
510
- connection.ws.send(frame);
511
- }
512
- rejectPending(connection, reason) {
513
- connection.update?.fence.release();
514
- connection.update = undefined;
515
- for (const [id, pending] of this.panePending)
516
- if (pending.machineId === connection.machineId && pending.generation === connection.generation) {
517
- this.panePending.delete(id);
518
- clearTimeout(pending.timer);
519
- pending.reject(Error(reason));
520
- }
521
- let changed = false;
522
- for (const [id, pending] of this.pending)
523
- if (pending.machineId === connection.machineId && pending.generation === connection.generation) {
524
- this.pending.delete(id);
525
- clearTimeout(pending.timer);
526
- const command = this.state.commands.find(row => row.id === id);
527
- if (command?.state === "pending") {
528
- command.state = interrupted(command);
529
- command.error = reason;
530
- changed = true;
531
- }
532
- pending.reject(Error(reason));
533
- }
534
- if (changed)
535
- this.save();
536
- }
537
- validateTask(command, value) {
538
- if (command.operation !== "run" || !record(command.payload) || !record(command.payload.task) || !record(value))
539
- throw new RuntimeProtocolError("Unexpected runtime task");
540
- const input = command.payload.task;
541
- if (value.id !== input.requestId || value.cli !== input.cli || value.cwd !== input.cwd || value.sandbox !== input.sandbox || (value.model ?? "") !== (input.model ?? "")
542
- || !["starting", "running", "cancelling", "completed", "failed", "cancelled"].includes(String(value.status))
543
- || typeof value.startedAt !== "number" || !Number.isFinite(value.startedAt) || typeof value.output !== "string" || value.output.length > 64 * 1024
544
- || value.finishedAt !== undefined && (typeof value.finishedAt !== "number" || !Number.isFinite(value.finishedAt))
545
- || ["completed", "failed", "cancelled"].includes(String(value.status)) && (typeof value.finishedAt !== "number" || typeof value.outcomeConfirmed !== "boolean")
546
- || value.error !== undefined && (typeof value.error !== "string" || value.error.length > 8192)
547
- || value.threadId !== undefined && !text(value.threadId, 256)
548
- || value.threadId !== undefined && command.payload.resumeSessionId !== undefined && value.threadId !== command.payload.resumeSessionId
549
- || value.outcomeConfirmed !== undefined && typeof value.outcomeConfirmed !== "boolean")
550
- throw new RuntimeProtocolError("Invalid runtime task snapshot");
551
- return { id: value.id, cli: value.cli, cwd: value.cwd, sandbox: value.sandbox, ...(value.model ? { model: value.model } : {}),
552
- status: value.status, startedAt: value.startedAt, output: value.output,
553
- ...(value.finishedAt !== undefined ? { finishedAt: value.finishedAt } : {}), ...(value.error ? { error: value.error } : {}), ...(value.threadId ? { threadId: value.threadId } : {}), ...(value.outcomeConfirmed !== undefined ? { outcomeConfirmed: value.outcomeConfirmed } : {}) };
554
- }
555
- admitting(connection) {
556
- return connection.ready && !connection.update && connection.activity.accepting && this.current(connection)
557
- && this.entry(connection.machineId).machine.status === "online" && connection.ws.readyState === WebSocket.OPEN;
558
- }
559
- updateIdle(connection) {
560
- const machine = connection.machineId;
561
- return connection.activity.pending === 0 && !this.hasActiveTask(machine) && connection.ws.bufferedAmount === 0
562
- && ![...this.pending.values(), ...this.panePending.values()].some(pending => pending.machineId === machine)
563
- && ![...this.paneToolPending].some(key => key.startsWith(`${machine}:`));
564
- }
565
- /** Trial metadata is staged until activation: no online event or probe can admit work early. */
566
- promoteRuntime(connection) {
567
- const row = this.entry(connection.machineId), hello = connection.hello;
568
- row.machine.bootId = connection.bootId;
569
- row.machine.status = "online";
570
- row.machine.lastSeenAt = this.now();
571
- if (hello.runtimeInfo)
572
- row.machine.runtimeInfo = hello.runtimeInfo;
573
- else
574
- delete row.machine.runtimeInfo;
575
- if (hello.paneProtocol === 1)
576
- row.machine.paneProtocol = 1;
577
- else
578
- delete row.machine.paneProtocol;
579
- if (hello.inventory !== undefined) {
580
- row.machine.inventory = hello.inventory;
581
- row.machine.inventoryUpdatedAt = this.now();
582
- }
583
- this.save();
584
- }
585
- updateControl(connection, value) {
586
- if (!connection.ready || !connection.managedUpdate)
587
- throw new RuntimeProtocolError("Runtime update was not negotiated");
588
- const control = parseRuntimeUpdateControl(value, "client");
589
- const reply = (phase) => this.send(connection, { v: 1, type: "update.control", id: control.id, bootId: connection.bootId, generation: connection.generation, phase });
590
- if (control.bootId !== connection.bootId || control.generation !== connection.generation) {
591
- reply("cancelled");
592
- return;
593
- }
594
- const owned = connection.update;
595
- if (owned?.phase === "trial") {
596
- if (control.phase !== "activate" || owned.id !== control.id) {
597
- reply("busy");
598
- return;
599
- }
600
- if (!owned.fence.current() || !this.updateIdle(connection)) {
601
- reply("busy");
602
- return;
603
- }
604
- // The supervisor has persisted its activation intent. Lost acknowledgement is uncertain, never rollback permission.
605
- owned.fence.release();
606
- connection.update = undefined;
607
- connection.activatedUpdateId = control.id;
608
- this.promoteRuntime(connection);
609
- reply("activated");
610
- this.emit({ type: "machine", machineId: connection.machineId });
611
- if (!inventoryProbed(this.entry(connection.machineId).machine.inventory))
612
- void this.call(connection.machineId, "probe", { force: true }).catch(() => { });
613
- return;
614
- }
615
- if (control.phase === "activate" && connection.activatedUpdateId === control.id) {
616
- reply("activated");
617
- return;
618
- }
619
- if (control.phase === "prepare") {
620
- if (owned) {
621
- reply(owned.id === control.id ? owned.phase === "committed" ? "commit" : "prepared" : "busy");
622
- return;
623
- }
624
- const fence = connection.activity.tryFence(control.id, () => this.current(connection) && connection.ready && connection.ws.readyState === WebSocket.OPEN, () => this.updateIdle(connection));
625
- if (!fence) {
626
- reply("busy");
627
- return;
628
- }
629
- connection.update = { id: control.id, phase: "prepared", fence };
630
- reply("prepared");
631
- return;
632
- }
633
- if (!owned || owned.id !== control.id) {
634
- reply("cancelled");
635
- return;
636
- }
637
- if (owned.phase === "committed") {
638
- reply("commit");
639
- return;
640
- }
641
- if (control.phase === "ready" && owned.fence.current() && this.updateIdle(connection)) {
642
- owned.phase = "committed";
643
- reply("commit");
644
- return;
645
- }
646
- // A cancellation/busy reply is queued before admitting any later request on this ordered connection.
647
- reply(control.phase === "ready" ? "busy" : "cancelled");
648
- owned.fence.release();
649
- connection.update = undefined;
650
- }
651
- async message(connection, raw) {
652
- if (!this.current(connection))
653
- return;
654
- const value = JSON.parse(raw.toString());
655
- if (!record(value) || value.v !== 1 || !text(value.type, 32))
656
- throw new RuntimeProtocolError("Invalid runtime frame");
657
- const row = this.entry(connection.machineId);
658
- connection.alive = true;
659
- if (value.type === "update.control") {
660
- this.updateControl(connection, value);
661
- return;
662
- }
663
- if (!connection.ready) {
664
- if (value.type !== "hello" || !text(value.bootId, 128))
665
- throw new RuntimeProtocolError("Runtime hello required");
666
- const runtimeInfo = parseRuntimeInfo(value.runtimeInfo);
667
- if (runtimeInfo && !runtimeInfoCompatible(runtimeInfo)) {
668
- // Version skew fails clearly: no welcome, no work, and the Runtime is told to run the install command again. Its report is
669
- // kept (it stays offline) so Settings can show which version needs reinstalling; the pairing itself is untouched.
670
- row.machine.runtimeInfo = runtimeInfo;
671
- row.machine.lastSeenAt = this.now();
672
- this.save();
673
- this.emit({ type: "machine", machineId: connection.machineId });
674
- this.options.warn?.({ machineId: connection.machineId, code: 1008, reason: "Runtime incompatible", detail: `version ${runtimeInfo.version ?? "unknown"}, protocols ${runtimeInfo.protocolVersions.join(",")}, capabilities ${runtimeInfo.capabilities.join(",")}` }, "Runtime connection refused: its version is not compatible with this AgEnD");
675
- connection.ws.close(1008, RUNTIME_REINSTALL_CLOSE_REASON);
676
- return;
677
- }
678
- const managed = runtimeInfo?.capabilities.includes(RUNTIME_MANAGED_UPDATE_CAPABILITY) === true;
679
- if (managed && !validRuntimeUpdateId(value.bootId) || value.updateTrialId !== undefined && (!managed || !validRuntimeUpdateId(value.updateTrialId)))
680
- throw new RuntimeProtocolError("Invalid Runtime update handshake");
681
- const reportedInventory = value.inventory === undefined ? undefined : inventory(value.inventory);
682
- connection.bootId = value.bootId;
683
- connection.managedUpdate = managed;
684
- connection.hello = { runtimeInfo, ...(value.paneProtocol === 1 ? { paneProtocol: 1 } : {}), inventory: reportedInventory };
685
- if (value.updateTrialId !== undefined) {
686
- const fence = connection.activity.tryFence(value.updateTrialId, () => this.current(connection), () => this.updateIdle(connection));
687
- if (!fence)
688
- throw new RuntimeProtocolError("Runtime update trial is busy");
689
- connection.update = { id: value.updateTrialId, phase: "trial", fence };
690
- }
691
- connection.ready = true;
692
- clearTimeout(connection.helloTimer);
693
- if (!connection.update)
694
- this.promoteRuntime(connection);
695
- this.send(connection, { v: 1, type: "welcome", machineId: connection.machineId, generation: connection.generation, ...(managed ? { updateProtocol: 1 } : {}) });
696
- if (connection.update)
697
- return; // A trial has authenticated, but cannot receive tasks or an automatic CLI probe.
698
- this.emit({ type: "machine", machineId: connection.machineId });
699
- // alpha.2 polish (dev-claude's no-chat e2e): a runner that brings no CLI inventory (just paired, nothing detected
700
- // yet) is asked for its own report now — its detection runs on that PC, never on this fleet's loop — so the first
701
- // approval of an agent's request there is not refused for "no available CLI" until someone presses Refresh.
702
- // (#3004 rig: the runner's hello may carry a placeholder — `probedAt: null`, no CLIs — which is no report either.)
703
- // (#3005 rig recheck: `force` — without it the runner answers with its cached inventory, on a fresh profile the same
704
- // placeholder; Refresh sends force, and so does this: detection runs on that PC.)
705
- if (!inventoryProbed(row.machine.inventory))
706
- void this.call(connection.machineId, "probe", { force: true }).catch(() => { });
707
- return;
708
- }
709
- row.machine.lastSeenAt = this.now();
710
- if (connection.update?.phase === "trial")
711
- throw new RuntimeProtocolError("Runtime update trial has not activated");
712
- if (value.type === "pane.tool.request") {
713
- if (row.machine.paneProtocol !== 1 || Object.keys(value).some(key => !["v", "type", "id", "body"].includes(key)) || !UUID.test(String(value.id)))
714
- throw new RuntimeProtocolError("Invalid pane MCP transport request");
715
- const body = validatePaneMcpBody(value.body), id = value.id;
716
- const key = `${connection.machineId}:${connection.generation}:${id}`;
717
- if (this.paneToolPending.size >= 128 || this.paneToolPending.has(key))
718
- throw new RuntimeProtocolError("Pane MCP transport backlog or duplicate request");
719
- let active = true;
720
- const current = () => active && !this.closed && this.current(connection) && connection.ready && connection.ws.readyState === WebSocket.OPEN;
721
- this.paneToolPending.add(key);
722
- let timer;
723
- try {
724
- if (!current() || !this.options.handlePaneMcp || !connection.activity.accepting || connection.activity.pending >= 128)
725
- throw new RuntimeProtocolError("Pane MCP scope unavailable");
726
- // The activity token belongs to the underlying handler, not the deadline race that may finish first.
727
- const physical = connection.activity.run(() => this.options.handlePaneMcp(connection.machineId, body, current));
728
- const result = await Promise.race([physical, new Promise((_resolve, reject) => {
729
- timer = setTimeout(() => { active = false; reject(Error("Pane MCP deadline")); }, 80_000);
730
- timer.unref();
731
- })]);
732
- if (current())
733
- this.send(connection, { v: 1, type: "pane.tool.result", id, ok: true, result });
734
- }
735
- catch {
736
- if (current())
737
- this.send(connection, { v: 1, type: "pane.tool.result", id, ok: false });
738
- }
739
- finally {
740
- active = false;
741
- clearTimeout(timer);
742
- this.paneToolPending.delete(key);
743
- }
744
- return;
745
- }
746
- if (value.type === "pane.output") {
747
- if (row.machine.paneProtocol !== 1)
748
- throw new RuntimeProtocolError("Pane protocol was not negotiated");
749
- const snapshot = validateRuntimePaneSnapshot(value.snapshot);
750
- this.emit({ type: "pane", machineId: connection.machineId, pane: snapshot });
751
- return;
752
- }
753
- if (value.type === "pane.response") {
754
- if (row.machine.paneProtocol !== 1 || !UUID.test(String(value.id)) || typeof value.ok !== "boolean")
755
- throw new RuntimeProtocolError("Invalid pane transport response");
756
- const pending = this.panePending.get(value.id);
757
- if (!pending)
758
- return; // A late reply proves nothing and never replays a command.
759
- if (pending.machineId !== connection.machineId || pending.generation !== connection.generation)
760
- throw new RuntimeProtocolError("Pane response belongs to another connection");
761
- this.panePending.delete(value.id);
762
- clearTimeout(pending.timer);
763
- if (value.ok)
764
- pending.resolve(value.result);
765
- else
766
- pending.reject(Error(typeof value.error === "string" ? value.error.slice(0, 1000) : "Pane operation failed"));
767
- return;
768
- }
769
- if (value.type === "inventory") {
770
- row.machine.inventory = inventory(value.inventory);
771
- row.machine.inventoryUpdatedAt = this.now();
772
- this.save();
773
- this.emit({ type: "machine", machineId: connection.machineId });
774
- return;
775
- }
776
- if (value.type === "task") {
777
- if (!record(value.task) || !Number.isSafeInteger(value.seq) || value.seq < 1)
778
- throw new RuntimeProtocolError("Invalid runtime task event");
779
- const taskValue = value.task;
780
- const command = this.state.commands.find(command => command.id === taskValue.id && command.machineId === connection.machineId && command.operation === "run");
781
- if (!command) {
782
- // #2945 review: a reconnecting runtime republishes what it retained; a run already settled and compacted here
783
- // is acknowledged by its tombstone and changes nothing. An unknown id, or another machine's, still closes.
784
- if (this.tombstoned(connection.machineId, taskValue.id))
785
- return;
786
- throw new RuntimeProtocolError("Runtime task does not belong to this machine");
787
- }
788
- const task = this.validateTask(command, value.task);
789
- if (value.seq <= command.seq)
790
- return;
791
- if (command.task && terminal(command.task) && !terminal(task))
792
- throw new RuntimeProtocolError("Runtime task cannot restart");
793
- command.seq = value.seq;
794
- command.task = task;
795
- command.state = "accepted";
796
- this.save();
797
- this.emit({ type: "task", machineId: connection.machineId, task });
798
- return;
799
- }
800
- if (value.type === "response") {
801
- if (!text(value.id, 128) || typeof value.ok !== "boolean")
802
- throw new RuntimeProtocolError("Invalid runtime response");
803
- const pending = this.pending.get(value.id), command = this.state.commands.find(command => command.id === value.id);
804
- if (!command || command.machineId !== connection.machineId) {
805
- if (!command && this.tombstoned(connection.machineId, value.id))
806
- return;
807
- throw new RuntimeProtocolError("Runtime response does not belong to this machine");
808
- }
809
- if (!pending || pending.generation !== connection.generation)
810
- return;
811
- this.pending.delete(value.id);
812
- clearTimeout(pending.timer);
813
- try {
814
- if (!value.ok) {
815
- command.state = "failed";
816
- command.error = typeof value.error === "string" ? value.error.slice(0, 1024) : "Runtime request failed";
817
- this.save();
818
- pending.reject(Error(command.error));
819
- return;
820
- }
821
- let result = value.result;
822
- if (command.operation === "probe") {
823
- result = inventory(result);
824
- row.machine.inventory = result;
825
- row.machine.inventoryUpdatedAt = this.now();
826
- }
827
- if (command.operation === "run") {
828
- const task = this.validateTask(command, result);
829
- if (!command.task || !terminal(command.task))
830
- command.task = task;
831
- result = command.task;
832
- }
833
- command.state = "accepted";
834
- command.result = result;
835
- this.save();
836
- if (command.task)
837
- this.emit({ type: "task", machineId: connection.machineId, task: command.task });
838
- else if (command.operation === "probe")
839
- this.emit({ type: "machine", machineId: connection.machineId });
840
- pending.resolve(structuredClone(result));
841
- }
842
- catch (error) {
843
- command.state = "uncertain";
844
- this.save();
845
- pending.reject(error instanceof Error ? error : Error("Invalid runtime response"));
846
- throw error;
847
- }
848
- return;
849
- }
850
- if (value.type === "tool.call") {
851
- if (!text(value.id, 128) || !text(value.runId, 128))
852
- throw new RuntimeProtocolError("Invalid runtime tool call");
853
- const command = this.state.commands.find(command => command.id === value.runId && command.machineId === connection.machineId && command.operation === "run");
854
- try {
855
- if (!connection.activity.accepting || connection.activity.pending >= 128 || !command || !record(command.payload) || !record(command.payload.mcp) || command.task && terminal(command.task) || !this.options.handleMcp)
856
- throw new RuntimeProtocolError("Runtime tool call has no active turn");
857
- const body = value.body;
858
- if (!record(body) || Object.keys(body).some(key => !["op", "method", "params", "callId"].includes(key))
859
- || body.op !== "native-mcp" || !record(body.params) || Buffer.byteLength(JSON.stringify(body)) > 64 * 1024)
860
- throw new RuntimeProtocolError("Invalid runtime MCP request");
861
- if (body.method === "tools/list") {
862
- if (Object.keys(body.params).length || body.callId !== undefined)
863
- throw new RuntimeProtocolError("Invalid runtime MCP listing");
864
- }
865
- else if (body.method === "tools/call") {
866
- if (!text(body.callId, 128) || !/^[A-Za-z0-9._:-]+$/.test(body.callId)
867
- || Object.keys(body.params).some(key => !["name", "arguments"].includes(key)) || typeof body.params.name !== "string"
868
- || !Array.isArray(command.payload.mcp.tools) || !command.payload.mcp.tools.includes(body.params.name)
869
- || body.params.arguments !== undefined && !record(body.params.arguments))
870
- throw new RuntimeProtocolError("Runtime MCP tool is outside this turn");
871
- stable(body.params);
872
- }
873
- else
874
- throw new RuntimeProtocolError("Invalid runtime MCP operation");
875
- const result = await connection.activity.run(() => this.options.handleMcp(connection.machineId, value.runId, body));
876
- if (!this.current(connection))
877
- return;
878
- this.send(connection, { v: 1, type: "tool.result", id: value.id, ok: true, result });
879
- }
880
- catch {
881
- if (this.current(connection))
882
- this.send(connection, { v: 1, type: "tool.result", id: value.id, ok: false, error: "Runtime tool call was refused or its turn expired" });
883
- }
884
- return;
885
- }
886
- throw new RuntimeProtocolError("Unknown runtime message");
887
- }
888
- tombstoned(machineId, id) {
889
- return typeof id === "string" && this.state.tombstones.some(row => row.id === id && row.machineId === machineId);
890
- }
891
- /** M-2239 P2-1: settled commands to tombstones (see COMMAND_KEEP_MS); never a pending, uncertain or unconfirmed one. */
892
- compact() {
893
- const now = this.now();
894
- const settled = (command) => !this.pending.has(command.id) && (command.state === "failed"
895
- || command.state === "accepted" && (command.operation !== "run" || !!command.task && terminal(command.task) && command.task.outcomeConfirmed === true));
896
- const drop = new Set(this.state.commands.filter(command => settled(command) && now - command.createdAt > COMMAND_KEEP_MS));
897
- const excess = this.state.commands.length - drop.size - COMMAND_SOFT_CAP;
898
- if (excess > 0)
899
- for (const command of this.state.commands.filter(command => settled(command) && !drop.has(command)).sort((a, b) => a.createdAt - b.createdAt).slice(0, excess))
900
- drop.add(command);
901
- if (!drop.size)
902
- return;
903
- // Room for new tombstones without passing TOMBSTONE_CAP (what the constructor reads back, #2945 review): old ones
904
- // past TOMBSTONE_KEEP_MS give way, oldest first; a younger one never does. Commands beyond that room stay as they
905
- // are — still refused by id from the journal — until room frees up.
906
- const tombstones = this.state.tombstones;
907
- const evictable = tombstones.filter(row => now - row.at > TOMBSTONE_KEEP_MS).sort((a, b) => a.at - b.at);
908
- const room = TOMBSTONE_CAP - tombstones.length + evictable.length;
909
- const moved = [...drop].sort((a, b) => a.createdAt - b.createdAt).slice(0, Math.max(0, room));
910
- if (!moved.length)
911
- return;
912
- const gone = new Set(evictable.slice(0, Math.max(0, tombstones.length + moved.length - TOMBSTONE_CAP)));
913
- const movedSet = new Set(moved);
914
- this.state.tombstones = [...tombstones.filter(row => !gone.has(row)),
915
- ...moved.map(command => ({ id: command.id, machineId: command.machineId, digest: command.digest, at: now }))];
916
- this.state.commands = this.state.commands.filter(command => !movedSet.has(command));
917
- this.save();
918
- }
919
- task(id) { const task = this.state.commands.find(command => command.id === id && command.operation === "run")?.task; return task ? structuredClone(task) : null; }
920
- tasks() { return this.state.commands.flatMap(command => command.operation === "run" && command.task ? [{ machineId: command.machineId, task: structuredClone(command.task) }] : []); }
921
- /** Include journaled sends whose acknowledgement is still missing, so reopening diagnostics cannot hide an uncertain run. */
922
- diagnosticTasks(machineId) {
923
- return this.state.commands.flatMap(command => {
924
- if (command.operation !== "run" || command.machineId !== machineId)
925
- return [];
926
- if (command.task)
927
- return [structuredClone(command.task)];
928
- let input;
929
- try {
930
- input = validateNativeTask(command.payload.task);
931
- }
932
- catch {
933
- return [];
934
- }
935
- const uncertain = command.state === "uncertain", rejected = command.state === "failed";
936
- return [{ id: command.id, cli: input.cli, cwd: input.cwd, sandbox: input.sandbox, ...(input.model ? { model: input.model } : {}),
937
- startedAt: command.createdAt, status: uncertain || rejected ? "failed" : "starting", output: "",
938
- ...(rejected ? { outcomeConfirmed: true, error: command.error || "Runtime request failed" } : {}),
939
- ...(uncertain ? { outcomeConfirmed: false, error: "Remote execution outcome is unconfirmed. Reconnect this runtime to reconcile before sending another task." } : {}) }];
940
- }).sort((a, b) => b.startedAt - a.startedAt).slice(0, 20);
941
- }
942
- hasActiveTask(machineId) { return this.state.commands.some(command => command.machineId === machineId && command.operation === "run" && command.state !== "failed" && (!command.task || !terminal(command.task) || command.task.outcomeConfirmed === false)); }
943
- paneTransportEpoch(machineId) {
944
- const connection = this.connections.get(machineId);
945
- return connection && this.admitting(connection) ? `${this.paneEpoch}:${machineId}:${connection.generation}` : null;
946
- }
947
- /** Pane input replay/sequence authority lives in its pane ledger; reads never fill the exec-task journal. */
948
- async callPane(machineId, raw, maxAgents = 4) {
949
- const request = validateRuntimePaneRequest(raw);
950
- if (!Number.isInteger(maxAgents) || maxAgents < 1 || maxAgents > 16)
951
- throw Error("Invalid machine pane limit");
952
- const machine = this.entry(machineId).machine, connection = this.connections.get(machineId);
953
- if (this.closed || machine.status !== "online" || machine.paneProtocol !== 1 || !connection || !this.admitting(connection))
954
- throw Error("Pane runtime is offline, updating or unsupported");
955
- if (this.panePending.size >= 64)
956
- throw Error("Pane transport capacity reached");
957
- const id = randomUUID();
958
- return new Promise((resolve, reject) => {
959
- const timer = setTimeout(() => { this.panePending.delete(id); reject(Error("Pane response timed out; reconcile before another input")); }, this.options.requestTimeoutMs ?? 30_000);
960
- timer.unref();
961
- this.panePending.set(id, { machineId, generation: connection.generation, resolve, reject, timer });
962
- try {
963
- this.send(connection, { v: 1, type: "pane.request", id, maxAgents, request });
964
- }
965
- catch (error) {
966
- this.panePending.delete(id);
967
- clearTimeout(timer);
968
- reject(error);
969
- }
970
- });
971
- }
972
- /** Explicit switch-off only, after owned pane closes. A normal hub close/restart never shuts its hosts down. */
973
- async shutdownPaneHosts() {
974
- const machines = this.listMachines().filter(machine => machine.status === "online" && machine.paneProtocol === 1);
975
- const outcomes = await Promise.allSettled(machines.map(async (machine) => {
976
- const raw = await this.callPane(machine.id, { action: "list" });
977
- if (!raw || typeof raw.hostBootId !== "string" || !/^[a-f0-9-]{36}$/i.test(raw.hostBootId) || !Array.isArray(raw.panes) || raw.panes.length > 4096)
978
- throw Error("Pane shutdown inventory is unconfirmed");
979
- if (raw.panes.map(validateRuntimePaneSnapshot).some(pane => pane.state !== "exited"))
980
- throw Error("Pane shutdown still has live or unconfirmed work");
981
- validateRuntimePaneShutdown(await this.callPane(machine.id, { action: "shutdown", hostBootId: raw.hostBootId }), raw.hostBootId);
982
- }));
983
- if (outcomes.some(result => result.status === "rejected"))
984
- throw Error("One or more pane hosts could not confirm empty shutdown; retained work stays reserved");
985
- }
986
- async call(machineId, operation, payload) {
987
- if (this.closed || !["probe", "workspace", "run", "cancel", "reconcile", "recover"].includes(operation))
988
- throw Error("Unsupported runtime operation");
989
- const machine = this.entry(machineId).machine;
990
- const connection = this.connections.get(machineId);
991
- if (machine.status !== "online" || !connection || !this.admitting(connection))
992
- throw Error("Runtime machine is offline or updating");
993
- let id = randomUUID(), normalized = payload;
994
- if (operation === "run") {
995
- if (!record(payload) || Object.keys(payload).some(k => !["task", "resumeSessionId", "context", "mcp", "credentialProfile"].includes(k)))
996
- throw Error("Invalid runtime run payload");
997
- const task = validateNativeTask(payload.task);
998
- if (payload.credentialProfile !== undefined) {
999
- assertCredentialProfileName(payload.credentialProfile);
1000
- assertCredentialProfileCli(task.cli);
1001
- }
1002
- if (payload.resumeSessionId !== undefined && !text(payload.resumeSessionId, 256) || payload.context !== undefined && (typeof payload.context !== "string" || payload.context.length > 2000 || payload.context.includes("\0")))
1003
- throw Error("Invalid runtime turn context");
1004
- if (payload.mcp !== undefined && (!record(payload.mcp) || Object.keys(payload.mcp).some(k => k !== "tools") || !Array.isArray(payload.mcp.tools) || !payload.mcp.tools.length || payload.mcp.tools.length > 128 || payload.mcp.tools.some(v => typeof v !== "string" || !/^[a-z][a-z0-9_]{0,63}$/.test(v))))
1005
- throw Error("Invalid runtime tool scope");
1006
- normalized = { ...payload, task };
1007
- id = task.requestId;
1008
- }
1009
- if (operation === "recover") {
1010
- if (!record(payload) || Object.keys(payload).some(key => !["runId", "confirmedStopped"].includes(key))
1011
- || !text(payload.runId, 80) || payload.confirmedStopped !== true)
1012
- throw Error("Runtime recovery requires explicit stopped-process confirmation");
1013
- const original = this.state.commands.find(command => command.id === payload.runId && command.machineId === machineId && command.operation === "run");
1014
- if (!original)
1015
- throw Error("Runtime recovery does not belong to this machine");
1016
- // A runtime that never received the original request can still save a no-execution tombstone after manual
1017
- // confirmation. The original is server-owned; callers cannot replace it with another task or tool scope.
1018
- normalized = { runId: payload.runId, confirmedStopped: true, original: structuredClone(original.payload) };
1019
- }
1020
- const digest = hash(stable({ operation, payload: normalized }));
1021
- if (Buffer.byteLength(JSON.stringify(normalized)) > RUNTIME_MAX_FRAME_BYTES / 2)
1022
- throw Error("Runtime command payload is too large");
1023
- const existing = this.state.commands.find(command => command.id === id);
1024
- if (existing) {
1025
- if (existing.machineId !== machineId || existing.digest !== digest)
1026
- throw Error("Runtime task ID belongs to a different request or machine");
1027
- if (existing.task)
1028
- return structuredClone(existing.task);
1029
- throw Error("Runtime command is already recorded; reconcile it before retrying");
1030
- }
1031
- const tombstone = this.state.tombstones.find(row => row.id === id);
1032
- if (tombstone) {
1033
- if (tombstone.machineId !== machineId || tombstone.digest !== digest)
1034
- throw Error("Runtime task ID belongs to a different request or machine");
1035
- throw Error("Runtime command already ran and its record was compacted; do not retry it");
1036
- }
1037
- if (operation === "run" && this.hasActiveTask(machineId))
1038
- throw Error("Runtime machine is busy or has an unconfirmed task");
1039
- this.compact();
1040
- if (this.state.commands.length >= COMMAND_HARD_CAP)
1041
- throw Error("Runtime command journal limit reached: too many unsettled commands; reconcile them");
1042
- const command = { id, machineId, operation, digest, payload: normalized, createdAt: this.now(), state: "pending", seq: 0 };
1043
- // Journal is committed before the first byte reaches the execution computer. Never auto-send it again.
1044
- this.state.commands.push(command);
1045
- this.save();
1046
- return new Promise((resolve, reject) => {
1047
- const timer = setTimeout(() => {
1048
- this.pending.delete(id);
1049
- command.state = interrupted(command);
1050
- command.error = command.state === "failed" ? "Runtime inventory request timed out" : "Runtime acknowledgment timed out; reconcile before retrying";
1051
- this.save();
1052
- reject(Error(command.error));
1053
- }, this.options.requestTimeoutMs ?? (operation === "probe" ? 90_000 : 30_000));
1054
- timer.unref();
1055
- this.pending.set(id, { machineId, generation: connection.generation, resolve, reject, timer });
1056
- try {
1057
- this.send(connection, { v: 1, type: "request", id, operation, payload: normalized });
1058
- }
1059
- catch (error) {
1060
- this.pending.delete(id);
1061
- clearTimeout(timer);
1062
- command.state = interrupted(command);
1063
- this.save();
1064
- reject(error);
1065
- }
1066
- });
1067
- }
1068
- close() {
1069
- if (this.closed)
1070
- return;
1071
- this.closed = true;
1072
- clearInterval(this.heartbeat);
1073
- for (const activity of this.machineActivity.values())
1074
- activity.close();
1075
- for (const connection of this.connections.values()) {
1076
- clearTimeout(connection.helloTimer);
1077
- this.rejectPending(connection, "Runtime coordinator stopped; reconcile before retrying");
1078
- connection.ws.terminate();
1079
- }
1080
- this.connections.clear();
1081
- for (const row of this.state.machines)
1082
- if (row.machine.status === "online")
1083
- row.machine.status = "offline";
1084
- this.save();
1085
- this.server.close();
1086
- this.listeners.clear();
1087
- }
1088
- }
1089
- //# sourceMappingURL=runtime-coordinator.js.map