@songsid/agend 2.3.5-alpha.4 → 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 (670) hide show
  1. package/README.md +0 -2
  2. package/README.zh-TW.md +0 -2
  3. package/THIRD_PARTY_NOTICES.md +12 -28
  4. package/dist/agent-cli-instructions.md +1 -1
  5. package/dist/agent-credentials.d.ts +24 -0
  6. package/dist/agent-credentials.js +66 -0
  7. package/dist/agent-credentials.js.map +1 -0
  8. package/dist/agent-endpoint.d.ts +4 -6
  9. package/dist/agent-endpoint.js +15 -12
  10. package/dist/agent-endpoint.js.map +1 -1
  11. package/dist/auth-api.d.ts +0 -21
  12. package/dist/auth-api.js +8 -93
  13. package/dist/auth-api.js.map +1 -1
  14. package/dist/authority/session-authorizations.d.ts +30 -4
  15. package/dist/authority/session-authorizations.js +69 -17
  16. package/dist/authority/session-authorizations.js.map +1 -1
  17. package/dist/authority/web-authority.d.ts +2 -12
  18. package/dist/authority/web-authority.js +4 -25
  19. package/dist/authority/web-authority.js.map +1 -1
  20. package/dist/backend/antigravity.js +3 -1
  21. package/dist/backend/antigravity.js.map +1 -1
  22. package/dist/backend/claude-code.d.ts +12 -15
  23. package/dist/backend/claude-code.js +133 -152
  24. package/dist/backend/claude-code.js.map +1 -1
  25. package/dist/backend/codex-metadata.d.ts +14 -0
  26. package/dist/backend/codex-metadata.js +45 -0
  27. package/dist/backend/codex-metadata.js.map +1 -1
  28. package/dist/backend/codex-package.d.ts +2 -5
  29. package/dist/backend/codex-package.js +5 -1
  30. package/dist/backend/codex-package.js.map +1 -1
  31. package/dist/backend/codex-quota-history.d.ts +7 -0
  32. package/dist/backend/codex-quota-history.js +72 -0
  33. package/dist/backend/codex-quota-history.js.map +1 -0
  34. package/dist/backend/codex-session-lookup.d.ts +6 -0
  35. package/dist/backend/codex-session-lookup.js +1 -1
  36. package/dist/backend/codex-session-lookup.js.map +1 -1
  37. package/dist/backend/codex-speed.d.ts +14 -0
  38. package/dist/backend/codex-speed.js +35 -0
  39. package/dist/backend/codex-speed.js.map +1 -0
  40. package/dist/backend/codex.d.ts +116 -136
  41. package/dist/backend/codex.js +912 -942
  42. package/dist/backend/codex.js.map +1 -1
  43. package/dist/backend/grok-weekly-reset.d.ts +24 -0
  44. package/dist/backend/grok-weekly-reset.js +95 -0
  45. package/dist/backend/grok-weekly-reset.js.map +1 -0
  46. package/dist/backend/grok.d.ts +30 -3
  47. package/dist/backend/grok.js +301 -76
  48. package/dist/backend/grok.js.map +1 -1
  49. package/dist/backend/kiro.d.ts +3 -0
  50. package/dist/backend/kiro.js +50 -2
  51. package/dist/backend/kiro.js.map +1 -1
  52. package/dist/backend/muse.js +5 -3
  53. package/dist/backend/muse.js.map +1 -1
  54. package/dist/backend/types.d.ts +15 -8
  55. package/dist/backend/types.js +3 -0
  56. package/dist/backend/types.js.map +1 -1
  57. package/dist/bundled-tmux-guard.d.ts +21 -0
  58. package/dist/bundled-tmux-guard.js +96 -0
  59. package/dist/bundled-tmux-guard.js.map +1 -0
  60. package/dist/cache-ledger.d.ts +95 -0
  61. package/dist/cache-ledger.js +276 -4
  62. package/dist/cache-ledger.js.map +1 -1
  63. package/dist/cache-service.d.ts +5 -0
  64. package/dist/cache-service.js +16 -4
  65. package/dist/cache-service.js.map +1 -1
  66. package/dist/channel/adapters/discord.js +11 -3
  67. package/dist/channel/adapters/discord.js.map +1 -1
  68. package/dist/channel/adapters/telegram.d.ts +51 -0
  69. package/dist/channel/adapters/telegram.js +235 -17
  70. package/dist/channel/adapters/telegram.js.map +1 -1
  71. package/dist/channel/ipc-bridge.d.ts +0 -2
  72. package/dist/channel/mcp-tools.js +3 -3
  73. package/dist/channel/mcp-tools.js.map +1 -1
  74. package/dist/channel/types.d.ts +2 -0
  75. package/dist/classic-channel-manager.d.ts +2 -0
  76. package/dist/classic-channel-manager.js +5 -1
  77. package/dist/classic-channel-manager.js.map +1 -1
  78. package/dist/cli.js +14 -10
  79. package/dist/cli.js.map +1 -1
  80. package/dist/config-validator.js +30 -71
  81. package/dist/config-validator.js.map +1 -1
  82. package/dist/config.js +3 -17
  83. package/dist/config.js.map +1 -1
  84. package/dist/cross-instance-notice.d.ts +10 -0
  85. package/dist/cross-instance-notice.js +67 -5
  86. package/dist/cross-instance-notice.js.map +1 -1
  87. package/dist/daemon.d.ts +70 -68
  88. package/dist/daemon.js +774 -846
  89. package/dist/daemon.js.map +1 -1
  90. package/dist/dashboard-permissions.d.ts +8 -0
  91. package/dist/dashboard-permissions.js +16 -0
  92. package/dist/dashboard-permissions.js.map +1 -1
  93. package/dist/delivery-consumed-watch.d.ts +26 -16
  94. package/dist/delivery-consumed-watch.js +31 -26
  95. package/dist/delivery-consumed-watch.js.map +1 -1
  96. package/dist/delivery-outbox.d.ts +0 -5
  97. package/dist/delivery-outbox.js +4 -32
  98. package/dist/delivery-outbox.js.map +1 -1
  99. package/dist/delivery-reconciliation.d.ts +42 -2
  100. package/dist/delivery-reconciliation.js +164 -2
  101. package/dist/delivery-reconciliation.js.map +1 -1
  102. package/dist/export-import.d.ts +7 -0
  103. package/dist/export-import.js +44 -10
  104. package/dist/export-import.js.map +1 -1
  105. package/dist/fleet-context.d.ts +4 -2
  106. package/dist/fleet-level-config.d.ts +1 -1
  107. package/dist/fleet-level-config.js +0 -2
  108. package/dist/fleet-level-config.js.map +1 -1
  109. package/dist/fleet-manager.d.ts +108 -245
  110. package/dist/fleet-manager.js +656 -2028
  111. package/dist/fleet-manager.js.map +1 -1
  112. package/dist/general-instance.d.ts +0 -7
  113. package/dist/general-instance.js +3 -20
  114. package/dist/general-instance.js.map +1 -1
  115. package/dist/general-knowledge/skills/concepts/SKILL.md +393 -0
  116. package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +1 -0
  117. package/dist/general-knowledge/skills/instance-lifecycle/SKILL.md +3 -1
  118. package/dist/general-knowledge/skills/kiro-engine-migration/SKILL.md +41 -4
  119. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +9 -3
  120. package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
  121. package/dist/instance-config-impact.js +6 -7
  122. package/dist/instance-config-impact.js.map +1 -1
  123. package/dist/instance-lifecycle.d.ts +19 -23
  124. package/dist/instance-lifecycle.js +216 -383
  125. package/dist/instance-lifecycle.js.map +1 -1
  126. package/dist/instance-topic-delete.d.ts +77 -0
  127. package/dist/instance-topic-delete.js +123 -0
  128. package/dist/instance-topic-delete.js.map +1 -0
  129. package/dist/instructions.d.ts +1 -3
  130. package/dist/instructions.js +1 -7
  131. package/dist/instructions.js.map +1 -1
  132. package/dist/kiro-engine-status.d.ts +11 -0
  133. package/dist/kiro-engine-status.js +6 -0
  134. package/dist/kiro-engine-status.js.map +1 -1
  135. package/dist/locale.js +63 -86
  136. package/dist/locale.js.map +1 -1
  137. package/dist/log-service.d.ts +28 -0
  138. package/dist/log-service.js +29 -0
  139. package/dist/log-service.js.map +1 -1
  140. package/dist/log-steps.d.ts +4 -3
  141. package/dist/log-steps.js +32 -7
  142. package/dist/log-steps.js.map +1 -1
  143. package/dist/logger.d.ts +16 -2
  144. package/dist/logger.js +346 -66
  145. package/dist/logger.js.map +1 -1
  146. package/dist/login-flows.d.ts +7 -0
  147. package/dist/login-flows.js +5 -2
  148. package/dist/login-flows.js.map +1 -1
  149. package/dist/login-manager.js +25 -4
  150. package/dist/login-manager.js.map +1 -1
  151. package/dist/missed-offline.d.ts +25 -0
  152. package/dist/missed-offline.js +79 -0
  153. package/dist/missed-offline.js.map +1 -0
  154. package/dist/muse-usage-relay.d.ts +2 -0
  155. package/dist/muse-usage-relay.js +5 -3
  156. package/dist/muse-usage-relay.js.map +1 -1
  157. package/dist/needs-you-hub.d.ts +6 -3
  158. package/dist/needs-you-hub.js +31 -9
  159. package/dist/needs-you-hub.js.map +1 -1
  160. package/dist/needs-you.d.ts +20 -18
  161. package/dist/needs-you.js +18 -14
  162. package/dist/needs-you.js.map +1 -1
  163. package/dist/office-share-page.js +1 -1
  164. package/dist/office-share-page.js.map +1 -1
  165. package/dist/outbound-handlers.d.ts +2 -16
  166. package/dist/outbound-handlers.js +10 -72
  167. package/dist/outbound-handlers.js.map +1 -1
  168. package/dist/outbound-schemas.d.ts +0 -38
  169. package/dist/outbound-schemas.js +5 -14
  170. package/dist/outbound-schemas.js.map +1 -1
  171. package/dist/pane-quota-history.d.ts +7 -0
  172. package/dist/pane-quota-history.js +47 -0
  173. package/dist/pane-quota-history.js.map +1 -0
  174. package/dist/platform-general.d.ts +46 -0
  175. package/dist/platform-general.js +91 -0
  176. package/dist/platform-general.js.map +1 -0
  177. package/dist/public-web-gateway.js +0 -9
  178. package/dist/public-web-gateway.js.map +1 -1
  179. package/dist/public-web-link.d.ts +0 -11
  180. package/dist/public-web-link.js +0 -13
  181. package/dist/public-web-link.js.map +1 -1
  182. package/dist/queued-handoffs.d.ts +33 -0
  183. package/dist/queued-handoffs.js +75 -0
  184. package/dist/queued-handoffs.js.map +1 -0
  185. package/dist/quickstart-api.js +5 -9
  186. package/dist/quickstart-api.js.map +1 -1
  187. package/dist/quickstart.d.ts +8 -1
  188. package/dist/quickstart.js +42 -4
  189. package/dist/quickstart.js.map +1 -1
  190. package/dist/quota-notice-config.d.ts +22 -0
  191. package/dist/quota-notice-config.js +41 -0
  192. package/dist/quota-notice-config.js.map +1 -0
  193. package/dist/quota-notice.d.ts +7 -0
  194. package/dist/quota-notice.js +40 -0
  195. package/dist/quota-notice.js.map +1 -1
  196. package/dist/reply-buttons-controller.js +10 -6
  197. package/dist/reply-buttons-controller.js.map +1 -1
  198. package/dist/reply-polls.d.ts +2 -2
  199. package/dist/reply-polls.js +3 -3
  200. package/dist/reply-polls.js.map +1 -1
  201. package/dist/scheduler/db.d.ts +2 -1
  202. package/dist/scheduler/db.js +23 -9
  203. package/dist/scheduler/db.js.map +1 -1
  204. package/dist/scheduler/task-board.d.ts +9 -0
  205. package/dist/scheduler/task-board.js +19 -0
  206. package/dist/scheduler/task-board.js.map +1 -1
  207. package/dist/settings-api.d.ts +13 -5
  208. package/dist/settings-api.js +26 -96
  209. package/dist/settings-api.js.map +1 -1
  210. package/dist/settings-baseline.d.ts +0 -1
  211. package/dist/settings-baseline.js +1 -1
  212. package/dist/settings-baseline.js.map +1 -1
  213. package/dist/settings-change.js +23 -28
  214. package/dist/settings-change.js.map +1 -1
  215. package/dist/settings-confirmation.d.ts +1 -16
  216. package/dist/settings-confirmation.js +9 -47
  217. package/dist/settings-confirmation.js.map +1 -1
  218. package/dist/settings-effect.d.ts +0 -4
  219. package/dist/settings-effect.js +1 -58
  220. package/dist/settings-effect.js.map +1 -1
  221. package/dist/settings-http-confirmation.d.ts +0 -4
  222. package/dist/settings-http-confirmation.js +3 -31
  223. package/dist/settings-http-confirmation.js.map +1 -1
  224. package/dist/settings-instance-patch.js +28 -1
  225. package/dist/settings-instance-patch.js.map +1 -1
  226. package/dist/settings-request-capability.d.ts +0 -2
  227. package/dist/settings-request-capability.js +0 -4
  228. package/dist/settings-request-capability.js.map +1 -1
  229. package/dist/settings-transaction.d.ts +0 -4
  230. package/dist/settings-transaction.js +0 -9
  231. package/dist/settings-transaction.js.map +1 -1
  232. package/dist/setup-form.js +3 -6
  233. package/dist/setup-form.js.map +1 -1
  234. package/dist/setup-i18n.js +0 -3
  235. package/dist/setup-i18n.js.map +1 -1
  236. package/dist/task-board-tool.d.ts +11 -0
  237. package/dist/task-board-tool.js +44 -0
  238. package/dist/task-board-tool.js.map +1 -1
  239. package/dist/task-board-waker.d.ts +6 -0
  240. package/dist/task-board-waker.js +4 -0
  241. package/dist/task-board-waker.js.map +1 -1
  242. package/dist/tmux-control.d.ts +1 -2
  243. package/dist/tmux-control.js.map +1 -1
  244. package/dist/tmux-manager.d.ts +1 -2
  245. package/dist/tmux-manager.js.map +1 -1
  246. package/dist/tool-permissions.d.ts +5 -2
  247. package/dist/tool-permissions.js +7 -7
  248. package/dist/tool-permissions.js.map +1 -1
  249. package/dist/tool-progress.d.ts +2 -0
  250. package/dist/tool-progress.js +19 -3
  251. package/dist/tool-progress.js.map +1 -1
  252. package/dist/topic-commands.js +4 -3
  253. package/dist/topic-commands.js.map +1 -1
  254. package/dist/transcript-delta-reader.d.ts +1 -1
  255. package/dist/transcript-delta-reader.js +1 -1
  256. package/dist/transcript-delta-reader.js.map +1 -1
  257. package/dist/transcript-monitor.d.ts +20 -3
  258. package/dist/transcript-monitor.js +92 -24
  259. package/dist/transcript-monitor.js.map +1 -1
  260. package/dist/transcript-sources.d.ts +0 -5
  261. package/dist/transcript-sources.js +79 -8
  262. package/dist/transcript-sources.js.map +1 -1
  263. package/dist/types.d.ts +3 -23
  264. package/dist/ui/app.html +8 -1
  265. package/dist/ui/backend-signin.js +21 -36
  266. package/dist/ui/chat-md-strings.js +9 -0
  267. package/dist/ui/chat-store.js +2 -13
  268. package/dist/ui/chat-strings.js +2 -50
  269. package/dist/ui/chat-thread.js +53 -3
  270. package/dist/ui/fleet-task-card.js +3 -3
  271. package/dist/ui/fleet-task-common.js +10 -0
  272. package/dist/ui/fleet-tasks.js +7 -5
  273. package/dist/ui/fleet-usage.js +90 -27
  274. package/dist/ui/panel-chat.js +37 -66
  275. package/dist/ui/panel-details.js +1 -2
  276. package/dist/ui/panel-fleet.js +88 -107
  277. package/dist/ui/panel-needs.js +21 -163
  278. package/dist/ui/panel-notices.js +4 -3
  279. package/dist/ui/panel-settings.js +149 -239
  280. package/dist/ui/preview-panel.js +84 -6
  281. package/dist/ui/search-dialog.js +3 -2
  282. package/dist/ui/settings-appearance.js +23 -122
  283. package/dist/ui/settings-catalog.js +10 -37
  284. package/dist/ui/settings-codex-copy.js +19 -0
  285. package/dist/ui/settings-confirm.js +1 -3
  286. package/dist/ui/settings-dialogs.js +20 -27
  287. package/dist/ui/settings-guests.js +14 -27
  288. package/dist/ui/settings-model.js +17 -12
  289. package/dist/ui/settings-quota-notice.js +100 -0
  290. package/dist/ui/settings-registry.js +4 -11
  291. package/dist/ui/settings-strings.js +4 -113
  292. package/dist/ui/settings-web-authority.js +13 -15
  293. package/dist/ui/shared/app-i18n.js +2 -2
  294. package/dist/ui/shared/app-needs.js +1 -1
  295. package/dist/ui/shared/app-route.js +2 -6
  296. package/dist/ui/shared/app-shell.js +18 -23
  297. package/dist/ui/shared/app-store.js +2 -3
  298. package/dist/ui/shared/app-stream.js +1 -3
  299. package/dist/ui/shared/app.css +40 -1312
  300. package/dist/ui/shared/app.js +2 -5
  301. package/dist/ui/shared/header-tools.js +4 -6
  302. package/dist/ui/shared/instance-nav.js +7 -34
  303. package/dist/ui/shared/instance-switch.js +3 -4
  304. package/dist/ui/shared/loading.css +37 -0
  305. package/dist/ui/shared/panel-view.js +77 -4
  306. package/dist/ui/shared/signin.js +6 -39
  307. package/dist/ui/shared/tokens.css +0 -1
  308. package/dist/ui/shared/ui-dialog.js +2 -2
  309. package/dist/ui/shared/ui-menu.js +10 -30
  310. package/dist/ui/shared/ui-states.js +14 -3
  311. package/dist/ui/shared/usage-dialog.js +18 -1
  312. package/dist/ui/shared/vendor/vendor.json +2 -19
  313. package/dist/ui/shared/view-history.css +17 -0
  314. package/dist/ui/shared/view-history.js +438 -0
  315. package/dist/ui/shared/view-strings.js +16 -8
  316. package/dist/ui/signin.html +5 -2
  317. package/dist/unattended-install.d.ts +11 -2
  318. package/dist/unattended-install.js +39 -5
  319. package/dist/unattended-install.js.map +1 -1
  320. package/dist/usage/capacity.d.ts +69 -0
  321. package/dist/usage/capacity.js +119 -0
  322. package/dist/usage/capacity.js.map +1 -0
  323. package/dist/usage/i18n-keys.d.ts +1 -1
  324. package/dist/usage/i18n-keys.js +3 -0
  325. package/dist/usage/i18n-keys.js.map +1 -1
  326. package/dist/usage/profile-timeline.d.ts +16 -0
  327. package/dist/usage/profile-timeline.js +58 -0
  328. package/dist/usage/profile-timeline.js.map +1 -0
  329. package/dist/usage/providers.d.ts +5 -0
  330. package/dist/usage/providers.js +5 -0
  331. package/dist/usage/providers.js.map +1 -1
  332. package/dist/usage/quota-history.d.ts +43 -0
  333. package/dist/usage/quota-history.js +168 -0
  334. package/dist/usage/quota-history.js.map +1 -0
  335. package/dist/usage/quota-notices.d.ts +38 -0
  336. package/dist/usage/quota-notices.js +160 -0
  337. package/dist/usage/quota-notices.js.map +1 -0
  338. package/dist/usage/usage-api.d.ts +32 -0
  339. package/dist/usage/usage-api.js +96 -1
  340. package/dist/usage/usage-api.js.map +1 -1
  341. package/dist/usage-report.d.ts +25 -1
  342. package/dist/usage-report.js +55 -4
  343. package/dist/usage-report.js.map +1 -1
  344. package/dist/usage-rollup.d.ts +6 -1
  345. package/dist/usage-rollup.js +16 -4
  346. package/dist/usage-rollup.js.map +1 -1
  347. package/dist/view-api.d.ts +16 -0
  348. package/dist/view-api.js +100 -16
  349. package/dist/view-api.js.map +1 -1
  350. package/dist/view-history.d.ts +84 -0
  351. package/dist/view-history.js +116 -0
  352. package/dist/view-history.js.map +1 -0
  353. package/dist/web-api.d.ts +6 -38
  354. package/dist/web-api.js +20 -255
  355. package/dist/web-api.js.map +1 -1
  356. package/dist/web-chat-history.d.ts +2 -19
  357. package/dist/web-chat-history.js +3 -72
  358. package/dist/web-chat-history.js.map +1 -1
  359. package/dist/web-only-fleet.d.ts +0 -20
  360. package/dist/web-only-fleet.js +0 -21
  361. package/dist/web-only-fleet.js.map +1 -1
  362. package/dist/web-session-authorization.d.ts +13 -2
  363. package/dist/web-session-authorization.js +10 -3
  364. package/dist/web-session-authorization.js.map +1 -1
  365. package/dist/web-session.d.ts +0 -7
  366. package/dist/web-session.js +0 -2
  367. package/dist/web-session.js.map +1 -1
  368. package/dist/web-shell-routes.d.ts +1 -4
  369. package/dist/web-shell-routes.js +2 -7
  370. package/dist/web-shell-routes.js.map +1 -1
  371. package/launcher/private-home.cjs +1 -1
  372. package/package.json +3 -9
  373. package/dist/agent-runtime-api.d.ts +0 -4
  374. package/dist/agent-runtime-api.js +0 -59
  375. package/dist/agent-runtime-api.js.map +0 -1
  376. package/dist/agent-runtime-change.d.ts +0 -74
  377. package/dist/agent-runtime-change.js +0 -102
  378. package/dist/agent-runtime-change.js.map +0 -1
  379. package/dist/backend/grok-model-cache.d.ts +0 -7
  380. package/dist/backend/grok-model-cache.js +0 -65
  381. package/dist/backend/grok-model-cache.js.map +0 -1
  382. package/dist/backend/native-pane.d.ts +0 -9
  383. package/dist/backend/native-pane.js +0 -59
  384. package/dist/backend/native-pane.js.map +0 -1
  385. package/dist/fleet-windows-runtime.d.ts +0 -97
  386. package/dist/fleet-windows-runtime.js +0 -449
  387. package/dist/fleet-windows-runtime.js.map +0 -1
  388. package/dist/general-binding.d.ts +0 -85
  389. package/dist/general-binding.js +0 -298
  390. package/dist/general-binding.js.map +0 -1
  391. package/dist/general-host-owner.d.ts +0 -8
  392. package/dist/general-host-owner.js +0 -26
  393. package/dist/general-host-owner.js.map +0 -1
  394. package/dist/general-role.d.ts +0 -5
  395. package/dist/general-role.js +0 -26
  396. package/dist/general-role.js.map +0 -1
  397. package/dist/local-pane-endpoint.d.ts +0 -46
  398. package/dist/local-pane-endpoint.js +0 -189
  399. package/dist/local-pane-endpoint.js.map +0 -1
  400. package/dist/local-pane-launcher.d.ts +0 -2
  401. package/dist/local-pane-launcher.js +0 -38
  402. package/dist/local-pane-launcher.js.map +0 -1
  403. package/dist/local-pane-stage.ps1 +0 -101
  404. package/dist/model-catalog-defaults.d.ts +0 -14
  405. package/dist/model-catalog-defaults.js +0 -20
  406. package/dist/model-catalog-defaults.js.map +0 -1
  407. package/dist/native-agent-admission.d.ts +0 -7
  408. package/dist/native-agent-admission.js +0 -26
  409. package/dist/native-agent-admission.js.map +0 -1
  410. package/dist/native-daemon-client.d.ts +0 -13
  411. package/dist/native-daemon-client.js +0 -28
  412. package/dist/native-daemon-client.js.map +0 -1
  413. package/dist/native-instance-api.d.ts +0 -14
  414. package/dist/native-instance-api.js +0 -205
  415. package/dist/native-instance-api.js.map +0 -1
  416. package/dist/native-instance-input.d.ts +0 -84
  417. package/dist/native-instance-input.js +0 -54
  418. package/dist/native-instance-input.js.map +0 -1
  419. package/dist/native-instance-registry.d.ts +0 -32
  420. package/dist/native-instance-registry.js +0 -105
  421. package/dist/native-instance-registry.js.map +0 -1
  422. package/dist/native-mcp.d.ts +0 -40
  423. package/dist/native-mcp.js +0 -278
  424. package/dist/native-mcp.js.map +0 -1
  425. package/dist/native-model-catalog.d.ts +0 -5
  426. package/dist/native-model-catalog.js +0 -76
  427. package/dist/native-model-catalog.js.map +0 -1
  428. package/dist/native-pane-crash-budget.d.ts +0 -20
  429. package/dist/native-pane-crash-budget.js +0 -60
  430. package/dist/native-pane-crash-budget.js.map +0 -1
  431. package/dist/native-pane-create.d.ts +0 -26
  432. package/dist/native-pane-create.js +0 -53
  433. package/dist/native-pane-create.js.map +0 -1
  434. package/dist/native-pane-lifecycle.d.ts +0 -65
  435. package/dist/native-pane-lifecycle.js +0 -230
  436. package/dist/native-pane-lifecycle.js.map +0 -1
  437. package/dist/native-pane-manager.d.ts +0 -59
  438. package/dist/native-pane-manager.js +0 -584
  439. package/dist/native-pane-manager.js.map +0 -1
  440. package/dist/native-pane-output-log.d.ts +0 -15
  441. package/dist/native-pane-output-log.js +0 -108
  442. package/dist/native-pane-output-log.js.map +0 -1
  443. package/dist/native-pane-reconciliation.d.ts +0 -4
  444. package/dist/native-pane-reconciliation.js +0 -40
  445. package/dist/native-pane-reconciliation.js.map +0 -1
  446. package/dist/native-pane-recovery.d.ts +0 -12
  447. package/dist/native-pane-recovery.js +0 -10
  448. package/dist/native-pane-recovery.js.map +0 -1
  449. package/dist/native-pane-tools.d.ts +0 -2
  450. package/dist/native-pane-tools.js +0 -14
  451. package/dist/native-pane-tools.js.map +0 -1
  452. package/dist/pane-port.d.ts +0 -118
  453. package/dist/pane-port.js +0 -2
  454. package/dist/pane-port.js.map +0 -1
  455. package/dist/runtime-api.d.ts +0 -8
  456. package/dist/runtime-api.js +0 -171
  457. package/dist/runtime-api.js.map +0 -1
  458. package/dist/runtime-assets/@xterm/addon-serialize/LICENSE +0 -21
  459. package/dist/runtime-assets/@xterm/addon-serialize/lib/addon-serialize.js +0 -2
  460. package/dist/runtime-assets/@xterm/addon-serialize/lib/addon-serialize.mjs +0 -19
  461. package/dist/runtime-assets/@xterm/addon-serialize/package.json +0 -29
  462. package/dist/runtime-assets/@xterm/headless/LICENSE +0 -21
  463. package/dist/runtime-assets/@xterm/headless/lib-headless/xterm-headless.js +0 -2
  464. package/dist/runtime-assets/@xterm/headless/lib-headless/xterm-headless.mjs +0 -46
  465. package/dist/runtime-assets/@xterm/headless/package.json +0 -29
  466. package/dist/runtime-assets/node-pty/CONPTY-LICENSE +0 -21
  467. package/dist/runtime-assets/node-pty/CONPTY-NOTICE.md +0 -503
  468. package/dist/runtime-assets/node-pty/LICENSE +0 -69
  469. package/dist/runtime-assets/node-pty/lib/conpty_console_list_agent.js +0 -16
  470. package/dist/runtime-assets/node-pty/lib/eventEmitter2.js +0 -47
  471. package/dist/runtime-assets/node-pty/lib/index.js +0 -52
  472. package/dist/runtime-assets/node-pty/lib/interfaces.js +0 -7
  473. package/dist/runtime-assets/node-pty/lib/shared/conout.js +0 -11
  474. package/dist/runtime-assets/node-pty/lib/terminal.js +0 -190
  475. package/dist/runtime-assets/node-pty/lib/types.js +0 -7
  476. package/dist/runtime-assets/node-pty/lib/unixTerminal.js +0 -346
  477. package/dist/runtime-assets/node-pty/lib/utils.js +0 -39
  478. package/dist/runtime-assets/node-pty/lib/windowsConoutConnection.js +0 -125
  479. package/dist/runtime-assets/node-pty/lib/windowsPtyAgent.js +0 -320
  480. package/dist/runtime-assets/node-pty/lib/windowsTerminal.js +0 -199
  481. package/dist/runtime-assets/node-pty/lib/worker/conoutSocketWorker.js +0 -22
  482. package/dist/runtime-assets/node-pty/package.json +0 -64
  483. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
  484. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
  485. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
  486. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  487. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
  488. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
  489. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty.node +0 -0
  490. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
  491. package/dist/runtime-build-info.d.ts +0 -9
  492. package/dist/runtime-build-info.js +0 -57
  493. package/dist/runtime-build-info.js.map +0 -1
  494. package/dist/runtime-bundle.d.ts +0 -19
  495. package/dist/runtime-bundle.js +0 -156
  496. package/dist/runtime-bundle.js.map +0 -1
  497. package/dist/runtime-cli.d.ts +0 -7
  498. package/dist/runtime-cli.js +0 -152
  499. package/dist/runtime-cli.js.map +0 -1
  500. package/dist/runtime-client-store.d.ts +0 -68
  501. package/dist/runtime-client-store.js +0 -344
  502. package/dist/runtime-client-store.js.map +0 -1
  503. package/dist/runtime-client.d.ts +0 -112
  504. package/dist/runtime-client.js +0 -736
  505. package/dist/runtime-client.js.map +0 -1
  506. package/dist/runtime-connection.d.ts +0 -22
  507. package/dist/runtime-connection.js +0 -93
  508. package/dist/runtime-connection.js.map +0 -1
  509. package/dist/runtime-coordinator.d.ts +0 -91
  510. package/dist/runtime-coordinator.js +0 -911
  511. package/dist/runtime-coordinator.js.map +0 -1
  512. package/dist/runtime-general-protocol.d.ts +0 -22
  513. package/dist/runtime-general-protocol.js +0 -57
  514. package/dist/runtime-general-protocol.js.map +0 -1
  515. package/dist/runtime-general-workspace.d.ts +0 -17
  516. package/dist/runtime-general-workspace.js +0 -213
  517. package/dist/runtime-general-workspace.js.map +0 -1
  518. package/dist/runtime-pane-assets.d.ts +0 -17
  519. package/dist/runtime-pane-assets.js +0 -23
  520. package/dist/runtime-pane-assets.js.map +0 -1
  521. package/dist/runtime-pane-boot.d.ts +0 -9
  522. package/dist/runtime-pane-boot.js +0 -47
  523. package/dist/runtime-pane-boot.js.map +0 -1
  524. package/dist/runtime-pane-codex-index.d.ts +0 -1
  525. package/dist/runtime-pane-codex-index.js +0 -47
  526. package/dist/runtime-pane-codex-index.js.map +0 -1
  527. package/dist/runtime-pane-config.d.ts +0 -16
  528. package/dist/runtime-pane-config.js +0 -54
  529. package/dist/runtime-pane-config.js.map +0 -1
  530. package/dist/runtime-pane-host.d.ts +0 -44
  531. package/dist/runtime-pane-host.js +0 -424
  532. package/dist/runtime-pane-host.js.map +0 -1
  533. package/dist/runtime-pane-job-owner.d.ts +0 -1
  534. package/dist/runtime-pane-job-owner.js +0 -29
  535. package/dist/runtime-pane-job-owner.js.map +0 -1
  536. package/dist/runtime-pane-job.ps1 +0 -116
  537. package/dist/runtime-pane-link.d.ts +0 -40
  538. package/dist/runtime-pane-link.js +0 -246
  539. package/dist/runtime-pane-link.js.map +0 -1
  540. package/dist/runtime-pane-mcp-protocol.d.ts +0 -32
  541. package/dist/runtime-pane-mcp-protocol.js +0 -39
  542. package/dist/runtime-pane-mcp-protocol.js.map +0 -1
  543. package/dist/runtime-pane-mcp-relay.d.ts +0 -17
  544. package/dist/runtime-pane-mcp-relay.js +0 -70
  545. package/dist/runtime-pane-mcp-relay.js.map +0 -1
  546. package/dist/runtime-pane-mcp.d.ts +0 -51
  547. package/dist/runtime-pane-mcp.js +0 -150
  548. package/dist/runtime-pane-mcp.js.map +0 -1
  549. package/dist/runtime-pane-native.d.ts +0 -45
  550. package/dist/runtime-pane-native.js +0 -65
  551. package/dist/runtime-pane-native.js.map +0 -1
  552. package/dist/runtime-pane-output.d.ts +0 -19
  553. package/dist/runtime-pane-output.js +0 -53
  554. package/dist/runtime-pane-output.js.map +0 -1
  555. package/dist/runtime-pane-port.d.ts +0 -139
  556. package/dist/runtime-pane-port.js +0 -558
  557. package/dist/runtime-pane-port.js.map +0 -1
  558. package/dist/runtime-pane-private.d.ts +0 -14
  559. package/dist/runtime-pane-private.js +0 -51
  560. package/dist/runtime-pane-private.js.map +0 -1
  561. package/dist/runtime-pane-private.ps1 +0 -14
  562. package/dist/runtime-pane-process.d.ts +0 -4
  563. package/dist/runtime-pane-process.js +0 -108
  564. package/dist/runtime-pane-process.js.map +0 -1
  565. package/dist/runtime-pane-protocol.d.ts +0 -172
  566. package/dist/runtime-pane-protocol.js +0 -195
  567. package/dist/runtime-pane-protocol.js.map +0 -1
  568. package/dist/runtime-pane-screen.d.ts +0 -19
  569. package/dist/runtime-pane-screen.js +0 -76
  570. package/dist/runtime-pane-screen.js.map +0 -1
  571. package/dist/runtime-pane-service.d.ts +0 -11
  572. package/dist/runtime-pane-service.js +0 -221
  573. package/dist/runtime-pane-service.js.map +0 -1
  574. package/dist/runtime-pane-stdio-protocol.d.ts +0 -54
  575. package/dist/runtime-pane-stdio-protocol.js +0 -94
  576. package/dist/runtime-pane-stdio-protocol.js.map +0 -1
  577. package/dist/runtime-pane-stdio.d.ts +0 -3
  578. package/dist/runtime-pane-stdio.js +0 -123
  579. package/dist/runtime-pane-stdio.js.map +0 -1
  580. package/dist/runtime-pane-store.d.ts +0 -33
  581. package/dist/runtime-pane-store.js +0 -164
  582. package/dist/runtime-pane-store.js.map +0 -1
  583. package/dist/runtime-pane-transcript-protocol.d.ts +0 -43
  584. package/dist/runtime-pane-transcript-protocol.js +0 -58
  585. package/dist/runtime-pane-transcript-protocol.js.map +0 -1
  586. package/dist/runtime-pane-transcript.d.ts +0 -45
  587. package/dist/runtime-pane-transcript.js +0 -605
  588. package/dist/runtime-pane-transcript.js.map +0 -1
  589. package/dist/runtime-pane-worker.d.ts +0 -1
  590. package/dist/runtime-pane-worker.js +0 -154
  591. package/dist/runtime-pane-worker.js.map +0 -1
  592. package/dist/runtime-protocol.d.ts +0 -162
  593. package/dist/runtime-protocol.js +0 -37
  594. package/dist/runtime-protocol.js.map +0 -1
  595. package/dist/runtime-switches.d.ts +0 -79
  596. package/dist/runtime-switches.js +0 -90
  597. package/dist/runtime-switches.js.map +0 -1
  598. package/dist/runtime-transcript-delta-reader.d.ts +0 -23
  599. package/dist/runtime-transcript-delta-reader.js +0 -74
  600. package/dist/runtime-transcript-delta-reader.js.map +0 -1
  601. package/dist/runtime-transcript-source.d.ts +0 -36
  602. package/dist/runtime-transcript-source.js +0 -189
  603. package/dist/runtime-transcript-source.js.map +0 -1
  604. package/dist/runtime-windows-bridge.d.ts +0 -41
  605. package/dist/runtime-windows-bridge.js +0 -157
  606. package/dist/runtime-windows-bridge.js.map +0 -1
  607. package/dist/settings-route-lifetime.d.ts +0 -14
  608. package/dist/settings-route-lifetime.js +0 -48
  609. package/dist/settings-route-lifetime.js.map +0 -1
  610. package/dist/tmux-pane-host.d.ts +0 -26
  611. package/dist/tmux-pane-host.js +0 -25
  612. package/dist/tmux-pane-host.js.map +0 -1
  613. package/dist/transcript-needles.d.ts +0 -35
  614. package/dist/transcript-needles.js +0 -158
  615. package/dist/transcript-needles.js.map +0 -1
  616. package/dist/transcript-records.d.ts +0 -21
  617. package/dist/transcript-records.js +0 -140
  618. package/dist/transcript-records.js.map +0 -1
  619. package/dist/ui/agent-proposals.js +0 -90
  620. package/dist/ui/agent-runtime-settings.js +0 -67
  621. package/dist/ui/agent-runtime.js +0 -124
  622. package/dist/ui/cli-picker.js +0 -42
  623. package/dist/ui/general-location.js +0 -71
  624. package/dist/ui/native-instance-settings.js +0 -44
  625. package/dist/ui/native-pane-recovery.js +0 -45
  626. package/dist/ui/panel-runtimes.js +0 -334
  627. package/dist/ui/panel-windows-agent.js +0 -86
  628. package/dist/ui/panel-windows-cli.js +0 -179
  629. package/dist/ui/provider-marks.js +0 -83
  630. package/dist/ui/runtime-catalog.js +0 -55
  631. package/dist/ui/settings-agent-filters.js +0 -94
  632. package/dist/ui/settings-layout.js +0 -245
  633. package/dist/ui/settings-outside.js +0 -176
  634. package/dist/ui/settings-shortcuts.js +0 -65
  635. package/dist/ui/shared/machine-name.js +0 -13
  636. package/dist/ui/shared/qrcode.module.js +0 -2237
  637. package/dist/ui/shared/settings-width.js +0 -31
  638. package/dist/ui/shared/vendor/qrcode-generator.LICENSE +0 -27
  639. package/dist/ui/windows-agents-nav.js +0 -2
  640. package/dist/ui/windows-cli-catalog.js +0 -108
  641. package/dist/web-remote-access.d.ts +0 -152
  642. package/dist/web-remote-access.js +0 -368
  643. package/dist/web-remote-access.js.map +0 -1
  644. package/dist/windows-agents.d.ts +0 -126
  645. package/dist/windows-agents.js +0 -490
  646. package/dist/windows-agents.js.map +0 -1
  647. package/dist/windows-cli-api.d.ts +0 -23
  648. package/dist/windows-cli-api.js +0 -159
  649. package/dist/windows-cli-api.js.map +0 -1
  650. package/dist/windows-cli-providers.d.ts +0 -115
  651. package/dist/windows-cli-providers.js +0 -429
  652. package/dist/windows-cli-providers.js.map +0 -1
  653. package/dist/windows-cli-worker.d.ts +0 -59
  654. package/dist/windows-cli-worker.js +0 -479
  655. package/dist/windows-cli-worker.js.map +0 -1
  656. package/dist/windows-cli.d.ts +0 -116
  657. package/dist/windows-cli.js +0 -407
  658. package/dist/windows-cli.js.map +0 -1
  659. package/dist/windows-native-mcp.d.ts +0 -19
  660. package/dist/windows-native-mcp.js +0 -143
  661. package/dist/windows-native-mcp.js.map +0 -1
  662. package/dist/windows-pane-mcp.d.ts +0 -26
  663. package/dist/windows-pane-mcp.js +0 -187
  664. package/dist/windows-pane-mcp.js.map +0 -1
  665. package/templates/runtime-assets/conpty-LICENSE +0 -21
  666. package/templates/runtime-assets/conpty-NOTICE.md +0 -503
  667. package/templates/runtime-assets/local-pane-stage.ps1 +0 -101
  668. package/templates/runtime-assets/runtime-pane-job.ps1 +0 -116
  669. package/templates/runtime-assets/runtime-pane-private.ps1 +0 -14
  670. package/templates/runtime-assets/xterm-LICENSE +0 -21
@@ -1,7 +1,3 @@
1
- import { NativePaneRecoveryError } from "./native-pane-recovery.js";
2
- import { addsSecondGeneral } from "./web-only-fleet.js";
3
- import { NativePaneCrashBudget } from "./native-pane-crash-budget.js";
4
- import { localWindowsCliEnabled, remoteRuntimeEnabled } from "./runtime-switches.js";
5
1
  import { settingsUndo, undoSettingsPaths } from "./settings-transaction.js";
6
2
  import { measureSyncWork } from "./sync-work-attribution.js";
7
3
  import { REMOVED_BACKENDS, isRemovedBackend, removedBackendMessage } from "./backend/removed.js";
@@ -29,7 +25,6 @@ import { BACKEND_AUTH_CHECKS, checkAuthStatus, LOGIN_FLOWS } from "./login-flows
29
25
  import { CHAT_PROFILE_LOGIN_BACKENDS, credentialProfileEnv, credentialProfileLoginCommand } from "./backend/credential-profile.js";
30
26
  import { fetchClaudeUsage, fetchCodexUsage } from "./usage/providers.js";
31
27
  import { assertExplicitInstanceRemoval, authorizeExplicitInstanceRemoval } from "./instance-removal.js";
32
- import { WINDOWS_CREATE_REFUSED, isNativePaneInstance } from "./native-instance-registry.js";
33
28
  import { capturePendingTargetReconciliation, finishTargetReconciliation, reconcileTargetBeforeStart, RECONCILIATION_WRITE_DRAIN_TIMEOUT_MS, retireCapturedTargetWindows, } from "./delivery-reconciliation.js";
34
29
  import { noPlaceMarkers, placeRef } from "./topic-link.js";
35
30
  export { isFleetStartCommandLine } from "./fleet-lock.js";
@@ -290,7 +285,6 @@ export class InstanceLifecycle {
290
285
  activeTransition = new Map();
291
286
  /** Bumped synchronously by stop/restart: a start begun under an older epoch must not publish. */
292
287
  lifecycleEpochs = new Map();
293
- nativeExitOwners = new Map();
294
288
  /** Single wake flight per instance: concurrent wakes share it. */
295
289
  wakeFlights = new Map();
296
290
  /** Starts that begin their idle window now instead of at the persisted last inbound. */
@@ -687,109 +681,26 @@ export class InstanceLifecycle {
687
681
  }
688
682
  this.ctx.notifyInstanceTopic(name, t("delivery.cancelled_unsent", messages.length, name));
689
683
  }, this.ctx.logger, `daemon.human_messages_cancelled[${name}]`));
690
- }
691
- nativeRecoveryPending(name) { return this.nativeExitOwners.has(name); }
692
- cancelNativeRecovery(name, owner) {
693
- for (const [target, run] of this.nativeExitOwners) {
694
- if (name !== undefined && target !== name || owner !== undefined && run.token !== owner)
695
- continue;
696
- clearTimeout(run.timer);
697
- this.nativeExitOwners.delete(target);
698
- }
699
- }
700
- resetNativeCrashBudget(name) {
701
- this.cancelNativeRecovery(name);
702
- const pin = this.ctx.nativePanePinnedSession?.(name);
703
- if (pin) {
704
- ensureInstanceDir(this.ctx.getInstanceDir(name));
705
- new NativePaneCrashBudget(join(this.ctx.getInstanceDir(name), "native-crash-state.json")).reset(pin);
706
- }
707
- }
708
- async nativePaneExited(name, daemon, data) {
709
- const config = this.ctx.fleetConfig?.instances[name], epoch = this.epochOf(name), pin = data.snapshot.sessionId, profilePin = this.ctx.nativePanePinnedSession?.(name) ?? undefined;
710
- if (!isNativePaneInstance(config) || data.name !== name || this.daemons.get(name) !== daemon || !daemon.nativePaneExitCurrent(data.snapshot, data.owner)
711
- || pin !== undefined && profilePin !== undefined && profilePin !== pin || this.nativeExitOwners.has(name) || this.ctx.isPlannedRestart())
712
- return;
713
- const token = Symbol(name), run = { token, daemon, timer: undefined };
714
- this.nativeExitOwners.set(name, run);
715
- const current = () => this.nativeExitOwners.get(name) === run && this.daemons.get(name) === daemon && this.epochOf(name) === epoch
716
- && this.ctx.fleetConfig?.instances[name] === config && ((this.ctx.nativePanePinnedSession?.(name) ?? undefined) === profilePin || profilePin === undefined && pin !== undefined && this.ctx.nativePanePinnedSession?.(name) === pin) && !this.isPaused(name) && !this.ctx.isPlannedRestart()
717
- && (config.machine_id ? remoteRuntimeEnabled() : localWindowsCliEnabled());
718
- daemon.fenceDeliveryWritesForStop();
719
- try {
720
- const decision = pin && profilePin ? new NativePaneCrashBudget(join(this.ctx.getInstanceDir(name), "native-crash-state.json")).observe(pin, data.snapshot.exitCode, config.restart_policy) : null;
721
- await this.runTransition(name, async () => {
722
- if (!current())
723
- return;
724
- if (!await daemon.waitForDeliveryWritesToDrain(RECONCILIATION_WRITE_DRAIN_TIMEOUT_MS) || !current())
725
- throw Error("Native input writes have not drained");
726
- if (this.ctx.deliveryOutbox) {
727
- this.ctx.deliveryOutbox.markTargetReconciliationPending(name, daemon.bootId);
728
- if (!await daemon.reconcileNativeDeliveries(this.ctx.deliveryOutbox, current) || !current())
729
- throw Error("Native delivery reconciliation is unconfirmed");
730
- }
731
- // Close finalizes the exact positive exit; no PID lookup or signal exists on this path.
732
- await daemon.stop({ nativePane: "close" });
733
- if (!current())
734
- return;
735
- this.ctx.eventLog?.insert(name, "native_pane_exited", { exitCode: data.snapshot.exitCode ?? null, sessionId: pin, decision: decision?.kind ?? "no-conversation", count: decision?.count ?? 0 });
736
- if (!decision) {
737
- this.ctx.holdNativePaneRecovery?.(name, new NativePaneRecoveryError({ kind: "session-unconfirmed", launchId: data.snapshot.launchId, sessionId: this.ctx.nativePanePinnedSession?.(name) ?? undefined, ...(config.backend === "codex" ? { provider: "codex" } : {}) }));
738
- this.ctx.setTopicIcon(name, "red");
739
- return;
740
- }
741
- if (decision.kind !== "retry") {
742
- if (decision.kind === "normal")
743
- await this.ctx.notifyNormalExit(name);
744
- else
745
- this.notifyIncident(name, decision.kind === "loop" ? "crash_loop" : "supervision_ended", t("inst.respawn_paused", name));
746
- this.ctx.setTopicIcon(name, "red");
747
- return;
748
- }
749
- const timer = setTimeout(() => {
750
- run.timer = undefined;
751
- void this.runTransition(name, async () => {
752
- if (!current())
753
- return;
754
- await this.stopInTransition(name, token);
755
- // Our own stop advances once. An operator's concurrent stop/config change prevents publication.
756
- if (this.nativeExitOwners.get(name) !== run || this.epochOf(name) !== epoch + 1 || this.daemons.has(name)
757
- || this.ctx.fleetConfig?.instances[name] !== config || this.ctx.nativePanePinnedSession?.(name) !== pin || this.isPaused(name) || this.ctx.isPlannedRestart()
758
- || !(config.machine_id ? remoteRuntimeEnabled() : localWindowsCliEnabled()))
759
- return;
760
- await this.startInTransition(name, config, true, { kind: "fleet-topic", backend: config.backend ?? "codex", model: config.model || "default" });
761
- if (this.nativeExitOwners.get(name) !== run || this.epochOf(name) !== epoch + 1 || this.ctx.isPlannedRestart())
762
- return;
763
- await this.ctx.connectIpcToInstance(name);
764
- }).catch(error => { if (this.nativeExitOwners.get(name) === run && !this.ctx.isPlannedRestart()) {
765
- if (this.ctx.holdNativePaneRecovery?.(name, error))
766
- return;
767
- this.ctx.logger.error({ name, err: error }, "Native conversation resume failed; its pin was retained");
768
- this.notifyIncident(name, "supervision_ended", t("inst.respawn_paused", name));
769
- } })
770
- .finally(() => { this.cancelNativeRecovery(name, token); this.ctx.onNativePaneRecoverySettled?.(name); });
771
- }, decision.delay);
772
- timer.unref?.();
773
- run.timer = timer;
774
- });
775
- if (!run.timer)
776
- this.cancelNativeRecovery(name, token);
777
- }
778
- catch (error) {
779
- if (this.nativeExitOwners.get(name) === run && !this.ctx.isPlannedRestart()) {
780
- this.ctx.logger.error({ name, err: error }, "Native crash recovery held without a fresh fallback");
781
- this.notifyIncident(name, "supervision_ended", t("inst.respawn_paused", name));
684
+ // #3030: messages handed to the busy CLI's own queue that it never took (it went idle without them), or that a
685
+ // restart left unverifiable (its transcript could not be read, so they were not sent again). Each is marked ❌ and
686
+ // the person is told once — never a silent ✅.
687
+ daemon.on("human_handoffs_unsettled", safeHandler((data) => {
688
+ const messages = Array.isArray(data?.messages) ? data.messages : [];
689
+ if (!messages.length)
690
+ return;
691
+ const reason = data.reason === "unverifiable" ? "unverifiable" : "not-taken";
692
+ this.ctx.eventLog?.insert(name, "handoffs_unsettled", { reason, count: messages.length });
693
+ this.ctx.logger.warn({ name, reason, count: messages.length }, "Queued messages not taken by the CLI — telling the person");
694
+ for (const m of messages) {
695
+ if (this.ctx.finishDeliveryStatus)
696
+ this.ctx.finishDeliveryStatus(name, m.chatId, m.messageId, "failed", m.threadId);
697
+ else
698
+ this.ctx.reactMessageStatus(name, m.chatId, m.messageId, "failed", m.threadId);
782
699
  }
783
- this.cancelNativeRecovery(name, token);
784
- }
785
- finally {
786
- if (!run.timer)
787
- this.ctx.onNativePaneRecoverySettled?.(name);
788
- }
700
+ this.ctx.notifyInstanceTopic(name, t(reason === "unverifiable" ? "delivery.handoff_unverified_after_restart" : "delivery.handoff_not_taken", messages.length, name));
701
+ }, this.ctx.logger, `daemon.human_handoffs_unsettled[${name}]`));
789
702
  }
790
703
  attachIncidentHandlers(name, daemon) {
791
- if (daemon.usesNativePane?.())
792
- daemon.on("native_pane_exited", safeHandler((data) => this.nativePaneExited(name, daemon, data), this.ctx.logger, `daemon.native_pane_exited[${name}]`));
793
704
  daemon.on("capacity_nudge_cancelled", safeHandler((data) => {
794
705
  const reason = data.reason === "the user cancelled" ? t("inst.codex_retry_cancel_reason_user")
795
706
  : data.reason === "the instance was stopped, paused or respawned" || data.reason === "the instance is not running" ? t("inst.codex_retry_cancel_reason_stopped")
@@ -1088,22 +999,19 @@ export class InstanceLifecycle {
1088
999
  // labels, summaries and every exhaustive match for one picker's text.)
1089
1000
  // #1691: a prompt no table knows — what it asks (one sanitised, bounded line from the daemon, never the pane), and
1090
1001
  // that AgEnD will not press anything.
1091
- // S-35: a Windows agent's instance name is windows-<uuid>; people know it by its display name.
1092
- const label = this.ctx.fleetConfig?.instances[name]?.display_name?.trim() || name;
1093
- const place = placeRef({ kind: "instance", name }, label);
1094
1002
  if (data.unrecognised) {
1095
1003
  // #1990: the question is a pane line — it may not name a place of its own.
1096
1004
  const asked = data.question ? t("inst.unrecognised_prompt_question", noPlaceMarkers(data.question)) : "";
1097
- this.notifyParked(name, "dialog_parked", t("inst.unrecognised_prompt", label, asked), t("fleet.unrecognised_prompt", place, asked));
1005
+ this.notifyParked(name, "dialog_parked", t("inst.unrecognised_prompt", name, asked), t("fleet.unrecognised_prompt", instancePlace(name), asked));
1098
1006
  return;
1099
1007
  }
1100
1008
  const category = data.kind && data.kind !== "dialog" ? interactionCategory(data.kind, data.backend) : null;
1101
- const text = category ? t("inst.interaction_parked", label, category) : data.holdOnly
1009
+ const text = category ? t("inst.interaction_parked", name, category) : data.holdOnly
1102
1010
  // #2872: the Claude session-resume advice only for that prompt (it read as nonsense under a grok or kiro dialog).
1103
- ? t("inst.dialog_parked_hold", label, data.description) + (data.advice === "claude-resume" ? " " + t("inst.dialog_parked_hold_claude_resume") : "")
1104
- : t("inst.dialog_parked_stuck", label, data.description) + (data.advice === "claude-resume" ? " " + t("inst.dialog_parked_stuck_claude_resume") : "");
1011
+ ? t("inst.dialog_parked_hold", name, data.description) + (data.advice === "claude-resume" ? " " + t("inst.dialog_parked_hold_claude_resume") : "")
1012
+ : t("inst.dialog_parked_stuck", name, data.description) + (data.advice === "claude-resume" ? " " + t("inst.dialog_parked_stuck_claude_resume") : "");
1105
1013
  // #1990: in General, the instance's name links to its topic.
1106
- this.notifyParked(name, "dialog_parked", text, category ? t("fleet.interaction_parked", place, category) : t("fleet.dialog_parked", place, data.description));
1014
+ this.notifyParked(name, "dialog_parked", text, category ? t("fleet.interaction_parked", instancePlace(name), category) : t("fleet.dialog_parked", instancePlace(name), data.description));
1107
1015
  }, this.ctx.logger, `daemon.dialog_parked[${name}]`));
1108
1016
  // #2897: the held dialog is gone (closed, answered, auto-answered) — its notices go with it.
1109
1017
  daemon.on("dialog_unparked", safeHandler(() => this.ctx.resolveParkedNotice?.(name), this.ctx.logger, `daemon.dialog_unparked[${name}]`));
@@ -1140,21 +1048,6 @@ export class InstanceLifecycle {
1140
1048
  daemon.on("pty_error", safeHandler(async (data) => {
1141
1049
  this.ctx.eventLog?.insert(name, "pty_error", { type: data.type, action: data.action });
1142
1050
  this.ctx.logger.warn({ name, errorType: data.type, action: data.action }, `PTY error: ${data.message}`);
1143
- if (daemon.usesNativePane?.()) {
1144
- // Native credentials and quotas belong to its runner. Never probe a Linux login or group its peers with it.
1145
- if (this.daemons.get(name) !== daemon)
1146
- return;
1147
- this.notifyIncident(name, data.type, data.notice ?? data.message);
1148
- if (data.action === "pause") {
1149
- if (data.type === "auth_error") {
1150
- daemon.confirmAuthFailure?.();
1151
- daemon.requestPauseWhenIdle({ reconfirmAuth: true, reason: "auth" });
1152
- }
1153
- else
1154
- daemon.requestPauseWhenIdle({ reason: "error" });
1155
- }
1156
- return;
1157
- }
1158
1051
  // Antigravity's account-level cap is visible ONLY here: the quota summary
1159
1052
  // API keeps reporting its buckets as barely used while the CLI is blocked
1160
1053
  // (verified live — 0% used and "Individual quota reached" in the same
@@ -1202,6 +1095,10 @@ export class InstanceLifecycle {
1202
1095
  const verdict = await this.verifyClaudeQuota();
1203
1096
  if (verdict === "available") {
1204
1097
  this.ctx.logger.debug({ name, backend: "claude-code" }, "quota pattern ignored — live usage has capacity (stale pane history)");
1098
+ // Not told: the daemon's one-notice-per-pause mark must not hold back the next repeat (the usage API can lag
1099
+ // the CLI right as the limit hits; the next "reached again" is verified again).
1100
+ if (data.verifyQuota)
1101
+ daemon.clearUsagePauseNotice?.();
1205
1102
  return;
1206
1103
  }
1207
1104
  if (verdict === "unknown") {
@@ -1260,7 +1157,7 @@ export class InstanceLifecycle {
1260
1157
  if (notificationTarget)
1261
1158
  this.notifyAuthErrorOnce(name, data.message, notificationTarget);
1262
1159
  }
1263
- else if (notificationTarget && data.action !== "backoff_restart" && data.action !== "nudge_continue") {
1160
+ else if (notificationTarget && !data.quotaAdvisory && data.action !== "backoff_restart" && data.action !== "nudge_continue") {
1264
1161
  // backoff_restart / nudge_continue notifications are handled in the action branch below
1265
1162
  // with per-attempt context (attempt N/max, delay).
1266
1163
  // #2872: a notice the user asked to be one line (grok's weekly limit) is posted as it is: no "(action: …)", and no
@@ -1491,10 +1388,8 @@ export class InstanceLifecycle {
1491
1388
  return this.lifecycleEpochs.get(name) ?? 0;
1492
1389
  }
1493
1390
  /** Invalidate every start/wake already running for `name` (they will not publish). */
1494
- invalidate(name, nativeOwner) {
1495
- const native = this.nativeExitOwners.get(name);
1496
- if (native && native.token !== nativeOwner)
1497
- this.cancelNativeRecovery(name);
1391
+ invalidate(name) {
1392
+ this.ctx.agentCredentials?.invalidate(name);
1498
1393
  this.lifecycleEpochs.set(name, this.epochOf(name) + 1);
1499
1394
  }
1500
1395
  /** Whether `transition` is `name`'s transition and is the one running now. */
@@ -1562,194 +1457,183 @@ export class InstanceLifecycle {
1562
1457
  const check = () => { execution?.assert(); if (this.epochOf(name) !== epoch)
1563
1458
  throw new SupersededStartError(name); };
1564
1459
  check();
1565
- this.ctx.assertGeneralBindingStart?.(name, config);
1566
1460
  assertNoSessionOomStop(this.ctx.getInstanceDir(name));
1567
1461
  const seedNow = this.activitySeedNow.delete(name);
1568
1462
  if (this.daemons.has(name)) {
1569
1463
  this.ctx.logger.info({ name }, "Instance already running, skipping");
1570
1464
  return;
1571
1465
  }
1572
- const native = isNativePaneInstance(config) ? await this.ctx.nativePaneFor?.(name, config, check) : undefined;
1573
- let nativePublished = false;
1574
- try {
1575
- check();
1576
- if (isNativePaneInstance(config) && !native)
1577
- throw Error("Native pane ownership is unavailable; no local CLI was started");
1578
- if (native)
1579
- config = { ...config, agent_mode: "mcp" };
1580
- if (!native && !existsSync(config.working_directory)) {
1581
- this.ctx.logger.info({ name, working_directory: config.working_directory }, "Working directory does not exist — creating it");
1582
- mkdirSync(config.working_directory, { recursive: true });
1583
- }
1584
- const instanceDir = this.ctx.getInstanceDir(name);
1585
- ensureInstanceDir(instanceDir);
1586
- // Daemon.start consumes the recovery marker after reading it. A start
1587
- // that fails before reaching the daemon must leave that intent intact.
1588
- const { Daemon } = await import("./daemon.js");
1589
- const { createBackend } = await import("./backend/factory.js");
1466
+ if (!existsSync(config.working_directory)) {
1467
+ this.ctx.logger.info({ name, working_directory: config.working_directory }, "Working directory does not exist — creating it");
1468
+ mkdirSync(config.working_directory, { recursive: true });
1469
+ }
1470
+ const instanceDir = this.ctx.getInstanceDir(name);
1471
+ ensureInstanceDir(instanceDir);
1472
+ // Daemon.start consumes the recovery marker after reading it. A start
1473
+ // that fails before reaching the daemon must leave that intent intact.
1474
+ const { Daemon } = await import("./daemon.js");
1475
+ const { createBackend } = await import("./backend/factory.js");
1476
+ check();
1477
+ const backendName = config.backend ?? this.ctx.fleetConfig?.defaults?.backend ?? "claude-code";
1478
+ // A removed backend (#1280): this instance refuses to start, says why and what to use instead, and the rest of
1479
+ // the fleet is unaffected. Never a fallback to another backend.
1480
+ if (isRemovedBackend(backendName)) {
1481
+ const message = removedBackendMessage(backendName, name);
1482
+ this.ctx.logger.error({ name, backend: backendName }, `Not starting: ${message}`);
1483
+ this.ctx.notifyInstanceTopic(name, t("inst.backend_removed", name, backendName, REMOVED_BACKENDS[backendName].replacement));
1484
+ return;
1485
+ }
1486
+ // Verify backend binary is in PATH before spawning. Off-loop resolve pins a
1487
+ // hint so createBackend's resolveBinary does not run synchronous `which`
1488
+ // (#1490 row 67). Missing still only logs; start continues.
1489
+ const installation = BACKEND_INSTALLATION_INFO[backendName];
1490
+ if (installation) {
1491
+ const { resolveBackendBinary } = await import("./backend-availability.js");
1492
+ const path = await resolveBackendBinary(backendName);
1493
+ noteResolvedBinary(installation.binary, path ?? installation.binary);
1590
1494
  check();
1591
- const backendName = config.backend ?? this.ctx.fleetConfig?.defaults?.backend ?? "claude-code";
1592
- // A removed backend (#1280): this instance refuses to start, says why and what to use instead, and the rest of
1593
- // the fleet is unaffected. Never a fallback to another backend.
1594
- if (isRemovedBackend(backendName)) {
1595
- const message = removedBackendMessage(backendName, name);
1596
- this.ctx.logger.error({ name, backend: backendName }, `Not starting: ${message}`);
1597
- this.ctx.notifyInstanceTopic(name, t("inst.backend_removed", name, backendName, REMOVED_BACKENDS[backendName].replacement));
1598
- return;
1495
+ if (!path) {
1496
+ this.ctx.logger.error({ binary: installation.binary, backend: backendName, instance: name }, `Backend binary "${installation.binary}" not found in PATH`);
1599
1497
  }
1600
- // Verify backend binary is in PATH before spawning. Off-loop resolve pins a
1601
- // hint so createBackend's resolveBinary does not run synchronous `which`
1602
- // (#1490 row 67). Missing still only logs; start continues.
1603
- const installation = BACKEND_INSTALLATION_INFO[backendName];
1604
- // alpha: a native Windows pane's CLI is on that PC — nothing to look for on this one.
1605
- if (!native && installation) {
1606
- const { resolveBackendBinary } = await import("./backend-availability.js");
1607
- const path = await resolveBackendBinary(backendName);
1608
- noteResolvedBinary(installation.binary, path ?? installation.binary);
1609
- check();
1610
- if (!path) {
1611
- this.ctx.logger.error({ binary: installation.binary, backend: backendName, instance: name }, `Backend binary "${installation.binary}" not found in PATH`);
1612
- }
1613
- }
1614
- // claude-code refuses --dangerously-skip-permissions as root — fail fast
1615
- // Unless IS_SANDBOX=1 is set (recognized sandbox environment)
1616
- if (!native && process.getuid?.() === 0 && backendName === "claude-code" && !process.env.IS_SANDBOX) {
1617
- const msg = `⚠️ claude-code cannot run with --dangerously-skip-permissions as root. Set IS_SANDBOX=1 or use a non-root user.`;
1618
- this.ctx.logger.error({ name, backend: backendName }, msg);
1619
- this.ctx.notifyInstanceTopic(name, t("inst.root_skip_perms"));
1498
+ }
1499
+ // claude-code refuses --dangerously-skip-permissions as root — fail fast
1500
+ // Unless IS_SANDBOX=1 is set (recognized sandbox environment)
1501
+ if (process.getuid?.() === 0 && backendName === "claude-code" && !process.env.IS_SANDBOX) {
1502
+ const msg = `⚠️ claude-code cannot run with --dangerously-skip-permissions as root. Set IS_SANDBOX=1 or use a non-root user.`;
1503
+ this.ctx.logger.error({ name, backend: backendName }, msg);
1504
+ this.ctx.notifyInstanceTopic(name, t("inst.root_skip_perms"));
1505
+ return;
1506
+ }
1507
+ const backend = createBackend(backendName, instanceDir);
1508
+ const daemon = new Daemon(name, config, instanceDir, topicMode, backend, this.ctx.controlClient ?? undefined, this.ctx.logger, runtimeIdentity ?? {
1509
+ kind: "fleet-topic",
1510
+ backend: backendName,
1511
+ model: config.model ?? "default",
1512
+ }, this.ctx.spawnGate, this.ctx.stormWindow, this.ctx.backendOutage);
1513
+ // Register before start: a pre-launch refusal has no published daemon or later incident handlers.
1514
+ daemon.on("kiro_compatibility_hold", (message) => {
1515
+ const owner = this.daemons.get(name);
1516
+ if (owner ? owner !== daemon : this.epochOf(name) !== epoch)
1620
1517
  return;
1621
- }
1622
- const backend = native?.backend ?? createBackend(backendName, instanceDir);
1623
- const daemon = new Daemon(name, config, instanceDir, topicMode, backend, this.ctx.controlClient ?? undefined, this.ctx.logger, runtimeIdentity ?? {
1624
- kind: "fleet-topic",
1625
- backend: backendName,
1626
- model: config.model ?? "default",
1627
- }, this.ctx.spawnGate, this.ctx.stormWindow, this.ctx.backendOutage);
1628
- if (native) {
1629
- daemon.setNativePaneLifecycle(native);
1630
- native.bindDaemon?.(daemon);
1631
- }
1632
- daemon.setDeliveryOutboxPort(this.ctx.deliveryOutbox ?? undefined);
1633
- daemon.setWorkLeaseCheck(() => this.hasWorkLease(name));
1634
- if (seedNow)
1635
- daemon.seedActivityNow();
1636
- // Read at each spawn so a fleet.yaml reload is honoured (#984).
1637
- daemon.setPeerWorkingDirectories(backendName === "kiro-cli"
1638
- ? this.ctx.kiroPeerWorkingDirectories ? () => this.ctx.kiroPeerWorkingDirectories(name) : undefined
1639
- : () => peerWorkingDirectories(this.ctx.fleetConfig, name, backendName));
1640
- daemon.setStatusEmojiAvoidList(() => this.ctx.statusEmojiAvoidList?.(name));
1641
- // Before start: the first spawn builds the command and emits its launch
1642
- // warning synchronously inside Daemon.start, long before
1643
- // attachIncidentHandlers runs (#984).
1644
- this.attachLaunchWarningHandler(name, daemon);
1645
- this.attachContextLostHandler(name, daemon);
1646
- daemon.on("durable_delivery_deferred", (data) => {
1647
- // A daemon without its outbox port cannot update the row directly. The
1648
- // lifecycle owns the same-process store and records a bounded pre-write
1649
- // retry instead of leaving the lane in delivering forever.
1650
- this.ctx.deliveryOutbox?.retryBeforeBegin(data.deliveryId, data.targetBootId, data.attemptNo, data.reason, 5_000);
1651
- });
1652
- daemon.on("mcp_tool_response_written", (data) => {
1653
- if (!data.operationId || data.daemonBootId !== daemon.bootId)
1654
- return;
1655
- try {
1656
- this.ctx.deliveryOutbox?.markResponseDelivered(name, data.operationId);
1657
- }
1658
- catch (err) {
1659
- this.ctx.logger.error({ name, operationId: data.operationId, err }, "Could not persist MCP response-delivered marker");
1660
- }
1661
- });
1662
- this.applyCapacityBackoffBaseline(name, backendName, daemon);
1663
- // Catch errors from daemon internals (e.g. IPC server) to prevent crashing the fleet process
1664
- daemon.on("error", (err) => {
1665
- this.ctx.logger.error({ err, name }, "Daemon emitted error — instance isolated");
1666
- });
1667
- if (this.ctx.deliveryOutbox) {
1668
- // Fence older-generation submissions and reconcile them before Daemon.start
1669
- // reaches Strategy A's unconditional old-window kill.
1670
- const recovered = this.ctx.deliveryOutbox.recoverTargetGeneration(name, daemon.bootId);
1671
- if (recovered.queued || recovered.reconciliationPending) {
1672
- this.ctx.logger.warn({ name, ...recovered }, "Preparing durable outbox rows before target generation start");
1673
- }
1674
- const reconciled = native
1675
- ? { uncertain: 0, safeToStart: await this.ctx.reconcileNativePaneBeforeStart?.(name, daemon) === true }
1676
- : await reconcileTargetBeforeStart(this.ctx.deliveryOutbox, name, instanceDir, this.ctx.logger);
1677
- if (reconciled.uncertain > 0) {
1678
- this.ctx.logger.warn({ name, ...reconciled }, "Some durable submissions need operator reconciliation");
1679
- }
1680
- if (!reconciled.safeToStart) {
1681
- const message = t("delivery.restart_blocked", name);
1682
- this.ctx.logger.error({ name, ...reconciled }, message);
1683
- this.ctx.notifyFleetError?.(message);
1684
- await daemon.abortStartup().catch(err => this.ctx.logger.warn({ err, name }, "Failed to dispose daemon after reconciliation could not verify old CLI exit"));
1685
- throw new Error(message);
1686
- }
1687
- }
1688
- if (this.epochOf(name) !== epoch || execution && !execution.current()) {
1689
- // A stop/restart arrived while this start was reconciling: do not spawn.
1690
- await daemon.abortStartup().catch(() => { });
1518
+ this.ctx.setKiroCompatibilityHold?.(name, message);
1519
+ });
1520
+ daemon.setAgentCredentialIssuer?.(token => {
1521
+ if (this.epochOf(name) !== epoch)
1691
1522
  throw new SupersededStartError(name);
1523
+ this.ctx.agentCredentials?.issue(name, token);
1524
+ });
1525
+ daemon.setDeliveryOutboxPort(this.ctx.deliveryOutbox ?? undefined);
1526
+ daemon.setWorkLeaseCheck(() => this.hasWorkLease(name));
1527
+ if (seedNow)
1528
+ daemon.seedActivityNow();
1529
+ // Read at each spawn so a fleet.yaml reload is honoured (#984).
1530
+ daemon.setPeerWorkingDirectories(backendName === "kiro-cli"
1531
+ ? this.ctx.kiroPeerWorkingDirectories ? () => this.ctx.kiroPeerWorkingDirectories(name) : undefined
1532
+ : () => peerWorkingDirectories(this.ctx.fleetConfig, name, backendName));
1533
+ daemon.setStatusEmojiAvoidList(() => this.ctx.statusEmojiAvoidList?.(name));
1534
+ // Before start: the first spawn builds the command and emits its launch
1535
+ // warning synchronously inside Daemon.start, long before
1536
+ // attachIncidentHandlers runs (#984).
1537
+ this.attachLaunchWarningHandler(name, daemon);
1538
+ this.attachContextLostHandler(name, daemon);
1539
+ daemon.on("durable_delivery_deferred", (data) => {
1540
+ // A daemon without its outbox port cannot update the row directly. The
1541
+ // lifecycle owns the same-process store and records a bounded pre-write
1542
+ // retry instead of leaving the lane in delivering forever.
1543
+ this.ctx.deliveryOutbox?.retryBeforeBegin(data.deliveryId, data.targetBootId, data.attemptNo, data.reason, 5_000);
1544
+ });
1545
+ daemon.on("mcp_tool_response_written", (data) => {
1546
+ if (!data.operationId || data.daemonBootId !== daemon.bootId)
1547
+ return;
1548
+ try {
1549
+ this.ctx.deliveryOutbox?.markResponseDelivered(name, data.operationId);
1692
1550
  }
1693
- // The startup scan can raise an incident (sign-in screen, fatal modal)
1694
- // before the handlers below exist and before this daemon is registered;
1695
- // hold it and deliver it once both are true.
1696
- daemon.holdStartupIncidents?.();
1697
- await InstanceLifecycle.startOrDispose(daemon, name, this.ctx.logger, execution || native ? check : undefined);
1698
- // Publication fence (Phase 2a): the spawn cannot be cancelled, so a stop or
1699
- // restart requested meanwhile has been waiting behind this transition. A
1700
- // superseded start must not register, signal ready, or keep its window.
1701
- if (this.epochOf(name) !== epoch || execution && !execution.current()) {
1702
- await daemon.abortStartup().catch(err => this.ctx.logger.warn({ err, name }, "Failed to dispose a superseded start"));
1703
- throw new SupersededStartError(name);
1551
+ catch (err) {
1552
+ this.ctx.logger.error({ name, operationId: data.operationId, err }, "Could not persist MCP response-delivered marker");
1704
1553
  }
1705
- this.capacityBackoffBaselines.delete(name);
1706
- this.daemons.set(name, daemon);
1707
- nativePublished = !!native;
1708
- published?.(daemon); // Exact publication, synchronously after the ownership fence.
1709
- if (seedNow)
1710
- this.noteWokeForWork(name);
1711
- this.ctx.onDaemonReady?.(name, daemon.bootId);
1712
- daemon.on("auto_pause_requested", safeHandler(async (data) => {
1713
- await this.pause(name, data?.reason ?? "idle");
1714
- }, this.ctx.logger, `autoPause[${name}]`));
1715
- daemon.on("auto_paused", (data) => {
1716
- this.ctx.eventLog?.insert(name, "instance_paused", { reason: "idle", paused_at: data.pausedAt });
1717
- this.ctx.logger.info({ name, pausedAt: data.pausedAt }, "Instance auto-paused after idle timeout");
1718
- this.ctx.setTopicIcon(name, "remove");
1719
- this.ctx.onAttentionChanged?.(name);
1720
- });
1721
- daemon.on("auto_woke", () => {
1722
- this.ctx.onAttentionChanged?.(name);
1723
- this.ctx.eventLog?.insert(name, "instance_resumed", { reason: "message" });
1724
- this.ctx.logger.info({ name }, "Instance auto-woke for delivery");
1725
- this.ctx.setTopicIcon(name, "green");
1726
- this.ctx.touchActivity(name);
1727
- });
1728
- this.attachIncidentHandlers(name, daemon);
1729
- // #2897: a new daemon starts with no dialog held; a notice the last one left (a crash, a respawn) is out of date.
1730
- this.ctx.resolveParkedNotice?.(name);
1731
- daemon.on("pty_recovered", safeHandler((data) => {
1732
- const mins = Math.floor(data.downtime_s / 60);
1733
- const secs = data.downtime_s % 60;
1734
- const duration = mins > 0 ? `${mins}m ${secs}s` : `${secs}s`;
1735
- this.ctx.eventLog?.insert(name, "pty_recovered", { downtime_s: data.downtime_s });
1736
- this.ctx.logger.info({ name, downtime_s: data.downtime_s }, "PTY error recovered");
1737
- this.ctx.notifyInstanceTopic(name, t("inst.recovered", name, duration));
1738
- this.ctx.webhookEmit("pty_recovered", name, { downtime_s: data.downtime_s });
1739
- }, this.ctx.logger, `daemon.pty_recovered[${name}]`));
1740
- this.attachDeliveryStatusHandlers(name, daemon);
1554
+ });
1555
+ this.applyCapacityBackoffBaseline(name, backendName, daemon);
1556
+ // Catch errors from daemon internals (e.g. IPC server) to prevent crashing the fleet process
1557
+ daemon.on("error", (err) => {
1558
+ this.ctx.logger.error({ err, name }, "Daemon emitted error — instance isolated");
1559
+ });
1560
+ if (this.ctx.deliveryOutbox) {
1561
+ // Fence older-generation submissions and reconcile them before Daemon.start
1562
+ // reaches Strategy A's unconditional old-window kill.
1563
+ const recovered = this.ctx.deliveryOutbox.recoverTargetGeneration(name, daemon.bootId);
1564
+ if (recovered.queued || recovered.reconciliationPending) {
1565
+ this.ctx.logger.warn({ name, ...recovered }, "Preparing durable outbox rows before target generation start");
1566
+ }
1567
+ const reconciled = await reconcileTargetBeforeStart(this.ctx.deliveryOutbox, name, instanceDir, this.ctx.logger);
1568
+ if (reconciled.uncertain > 0) {
1569
+ this.ctx.logger.warn({ name, ...reconciled }, "Some durable submissions need operator reconciliation");
1570
+ }
1571
+ if (!reconciled.safeToStart) {
1572
+ const message = t("delivery.restart_blocked", name);
1573
+ this.ctx.logger.error({ name, ...reconciled }, message);
1574
+ this.ctx.notifyFleetError?.(message);
1575
+ await daemon.abortStartup().catch(err => this.ctx.logger.warn({ err, name }, "Failed to dispose daemon after reconciliation could not verify old CLI exit"));
1576
+ throw new Error(message);
1577
+ }
1578
+ }
1579
+ if (this.epochOf(name) !== epoch || execution && !execution.current()) {
1580
+ // A stop/restart arrived while this start was reconciling: do not spawn.
1581
+ await daemon.abortStartup().catch(() => { });
1582
+ throw new SupersededStartError(name);
1583
+ }
1584
+ // The startup scan can raise an incident (sign-in screen, fatal modal)
1585
+ // before the handlers below exist and before this daemon is registered;
1586
+ // hold it and deliver it once both are true.
1587
+ daemon.holdStartupIncidents?.();
1588
+ await InstanceLifecycle.startOrDispose(daemon, name, this.ctx.logger, execution ? check : undefined);
1589
+ // Publication fence (Phase 2a): the spawn cannot be cancelled, so a stop or
1590
+ // restart requested meanwhile has been waiting behind this transition. A
1591
+ // superseded start must not register, signal ready, or keep its window.
1592
+ if (this.epochOf(name) !== epoch || execution && !execution.current()) {
1593
+ await daemon.abortStartup().catch(err => this.ctx.logger.warn({ err, name }, "Failed to dispose a superseded start"));
1594
+ throw new SupersededStartError(name);
1595
+ }
1596
+ this.capacityBackoffBaselines.delete(name);
1597
+ this.daemons.set(name, daemon);
1598
+ published?.(daemon); // Exact publication, synchronously after the ownership fence.
1599
+ if (seedNow)
1600
+ this.noteWokeForWork(name);
1601
+ this.ctx.onDaemonReady?.(name, daemon.bootId);
1602
+ daemon.on("auto_pause_requested", safeHandler(async (data) => {
1603
+ await this.pause(name, data?.reason ?? "idle");
1604
+ }, this.ctx.logger, `autoPause[${name}]`));
1605
+ daemon.on("auto_paused", (data) => {
1606
+ this.ctx.eventLog?.insert(name, "instance_paused", { reason: "idle", paused_at: data.pausedAt });
1607
+ this.ctx.logger.info({ name, pausedAt: data.pausedAt }, "Instance auto-paused after idle timeout");
1608
+ this.ctx.setTopicIcon(name, "remove");
1609
+ this.ctx.onAttentionChanged?.(name);
1610
+ });
1611
+ daemon.on("auto_woke", () => {
1612
+ this.ctx.onAttentionChanged?.(name);
1613
+ this.ctx.eventLog?.insert(name, "instance_resumed", { reason: "message" });
1614
+ this.ctx.logger.info({ name }, "Instance auto-woke for delivery");
1741
1615
  this.ctx.setTopicIcon(name, "green");
1742
1616
  this.ctx.touchActivity(name);
1743
- // Last: handlers attached and daemon registered, so a held startup incident
1744
- // (pause, notify) finds both.
1745
- daemon.releaseStartupIncidents?.();
1746
- }
1747
- catch (error) {
1748
- // The factory registered helper authority before acquire(). A superseded pre-window start must release it too.
1749
- if (native && !nativePublished)
1750
- await native.release("detach").catch(err => this.ctx.logger.warn({ name, err }, "Prepared native authority could not detach"));
1751
- throw error;
1752
- }
1617
+ });
1618
+ this.ctx.setKiroCompatibilityHold?.(name, null);
1619
+ this.attachIncidentHandlers(name, daemon);
1620
+ // #2897: a new daemon starts with no dialog held; a notice the last one left (a crash, a respawn) is out of date.
1621
+ this.ctx.resolveParkedNotice?.(name);
1622
+ daemon.on("pty_recovered", safeHandler((data) => {
1623
+ const mins = Math.floor(data.downtime_s / 60);
1624
+ const secs = data.downtime_s % 60;
1625
+ const duration = mins > 0 ? `${mins}m ${secs}s` : `${secs}s`;
1626
+ this.ctx.eventLog?.insert(name, "pty_recovered", { downtime_s: data.downtime_s });
1627
+ this.ctx.logger.info({ name, downtime_s: data.downtime_s }, "PTY error recovered");
1628
+ this.ctx.notifyInstanceTopic(name, t("inst.recovered", name, duration));
1629
+ this.ctx.webhookEmit("pty_recovered", name, { downtime_s: data.downtime_s });
1630
+ }, this.ctx.logger, `daemon.pty_recovered[${name}]`));
1631
+ this.attachDeliveryStatusHandlers(name, daemon);
1632
+ this.ctx.setTopicIcon(name, "green");
1633
+ this.ctx.touchActivity(name);
1634
+ // Last: handlers attached and daemon registered, so a held startup incident
1635
+ // (pause, notify) finds both.
1636
+ daemon.releaseStartupIncidents?.();
1753
1637
  }
1754
1638
  isPaused(name) {
1755
1639
  return this.daemons.get(name)?.isPaused ?? hasPausedMarker(this.ctx.getInstanceDir(name));
@@ -1758,30 +1642,11 @@ export class InstanceLifecycle {
1758
1642
  return this.daemons.get(name)?.lastPausedAt ?? readPausedAt(this.ctx.getInstanceDir(name));
1759
1643
  }
1760
1644
  async pause(name, reason = "operator", admission) {
1761
- this.cancelNativeRecovery(name);
1762
1645
  // Final backstop shared by slash, MCP, Settings, warm-cap, and any future
1763
1646
  // caller. General is the coordinator and must remain resident to route work.
1764
1647
  if (isGeneralInstance(this.ctx.fleetConfig, name)) {
1765
1648
  throw new Error(GENERAL_PAUSE_ERROR);
1766
1649
  }
1767
- const nativeDaemon = this.daemons.get(name);
1768
- if (nativeDaemon?.usesNativePane?.()) {
1769
- if (admission && !admission.current())
1770
- return;
1771
- await this.runTransition(name, async () => {
1772
- if (this.daemons.get(name) !== nativeDaemon || admission && !admission.current())
1773
- return;
1774
- if (!nativeDaemon.nativePaneHasExited() && (!await nativeDaemon.nativePauseReady(admission) || this.daemons.get(name) !== nativeDaemon || !nativeDaemon.nativePauseStillReady()))
1775
- return;
1776
- if (this.daemons.get(name) !== nativeDaemon || admission && !admission.current())
1777
- return;
1778
- await this.stopInTransition(name);
1779
- this.ctx.setNativePanePaused?.(name, true);
1780
- writePausedMarker(this.ctx.getInstanceDir(name), Date.now(), reason);
1781
- this.ctx.onAttentionChanged?.(name);
1782
- });
1783
- return;
1784
- }
1785
1650
  // B1: cancel any pending capacity backoff — a user-initiated pause should
1786
1651
  // not be undone by a queued restart 30–120s later.
1787
1652
  const pendingBackoff = this.capacityBackoffTimers.get(name);
@@ -1865,21 +1730,16 @@ export class InstanceLifecycle {
1865
1730
  clearPausedMarker(instanceDir);
1866
1731
  this.markActivitySeedNow(name);
1867
1732
  try {
1868
- if (isNativePaneInstance(this.ctx.fleetConfig?.instances[name]))
1869
- this.ctx.setNativePanePaused?.(name, false);
1870
1733
  await this.ctx.startPersistedPausedInstance(name, transition);
1871
1734
  }
1872
1735
  catch (err) {
1873
1736
  this.clearActivitySeedNow(name);
1874
1737
  writePausedMarker(instanceDir, pausedAt, reason);
1875
- if (isNativePaneInstance(this.ctx.fleetConfig?.instances[name]))
1876
- this.ctx.setNativePanePaused?.(name, true);
1877
1738
  throw err;
1878
1739
  }
1879
1740
  }
1880
1741
  this.noteWokeForWork(name);
1881
- if (!isNativePaneInstance(this.ctx.fleetConfig?.instances[name]))
1882
- this.ctx.startStatuslineWatcher(name);
1742
+ this.ctx.startStatuslineWatcher(name);
1883
1743
  }
1884
1744
  /**
1885
1745
  * Ownership boundary for a daemon that is not yet registered: if start()
@@ -1913,8 +1773,8 @@ export class InstanceLifecycle {
1913
1773
  this.invalidate(name);
1914
1774
  return this.runTransition(name, () => this.stopInTransition(name), transition);
1915
1775
  }
1916
- async stopInTransition(name, nativeOwner) {
1917
- this.invalidate(name, nativeOwner);
1776
+ async stopInTransition(name) {
1777
+ this.invalidate(name);
1918
1778
  this.wokeAt.delete(name);
1919
1779
  this.ctx.setTopicIcon(name, "remove");
1920
1780
  // #2897: a stopped instance holds no dialog — its "needs a human" notices are out of date.
@@ -1939,20 +1799,11 @@ export class InstanceLifecycle {
1939
1799
  if (!drained)
1940
1800
  this.ctx.logger.warn({ name }, "Pane write did not drain before durable reconciliation capture; relying on the Enter write-ahead fence");
1941
1801
  this.ctx.deliveryOutbox.markTargetReconciliationPending(name, daemon.bootId);
1942
- if (daemon.usesNativePane?.()) {
1943
- const reconciled = await daemon.reconcileNativeDeliveries(this.ctx.deliveryOutbox, () => this.daemons.get(name) === daemon);
1944
- if (!reconciled)
1945
- this.ctx.logger.warn({ name }, "Native stop could not settle every old delivery; retained attempts will not be replayed");
1946
- }
1947
- if (!daemon.usesNativePane?.())
1948
- captured = await capturePendingTargetReconciliation(this.ctx.deliveryOutbox, name, this.ctx.getInstanceDir(name), getTmuxSession(), this.ctx.logger);
1802
+ captured = await capturePendingTargetReconciliation(this.ctx.deliveryOutbox, name, this.ctx.getInstanceDir(name), getTmuxSession(), this.ctx.logger);
1949
1803
  }
1950
1804
  let stopped = false;
1951
1805
  try {
1952
- if (daemon.usesNativePane?.())
1953
- await daemon.stop({ nativePane: "close" });
1954
- else
1955
- await daemon.stop();
1806
+ await daemon.stop();
1956
1807
  stopped = true;
1957
1808
  }
1958
1809
  finally {
@@ -1982,11 +1833,6 @@ export class InstanceLifecycle {
1982
1833
  if (this.daemons.get(name) === daemon)
1983
1834
  this.daemons.delete(name);
1984
1835
  }
1985
- else if (isNativePaneInstance(this.ctx.fleetConfig?.instances[name])) {
1986
- if (!this.ctx.closeRetainedNativePane)
1987
- throw Error("Retained native pane owner is unavailable; no local PID was signalled");
1988
- await this.ctx.closeRetainedNativePane(name);
1989
- }
1990
1836
  else {
1991
1837
  const instanceDir = this.ctx.getInstanceDir(name);
1992
1838
  const pidPath = join(instanceDir, "daemon.pid");
@@ -2169,31 +2015,21 @@ export class InstanceLifecycle {
2169
2015
  clearPausedMarker(this.ctx.getInstanceDir(name));
2170
2016
  this.ctx.logger.info({ name }, "Instance removed");
2171
2017
  }
2018
+ /**
2019
+ * Whether a new instance made in `adapterId`'s world records it as channel_id: in a fleet with more than one
2020
+ * connection, or when that world is not the first one (where a missing channel_id would route). A single-connection
2021
+ * fleet's fleet.yaml stays as it was.
2022
+ */
2023
+ bindsAdapter(adapterId) {
2024
+ const fleet = this.ctx.fleetConfig;
2025
+ const channels = fleet?.channels ?? (fleet?.channel ? [fleet.channel] : []);
2026
+ const first = channels[0] ? (channels[0].id ?? channels[0].type) : undefined;
2027
+ return channels.length > 1 || adapterId !== first;
2028
+ }
2172
2029
  /** Handle create_instance tool call from a daemon. */
2173
2030
  async handleCreate(args, respond, adapterId, execution) {
2174
2031
  const check = () => execution?.assert();
2175
2032
  check();
2176
- if (args.runtime !== undefined && args.runtime !== "wsl" && args.runtime !== "windows") {
2177
- respond(null, "Unknown instance runtime");
2178
- return;
2179
- }
2180
- // M-2239 P1-1: a Windows agent is created only from the admin web dashboard (native-instance-api.ts), never through
2181
- // create_instance, deploy_template or any other path that reaches here — an agent holding create_instance could
2182
- // otherwise start one on the Windows host, in any drive path, with write access.
2183
- if (args.runtime === "windows") {
2184
- respond(null, WINDOWS_CREATE_REFUSED);
2185
- return;
2186
- }
2187
- // #3021 review: on a fleet with no chat connection a new agent never becomes a second General (it would inherit
2188
- // defaults.general_topic: true while the fleet has one).
2189
- if (this.ctx.fleetConfig && addsSecondGeneral(this.ctx.fleetConfig)) {
2190
- respond(null, "one_general: this fleet already has its General, and a new agent would inherit defaults.general_topic: true — set it to false in the defaults first");
2191
- return;
2192
- }
2193
- if (args.sandbox !== undefined) {
2194
- respond(null, "sandbox is supported only by the Windows runtime");
2195
- return;
2196
- }
2197
2033
  const rawDirectory = args.directory;
2198
2034
  const directory = rawDirectory ? rawDirectory.replace(/^~/, process.env.HOME || "~") : undefined;
2199
2035
  const topicName = args.topic_name || (directory ? basename(directory) : undefined);
@@ -2455,6 +2291,9 @@ export class InstanceLifecycle {
2455
2291
  ...getEffectiveInstanceDefaults(this.ctx.fleetConfig.defaults ?? {}),
2456
2292
  working_directory: workDir,
2457
2293
  ...(createdTopicId != null ? { topic_id: createdTopicId } : {}),
2294
+ // The topic was made in the caller's world (a Discord General in a fleet that lists Telegram first, or the
2295
+ // inverse): the instance is bound to that adapter, so routing and replies use it — not the fleet's first one.
2296
+ ...(createdTopicId != null && adapterId && this.bindsAdapter(adapterId) ? { channel_id: adapterId } : {}),
2458
2297
  ...(description ? { description } : {}),
2459
2298
  ...(systemPrompt ? { systemPrompt } : {}),
2460
2299
  ...(args.model ? { model: args.model } : {}),
@@ -2484,11 +2323,6 @@ export class InstanceLifecycle {
2484
2323
  createdConfig = instanceConfig;
2485
2324
  const beforeCreate = structuredClone(this.ctx.fleetConfig);
2486
2325
  const persist = () => {
2487
- // #3021 review r2: asked again at the commit, after every await — two creates that both saw no General at entry
2488
- // (defaults.general_topic: true) must not both become one.
2489
- if (addsSecondGeneral(this.ctx.fleetConfig, { general_topic: instanceConfig.general_topic })) {
2490
- throw new Error("one_general: this fleet already has its General, and a new agent would inherit defaults.general_topic: true — set it to false in the defaults first");
2491
- }
2492
2326
  this.ctx.fleetConfig.instances[newInstanceName] = instanceConfig;
2493
2327
  if (createdTopicId != null)
2494
2328
  this.ctx.routing.register(createdTopicId, { kind: "instance", name: newInstanceName });
@@ -2557,7 +2391,8 @@ export class InstanceLifecycle {
2557
2391
  /** Handle delete_instance tool call from a daemon. */
2558
2392
  async handleDelete(args, respond) {
2559
2393
  const instanceName = args.name;
2560
- const deleteTopic = args.delete_topic ?? false;
2394
+ // The user's decision (beta.9): deleting an agent deletes its topic, unless `delete_topic: false` keeps it.
2395
+ const deleteTopic = args.delete_topic ?? true;
2561
2396
  const instanceConfig = this.ctx.fleetConfig?.instances[instanceName];
2562
2397
  if (!instanceConfig) {
2563
2398
  respond(null, `Instance not found: ${instanceName}`);
@@ -2567,11 +2402,9 @@ export class InstanceLifecycle {
2567
2402
  respond(null, "Cannot delete the General instance");
2568
2403
  return;
2569
2404
  }
2570
- if (deleteTopic && instanceConfig.topic_id) {
2571
- await this.ctx.deleteForumTopic(instanceConfig.topic_id);
2572
- }
2573
- await this.ctx.removeInstance(instanceName, authorizeExplicitInstanceRemoval("delete-instance-tool"));
2574
- respond({ success: true, name: instanceName, topic_deleted: deleteTopic });
2405
+ // topic_deleted is the platform's answer, never the request; when the topic stays, topic_reason says why.
2406
+ const topic = await this.ctx.removeInstanceAndTopic(instanceName, authorizeExplicitInstanceRemoval("delete-instance-tool"), { deleteTopic });
2407
+ respond({ success: true, name: instanceName, topic_deleted: topic.deleted, ...(topic.deleted ? {} : { topic_reason: topic.reason }) });
2575
2408
  }
2576
2409
  has(name) {
2577
2410
  return this.daemons.has(name);