@ours.network/fleet 1.2.0-nightly.6 → 1.2.0-nightly.60

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 (389) hide show
  1. package/README.md +287 -65
  2. package/dist/account-origin.d.ts +2 -0
  3. package/dist/account-origin.js +6 -0
  4. package/dist/agent-ours/bridge.js +35 -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 +4 -0
  11. package/dist/agent-ours/mcp-endpoint.js +5 -0
  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 +21 -1
  15. package/dist/agent-ours/service.js +94 -14
  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 +27 -0
  19. package/dist/application/conversation-history.js +212 -0
  20. package/dist/application/fleet-query-service.d.ts +1 -1
  21. package/dist/application/fleet-query-service.js +2 -2
  22. package/dist/application/legacy-supervisor-identity.d.ts +7 -0
  23. package/dist/application/legacy-supervisor-identity.js +43 -0
  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/role-creation-service.js +3 -2
  30. package/dist/application/role-removal-service.js +9 -1
  31. package/dist/application/role-repository.js +19 -2
  32. package/dist/application/room-layout-definitions.d.ts +45 -0
  33. package/dist/application/room-layout-definitions.js +130 -0
  34. package/dist/application/session-control.d.ts +30 -0
  35. package/dist/application/session-control.js +72 -3
  36. package/dist/application/supervisor-ours-tools.d.ts +159 -0
  37. package/dist/application/supervisor-ours-tools.js +115 -0
  38. package/dist/application/task-layouts.d.ts +91 -0
  39. package/dist/application/task-layouts.js +259 -0
  40. package/dist/application/task-room-service.d.ts +99 -3
  41. package/dist/application/task-room-service.js +285 -32
  42. package/dist/application/types.d.ts +2 -0
  43. package/dist/atomic-file.d.ts +5 -0
  44. package/dist/atomic-file.js +62 -1
  45. package/dist/briefing.d.ts +3 -1
  46. package/dist/briefing.js +70 -30
  47. package/dist/build-info.json +7 -4
  48. package/dist/capabilities.d.ts +6 -1
  49. package/dist/capabilities.js +8 -0
  50. package/dist/cli.js +407 -37
  51. package/dist/client-profile.d.ts +5 -17
  52. package/dist/client-profile.js +4 -127
  53. package/dist/config.d.ts +45 -0
  54. package/dist/config.js +57 -6
  55. package/dist/creation.d.ts +1 -1
  56. package/dist/creation.js +4 -4
  57. package/dist/daemon-recovery.d.ts +1 -8
  58. package/dist/daemon-recovery.js +8 -113
  59. package/dist/docs.d.ts +1 -1
  60. package/dist/docs.js +123 -19
  61. package/dist/doctor.d.ts +1 -1
  62. package/dist/doctor.js +55 -60
  63. package/dist/erased-resources.d.ts +9 -0
  64. package/dist/erased-resources.js +87 -0
  65. package/dist/file-delivery/reader.d.ts +15 -0
  66. package/dist/file-delivery/reader.js +63 -0
  67. package/dist/file-delivery/store.d.ts +15 -0
  68. package/dist/file-delivery/store.js +124 -0
  69. package/dist/file-delivery/types.d.ts +19 -0
  70. package/dist/file-delivery/types.js +1 -0
  71. package/dist/fleet-command-audit.d.ts +7 -0
  72. package/dist/fleet-command-audit.js +26 -9
  73. package/dist/harness/agent-session.d.ts +2 -0
  74. package/dist/harness/claude-code-session.js +1 -1
  75. package/dist/harness/claude-code.js +20 -11
  76. package/dist/harness/claude-runtime.d.ts +12 -0
  77. package/dist/harness/claude-runtime.js +43 -0
  78. package/dist/harness/codex-app-server-proxy.d.ts +4 -1
  79. package/dist/harness/codex-app-server-proxy.js +41 -5
  80. package/dist/harness/codex-reasoning.d.ts +5 -0
  81. package/dist/harness/codex-reasoning.js +12 -0
  82. package/dist/harness/codex-runtime.d.ts +11 -1
  83. package/dist/harness/codex-runtime.js +31 -4
  84. package/dist/harness/codex-session.js +2 -2
  85. package/dist/harness/codex.js +23 -12
  86. package/dist/init-wizard.d.ts +2 -0
  87. package/dist/init-wizard.js +38 -19
  88. package/dist/isolation/policy.js +6 -1
  89. package/dist/isolation/types.d.ts +5 -0
  90. package/dist/managed-cli.d.ts +253 -0
  91. package/dist/managed-cli.js +923 -0
  92. package/dist/managed-recovery.d.ts +13 -0
  93. package/dist/managed-recovery.js +31 -0
  94. package/dist/minimal-setup.d.ts +2 -0
  95. package/dist/minimal-setup.js +44 -0
  96. package/dist/monitor.d.ts +8 -34
  97. package/dist/monitor.js +89 -152
  98. package/dist/notifications/fleet-producer.d.ts +19 -0
  99. package/dist/notifications/fleet-producer.js +208 -0
  100. package/dist/notifications/outbox.d.ts +46 -0
  101. package/dist/notifications/outbox.js +158 -0
  102. package/dist/notifications/target-cleanup.d.ts +8 -0
  103. package/dist/notifications/target-cleanup.js +41 -0
  104. package/dist/notifications/task-producer.d.ts +18 -0
  105. package/dist/notifications/task-producer.js +67 -0
  106. package/dist/ops.d.ts +2 -0
  107. package/dist/ops.js +20 -3
  108. package/dist/owner-channel/channel.js +17 -6
  109. package/dist/owner-channel/commands.d.ts +4 -0
  110. package/dist/owner-channel/commands.js +8 -0
  111. package/dist/owner-channel/lifecycle-outbox.js +4 -3
  112. package/dist/owner-channel/ours-client.js +2 -17
  113. package/dist/paths.d.ts +2 -0
  114. package/dist/paths.js +2 -0
  115. package/dist/preset-migration.js +25 -0
  116. package/dist/resolved-plan.js +1 -0
  117. package/dist/rooms-tasks/add-member.d.ts +48 -0
  118. package/dist/rooms-tasks/add-member.js +83 -0
  119. package/dist/rooms-tasks/archived-absence.d.ts +8 -0
  120. package/dist/rooms-tasks/archived-absence.js +48 -0
  121. package/dist/rooms-tasks/cli.js +65 -5
  122. package/dist/rooms-tasks/close.d.ts +6 -2
  123. package/dist/rooms-tasks/close.js +246 -37
  124. package/dist/rooms-tasks/config.d.ts +1 -1
  125. package/dist/rooms-tasks/config.js +11 -4
  126. package/dist/rooms-tasks/cowork-adapter.d.ts +2 -4
  127. package/dist/rooms-tasks/cowork-adapter.js +7 -121
  128. package/dist/rooms-tasks/cowork-http.js +29 -1
  129. package/dist/rooms-tasks/deletion.d.ts +1 -1
  130. package/dist/rooms-tasks/deletion.js +84 -5
  131. package/dist/rooms-tasks/erasure.d.ts +6 -0
  132. package/dist/rooms-tasks/erasure.js +173 -0
  133. package/dist/rooms-tasks/external-worker.d.ts +1 -1
  134. package/dist/rooms-tasks/external-worker.js +3 -4
  135. package/dist/rooms-tasks/layout-binding-client.d.ts +11 -0
  136. package/dist/rooms-tasks/layout-binding-client.js +56 -0
  137. package/dist/rooms-tasks/layout-binding-grants.d.ts +21 -0
  138. package/dist/rooms-tasks/layout-binding-grants.js +128 -0
  139. package/dist/rooms-tasks/layout-cli.d.ts +4 -0
  140. package/dist/rooms-tasks/layout-cli.js +107 -0
  141. package/dist/rooms-tasks/layout-config.d.ts +11 -0
  142. package/dist/rooms-tasks/layout-config.js +89 -0
  143. package/dist/rooms-tasks/layout-control.d.ts +21 -0
  144. package/dist/rooms-tasks/layout-control.js +52 -0
  145. package/dist/rooms-tasks/layout-member-retirement.d.ts +10 -0
  146. package/dist/rooms-tasks/layout-member-retirement.js +90 -0
  147. package/dist/rooms-tasks/layout-service.d.ts +43 -0
  148. package/dist/rooms-tasks/layout-service.js +203 -0
  149. package/dist/rooms-tasks/layout.d.ts +121 -0
  150. package/dist/rooms-tasks/layout.js +285 -0
  151. package/dist/rooms-tasks/legacy-task-member.d.ts +19 -0
  152. package/dist/rooms-tasks/legacy-task-member.js +116 -0
  153. package/dist/rooms-tasks/live-readiness.d.ts +18 -0
  154. package/dist/rooms-tasks/live-readiness.js +85 -0
  155. package/dist/rooms-tasks/member-ownership.d.ts +5 -0
  156. package/dist/rooms-tasks/member-ownership.js +40 -0
  157. package/dist/rooms-tasks/member-startup.d.ts +1 -0
  158. package/dist/rooms-tasks/member-startup.js +2 -0
  159. package/dist/rooms-tasks/provision.d.ts +3 -0
  160. package/dist/rooms-tasks/provision.js +101 -49
  161. package/dist/rooms-tasks/recovery.d.ts +19 -0
  162. package/dist/rooms-tasks/recovery.js +110 -0
  163. package/dist/rooms-tasks/room-state.d.ts +4 -2
  164. package/dist/rooms-tasks/room-state.js +47 -8
  165. package/dist/rooms-tasks/task-service-retirement.d.ts +11 -0
  166. package/dist/rooms-tasks/task-service-retirement.js +21 -0
  167. package/dist/rooms-tasks/task-state.d.ts +51 -8
  168. package/dist/rooms-tasks/task-state.js +245 -25
  169. package/dist/rooms-tasks/types.d.ts +40 -0
  170. package/dist/rooms-tasks/workspace-artifacts.d.ts +6 -0
  171. package/dist/rooms-tasks/workspace-artifacts.js +93 -0
  172. package/dist/rooms-tasks/workspace.d.ts +35 -0
  173. package/dist/rooms-tasks/workspace.js +325 -0
  174. package/dist/runner.d.ts +25 -3
  175. package/dist/runner.js +291 -49
  176. package/dist/session/acp.d.ts +53 -1
  177. package/dist/session/acp.js +216 -40
  178. package/dist/session/arbiter.d.ts +11 -0
  179. package/dist/session/arbiter.js +43 -2
  180. package/dist/session/codex-app-server.d.ts +32 -0
  181. package/dist/session/codex-app-server.js +137 -23
  182. package/dist/session/control.d.ts +12 -1
  183. package/dist/session/control.js +68 -3
  184. package/dist/session/conversation-normalizer.d.ts +2 -1
  185. package/dist/session/conversation-normalizer.js +1 -1
  186. package/dist/session/conversation-store.d.ts +1 -1
  187. package/dist/session/conversation-store.js +7 -11
  188. package/dist/session/conversation-types.d.ts +28 -3
  189. package/dist/session/prompt-batch.d.ts +63 -0
  190. package/dist/session/prompt-batch.js +86 -0
  191. package/dist/session/task-notice.d.ts +14 -0
  192. package/dist/session/task-notice.js +13 -0
  193. package/dist/session/types.d.ts +14 -0
  194. package/dist/setup-tunnel-preflight.d.ts +34 -0
  195. package/dist/setup-tunnel-preflight.js +62 -0
  196. package/dist/socket-path.d.ts +2 -0
  197. package/dist/socket-path.js +22 -0
  198. package/dist/spawn.d.ts +5 -1
  199. package/dist/spawn.js +40 -4
  200. package/dist/startup-prompt.d.ts +4 -0
  201. package/dist/startup-prompt.js +36 -0
  202. package/dist/startup-readiness.d.ts +13 -0
  203. package/dist/startup-readiness.js +38 -0
  204. package/dist/startup-telemetry.d.ts +16 -0
  205. package/dist/startup-telemetry.js +46 -0
  206. package/dist/subscriptions/cli.d.ts +91 -0
  207. package/dist/subscriptions/cli.js +223 -0
  208. package/dist/subscriptions/launch.d.ts +37 -0
  209. package/dist/subscriptions/launch.js +93 -0
  210. package/dist/subscriptions/login.d.ts +75 -0
  211. package/dist/subscriptions/login.js +182 -0
  212. package/dist/subscriptions/observed.d.ts +7 -0
  213. package/dist/subscriptions/observed.js +44 -0
  214. package/dist/subscriptions/probe.d.ts +10 -0
  215. package/dist/subscriptions/probe.js +73 -0
  216. package/dist/subscriptions/service.d.ts +102 -0
  217. package/dist/subscriptions/service.js +364 -0
  218. package/dist/subscriptions/store.d.ts +71 -0
  219. package/dist/subscriptions/store.js +140 -0
  220. package/dist/supervisor/adoption.d.ts +8 -0
  221. package/dist/supervisor/adoption.js +78 -0
  222. package/dist/supervisor/catalog.d.ts +62 -0
  223. package/dist/supervisor/catalog.js +254 -0
  224. package/dist/supervisor/fleet.d.ts +8 -0
  225. package/dist/supervisor/fleet.js +89 -0
  226. package/dist/supervisor/index.js +3 -6
  227. package/dist/supervisor/launchd.d.ts +1 -1
  228. package/dist/supervisor/launchd.js +26 -13
  229. package/dist/supervisor/legacy.d.ts +35 -0
  230. package/dist/supervisor/legacy.js +524 -0
  231. package/dist/supervisor/manager.d.ts +15 -0
  232. package/dist/supervisor/manager.js +270 -0
  233. package/dist/supervisor/scope.d.ts +4 -0
  234. package/dist/supervisor/scope.js +10 -0
  235. package/dist/supervisor/systemd.d.ts +2 -2
  236. package/dist/supervisor/systemd.js +19 -33
  237. package/dist/task-supervision.d.ts +9 -0
  238. package/dist/task-supervision.js +145 -0
  239. package/dist/temp-idle.d.ts +17 -0
  240. package/dist/temp-idle.js +42 -0
  241. package/dist/temp-lifecycle.d.ts +23 -8
  242. package/dist/temp-lifecycle.js +113 -65
  243. package/dist/temp-supervisor-recovery.d.ts +1 -1
  244. package/dist/temp-supervisor-recovery.js +2 -2
  245. package/dist/tunnel-setup-completion.d.ts +7 -0
  246. package/dist/tunnel-setup-completion.js +13 -0
  247. package/dist/tunnel-setup-input.d.ts +19 -0
  248. package/dist/tunnel-setup-input.js +124 -0
  249. package/dist/web/agent-attachments.d.ts +29 -0
  250. package/dist/web/agent-attachments.js +162 -0
  251. package/dist/web/auth.d.ts +63 -2
  252. package/dist/web/auth.js +191 -10
  253. package/dist/web/available-port.d.ts +2 -0
  254. package/dist/web/available-port.js +23 -0
  255. package/dist/web/control.d.ts +3 -3
  256. package/dist/web/control.js +10 -8
  257. package/dist/web/fleet-config-service.d.ts +4 -1
  258. package/dist/web/fleet-config-service.js +46 -15
  259. package/dist/web/prefix-gateway.d.ts +32 -0
  260. package/dist/web/prefix-gateway.js +238 -0
  261. package/dist/web/runtime.d.ts +3 -1
  262. package/dist/web/runtime.js +116 -31
  263. package/dist/web/server.d.ts +16 -0
  264. package/dist/web/server.js +654 -55
  265. package/dist/web/service.d.ts +11 -2
  266. package/dist/web/service.js +30 -4
  267. package/dist/web/workspace-devices.d.ts +107 -0
  268. package/dist/web/workspace-devices.js +277 -0
  269. package/dist/web/workspace-tunnel.d.ts +1 -0
  270. package/dist/web/workspace-tunnel.js +34 -0
  271. package/dist/workspace-enrollment.d.ts +82 -0
  272. package/dist/workspace-enrollment.js +566 -0
  273. package/dist/workspace-replacement.d.ts +66 -0
  274. package/dist/workspace-replacement.js +220 -0
  275. package/docs/acp-files.md +146 -0
  276. package/docs/fleet-migration.md +54 -0
  277. package/docs/live-voice.md +13 -0
  278. package/docs/room-layouts.md +227 -0
  279. package/docs/task-workspaces.md +225 -0
  280. package/docs/validation/managed-cli-permissions.md +421 -0
  281. package/examples/room-layouts/fresh.yaml +27 -0
  282. package/examples/room-layouts/scoped.yaml +21 -0
  283. package/examples/room-layouts/shared.yaml +19 -0
  284. package/package.json +20 -19
  285. package/presets/README.md +78 -0
  286. package/presets/brain-catalog.json +8 -2
  287. package/presets/fleet/agent_templates/Critic.yaml +1 -1
  288. package/presets/fleet/agent_templates/Developer.yaml +1 -1
  289. package/presets/fleet/agent_templates/Engineer.yaml +5 -0
  290. package/presets/fleet/agent_templates/LocalCoordinator.yaml +1 -1
  291. package/presets/fleet/agents/FleetCoordinator.yaml +1 -1
  292. package/presets/fleet/brains/claude-fable-5-1-high.yaml +5 -0
  293. package/presets/fleet/brains/claude-fable-5-1-low.yaml +5 -0
  294. package/presets/fleet/brains/claude-fable-5-1-max.yaml +5 -0
  295. package/presets/fleet/brains/claude-fable-5-1-medium.yaml +5 -0
  296. package/presets/fleet/brains/claude-fable-5-1-xhigh.yaml +5 -0
  297. package/presets/fleet/brains/claude-fable-5-high.yaml +1 -1
  298. package/presets/fleet/brains/claude-fable-5-low.yaml +1 -1
  299. package/presets/fleet/brains/claude-fable-5-max.yaml +1 -1
  300. package/presets/fleet/brains/claude-fable-5-medium.yaml +1 -1
  301. package/presets/fleet/brains/claude-fable-5-xhigh.yaml +1 -1
  302. package/presets/fleet/brains/claude-haiku-4-5-20251001-default.yaml +4 -0
  303. package/presets/fleet/brains/claude-opus-5-5-high.yaml +5 -0
  304. package/presets/fleet/brains/claude-opus-5-5-low.yaml +5 -0
  305. package/presets/fleet/brains/claude-opus-5-5-max.yaml +5 -0
  306. package/presets/fleet/brains/claude-opus-5-5-medium.yaml +5 -0
  307. package/presets/fleet/brains/claude-opus-5-5-xhigh.yaml +5 -0
  308. package/presets/fleet/brains/claude-opus-5-high.yaml +1 -1
  309. package/presets/fleet/brains/claude-opus-5-low.yaml +1 -1
  310. package/presets/fleet/brains/claude-opus-5-max.yaml +1 -1
  311. package/presets/fleet/brains/claude-opus-5-medium.yaml +1 -1
  312. package/presets/fleet/brains/claude-opus-5-xhigh.yaml +1 -1
  313. package/presets/fleet/brains/claude-sonnet-5-high.yaml +1 -1
  314. package/presets/fleet/brains/claude-sonnet-5-low.yaml +1 -1
  315. package/presets/fleet/brains/claude-sonnet-5-max.yaml +1 -1
  316. package/presets/fleet/brains/claude-sonnet-5-medium.yaml +1 -1
  317. package/presets/fleet/brains/claude-sonnet-5-xhigh.yaml +1 -1
  318. package/presets/fleet/brains/codex-gpt-5-3-codex-spark-high.yaml +1 -1
  319. package/presets/fleet/brains/codex-gpt-5-3-codex-spark-low.yaml +1 -1
  320. package/presets/fleet/brains/codex-gpt-5-3-codex-spark-medium.yaml +1 -1
  321. package/presets/fleet/brains/codex-gpt-5-3-codex-spark-xhigh.yaml +1 -1
  322. package/presets/fleet/brains/codex-gpt-5-4-high.yaml +1 -1
  323. package/presets/fleet/brains/codex-gpt-5-4-low.yaml +1 -1
  324. package/presets/fleet/brains/codex-gpt-5-4-medium.yaml +1 -1
  325. package/presets/fleet/brains/codex-gpt-5-4-mini-high.yaml +1 -1
  326. package/presets/fleet/brains/codex-gpt-5-4-mini-low.yaml +1 -1
  327. package/presets/fleet/brains/codex-gpt-5-4-mini-medium.yaml +1 -1
  328. package/presets/fleet/brains/codex-gpt-5-4-mini-xhigh.yaml +1 -1
  329. package/presets/fleet/brains/codex-gpt-5-4-xhigh.yaml +1 -1
  330. package/presets/fleet/brains/codex-gpt-5-5-high.yaml +1 -1
  331. package/presets/fleet/brains/codex-gpt-5-5-low.yaml +1 -1
  332. package/presets/fleet/brains/codex-gpt-5-5-medium.yaml +1 -1
  333. package/presets/fleet/brains/codex-gpt-5-5-xhigh.yaml +1 -1
  334. package/presets/fleet/brains/codex-gpt-5-6-luna-high.yaml +1 -1
  335. package/presets/fleet/brains/codex-gpt-5-6-luna-low.yaml +1 -1
  336. package/presets/fleet/brains/codex-gpt-5-6-luna-max.yaml +1 -1
  337. package/presets/fleet/brains/codex-gpt-5-6-luna-medium.yaml +1 -1
  338. package/presets/fleet/brains/codex-gpt-5-6-luna-xhigh.yaml +1 -1
  339. package/presets/fleet/brains/codex-gpt-5-6-sol-high.yaml +1 -1
  340. package/presets/fleet/brains/codex-gpt-5-6-sol-low.yaml +1 -1
  341. package/presets/fleet/brains/codex-gpt-5-6-sol-max.yaml +1 -1
  342. package/presets/fleet/brains/codex-gpt-5-6-sol-medium.yaml +1 -1
  343. package/presets/fleet/brains/codex-gpt-5-6-sol-ultra.yaml +1 -1
  344. package/presets/fleet/brains/codex-gpt-5-6-sol-xhigh.yaml +1 -1
  345. package/presets/fleet/brains/codex-gpt-5-6-terra-high.yaml +1 -1
  346. package/presets/fleet/brains/codex-gpt-5-6-terra-low.yaml +1 -1
  347. package/presets/fleet/brains/codex-gpt-5-6-terra-max.yaml +1 -1
  348. package/presets/fleet/brains/codex-gpt-5-6-terra-medium.yaml +1 -1
  349. package/presets/fleet/brains/codex-gpt-5-6-terra-ultra.yaml +1 -1
  350. package/presets/fleet/brains/codex-gpt-5-6-terra-xhigh.yaml +1 -1
  351. package/presets/fleet/brains/codex-gpt-6-1-sol-high.yaml +5 -0
  352. package/presets/fleet/brains/codex-gpt-6-1-sol-low.yaml +5 -0
  353. package/presets/fleet/brains/codex-gpt-6-1-sol-max.yaml +5 -0
  354. package/presets/fleet/brains/codex-gpt-6-1-sol-medium.yaml +5 -0
  355. package/presets/fleet/brains/codex-gpt-6-1-sol-ultra.yaml +5 -0
  356. package/presets/fleet/brains/codex-gpt-6-1-sol-xhigh.yaml +5 -0
  357. package/presets/fleet/brains/codex-gpt-6-astra-high.yaml +1 -1
  358. package/presets/fleet/brains/codex-gpt-6-astra-low.yaml +1 -1
  359. package/presets/fleet/brains/codex-gpt-6-astra-max.yaml +1 -1
  360. package/presets/fleet/brains/codex-gpt-6-astra-medium.yaml +1 -1
  361. package/presets/fleet/brains/codex-gpt-6-astra-ultra.yaml +1 -1
  362. package/presets/fleet/brains/codex-gpt-6-astra-xhigh.yaml +1 -1
  363. package/presets/fleet/brains/codex-gpt-6-luna-high.yaml +5 -0
  364. package/presets/fleet/brains/codex-gpt-6-luna-low.yaml +5 -0
  365. package/presets/fleet/brains/codex-gpt-6-luna-max.yaml +5 -0
  366. package/presets/fleet/brains/codex-gpt-6-luna-medium.yaml +5 -0
  367. package/presets/fleet/brains/codex-gpt-6-luna-xhigh.yaml +5 -0
  368. package/presets/fleet/brains/codex-gpt-6-sol-high.yaml +5 -0
  369. package/presets/fleet/brains/codex-gpt-6-sol-low.yaml +5 -0
  370. package/presets/fleet/brains/codex-gpt-6-sol-max.yaml +5 -0
  371. package/presets/fleet/brains/codex-gpt-6-sol-medium.yaml +5 -0
  372. package/presets/fleet/brains/codex-gpt-6-sol-ultra.yaml +5 -0
  373. package/presets/fleet/brains/codex-gpt-6-sol-xhigh.yaml +5 -0
  374. package/presets/fleet/roles/Coordinator.yaml +34 -11
  375. package/presets/fleet/roles/Engineer.yaml +40 -0
  376. package/presets/fleet/room_layouts/engineering.yaml +25 -0
  377. package/presets/fleet/room_layouts/pair.yaml +24 -0
  378. package/presets/fleet/room_layouts/single.yaml +17 -0
  379. package/presets/fleet/room_layouts/team.yaml +30 -0
  380. package/presets/fleet/room_templates/engineering.yaml +19 -0
  381. package/presets/manifest.json +2 -2
  382. package/dist/web-app/assets/index-59GF-gsZ.css +0 -1
  383. package/dist/web-app/assets/index-C0h3ALvs.js +0 -10
  384. package/dist/web-app/icons/ours-fleet-maskable.svg +0 -4
  385. package/dist/web-app/icons/ours-fleet.svg +0 -4
  386. package/dist/web-app/index.html +0 -17
  387. package/dist/web-app/manifest.webmanifest +0 -15
  388. package/dist/web-app/offline.html +0 -18
  389. package/dist/web-app/sw.js +0 -51
@@ -0,0 +1,325 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { chmodSync, closeSync, constants, fchmodSync, fstatSync, lstatSync, mkdirSync, openSync, readdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
3
+ import { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
4
+ import { stateRoot } from '../paths.js';
5
+ const MARKER = '.fleet-workspace.json';
6
+ export class WorkspaceError extends Error {
7
+ }
8
+ function fail(message) { throw new WorkspaceError(`workspace: ${message}`); }
9
+ function stat(path) {
10
+ try {
11
+ return lstatSync(path);
12
+ }
13
+ catch (e) {
14
+ if (e.code === 'ENOENT')
15
+ return undefined;
16
+ throw e;
17
+ }
18
+ }
19
+ export function assertSafeAncestors(path) {
20
+ const absolute = resolve(path);
21
+ let part = absolute;
22
+ for (;;) {
23
+ const s = stat(part);
24
+ if (s && (s.isSymbolicLink() || !s.isDirectory()))
25
+ fail(`unsafe directory ${part}`);
26
+ const parent = dirname(part);
27
+ if (parent === part)
28
+ break;
29
+ part = parent;
30
+ }
31
+ }
32
+ function root(owner) {
33
+ return resolve(stateRoot(), 'workspaces', owner === 'task' ? 'tasks' : 'rooms');
34
+ }
35
+ export function planWorkspace(owner, id) {
36
+ if (!/^[a-zA-Z0-9_-]{1,80}$/.test(id))
37
+ fail('invalid owner ID');
38
+ return { version: 1, owner, id, path: join(root(owner), id), token: randomUUID() };
39
+ }
40
+ export function validateWorkspace(w, owner = w.owner, id = w.id) {
41
+ if (w.version !== 1 || !['task', 'room'].includes(w.owner) || w.owner !== owner || w.id !== id
42
+ || !/^[a-zA-Z0-9_-]{1,80}$/.test(w.id)
43
+ || !/^[a-f0-9-]{36}$/.test(w.token) || !isAbsolute(w.path)
44
+ || w.path !== join(root(w.owner), w.id))
45
+ fail('invalid recorded ownership/path');
46
+ assertSafeAncestors(dirname(w.path));
47
+ }
48
+ function marked(path, w) {
49
+ assertSafeAncestors(path);
50
+ const marker = join(path, MARKER);
51
+ if (!stat(marker)?.isFile() || stat(marker)?.isSymbolicLink())
52
+ fail('missing/unsafe ownership marker');
53
+ const actual = JSON.parse(readFileSync(marker, 'utf8'));
54
+ if (JSON.stringify(actual) !== JSON.stringify(w))
55
+ fail('ownership marker mismatch');
56
+ }
57
+ /** Read-only recovery proof; never allocate a replacement for a missing workspace. */
58
+ export function assertWorkspacePresent(w, owner, id) {
59
+ validateWorkspace(w, owner, id);
60
+ marked(w.path, w);
61
+ }
62
+ function staging(w, phase) {
63
+ return join(dirname(w.path), `.${w.id}.${w.token}.${phase}`);
64
+ }
65
+ /** Recover only owner access on a pinned, real entry. Never chmod a symlink
66
+ * target or a hardlinked file through an alias outside the deletion tree.
67
+ * Linux O_PATH can pin an entry even when a same-owner fixture removed every
68
+ * permission; /proc/self/fd then addresses that inode rather than its old name.
69
+ */
70
+ function withOwnerPermissions(path, before, bits, work, rollback = false) {
71
+ if (before.isSymbolicLink() || (!before.isDirectory() && !before.isFile()))
72
+ fail(`unsafe permission repair ${path}`);
73
+ const changed = (before.mode & bits) !== bits;
74
+ const uid = process.geteuid?.();
75
+ if (changed && (uid === undefined || before.uid !== uid))
76
+ fail(`cannot restore owner access to ${path}: owned by uid ${before.uid}`);
77
+ if (changed && before.isFile() && before.nlink !== 1)
78
+ fail(`cannot restore owner access to hardlinked Git metadata ${path}`);
79
+ let descriptor, pathDescriptor = false;
80
+ try {
81
+ descriptor = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
82
+ }
83
+ catch (error) {
84
+ if (process.platform !== 'linux' || error.code !== 'EACCES')
85
+ throw error;
86
+ // O_PATH is Linux-specific and is not exposed in Node's fs.constants.
87
+ descriptor = openSync(path, 0x200000 | constants.O_NOFOLLOW);
88
+ pathDescriptor = true;
89
+ }
90
+ const setMode = (mode) => pathDescriptor
91
+ ? chmodSync(`/proc/self/fd/${descriptor}`, mode)
92
+ : fchmodSync(descriptor, mode);
93
+ try {
94
+ const pinned = fstatSync(descriptor);
95
+ if (pinned.dev !== before.dev || pinned.ino !== before.ino || pinned.uid !== before.uid
96
+ || pinned.mode !== before.mode || pinned.nlink !== before.nlink)
97
+ fail(`entry changed before permission repair ${path}`);
98
+ if (changed)
99
+ setMode((before.mode & 0o7777) | bits);
100
+ try {
101
+ const assertNamedEntry = () => {
102
+ const named = lstatSync(path);
103
+ if (named.dev !== before.dev || named.ino !== before.ino || named.uid !== before.uid
104
+ || named.isSymbolicLink() || named.isDirectory() !== before.isDirectory())
105
+ fail(`entry changed during permission repair ${path}`);
106
+ };
107
+ assertNamedEntry();
108
+ const result = work(process.platform === 'linux' ? `/proc/self/fd/${descriptor}` : path);
109
+ assertNamedEntry();
110
+ return result;
111
+ }
112
+ catch (error) {
113
+ if (rollback && changed)
114
+ setMode(before.mode & 0o7777);
115
+ throw error;
116
+ }
117
+ }
118
+ finally {
119
+ closeSync(descriptor);
120
+ }
121
+ }
122
+ /** Caller must first prove the exact workspace marker or retired archive
123
+ * provenance, and hold its lifecycle lock with all managed writers retired.
124
+ * Directories need owner rwx for recursive removal; ordinary files do not.
125
+ */
126
+ export function prepareOwnedDeletionTree(path) {
127
+ assertSafeAncestors(path);
128
+ const uid = process.geteuid?.();
129
+ if (uid === undefined || lstatSync(path).uid !== uid)
130
+ fail(`deletion root is not owned by the current uid: ${path}`);
131
+ const device = lstatSync(dirname(path)).dev;
132
+ const visit = (dir) => {
133
+ const entry = lstatSync(dir);
134
+ if (!entry.isDirectory() || entry.isSymbolicLink())
135
+ fail(`unsafe deletion directory ${dir}`);
136
+ if (entry.dev !== device)
137
+ fail(`foreign mounted directory ${dir}`);
138
+ withOwnerPermissions(dir, entry, 0o700, accessDir => {
139
+ for (const child of readdirSync(accessDir, { withFileTypes: true })) {
140
+ if (process.platform !== 'linux') {
141
+ const named = lstatSync(dir);
142
+ if (named.dev !== entry.dev || named.ino !== entry.ino || named.isSymbolicLink())
143
+ fail(`deletion directory changed during traversal ${dir}`);
144
+ }
145
+ if (child.isDirectory() && !child.isSymbolicLink())
146
+ visit(join(accessDir, child.name));
147
+ }
148
+ });
149
+ };
150
+ visit(path);
151
+ }
152
+ function markedForDeletion(w) {
153
+ assertSafeAncestors(w.path);
154
+ const before = lstatSync(w.path);
155
+ if (process.geteuid?.() !== before.uid)
156
+ fail(`workspace root is not owned by the current uid: ${w.path}`);
157
+ if (before.dev !== lstatSync(dirname(w.path)).dev)
158
+ fail(`foreign mounted directory ${w.path}`);
159
+ // The durable exact path plus current-UID real root permit temporary owner
160
+ // access to read the marker, but never substitute for the marker itself.
161
+ withOwnerPermissions(w.path, before, 0o700, () => marked(w.path, w), true);
162
+ }
163
+ /** Atomic directory publication; retry uses the durable token, never adopts another folder. */
164
+ export function ensureWorkspace(w) {
165
+ validateWorkspace(w);
166
+ if (stat(staging(w, 'deleting')))
167
+ fail('deletion already started');
168
+ if (stat(w.path)) {
169
+ marked(w.path, w);
170
+ return w.path;
171
+ }
172
+ mkdirSync(dirname(w.path), { recursive: true, mode: 0o700 });
173
+ assertSafeAncestors(dirname(w.path));
174
+ const stage = staging(w, 'provisioning');
175
+ if (!stat(stage))
176
+ mkdirSync(stage, { mode: 0o700 });
177
+ assertSafeAncestors(stage);
178
+ if (readdirSync(stage).length === 0)
179
+ writeFileSync(join(stage, MARKER), JSON.stringify(w), { flag: 'wx', mode: 0o600 });
180
+ marked(stage, w);
181
+ try {
182
+ renameSync(stage, w.path);
183
+ }
184
+ catch (error) {
185
+ // Another allocator may have published this exact durable intent.
186
+ if (!stat(w.path))
187
+ throw error;
188
+ marked(w.path, w);
189
+ }
190
+ return w.path;
191
+ }
192
+ function inside(base, path) {
193
+ const rel = relative(base, path);
194
+ return rel !== '' && rel !== '..' && !rel.startsWith(`..${sep}`) && !isAbsolute(rel);
195
+ }
196
+ function ownedPointer(base, from, value) {
197
+ if (!value.trim() || /[\r\n]/.test(value.trim()))
198
+ fail('malformed git pointer');
199
+ const target = resolve(from, value.trim());
200
+ if (!inside(base, target))
201
+ fail(`foreign git metadata ${target}`);
202
+ assertSafeAncestors(dirname(target));
203
+ if (stat(target)?.isSymbolicLink())
204
+ fail(`symlink git metadata ${target}`);
205
+ return target;
206
+ }
207
+ /** Audit both directions of Git worktree registration, without executing repository config/hooks.
208
+ * All registrations and common dirs must be inside this workspace. Removing the complete
209
+ * workspace then removes their registries atomically with the owned repositories; never prune.
210
+ */
211
+ export function auditWorkspaceGit(path, options = {}) {
212
+ const rootEntry = lstatSync(path);
213
+ if (options.forDeletion)
214
+ prepareOwnedDeletionTree(path);
215
+ const device = lstatSync(path).dev;
216
+ if (options.forDeletion && (lstatSync(path).ino !== rootEntry.ino || device !== rootEntry.dev || lstatSync(path).isSymbolicLink()))
217
+ fail(`workspace changed before Git audit ${path}`);
218
+ const readPointer = (file) => {
219
+ if (!options.forDeletion)
220
+ return readFileSync(file, 'utf8');
221
+ const before = lstatSync(file);
222
+ if (before.dev !== device)
223
+ fail(`foreign mounted Git metadata ${file}`);
224
+ return withOwnerPermissions(file, before, 0o400, accessFile => readFileSync(accessFile, 'utf8'));
225
+ };
226
+ const visit = (dir, accessDir = dir, admin = false) => {
227
+ const before = lstatSync(accessDir);
228
+ const inspect = (pinnedDir) => {
229
+ admin ||= Boolean(stat(join(pinnedDir, 'HEAD')) && (stat(join(pinnedDir, 'objects')) || stat(join(pinnedDir, 'commondir'))));
230
+ for (const entry of readdirSync(pinnedDir, { withFileTypes: true })) {
231
+ if (options.forDeletion && process.platform !== 'linux') {
232
+ const named = lstatSync(accessDir);
233
+ if (named.dev !== before.dev || named.ino !== before.ino || named.isSymbolicLink())
234
+ fail(`directory changed during Git audit ${dir}`);
235
+ }
236
+ const p = join(pinnedDir, entry.name);
237
+ if (entry.isSymbolicLink()) {
238
+ if (admin || entry.name === '.git' || entry.name === 'commondir' || entry.name === 'gitdir')
239
+ fail(`symlink git metadata ${p}`);
240
+ continue; // rm unlinks ordinary artifact symlinks, never follows them.
241
+ }
242
+ if (entry.isDirectory()) {
243
+ if (lstatSync(p).dev !== device)
244
+ fail(`foreign mounted directory ${p}`);
245
+ visit(join(dir, entry.name), p, admin || entry.name === '.git');
246
+ continue;
247
+ }
248
+ if (!entry.isFile())
249
+ continue; // sockets/FIFOs in retired runtime state are unlinked, never opened
250
+ if (entry.name === '.git') {
251
+ const value = readPointer(p).trim();
252
+ if (!value.startsWith('gitdir: '))
253
+ fail(`invalid git file ${p}`);
254
+ const gitdir = ownedPointer(path, dir, value.slice(8));
255
+ if (!stat(gitdir)?.isDirectory())
256
+ fail(`missing git directory ${gitdir}`);
257
+ }
258
+ // Git admin files, including bare repositories and submodules.
259
+ if (entry.name === 'commondir' && (admin || stat(join(pinnedDir, 'HEAD')))) {
260
+ const common = ownedPointer(path, dir, readPointer(p));
261
+ if (!stat(common)?.isDirectory())
262
+ fail(`invalid git common directory ${common}`);
263
+ }
264
+ if (entry.name === 'gitdir' && (admin || stat(join(pinnedDir, 'commondir')))) {
265
+ const target = ownedPointer(path, dir, readPointer(p));
266
+ if (stat(target) && !stat(target)?.isFile())
267
+ fail(`invalid worktree backlink ${target}`);
268
+ }
269
+ }
270
+ };
271
+ if (options.forDeletion)
272
+ withOwnerPermissions(accessDir, before, 0o700, inspect);
273
+ else
274
+ inspect(accessDir);
275
+ };
276
+ visit(path);
277
+ }
278
+ /** Called only after all managed writers retire, under the owner's lifecycle lock.
279
+ * The tombstone is derived from the durable unguessable token. A crash during rm
280
+ * resumes that exact tombstone even if rm already removed its marker.
281
+ */
282
+ export function assertWorkspaceDeletable(w, owner, id) {
283
+ validateWorkspace(w, owner, id);
284
+ if (stat(w.path)) {
285
+ if (stat(staging(w, 'deleting')))
286
+ fail('both live and deleting workspace exist');
287
+ markedForDeletion(w);
288
+ auditWorkspaceGit(w.path, { forDeletion: true });
289
+ }
290
+ const pending = staging(w, 'provisioning');
291
+ if (stat(pending)) {
292
+ assertSafeAncestors(pending);
293
+ if (readdirSync(pending).length)
294
+ marked(pending, w);
295
+ if (readdirSync(pending).some(name => name !== MARKER))
296
+ fail('unexpected provisioning artifacts');
297
+ }
298
+ if (stat(staging(w, 'deleting')))
299
+ assertSafeAncestors(staging(w, 'deleting'));
300
+ }
301
+ export function deleteWorkspace(w, owner, id) {
302
+ assertWorkspaceDeletable(w, owner, id);
303
+ const tomb = staging(w, 'deleting');
304
+ const pending = staging(w, 'provisioning');
305
+ if (stat(w.path)) {
306
+ if (stat(tomb))
307
+ fail('both live and deleting workspace exist');
308
+ markedForDeletion(w);
309
+ auditWorkspaceGit(w.path, { forDeletion: true });
310
+ renameSync(w.path, tomb);
311
+ }
312
+ if (stat(pending)) {
313
+ if (readdirSync(pending).length)
314
+ marked(pending, w);
315
+ if (readdirSync(pending).some(name => name !== MARKER))
316
+ fail('unexpected provisioning artifacts');
317
+ rmSync(pending, { recursive: true });
318
+ }
319
+ if (stat(tomb)) {
320
+ // This exact token-derived tombstone has already passed the marker and
321
+ // Git audit; partial removal may have consumed those proofs on disk.
322
+ prepareOwnedDeletionTree(tomb);
323
+ rmSync(tomb, { recursive: true });
324
+ }
325
+ }
package/dist/runner.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { prepareManagedAgent, releaseManagedAgent } from './agent-ours/service.js';
2
2
  import { type ResolvedRole } from './config.js';
3
- import { type MonitorHandle, type MonitorOpts, type FetchLike } from './monitor.js';
3
+ import { probeIdentityPresence, type MonitorHandle, type MonitorOpts, type FetchLike } from './monitor.js';
4
4
  import { type DaemonGenerationProbe } from './daemon-recovery.js';
5
5
  import { type Exec } from './exec.js';
6
6
  import { RoleControlServer } from './session/control.js';
@@ -20,6 +20,7 @@ export interface RunnerDeps {
20
20
  log(line: string): void;
21
21
  /** HTTP transport for the monitor's daemon long-poll (injectable for tests). */
22
22
  fetch: FetchLike;
23
+ identityProbeDeps?: Parameters<typeof probeIdentityPresence>[3];
23
24
  probeGeneration(env: NodeJS.ProcessEnv): Promise<DaemonGenerationProbe>;
24
25
  /** Construct the supervisor mail monitor (injectable so tests stub it out). */
25
26
  createMonitor(opts: MonitorOpts): MonitorHandle;
@@ -29,7 +30,7 @@ export interface RunnerDeps {
29
30
  /** Neutral construction seam for deterministic runner lifecycle tests. */
30
31
  startAgentSession(adapter: AgentSessionAdapter, options: AgentSessionStartOptions): Promise<AgentSession>;
31
32
  /** Construct the authenticated role control route (injectable where sockets are unavailable). */
32
- createControlServer(stateDir: string, session: AgentSession, log: (line: string) => void): Pick<RoleControlServer, 'start' | 'close' | 'setFleetSpawner' | 'setFleetAuditor' | 'setOwnerChannel' | 'setConfigReloader' | 'setLoopManager'>;
33
+ createControlServer(stateDir: string, session: AgentSession, log: (line: string) => void): Pick<RoleControlServer, 'start' | 'close' | 'setFleetSpawner' | 'setFleetAuditor' | 'setOwnerChannel' | 'setConfigReloader' | 'setLoopManager'> & Partial<Pick<RoleControlServer, 'setLayoutControl' | 'setCorrespondence'>>;
33
34
  /** Construct scheduled-loop execution (injectable for fail-closed startup tests). */
34
35
  createLoopManager(...args: ConstructorParameters<typeof ScheduledLoopManager>): ScheduledLoopManagerHandle;
35
36
  /** Acquire the cross-process owner-channel binder lease before replacing the control socket. */
@@ -38,12 +39,19 @@ export interface RunnerDeps {
38
39
  reportOwnerStartupFailure(stateDir: string): Promise<'delivered' | 'duplicate'>;
39
40
  /** Lets a test (or a shutdown path) end the supervised restart loop. */
40
41
  shouldStop?(): boolean;
42
+ /** Parent shutdown suspends a managed transient member; explicit stop still retires. */
43
+ suspendOnStop?: boolean;
41
44
  }
42
45
  export declare const SUPERVISOR_RECYCLE_REQUIRED = "OWNER_CHANNEL_SUPERVISOR_RECYCLE_REQUIRED";
43
46
  export declare class SupervisorRecycleRequiredError extends Error {
44
47
  readonly code = "OWNER_CHANNEL_SUPERVISOR_RECYCLE_REQUIRED";
45
48
  constructor();
46
49
  }
50
+ export declare function localFleetAuditor(stateDir: string, caller: string, log: (line: string) => void, session: AgentSession): {
51
+ begin(requestId: string, argv: string[]): Promise<import("./fleet-command-audit.js").FleetAuditAttempt>;
52
+ finish(input: Parameters<NonNullable<OwnerChannelHandle["finishFleetCommandAudit"]>>[0]): Promise<import("./fleet-command-audit.js").FleetAuditAttempt>;
53
+ present(): Promise<void>;
54
+ };
47
55
  /** Environment injected only into the managed harness process. */
48
56
  export declare function managedFleetProxyEnv(role: ResolvedRole, stateDir: string): Record<string, string>;
49
57
  /**
@@ -149,6 +157,16 @@ export declare const START_STAGGER_FILE = ".start-stagger-ms";
149
157
  export declare function reserveLaunchSlot(root: string, staggerMs: number, deps: Pick<RunnerDeps, 'now' | 'sleep' | 'log'>): Promise<number>;
150
158
  /** Read a temp role's config snapshot written by spawnTemp. */
151
159
  export declare function loadTempRole(name: string): ResolvedRole;
160
+ /**
161
+ * Fall back to the config path applyRole() recorded at the last up/restart/spawn
162
+ * for this role. systemd's shared unit template (`ours-fleet-agent@.service`)
163
+ * execs `_run <name>` with no -c on every restart, so a role brought up from a
164
+ * non-default config (`ours-fleet up -c custom.yaml`) would otherwise silently
165
+ * resolve against the default ~/fleet.yaml on its very first restart and fail
166
+ * with "no such role". An empty/missing marker means "use the default", same as
167
+ * no -c was ever given.
168
+ */
169
+ export declare function resolveConfigPath(dir: string, explicit?: string): string | undefined;
152
170
  /** What one child session did, so the supervising loop can decide what follows. */
153
171
  export interface AttemptResult {
154
172
  elapsedSecs: number;
@@ -158,7 +176,7 @@ export interface AttemptResult {
158
176
  mode: 'fresh' | 'resume';
159
177
  modelRecovery?: 'advance' | 'hold';
160
178
  /** Present only when a temporary-role lifecycle signal ended the session. */
161
- retirementReason?: 'identity-closed' | 'operator-stop' | 'supervisor-signal';
179
+ retirementReason?: 'identity-closed' | 'operator-stop' | 'supervisor-signal' | 'idle-timeout';
162
180
  }
163
181
  /** Continuous authoritative absence required after an identity was observed. */
164
182
  export declare const TEMP_IDENTITY_CLOSE_DEBOUNCE_MS = 5000;
@@ -185,9 +203,13 @@ export declare function runOnce(name: string, opts?: {
185
203
  */
186
204
  export declare function runSupervised(name: string, opts?: {
187
205
  configPath?: string;
206
+ temp?: boolean;
188
207
  }, partialDeps?: Partial<RunnerDeps>, attempt?: (n: string, o: {
189
208
  configPath?: string;
190
209
  allowResumeRotation?: boolean;
210
+ temp?: boolean;
191
211
  }, d: Partial<RunnerDeps>) => Promise<AttemptResult>): Promise<RestartLedger>;
192
212
  /** Temp-agent entrypoint: run once, journal why it ended, then archive its evidence. */
213
+ /** The parent uses the same adapter-relative sustained-uptime reset boundary. */
214
+ export declare function stableSupervisorWindow(name: string, temp: boolean, configPath?: string): number;
193
215
  export declare function runTemp(name: string, deps?: Partial<RunnerDeps>, attempt?: typeof runOnce): Promise<void>;