@openrig/cli 0.7.0 → 0.7.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 (1007) hide show
  1. package/README.md +9 -8
  2. package/daemon/assets/claude-statusline-context.cjs +13 -3
  3. package/daemon/assets/guidance/openrig-seat-skills.md +1 -0
  4. package/daemon/assets/plugins/openrig-core/.claude-plugin/plugin.json +1 -1
  5. package/daemon/assets/plugins/openrig-core/.codex-plugin/plugin.json +1 -1
  6. package/daemon/assets/plugins/openrig-core/hooks/claude.json +11 -11
  7. package/daemon/assets/plugins/openrig-core/hooks/scripts/activity-relay.cjs +9 -8
  8. package/daemon/assets/plugins/openrig-core/hooks/scripts/refocus-health.cjs +2 -2
  9. package/daemon/assets/plugins/openrig-core/hooks/scripts/refocus.cjs +9 -6
  10. package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/scripts/precompact-hook.mjs +1 -1
  11. package/daemon/assets/plugins/openrig-core/skills/forming-an-openrig-mental-model/SKILL.md +13 -8
  12. package/daemon/assets/plugins/openrig-core/skills/messaging-the-human/SKILL.md +19 -4
  13. package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +167 -46
  14. package/daemon/assets/skills/rigs/SKILL.md +2 -1
  15. package/daemon/context-packs/help/manifest.yaml +1 -1
  16. package/daemon/context-packs/onboarding-width/manifest.yaml +1 -1
  17. package/daemon/context-packs/onboarding-width/public-what-you-can-do.md +206 -28
  18. package/daemon/context-packs/reference/getting-started.md +65 -6
  19. package/daemon/context-packs/reference/manifest.yaml +1 -1
  20. package/daemon/context-packs/reference/rig-spec.md +82 -2
  21. package/daemon/context-packs/reference/whats-new.md +162 -113
  22. package/daemon/context-packs/skills/agent-operated-software/manifest.yaml +1 -1
  23. package/daemon/context-packs/skills/agent-operated-workflows/manifest.yaml +1 -1
  24. package/daemon/context-packs/skills/applying-a-permission-policy/manifest.yaml +1 -1
  25. package/daemon/context-packs/skills/claude-compaction-restore/manifest.yaml +1 -1
  26. package/daemon/context-packs/skills/claude-compaction-restore/scripts/precompact-hook.mjs +1 -1
  27. package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +1 -1
  28. package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +1 -1
  29. package/daemon/context-packs/skills/core/cross-host-rig-commands/manifest.yaml +1 -1
  30. package/daemon/context-packs/skills/core/human-in-the-loop/manifest.yaml +1 -1
  31. package/daemon/context-packs/skills/core/messaging-the-human/SKILL.md +19 -4
  32. package/daemon/context-packs/skills/core/messaging-the-human/manifest.yaml +1 -1
  33. package/daemon/context-packs/skills/core/openrig-architect/manifest.yaml +1 -1
  34. package/daemon/context-packs/skills/core/openrig-cmux/manifest.yaml +1 -1
  35. package/daemon/context-packs/skills/core/openrig-herdr/SKILL.md +3 -0
  36. package/daemon/context-packs/skills/core/openrig-herdr/manifest.yaml +1 -1
  37. package/daemon/context-packs/skills/core/openrig-skills/manifest.yaml +1 -1
  38. package/daemon/context-packs/skills/core/openrig-software-factory/manifest.yaml +1 -1
  39. package/daemon/context-packs/skills/core/openrig-software-factory/references/worked-example.md +2 -2
  40. package/daemon/context-packs/skills/core/openrig-upgrade/manifest.yaml +1 -1
  41. package/daemon/context-packs/skills/core/rig-bundles-and-shareable-artifacts/manifest.yaml +1 -1
  42. package/daemon/context-packs/skills/core/rig-lifecycle/manifest.yaml +1 -1
  43. package/daemon/context-packs/skills/core/session-source-fork/manifest.yaml +1 -1
  44. package/daemon/context-packs/skills/core/specification-system/manifest.yaml +1 -1
  45. package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/manifest.yaml +1 -1
  46. package/daemon/context-packs/skills/core/watchdog/manifest.yaml +1 -1
  47. package/daemon/context-packs/skills/delegating-work/manifest.yaml +1 -1
  48. package/daemon/context-packs/skills/forming-an-openrig-mental-model/SKILL.md +13 -8
  49. package/daemon/context-packs/skills/forming-an-openrig-mental-model/manifest.yaml +1 -1
  50. package/daemon/context-packs/skills/loading-addressable-markdown/manifest.yaml +1 -1
  51. package/daemon/context-packs/skills/mission-slice-sop/manifest.yaml +1 -1
  52. package/daemon/context-packs/skills/openrig-operating-model/manifest.yaml +1 -1
  53. package/daemon/context-packs/skills/openrig-user/SKILL.md +167 -46
  54. package/daemon/context-packs/skills/openrig-user/manifest.yaml +1 -1
  55. package/daemon/context-packs/skills/orienting-to-an-inherited-seat/manifest.yaml +1 -1
  56. package/daemon/context-packs/skills/pm/backlog-capture/manifest.yaml +1 -1
  57. package/daemon/context-packs/skills/pm/context-builder/manifest.yaml +1 -1
  58. package/daemon/context-packs/skills/pm/exec-summary/manifest.yaml +1 -1
  59. package/daemon/context-packs/skills/pm/office-hours/manifest.yaml +1 -1
  60. package/daemon/context-packs/skills/pm/plan-review/manifest.yaml +1 -1
  61. package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +1 -1
  62. package/daemon/context-packs/skills/pm/ui-mockup/manifest.yaml +1 -1
  63. package/daemon/context-packs/skills/pods/development-team/manifest.yaml +1 -1
  64. package/daemon/context-packs/skills/pods/orchestration-team/manifest.yaml +1 -1
  65. package/daemon/context-packs/skills/pods/oversight-team/manifest.yaml +1 -1
  66. package/daemon/context-packs/skills/pods/review-team/manifest.yaml +1 -1
  67. package/daemon/context-packs/skills/process/agent-browser/manifest.yaml +1 -1
  68. package/daemon/context-packs/skills/process/context-engineering/manifest.yaml +1 -1
  69. package/daemon/context-packs/skills/process/dogfood/manifest.yaml +1 -1
  70. package/daemon/context-packs/skills/process/frontend-design/manifest.yaml +1 -1
  71. package/daemon/context-packs/skills/process/systematic-debugging/manifest.yaml +1 -1
  72. package/daemon/context-packs/skills/process/test-driven-development/manifest.yaml +1 -1
  73. package/daemon/context-packs/skills/process/verification-before-completion/manifest.yaml +1 -1
  74. package/daemon/context-packs/skills/queue-handoff/manifest.yaml +1 -1
  75. package/daemon/context-packs/skills/refocusing/manifest.yaml +1 -1
  76. package/daemon/context-packs/skills/retiring-and-inheriting-a-seat/manifest.yaml +1 -1
  77. package/daemon/context-packs/skills/seat-continuity-and-handover/manifest.yaml +1 -1
  78. package/daemon/context-packs/skills/session-compaction-and-restore/manifest.yaml +1 -1
  79. package/daemon/context-packs/skills/software-for-agents/manifest.yaml +1 -1
  80. package/daemon/context-packs/world-example/manifest.yaml +1 -1
  81. package/daemon/context-packs/world-public/manifest.yaml +1 -1
  82. package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
  83. package/daemon/dist/adapters/claude-code-adapter.js +94 -26
  84. package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
  85. package/daemon/dist/adapters/claude-resume.d.ts +2 -1
  86. package/daemon/dist/adapters/claude-resume.d.ts.map +1 -1
  87. package/daemon/dist/adapters/claude-resume.js +10 -3
  88. package/daemon/dist/adapters/claude-resume.js.map +1 -1
  89. package/daemon/dist/adapters/codex-runtime-adapter.d.ts +10 -4
  90. package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  91. package/daemon/dist/adapters/codex-runtime-adapter.js +231 -41
  92. package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  93. package/daemon/dist/adapters/community-harness-runtime-adapter.d.ts +21 -2
  94. package/daemon/dist/adapters/community-harness-runtime-adapter.d.ts.map +1 -1
  95. package/daemon/dist/adapters/community-harness-runtime-adapter.js +90 -8
  96. package/daemon/dist/adapters/community-harness-runtime-adapter.js.map +1 -1
  97. package/daemon/dist/adapters/pi-runner.d.ts +11 -0
  98. package/daemon/dist/adapters/pi-runner.d.ts.map +1 -1
  99. package/daemon/dist/adapters/pi-runner.js +59 -16
  100. package/daemon/dist/adapters/pi-runner.js.map +1 -1
  101. package/daemon/dist/adapters/pi-runtime-adapter.d.ts.map +1 -1
  102. package/daemon/dist/adapters/pi-runtime-adapter.js +9 -6
  103. package/daemon/dist/adapters/pi-runtime-adapter.js.map +1 -1
  104. package/daemon/dist/adapters/stub-runtime-adapter.d.ts.map +1 -1
  105. package/daemon/dist/adapters/stub-runtime-adapter.js +9 -5
  106. package/daemon/dist/adapters/stub-runtime-adapter.js.map +1 -1
  107. package/daemon/dist/adapters/tmux.d.ts +15 -4
  108. package/daemon/dist/adapters/tmux.d.ts.map +1 -1
  109. package/daemon/dist/adapters/tmux.js +68 -26
  110. package/daemon/dist/adapters/tmux.js.map +1 -1
  111. package/daemon/dist/attention-surface.d.ts +14 -0
  112. package/daemon/dist/attention-surface.d.ts.map +1 -1
  113. package/daemon/dist/attention-surface.js.map +1 -1
  114. package/daemon/dist/build-info.js +3 -3
  115. package/daemon/dist/daemon-db-path.d.ts +6 -0
  116. package/daemon/dist/daemon-db-path.d.ts.map +1 -1
  117. package/daemon/dist/daemon-db-path.js +65 -1
  118. package/daemon/dist/daemon-db-path.js.map +1 -1
  119. package/daemon/dist/daemon-shutdown.d.ts.map +1 -1
  120. package/daemon/dist/daemon-shutdown.js +4 -2
  121. package/daemon/dist/daemon-shutdown.js.map +1 -1
  122. package/daemon/dist/db/all-migrations.d.ts.map +1 -1
  123. package/daemon/dist/db/all-migrations.js +16 -0
  124. package/daemon/dist/db/all-migrations.js.map +1 -1
  125. package/daemon/dist/db/migrations/124_context_usage_watchdog_units.d.ts +4 -0
  126. package/daemon/dist/db/migrations/124_context_usage_watchdog_units.d.ts.map +1 -0
  127. package/daemon/dist/db/migrations/124_context_usage_watchdog_units.js +9 -0
  128. package/daemon/dist/db/migrations/124_context_usage_watchdog_units.js.map +1 -0
  129. package/daemon/dist/db/migrations/125_node_advisor.d.ts +3 -0
  130. package/daemon/dist/db/migrations/125_node_advisor.d.ts.map +1 -0
  131. package/daemon/dist/db/migrations/125_node_advisor.js +8 -0
  132. package/daemon/dist/db/migrations/125_node_advisor.js.map +1 -0
  133. package/daemon/dist/db/migrations/127_operation_correlation.d.ts +3 -0
  134. package/daemon/dist/db/migrations/127_operation_correlation.d.ts.map +1 -0
  135. package/daemon/dist/db/migrations/127_operation_correlation.js +10 -0
  136. package/daemon/dist/db/migrations/127_operation_correlation.js.map +1 -0
  137. package/daemon/dist/db/migrations/128_terminal_policy.d.ts +3 -0
  138. package/daemon/dist/db/migrations/128_terminal_policy.d.ts.map +1 -0
  139. package/daemon/dist/db/migrations/128_terminal_policy.js +37 -0
  140. package/daemon/dist/db/migrations/128_terminal_policy.js.map +1 -0
  141. package/daemon/dist/db/migrations/129_stream_dispositions.d.ts +10 -0
  142. package/daemon/dist/db/migrations/129_stream_dispositions.d.ts.map +1 -0
  143. package/daemon/dist/db/migrations/129_stream_dispositions.js +35 -0
  144. package/daemon/dist/db/migrations/129_stream_dispositions.js.map +1 -0
  145. package/daemon/dist/db/migrations/130_stream_subscriptions.d.ts +11 -0
  146. package/daemon/dist/db/migrations/130_stream_subscriptions.d.ts.map +1 -0
  147. package/daemon/dist/db/migrations/130_stream_subscriptions.js +33 -0
  148. package/daemon/dist/db/migrations/130_stream_subscriptions.js.map +1 -0
  149. package/daemon/dist/db/migrations/131_stream_retention_floor.d.ts +8 -0
  150. package/daemon/dist/db/migrations/131_stream_retention_floor.d.ts.map +1 -0
  151. package/daemon/dist/db/migrations/131_stream_retention_floor.js +20 -0
  152. package/daemon/dist/db/migrations/131_stream_retention_floor.js.map +1 -0
  153. package/daemon/dist/db/migrations/135_seat_identity_process_evidence.d.ts +3 -0
  154. package/daemon/dist/db/migrations/135_seat_identity_process_evidence.d.ts.map +1 -0
  155. package/daemon/dist/db/migrations/135_seat_identity_process_evidence.js +16 -0
  156. package/daemon/dist/db/migrations/135_seat_identity_process_evidence.js.map +1 -0
  157. package/daemon/dist/domain/active-occupant.d.ts +3 -0
  158. package/daemon/dist/domain/active-occupant.d.ts.map +1 -1
  159. package/daemon/dist/domain/active-occupant.js +6 -2
  160. package/daemon/dist/domain/active-occupant.js.map +1 -1
  161. package/daemon/dist/domain/activity-taxonomy.d.ts +3 -0
  162. package/daemon/dist/domain/activity-taxonomy.d.ts.map +1 -1
  163. package/daemon/dist/domain/activity-taxonomy.js.map +1 -1
  164. package/daemon/dist/domain/agent-activity-store.d.ts +6 -2
  165. package/daemon/dist/domain/agent-activity-store.d.ts.map +1 -1
  166. package/daemon/dist/domain/agent-activity-store.js +13 -4
  167. package/daemon/dist/domain/agent-activity-store.js.map +1 -1
  168. package/daemon/dist/domain/agent-manifest.d.ts.map +1 -1
  169. package/daemon/dist/domain/agent-manifest.js +14 -2
  170. package/daemon/dist/domain/agent-manifest.js.map +1 -1
  171. package/daemon/dist/domain/bootstrap-orchestrator.d.ts +3 -0
  172. package/daemon/dist/domain/bootstrap-orchestrator.d.ts.map +1 -1
  173. package/daemon/dist/domain/bootstrap-orchestrator.js +20 -6
  174. package/daemon/dist/domain/bootstrap-orchestrator.js.map +1 -1
  175. package/daemon/dist/domain/builtin-startup-files.d.ts.map +1 -1
  176. package/daemon/dist/domain/builtin-startup-files.js +2 -0
  177. package/daemon/dist/domain/builtin-startup-files.js.map +1 -1
  178. package/daemon/dist/domain/bundle-behaviour.d.ts.map +1 -1
  179. package/daemon/dist/domain/bundle-behaviour.js +28 -1
  180. package/daemon/dist/domain/bundle-behaviour.js.map +1 -1
  181. package/daemon/dist/domain/claim-service.d.ts +19 -1
  182. package/daemon/dist/domain/claim-service.d.ts.map +1 -1
  183. package/daemon/dist/domain/claim-service.js +67 -19
  184. package/daemon/dist/domain/claim-service.js.map +1 -1
  185. package/daemon/dist/domain/classification-attempts.d.ts +4 -1
  186. package/daemon/dist/domain/classification-attempts.d.ts.map +1 -1
  187. package/daemon/dist/domain/classification-attempts.js +10 -1
  188. package/daemon/dist/domain/classification-attempts.js.map +1 -1
  189. package/daemon/dist/domain/classification-sources.d.ts +38 -0
  190. package/daemon/dist/domain/classification-sources.d.ts.map +1 -1
  191. package/daemon/dist/domain/classification-sources.js +24 -1
  192. package/daemon/dist/domain/classification-sources.js.map +1 -1
  193. package/daemon/dist/domain/claude-activity-hooks.d.ts +2 -2
  194. package/daemon/dist/domain/claude-activity-hooks.d.ts.map +1 -1
  195. package/daemon/dist/domain/claude-activity-hooks.js +8 -7
  196. package/daemon/dist/domain/claude-activity-hooks.js.map +1 -1
  197. package/daemon/dist/domain/claude-compaction-enforcer.d.ts +109 -7
  198. package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
  199. package/daemon/dist/domain/claude-compaction-enforcer.js +447 -52
  200. package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
  201. package/daemon/dist/domain/claude-core-plugin-env.d.ts +4 -1
  202. package/daemon/dist/domain/claude-core-plugin-env.d.ts.map +1 -1
  203. package/daemon/dist/domain/claude-core-plugin-env.js +23 -12
  204. package/daemon/dist/domain/claude-core-plugin-env.js.map +1 -1
  205. package/daemon/dist/domain/claude-managed-launch.d.ts +1 -1
  206. package/daemon/dist/domain/claude-managed-launch.d.ts.map +1 -1
  207. package/daemon/dist/domain/claude-managed-launch.js +33 -15
  208. package/daemon/dist/domain/claude-managed-launch.js.map +1 -1
  209. package/daemon/dist/domain/codex-owned-plugin-trust.d.ts +26 -0
  210. package/daemon/dist/domain/codex-owned-plugin-trust.d.ts.map +1 -0
  211. package/daemon/dist/domain/codex-owned-plugin-trust.js +187 -0
  212. package/daemon/dist/domain/codex-owned-plugin-trust.js.map +1 -0
  213. package/daemon/dist/domain/codex-rebuild-permissions.d.ts +54 -0
  214. package/daemon/dist/domain/codex-rebuild-permissions.d.ts.map +1 -0
  215. package/daemon/dist/domain/codex-rebuild-permissions.js +134 -0
  216. package/daemon/dist/domain/codex-rebuild-permissions.js.map +1 -0
  217. package/daemon/dist/domain/community-harness-launch-result.d.ts +33 -0
  218. package/daemon/dist/domain/community-harness-launch-result.d.ts.map +1 -0
  219. package/daemon/dist/domain/community-harness-launch-result.js +93 -0
  220. package/daemon/dist/domain/community-harness-launch-result.js.map +1 -0
  221. package/daemon/dist/domain/community-harness-presets.d.ts +27 -2
  222. package/daemon/dist/domain/community-harness-presets.d.ts.map +1 -1
  223. package/daemon/dist/domain/community-harness-presets.js +49 -5
  224. package/daemon/dist/domain/community-harness-presets.js.map +1 -1
  225. package/daemon/dist/domain/composer-prompts.d.ts +5 -2
  226. package/daemon/dist/domain/composer-prompts.d.ts.map +1 -1
  227. package/daemon/dist/domain/composer-prompts.js +2 -2
  228. package/daemon/dist/domain/composer-prompts.js.map +1 -1
  229. package/daemon/dist/domain/context-monitor.d.ts.map +1 -1
  230. package/daemon/dist/domain/context-monitor.js +2 -1
  231. package/daemon/dist/domain/context-monitor.js.map +1 -1
  232. package/daemon/dist/domain/continuity-policy-materializer.d.ts +1 -0
  233. package/daemon/dist/domain/continuity-policy-materializer.d.ts.map +1 -1
  234. package/daemon/dist/domain/continuity-policy-materializer.js +2 -0
  235. package/daemon/dist/domain/continuity-policy-materializer.js.map +1 -1
  236. package/daemon/dist/domain/draft-aware-delivery.d.ts.map +1 -1
  237. package/daemon/dist/domain/draft-aware-delivery.js +1 -1
  238. package/daemon/dist/domain/draft-aware-delivery.js.map +1 -1
  239. package/daemon/dist/domain/execution-view.d.ts.map +1 -1
  240. package/daemon/dist/domain/execution-view.js +7 -6
  241. package/daemon/dist/domain/execution-view.js.map +1 -1
  242. package/daemon/dist/domain/footprint-choice.d.ts +41 -0
  243. package/daemon/dist/domain/footprint-choice.d.ts.map +1 -0
  244. package/daemon/dist/domain/footprint-choice.js +42 -0
  245. package/daemon/dist/domain/footprint-choice.js.map +1 -0
  246. package/daemon/dist/domain/gateway/delivery-rules-engine.d.ts +3 -0
  247. package/daemon/dist/domain/gateway/delivery-rules-engine.d.ts.map +1 -1
  248. package/daemon/dist/domain/gateway/delivery-rules-engine.js +1 -1
  249. package/daemon/dist/domain/gateway/delivery-rules-engine.js.map +1 -1
  250. package/daemon/dist/domain/gateway/human-registry.d.ts +32 -0
  251. package/daemon/dist/domain/gateway/human-registry.d.ts.map +1 -1
  252. package/daemon/dist/domain/gateway/human-registry.js +71 -4
  253. package/daemon/dist/domain/gateway/human-registry.js.map +1 -1
  254. package/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -1
  255. package/daemon/dist/domain/gateway/slack/inbound.js +52 -4
  256. package/daemon/dist/domain/gateway/slack/inbound.js.map +1 -1
  257. package/daemon/dist/domain/gateway/slack/message.d.ts +3 -0
  258. package/daemon/dist/domain/gateway/slack/message.d.ts.map +1 -1
  259. package/daemon/dist/domain/gateway/slack/message.js +9 -2
  260. package/daemon/dist/domain/gateway/slack/message.js.map +1 -1
  261. package/daemon/dist/domain/gateway/slack/queue-access.d.ts +7 -0
  262. package/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -1
  263. package/daemon/dist/domain/gateway/slack/queue-access.js +14 -2
  264. package/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -1
  265. package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +1 -3
  266. package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -1
  267. package/daemon/dist/domain/gateway/slack/slack-delivery.js +22 -22
  268. package/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -1
  269. package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
  270. package/daemon/dist/domain/gateway/slack/slack-subsystem.js +4 -7
  271. package/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -1
  272. package/daemon/dist/domain/generated-file-hygiene.js +1 -1
  273. package/daemon/dist/domain/generated-file-hygiene.js.map +1 -1
  274. package/daemon/dist/domain/graph-projection.d.ts +3 -0
  275. package/daemon/dist/domain/graph-projection.d.ts.map +1 -1
  276. package/daemon/dist/domain/graph-projection.js +2 -0
  277. package/daemon/dist/domain/graph-projection.js.map +1 -1
  278. package/daemon/dist/domain/health-diagnosis.d.ts.map +1 -1
  279. package/daemon/dist/domain/health-diagnosis.js +14 -6
  280. package/daemon/dist/domain/health-diagnosis.js.map +1 -1
  281. package/daemon/dist/domain/hot-potato-enforcer.d.ts +1 -1
  282. package/daemon/dist/domain/human-questions.d.ts +2 -0
  283. package/daemon/dist/domain/human-questions.d.ts.map +1 -1
  284. package/daemon/dist/domain/human-questions.js +5 -0
  285. package/daemon/dist/domain/human-questions.js.map +1 -1
  286. package/daemon/dist/domain/kernel-boot.d.ts +5 -1
  287. package/daemon/dist/domain/kernel-boot.d.ts.map +1 -1
  288. package/daemon/dist/domain/kernel-boot.js +34 -4
  289. package/daemon/dist/domain/kernel-boot.js.map +1 -1
  290. package/daemon/dist/domain/managed-blocks.d.ts +32 -1
  291. package/daemon/dist/domain/managed-blocks.d.ts.map +1 -1
  292. package/daemon/dist/domain/managed-blocks.js +109 -11
  293. package/daemon/dist/domain/managed-blocks.js.map +1 -1
  294. package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts +1 -1
  295. package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts.map +1 -1
  296. package/daemon/dist/domain/mission-control/mission-control-action-log.js +3 -0
  297. package/daemon/dist/domain/mission-control/mission-control-action-log.js.map +1 -1
  298. package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts +21 -0
  299. package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts.map +1 -1
  300. package/daemon/dist/domain/mission-control/mission-control-write-contract.js +110 -0
  301. package/daemon/dist/domain/mission-control/mission-control-write-contract.js.map +1 -1
  302. package/daemon/dist/domain/model-divergence/current-model-reader.d.ts +2 -0
  303. package/daemon/dist/domain/model-divergence/current-model-reader.d.ts.map +1 -1
  304. package/daemon/dist/domain/model-divergence/current-model-reader.js +7 -0
  305. package/daemon/dist/domain/model-divergence/current-model-reader.js.map +1 -1
  306. package/daemon/dist/domain/model-divergence/model-divergence-monitor.d.ts +10 -1
  307. package/daemon/dist/domain/model-divergence/model-divergence-monitor.d.ts.map +1 -1
  308. package/daemon/dist/domain/model-divergence/model-divergence-monitor.js +24 -5
  309. package/daemon/dist/domain/model-divergence/model-divergence-monitor.js.map +1 -1
  310. package/daemon/dist/domain/native-process-lineage.d.ts +3 -0
  311. package/daemon/dist/domain/native-process-lineage.d.ts.map +1 -1
  312. package/daemon/dist/domain/native-process-lineage.js +60 -2
  313. package/daemon/dist/domain/native-process-lineage.js.map +1 -1
  314. package/daemon/dist/domain/native-resume-probe-evidence.d.ts +19 -0
  315. package/daemon/dist/domain/native-resume-probe-evidence.d.ts.map +1 -0
  316. package/daemon/dist/domain/native-resume-probe-evidence.js +37 -0
  317. package/daemon/dist/domain/native-resume-probe-evidence.js.map +1 -0
  318. package/daemon/dist/domain/native-resume-probe.d.ts +7 -0
  319. package/daemon/dist/domain/native-resume-probe.d.ts.map +1 -1
  320. package/daemon/dist/domain/native-resume-probe.js +12 -9
  321. package/daemon/dist/domain/native-resume-probe.js.map +1 -1
  322. package/daemon/dist/domain/node-inventory.d.ts +49 -1
  323. package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  324. package/daemon/dist/domain/node-inventory.js +119 -45
  325. package/daemon/dist/domain/node-inventory.js.map +1 -1
  326. package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
  327. package/daemon/dist/domain/node-launcher.js +9 -3
  328. package/daemon/dist/domain/node-launcher.js.map +1 -1
  329. package/daemon/dist/domain/occupant-invalidator.d.ts +16 -4
  330. package/daemon/dist/domain/occupant-invalidator.d.ts.map +1 -1
  331. package/daemon/dist/domain/occupant-invalidator.js +25 -5
  332. package/daemon/dist/domain/occupant-invalidator.js.map +1 -1
  333. package/daemon/dist/domain/operation-correlation.d.ts +78 -0
  334. package/daemon/dist/domain/operation-correlation.d.ts.map +1 -0
  335. package/daemon/dist/domain/operation-correlation.js +54 -0
  336. package/daemon/dist/domain/operation-correlation.js.map +1 -0
  337. package/daemon/dist/domain/permission-account.d.ts +28 -0
  338. package/daemon/dist/domain/permission-account.d.ts.map +1 -0
  339. package/daemon/dist/domain/permission-account.js +102 -0
  340. package/daemon/dist/domain/permission-account.js.map +1 -0
  341. package/daemon/dist/domain/permission-drift.d.ts.map +1 -1
  342. package/daemon/dist/domain/permission-drift.js +11 -7
  343. package/daemon/dist/domain/permission-drift.js.map +1 -1
  344. package/daemon/dist/domain/pod-bundle-assembler.d.ts +1 -0
  345. package/daemon/dist/domain/pod-bundle-assembler.d.ts.map +1 -1
  346. package/daemon/dist/domain/pod-bundle-assembler.js +25 -0
  347. package/daemon/dist/domain/pod-bundle-assembler.js.map +1 -1
  348. package/daemon/dist/domain/policies/artifact-pool-helpers.d.ts +7 -0
  349. package/daemon/dist/domain/policies/artifact-pool-helpers.d.ts.map +1 -1
  350. package/daemon/dist/domain/policies/artifact-pool-helpers.js +8 -4
  351. package/daemon/dist/domain/policies/artifact-pool-helpers.js.map +1 -1
  352. package/daemon/dist/domain/policies/context-usage-threshold.d.ts.map +1 -1
  353. package/daemon/dist/domain/policies/context-usage-threshold.js +109 -21
  354. package/daemon/dist/domain/policies/context-usage-threshold.js.map +1 -1
  355. package/daemon/dist/domain/policies/edge-artifact-required.d.ts +6 -1
  356. package/daemon/dist/domain/policies/edge-artifact-required.d.ts.map +1 -1
  357. package/daemon/dist/domain/policies/edge-artifact-required.js +18 -13
  358. package/daemon/dist/domain/policies/edge-artifact-required.js.map +1 -1
  359. package/daemon/dist/domain/policies/mode-scheduled-end.d.ts +2 -0
  360. package/daemon/dist/domain/policies/mode-scheduled-end.d.ts.map +1 -1
  361. package/daemon/dist/domain/policies/mode-scheduled-end.js +5 -1
  362. package/daemon/dist/domain/policies/mode-scheduled-end.js.map +1 -1
  363. package/daemon/dist/domain/policies/periodic-reminder.d.ts +10 -0
  364. package/daemon/dist/domain/policies/periodic-reminder.d.ts.map +1 -1
  365. package/daemon/dist/domain/policies/periodic-reminder.js +11 -6
  366. package/daemon/dist/domain/policies/periodic-reminder.js.map +1 -1
  367. package/daemon/dist/domain/policies/types.d.ts +25 -0
  368. package/daemon/dist/domain/policies/types.d.ts.map +1 -1
  369. package/daemon/dist/domain/policies/workflow-keepalive.d.ts +6 -1
  370. package/daemon/dist/domain/policies/workflow-keepalive.d.ts.map +1 -1
  371. package/daemon/dist/domain/policies/workflow-keepalive.js +11 -5
  372. package/daemon/dist/domain/policies/workflow-keepalive.js.map +1 -1
  373. package/daemon/dist/domain/profile-resolution-worker.d.ts +7 -0
  374. package/daemon/dist/domain/profile-resolution-worker.d.ts.map +1 -0
  375. package/daemon/dist/domain/profile-resolution-worker.js +83 -0
  376. package/daemon/dist/domain/profile-resolution-worker.js.map +1 -0
  377. package/daemon/dist/domain/profile-resolver.d.ts +6 -0
  378. package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
  379. package/daemon/dist/domain/profile-resolver.js +14 -2
  380. package/daemon/dist/domain/profile-resolver.js.map +1 -1
  381. package/daemon/dist/domain/project-classifier.d.ts +7 -0
  382. package/daemon/dist/domain/project-classifier.d.ts.map +1 -1
  383. package/daemon/dist/domain/project-classifier.js +26 -0
  384. package/daemon/dist/domain/project-classifier.js.map +1 -1
  385. package/daemon/dist/domain/provider/subscription-move-report.d.ts +86 -0
  386. package/daemon/dist/domain/provider/subscription-move-report.d.ts.map +1 -0
  387. package/daemon/dist/domain/provider/subscription-move-report.js +227 -0
  388. package/daemon/dist/domain/provider/subscription-move-report.js.map +1 -0
  389. package/daemon/dist/domain/ps-projection.d.ts +6 -35
  390. package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
  391. package/daemon/dist/domain/ps-projection.js +14 -55
  392. package/daemon/dist/domain/ps-projection.js.map +1 -1
  393. package/daemon/dist/domain/queue-owner.d.ts +6 -3
  394. package/daemon/dist/domain/queue-owner.d.ts.map +1 -1
  395. package/daemon/dist/domain/queue-owner.js +10 -5
  396. package/daemon/dist/domain/queue-owner.js.map +1 -1
  397. package/daemon/dist/domain/queue-pickup.d.ts +5 -2
  398. package/daemon/dist/domain/queue-pickup.d.ts.map +1 -1
  399. package/daemon/dist/domain/queue-pickup.js +19 -2
  400. package/daemon/dist/domain/queue-pickup.js.map +1 -1
  401. package/daemon/dist/domain/queue-repository.d.ts +54 -21
  402. package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  403. package/daemon/dist/domain/queue-repository.js +257 -97
  404. package/daemon/dist/domain/queue-repository.js.map +1 -1
  405. package/daemon/dist/domain/queue-retention.d.ts +18 -0
  406. package/daemon/dist/domain/queue-retention.d.ts.map +1 -1
  407. package/daemon/dist/domain/queue-retention.js +74 -0
  408. package/daemon/dist/domain/queue-retention.js.map +1 -1
  409. package/daemon/dist/domain/queue-stuck-sweep.d.ts +2 -0
  410. package/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -1
  411. package/daemon/dist/domain/queue-stuck-sweep.js +37 -3
  412. package/daemon/dist/domain/queue-stuck-sweep.js.map +1 -1
  413. package/daemon/dist/domain/queue-wait-backoff.d.ts +3 -0
  414. package/daemon/dist/domain/queue-wait-backoff.d.ts.map +1 -1
  415. package/daemon/dist/domain/queue-wait-backoff.js +9 -0
  416. package/daemon/dist/domain/queue-wait-backoff.js.map +1 -1
  417. package/daemon/dist/domain/queue-waiting.d.ts +2 -0
  418. package/daemon/dist/domain/queue-waiting.d.ts.map +1 -1
  419. package/daemon/dist/domain/queue-waiting.js.map +1 -1
  420. package/daemon/dist/domain/queue-wake-ladder.d.ts.map +1 -1
  421. package/daemon/dist/domain/queue-wake-ladder.js +18 -6
  422. package/daemon/dist/domain/queue-wake-ladder.js.map +1 -1
  423. package/daemon/dist/domain/reconciler.d.ts +23 -0
  424. package/daemon/dist/domain/reconciler.d.ts.map +1 -1
  425. package/daemon/dist/domain/reconciler.js +44 -1
  426. package/daemon/dist/domain/reconciler.js.map +1 -1
  427. package/daemon/dist/domain/rehydrate-eligibility.d.ts.map +1 -1
  428. package/daemon/dist/domain/rehydrate-eligibility.js +2 -3
  429. package/daemon/dist/domain/rehydrate-eligibility.js.map +1 -1
  430. package/daemon/dist/domain/restore-guidance.d.ts +7 -0
  431. package/daemon/dist/domain/restore-guidance.d.ts.map +1 -1
  432. package/daemon/dist/domain/restore-guidance.js +20 -8
  433. package/daemon/dist/domain/restore-guidance.js.map +1 -1
  434. package/daemon/dist/domain/restore-orchestrator.d.ts +13 -1
  435. package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
  436. package/daemon/dist/domain/restore-orchestrator.js +151 -26
  437. package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
  438. package/daemon/dist/domain/restore-plan-preview.d.ts +7 -2
  439. package/daemon/dist/domain/restore-plan-preview.d.ts.map +1 -1
  440. package/daemon/dist/domain/restore-plan-preview.js +28 -7
  441. package/daemon/dist/domain/restore-plan-preview.js.map +1 -1
  442. package/daemon/dist/domain/restore-policy.d.ts +4 -0
  443. package/daemon/dist/domain/restore-policy.d.ts.map +1 -1
  444. package/daemon/dist/domain/restore-policy.js +11 -0
  445. package/daemon/dist/domain/restore-policy.js.map +1 -1
  446. package/daemon/dist/domain/rig-edge-ops.d.ts +58 -0
  447. package/daemon/dist/domain/rig-edge-ops.d.ts.map +1 -0
  448. package/daemon/dist/domain/rig-edge-ops.js +113 -0
  449. package/daemon/dist/domain/rig-edge-ops.js.map +1 -0
  450. package/daemon/dist/domain/rig-name-override.d.ts +14 -0
  451. package/daemon/dist/domain/rig-name-override.d.ts.map +1 -0
  452. package/daemon/dist/domain/rig-name-override.js +38 -0
  453. package/daemon/dist/domain/rig-name-override.js.map +1 -0
  454. package/daemon/dist/domain/rig-repository.d.ts +10 -2
  455. package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
  456. package/daemon/dist/domain/rig-repository.js +14 -0
  457. package/daemon/dist/domain/rig-repository.js.map +1 -1
  458. package/daemon/dist/domain/rig-status-compose.d.ts +1 -1
  459. package/daemon/dist/domain/rig-status-compose.d.ts.map +1 -1
  460. package/daemon/dist/domain/rig-status-compose.js +3 -1
  461. package/daemon/dist/domain/rig-status-compose.js.map +1 -1
  462. package/daemon/dist/domain/rig-teardown.d.ts +19 -0
  463. package/daemon/dist/domain/rig-teardown.d.ts.map +1 -1
  464. package/daemon/dist/domain/rig-teardown.js +78 -8
  465. package/daemon/dist/domain/rig-teardown.js.map +1 -1
  466. package/daemon/dist/domain/rigspec-codec.d.ts.map +1 -1
  467. package/daemon/dist/domain/rigspec-codec.js +10 -0
  468. package/daemon/dist/domain/rigspec-codec.js.map +1 -1
  469. package/daemon/dist/domain/rigspec-exporter.d.ts +3 -0
  470. package/daemon/dist/domain/rigspec-exporter.d.ts.map +1 -1
  471. package/daemon/dist/domain/rigspec-exporter.js +22 -0
  472. package/daemon/dist/domain/rigspec-exporter.js.map +1 -1
  473. package/daemon/dist/domain/rigspec-instantiator.d.ts +30 -2
  474. package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  475. package/daemon/dist/domain/rigspec-instantiator.js +262 -47
  476. package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  477. package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
  478. package/daemon/dist/domain/rigspec-preflight.js +15 -2
  479. package/daemon/dist/domain/rigspec-preflight.js.map +1 -1
  480. package/daemon/dist/domain/rigspec-schema.d.ts +3 -0
  481. package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
  482. package/daemon/dist/domain/rigspec-schema.js +67 -3
  483. package/daemon/dist/domain/rigspec-schema.js.map +1 -1
  484. package/daemon/dist/domain/runtime-adapter.d.ts +20 -1
  485. package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -1
  486. package/daemon/dist/domain/runtime-adapter.js +5 -1
  487. package/daemon/dist/domain/runtime-adapter.js.map +1 -1
  488. package/daemon/dist/domain/scope/scope-view-projection.d.ts +6 -0
  489. package/daemon/dist/domain/scope/scope-view-projection.d.ts.map +1 -1
  490. package/daemon/dist/domain/scope/scope-view-projection.js +26 -10
  491. package/daemon/dist/domain/scope/scope-view-projection.js.map +1 -1
  492. package/daemon/dist/domain/seat-activity-service.d.ts +4 -2
  493. package/daemon/dist/domain/seat-activity-service.d.ts.map +1 -1
  494. package/daemon/dist/domain/seat-activity-service.js +13 -5
  495. package/daemon/dist/domain/seat-activity-service.js.map +1 -1
  496. package/daemon/dist/domain/seat-attention-reconciler.d.ts +19 -0
  497. package/daemon/dist/domain/seat-attention-reconciler.d.ts.map +1 -1
  498. package/daemon/dist/domain/seat-attention-reconciler.js +60 -6
  499. package/daemon/dist/domain/seat-attention-reconciler.js.map +1 -1
  500. package/daemon/dist/domain/seat-delivery-guard.d.ts +20 -1
  501. package/daemon/dist/domain/seat-delivery-guard.d.ts.map +1 -1
  502. package/daemon/dist/domain/seat-delivery-guard.js +66 -11
  503. package/daemon/dist/domain/seat-delivery-guard.js.map +1 -1
  504. package/daemon/dist/domain/seat-handover-service.d.ts +8 -0
  505. package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
  506. package/daemon/dist/domain/seat-handover-service.js +74 -4
  507. package/daemon/dist/domain/seat-handover-service.js.map +1 -1
  508. package/daemon/dist/domain/seat-identity-store.d.ts +11 -1
  509. package/daemon/dist/domain/seat-identity-store.d.ts.map +1 -1
  510. package/daemon/dist/domain/seat-identity-store.js +29 -4
  511. package/daemon/dist/domain/seat-identity-store.js.map +1 -1
  512. package/daemon/dist/domain/seat-launch-additions.d.ts +115 -0
  513. package/daemon/dist/domain/seat-launch-additions.d.ts.map +1 -0
  514. package/daemon/dist/domain/seat-launch-additions.js +439 -0
  515. package/daemon/dist/domain/seat-launch-additions.js.map +1 -0
  516. package/daemon/dist/domain/seat-launch-environment.d.ts +1 -1
  517. package/daemon/dist/domain/seat-launch-environment.d.ts.map +1 -1
  518. package/daemon/dist/domain/seat-launch-environment.js +1 -1
  519. package/daemon/dist/domain/seat-launch-environment.js.map +1 -1
  520. package/daemon/dist/domain/seat-lifecycle-service.d.ts +79 -4
  521. package/daemon/dist/domain/seat-lifecycle-service.d.ts.map +1 -1
  522. package/daemon/dist/domain/seat-lifecycle-service.js +202 -12
  523. package/daemon/dist/domain/seat-lifecycle-service.js.map +1 -1
  524. package/daemon/dist/domain/seat-skill-apply.d.ts +139 -0
  525. package/daemon/dist/domain/seat-skill-apply.d.ts.map +1 -0
  526. package/daemon/dist/domain/seat-skill-apply.js +221 -0
  527. package/daemon/dist/domain/seat-skill-apply.js.map +1 -0
  528. package/daemon/dist/domain/seat-skill-storage.d.ts +295 -0
  529. package/daemon/dist/domain/seat-skill-storage.d.ts.map +1 -0
  530. package/daemon/dist/domain/seat-skill-storage.js +850 -0
  531. package/daemon/dist/domain/seat-skill-storage.js.map +1 -0
  532. package/daemon/dist/domain/seat-status-service.d.ts +9 -0
  533. package/daemon/dist/domain/seat-status-service.d.ts.map +1 -1
  534. package/daemon/dist/domain/seat-status-service.js +15 -3
  535. package/daemon/dist/domain/seat-status-service.js.map +1 -1
  536. package/daemon/dist/domain/session-registry.d.ts +4 -0
  537. package/daemon/dist/domain/session-registry.d.ts.map +1 -1
  538. package/daemon/dist/domain/session-registry.js +13 -0
  539. package/daemon/dist/domain/session-registry.js.map +1 -1
  540. package/daemon/dist/domain/session-transport.d.ts +52 -21
  541. package/daemon/dist/domain/session-transport.d.ts.map +1 -1
  542. package/daemon/dist/domain/session-transport.js +150 -47
  543. package/daemon/dist/domain/session-transport.js.map +1 -1
  544. package/daemon/dist/domain/skill-catalog.d.ts +16 -0
  545. package/daemon/dist/domain/skill-catalog.d.ts.map +1 -1
  546. package/daemon/dist/domain/skill-catalog.js +15 -6
  547. package/daemon/dist/domain/skill-catalog.js.map +1 -1
  548. package/daemon/dist/domain/skill-discovery.d.ts +17 -2
  549. package/daemon/dist/domain/skill-discovery.d.ts.map +1 -1
  550. package/daemon/dist/domain/skill-discovery.js +44 -5
  551. package/daemon/dist/domain/skill-discovery.js.map +1 -1
  552. package/daemon/dist/domain/startup-orchestrator.d.ts +26 -2
  553. package/daemon/dist/domain/startup-orchestrator.d.ts.map +1 -1
  554. package/daemon/dist/domain/startup-orchestrator.js +226 -14
  555. package/daemon/dist/domain/startup-orchestrator.js.map +1 -1
  556. package/daemon/dist/domain/stream-dispositions.d.ts +51 -0
  557. package/daemon/dist/domain/stream-dispositions.d.ts.map +1 -0
  558. package/daemon/dist/domain/stream-dispositions.js +112 -0
  559. package/daemon/dist/domain/stream-dispositions.js.map +1 -0
  560. package/daemon/dist/domain/stream-store.d.ts +22 -0
  561. package/daemon/dist/domain/stream-store.d.ts.map +1 -1
  562. package/daemon/dist/domain/stream-store.js +49 -6
  563. package/daemon/dist/domain/stream-store.js.map +1 -1
  564. package/daemon/dist/domain/stream-subscriptions.d.ts +94 -0
  565. package/daemon/dist/domain/stream-subscriptions.d.ts.map +1 -0
  566. package/daemon/dist/domain/stream-subscriptions.js +160 -0
  567. package/daemon/dist/domain/stream-subscriptions.js.map +1 -0
  568. package/daemon/dist/domain/successor-session-launcher.d.ts +6 -0
  569. package/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -1
  570. package/daemon/dist/domain/successor-session-launcher.js +5 -2
  571. package/daemon/dist/domain/successor-session-launcher.js.map +1 -1
  572. package/daemon/dist/domain/terminal/herdr-adapter.d.ts +2 -0
  573. package/daemon/dist/domain/terminal/herdr-adapter.d.ts.map +1 -1
  574. package/daemon/dist/domain/terminal/herdr-adapter.js +104 -1
  575. package/daemon/dist/domain/terminal/herdr-adapter.js.map +1 -1
  576. package/daemon/dist/domain/terminal/herdr-sessions.d.ts +9 -0
  577. package/daemon/dist/domain/terminal/herdr-sessions.d.ts.map +1 -0
  578. package/daemon/dist/domain/terminal/herdr-sessions.js +23 -0
  579. package/daemon/dist/domain/terminal/herdr-sessions.js.map +1 -0
  580. package/daemon/dist/domain/terminal/terminal-provider.d.ts +4 -0
  581. package/daemon/dist/domain/terminal/terminal-provider.d.ts.map +1 -1
  582. package/daemon/dist/domain/terminal/terminal-service.d.ts +12 -3
  583. package/daemon/dist/domain/terminal/terminal-service.d.ts.map +1 -1
  584. package/daemon/dist/domain/terminal/terminal-service.js +42 -17
  585. package/daemon/dist/domain/terminal/terminal-service.js.map +1 -1
  586. package/daemon/dist/domain/terminal/view-composer.d.ts.map +1 -1
  587. package/daemon/dist/domain/terminal/view-composer.js +1 -0
  588. package/daemon/dist/domain/terminal/view-composer.js.map +1 -1
  589. package/daemon/dist/domain/terminal-policy.d.ts +80 -0
  590. package/daemon/dist/domain/terminal-policy.d.ts.map +1 -0
  591. package/daemon/dist/domain/terminal-policy.js +117 -0
  592. package/daemon/dist/domain/terminal-policy.js.map +1 -0
  593. package/daemon/dist/domain/terminal-seat.d.ts +9 -0
  594. package/daemon/dist/domain/terminal-seat.d.ts.map +1 -0
  595. package/daemon/dist/domain/terminal-seat.js +37 -0
  596. package/daemon/dist/domain/terminal-seat.js.map +1 -0
  597. package/daemon/dist/domain/topology-converge.d.ts +25 -2
  598. package/daemon/dist/domain/topology-converge.d.ts.map +1 -1
  599. package/daemon/dist/domain/topology-converge.js +14 -1
  600. package/daemon/dist/domain/topology-converge.js.map +1 -1
  601. package/daemon/dist/domain/types.d.ts +58 -2
  602. package/daemon/dist/domain/types.d.ts.map +1 -1
  603. package/daemon/dist/domain/types.js.map +1 -1
  604. package/daemon/dist/domain/urgent-line.d.ts +4 -0
  605. package/daemon/dist/domain/urgent-line.d.ts.map +1 -0
  606. package/daemon/dist/domain/urgent-line.js +7 -0
  607. package/daemon/dist/domain/urgent-line.js.map +1 -0
  608. package/daemon/dist/domain/usage-series.d.ts.map +1 -1
  609. package/daemon/dist/domain/usage-series.js +6 -2
  610. package/daemon/dist/domain/usage-series.js.map +1 -1
  611. package/daemon/dist/domain/user-settings/settings-browser.js +2 -2
  612. package/daemon/dist/domain/user-settings/settings-browser.js.map +1 -1
  613. package/daemon/dist/domain/user-settings/settings-store.d.ts +3 -1
  614. package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
  615. package/daemon/dist/domain/user-settings/settings-store.js +73 -1
  616. package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
  617. package/daemon/dist/domain/view-projector.d.ts.map +1 -1
  618. package/daemon/dist/domain/view-projector.js +2 -1
  619. package/daemon/dist/domain/view-projector.js.map +1 -1
  620. package/daemon/dist/domain/watchdog-delivery.js +1 -1
  621. package/daemon/dist/domain/watchdog-delivery.js.map +1 -1
  622. package/daemon/dist/domain/watchdog-job-update.d.ts +21 -0
  623. package/daemon/dist/domain/watchdog-job-update.d.ts.map +1 -0
  624. package/daemon/dist/domain/watchdog-job-update.js +143 -0
  625. package/daemon/dist/domain/watchdog-job-update.js.map +1 -0
  626. package/daemon/dist/domain/watchdog-jobs-repository.d.ts +63 -7
  627. package/daemon/dist/domain/watchdog-jobs-repository.d.ts.map +1 -1
  628. package/daemon/dist/domain/watchdog-jobs-repository.js +190 -21
  629. package/daemon/dist/domain/watchdog-jobs-repository.js.map +1 -1
  630. package/daemon/dist/domain/watchdog-policy-engine.d.ts +23 -0
  631. package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
  632. package/daemon/dist/domain/watchdog-policy-engine.js +46 -13
  633. package/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
  634. package/daemon/dist/domain/workflow-exception-escalation.d.ts.map +1 -1
  635. package/daemon/dist/domain/workflow-exception-escalation.js +7 -3
  636. package/daemon/dist/domain/workflow-exception-escalation.js.map +1 -1
  637. package/daemon/dist/domain/workflow-projector.d.ts +5 -2
  638. package/daemon/dist/domain/workflow-projector.d.ts.map +1 -1
  639. package/daemon/dist/domain/workflow-projector.js +16 -7
  640. package/daemon/dist/domain/workflow-projector.js.map +1 -1
  641. package/daemon/dist/domain/workflow-runtime.d.ts +8 -2
  642. package/daemon/dist/domain/workflow-runtime.d.ts.map +1 -1
  643. package/daemon/dist/domain/workflow-runtime.js +30 -7
  644. package/daemon/dist/domain/workflow-runtime.js.map +1 -1
  645. package/daemon/dist/domain/workspace/project-read.d.ts +2 -0
  646. package/daemon/dist/domain/workspace/project-read.d.ts.map +1 -1
  647. package/daemon/dist/domain/workspace/project-read.js +10 -1
  648. package/daemon/dist/domain/workspace/project-read.js.map +1 -1
  649. package/daemon/dist/index.d.ts.map +1 -1
  650. package/daemon/dist/index.js +2 -0
  651. package/daemon/dist/index.js.map +1 -1
  652. package/daemon/dist/router-line-surface.d.ts +2 -0
  653. package/daemon/dist/router-line-surface.d.ts.map +1 -0
  654. package/daemon/dist/router-line-surface.js +3 -0
  655. package/daemon/dist/router-line-surface.js.map +1 -0
  656. package/daemon/dist/routes/activity.d.ts.map +1 -1
  657. package/daemon/dist/routes/activity.js +3 -0
  658. package/daemon/dist/routes/activity.js.map +1 -1
  659. package/daemon/dist/routes/agent-images.d.ts.map +1 -1
  660. package/daemon/dist/routes/agent-images.js +10 -2
  661. package/daemon/dist/routes/agent-images.js.map +1 -1
  662. package/daemon/dist/routes/attention.d.ts.map +1 -1
  663. package/daemon/dist/routes/attention.js +30 -3
  664. package/daemon/dist/routes/attention.js.map +1 -1
  665. package/daemon/dist/routes/bootstrap-failure-response.js +2 -2
  666. package/daemon/dist/routes/bootstrap-failure-response.js.map +1 -1
  667. package/daemon/dist/routes/bundles.js +1 -1
  668. package/daemon/dist/routes/bundles.js.map +1 -1
  669. package/daemon/dist/routes/compaction.d.ts.map +1 -1
  670. package/daemon/dist/routes/compaction.js +31 -10
  671. package/daemon/dist/routes/compaction.js.map +1 -1
  672. package/daemon/dist/routes/hosts.d.ts.map +1 -1
  673. package/daemon/dist/routes/hosts.js +2 -0
  674. package/daemon/dist/routes/hosts.js.map +1 -1
  675. package/daemon/dist/routes/mission-control.d.ts.map +1 -1
  676. package/daemon/dist/routes/mission-control.js +5 -1
  677. package/daemon/dist/routes/mission-control.js.map +1 -1
  678. package/daemon/dist/routes/projects.d.ts.map +1 -1
  679. package/daemon/dist/routes/projects.js +59 -12
  680. package/daemon/dist/routes/projects.js.map +1 -1
  681. package/daemon/dist/routes/proof.js +2 -2
  682. package/daemon/dist/routes/proof.js.map +1 -1
  683. package/daemon/dist/routes/provider.d.ts.map +1 -1
  684. package/daemon/dist/routes/provider.js +87 -0
  685. package/daemon/dist/routes/provider.js.map +1 -1
  686. package/daemon/dist/routes/queue.d.ts.map +1 -1
  687. package/daemon/dist/routes/queue.js +52 -3
  688. package/daemon/dist/routes/queue.js.map +1 -1
  689. package/daemon/dist/routes/rigs.d.ts.map +1 -1
  690. package/daemon/dist/routes/rigs.js +75 -10
  691. package/daemon/dist/routes/rigs.js.map +1 -1
  692. package/daemon/dist/routes/rigspec.d.ts.map +1 -1
  693. package/daemon/dist/routes/rigspec.js +38 -12
  694. package/daemon/dist/routes/rigspec.js.map +1 -1
  695. package/daemon/dist/routes/scopes.d.ts.map +1 -1
  696. package/daemon/dist/routes/scopes.js +30 -7
  697. package/daemon/dist/routes/scopes.js.map +1 -1
  698. package/daemon/dist/routes/seat.d.ts.map +1 -1
  699. package/daemon/dist/routes/seat.js +19 -3
  700. package/daemon/dist/routes/seat.js.map +1 -1
  701. package/daemon/dist/routes/sessions.js +5 -0
  702. package/daemon/dist/routes/sessions.js.map +1 -1
  703. package/daemon/dist/routes/skills.d.ts.map +1 -1
  704. package/daemon/dist/routes/skills.js +54 -1
  705. package/daemon/dist/routes/skills.js.map +1 -1
  706. package/daemon/dist/routes/stream.d.ts.map +1 -1
  707. package/daemon/dist/routes/stream.js +62 -13
  708. package/daemon/dist/routes/stream.js.map +1 -1
  709. package/daemon/dist/routes/terminal.d.ts.map +1 -1
  710. package/daemon/dist/routes/terminal.js +20 -11
  711. package/daemon/dist/routes/terminal.js.map +1 -1
  712. package/daemon/dist/routes/transport.d.ts.map +1 -1
  713. package/daemon/dist/routes/transport.js +24 -2
  714. package/daemon/dist/routes/transport.js.map +1 -1
  715. package/daemon/dist/routes/up.js +5 -0
  716. package/daemon/dist/routes/up.js.map +1 -1
  717. package/daemon/dist/routes/watchdog.d.ts +1 -0
  718. package/daemon/dist/routes/watchdog.d.ts.map +1 -1
  719. package/daemon/dist/routes/watchdog.js +52 -3
  720. package/daemon/dist/routes/watchdog.js.map +1 -1
  721. package/daemon/dist/routes/workflow.d.ts.map +1 -1
  722. package/daemon/dist/routes/workflow.js +24 -13
  723. package/daemon/dist/routes/workflow.js.map +1 -1
  724. package/daemon/dist/server.d.ts +2 -0
  725. package/daemon/dist/server.d.ts.map +1 -1
  726. package/daemon/dist/server.js +4 -1
  727. package/daemon/dist/server.js.map +1 -1
  728. package/daemon/dist/skill-loadout-surface.d.ts +2 -0
  729. package/daemon/dist/skill-loadout-surface.d.ts.map +1 -1
  730. package/daemon/dist/skill-loadout-surface.js +2 -0
  731. package/daemon/dist/skill-loadout-surface.js.map +1 -1
  732. package/daemon/dist/startup.d.ts.map +1 -1
  733. package/daemon/dist/startup.js +54 -21
  734. package/daemon/dist/startup.js.map +1 -1
  735. package/daemon/dist/terminal/TerminalSessionBroker.d.ts.map +1 -1
  736. package/daemon/dist/terminal/TerminalSessionBroker.js +9 -2
  737. package/daemon/dist/terminal/TerminalSessionBroker.js.map +1 -1
  738. package/daemon/docs/reference/a2a-agents.md +343 -0
  739. package/daemon/docs/reference/acp-agents.md +77 -0
  740. package/daemon/docs/reference/agent-spec.md +7 -5
  741. package/daemon/docs/reference/agent-startup-guide.md +46 -0
  742. package/daemon/docs/reference/agent-state-taxonomy.md +27 -2
  743. package/daemon/docs/reference/checked-seat-stop.md +11 -0
  744. package/daemon/docs/reference/community-harness-examples/cursor/cursor.yaml +13 -0
  745. package/daemon/docs/reference/community-harness-examples/cursor/openrig-cursor-launch +61 -0
  746. package/daemon/docs/reference/community-harness-examples/hermes/config.yaml.example +18 -0
  747. package/daemon/docs/reference/community-harness-examples/hermes/hermes.yaml +12 -0
  748. package/daemon/docs/reference/community-harness-examples/hermes/openrig-hermes-launch +34 -0
  749. package/daemon/docs/reference/community-harness-examples/openclaw/openclaw.yaml +13 -0
  750. package/daemon/docs/reference/community-harness-examples/openclaw/openrig-openclaw-launch +38 -0
  751. package/daemon/docs/reference/community-harness-presets.md +179 -0
  752. package/daemon/docs/reference/getting-started.md +65 -6
  753. package/daemon/docs/reference/operation-correlation.md +9 -0
  754. package/daemon/docs/reference/project-workspace.md +6 -0
  755. package/daemon/docs/reference/quickstart.md +1 -1
  756. package/daemon/docs/reference/refocus-channel.md +6 -4
  757. package/daemon/docs/reference/rig-spec.md +82 -2
  758. package/daemon/docs/reference/seat-delivery.md +73 -2
  759. package/daemon/docs/reference/slack-app-setup.md +3 -1
  760. package/daemon/docs/reference/stream-classifier-worker.md +28 -0
  761. package/daemon/docs/reference/telemetry.md +3 -0
  762. package/daemon/docs/reference/terminal-sessions.md +90 -0
  763. package/daemon/docs/reference/topology-naming.md +1 -1
  764. package/daemon/docs/reference/whats-new.md +162 -113
  765. package/daemon/specs/agents/shared/runtime/claude-settings.fragment.json +0 -3
  766. package/daemon/specs/agents/shared/skills/core/messaging-the-human/SKILL.md +19 -4
  767. package/daemon/specs/agents/shared/skills/core/openrig-herdr/SKILL.md +3 -0
  768. package/daemon/specs/agents/shared/skills/core/openrig-software-factory/references/worked-example.md +2 -2
  769. package/daemon/specs/rigs/launch/kernel/agents/operator/agent/guidance/role.md +36 -10
  770. package/daemon/specs/rigs/launch/kernel/agents/queue/worker/guidance/role.md +11 -0
  771. package/daemon/specs/rigs/launch/kernel/agents/queue/worker/startup/context.md +3 -1
  772. package/daemon/specs/rigs/launch/secrets-manager/secrets-manager.compose.yaml +1 -1
  773. package/dist/acp/connector.d.ts +72 -0
  774. package/dist/acp/connector.d.ts.map +1 -0
  775. package/dist/acp/connector.js +218 -0
  776. package/dist/acp/connector.js.map +1 -0
  777. package/dist/acp/json-rpc-stdio.d.ts +53 -0
  778. package/dist/acp/json-rpc-stdio.d.ts.map +1 -0
  779. package/dist/acp/json-rpc-stdio.js +141 -0
  780. package/dist/acp/json-rpc-stdio.js.map +1 -0
  781. package/dist/acp/run-processes.d.ts +10 -0
  782. package/dist/acp/run-processes.d.ts.map +1 -0
  783. package/dist/acp/run-processes.js +33 -0
  784. package/dist/acp/run-processes.js.map +1 -0
  785. package/dist/build-info.js +3 -3
  786. package/dist/client.d.ts +7 -2
  787. package/dist/client.d.ts.map +1 -1
  788. package/dist/client.js +14 -7
  789. package/dist/client.js.map +1 -1
  790. package/dist/commands/acp.d.ts +11 -0
  791. package/dist/commands/acp.d.ts.map +1 -0
  792. package/dist/commands/acp.js +198 -0
  793. package/dist/commands/acp.js.map +1 -0
  794. package/dist/commands/attach.js +1 -1
  795. package/dist/commands/attach.js.map +1 -1
  796. package/dist/commands/auth.d.ts +3 -0
  797. package/dist/commands/auth.d.ts.map +1 -1
  798. package/dist/commands/auth.js +39 -10
  799. package/dist/commands/auth.js.map +1 -1
  800. package/dist/commands/compact-plan.d.ts +2 -0
  801. package/dist/commands/compact-plan.d.ts.map +1 -1
  802. package/dist/commands/compact-plan.js +38 -3
  803. package/dist/commands/compact-plan.js.map +1 -1
  804. package/dist/commands/compact.js +1 -1
  805. package/dist/commands/compact.js.map +1 -1
  806. package/dist/commands/config.d.ts.map +1 -1
  807. package/dist/commands/config.js +7 -1
  808. package/dist/commands/config.js.map +1 -1
  809. package/dist/commands/create.js +2 -2
  810. package/dist/commands/create.js.map +1 -1
  811. package/dist/commands/daemon.d.ts.map +1 -1
  812. package/dist/commands/daemon.js +2 -0
  813. package/dist/commands/daemon.js.map +1 -1
  814. package/dist/commands/down.d.ts +5 -1
  815. package/dist/commands/down.d.ts.map +1 -1
  816. package/dist/commands/down.js +87 -3
  817. package/dist/commands/down.js.map +1 -1
  818. package/dist/commands/edge.d.ts +4 -0
  819. package/dist/commands/edge.d.ts.map +1 -0
  820. package/dist/commands/edge.js +135 -0
  821. package/dist/commands/edge.js.map +1 -0
  822. package/dist/commands/export.d.ts +1 -0
  823. package/dist/commands/export.d.ts.map +1 -1
  824. package/dist/commands/export.js +51 -0
  825. package/dist/commands/export.js.map +1 -1
  826. package/dist/commands/fork.d.ts.map +1 -1
  827. package/dist/commands/fork.js +19 -2
  828. package/dist/commands/fork.js.map +1 -1
  829. package/dist/commands/gateway.d.ts.map +1 -1
  830. package/dist/commands/gateway.js +2 -1
  831. package/dist/commands/gateway.js.map +1 -1
  832. package/dist/commands/grow.js +2 -2
  833. package/dist/commands/grow.js.map +1 -1
  834. package/dist/commands/launch.js +1 -1
  835. package/dist/commands/launch.js.map +1 -1
  836. package/dist/commands/mcp.d.ts.map +1 -1
  837. package/dist/commands/mcp.js +113 -1
  838. package/dist/commands/mcp.js.map +1 -1
  839. package/dist/commands/project-worker.d.ts +25 -1
  840. package/dist/commands/project-worker.d.ts.map +1 -1
  841. package/dist/commands/project-worker.js +9 -7
  842. package/dist/commands/project-worker.js.map +1 -1
  843. package/dist/commands/project.d.ts +2 -0
  844. package/dist/commands/project.d.ts.map +1 -1
  845. package/dist/commands/project.js +64 -1
  846. package/dist/commands/project.js.map +1 -1
  847. package/dist/commands/provider.d.ts.map +1 -1
  848. package/dist/commands/provider.js +101 -0
  849. package/dist/commands/provider.js.map +1 -1
  850. package/dist/commands/ps.d.ts +12 -1
  851. package/dist/commands/ps.d.ts.map +1 -1
  852. package/dist/commands/ps.js +50 -47
  853. package/dist/commands/ps.js.map +1 -1
  854. package/dist/commands/queue.d.ts +4 -2
  855. package/dist/commands/queue.d.ts.map +1 -1
  856. package/dist/commands/queue.js +24 -15
  857. package/dist/commands/queue.js.map +1 -1
  858. package/dist/commands/reconcile-session.d.ts.map +1 -1
  859. package/dist/commands/reconcile-session.js +6 -0
  860. package/dist/commands/reconcile-session.js.map +1 -1
  861. package/dist/commands/seat.d.ts +2 -0
  862. package/dist/commands/seat.d.ts.map +1 -1
  863. package/dist/commands/seat.js +124 -6
  864. package/dist/commands/seat.js.map +1 -1
  865. package/dist/commands/send.d.ts.map +1 -1
  866. package/dist/commands/send.js +62 -55
  867. package/dist/commands/send.js.map +1 -1
  868. package/dist/commands/setup.d.ts +24 -0
  869. package/dist/commands/setup.d.ts.map +1 -1
  870. package/dist/commands/setup.js +160 -7
  871. package/dist/commands/setup.js.map +1 -1
  872. package/dist/commands/skill.d.ts.map +1 -1
  873. package/dist/commands/skill.js +116 -3
  874. package/dist/commands/skill.js.map +1 -1
  875. package/dist/commands/start.d.ts.map +1 -1
  876. package/dist/commands/start.js +18 -25
  877. package/dist/commands/start.js.map +1 -1
  878. package/dist/commands/status.d.ts.map +1 -1
  879. package/dist/commands/status.js +4 -1
  880. package/dist/commands/status.js.map +1 -1
  881. package/dist/commands/stream-outcome.d.ts +157 -0
  882. package/dist/commands/stream-outcome.d.ts.map +1 -0
  883. package/dist/commands/stream-outcome.js +81 -0
  884. package/dist/commands/stream-outcome.js.map +1 -0
  885. package/dist/commands/stream.d.ts.map +1 -1
  886. package/dist/commands/stream.js +64 -2
  887. package/dist/commands/stream.js.map +1 -1
  888. package/dist/commands/terminal.d.ts +1 -0
  889. package/dist/commands/terminal.d.ts.map +1 -1
  890. package/dist/commands/terminal.js +35 -6
  891. package/dist/commands/terminal.js.map +1 -1
  892. package/dist/commands/topology-default-agent.d.ts +2 -2
  893. package/dist/commands/topology-default-agent.d.ts.map +1 -1
  894. package/dist/commands/topology-default-agent.js +5 -3
  895. package/dist/commands/topology-default-agent.js.map +1 -1
  896. package/dist/commands/up.d.ts.map +1 -1
  897. package/dist/commands/up.js +75 -30
  898. package/dist/commands/up.js.map +1 -1
  899. package/dist/commands/watchdog.d.ts.map +1 -1
  900. package/dist/commands/watchdog.js +80 -5
  901. package/dist/commands/watchdog.js.map +1 -1
  902. package/dist/commands/workflow-errors.js +1 -1
  903. package/dist/commands/workflow-errors.js.map +1 -1
  904. package/dist/commands/workflow-render.js +4 -4
  905. package/dist/commands/workflow-render.js.map +1 -1
  906. package/dist/commands/workflow.d.ts.map +1 -1
  907. package/dist/commands/workflow.js +34 -15
  908. package/dist/commands/workflow.js.map +1 -1
  909. package/dist/config-store.d.ts +15 -1
  910. package/dist/config-store.d.ts.map +1 -1
  911. package/dist/config-store.js +86 -4
  912. package/dist/config-store.js.map +1 -1
  913. package/dist/daemon-lifecycle.d.ts +4 -0
  914. package/dist/daemon-lifecycle.d.ts.map +1 -1
  915. package/dist/daemon-lifecycle.js +73 -21
  916. package/dist/daemon-lifecycle.js.map +1 -1
  917. package/dist/decisions/decisions.d.ts +203 -0
  918. package/dist/decisions/decisions.d.ts.map +1 -0
  919. package/dist/decisions/decisions.js +374 -0
  920. package/dist/decisions/decisions.js.map +1 -0
  921. package/dist/decisions/stream-consumer.d.ts +255 -0
  922. package/dist/decisions/stream-consumer.d.ts.map +1 -0
  923. package/dist/decisions/stream-consumer.js +282 -0
  924. package/dist/decisions/stream-consumer.js.map +1 -0
  925. package/dist/decisions/templates.d.ts +8 -0
  926. package/dist/decisions/templates.d.ts.map +1 -0
  927. package/dist/decisions/templates.js +34 -0
  928. package/dist/decisions/templates.js.map +1 -0
  929. package/dist/fresh-seat-command.d.ts +18 -0
  930. package/dist/fresh-seat-command.d.ts.map +1 -0
  931. package/dist/fresh-seat-command.js +36 -0
  932. package/dist/fresh-seat-command.js.map +1 -0
  933. package/dist/front-door.d.ts +4 -0
  934. package/dist/front-door.d.ts.map +1 -1
  935. package/dist/front-door.js +8 -4
  936. package/dist/front-door.js.map +1 -1
  937. package/dist/host-bindings.d.ts.map +1 -1
  938. package/dist/host-bindings.js +16 -9
  939. package/dist/host-bindings.js.map +1 -1
  940. package/dist/index.d.ts +2 -0
  941. package/dist/index.d.ts.map +1 -1
  942. package/dist/index.js +4 -0
  943. package/dist/index.js.map +1 -1
  944. package/dist/lazy-program.d.ts.map +1 -1
  945. package/dist/lazy-program.js +2 -0
  946. package/dist/lazy-program.js.map +1 -1
  947. package/dist/lib/run-on-host.d.ts +29 -0
  948. package/dist/lib/run-on-host.d.ts.map +1 -0
  949. package/dist/lib/run-on-host.js +69 -0
  950. package/dist/lib/run-on-host.js.map +1 -0
  951. package/dist/lib/seat-activity.d.ts +17 -0
  952. package/dist/lib/seat-activity.d.ts.map +1 -0
  953. package/dist/lib/seat-activity.js +29 -0
  954. package/dist/lib/seat-activity.js.map +1 -0
  955. package/dist/local-daemon-owner.d.ts +4 -0
  956. package/dist/local-daemon-owner.d.ts.map +1 -1
  957. package/dist/local-daemon-owner.js +1 -1
  958. package/dist/local-daemon-owner.js.map +1 -1
  959. package/dist/mcp-http.d.ts +42 -0
  960. package/dist/mcp-http.d.ts.map +1 -0
  961. package/dist/mcp-http.js +232 -0
  962. package/dist/mcp-http.js.map +1 -0
  963. package/dist/mcp-server.d.ts +30 -2
  964. package/dist/mcp-server.d.ts.map +1 -1
  965. package/dist/mcp-server.js +1112 -436
  966. package/dist/mcp-server.js.map +1 -1
  967. package/dist/seat-launch-additions-lines.d.ts +11 -0
  968. package/dist/seat-launch-additions-lines.d.ts.map +1 -0
  969. package/dist/seat-launch-additions-lines.js +14 -0
  970. package/dist/seat-launch-additions-lines.js.map +1 -0
  971. package/dist/terminal-window.d.ts +1 -1
  972. package/dist/terminal-window.d.ts.map +1 -1
  973. package/dist/terminal-window.js +50 -22
  974. package/dist/terminal-window.js.map +1 -1
  975. package/package.json +1 -1
  976. package/tui/dist/attention/attention-model.d.ts +3 -1
  977. package/tui/dist/attention/attention-model.d.ts.map +1 -1
  978. package/tui/dist/attention/attention-model.js +68 -1
  979. package/tui/dist/attention/attention-model.js.map +1 -1
  980. package/tui/dist/commands/registry.d.ts.map +1 -1
  981. package/tui/dist/commands/registry.js +2 -0
  982. package/tui/dist/commands/registry.js.map +1 -1
  983. package/tui/dist/config/config-model.d.ts.map +1 -1
  984. package/tui/dist/config/config-model.js +2 -0
  985. package/tui/dist/config/config-model.js.map +1 -1
  986. package/tui/dist/daemon-client.d.ts +18 -0
  987. package/tui/dist/daemon-client.d.ts.map +1 -1
  988. package/tui/dist/daemon-client.js +4 -0
  989. package/tui/dist/daemon-client.js.map +1 -1
  990. package/tui/dist/hydrate.d.ts.map +1 -1
  991. package/tui/dist/hydrate.js +9 -6
  992. package/tui/dist/hydrate.js.map +1 -1
  993. package/tui/dist/main.js +15 -1
  994. package/tui/dist/main.js.map +1 -1
  995. package/tui/dist/render.d.ts.map +1 -1
  996. package/tui/dist/render.js +10 -3
  997. package/tui/dist/render.js.map +1 -1
  998. package/tui/dist/topology/fixture.js +1 -1
  999. package/tui/dist/topology/fixture.js.map +1 -1
  1000. package/tui/dist/topology/glyphs.js +1 -1
  1001. package/tui/dist/topology/glyphs.js.map +1 -1
  1002. package/tui/dist/topology/graph-types.d.ts +1 -0
  1003. package/tui/dist/topology/graph-types.d.ts.map +1 -1
  1004. package/tui/dist/types.d.ts +25 -0
  1005. package/tui/dist/types.d.ts.map +1 -1
  1006. package/ui/dist/assets/{index-CVgod3Pm.js → index-Blg-p32B.js} +92 -92
  1007. package/ui/dist/index.html +1 -1
@@ -1,3 +1,4 @@
1
+ import { TerminalPolicyRefusal } from "./terminal-policy.js";
1
2
  import { DeliveryGuardError } from "./seat-delivery-guard.js";
2
3
  import * as fs from "node:fs";
3
4
  import { randomUUID } from "node:crypto";
@@ -23,10 +24,19 @@ import * as path from "node:path";
23
24
  * session must drop below threshold before another auto-compact can
24
25
  * fire. The dedup window still blocks immediate flaps; the threshold
25
26
  * crossing rule prevents one high-usage session from receiving
26
- * /compact every 60s. State is intentionally NOT persisted; daemon
27
- * restart resets the window which is the safer-failure direction
28
- * (might re-compact once on restart in rare cases, won't lock out
29
- * forever).
27
+ * /compact every 60s. This window is intentionally NOT persisted; daemon
28
+ * restart resets it, which is the safer-failure direction (might
29
+ * re-compact once on restart in rare cases, won't lock out forever).
30
+ * - Restart: each attempt's record (COMPACTION-STATE.json, beside its map)
31
+ * says what the daemon last did for it, so a restarted daemon resumes an
32
+ * owed restore and waits on an open preparation instead of starting a
33
+ * second one (`recoverAfterRestart`). A prompt or /compact is marked in
34
+ * flight at its write, so a restart never sends it again. A restart between
35
+ * a post-compact stage's send and its record can send that one stage again.
36
+ * - A /compact whose outcome is unknown owes its restore steps, with or
37
+ * without a restart. Its text may wait unsubmitted in the input box, where
38
+ * any Enter would submit it, so each step goes only into an empty box and
39
+ * is held, visibly, while the box holds text or can't be read.
30
40
  * - Definite pre-write prep failures retry at most three times. Uncertain
31
41
  * delivery never replays. Unfinished preparation stops visibly until an
32
42
  * explicit retry; it cannot arm a delayed compact after its deadline.
@@ -235,7 +245,8 @@ export function buildPostCompactRestorePrompt(input) {
235
245
  // refused at the source. Tell the seat NOT to seek it out (it is not its state).
236
246
  pieces.push("A post-compaction instruction file declaring a DIFFERENT seat was present and has been IGNORED — it is not yours; do NOT read or follow it. Rely on the per-seat marker and the JSONL transcript for restore.");
237
247
  }
238
- pieces.push("Load/read the claude-compaction-restore skill, follow the marker's restoreInstruction and postCompactInstruction when present, read your newest restore map and use the restore packet as a lookup, then reply with: restored from packet at <path>; resumed at step <X>.");
248
+ const restoreMap = input.attemptMapPath ? "this preparation attempt's restore map" : "your newest restore map";
249
+ pieces.push(`Load/read the claude-compaction-restore skill, follow the marker's restoreInstruction and postCompactInstruction when present, read ${restoreMap} and use the restore packet as a lookup, then reply with: restored from packet at <path>; resumed at step <X>.`);
239
250
  pieces.push(`During this restore, read ${path.join(input.openrigHome, "plugins", "openrig-core", "skills", "refocusing", "SKILL.md")} and consume the current topology and work traces delivered with this restore request, if present; do not rerun Python just to duplicate a delivered trace. Missing trace delivery is a named gap. Read required notes and full sources with the native file-read tool; a pointer, compact summary or truncated extract is not a full source read. Name any missing source, the current user outcome, and your next action from the files you actually read, not from the compact summary.`);
240
251
  return pieces.join(" ");
241
252
  }
@@ -257,6 +268,43 @@ export function buildPostCompactTurnBoundaryPrompt() {
257
268
  "Do not restore yet; the next normal user message will contain the restore instructions.",
258
269
  ].join(" ");
259
270
  }
271
+ /** The file, beside an attempt's restore map, where the daemon records what it last did for that attempt. The agent
272
+ * never writes it. A restarted daemon reads it to pick the attempt up again. */
273
+ export const COMPACTION_RECORD_FILE = "COMPACTION-STATE.json";
274
+ /** How old a record may be for a restarted daemon to resume it. An older open record isn't resumed: it reads as
275
+ * stranded, so whoever reaches the seat is told its restore may still be owed. Operational, not measured. */
276
+ export const RESTART_RECOVERY_WINDOW_MS_DEFAULT = 6 * 60 * 60_000;
277
+ /** This daemon process. A record this process wrote is its own state, never something to recover. */
278
+ const DAEMON_PROCESS_ID = randomUUID();
279
+ const RECORD_PHASES = new Set(["preparing", "turn_boundary", "restore_prompt", "compliance_prompt", "compact_uncertain", "done", "ended"]);
280
+ const RECORD_DELIVERIES = new Set(["pending", "not_sent", "delivered", "uncertain"]);
281
+ /** A record only in the shape this daemon writes. Any other (a newer daemon's after a rollback, a damaged file) is ignored,
282
+ * so it can't hold up a seat's compaction. */
283
+ function readCompactionRecord(file) {
284
+ try {
285
+ const r = JSON.parse(fs.readFileSync(file, "utf8"));
286
+ const text = (v) => typeof v === "string";
287
+ const textOrNull = (v) => v === null || typeof v === "string";
288
+ const carry = r.restoreCarry;
289
+ const valid = text(r.daemon) && text(r.attemptId) && text(r.session) && textOrNull(r.occupantGeneration)
290
+ && (r.mode === "automatic" || r.mode === "manual") && RECORD_PHASES.has(r.phase) && RECORD_DELIVERIES.has(r.delivery)
291
+ && (r.deadlineAt === null || Number.isFinite(r.deadlineAt)) && Number.isInteger(r.sends) && r.sends >= 0 && r.sends <= PREP_SEND_ATTEMPTS_MAX
292
+ && text(r.mapPath) && text(r.marker) && text(r.compactInstruction) && textOrNull(r.preparationRoot) && Number.isFinite(r.updatedAt)
293
+ && (r.operatorInitiated === undefined || typeof r.operatorInitiated === "boolean") && (r.compactSending === undefined || r.compactSending === true)
294
+ && (r.uncertainCompact === undefined || r.uncertainCompact === true)
295
+ && (carry === undefined || (typeof carry === "object" && carry !== null && textOrNull(carry.mapPath) && textOrNull(carry.compactInstruction)
296
+ && (carry.skipMap === undefined || (text(carry.skipMap?.mapPath) && text(carry.skipMap?.marker)))));
297
+ return valid ? r : null;
298
+ }
299
+ catch {
300
+ return null;
301
+ }
302
+ }
303
+ /** Input-box readings that hold nothing typed: an owed step after an uncertain /compact may go in. A harness suggestion isn't input. */
304
+ const INPUT_BOX_CLEAR = new Set(["empty", "likely-suggestion"]);
305
+ function strandedSummary(record) {
306
+ return { attemptId: record.attemptId, mapPath: record.mapPath, phase: record.phase, recordedAt: new Date(record.updatedAt).toISOString() };
307
+ }
260
308
  export class ClaudeCompactionEnforcer {
261
309
  settingsStore;
262
310
  sessionTransport;
@@ -285,9 +333,24 @@ export class ClaudeCompactionEnforcer {
285
333
  // unknown). At drain we compare it to the LIVE generation; a mismatch = a successor inheriting a
286
334
  // retired-generation stage → refuse. Injected resolver (atom-B's currentOccupantTenure by session).
287
335
  pendingStageGeneration = new Map();
336
+ /** Each seat's current attempt record, as last written beside its map. */
337
+ records = new Map();
338
+ /** Seats whose records this daemon has already looked for after starting. */
339
+ recovered = new Set();
340
+ /** Open records too old to resume: the seat's restore may still be owed. */
341
+ stranded = new Map();
342
+ /** Seats whose owed restore steps follow a /compact whose outcome is unknown: its text may wait unsubmitted in the input
343
+ * box, where any Enter would submit it, so each step goes only into an empty box. */
344
+ afterUncertainCompact = new Set();
345
+ /** What the input box last read for such a seat, before an owed step (absent until the first check). */
346
+ lastInputBox = new Map();
347
+ restartRecoveryWindowMs;
348
+ daemonInstance;
288
349
  resolveOccupantGeneration;
289
350
  onPostRestoreComplete;
351
+ terminalPolicies;
290
352
  constructor(settingsStore, sessionTransport, opts) {
353
+ this.terminalPolicies = opts?.terminalPolicies;
291
354
  this.settingsStore = settingsStore;
292
355
  this.sessionTransport = sessionTransport;
293
356
  this.dedupWindowMs = opts?.dedupWindowMs ?? DEDUP_WINDOW_MS_DEFAULT;
@@ -299,6 +362,8 @@ export class ClaudeCompactionEnforcer {
299
362
  this.sleep = opts?.sleep ?? (ms => new Promise(resolve => setTimeout(resolve, ms)));
300
363
  this.postCompactSendWaitMs = opts?.postCompactSendWaitMs ?? POST_COMPACT_SEND_WAIT_MS_DEFAULT;
301
364
  this.compactSendIdleWaitMs = opts?.compactSendIdleWaitMs ?? 1000;
365
+ this.restartRecoveryWindowMs = opts?.restartRecoveryWindowMs ?? RESTART_RECOVERY_WINDOW_MS_DEFAULT;
366
+ this.daemonInstance = opts?.daemonInstance ?? DAEMON_PROCESS_ID;
302
367
  this.resolveOccupantGeneration = opts?.resolveOccupantGeneration;
303
368
  this.onPostRestoreComplete = opts?.onPostRestoreComplete;
304
369
  }
@@ -318,23 +383,71 @@ export class ClaudeCompactionEnforcer {
318
383
  */
319
384
  observedCompaction(sessionName) {
320
385
  const owed = this.pendingPostCompactRestore.get(sessionName);
386
+ const held = this.getOwedRestore(sessionName);
387
+ if (held?.held)
388
+ return { stage: owed === "compliance_prompt" ? "restoring" : owed === "restore_prompt" ? "compacted" : "compacting", detail: held.detail };
321
389
  if (owed === "compliance_prompt")
322
390
  return { stage: "restoring", detail: "mid-restore: the restore request was sent and the post-restore audit is still owed" };
323
391
  if (owed === "restore_prompt")
324
392
  return { stage: "compacted", detail: "compacted, with its restore not yet requested" };
325
- if (owed === "turn_boundary")
326
- return { stage: "compacting", detail: "being compacted: /compact was submitted and the post-compaction steps haven't started" };
327
393
  const attempt = this.pendingPreCompactPrep.get(sessionName);
328
- if (attempt?.status === "sending" || attempt?.status === "waiting")
329
- return { stage: "preparing", detail: "preparing for a managed compaction: /compact hasn't been sent yet" };
394
+ if (owed === "turn_boundary") {
395
+ return { stage: "compacting", detail: attempt?.compact === "uncertain"
396
+ ? "possibly being compacted: /compact may have been submitted (its result was lost) and the post-compaction steps haven't started"
397
+ : "being compacted: /compact was submitted and the post-compaction steps haven't started" };
398
+ }
399
+ if (attempt?.status === "sending" || attempt?.status === "waiting") {
400
+ return { stage: "preparing", detail: `preparing for a managed compaction: /compact hasn't been sent yet${attempt.supersedes
401
+ ? `; it replaces a compaction from before an OpenRig restart whose restore steps may still have been owed (map ${attempt.supersedes.mapPath})` : ""}` };
402
+ }
330
403
  if (attempt?.status === "compact-sent")
331
404
  return { stage: "compacting", detail: "being compacted: /compact was submitted and the post-compaction steps haven't started" };
405
+ if (this.stranded.has(sessionName)) {
406
+ return { stage: "compacted", detail: "compacted before an OpenRig restart, with its restore steps possibly still owed: the record is too old for OpenRig to resume them" };
407
+ }
332
408
  return null;
333
409
  }
334
- /** True while a post-compact stage (turn boundary, restore or audit) is still owed to this seat. */
335
- hasPendingPostCompactStage(sessionName) {
410
+ /** True while a post-compact stage (turn boundary, restore or audit) is still owed to this seat. Given the seat, a
411
+ * restarted daemon first picks up a stage its predecessor recorded (`recoverAfterRestart`). */
412
+ hasPendingPostCompactStage(sessionName, seat) {
413
+ if (seat)
414
+ this.recoverSeat({ sessionName, ...seat });
336
415
  return this.pendingPostCompactRestore.has(sessionName);
337
416
  }
417
+ /** The first time this daemon reaches a seat (a poll, a manual request, a state read): pick up its record from before a
418
+ * restart, with the policy's preparation root (`recoverAfterRestart`). */
419
+ recoverSeat(seat) {
420
+ if (seat.runtime !== "claude-code" || this.recovered.has(seat.sessionName))
421
+ return;
422
+ let preparationRoot = null;
423
+ try {
424
+ preparationRoot = this.settingsStore.resolveClaudeCompactionPolicy().preparationRoot || null;
425
+ }
426
+ catch { /* default roots */ }
427
+ this.recoverAfterRestart(seat, preparationRoot);
428
+ }
429
+ /** The restore step OpenRig owes this seat next, or null. After a /compact whose outcome is unknown (see
430
+ * `afterUncertainCompact`) it also gives what the input box last read (`not_checked` before the first check) and
431
+ * whether the step is held for it. */
432
+ getOwedRestore(sessionName) {
433
+ const stage = this.pendingPostCompactRestore.get(sessionName);
434
+ if (!stage)
435
+ return null;
436
+ const step = { turn_boundary: "post-compaction turn boundary", restore_prompt: "restore request", compliance_prompt: "post-restore audit" }[stage];
437
+ if (!this.afterUncertainCompact.has(sessionName)) {
438
+ return { stage, held: false, detail: `OpenRig owes this seat its ${step} next, sent on a poll once the pane is idle.` };
439
+ }
440
+ const inputBox = this.lastInputBox.get(sessionName) ?? "not_checked";
441
+ const held = inputBox !== "not_checked" && !INPUT_BOX_CLEAR.has(inputBox);
442
+ return { stage, held, inputBox, detail: held
443
+ ? `held: OpenRig owes this seat its restore steps after a /compact whose result was lost, and waits while its input box isn't empty (it reads ${inputBox}). The seat may have /compact text waiting, which any Enter would submit, so check the pane. A seat whose own status line keeps the box unreadable stays held.`
444
+ : `OpenRig owes this seat its ${step} next, after a /compact whose result was lost. Each step goes only into an empty input box, sent on a poll once the pane is idle (the box last read ${inputBox}).` };
445
+ }
446
+ /** An open record from before a restart that was too old to resume, while no later attempt has replaced it. */
447
+ getStrandedCompaction(sessionName) {
448
+ const record = this.stranded.get(sessionName);
449
+ return record ? strandedSummary(record) : null;
450
+ }
338
451
  /**
339
452
  * Drain a post-compact stage that is already pending, without a usage sample. ContextMonitor
340
453
  * calls this when the latest sample is stale or unknown. Such a sample never starts a
@@ -360,6 +473,23 @@ export class ClaudeCompactionEnforcer {
360
473
  return (await this.drainPendingStage(unsampled, policy)) ?? { triggered: false, reason: "no_pending_stage" };
361
474
  });
362
475
  }
476
+ terminalPolicyReason(input, actor) {
477
+ const nodeId = input.nodeId ?? this.sessionTransport.deliveryGuard?.maybeTarget(input.sessionName)?.nodeId;
478
+ if (!this.terminalPolicies || !nodeId)
479
+ return null;
480
+ try {
481
+ this.terminalPolicies.check(nodeId, "compaction", actor);
482
+ return null;
483
+ }
484
+ catch (error) {
485
+ return error instanceof TerminalPolicyRefusal ? "terminal_policy_refused" : actor.source === "openrig" ? null : "terminal_policy_unavailable";
486
+ }
487
+ }
488
+ checkAttemptPolicy(input, attempt) {
489
+ const reason = this.terminalPolicyReason(input, attempt.policyActor ?? { source: "openrig" });
490
+ if (reason)
491
+ throw new DeliveryGuardError(reason, "This seat's terminal policy does not allow this managed compaction. Read rig seat status <seat> to see or change the explicit choice; the existing override path is unchanged.");
492
+ }
363
493
  async withDeliveryGuard(input, run) {
364
494
  const runIfCurrent = () => input.isObservationCurrent && !input.isObservationCurrent()
365
495
  ? Promise.resolve({ triggered: false, reason: "stale_observation" }) : run();
@@ -388,6 +518,7 @@ export class ClaudeCompactionEnforcer {
388
518
  const isCurrent = () => this.pendingPostCompactRestore.get(input.sessionName) === pendingStage
389
519
  && this.pendingPreCompactPrep.get(input.sessionName) === attempt;
390
520
  const sendOpts = {
521
+ openrigNotice: true,
391
522
  beforeWrite: () => {
392
523
  if (!isCurrent())
393
524
  throw new DeliveryGuardError("compaction_cancelled", "Managed compaction was cancelled or replaced; no further input is authorized.");
@@ -422,6 +553,17 @@ export class ClaudeCompactionEnforcer {
422
553
  return { triggered: false, reason: "stale_generation" };
423
554
  }
424
555
  }
556
+ // After a /compact whose outcome is unknown, its text may still wait unsubmitted in the input box, and this step's Enter
557
+ // would submit it. So each step goes only into a box holding nothing typed (a harness suggestion isn't input); while it
558
+ // holds text or can't be read, the step waits for the next poll, and the notice and --state say why.
559
+ if (this.afterUncertainCompact.has(input.sessionName)) {
560
+ const box = await this.inputBoxStatus(input.sessionName);
561
+ if (!isCurrent())
562
+ return { triggered: false, reason: "preparation_stopped" };
563
+ this.lastInputBox.set(input.sessionName, box);
564
+ if (!INPUT_BOX_CLEAR.has(box))
565
+ return { triggered: false, reason: "input_box_not_empty" };
566
+ }
425
567
  if (pendingStage === "turn_boundary") {
426
568
  const boundary = await this.sessionTransport.send(input.sessionName, buildPostCompactTurnBoundaryPrompt(), sendOpts);
427
569
  if (!isCurrent())
@@ -431,6 +573,7 @@ export class ClaudeCompactionEnforcer {
431
573
  return { triggered: false, reason: "send_failed" };
432
574
  }
433
575
  this.pendingPostCompactRestore.set(input.sessionName, "restore_prompt");
576
+ this.persistStage(input.sessionName, "restore_prompt");
434
577
  return { triggered: true };
435
578
  }
436
579
  if (pendingStage === "restore_prompt") {
@@ -457,6 +600,7 @@ export class ClaudeCompactionEnforcer {
457
600
  return { triggered: false, reason: "send_failed" };
458
601
  }
459
602
  this.pendingPostCompactRestore.set(input.sessionName, "compliance_prompt");
603
+ this.persistStage(input.sessionName, "compliance_prompt");
460
604
  this.restoreCarry.delete(input.sessionName);
461
605
  // OPR.0.4.3.14 — surface manual-trigger progress (no-op for auto seats).
462
606
  this.advanceManualStage(input.sessionName, "compact-sent", "restore-sent");
@@ -486,8 +630,14 @@ export class ClaudeCompactionEnforcer {
486
630
  if (!isCurrent())
487
631
  return { triggered: false, reason: "preparation_stopped" };
488
632
  this.pendingPostCompactRestore.delete(input.sessionName);
633
+ this.persistStage(input.sessionName, "done");
634
+ this.records.delete(input.sessionName);
635
+ this.afterUncertainCompact.delete(input.sessionName);
636
+ this.lastInputBox.delete(input.sessionName);
489
637
  this.restoreCarry.delete(input.sessionName);
490
- if (this.pendingPreCompactPrep.get(input.sessionName)?.status === "compact-sent")
638
+ // The attempt is finished, including one stopped after a lost /compact result whose restore this was.
639
+ const finished = this.pendingPreCompactPrep.get(input.sessionName);
640
+ if (finished?.status === "compact-sent" || finished?.compact === "uncertain")
491
641
  this.pendingPreCompactPrep.delete(input.sessionName);
492
642
  this.pendingStageGeneration.delete(input.sessionName); // GHOST-STAGE (b): stage completed → drop its gen
493
643
  this.postCompactRestoreCooldownUntil.set(input.sessionName, Date.now() + this.postCompactRestoreCooldownMs);
@@ -519,6 +669,7 @@ export class ClaudeCompactionEnforcer {
519
669
  if (!isValidThresholdPercent(policy.thresholdPercent)) {
520
670
  return { triggered: false, reason: "invalid_policy" };
521
671
  }
672
+ this.recoverAfterRestart(input, policy.preparationRoot || null);
522
673
  // A trigger sample must not block work already owed to this occupant. Restore reads can
523
674
  // themselves exceed a low threshold; keep the same stage, authorization and idle gates.
524
675
  const drained = await this.drainPendingStage(input, policy);
@@ -553,6 +704,13 @@ export class ClaudeCompactionEnforcer {
553
704
  if (this.triggeredAboveThreshold.has(input.sessionName)) {
554
705
  return { triggered: false, reason: "already_triggered_above_threshold" };
555
706
  }
707
+ const policyRefusal = this.terminalPolicyReason(input, { source: "openrig" });
708
+ if (policyRefusal) {
709
+ const existing = this.pendingPreCompactPrep.get(input.sessionName);
710
+ if (existing?.mode === "automatic" && existing.compact === "not_sent")
711
+ this.stopPreparation(input.sessionName, policyRefusal, existing);
712
+ return { triggered: false, reason: policyRefusal };
713
+ }
556
714
  // Before any preparation prompt or /compact copy: a protected seat with no recorded pane cannot take input.
557
715
  // An attempt already under way stops as not sent; none is begun.
558
716
  if (this.paneUnknownProtected(input.sessionName)) {
@@ -577,7 +735,7 @@ export class ClaudeCompactionEnforcer {
577
735
  if (!attempt) {
578
736
  attempt = this.beginPreparation(input, "automatic");
579
737
  if (attempt.status === "stopped")
580
- return { triggered: false, reason: "occupant_generation_unavailable" };
738
+ return { triggered: false, reason: attempt.reason === "preparation_directory_unavailable" ? attempt.reason : "occupant_generation_unavailable" };
581
739
  }
582
740
  if (attempt.status === "sending") {
583
741
  await this.deliverPreparation(input, attempt);
@@ -616,6 +774,10 @@ export class ClaudeCompactionEnforcer {
616
774
  return this.triggerManualCompactUnchecked(input, opts);
617
775
  }
618
776
  async triggerManualCompactUnchecked(input, opts) {
777
+ // The manual budget starts with the request. A request reaching a seat before the monitor's first poll after a restart
778
+ // finds its owed restore or open preparation first, so it neither prepares twice nor replaces the owed restore.
779
+ const requestedAt = this.now();
780
+ this.recoverSeat(input);
619
781
  this.reconcilePreparations();
620
782
  const active = this.pendingPreCompactPrep.get(input.sessionName);
621
783
  const stage = this.manualCompactionState.get(input.sessionName)?.stage;
@@ -631,9 +793,13 @@ export class ClaudeCompactionEnforcer {
631
793
  // The preparation prompt cannot be written to such a seat either, so the whole attempt is refused up front.
632
794
  if (this.paneUnknownProtected(input.sessionName))
633
795
  return this.recordManualFailure(input.sessionName, "pane_unknown_protected");
634
- const attempt = this.beginPreparation(input, "manual", opts.skipMap === true);
796
+ const actor = opts.actor ?? { source: "caller", session: null };
797
+ const policyRefusal = this.terminalPolicyReason(input, actor);
798
+ if (policyRefusal)
799
+ return this.recordManualFailure(input.sessionName, policyRefusal);
800
+ const attempt = this.beginPreparation(input, "manual", opts.skipMap === true, actor, requestedAt);
635
801
  if (attempt.status === "stopped")
636
- return this.recordManualFailure(input.sessionName, "occupant_generation_unavailable");
802
+ return this.recordManualFailure(input.sessionName, attempt.reason ?? "occupant_generation_unavailable");
637
803
  const failed = (reason) => {
638
804
  // A cancelled request may settle after an explicit retry. Its receipt must
639
805
  // not stop or overwrite the successor attempt's state.
@@ -679,34 +845,51 @@ export class ClaudeCompactionEnforcer {
679
845
  }
680
846
  const compact = await this.sendPreparedCompact(input, attempt, opts.skipMap === true);
681
847
  if (!compact.ok) {
682
- return failed(compact.reason ?? "send_failed");
848
+ const outcome = failed(compact.reason ?? "send_failed");
849
+ // A /compact whose result was lost still owes its restore steps, and this request authorizes them.
850
+ if (!this.pendingPostCompactRestore.has(input.sessionName) || this.pendingPreCompactPrep.get(input.sessionName) !== attempt)
851
+ return outcome;
852
+ this.setManualStage(input.sessionName, "compact-sent", outcome.reason, opts.operatorInitiated === true);
853
+ return { ...outcome, restoreOwed: true };
683
854
  }
684
855
  this.setManualStage(input.sessionName, "compact-sent", undefined, opts.operatorInitiated === true);
685
856
  return { triggered: true, stage: "compact-sent" };
686
857
  }
687
- beginPreparation(input, mode, skipMap = false) {
858
+ beginPreparation(input, mode, skipMap = false, policyActor = { source: "openrig" }, startedAt = this.now()) {
688
859
  const attemptId = randomUUID();
860
+ const policy = this.settingsStore.resolveClaudeCompactionPolicy();
861
+ const preparationRoot = policy.preparationRoot || null;
689
862
  const fallbackMapPath = path.join(this.openrigHome, "compaction", "preparation", sanitizeSessionKey(input.sessionName), attemptId, "RESTORE-MAP.md");
690
863
  const occupantGeneration = this.resolveOccupantGeneration?.(input.sessionName)
691
864
  ?? this.sessionTransport.deliveryGuard?.maybeTarget(input.sessionName)?.occupant ?? null;
692
865
  const attempt = {
693
- attemptId, occupantGeneration, mode, status: "sending", delivery: "pending", compact: "not_sent", sends: 0,
694
- deadlineAt: mode === "manual" ? this.now() + this.manualPrepWaitMs : null,
695
- mapPath: fallbackMapPath,
866
+ policyActor, attemptId, occupantGeneration, mode, status: "sending", delivery: "pending", compact: "not_sent", sends: 0,
867
+ deadlineAt: mode === "manual" ? startedAt + this.manualPrepWaitMs : null,
868
+ mapPath: preparationRoot ? path.join(preparationRoot, sanitizeSessionKey(input.sessionName), attemptId, "RESTORE-MAP.md") : fallbackMapPath,
696
869
  marker: `<!-- openrig-compaction-complete ${JSON.stringify({ attemptId, session: input.sessionName, occupantGeneration })} -->`,
697
- policyWasEnabled: this.settingsStore.resolveClaudeCompactionPolicy().enabled,
870
+ policyWasEnabled: policy.enabled,
871
+ preparationRoot,
698
872
  controller: new AbortController(),
699
- compactInstruction: this.settingsStore.resolveClaudeCompactionPolicy().compactInstruction ?? "",
873
+ compactInstruction: policy.compactInstruction ?? "",
700
874
  };
875
+ // A stranded record this attempt replaces stays visible on the attempt, not dropped quietly.
876
+ const stranded = this.stranded.get(input.sessionName);
877
+ if (stranded)
878
+ attempt.supersedes = strandedSummary(stranded);
701
879
  this.pendingPreCompactPrep.set(input.sessionName, attempt);
880
+ this.stranded.delete(input.sessionName);
702
881
  // A map cannot satisfy an unknown occupant. Keep the failed attempt visible and
703
882
  // disarmed; explicit skip-map still bypasses only the artifact prerequisite.
704
883
  if (occupantGeneration === null && !skipMap)
705
884
  this.stopPreparation(input.sessionName, "occupant_generation_unavailable");
706
- if (attempt.status !== "stopped" && input.cwd && path.isAbsolute(input.cwd)) {
707
- // Keep writes inside Claude's existing edit workspace, without adding permissions.
708
- // This folder holds private working context; ignore its entire contents in Git.
709
- const root = path.join(input.cwd, ".openrig", "compaction");
885
+ if (skipMap && preparationRoot) {
886
+ this.startRecord(input.sessionName, attempt);
887
+ return attempt;
888
+ }
889
+ if (attempt.status !== "stopped" && (preparationRoot || (input.cwd && path.isAbsolute(input.cwd)))) {
890
+ // An explicit root can be outside a workspace denied by Claude file permissions.
891
+ // The daemon cannot prove those permissions; the operator grants access to this root.
892
+ const root = preparationRoot ?? path.join(input.cwd, ".openrig", "compaction");
710
893
  try {
711
894
  fs.mkdirSync(root, { recursive: true });
712
895
  const ignorePath = path.join(root, ".gitignore");
@@ -730,12 +913,17 @@ export class ClaudeCompactionEnforcer {
730
913
  fs.closeSync(fd);
731
914
  }
732
915
  }
733
- const parent = path.join(root, "preparation", sanitizeSessionKey(input.sessionName), attemptId);
916
+ const parent = path.join(preparationRoot ?? path.join(root, "preparation"), sanitizeSessionKey(input.sessionName), attemptId);
734
917
  fs.mkdirSync(parent, { recursive: true });
735
918
  fs.accessSync(parent, fs.constants.W_OK | fs.constants.X_OK);
736
919
  attempt.mapPath = path.join(parent, "RESTORE-MAP.md");
737
920
  }
738
- catch { /* Preserve the existing instance-home path for legacy or unwritable workspaces. */ }
921
+ catch {
922
+ // An explicit location is a permission choice: never silently move it back into
923
+ // the denied workspace or instance home. Keep the selected path visible in --state.
924
+ if (preparationRoot)
925
+ this.stopPreparation(input.sessionName, "preparation_directory_unavailable");
926
+ }
739
927
  }
740
928
  if (attempt.status !== "stopped" && attempt.mapPath === fallbackMapPath) {
741
929
  // The cwd path already creates its parent. Prepare the legacy fallback too;
@@ -745,6 +933,8 @@ export class ClaudeCompactionEnforcer {
745
933
  }
746
934
  catch { /* Retain the existing path and deadline if the directory cannot be prepared. */ }
747
935
  }
936
+ if (attempt.status !== "stopped")
937
+ this.startRecord(input.sessionName, attempt);
748
938
  return attempt;
749
939
  }
750
940
  mapReady(attempt, publish = false) {
@@ -786,23 +976,44 @@ export class ClaudeCompactionEnforcer {
786
976
  attempt.status = "waiting";
787
977
  const policy = this.settingsStore.resolveClaudeCompactionPolicy();
788
978
  let prep;
979
+ let marked = false;
789
980
  try {
790
981
  const composed = composeManagedCompactCommand({ compactInstruction: attempt.compactInstruction, mapPath: attempt.mapPath });
791
982
  prep = await this.sessionTransport.send(input.sessionName, buildPreCompactPrepPrompt({
792
983
  overflowCompactInstruction: composed.instructionInCommand ? null : attempt.compactInstruction,
793
984
  usedPercentage: input.usedPercentage, thresholdPercent: policy.thresholdPercent,
794
985
  preCompactInstruction: policy.preCompactInstruction, preparation: attempt, constructedAt: this.now(),
795
- }));
986
+ }), { openrigNotice: true, beforeWrite: () => {
987
+ this.reconcilePreparations();
988
+ if (this.pendingPreCompactPrep.get(input.sessionName) !== attempt || attempt.controller.signal.aborted || attempt.status === "stopped")
989
+ throw new DeliveryGuardError("preparation_stopped", "This compaction attempt ended before preparation input.");
990
+ this.checkAttemptPolicy(input, attempt);
991
+ // At the write, a retry included: from here a restart reads this prompt as possibly delivered and never resends it.
992
+ if (!marked) {
993
+ marked = true;
994
+ this.persist(input.sessionName, attempt.attemptId, { delivery: "pending", sends: attempt.sends });
995
+ }
996
+ } });
796
997
  }
797
- catch {
798
- prep = null;
998
+ catch (error) {
999
+ if (error instanceof DeliveryGuardError) {
1000
+ const written = error.inputWritten === true;
1001
+ const attempted = error.inputAttempted === true;
1002
+ prep = { ok: false, sent: written, reason: error.code,
1003
+ inputPhase: written ? "written" : attempted ? "attempted" : "not_reached" };
1004
+ }
1005
+ else
1006
+ prep = null;
799
1007
  }
800
- const notSent = prep?.outcome === "retained"
801
- || ["target_needs_input", "session_missing", "typing_guard_enabled", "mid_work", "tmux_unavailable"].includes(prep?.reason ?? "")
802
- || (prep?.sent === false && ["target_runtime_not_running", "target_runtime_unverified", "target_runtime_conflict", "transport_unavailable"].includes(prep.reason ?? ""));
1008
+ const writeAttempted = prep?.inputPhase === "attempted" || prep?.inputPhase === "written" || prep?.sent === true;
1009
+ // `not_reached` is a positive pre-input result: a guard refusal before any write, such as a draft hold.
1010
+ const notSent = !writeAttempted && (prep?.outcome === "retained" || prep?.inputPhase === "not_reached"
1011
+ || ["preparation_stopped", "terminal_policy_refused", "terminal_policy_unavailable", "target_needs_input", "session_missing", "typing_guard_enabled", "mid_work", "tmux_unavailable"].includes(prep?.reason ?? "")
1012
+ || (prep?.sent === false && ["target_runtime_not_running", "target_runtime_unverified", "target_runtime_conflict", "transport_unavailable"].includes(prep.reason ?? "")));
803
1013
  // Record this attempt's effect even if cancellation/retry happened during the await.
804
1014
  // Neither a failed response nor its loss proves no paste/Enter. Never replay uncertainty.
805
1015
  attempt.delivery = prep?.ok && prep.outcome !== "retained" ? "delivered" : notSent ? "not_sent" : "uncertain";
1016
+ this.persist(input.sessionName, attempt.attemptId, { delivery: attempt.delivery, sends: attempt.sends });
806
1017
  if (this.pendingPreCompactPrep.get(input.sessionName) !== attempt || attempt.controller.signal.aborted)
807
1018
  return;
808
1019
  if (notSent) {
@@ -813,23 +1024,43 @@ export class ClaudeCompactionEnforcer {
813
1024
  }
814
1025
  if (attempt.mode === "automatic")
815
1026
  attempt.deadlineAt = this.now() + AUTO_PREP_WAIT_MS_DEFAULT;
1027
+ this.persist(input.sessionName, attempt.attemptId, { deadlineAt: attempt.deadlineAt });
816
1028
  this.reconcilePreparations();
817
1029
  }
818
1030
  async sendPreparedCompact(input, attempt, skipMap) {
819
1031
  const check = () => {
820
1032
  this.reconcilePreparations();
1033
+ this.checkAttemptPolicy(input, attempt);
821
1034
  if (this.pendingPreCompactPrep.get(input.sessionName) !== attempt || attempt.status !== "waiting" || attempt.controller.signal.aborted)
822
1035
  throw new DeliveryGuardError(attempt.reason ?? "preparation_stopped", "Compaction preparation ended; no further input is authorized.");
823
1036
  if (!skipMap && !this.mapReady(attempt, true))
824
1037
  throw new DeliveryGuardError("preparation_incomplete", "This attempt's restore map is incomplete; /compact was not submitted.");
825
1038
  };
826
1039
  const composed = composeManagedCompactCommand({ compactInstruction: attempt.compactInstruction, mapPath: skipMap ? null : attempt.mapPath });
1040
+ // Whatever the command could not carry, the restore request carries instead. An explicitly
1041
+ // selected preparation root also keeps its exact map in that request, even when the command fit it.
1042
+ const carry = skipMap || attempt.preparationRoot !== null || !composed.mapPathInCommand || !composed.instructionInCommand ? {
1043
+ mapPath: !skipMap && (attempt.preparationRoot !== null || !composed.mapPathInCommand) ? attempt.mapPath : null,
1044
+ compactInstruction: composed.instructionInCommand ? null : attempt.compactInstruction,
1045
+ ...(skipMap ? { skipMap: { mapPath: attempt.mapPath, marker: attempt.marker } } : {}),
1046
+ } : undefined;
1047
+ const operatorInitiated = this.manualCompactionState.get(input.sessionName)?.operatorInitiated;
1048
+ let marked = false;
1049
+ // At the write, after the final checks: from here a restart treats /compact as possibly sent, and keeps what its
1050
+ // restore request needs (the carried map and instruction, and a manual request's authority).
1051
+ const beforeWrite = () => {
1052
+ check();
1053
+ if (!marked) {
1054
+ marked = true;
1055
+ this.persist(input.sessionName, attempt.attemptId, { compactSending: true, restoreCarry: carry, operatorInitiated });
1056
+ }
1057
+ };
827
1058
  const send = async () => {
828
1059
  check();
829
1060
  // Both paths send only to an idle seat, with the same idle wait, bounded by the attempt's existing
830
1061
  // deadline. (The automatic path used to send into a seat still finishing its preparation turn.)
831
1062
  // Idle comes from a live pane read: the newest hook can predate the rest of the preparation turn.
832
- return this.sessionTransport.send(input.sessionName, composed.command, { beforeWrite: check, ...(attempt.deadlineAt !== null ? { waitForIdleMs: Math.max(1, Math.min(this.compactSendIdleWaitMs, attempt.deadlineAt - this.now())), readinessFromPaneOnly: true } : {}) });
1063
+ return this.sessionTransport.send(input.sessionName, composed.command, { openrigNotice: true, beforeWrite, ...(attempt.deadlineAt !== null ? { waitForIdleMs: Math.max(1, Math.min(this.compactSendIdleWaitMs, attempt.deadlineAt - this.now())), readinessFromPaneOnly: true } : {}) });
833
1064
  };
834
1065
  let result;
835
1066
  let guardRefused = false;
@@ -852,13 +1083,25 @@ export class ClaudeCompactionEnforcer {
852
1083
  // Nothing sent: a guard refusal before input, a retained send, or the transport's explicit sent:false
853
1084
  // for a send that never reached its write.
854
1085
  const notSent = !writeAttempted && (guardRefused || result.outcome === "retained" || result.sent === false);
1086
+ if (notSent && marked)
1087
+ this.persist(input.sessionName, attempt.attemptId, { compactSending: undefined });
855
1088
  // Only a known pre-input idle deferral keeps the automatic attempt armed for a later poll; the transport
856
1089
  // marks those `not_reached`. reconcilePreparations still ends it at the deadline or on an occupant change.
857
- if (attempt.mode === "automatic" && notSent && phase === "not_reached") {
1090
+ // A typing-guard draft hold (`draft_*`) is `not_reached` too, but it is a refusal, not an idle wait: it stops
1091
+ // as not sent, and a fresh attempt may begin after the retry cooldown.
1092
+ const draftHold = typeof result.reason === "string" && result.reason.startsWith("draft_");
1093
+ if (attempt.mode === "automatic" && notSent && phase === "not_reached" && !draftHold) {
858
1094
  return { ok: false, reason: "waiting_for_idle" };
859
1095
  }
860
1096
  // A compact may have been sent despite a lost result. Never replay automatically.
861
1097
  attempt.compact = notSent ? "not_sent" : "uncertain";
1098
+ // It may have run, so its restore steps are owed, as after a submitted /compact; the restore request tells a seat that
1099
+ // didn't compact to say so and skip. Not when the attempt was cancelled, stopped or replaced during the send.
1100
+ if (!notSent && !attempt.controller.signal.aborted && this.pendingPreCompactPrep.get(input.sessionName) === attempt) {
1101
+ this.owePostCompactRestore(input.sessionName, attempt, carry);
1102
+ this.afterUncertainCompact.add(input.sessionName);
1103
+ this.persist(input.sessionName, attempt.attemptId, { restoreCarry: carry, operatorInitiated, uncertainCompact: true });
1104
+ }
862
1105
  const reason = attempt.reason ?? result.reason ?? "delivery_uncertain";
863
1106
  this.stopPreparation(input.sessionName, reason, attempt);
864
1107
  return { ok: false, reason };
@@ -866,23 +1109,34 @@ export class ClaudeCompactionEnforcer {
866
1109
  attempt.compact = "submitted_unconfirmed";
867
1110
  if (attempt.controller.signal.aborted)
868
1111
  return { ok: false, reason: attempt.reason };
869
- // Whatever the command could not carry, the restore request carries instead.
870
- if (skipMap || !composed.mapPathInCommand || !composed.instructionInCommand) {
871
- this.restoreCarry.set(input.sessionName, {
872
- mapPath: !skipMap && !composed.mapPathInCommand ? attempt.mapPath : null,
873
- compactInstruction: composed.instructionInCommand ? null : attempt.compactInstruction,
874
- ...(skipMap ? { skipMap: { mapPath: attempt.mapPath, marker: attempt.marker } } : {}),
875
- });
876
- }
877
- else
878
- this.restoreCarry.delete(input.sessionName);
879
1112
  attempt.status = "compact-sent";
880
- this.lastAutoCompactAt.set(input.sessionName, this.now());
881
- this.triggeredAboveThreshold.add(input.sessionName);
882
- this.pendingPostCompactRestore.set(input.sessionName, "turn_boundary");
883
- this.pendingStageGeneration.set(input.sessionName, attempt.occupantGeneration);
1113
+ this.owePostCompactRestore(input.sessionName, attempt, carry);
1114
+ this.persist(input.sessionName, attempt.attemptId, { phase: "turn_boundary", restoreCarry: carry, operatorInitiated });
884
1115
  return { ok: true };
885
1116
  }
1117
+ /** What the seat's input box holds now, as `rig capture --json` reads it (`empty`, `likely-suggestion`, `typed`, ...), or
1118
+ * why it couldn't be read. Never throws. */
1119
+ async inputBoxStatus(sessionName) {
1120
+ try {
1121
+ const capture = await this.sessionTransport.capture(sessionName, { inputBox: true });
1122
+ return capture.inputBox?.status ?? capture.reason ?? "unknown";
1123
+ }
1124
+ catch {
1125
+ return "unknown";
1126
+ }
1127
+ }
1128
+ /** /compact was submitted, or may have been: its restore steps are owed next, and no new automatic compaction starts
1129
+ * until they finish. */
1130
+ owePostCompactRestore(sessionName, attempt, carry) {
1131
+ if (carry)
1132
+ this.restoreCarry.set(sessionName, carry);
1133
+ else
1134
+ this.restoreCarry.delete(sessionName);
1135
+ this.lastAutoCompactAt.set(sessionName, this.now());
1136
+ this.triggeredAboveThreshold.add(sessionName);
1137
+ this.pendingPostCompactRestore.set(sessionName, "turn_boundary");
1138
+ this.pendingStageGeneration.set(sessionName, attempt.occupantGeneration);
1139
+ }
886
1140
  /** The map the restore request names. With --skip-map: a map the seat completed at the attempt path
887
1141
  * anyway, or a plain statement that none was required. Nothing publishes the .tmp under --skip-map, so
888
1142
  * the final path is checked first, then the .tmp, and whichever ends with the marker is named. */
@@ -921,6 +1175,134 @@ export class ClaudeCompactionEnforcer {
921
1175
  attempt.policyWasEnabled = true;
922
1176
  }
923
1177
  }
1178
+ /** Start the record for a new attempt, beside its map. */
1179
+ startRecord(sessionName, attempt) {
1180
+ this.records.set(sessionName, { file: path.join(path.dirname(attempt.mapPath), COMPACTION_RECORD_FILE), record: {
1181
+ daemon: this.daemonInstance, attemptId: attempt.attemptId, session: sessionName, occupantGeneration: attempt.occupantGeneration, mode: attempt.mode,
1182
+ phase: "preparing", delivery: attempt.delivery, deadlineAt: attempt.deadlineAt, sends: attempt.sends,
1183
+ mapPath: attempt.mapPath, marker: attempt.marker, compactInstruction: attempt.compactInstruction,
1184
+ preparationRoot: attempt.preparationRoot, updatedAt: this.now(),
1185
+ } });
1186
+ this.persist(sessionName, attempt.attemptId, {});
1187
+ }
1188
+ /** Record what this daemon just did for the seat's current attempt. Best-effort: a record that can't be written
1189
+ * leaves the attempt as it was before records existed, not picked up after a restart. */
1190
+ persist(sessionName, attemptId, patch) {
1191
+ const current = this.records.get(sessionName);
1192
+ if (!current || current.record.attemptId !== attemptId)
1193
+ return;
1194
+ current.record = { ...current.record, ...patch, daemon: this.daemonInstance, updatedAt: this.now() };
1195
+ const temporary = `${current.file}.${process.pid}.tmp`;
1196
+ try {
1197
+ fs.writeFileSync(temporary, `${JSON.stringify(current.record)}\n`, { mode: 0o600 });
1198
+ fs.renameSync(temporary, current.file);
1199
+ }
1200
+ catch {
1201
+ try {
1202
+ fs.rmSync(temporary, { force: true });
1203
+ }
1204
+ catch { /* nothing to clean */ }
1205
+ }
1206
+ }
1207
+ persistStage(sessionName, phase) {
1208
+ const current = this.records.get(sessionName);
1209
+ if (current)
1210
+ this.persist(sessionName, current.record.attemptId, { phase });
1211
+ }
1212
+ /**
1213
+ * After a daemon restart, pick up the seat's managed compaction from the record beside its newest attempt, when an
1214
+ * earlier daemon process wrote it. This runs once per seat, and only when this daemon holds nothing for that seat.
1215
+ * - An owed post-compact stage (turn boundary, restore, audit) is resumed, and so is the restore after a /compact that
1216
+ * was being sent or whose outcome was lost.
1217
+ * - An automatic preparation is waited on rather than begun again. A prompt whose delivery wasn't recorded may have
1218
+ * reached the seat, so it is never sent again.
1219
+ * - A manual preparation stops, because its caller is gone.
1220
+ * A record of another occupant, or in any other shape (see `readCompactionRecord`), is left alone. An open post-compact
1221
+ * record older than the recovery window isn't resumed; it reads as stranded, at the stage it owes.
1222
+ */
1223
+ recoverAfterRestart(input, preparationRoot) {
1224
+ const session = input.sessionName;
1225
+ if (input.runtime !== "claude-code" || this.recovered.has(session))
1226
+ return;
1227
+ this.recovered.add(session);
1228
+ if (this.pendingPreCompactPrep.has(session) || this.pendingPostCompactRestore.has(session))
1229
+ return;
1230
+ const key = sanitizeSessionKey(session);
1231
+ // The places beginPreparation puts an attempt: an explicit root, the seat's workspace, or the instance home.
1232
+ const dirs = new Set([
1233
+ ...(preparationRoot ? [path.join(preparationRoot, key)] : []),
1234
+ ...(input.cwd && path.isAbsolute(input.cwd) ? [path.join(input.cwd, ".openrig", "compaction", "preparation", key)] : []),
1235
+ path.join(this.openrigHome, "compaction", "preparation", key),
1236
+ ]);
1237
+ let newest = null;
1238
+ for (const dir of dirs) {
1239
+ let entries;
1240
+ try {
1241
+ entries = fs.readdirSync(dir);
1242
+ }
1243
+ catch {
1244
+ continue;
1245
+ }
1246
+ for (const entry of entries) {
1247
+ const file = path.join(dir, entry, COMPACTION_RECORD_FILE);
1248
+ const record = readCompactionRecord(file);
1249
+ if (record && record.session === session && record.attemptId === entry && (!newest || record.updatedAt > newest.record.updatedAt)) {
1250
+ newest = { file, record };
1251
+ }
1252
+ }
1253
+ }
1254
+ if (!newest)
1255
+ return;
1256
+ const { record } = newest;
1257
+ // This process's own record (another enforcer in it) is live state, not a predecessor's.
1258
+ if (record.daemon === this.daemonInstance || record.phase === "done" || record.phase === "ended")
1259
+ return;
1260
+ const live = this.resolveOccupantGeneration?.(session) ?? this.sessionTransport.deliveryGuard?.maybeTarget(session)?.occupant ?? null;
1261
+ if (record.occupantGeneration !== null && live !== null && live !== record.occupantGeneration)
1262
+ return;
1263
+ const stale = this.now() - record.updatedAt > this.restartRecoveryWindowMs;
1264
+ // A /compact whose send had begun, or whose outcome was lost, is never sent again; its restore steps are owed in case it
1265
+ // ran, each only into an empty input box. The restore request tells a seat that didn't compact to say so and skip.
1266
+ const phase = (record.phase === "preparing" && record.compactSending) || record.phase === "compact_uncertain" ? "turn_boundary" : record.phase;
1267
+ const inFlight = phase !== record.phase;
1268
+ if (phase === "preparing") {
1269
+ if (stale)
1270
+ return; // Its preparation deadline passed long ago; a fresh attempt may begin.
1271
+ this.records.set(session, newest);
1272
+ this.pendingPreCompactPrep.set(session, {
1273
+ policyActor: { source: "openrig" }, attemptId: record.attemptId, occupantGeneration: record.occupantGeneration,
1274
+ mapPath: record.mapPath, marker: record.marker, mode: record.mode,
1275
+ status: record.delivery === "not_sent" ? "sending" : "waiting",
1276
+ delivery: record.delivery === "pending" ? "uncertain" : record.delivery,
1277
+ compact: "not_sent", sends: record.sends,
1278
+ deadlineAt: record.deadlineAt ?? (record.delivery === "not_sent" ? null : record.updatedAt + AUTO_PREP_WAIT_MS_DEFAULT),
1279
+ policyWasEnabled: true, preparationRoot: record.preparationRoot, controller: new AbortController(),
1280
+ compactInstruction: record.compactInstruction,
1281
+ });
1282
+ if (record.mode === "manual")
1283
+ this.stopPreparation(session, "daemon_restarted");
1284
+ return;
1285
+ }
1286
+ if (stale) {
1287
+ this.stranded.set(session, { ...record, phase });
1288
+ return;
1289
+ }
1290
+ this.records.set(session, newest);
1291
+ this.pendingPostCompactRestore.set(session, phase);
1292
+ this.pendingStageGeneration.set(session, record.occupantGeneration);
1293
+ if (inFlight || record.uncertainCompact) {
1294
+ this.afterUncertainCompact.add(session);
1295
+ this.persist(session, record.attemptId, { uncertainCompact: true });
1296
+ }
1297
+ if (record.restoreCarry)
1298
+ this.restoreCarry.set(session, record.restoreCarry);
1299
+ // As after a /compact this daemon sent: no new automatic compaction until the owed stages finish.
1300
+ this.lastAutoCompactAt.set(session, this.now());
1301
+ this.triggeredAboveThreshold.add(session);
1302
+ if (record.mode === "manual") {
1303
+ this.setManualStage(session, phase === "compliance_prompt" ? "restore-sent" : "compact-sent", undefined, record.operatorInitiated);
1304
+ }
1305
+ }
924
1306
  stopPreparation(session, reason, expected) {
925
1307
  const attempt = this.pendingPreCompactPrep.get(session);
926
1308
  if ((expected && expected !== attempt) || !attempt || attempt.status === "stopped" || attempt.status === "compact-sent")
@@ -929,6 +1311,7 @@ export class ClaudeCompactionEnforcer {
929
1311
  attempt.reason = reason;
930
1312
  attempt.stoppedAt = this.now();
931
1313
  attempt.controller.abort();
1314
+ this.persist(session, attempt.attemptId, { phase: attempt.compact === "uncertain" ? "compact_uncertain" : "ended" });
932
1315
  if (attempt.mode === "manual")
933
1316
  this.setManualStage(session, "skipped-or-failed", reason);
934
1317
  }
@@ -945,13 +1328,20 @@ export class ClaudeCompactionEnforcer {
945
1328
  attempt.reason = "compaction_cancelled";
946
1329
  attempt.controller.abort();
947
1330
  }
1331
+ this.persistStage(session, "ended");
948
1332
  this.pendingPostCompactRestore.delete(session);
949
1333
  this.pendingStageGeneration.delete(session);
950
1334
  this.restoreCarry.delete(session);
1335
+ this.afterUncertainCompact.delete(session);
1336
+ this.lastInputBox.delete(session);
951
1337
  this.setManualStage(session, "cancelled", "compaction_cancelled");
952
1338
  }
953
- else
1339
+ else {
954
1340
  this.stopPreparation(session, "preparation_cancelled");
1341
+ // A cancel also ends an uncertain /compact's owed restore, so a restart doesn't resume it.
1342
+ if (attempt?.compact === "uncertain")
1343
+ this.persistStage(session, "ended");
1344
+ }
955
1345
  return this.getPreparationState(session);
956
1346
  }
957
1347
  getPreparationState(session) {
@@ -959,7 +1349,7 @@ export class ClaudeCompactionEnforcer {
959
1349
  const attempt = this.pendingPreCompactPrep.get(session);
960
1350
  if (!attempt)
961
1351
  return null;
962
- const { controller: _controller, sends: _sends, policyWasEnabled: _enabled, compactInstruction: _instruction, stoppedAt: _stoppedAt, cancelled: _cancelled, ...state } = attempt;
1352
+ const { controller: _controller, sends: _sends, policyWasEnabled: _enabled, preparationRoot: _preparationRoot, compactInstruction: _instruction, stoppedAt: _stoppedAt, cancelled: _cancelled, ...state } = attempt;
963
1353
  return state;
964
1354
  }
965
1355
  /** OPR.0.4.3.14 — read the surfaced manual-trigger state for a seat (AC-3). */
@@ -976,6 +1366,11 @@ export class ClaudeCompactionEnforcer {
976
1366
  */
977
1367
  invalidateOccupant(sessionName) {
978
1368
  this.stopPreparation(sessionName, "stale_generation");
1369
+ this.persistStage(sessionName, "ended");
1370
+ this.records.delete(sessionName);
1371
+ this.stranded.delete(sessionName);
1372
+ this.afterUncertainCompact.delete(sessionName);
1373
+ this.lastInputBox.delete(sessionName);
979
1374
  this.lastAutoCompactAt.delete(sessionName);
980
1375
  this.postCompactRestoreCooldownUntil.delete(sessionName);
981
1376
  this.triggeredAboveThreshold.delete(sessionName);