@ours.network/fleet 1.2.0-nightly.8 → 1.2.0-nightly.80

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 (423) hide show
  1. package/README.md +279 -68
  2. package/dist/account-origin.d.ts +5 -0
  3. package/dist/account-origin.js +31 -0
  4. package/dist/agent-ours/bridge.js +26 -9
  5. package/dist/agent-ours/correspondence.d.ts +10 -0
  6. package/dist/agent-ours/correspondence.js +1 -0
  7. package/dist/agent-ours/file-rpc.d.ts +12 -0
  8. package/dist/agent-ours/file-rpc.js +18 -4
  9. package/dist/agent-ours/harness.js +9 -1
  10. package/dist/agent-ours/mcp-endpoint.d.ts +19 -0
  11. package/dist/agent-ours/mcp-endpoint.js +98 -25
  12. package/dist/agent-ours/runtime.d.ts +9 -1
  13. package/dist/agent-ours/runtime.js +50 -2
  14. package/dist/agent-ours/service.d.ts +24 -1
  15. package/dist/agent-ours/service.js +97 -13
  16. package/dist/application/codex-models.d.ts +15 -0
  17. package/dist/application/codex-models.js +56 -0
  18. package/dist/application/conversation-history.d.ts +34 -0
  19. package/dist/application/conversation-history.js +294 -0
  20. package/dist/application/conversation-role-observer.d.ts +62 -0
  21. package/dist/application/conversation-role-observer.js +206 -0
  22. package/dist/application/fleet-query-service.d.ts +1 -1
  23. package/dist/application/fleet-query-service.js +3 -3
  24. package/dist/application/log-service.js +8 -8
  25. package/dist/application/model-catalog.d.ts +1 -1
  26. package/dist/application/model-catalog.js +5 -2
  27. package/dist/application/preset-provenance.d.ts +19 -0
  28. package/dist/application/preset-provenance.js +59 -0
  29. package/dist/application/resource-observer.d.ts +43 -0
  30. package/dist/application/resource-observer.js +323 -0
  31. package/dist/application/role-creation-service.js +3 -2
  32. package/dist/application/role-removal-service.js +17 -3
  33. package/dist/application/role-repository.d.ts +1 -1
  34. package/dist/application/role-repository.js +30 -7
  35. package/dist/application/room-layout-definitions.d.ts +45 -0
  36. package/dist/application/room-layout-definitions.js +130 -0
  37. package/dist/application/session-control.d.ts +63 -17
  38. package/dist/application/session-control.js +221 -23
  39. package/dist/application/supervisor-ours-tools.js +5 -11
  40. package/dist/application/task-layouts.d.ts +91 -0
  41. package/dist/application/task-layouts.js +261 -0
  42. package/dist/application/task-room-service.d.ts +101 -3
  43. package/dist/application/task-room-service.js +286 -33
  44. package/dist/application/types.d.ts +2 -0
  45. package/dist/atomic-file.d.ts +34 -1
  46. package/dist/atomic-file.js +161 -18
  47. package/dist/briefing.d.ts +3 -1
  48. package/dist/briefing.js +97 -31
  49. package/dist/build-info.json +9 -4
  50. package/dist/capabilities.d.ts +9 -1
  51. package/dist/capabilities.js +13 -0
  52. package/dist/cli.js +400 -37
  53. package/dist/client-profile.d.ts +5 -17
  54. package/dist/client-profile.js +4 -127
  55. package/dist/config.d.ts +45 -0
  56. package/dist/config.js +57 -6
  57. package/dist/creation.d.ts +1 -1
  58. package/dist/creation.js +4 -4
  59. package/dist/daemon-recovery.d.ts +14 -9
  60. package/dist/daemon-recovery.js +124 -115
  61. package/dist/docs.d.ts +1 -1
  62. package/dist/docs.js +207 -19
  63. package/dist/doctor.d.ts +4 -1
  64. package/dist/doctor.js +75 -60
  65. package/dist/erased-resources.d.ts +9 -0
  66. package/dist/erased-resources.js +87 -0
  67. package/dist/file-delivery/reader.d.ts +15 -0
  68. package/dist/file-delivery/reader.js +63 -0
  69. package/dist/file-delivery/store.d.ts +15 -0
  70. package/dist/file-delivery/store.js +124 -0
  71. package/dist/file-delivery/types.d.ts +19 -0
  72. package/dist/file-delivery/types.js +1 -0
  73. package/dist/fleet-command-audit.d.ts +7 -0
  74. package/dist/fleet-command-audit.js +24 -8
  75. package/dist/harness/agent-session.d.ts +4 -0
  76. package/dist/harness/claude-code-session.js +1 -1
  77. package/dist/harness/claude-code.js +21 -11
  78. package/dist/harness/claude-runtime.d.ts +12 -0
  79. package/dist/harness/claude-runtime.js +43 -0
  80. package/dist/harness/codex-app-server-proxy.d.ts +4 -1
  81. package/dist/harness/codex-app-server-proxy.js +41 -5
  82. package/dist/harness/codex-reasoning.d.ts +5 -0
  83. package/dist/harness/codex-reasoning.js +12 -0
  84. package/dist/harness/codex-runtime.d.ts +11 -1
  85. package/dist/harness/codex-runtime.js +31 -4
  86. package/dist/harness/codex-session.js +2 -2
  87. package/dist/harness/codex.js +24 -12
  88. package/dist/init-wizard.d.ts +2 -0
  89. package/dist/init-wizard.js +38 -19
  90. package/dist/isolation/policy.js +6 -1
  91. package/dist/isolation/types.d.ts +5 -0
  92. package/dist/managed-cli.d.ts +253 -0
  93. package/dist/managed-cli.js +923 -0
  94. package/dist/managed-recovery.d.ts +13 -0
  95. package/dist/managed-recovery.js +31 -0
  96. package/dist/minimal-setup.d.ts +2 -0
  97. package/dist/minimal-setup.js +44 -0
  98. package/dist/monitor.d.ts +9 -34
  99. package/dist/monitor.js +90 -153
  100. package/dist/notifications/fleet-producer.d.ts +31 -0
  101. package/dist/notifications/fleet-producer.js +351 -0
  102. package/dist/notifications/outbox.d.ts +59 -0
  103. package/dist/notifications/outbox.js +199 -0
  104. package/dist/notifications/target-cleanup.d.ts +16 -0
  105. package/dist/notifications/target-cleanup.js +75 -0
  106. package/dist/notifications/task-producer.d.ts +20 -0
  107. package/dist/notifications/task-producer.js +100 -0
  108. package/dist/ops.d.ts +2 -0
  109. package/dist/ops.js +20 -3
  110. package/dist/owner-channel/channel.js +17 -6
  111. package/dist/owner-channel/commands.d.ts +4 -0
  112. package/dist/owner-channel/commands.js +8 -0
  113. package/dist/owner-channel/lifecycle-outbox.js +4 -3
  114. package/dist/owner-channel/ours-client.js +2 -17
  115. package/dist/paths.d.ts +5 -0
  116. package/dist/paths.js +5 -0
  117. package/dist/preset-migration.js +43 -0
  118. package/dist/process-incarnation.d.ts +23 -0
  119. package/dist/process-incarnation.js +42 -0
  120. package/dist/reminders/manager.d.ts +75 -0
  121. package/dist/reminders/manager.js +278 -0
  122. package/dist/reminders/runtime.d.ts +27 -0
  123. package/dist/reminders/runtime.js +32 -0
  124. package/dist/reminders/schedule.d.ts +37 -0
  125. package/dist/reminders/schedule.js +104 -0
  126. package/dist/reminders/store.d.ts +341 -0
  127. package/dist/reminders/store.js +762 -0
  128. package/dist/reminders/tools.d.ts +20 -0
  129. package/dist/reminders/tools.js +114 -0
  130. package/dist/resolved-plan.js +1 -0
  131. package/dist/rooms-tasks/add-member.d.ts +48 -0
  132. package/dist/rooms-tasks/add-member.js +84 -0
  133. package/dist/rooms-tasks/archived-absence.d.ts +4 -0
  134. package/dist/rooms-tasks/archived-absence.js +11 -0
  135. package/dist/rooms-tasks/cli.js +65 -5
  136. package/dist/rooms-tasks/close.d.ts +5 -2
  137. package/dist/rooms-tasks/close.js +224 -36
  138. package/dist/rooms-tasks/config.d.ts +1 -1
  139. package/dist/rooms-tasks/config.js +11 -4
  140. package/dist/rooms-tasks/cowork-adapter.d.ts +12 -5
  141. package/dist/rooms-tasks/cowork-adapter.js +15 -121
  142. package/dist/rooms-tasks/cowork-http.js +56 -6
  143. package/dist/rooms-tasks/deletion.d.ts +1 -1
  144. package/dist/rooms-tasks/deletion.js +63 -10
  145. package/dist/rooms-tasks/erasure.d.ts +6 -0
  146. package/dist/rooms-tasks/erasure.js +173 -0
  147. package/dist/rooms-tasks/external-worker.d.ts +1 -1
  148. package/dist/rooms-tasks/external-worker.js +3 -4
  149. package/dist/rooms-tasks/layout-binding-client.d.ts +11 -0
  150. package/dist/rooms-tasks/layout-binding-client.js +56 -0
  151. package/dist/rooms-tasks/layout-binding-grants.d.ts +21 -0
  152. package/dist/rooms-tasks/layout-binding-grants.js +128 -0
  153. package/dist/rooms-tasks/layout-cli.d.ts +4 -0
  154. package/dist/rooms-tasks/layout-cli.js +107 -0
  155. package/dist/rooms-tasks/layout-config.d.ts +11 -0
  156. package/dist/rooms-tasks/layout-config.js +89 -0
  157. package/dist/rooms-tasks/layout-control.d.ts +21 -0
  158. package/dist/rooms-tasks/layout-control.js +52 -0
  159. package/dist/rooms-tasks/layout-member-retirement.d.ts +10 -0
  160. package/dist/rooms-tasks/layout-member-retirement.js +90 -0
  161. package/dist/rooms-tasks/layout-service.d.ts +43 -0
  162. package/dist/rooms-tasks/layout-service.js +203 -0
  163. package/dist/rooms-tasks/layout.d.ts +121 -0
  164. package/dist/rooms-tasks/layout.js +286 -0
  165. package/dist/rooms-tasks/legacy-task-member.d.ts +19 -0
  166. package/dist/rooms-tasks/legacy-task-member.js +116 -0
  167. package/dist/rooms-tasks/live-readiness.d.ts +18 -0
  168. package/dist/rooms-tasks/live-readiness.js +85 -0
  169. package/dist/rooms-tasks/member-ownership.d.ts +5 -0
  170. package/dist/rooms-tasks/member-ownership.js +40 -0
  171. package/dist/rooms-tasks/member-startup.d.ts +1 -0
  172. package/dist/rooms-tasks/member-startup.js +2 -0
  173. package/dist/rooms-tasks/provision.d.ts +3 -0
  174. package/dist/rooms-tasks/provision.js +101 -49
  175. package/dist/rooms-tasks/recovery.d.ts +19 -0
  176. package/dist/rooms-tasks/recovery.js +110 -0
  177. package/dist/rooms-tasks/room-state.d.ts +4 -2
  178. package/dist/rooms-tasks/room-state.js +47 -8
  179. package/dist/rooms-tasks/task-service-retirement.d.ts +11 -0
  180. package/dist/rooms-tasks/task-service-retirement.js +21 -0
  181. package/dist/rooms-tasks/task-state.d.ts +43 -5
  182. package/dist/rooms-tasks/task-state.js +244 -22
  183. package/dist/rooms-tasks/types.d.ts +35 -0
  184. package/dist/rooms-tasks/workspace-artifacts.d.ts +6 -0
  185. package/dist/rooms-tasks/workspace-artifacts.js +93 -0
  186. package/dist/rooms-tasks/workspace.d.ts +35 -0
  187. package/dist/rooms-tasks/workspace.js +325 -0
  188. package/dist/runner.d.ts +33 -4
  189. package/dist/runner.js +410 -62
  190. package/dist/session/acp.d.ts +75 -2
  191. package/dist/session/acp.js +345 -82
  192. package/dist/session/arbiter.d.ts +98 -0
  193. package/dist/session/arbiter.js +272 -3
  194. package/dist/session/codex-app-server.d.ts +45 -1
  195. package/dist/session/codex-app-server.js +225 -32
  196. package/dist/session/control.d.ts +17 -3
  197. package/dist/session/control.js +219 -23
  198. package/dist/session/conversation-normalizer.d.ts +2 -1
  199. package/dist/session/conversation-normalizer.js +1 -1
  200. package/dist/session/conversation-observation.d.ts +25 -0
  201. package/dist/session/conversation-observation.js +100 -0
  202. package/dist/session/conversation-replay.d.ts +50 -0
  203. package/dist/session/conversation-replay.js +203 -0
  204. package/dist/session/conversation-store.d.ts +15 -1
  205. package/dist/session/conversation-store.js +213 -26
  206. package/dist/session/conversation-types.d.ts +57 -4
  207. package/dist/session/prompt-batch.d.ts +79 -0
  208. package/dist/session/prompt-batch.js +120 -0
  209. package/dist/session/task-notice.d.ts +14 -0
  210. package/dist/session/task-notice.js +13 -0
  211. package/dist/session/types.d.ts +42 -1
  212. package/dist/setup-tunnel-preflight.d.ts +34 -0
  213. package/dist/setup-tunnel-preflight.js +62 -0
  214. package/dist/socket-path.d.ts +2 -0
  215. package/dist/socket-path.js +22 -0
  216. package/dist/spawn.d.ts +5 -1
  217. package/dist/spawn.js +40 -4
  218. package/dist/startup-prompt.d.ts +15 -0
  219. package/dist/startup-prompt.js +71 -0
  220. package/dist/startup-readiness.d.ts +32 -0
  221. package/dist/startup-readiness.js +101 -0
  222. package/dist/startup-telemetry.d.ts +16 -0
  223. package/dist/startup-telemetry.js +46 -0
  224. package/dist/subscriptions/cli.d.ts +91 -0
  225. package/dist/subscriptions/cli.js +223 -0
  226. package/dist/subscriptions/launch.d.ts +37 -0
  227. package/dist/subscriptions/launch.js +93 -0
  228. package/dist/subscriptions/login.d.ts +77 -0
  229. package/dist/subscriptions/login.js +215 -0
  230. package/dist/subscriptions/observed.d.ts +7 -0
  231. package/dist/subscriptions/observed.js +44 -0
  232. package/dist/subscriptions/probe.d.ts +10 -0
  233. package/dist/subscriptions/probe.js +73 -0
  234. package/dist/subscriptions/service.d.ts +102 -0
  235. package/dist/subscriptions/service.js +364 -0
  236. package/dist/subscriptions/store.d.ts +71 -0
  237. package/dist/subscriptions/store.js +143 -0
  238. package/dist/supervisor/adoption.d.ts +8 -0
  239. package/dist/supervisor/adoption.js +78 -0
  240. package/dist/supervisor/catalog.d.ts +62 -0
  241. package/dist/supervisor/catalog.js +254 -0
  242. package/dist/supervisor/fleet.d.ts +8 -0
  243. package/dist/supervisor/fleet.js +89 -0
  244. package/dist/supervisor/index.js +3 -6
  245. package/dist/supervisor/launchd.d.ts +1 -1
  246. package/dist/supervisor/launchd.js +26 -13
  247. package/dist/supervisor/legacy.d.ts +35 -0
  248. package/dist/supervisor/legacy.js +524 -0
  249. package/dist/supervisor/manager.d.ts +15 -0
  250. package/dist/supervisor/manager.js +270 -0
  251. package/dist/supervisor/registration-refresh.d.ts +45 -0
  252. package/dist/supervisor/registration-refresh.js +266 -0
  253. package/dist/supervisor/scope.d.ts +4 -0
  254. package/dist/supervisor/scope.js +10 -0
  255. package/dist/supervisor/systemd.d.ts +2 -2
  256. package/dist/supervisor/systemd.js +19 -33
  257. package/dist/task-supervision.d.ts +9 -0
  258. package/dist/task-supervision.js +145 -0
  259. package/dist/temp-idle.d.ts +17 -0
  260. package/dist/temp-idle.js +42 -0
  261. package/dist/temp-lifecycle.d.ts +23 -8
  262. package/dist/temp-lifecycle.js +123 -66
  263. package/dist/temp-supervisor-recovery.d.ts +1 -1
  264. package/dist/temp-supervisor-recovery.js +2 -2
  265. package/dist/tunnel-setup-completion.d.ts +7 -0
  266. package/dist/tunnel-setup-completion.js +13 -0
  267. package/dist/tunnel-setup-input.d.ts +19 -0
  268. package/dist/tunnel-setup-input.js +130 -0
  269. package/dist/watchdog/query.d.ts +3 -1
  270. package/dist/watchdog/query.js +2 -1
  271. package/dist/web/agent-attachments.d.ts +29 -0
  272. package/dist/web/agent-attachments.js +162 -0
  273. package/dist/web/auth.d.ts +65 -2
  274. package/dist/web/auth.js +201 -11
  275. package/dist/web/available-port.d.ts +2 -0
  276. package/dist/web/available-port.js +23 -0
  277. package/dist/web/control.d.ts +3 -3
  278. package/dist/web/control.js +10 -8
  279. package/dist/web/conversation-stream-codec.d.ts +23 -0
  280. package/dist/web/conversation-stream-codec.js +110 -0
  281. package/dist/web/conversation-stream.d.ts +26 -0
  282. package/dist/web/conversation-stream.js +239 -0
  283. package/dist/web/events.d.ts +2 -0
  284. package/dist/web/events.js +9 -0
  285. package/dist/web/fleet-config-service.d.ts +7 -1
  286. package/dist/web/fleet-config-service.js +61 -16
  287. package/dist/web/prefix-gateway.d.ts +32 -0
  288. package/dist/web/prefix-gateway.js +248 -0
  289. package/dist/web/resource-views.d.ts +135 -0
  290. package/dist/web/resource-views.js +486 -0
  291. package/dist/web/runtime.d.ts +3 -1
  292. package/dist/web/runtime.js +132 -34
  293. package/dist/web/server.d.ts +19 -0
  294. package/dist/web/server.js +821 -68
  295. package/dist/web/service.d.ts +11 -2
  296. package/dist/web/service.js +30 -4
  297. package/dist/web/workspace-devices.d.ts +107 -0
  298. package/dist/web/workspace-devices.js +277 -0
  299. package/dist/web/workspace-tunnel.d.ts +1 -0
  300. package/dist/web/workspace-tunnel.js +34 -0
  301. package/dist/workspace-enrollment.d.ts +83 -0
  302. package/dist/workspace-enrollment.js +605 -0
  303. package/dist/workspace-replacement.d.ts +66 -0
  304. package/dist/workspace-replacement.js +238 -0
  305. package/docs/acp-files.md +146 -0
  306. package/docs/conversation-stream.md +216 -0
  307. package/docs/fleet-migration.md +54 -0
  308. package/docs/live-voice.md +13 -0
  309. package/docs/room-layouts.md +227 -0
  310. package/docs/self-reminders.md +374 -0
  311. package/docs/task-workspaces.md +225 -0
  312. package/docs/validation/managed-cli-permissions.md +421 -0
  313. package/examples/room-layouts/fresh.yaml +27 -0
  314. package/examples/room-layouts/scoped.yaml +21 -0
  315. package/examples/room-layouts/shared.yaml +19 -0
  316. package/package.json +24 -20
  317. package/presets/README.md +78 -0
  318. package/presets/brain-catalog.json +8 -2
  319. package/presets/fleet/agent_templates/Critic.yaml +1 -1
  320. package/presets/fleet/agent_templates/Developer.yaml +1 -1
  321. package/presets/fleet/agent_templates/Engineer.yaml +5 -0
  322. package/presets/fleet/agent_templates/LocalCoordinator.yaml +4 -2
  323. package/presets/fleet/agents/FleetCoordinator.yaml +1 -1
  324. package/presets/fleet/brains/claude-fable-5-1-high.yaml +5 -0
  325. package/presets/fleet/brains/claude-fable-5-1-low.yaml +5 -0
  326. package/presets/fleet/brains/claude-fable-5-1-max.yaml +5 -0
  327. package/presets/fleet/brains/claude-fable-5-1-medium.yaml +5 -0
  328. package/presets/fleet/brains/claude-fable-5-1-xhigh.yaml +5 -0
  329. package/presets/fleet/brains/claude-fable-5-high.yaml +1 -1
  330. package/presets/fleet/brains/claude-fable-5-low.yaml +1 -1
  331. package/presets/fleet/brains/claude-fable-5-max.yaml +1 -1
  332. package/presets/fleet/brains/claude-fable-5-medium.yaml +1 -1
  333. package/presets/fleet/brains/claude-fable-5-xhigh.yaml +1 -1
  334. package/presets/fleet/brains/claude-haiku-4-5-20251001-default.yaml +4 -0
  335. package/presets/fleet/brains/claude-opus-5-5-high.yaml +5 -0
  336. package/presets/fleet/brains/claude-opus-5-5-low.yaml +5 -0
  337. package/presets/fleet/brains/claude-opus-5-5-max.yaml +5 -0
  338. package/presets/fleet/brains/claude-opus-5-5-medium.yaml +5 -0
  339. package/presets/fleet/brains/claude-opus-5-5-xhigh.yaml +5 -0
  340. package/presets/fleet/brains/claude-opus-5-high.yaml +1 -1
  341. package/presets/fleet/brains/claude-opus-5-low.yaml +1 -1
  342. package/presets/fleet/brains/claude-opus-5-max.yaml +1 -1
  343. package/presets/fleet/brains/claude-opus-5-medium.yaml +1 -1
  344. package/presets/fleet/brains/claude-opus-5-xhigh.yaml +1 -1
  345. package/presets/fleet/brains/claude-sonnet-5-high.yaml +1 -1
  346. package/presets/fleet/brains/claude-sonnet-5-low.yaml +1 -1
  347. package/presets/fleet/brains/claude-sonnet-5-max.yaml +1 -1
  348. package/presets/fleet/brains/claude-sonnet-5-medium.yaml +1 -1
  349. package/presets/fleet/brains/claude-sonnet-5-xhigh.yaml +1 -1
  350. package/presets/fleet/brains/codex-gpt-5-3-codex-spark-high.yaml +1 -1
  351. package/presets/fleet/brains/codex-gpt-5-3-codex-spark-low.yaml +1 -1
  352. package/presets/fleet/brains/codex-gpt-5-3-codex-spark-medium.yaml +1 -1
  353. package/presets/fleet/brains/codex-gpt-5-3-codex-spark-xhigh.yaml +1 -1
  354. package/presets/fleet/brains/codex-gpt-5-4-high.yaml +1 -1
  355. package/presets/fleet/brains/codex-gpt-5-4-low.yaml +1 -1
  356. package/presets/fleet/brains/codex-gpt-5-4-medium.yaml +1 -1
  357. package/presets/fleet/brains/codex-gpt-5-4-mini-high.yaml +1 -1
  358. package/presets/fleet/brains/codex-gpt-5-4-mini-low.yaml +1 -1
  359. package/presets/fleet/brains/codex-gpt-5-4-mini-medium.yaml +1 -1
  360. package/presets/fleet/brains/codex-gpt-5-4-mini-xhigh.yaml +1 -1
  361. package/presets/fleet/brains/codex-gpt-5-4-xhigh.yaml +1 -1
  362. package/presets/fleet/brains/codex-gpt-5-5-high.yaml +1 -1
  363. package/presets/fleet/brains/codex-gpt-5-5-low.yaml +1 -1
  364. package/presets/fleet/brains/codex-gpt-5-5-medium.yaml +1 -1
  365. package/presets/fleet/brains/codex-gpt-5-5-xhigh.yaml +1 -1
  366. package/presets/fleet/brains/codex-gpt-5-6-luna-high.yaml +1 -1
  367. package/presets/fleet/brains/codex-gpt-5-6-luna-low.yaml +1 -1
  368. package/presets/fleet/brains/codex-gpt-5-6-luna-max.yaml +1 -1
  369. package/presets/fleet/brains/codex-gpt-5-6-luna-medium.yaml +1 -1
  370. package/presets/fleet/brains/codex-gpt-5-6-luna-xhigh.yaml +1 -1
  371. package/presets/fleet/brains/codex-gpt-5-6-sol-high.yaml +1 -1
  372. package/presets/fleet/brains/codex-gpt-5-6-sol-low.yaml +1 -1
  373. package/presets/fleet/brains/codex-gpt-5-6-sol-max.yaml +1 -1
  374. package/presets/fleet/brains/codex-gpt-5-6-sol-medium.yaml +1 -1
  375. package/presets/fleet/brains/codex-gpt-5-6-sol-ultra.yaml +1 -1
  376. package/presets/fleet/brains/codex-gpt-5-6-sol-xhigh.yaml +1 -1
  377. package/presets/fleet/brains/codex-gpt-5-6-terra-high.yaml +1 -1
  378. package/presets/fleet/brains/codex-gpt-5-6-terra-low.yaml +1 -1
  379. package/presets/fleet/brains/codex-gpt-5-6-terra-max.yaml +1 -1
  380. package/presets/fleet/brains/codex-gpt-5-6-terra-medium.yaml +1 -1
  381. package/presets/fleet/brains/codex-gpt-5-6-terra-ultra.yaml +1 -1
  382. package/presets/fleet/brains/codex-gpt-5-6-terra-xhigh.yaml +1 -1
  383. package/presets/fleet/brains/codex-gpt-6-1-sol-high.yaml +5 -0
  384. package/presets/fleet/brains/codex-gpt-6-1-sol-low.yaml +5 -0
  385. package/presets/fleet/brains/codex-gpt-6-1-sol-max.yaml +5 -0
  386. package/presets/fleet/brains/codex-gpt-6-1-sol-medium.yaml +5 -0
  387. package/presets/fleet/brains/codex-gpt-6-1-sol-ultra.yaml +5 -0
  388. package/presets/fleet/brains/codex-gpt-6-1-sol-xhigh.yaml +5 -0
  389. package/presets/fleet/brains/codex-gpt-6-astra-high.yaml +1 -1
  390. package/presets/fleet/brains/codex-gpt-6-astra-low.yaml +1 -1
  391. package/presets/fleet/brains/codex-gpt-6-astra-max.yaml +1 -1
  392. package/presets/fleet/brains/codex-gpt-6-astra-medium.yaml +1 -1
  393. package/presets/fleet/brains/codex-gpt-6-astra-ultra.yaml +1 -1
  394. package/presets/fleet/brains/codex-gpt-6-astra-xhigh.yaml +1 -1
  395. package/presets/fleet/brains/codex-gpt-6-luna-high.yaml +5 -0
  396. package/presets/fleet/brains/codex-gpt-6-luna-low.yaml +5 -0
  397. package/presets/fleet/brains/codex-gpt-6-luna-max.yaml +5 -0
  398. package/presets/fleet/brains/codex-gpt-6-luna-medium.yaml +5 -0
  399. package/presets/fleet/brains/codex-gpt-6-luna-xhigh.yaml +5 -0
  400. package/presets/fleet/brains/codex-gpt-6-sol-high.yaml +5 -0
  401. package/presets/fleet/brains/codex-gpt-6-sol-low.yaml +5 -0
  402. package/presets/fleet/brains/codex-gpt-6-sol-max.yaml +5 -0
  403. package/presets/fleet/brains/codex-gpt-6-sol-medium.yaml +5 -0
  404. package/presets/fleet/brains/codex-gpt-6-sol-ultra.yaml +5 -0
  405. package/presets/fleet/brains/codex-gpt-6-sol-xhigh.yaml +5 -0
  406. package/presets/fleet/roles/Coordinator.yaml +12 -11
  407. package/presets/fleet/roles/Critic.yaml +13 -0
  408. package/presets/fleet/roles/Developer.yaml +13 -0
  409. package/presets/fleet/roles/Engineer.yaml +53 -0
  410. package/presets/fleet/room_layouts/engineering.yaml +25 -0
  411. package/presets/fleet/room_layouts/pair.yaml +24 -0
  412. package/presets/fleet/room_layouts/single.yaml +17 -0
  413. package/presets/fleet/room_layouts/team.yaml +30 -0
  414. package/presets/fleet/room_templates/engineering.yaml +19 -0
  415. package/presets/manifest.json +2 -2
  416. package/dist/web-app/assets/index-59GF-gsZ.css +0 -1
  417. package/dist/web-app/assets/index-C0h3ALvs.js +0 -10
  418. package/dist/web-app/icons/ours-fleet-maskable.svg +0 -4
  419. package/dist/web-app/icons/ours-fleet.svg +0 -4
  420. package/dist/web-app/index.html +0 -17
  421. package/dist/web-app/manifest.webmanifest +0 -15
  422. package/dist/web-app/offline.html +0 -18
  423. package/dist/web-app/sw.js +0 -51
@@ -0,0 +1,261 @@
1
+ import { publishFleetResourceCommit } from './resource-observer.js';
2
+ /** Task ↔ Room Layout bridge.
3
+ * A layout task owns exactly one Room Layout run, `task-<task_id>`, snapshotted
4
+ * from the named source layout with task context added to every room contract.
5
+ * Room opening and closing reuse the #199 engine in detached workers; each
6
+ * operation's outcome is recorded beside the run so HTTP callers can observe it.
7
+ */
8
+ import { createHash, randomUUID } from 'node:crypto';
9
+ import { existsSync, readFileSync, rmSync } from 'node:fs';
10
+ import { join } from 'node:path';
11
+ import { canonicalJson } from '../canonical-json.js';
12
+ import { replaceFileAtomically, withFileLock } from '../atomic-file.js';
13
+ import { assertLayoutFile } from '../rooms-tasks/layout-config.js';
14
+ import { getTask as readTask } from '../rooms-tasks/task-state.js';
15
+ import { stateRoot } from '../paths.js';
16
+ import { launchFleetWorker } from '../rooms-tasks/external-worker.js';
17
+ import { layoutSupervisorId } from '../rooms-tasks/layout-control.js';
18
+ import { layoutRunPath, RoomLayoutService } from '../rooms-tasks/layout-service.js';
19
+ import { FleetError } from './errors.js';
20
+ import { ownedLayoutRetirementSeats } from '../rooms-tasks/layout-member-retirement.js';
21
+ import { eraseMemberArtifacts } from '../rooms-tasks/erasure.js';
22
+ import { assertTaskRegistrationsAbsent } from '../supervisor/catalog.js';
23
+ /** Hash of the authorable definition only (never the source file path). */
24
+ export function layoutDefinitionHash(definition) {
25
+ const { version, description, participants, rooms } = definition;
26
+ return createHash('sha256').update(canonicalJson({ version, description: description ?? null, participants, rooms })).digest('hex');
27
+ }
28
+ /** Always-current brief for layout participants; rooms may open long after the run snapshot.
29
+ * It lives in Fleet's private layout state, never in the agent-writable task workspace. */
30
+ export function taskBriefPath(task) {
31
+ return layoutRunPath(`task-${task.task_id}`).replace(/\.json$/, '.brief.md');
32
+ }
33
+ export function writeTaskBrief(task) {
34
+ const path = taskBriefPath(task); // layoutRunPath verified the private directory
35
+ if (existsSync(path))
36
+ assertLayoutFile(path);
37
+ replaceFileAtomically(path, `# ${task.title}\n\nTask ${task.task_id}\n\n${task.brief?.trim() ?? ''}\n`, 0o600);
38
+ }
39
+ /** Task context reaches every participant through the room contract (briefing text).
40
+ * The contract references the brief file instead of copying the brief, so later edits reach later rooms. */
41
+ export function taskScopedDefinition(definition, task) {
42
+ const preamble = [
43
+ `Task ${task.task_id}: ${task.title}`,
44
+ ...(task.workspace ? [`Task workspace: ${task.workspace.path}`] : []),
45
+ `Current task brief: ${taskBriefPath(task)} (kept up to date by Fleet; read it before starting work)`,
46
+ ].join('\n');
47
+ for (const room of Object.values(definition.rooms))
48
+ room.contract = room.contract ? `${preamble}\n\nRoom contract:\n${room.contract}` : preamble;
49
+ return definition;
50
+ }
51
+ const ROOM_KEY = /^[A-Za-z][A-Za-z0-9_-]*$/;
52
+ /** Opening rooms requires a started, live task; checked again by the worker before any side effect. */
53
+ export function assertLayoutOpenable(task) {
54
+ if (task.deletion?.status === 'pending')
55
+ throw new FleetError('conflict', 'task is being deleted; its layout rooms cannot be opened');
56
+ if (task.terminal_intent || ['done', 'cancelled', 'failed'].includes(task.state))
57
+ throw new FleetError('conflict', 'task is closing or closed; its layout rooms cannot be opened');
58
+ if (task.state !== 'active' && task.state !== 'review')
59
+ throw new FleetError('conflict', `start the task before opening rooms (state '${task.state}')`);
60
+ }
61
+ export class TaskLayouts {
62
+ configPath;
63
+ deps;
64
+ constructor(configPath, deps = {}) {
65
+ this.configPath = configPath;
66
+ this.deps = deps;
67
+ }
68
+ service() { return this.deps.service ?? new RoomLayoutService(this.configPath); }
69
+ operationPath(runId) { return join(stateRoot(), 'layouts', `${runId}.op.json`); }
70
+ provenancePath(runId) { return layoutRunPath(runId).replace(/\.json$/, '.provenance.json'); }
71
+ /** Serializes run creation, worker preconditions and deletion's removal of the run. */
72
+ withTaskLock(runId, fn) {
73
+ return withFileLock(layoutRunPath(runId).replace(/\.json$/, '.task.lock'), fn);
74
+ }
75
+ /** Resolve a layout for task creation: it must exist, parse and reference known Agent Templates. */
76
+ resolve(name) {
77
+ return { name, definition_hash: layoutDefinitionHash(this.service().definition(name)) };
78
+ }
79
+ runExists(link) { return existsSync(layoutRunPath(link.run_id)); }
80
+ /** Idempotent: reuse a run whose provenance matches this task, or snapshot one from the pinned source. */
81
+ async ensureRun(task, precondition) {
82
+ const link = task.layout;
83
+ if (!link)
84
+ throw Error(`task ${task.task_id} has no layout`);
85
+ await this.withTaskLock(link.run_id, async () => {
86
+ const current = readTask(task.task_id);
87
+ precondition?.(current);
88
+ writeTaskBrief(current);
89
+ if (this.runExists(link)) {
90
+ this.verifyProvenance(current);
91
+ return;
92
+ }
93
+ const service = this.service();
94
+ const source = service.definition(link.name);
95
+ if (layoutDefinitionHash(source) !== link.definition_hash)
96
+ throw Error(`room layout ${link.name} changed before this task's layout run was created; create a new task to use the edited layout`);
97
+ const scoped = taskScopedDefinition(structuredClone(source), current);
98
+ const provenance = { task_id: current.task_id, source_hash: link.definition_hash, scoped_hash: layoutDefinitionHash(scoped) };
99
+ // Provenance precedes the run: a crash in between is re-derived from the same pinned source.
100
+ replaceFileAtomically(this.provenancePath(link.run_id), JSON.stringify(provenance), 0o600);
101
+ await service.create(link.name, {}, link.run_id, { source: scoped, cwd: current.workspace?.path });
102
+ });
103
+ }
104
+ verifyProvenance(task) {
105
+ const link = task.layout, path = this.provenancePath(link.run_id);
106
+ let provenance;
107
+ try {
108
+ assertLayoutFile(path);
109
+ provenance = JSON.parse(readFileSync(path, 'utf8'));
110
+ }
111
+ catch { /* missing or untrusted */ }
112
+ const snapshot = this.service().open(link.run_id, true).snapshot();
113
+ if (!provenance || provenance.task_id !== task.task_id || provenance.source_hash !== link.definition_hash
114
+ || provenance.scoped_hash !== layoutDefinitionHash({ version: 1, ...snapshot.definition }))
115
+ throw Error(`layout run ${link.run_id} does not match this task's pinned layout; inspect it before continuing`);
116
+ }
117
+ readOperation(runId) {
118
+ const path = this.operationPath(runId);
119
+ try {
120
+ return existsSync(path) ? JSON.parse(readFileSync(path, 'utf8')) : undefined;
121
+ }
122
+ catch {
123
+ return undefined;
124
+ }
125
+ }
126
+ /** Update only the still-current operation; a superseded or forgotten one is never resurrected. */
127
+ updateOperation(runId, record) {
128
+ return withFileLock(this.operationPath(runId) + '.lock', () => {
129
+ if (this.readOperation(runId)?.id !== record.id)
130
+ return false;
131
+ this.writeOperation(runId, record);
132
+ return true;
133
+ });
134
+ }
135
+ writeOperation(runId, record) {
136
+ layoutRunPath(runId); // validates the ID and creates the private layouts directory
137
+ replaceFileAtomically(this.operationPath(runId), JSON.stringify({ ...record, updated_at: new Date().toISOString() }), 0o600);
138
+ publishFleetResourceCommit(this.operationPath(runId));
139
+ }
140
+ /** Sanitized read model: no Agent Template snapshots, owner fingerprints or session internals. */
141
+ view(task) {
142
+ const link = task.layout;
143
+ if (!link)
144
+ return undefined;
145
+ const base = { name: link.name, run_id: link.run_id, operation: this.readOperation(link.run_id) };
146
+ if (!this.runExists(link))
147
+ return { ...base, created: false, closed: false, closing: false, rooms: [], participants: [] };
148
+ const state = this.service().open(link.run_id, true).snapshot();
149
+ return {
150
+ ...base, created: true, closed: state.closed, closing: Boolean(state.closing),
151
+ ...(state.uncertain ? { uncertain: state.uncertain } : {}),
152
+ rooms: Object.entries(state.definition.rooms).map(([key, spec]) => {
153
+ const room = state.rooms[key];
154
+ return {
155
+ key, goal: spec.goal, members: [...spec.members], ...(spec.roles ? { roles: { ...spec.roles } } : {}),
156
+ state: room?.state ?? 'declared', ready: [...(room?.ready ?? [])],
157
+ ...(room?.native ? { room_id: room.native.room_id, identity_cid: room.native.identity_cid } : {}),
158
+ };
159
+ }),
160
+ participants: Object.entries(state.participants).map(([key, p]) => ({
161
+ key, ...(p.participant ? { participant: p.participant, room: p.room } : {}),
162
+ agent_template: state.definition.participants[p.participant ?? key]?.agent_template, owned: p.owned, retired: Boolean(p.retired),
163
+ ...(p.instance?.agent ? { agent: p.instance.agent } : {}), ...(p.instance?.cid ? { cid: p.instance.cid } : {}),
164
+ })),
165
+ };
166
+ }
167
+ /** Accept an operation and run it in a detached worker; the outcome is recorded for polling. */
168
+ async launch(task, operation, room) {
169
+ const link = task.layout;
170
+ if (!link)
171
+ throw Error(`task ${task.task_id} has no layout`);
172
+ if (operation !== 'close' && (!room || !ROOM_KEY.test(room)))
173
+ throw new FleetError('invalid_request', 'a valid room key is required');
174
+ if (room) {
175
+ const definition = this.runExists(link) ? this.service().open(link.run_id, true).snapshot().definition : undefined;
176
+ if (definition && !Object.hasOwn(definition.rooms, room))
177
+ throw new FleetError('resource_not_found', `unknown layout room: ${room}`);
178
+ }
179
+ const record = { id: randomUUID(), operation, ...(room ? { room } : {}), status: 'launching' };
180
+ await withFileLock(this.operationPath(link.run_id) + '.lock', () => {
181
+ const current = this.readOperation(link.run_id);
182
+ // Full close always proceeds: terminal cleanup must not wait behind an open; the engine lock serializes them.
183
+ if (operation !== 'close' && current && ['launching', 'running'].includes(current.status) && Date.now() - Date.parse(current.updated_at) < 10 * 60_000)
184
+ throw new FleetError('conflict', `layout operation already in progress: ${current.operation}${current.room ? ' ' + current.room : ''}`);
185
+ this.writeOperation(link.run_id, record);
186
+ });
187
+ const args = ['task', '_layout', task.task_id, operation, ...(room ? [room] : []), '--operation-id', record.id];
188
+ const launch = this.deps.launch
189
+ ?? ((cli, name) => launchFleetWorker(cli, name, this.configPath, this.deps.binPath?.()));
190
+ try {
191
+ await launch(args, `task-layout-${task.task_id}`);
192
+ }
193
+ catch (error) {
194
+ await this.updateOperation(link.run_id, { ...record, status: 'failed', error: `worker failed to start: ${String(error.message ?? error)}` });
195
+ throw error;
196
+ }
197
+ return this.readOperation(link.run_id);
198
+ }
199
+ /** Worker body. Errors are recorded and rethrown; unknown engine outcomes stay in run state for inspection. */
200
+ /** Without an ID (direct CLI use) the worker claims a new current operation. */
201
+ async run(task, operation, room, operationId) {
202
+ const link = task.layout;
203
+ if (!link)
204
+ throw Error(`task ${task.task_id} has no layout`);
205
+ const record = { id: operationId ?? randomUUID(), operation, ...(room ? { room } : {}) };
206
+ if (!operationId)
207
+ await withFileLock(this.operationPath(link.run_id) + '.lock', () => this.writeOperation(link.run_id, { ...record, status: 'running' }));
208
+ else
209
+ await this.updateOperation(link.run_id, { ...record, status: 'running' });
210
+ try {
211
+ await this.perform(task, operation, room);
212
+ await this.updateOperation(link.run_id, { ...record, status: 'succeeded' });
213
+ }
214
+ catch (error) {
215
+ await this.updateOperation(link.run_id, { ...record, status: 'failed', error: error.message ?? String(error) });
216
+ throw error;
217
+ }
218
+ }
219
+ async perform(task, operation, room) {
220
+ const link = task.layout;
221
+ if (operation === 'open') {
222
+ // Re-read under the task-layout lock: a deletion or terminal action accepted after HTTP admission wins.
223
+ await this.ensureRun(task, assertLayoutOpenable);
224
+ // If deletion removed the run since, fail rather than recreate it.
225
+ if (!this.runExists(link))
226
+ throw new FleetError('conflict', 'task layout run was removed');
227
+ await this.service().open(link.run_id).activate(layoutSupervisorId(), room);
228
+ return;
229
+ }
230
+ if (!this.runExists(link))
231
+ return; // nothing was created, nothing to close
232
+ const engine = this.service().open(link.run_id, true);
233
+ if (operation === 'close-room') {
234
+ if (!engine.snapshot().rooms[room]?.native)
235
+ return; // declared but never opened
236
+ await engine.closeRoom(layoutSupervisorId(), room);
237
+ }
238
+ else
239
+ await engine.close(layoutSupervisorId());
240
+ }
241
+ /** Deletion: close every layout resource, then remove the run and its operation record. */
242
+ async closeAndForget(task) {
243
+ const link = task.layout;
244
+ if (!link)
245
+ return;
246
+ if (this.runExists(link)) {
247
+ const engine = this.service().open(link.run_id, true);
248
+ await engine.delete(layoutSupervisorId());
249
+ const state = engine.snapshot();
250
+ const rooms = Object.values(state.rooms).flatMap(room => room.native ? [room.native.room_id] : []);
251
+ assertTaskRegistrationsAbsent(task.task_id);
252
+ await eraseMemberArtifacts('task', task.task_id, ownedLayoutRetirementSeats(state, link.run_id), rooms);
253
+ }
254
+ assertTaskRegistrationsAbsent(task.task_id);
255
+ await this.withTaskLock(link.run_id, async () => {
256
+ for (const path of [layoutRunPath(link.run_id), this.provenancePath(link.run_id), taskBriefPath(task)])
257
+ rmSync(path, { force: true });
258
+ await withFileLock(this.operationPath(link.run_id) + '.lock', () => rmSync(this.operationPath(link.run_id), { force: true }));
259
+ });
260
+ }
261
+ }
@@ -1,3 +1,6 @@
1
+ import type { AddMemberRequest } from '../rooms-tasks/add-member.js';
2
+ import { TaskLayouts } from './task-layouts.js';
3
+ import { type LiveReadinessDeps, type TaskReadinessIssue } from '../rooms-tasks/live-readiness.js';
1
4
  import { type FleetConfig } from '../config.js';
2
5
  import { type CoworkAdapter } from '../rooms-tasks/cowork-adapter.js';
3
6
  import { provisionMembers } from '../rooms-tasks/provision.js';
@@ -57,9 +60,9 @@ export interface TaskProvisioningOutcome {
57
60
  /** Repairable terminal observation derived entirely from durable Task/Room state. */
58
61
  export declare function recordTaskProvisioningOutcome(outcome: TaskProvisioningOutcome): void;
59
62
  export declare class TaskRoomApplicationError extends Error {
60
- readonly code: 'template_not_found' | 'task_template_drift' | 'template_mismatch' | 'task_terminal' | 'task_terminal_already' | 'task_non_resumable' | 'task_deleting' | 'room_not_found' | 'room_record_not_found';
63
+ readonly code: 'template_not_found' | 'task_template_drift' | 'template_mismatch' | 'task_terminal' | 'task_terminal_already' | 'task_non_resumable' | 'task_deleting' | 'room_not_found' | 'room_record_not_found' | 'task_not_ready';
61
64
  readonly fields: Readonly<Record<string, string>>;
62
- constructor(code: 'template_not_found' | 'task_template_drift' | 'template_mismatch' | 'task_terminal' | 'task_terminal_already' | 'task_non_resumable' | 'task_deleting' | 'room_not_found' | 'room_record_not_found', message: string, fields?: Readonly<Record<string, string>>);
65
+ constructor(code: 'template_not_found' | 'task_template_drift' | 'template_mismatch' | 'task_terminal' | 'task_terminal_already' | 'task_non_resumable' | 'task_deleting' | 'room_not_found' | 'room_record_not_found' | 'task_not_ready', message: string, fields?: Readonly<Record<string, string>>);
63
66
  }
64
67
  export interface CreateTaskRequest {
65
68
  actor: TaskRoomActor;
@@ -74,6 +77,8 @@ export interface CreateTaskRequest {
74
77
  list?: string;
75
78
  members?: MemberOverrides;
76
79
  anonymous?: boolean;
80
+ /** Room Layout name: the task's rooms and participants come from a layout run. */
81
+ layout?: string;
77
82
  }
78
83
  export interface CreateRoomRequest {
79
84
  actor: TaskRoomActor;
@@ -87,8 +92,12 @@ export interface CreateRoomRequest {
87
92
  }
88
93
  export declare function resolveRoomLaunchPolicy(template: TemplateSnapshot | undefined, override: boolean | undefined): RoomLaunchPolicy;
89
94
  export interface TaskRoomServiceDeps {
95
+ taskLayouts?: TaskLayouts;
96
+ liveReadiness?: LiveReadinessDeps;
90
97
  loadConfiguration?(path?: string): FleetConfig;
91
- cowork?(config: FleetConfig): CoworkAdapter;
98
+ cowork?(config: FleetConfig, options?: {
99
+ timeoutMs: number;
100
+ }): CoworkAdapter;
92
101
  binPath?(): string;
93
102
  provisionMembers?: typeof provisionMembers;
94
103
  moveTaskToList?: typeof moveTaskToList;
@@ -101,6 +110,67 @@ export declare class TaskRoomApplicationService {
101
110
  private readonly configurationPath?;
102
111
  private readonly deps;
103
112
  constructor(configurationPath?: string | undefined, deps?: TaskRoomServiceDeps);
113
+ addMember(taskId: string, request: AddMemberRequest): Promise<{
114
+ requestId: string;
115
+ taskId: string;
116
+ roleId: string;
117
+ state: "running" | "succeeded" | "attention" | "failed";
118
+ error?: string;
119
+ } | {
120
+ state: string;
121
+ error: string;
122
+ requestId: string;
123
+ taskId: string;
124
+ roleId: string;
125
+ }>;
126
+ memberAddition(taskId: string, requestId: string): Promise<{
127
+ requestId: string;
128
+ taskId: string;
129
+ roleId: string;
130
+ state: "running" | "succeeded" | "attention" | "failed";
131
+ error?: string;
132
+ } | {
133
+ state: string;
134
+ error: string;
135
+ requestId: string;
136
+ taskId: string;
137
+ roleId: string;
138
+ }>;
139
+ private layouts;
140
+ private createLayoutTask;
141
+ /** Layout tasks never provision the legacy single room; their run is a local snapshot. */
142
+ private ensureLayoutWork;
143
+ /** Compact room list for task listings; never fails the listing on an unreadable run. */
144
+ withLayoutRooms<T extends TaskRecord>(task: T): T & {
145
+ layout_rooms?: Array<{
146
+ key: string;
147
+ state: string;
148
+ room_id?: string;
149
+ identity_cid?: string;
150
+ }>;
151
+ };
152
+ /** Backlog only: choose, change or clear the task's Room Layout before it starts. */
153
+ setTaskLayout(input: {
154
+ actor: TaskRoomActor;
155
+ taskId: string;
156
+ layout: string | null;
157
+ expectedLayout: string | null;
158
+ }): Promise<TaskRecord>;
159
+ taskLayout(taskId: string): import("./task-layouts.js").TaskLayoutView;
160
+ launchTaskLayoutOperation(input: {
161
+ actor: TaskRoomActor;
162
+ taskId: string;
163
+ operation: 'open' | 'close-room';
164
+ room: string;
165
+ }): Promise<import("./task-layouts.js").TaskLayoutOperationRecord>;
166
+ /** Worker entry for detached layout operations. */
167
+ runTaskLayoutOperation(input: {
168
+ actor: TaskRoomActor;
169
+ taskId: string;
170
+ operation: 'open' | 'close-room' | 'close';
171
+ room?: string;
172
+ operationId?: string;
173
+ }): Promise<import("./task-layouts.js").TaskLayoutView>;
104
174
  createTask(request: CreateTaskRequest): Promise<TaskRecord>;
105
175
  createRoom(request: CreateRoomRequest): Promise<RoomOrchestrationRecord>;
106
176
  startTask(input: {
@@ -114,12 +184,14 @@ export declare class TaskRoomApplicationService {
114
184
  state?: TaskState | TaskState[];
115
185
  list?: string;
116
186
  includeDeleting?: boolean;
187
+ strict?: boolean;
117
188
  }): TaskRecord[];
118
189
  listTaskLists(): TaskListRecord[];
119
190
  groupedTasks(filter?: {
120
191
  state?: TaskState | TaskState[];
121
192
  list?: string;
122
193
  includeDeleting?: boolean;
194
+ strict?: boolean;
123
195
  }): Array<{
124
196
  list: TaskListRecord;
125
197
  tasks: TaskRecord[];
@@ -147,10 +219,17 @@ export declare class TaskRoomApplicationService {
147
219
  moved: number;
148
220
  destination?: TaskListRecord;
149
221
  }>;
222
+ editTaskDescription(input: {
223
+ actor: TaskRoomActor;
224
+ taskId: string;
225
+ brief: string;
226
+ expectedBrief: string;
227
+ }): TaskRecord;
150
228
  getTask(taskId: string): {
151
229
  task: TaskRecord;
152
230
  orchestration: RoomOrchestrationRecord | undefined;
153
231
  };
232
+ /** Durable provisioning progress only; use active task start/work for a live readiness check. */
154
233
  taskProvisioningOutcome(taskId: string): TaskProvisioningOutcome;
155
234
  awaitTaskProvisioning(input: {
156
235
  actor: TaskRoomActor;
@@ -209,10 +288,20 @@ export declare class TaskRoomApplicationService {
209
288
  taskId: string;
210
289
  outcome?: TaskOutcome;
211
290
  }): Promise<TaskSettlementPlan>;
291
+ /** Terminal layout tasks archive their rooms and retire only agents their run created. */
292
+ private withLayoutCleanup;
293
+ /** Retry terminal layout cleanup for known resources (e.g. after a failed close). */
294
+ retryTaskLayoutCleanup(input: {
295
+ actor: TaskRoomActor;
296
+ taskId: string;
297
+ }): Promise<import("./task-layouts.js").TaskLayoutOperationRecord>;
212
298
  cancelTask(input: {
213
299
  actor: TaskRoomActor;
214
300
  taskId: string;
215
301
  }): Promise<TaskSettlementPlan>;
302
+ /** Continue accepted operations outside the HTTP connection's lifetime. */
303
+ launchTaskSettlement(taskId: string): Promise<TaskRecord>;
304
+ launchTaskProvisioning(taskId: string): Promise<TaskProvisioningOutcome>;
216
305
  settleTask(input: {
217
306
  actor: {
218
307
  kind: 'internal_worker';
@@ -279,6 +368,9 @@ export declare class TaskRoomApplicationService {
279
368
  actor: TaskRoomActor;
280
369
  roomId: string;
281
370
  }): Promise<{
371
+ room: undefined;
372
+ settlementRequired: true;
373
+ } | {
282
374
  room: RoomOrchestrationRecord;
283
375
  settlementRequired: true;
284
376
  }>;
@@ -300,6 +392,12 @@ export declare class TaskRoomApplicationService {
300
392
  taskId: string;
301
393
  outcome?: TaskOutcome;
302
394
  }): Promise<TaskSettlementPlan>;
395
+ /** Point-in-time health, separate from durable provisioning and lifecycle. */
396
+ observeTaskReadiness(taskId: string): Promise<{
397
+ state: 'ready';
398
+ } | TaskReadinessIssue>;
399
+ private observeLiveReadiness;
400
+ private assertTaskLiveReadiness;
303
401
  ensureTaskWork(input: {
304
402
  actor: TaskRoomActor;
305
403
  taskId: string;