@openrig/cli 0.5.8 → 0.5.10

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 (1083) hide show
  1. package/daemon/assets/claude-statusline-context.cjs +1 -0
  2. package/daemon/assets/plugins/openrig-core/README.md +1 -1
  3. package/daemon/assets/plugins/openrig-core/skills/agent-operated-software/SKILL.md +92 -0
  4. package/daemon/assets/plugins/openrig-core/skills/agent-operated-workflows/SKILL.md +79 -0
  5. package/daemon/assets/plugins/openrig-core/skills/forming-an-openrig-mental-model/SKILL.md +2 -2
  6. package/daemon/assets/plugins/openrig-core/skills/messaging-the-human/SKILL.md +48 -61
  7. package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +19 -5
  8. package/daemon/assets/plugins/openrig-core/skills/openrig-skills/SKILL.md +4 -2
  9. package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +37 -16
  10. package/daemon/assets/plugins/openrig-core/skills/software-for-agents/SKILL.md +11 -179
  11. package/daemon/context-packs/onboarding-width/manifest.yaml +1 -1
  12. package/daemon/context-packs/onboarding-width/public-what-you-can-do.md +88 -28
  13. package/daemon/context-packs/skills/agent-operated-software/SKILL.md +92 -0
  14. package/daemon/context-packs/skills/agent-operated-software/manifest.yaml +10 -0
  15. package/daemon/context-packs/skills/agent-operated-workflows/SKILL.md +79 -0
  16. package/daemon/context-packs/skills/agent-operated-workflows/manifest.yaml +10 -0
  17. package/daemon/context-packs/skills/applying-a-permission-policy/manifest.yaml +1 -1
  18. package/daemon/context-packs/skills/claude-compaction-restore/manifest.yaml +1 -1
  19. package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +1 -1
  20. package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/SKILL.md +21 -6
  21. package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +1 -1
  22. package/daemon/context-packs/skills/core/cross-host-rig-commands/manifest.yaml +1 -1
  23. package/daemon/context-packs/skills/core/human-in-the-loop/manifest.yaml +1 -1
  24. package/daemon/context-packs/skills/core/messaging-the-human/SKILL.md +48 -61
  25. package/daemon/context-packs/skills/core/messaging-the-human/manifest.yaml +3 -3
  26. package/daemon/context-packs/skills/core/openrig-architect/manifest.yaml +1 -1
  27. package/daemon/context-packs/skills/core/openrig-cmux/manifest.yaml +1 -1
  28. package/daemon/context-packs/skills/core/openrig-herdr/manifest.yaml +1 -1
  29. package/daemon/context-packs/skills/core/openrig-skills/SKILL.md +4 -2
  30. package/daemon/context-packs/skills/core/openrig-skills/manifest.yaml +1 -1
  31. package/daemon/context-packs/skills/core/openrig-upgrade/SKILL.md +81 -0
  32. package/daemon/context-packs/skills/core/openrig-upgrade/manifest.yaml +3 -1
  33. package/daemon/context-packs/skills/core/openrig-upgrade/scripts/migrate-telemetry-state-0.5.9.mjs +1419 -0
  34. package/daemon/context-packs/skills/core/rig-bundles-and-shareable-artifacts/manifest.yaml +1 -1
  35. package/daemon/context-packs/skills/core/rig-lifecycle/manifest.yaml +1 -1
  36. package/daemon/context-packs/skills/core/session-source-fork/manifest.yaml +1 -1
  37. package/daemon/context-packs/skills/core/specification-system/manifest.yaml +1 -1
  38. package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/manifest.yaml +1 -1
  39. package/daemon/context-packs/skills/core/watchdog/manifest.yaml +1 -1
  40. package/daemon/context-packs/skills/delegating-work/manifest.yaml +1 -1
  41. package/daemon/context-packs/skills/forming-an-openrig-mental-model/SKILL.md +2 -2
  42. package/daemon/context-packs/skills/forming-an-openrig-mental-model/manifest.yaml +1 -1
  43. package/daemon/context-packs/skills/loading-addressable-markdown/manifest.yaml +1 -1
  44. package/daemon/context-packs/skills/mission-slice-sop/SKILL.md +19 -5
  45. package/daemon/context-packs/skills/mission-slice-sop/manifest.yaml +1 -1
  46. package/daemon/context-packs/skills/openrig-operating-model/manifest.yaml +1 -1
  47. package/daemon/context-packs/skills/openrig-user/SKILL.md +37 -16
  48. package/daemon/context-packs/skills/openrig-user/manifest.yaml +1 -1
  49. package/daemon/context-packs/skills/orienting-to-an-inherited-seat/manifest.yaml +1 -1
  50. package/daemon/context-packs/skills/pm/backlog-capture/manifest.yaml +1 -1
  51. package/daemon/context-packs/skills/pm/context-builder/manifest.yaml +1 -1
  52. package/daemon/context-packs/skills/pm/exec-summary/manifest.yaml +1 -1
  53. package/daemon/context-packs/skills/pm/office-hours/manifest.yaml +1 -1
  54. package/daemon/context-packs/skills/pm/plan-review/manifest.yaml +1 -1
  55. package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +1 -1
  56. package/daemon/context-packs/skills/pm/ui-mockup/manifest.yaml +1 -1
  57. package/daemon/context-packs/skills/pods/development-team/SKILL.md +40 -139
  58. package/daemon/context-packs/skills/pods/development-team/manifest.yaml +3 -3
  59. package/daemon/context-packs/skills/pods/orchestration-team/SKILL.md +40 -60
  60. package/daemon/context-packs/skills/pods/orchestration-team/manifest.yaml +3 -3
  61. package/daemon/context-packs/skills/pods/oversight-team/manifest.yaml +1 -1
  62. package/daemon/context-packs/skills/pods/review-team/SKILL.md +34 -31
  63. package/daemon/context-packs/skills/pods/review-team/manifest.yaml +3 -3
  64. package/daemon/context-packs/skills/process/agent-browser/manifest.yaml +1 -1
  65. package/daemon/context-packs/skills/process/context-engineering/manifest.yaml +1 -1
  66. package/daemon/context-packs/skills/process/dogfood/manifest.yaml +1 -1
  67. package/daemon/context-packs/skills/process/frontend-design/manifest.yaml +1 -1
  68. package/daemon/context-packs/skills/process/systematic-debugging/manifest.yaml +1 -1
  69. package/daemon/context-packs/skills/process/test-driven-development/SKILL.md +6 -8
  70. package/daemon/context-packs/skills/process/test-driven-development/manifest.yaml +1 -1
  71. package/daemon/context-packs/skills/process/verification-before-completion/manifest.yaml +1 -1
  72. package/daemon/context-packs/skills/queue-handoff/manifest.yaml +1 -1
  73. package/daemon/context-packs/skills/refocusing/manifest.yaml +1 -1
  74. package/daemon/context-packs/skills/retiring-and-inheriting-a-seat/manifest.yaml +1 -1
  75. package/daemon/context-packs/skills/seat-continuity-and-handover/manifest.yaml +1 -1
  76. package/daemon/context-packs/skills/session-compaction-and-restore/manifest.yaml +1 -1
  77. package/daemon/context-packs/skills/software-for-agents/SKILL.md +11 -179
  78. package/daemon/context-packs/skills/software-for-agents/manifest.yaml +3 -3
  79. package/daemon/context-packs/world-example/manifest.yaml +1 -1
  80. package/daemon/context-packs/world-example/your-world.md +1 -1
  81. package/daemon/context-packs/world-public/build-your-world.md +19 -0
  82. package/daemon/context-packs/world-public/claims.yaml +5 -1
  83. package/daemon/context-packs/world-public/manifest.yaml +40 -1
  84. package/daemon/context-packs/world-public/verify-world.sh +25 -9
  85. package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
  86. package/daemon/dist/adapters/claude-code-adapter.js +4 -2
  87. package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
  88. package/daemon/dist/build-info.js +3 -3
  89. package/daemon/dist/db/all-migrations.d.ts +1 -1
  90. package/daemon/dist/db/all-migrations.d.ts.map +1 -1
  91. package/daemon/dist/db/all-migrations.js +3 -1
  92. package/daemon/dist/db/all-migrations.js.map +1 -1
  93. package/daemon/dist/db/migrations/046_seat_identity_verdicts.d.ts +8 -5
  94. package/daemon/dist/db/migrations/046_seat_identity_verdicts.d.ts.map +1 -1
  95. package/daemon/dist/db/migrations/046_seat_identity_verdicts.js +8 -5
  96. package/daemon/dist/db/migrations/046_seat_identity_verdicts.js.map +1 -1
  97. package/daemon/dist/db/migrations/079_workflow_lifecycle_parallel.d.ts +8 -0
  98. package/daemon/dist/db/migrations/079_workflow_lifecycle_parallel.d.ts.map +1 -0
  99. package/daemon/dist/db/migrations/079_workflow_lifecycle_parallel.js +50 -0
  100. package/daemon/dist/db/migrations/079_workflow_lifecycle_parallel.js.map +1 -0
  101. package/daemon/dist/domain/active-occupant.d.ts +6 -1
  102. package/daemon/dist/domain/active-occupant.d.ts.map +1 -1
  103. package/daemon/dist/domain/active-occupant.js +47 -0
  104. package/daemon/dist/domain/active-occupant.js.map +1 -1
  105. package/daemon/dist/domain/bootstrap-orchestrator.d.ts.map +1 -1
  106. package/daemon/dist/domain/bootstrap-orchestrator.js +8 -1
  107. package/daemon/dist/domain/bootstrap-orchestrator.js.map +1 -1
  108. package/daemon/dist/domain/bundle-context-packs-router.d.ts +3 -3
  109. package/daemon/dist/domain/bundle-context-packs-router.d.ts.map +1 -1
  110. package/daemon/dist/domain/bundle-skills-router.d.ts +3 -0
  111. package/daemon/dist/domain/bundle-skills-router.d.ts.map +1 -1
  112. package/daemon/dist/domain/bundle-skills-router.js +5 -1
  113. package/daemon/dist/domain/bundle-skills-router.js.map +1 -1
  114. package/daemon/dist/domain/claim-service.d.ts +2 -0
  115. package/daemon/dist/domain/claim-service.d.ts.map +1 -1
  116. package/daemon/dist/domain/claim-service.js +33 -12
  117. package/daemon/dist/domain/claim-service.js.map +1 -1
  118. package/daemon/dist/domain/context-packs/context-pack-library-service.d.ts.map +1 -1
  119. package/daemon/dist/domain/context-packs/context-pack-library-service.js +9 -1
  120. package/daemon/dist/domain/context-packs/context-pack-library-service.js.map +1 -1
  121. package/daemon/dist/domain/context-packs/context-pack-types.d.ts +25 -0
  122. package/daemon/dist/domain/context-packs/context-pack-types.d.ts.map +1 -1
  123. package/daemon/dist/domain/context-packs/context-pack-types.js +3 -1
  124. package/daemon/dist/domain/context-packs/context-pack-types.js.map +1 -1
  125. package/daemon/dist/domain/context-packs/manifest-parser.d.ts.map +1 -1
  126. package/daemon/dist/domain/context-packs/manifest-parser.js +143 -3
  127. package/daemon/dist/domain/context-packs/manifest-parser.js.map +1 -1
  128. package/daemon/dist/domain/context-packs/profile-composer.d.ts +22 -1
  129. package/daemon/dist/domain/context-packs/profile-composer.d.ts.map +1 -1
  130. package/daemon/dist/domain/context-packs/profile-composer.js +105 -40
  131. package/daemon/dist/domain/context-packs/profile-composer.js.map +1 -1
  132. package/daemon/dist/domain/context-usage-store.d.ts +4 -0
  133. package/daemon/dist/domain/context-usage-store.d.ts.map +1 -1
  134. package/daemon/dist/domain/context-usage-store.js +8 -4
  135. package/daemon/dist/domain/context-usage-store.js.map +1 -1
  136. package/daemon/dist/domain/crash-cart-conductor.d.ts +13 -0
  137. package/daemon/dist/domain/crash-cart-conductor.d.ts.map +1 -1
  138. package/daemon/dist/domain/crash-cart-conductor.js +3 -1
  139. package/daemon/dist/domain/crash-cart-conductor.js.map +1 -1
  140. package/daemon/dist/domain/execution-view.d.ts.map +1 -1
  141. package/daemon/dist/domain/execution-view.js +145 -16
  142. package/daemon/dist/domain/execution-view.js.map +1 -1
  143. package/daemon/dist/domain/gateway/channel-operations.d.ts +39 -0
  144. package/daemon/dist/domain/gateway/channel-operations.d.ts.map +1 -0
  145. package/daemon/dist/domain/gateway/channel-operations.js +35 -0
  146. package/daemon/dist/domain/gateway/channel-operations.js.map +1 -0
  147. package/daemon/dist/domain/gateway/gateway-subsystem.d.ts +3 -0
  148. package/daemon/dist/domain/gateway/gateway-subsystem.d.ts.map +1 -1
  149. package/daemon/dist/domain/gateway/gateway-subsystem.js +3 -0
  150. package/daemon/dist/domain/gateway/gateway-subsystem.js.map +1 -1
  151. package/daemon/dist/domain/gateway/human-readiness.d.ts +37 -0
  152. package/daemon/dist/domain/gateway/human-readiness.d.ts.map +1 -0
  153. package/daemon/dist/domain/gateway/human-readiness.js +44 -0
  154. package/daemon/dist/domain/gateway/human-readiness.js.map +1 -0
  155. package/daemon/dist/domain/gateway/human-registry.d.ts +2 -7
  156. package/daemon/dist/domain/gateway/human-registry.d.ts.map +1 -1
  157. package/daemon/dist/domain/gateway/human-registry.js +2 -7
  158. package/daemon/dist/domain/gateway/human-registry.js.map +1 -1
  159. package/daemon/dist/domain/gateway/slack/inbound.d.ts +16 -1
  160. package/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -1
  161. package/daemon/dist/domain/gateway/slack/inbound.js +35 -12
  162. package/daemon/dist/domain/gateway/slack/inbound.js.map +1 -1
  163. package/daemon/dist/domain/gateway/slack/queue-access.d.ts +1 -0
  164. package/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -1
  165. package/daemon/dist/domain/gateway/slack/queue-access.js +1 -0
  166. package/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -1
  167. package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts +18 -0
  168. package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
  169. package/daemon/dist/domain/gateway/slack/slack-subsystem.js +62 -8
  170. package/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -1
  171. package/daemon/dist/domain/gateway/slack/socket-inbound.d.ts +13 -0
  172. package/daemon/dist/domain/gateway/slack/socket-inbound.d.ts.map +1 -1
  173. package/daemon/dist/domain/gateway/slack/socket-inbound.js +59 -1
  174. package/daemon/dist/domain/gateway/slack/socket-inbound.js.map +1 -1
  175. package/daemon/dist/domain/gateway/slack/state-store.d.ts +21 -0
  176. package/daemon/dist/domain/gateway/slack/state-store.d.ts.map +1 -1
  177. package/daemon/dist/domain/gateway/slack/state-store.js +28 -1
  178. package/daemon/dist/domain/gateway/slack/state-store.js.map +1 -1
  179. package/daemon/dist/domain/gateway/slack/thread-routing.d.ts +2 -0
  180. package/daemon/dist/domain/gateway/slack/thread-routing.d.ts.map +1 -1
  181. package/daemon/dist/domain/gateway/slack/thread-routing.js +6 -1
  182. package/daemon/dist/domain/gateway/slack/thread-routing.js.map +1 -1
  183. package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts +4 -0
  184. package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts.map +1 -1
  185. package/daemon/dist/domain/gateway/slack/thread-seat-map.js +11 -0
  186. package/daemon/dist/domain/gateway/slack/thread-seat-map.js.map +1 -1
  187. package/daemon/dist/domain/health-checkpoints.d.ts +57 -0
  188. package/daemon/dist/domain/health-checkpoints.d.ts.map +1 -0
  189. package/daemon/dist/domain/health-checkpoints.js +198 -0
  190. package/daemon/dist/domain/health-checkpoints.js.map +1 -0
  191. package/daemon/dist/domain/health-context.d.ts +14 -0
  192. package/daemon/dist/domain/health-context.d.ts.map +1 -0
  193. package/daemon/dist/domain/health-context.js +93 -0
  194. package/daemon/dist/domain/health-context.js.map +1 -0
  195. package/daemon/dist/domain/health-detectors.d.ts +106 -0
  196. package/daemon/dist/domain/health-detectors.d.ts.map +1 -0
  197. package/daemon/dist/domain/health-detectors.js +392 -0
  198. package/daemon/dist/domain/health-detectors.js.map +1 -0
  199. package/daemon/dist/domain/health-diagnosis.d.ts +143 -0
  200. package/daemon/dist/domain/health-diagnosis.d.ts.map +1 -0
  201. package/daemon/dist/domain/health-diagnosis.js +249 -0
  202. package/daemon/dist/domain/health-diagnosis.js.map +1 -0
  203. package/daemon/dist/domain/health-passive-ceremony.d.ts +19 -0
  204. package/daemon/dist/domain/health-passive-ceremony.d.ts.map +1 -0
  205. package/daemon/dist/domain/health-passive-ceremony.js +234 -0
  206. package/daemon/dist/domain/health-passive-ceremony.js.map +1 -0
  207. package/daemon/dist/domain/health-policy.d.ts +45 -0
  208. package/daemon/dist/domain/health-policy.d.ts.map +1 -0
  209. package/daemon/dist/domain/health-policy.js +89 -0
  210. package/daemon/dist/domain/health-policy.js.map +1 -0
  211. package/daemon/dist/domain/health-projection.d.ts +237 -0
  212. package/daemon/dist/domain/health-projection.d.ts.map +1 -0
  213. package/daemon/dist/domain/health-projection.js +312 -0
  214. package/daemon/dist/domain/health-projection.js.map +1 -0
  215. package/daemon/dist/domain/instance-initialization.d.ts +25 -0
  216. package/daemon/dist/domain/instance-initialization.d.ts.map +1 -0
  217. package/daemon/dist/domain/instance-initialization.js +81 -0
  218. package/daemon/dist/domain/instance-initialization.js.map +1 -0
  219. package/daemon/dist/domain/lifecycle-manifest.d.ts +19 -0
  220. package/daemon/dist/domain/lifecycle-manifest.d.ts.map +1 -0
  221. package/daemon/dist/domain/lifecycle-manifest.js +73 -0
  222. package/daemon/dist/domain/lifecycle-manifest.js.map +1 -0
  223. package/daemon/dist/domain/mission-control/mission-control-read-layer.d.ts.map +1 -1
  224. package/daemon/dist/domain/mission-control/mission-control-read-layer.js +14 -11
  225. package/daemon/dist/domain/mission-control/mission-control-read-layer.js.map +1 -1
  226. package/daemon/dist/domain/model-divergence/current-generation-record.d.ts +36 -36
  227. package/daemon/dist/domain/model-divergence/current-generation-record.d.ts.map +1 -1
  228. package/daemon/dist/domain/model-divergence/current-generation-record.js +104 -135
  229. package/daemon/dist/domain/model-divergence/current-generation-record.js.map +1 -1
  230. package/daemon/dist/domain/native-process-lineage.d.ts +10 -0
  231. package/daemon/dist/domain/native-process-lineage.d.ts.map +1 -0
  232. package/daemon/dist/domain/native-process-lineage.js +86 -0
  233. package/daemon/dist/domain/native-process-lineage.js.map +1 -0
  234. package/daemon/dist/domain/native-resume-probe.js +12 -1
  235. package/daemon/dist/domain/native-resume-probe.js.map +1 -1
  236. package/daemon/dist/domain/node-inventory.d.ts +2 -0
  237. package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  238. package/daemon/dist/domain/node-inventory.js +4 -1
  239. package/daemon/dist/domain/node-inventory.js.map +1 -1
  240. package/daemon/dist/domain/node-launcher.d.ts +3 -0
  241. package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
  242. package/daemon/dist/domain/node-launcher.js +21 -8
  243. package/daemon/dist/domain/node-launcher.js.map +1 -1
  244. package/daemon/dist/domain/pane-binding-observation.d.ts +22 -0
  245. package/daemon/dist/domain/pane-binding-observation.d.ts.map +1 -0
  246. package/daemon/dist/domain/pane-binding-observation.js +54 -0
  247. package/daemon/dist/domain/pane-binding-observation.js.map +1 -0
  248. package/daemon/dist/domain/policies/parked-owner-consumer.js +1 -1
  249. package/daemon/dist/domain/policies/parked-owner-consumer.js.map +1 -1
  250. package/daemon/dist/domain/policies/workflow-keepalive.d.ts.map +1 -1
  251. package/daemon/dist/domain/policies/workflow-keepalive.js +16 -2
  252. package/daemon/dist/domain/policies/workflow-keepalive.js.map +1 -1
  253. package/daemon/dist/domain/profile-resolver.d.ts +12 -0
  254. package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
  255. package/daemon/dist/domain/profile-resolver.js +60 -0
  256. package/daemon/dist/domain/profile-resolver.js.map +1 -1
  257. package/daemon/dist/domain/project-lifecycle-compiler.d.ts +35 -0
  258. package/daemon/dist/domain/project-lifecycle-compiler.d.ts.map +1 -0
  259. package/daemon/dist/domain/project-lifecycle-compiler.js +219 -0
  260. package/daemon/dist/domain/project-lifecycle-compiler.js.map +1 -0
  261. package/daemon/dist/domain/provider/claude-usage-reader.d.ts +1 -1
  262. package/daemon/dist/domain/provider/claude-usage-reader.d.ts.map +1 -1
  263. package/daemon/dist/domain/provider/claude-usage-reader.js +28 -18
  264. package/daemon/dist/domain/provider/claude-usage-reader.js.map +1 -1
  265. package/daemon/dist/domain/queue-repository.d.ts +19 -1
  266. package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  267. package/daemon/dist/domain/queue-repository.js +66 -5
  268. package/daemon/dist/domain/queue-repository.js.map +1 -1
  269. package/daemon/dist/domain/queue-retention.d.ts +3 -4
  270. package/daemon/dist/domain/queue-retention.d.ts.map +1 -1
  271. package/daemon/dist/domain/queue-retention.js +5 -8
  272. package/daemon/dist/domain/queue-retention.js.map +1 -1
  273. package/daemon/dist/domain/queue-transition-log.d.ts +33 -0
  274. package/daemon/dist/domain/queue-transition-log.d.ts.map +1 -1
  275. package/daemon/dist/domain/queue-transition-log.js +152 -0
  276. package/daemon/dist/domain/queue-transition-log.js.map +1 -1
  277. package/daemon/dist/domain/queue-wait-backoff.d.ts +21 -0
  278. package/daemon/dist/domain/queue-wait-backoff.d.ts.map +1 -0
  279. package/daemon/dist/domain/queue-wait-backoff.js +96 -0
  280. package/daemon/dist/domain/queue-wait-backoff.js.map +1 -0
  281. package/daemon/dist/domain/queue-wake-repository.d.ts +1 -0
  282. package/daemon/dist/domain/queue-wake-repository.d.ts.map +1 -1
  283. package/daemon/dist/domain/queue-wake-repository.js +8 -3
  284. package/daemon/dist/domain/queue-wake-repository.js.map +1 -1
  285. package/daemon/dist/domain/restore-attempt-receipt.d.ts +34 -0
  286. package/daemon/dist/domain/restore-attempt-receipt.d.ts.map +1 -0
  287. package/daemon/dist/domain/restore-attempt-receipt.js +59 -0
  288. package/daemon/dist/domain/restore-attempt-receipt.js.map +1 -0
  289. package/daemon/dist/domain/restore-orchestrator.d.ts +57 -24
  290. package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
  291. package/daemon/dist/domain/restore-orchestrator.js +152 -26
  292. package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
  293. package/daemon/dist/domain/restore-topology.d.ts +14 -0
  294. package/daemon/dist/domain/restore-topology.d.ts.map +1 -0
  295. package/daemon/dist/domain/restore-topology.js +27 -0
  296. package/daemon/dist/domain/restore-topology.js.map +1 -0
  297. package/daemon/dist/domain/rig-lifecycle-service.d.ts.map +1 -1
  298. package/daemon/dist/domain/rig-lifecycle-service.js +9 -0
  299. package/daemon/dist/domain/rig-lifecycle-service.js.map +1 -1
  300. package/daemon/dist/domain/rigspec-instantiator.d.ts +19 -0
  301. package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  302. package/daemon/dist/domain/rigspec-instantiator.js +65 -1
  303. package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  304. package/daemon/dist/domain/rigspec-preflight.d.ts +8 -0
  305. package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
  306. package/daemon/dist/domain/rigspec-preflight.js +4 -0
  307. package/daemon/dist/domain/rigspec-preflight.js.map +1 -1
  308. package/daemon/dist/domain/seat-attention-reconciler.d.ts +23 -1
  309. package/daemon/dist/domain/seat-attention-reconciler.d.ts.map +1 -1
  310. package/daemon/dist/domain/seat-attention-reconciler.js +97 -46
  311. package/daemon/dist/domain/seat-attention-reconciler.js.map +1 -1
  312. package/daemon/dist/domain/seat-identity-reconciler.d.ts.map +1 -1
  313. package/daemon/dist/domain/seat-identity-reconciler.js +15 -6
  314. package/daemon/dist/domain/seat-identity-reconciler.js.map +1 -1
  315. package/daemon/dist/domain/seat-lifecycle-service.d.ts +47 -1
  316. package/daemon/dist/domain/seat-lifecycle-service.d.ts.map +1 -1
  317. package/daemon/dist/domain/seat-lifecycle-service.js +525 -29
  318. package/daemon/dist/domain/seat-lifecycle-service.js.map +1 -1
  319. package/daemon/dist/domain/session-registry.d.ts +8 -1
  320. package/daemon/dist/domain/session-registry.d.ts.map +1 -1
  321. package/daemon/dist/domain/session-registry.js +19 -0
  322. package/daemon/dist/domain/session-registry.js.map +1 -1
  323. package/daemon/dist/domain/skill-catalog.d.ts +81 -0
  324. package/daemon/dist/domain/skill-catalog.d.ts.map +1 -0
  325. package/daemon/dist/domain/skill-catalog.js +827 -0
  326. package/daemon/dist/domain/skill-catalog.js.map +1 -0
  327. package/daemon/dist/domain/skill-discovery.d.ts +3 -0
  328. package/daemon/dist/domain/skill-discovery.d.ts.map +1 -1
  329. package/daemon/dist/domain/skill-discovery.js +1 -1
  330. package/daemon/dist/domain/skill-discovery.js.map +1 -1
  331. package/daemon/dist/domain/snapshot-capture.d.ts +4 -1
  332. package/daemon/dist/domain/snapshot-capture.d.ts.map +1 -1
  333. package/daemon/dist/domain/snapshot-capture.js +38 -2
  334. package/daemon/dist/domain/snapshot-capture.js.map +1 -1
  335. package/daemon/dist/domain/snapshot-repository.d.ts +15 -1
  336. package/daemon/dist/domain/snapshot-repository.d.ts.map +1 -1
  337. package/daemon/dist/domain/snapshot-repository.js +103 -1
  338. package/daemon/dist/domain/snapshot-repository.js.map +1 -1
  339. package/daemon/dist/domain/startup-orchestrator.d.ts +2 -0
  340. package/daemon/dist/domain/startup-orchestrator.d.ts.map +1 -1
  341. package/daemon/dist/domain/startup-orchestrator.js +12 -0
  342. package/daemon/dist/domain/startup-orchestrator.js.map +1 -1
  343. package/daemon/dist/domain/system-world.d.ts +45 -0
  344. package/daemon/dist/domain/system-world.d.ts.map +1 -0
  345. package/daemon/dist/domain/system-world.js +123 -0
  346. package/daemon/dist/domain/system-world.js.map +1 -0
  347. package/daemon/dist/domain/telemetry-state-paths.d.ts +7 -0
  348. package/daemon/dist/domain/telemetry-state-paths.d.ts.map +1 -0
  349. package/daemon/dist/domain/telemetry-state-paths.js +20 -0
  350. package/daemon/dist/domain/telemetry-state-paths.js.map +1 -0
  351. package/daemon/dist/domain/types.d.ts +106 -4
  352. package/daemon/dist/domain/types.d.ts.map +1 -1
  353. package/daemon/dist/domain/types.js.map +1 -1
  354. package/daemon/dist/domain/user-settings/settings-store.d.ts +16 -3
  355. package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
  356. package/daemon/dist/domain/user-settings/settings-store.js +137 -41
  357. package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
  358. package/daemon/dist/domain/watchdog-jobs-repository.d.ts +2 -0
  359. package/daemon/dist/domain/watchdog-jobs-repository.d.ts.map +1 -1
  360. package/daemon/dist/domain/watchdog-jobs-repository.js +5 -0
  361. package/daemon/dist/domain/watchdog-jobs-repository.js.map +1 -1
  362. package/daemon/dist/domain/watchdog-policy-engine.d.ts +7 -23
  363. package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
  364. package/daemon/dist/domain/watchdog-policy-engine.js +44 -226
  365. package/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
  366. package/daemon/dist/domain/workflow-boot-sweep.d.ts.map +1 -1
  367. package/daemon/dist/domain/workflow-boot-sweep.js +20 -6
  368. package/daemon/dist/domain/workflow-boot-sweep.js.map +1 -1
  369. package/daemon/dist/domain/workflow-instance-store.d.ts +33 -1
  370. package/daemon/dist/domain/workflow-instance-store.d.ts.map +1 -1
  371. package/daemon/dist/domain/workflow-instance-store.js +127 -2
  372. package/daemon/dist/domain/workflow-instance-store.js.map +1 -1
  373. package/daemon/dist/domain/workflow-keepalive-arming.d.ts +7 -5
  374. package/daemon/dist/domain/workflow-keepalive-arming.d.ts.map +1 -1
  375. package/daemon/dist/domain/workflow-keepalive-arming.js +27 -16
  376. package/daemon/dist/domain/workflow-keepalive-arming.js.map +1 -1
  377. package/daemon/dist/domain/workflow-projector.d.ts +30 -2
  378. package/daemon/dist/domain/workflow-projector.d.ts.map +1 -1
  379. package/daemon/dist/domain/workflow-projector.js +375 -14
  380. package/daemon/dist/domain/workflow-projector.js.map +1 -1
  381. package/daemon/dist/domain/workflow-runtime.d.ts +62 -2
  382. package/daemon/dist/domain/workflow-runtime.d.ts.map +1 -1
  383. package/daemon/dist/domain/workflow-runtime.js +391 -28
  384. package/daemon/dist/domain/workflow-runtime.js.map +1 -1
  385. package/daemon/dist/domain/workflow-spec-cache.d.ts +10 -2
  386. package/daemon/dist/domain/workflow-spec-cache.d.ts.map +1 -1
  387. package/daemon/dist/domain/workflow-spec-cache.js +101 -0
  388. package/daemon/dist/domain/workflow-spec-cache.js.map +1 -1
  389. package/daemon/dist/domain/workflow-types.d.ts +46 -1
  390. package/daemon/dist/domain/workflow-types.d.ts.map +1 -1
  391. package/daemon/dist/domain/workflow-types.js.map +1 -1
  392. package/daemon/dist/domain/workflow-validator.d.ts.map +1 -1
  393. package/daemon/dist/domain/workflow-validator.js +38 -3
  394. package/daemon/dist/domain/workflow-validator.js.map +1 -1
  395. package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts +38 -9
  396. package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
  397. package/daemon/dist/domain/workspace/default-workspace-scaffold.js +93 -347
  398. package/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
  399. package/daemon/dist/gateway-human-registry-surface.d.ts +1 -0
  400. package/daemon/dist/gateway-human-registry-surface.d.ts.map +1 -1
  401. package/daemon/dist/gateway-human-registry-surface.js +1 -0
  402. package/daemon/dist/gateway-human-registry-surface.js.map +1 -1
  403. package/daemon/dist/gateway-slack-surface.d.ts +1 -0
  404. package/daemon/dist/gateway-slack-surface.d.ts.map +1 -1
  405. package/daemon/dist/gateway-slack-surface.js +1 -0
  406. package/daemon/dist/gateway-slack-surface.js.map +1 -1
  407. package/daemon/dist/health-detectors-surface.d.ts +2 -0
  408. package/daemon/dist/health-detectors-surface.d.ts.map +1 -0
  409. package/daemon/dist/health-detectors-surface.js +2 -0
  410. package/daemon/dist/health-detectors-surface.js.map +1 -0
  411. package/daemon/dist/health-projection-surface.d.ts +2 -0
  412. package/daemon/dist/health-projection-surface.d.ts.map +1 -0
  413. package/daemon/dist/health-projection-surface.js +2 -0
  414. package/daemon/dist/health-projection-surface.js.map +1 -0
  415. package/daemon/dist/index.d.ts.map +1 -1
  416. package/daemon/dist/index.js +15 -0
  417. package/daemon/dist/index.js.map +1 -1
  418. package/daemon/dist/instance-initialization-surface.d.ts +3 -0
  419. package/daemon/dist/instance-initialization-surface.d.ts.map +1 -0
  420. package/daemon/dist/instance-initialization-surface.js +3 -0
  421. package/daemon/dist/instance-initialization-surface.js.map +1 -0
  422. package/daemon/dist/lib/pane-envelope.d.ts.map +1 -1
  423. package/daemon/dist/lib/pane-envelope.js +4 -1
  424. package/daemon/dist/lib/pane-envelope.js.map +1 -1
  425. package/daemon/dist/project-lifecycle-surface.d.ts +3 -0
  426. package/daemon/dist/project-lifecycle-surface.d.ts.map +1 -0
  427. package/daemon/dist/project-lifecycle-surface.js +3 -0
  428. package/daemon/dist/project-lifecycle-surface.js.map +1 -0
  429. package/daemon/dist/routes/bundles.js +10 -9
  430. package/daemon/dist/routes/bundles.js.map +1 -1
  431. package/daemon/dist/routes/config.d.ts.map +1 -1
  432. package/daemon/dist/routes/config.js +27 -49
  433. package/daemon/dist/routes/config.js.map +1 -1
  434. package/daemon/dist/routes/context-packs.d.ts.map +1 -1
  435. package/daemon/dist/routes/context-packs.js +114 -16
  436. package/daemon/dist/routes/context-packs.js.map +1 -1
  437. package/daemon/dist/routes/crash-cart.js +3 -0
  438. package/daemon/dist/routes/crash-cart.js.map +1 -1
  439. package/daemon/dist/routes/gateway.d.ts +5 -1
  440. package/daemon/dist/routes/gateway.d.ts.map +1 -1
  441. package/daemon/dist/routes/gateway.js +70 -22
  442. package/daemon/dist/routes/gateway.js.map +1 -1
  443. package/daemon/dist/routes/health-diagnosis.d.ts +3 -0
  444. package/daemon/dist/routes/health-diagnosis.d.ts.map +1 -0
  445. package/daemon/dist/routes/health-diagnosis.js +47 -0
  446. package/daemon/dist/routes/health-diagnosis.js.map +1 -0
  447. package/daemon/dist/routes/health.d.ts +3 -0
  448. package/daemon/dist/routes/health.d.ts.map +1 -0
  449. package/daemon/dist/routes/health.js +50 -0
  450. package/daemon/dist/routes/health.js.map +1 -0
  451. package/daemon/dist/routes/hosts.d.ts +2 -0
  452. package/daemon/dist/routes/hosts.d.ts.map +1 -1
  453. package/daemon/dist/routes/hosts.js +12 -5
  454. package/daemon/dist/routes/hosts.js.map +1 -1
  455. package/daemon/dist/routes/queue.d.ts.map +1 -1
  456. package/daemon/dist/routes/queue.js +20 -0
  457. package/daemon/dist/routes/queue.js.map +1 -1
  458. package/daemon/dist/routes/rigs.js +12 -1
  459. package/daemon/dist/routes/rigs.js.map +1 -1
  460. package/daemon/dist/routes/rigspec.js +9 -2
  461. package/daemon/dist/routes/rigspec.js.map +1 -1
  462. package/daemon/dist/routes/seat.js +21 -1
  463. package/daemon/dist/routes/seat.js.map +1 -1
  464. package/daemon/dist/routes/sessions.js +16 -6
  465. package/daemon/dist/routes/sessions.js.map +1 -1
  466. package/daemon/dist/routes/snapshots.d.ts.map +1 -1
  467. package/daemon/dist/routes/snapshots.js +41 -3
  468. package/daemon/dist/routes/snapshots.js.map +1 -1
  469. package/daemon/dist/routes/up.js +12 -1
  470. package/daemon/dist/routes/up.js.map +1 -1
  471. package/daemon/dist/routes/watchdog.d.ts.map +1 -1
  472. package/daemon/dist/routes/watchdog.js +7 -6
  473. package/daemon/dist/routes/watchdog.js.map +1 -1
  474. package/daemon/dist/routes/workflow.d.ts.map +1 -1
  475. package/daemon/dist/routes/workflow.js +104 -39
  476. package/daemon/dist/routes/workflow.js.map +1 -1
  477. package/daemon/dist/server.d.ts +10 -0
  478. package/daemon/dist/server.d.ts.map +1 -1
  479. package/daemon/dist/server.js +9 -0
  480. package/daemon/dist/server.js.map +1 -1
  481. package/daemon/dist/skill-loadout-surface.d.ts +3 -0
  482. package/daemon/dist/skill-loadout-surface.d.ts.map +1 -0
  483. package/daemon/dist/skill-loadout-surface.js +2 -0
  484. package/daemon/dist/skill-loadout-surface.js.map +1 -0
  485. package/daemon/dist/startup.d.ts.map +1 -1
  486. package/daemon/dist/startup.js +101 -66
  487. package/daemon/dist/startup.js.map +1 -1
  488. package/daemon/dist/system-world-surface.d.ts +2 -0
  489. package/daemon/dist/system-world-surface.d.ts.map +1 -0
  490. package/daemon/dist/system-world-surface.js +2 -0
  491. package/daemon/dist/system-world-surface.js.map +1 -0
  492. package/daemon/docs/reference/getting-started.md +2 -1
  493. package/daemon/docs/reference/health-diagnosis.md +305 -0
  494. package/daemon/docs/reference/instance-layout.md +106 -0
  495. package/daemon/docs/reference/mission-install.md +12 -2
  496. package/daemon/docs/reference/product-journey-sdlc.md +53 -15
  497. package/daemon/docs/reference/project-workspace.md +66 -40
  498. package/daemon/docs/reference/sdlc-conventions.md +6 -4
  499. package/daemon/specs/agents/development/implementer/agent.yaml +1 -9
  500. package/daemon/specs/agents/development/implementer/guidance/role.md +21 -43
  501. package/daemon/specs/agents/development/qa/agent.yaml +2 -11
  502. package/daemon/specs/agents/development/qa/guidance/role.md +21 -73
  503. package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +1 -9
  504. package/daemon/specs/agents/orchestration/orchestrator/guidance/role.md +25 -72
  505. package/daemon/specs/agents/review/independent-reviewer/agent.yaml +1 -9
  506. package/daemon/specs/agents/review/independent-reviewer/guidance/role.md +20 -35
  507. package/daemon/specs/agents/shared/skills/core/agent-startup-and-context-ingestion/SKILL.md +21 -6
  508. package/daemon/specs/agents/shared/skills/core/messaging-the-human/SKILL.md +48 -61
  509. package/daemon/specs/agents/shared/skills/core/openrig-skills/SKILL.md +4 -2
  510. package/daemon/specs/agents/shared/skills/core/openrig-upgrade/SKILL.md +81 -0
  511. package/daemon/specs/agents/shared/skills/core/openrig-upgrade/scripts/migrate-telemetry-state-0.5.9.mjs +1419 -0
  512. package/daemon/specs/agents/shared/skills/pods/development-team/SKILL.md +40 -139
  513. package/daemon/specs/agents/shared/skills/pods/orchestration-team/SKILL.md +40 -60
  514. package/daemon/specs/agents/shared/skills/pods/review-team/SKILL.md +34 -31
  515. package/daemon/specs/agents/shared/skills/process/test-driven-development/SKILL.md +6 -8
  516. package/daemon/specs/rigs/launch/demo/CULTURE.md +21 -30
  517. package/daemon/specs/rigs/launch/implementation-pair/rig.yaml +3 -3
  518. package/daemon/specs/rigs/preview/product-team/CULTURE.md +26 -71
  519. package/dist/build-info.js +3 -3
  520. package/dist/commands/config-init-workspace.d.ts +4 -23
  521. package/dist/commands/config-init-workspace.d.ts.map +1 -1
  522. package/dist/commands/config-init-workspace.js +14 -576
  523. package/dist/commands/config-init-workspace.js.map +1 -1
  524. package/dist/commands/config.d.ts.map +1 -1
  525. package/dist/commands/config.js +7 -4
  526. package/dist/commands/config.js.map +1 -1
  527. package/dist/commands/context.d.ts.map +1 -1
  528. package/dist/commands/context.js +114 -8
  529. package/dist/commands/context.js.map +1 -1
  530. package/dist/commands/daemon.d.ts.map +1 -1
  531. package/dist/commands/daemon.js +16 -0
  532. package/dist/commands/daemon.js.map +1 -1
  533. package/dist/commands/gateway.d.ts +17 -0
  534. package/dist/commands/gateway.d.ts.map +1 -1
  535. package/dist/commands/gateway.js +99 -13
  536. package/dist/commands/gateway.js.map +1 -1
  537. package/dist/commands/health.d.ts +12 -0
  538. package/dist/commands/health.d.ts.map +1 -0
  539. package/dist/commands/health.js +351 -0
  540. package/dist/commands/health.js.map +1 -0
  541. package/dist/commands/host.d.ts.map +1 -1
  542. package/dist/commands/host.js +2 -0
  543. package/dist/commands/host.js.map +1 -1
  544. package/dist/commands/launch.d.ts.map +1 -1
  545. package/dist/commands/launch.js +51 -4
  546. package/dist/commands/launch.js.map +1 -1
  547. package/dist/commands/queue.d.ts +18 -0
  548. package/dist/commands/queue.d.ts.map +1 -1
  549. package/dist/commands/queue.js +62 -0
  550. package/dist/commands/queue.js.map +1 -1
  551. package/dist/commands/restore.d.ts.map +1 -1
  552. package/dist/commands/restore.js +43 -3
  553. package/dist/commands/restore.js.map +1 -1
  554. package/dist/commands/scope.d.ts.map +1 -1
  555. package/dist/commands/scope.js +169 -79
  556. package/dist/commands/scope.js.map +1 -1
  557. package/dist/commands/seat.d.ts.map +1 -1
  558. package/dist/commands/seat.js +30 -0
  559. package/dist/commands/seat.js.map +1 -1
  560. package/dist/commands/send.d.ts.map +1 -1
  561. package/dist/commands/send.js +4 -1
  562. package/dist/commands/send.js.map +1 -1
  563. package/dist/commands/skill.d.ts.map +1 -1
  564. package/dist/commands/skill.js +61 -0
  565. package/dist/commands/skill.js.map +1 -1
  566. package/dist/commands/slack.d.ts.map +1 -1
  567. package/dist/commands/slack.js +39 -11
  568. package/dist/commands/slack.js.map +1 -1
  569. package/dist/commands/snapshot.d.ts.map +1 -1
  570. package/dist/commands/snapshot.js +4 -2
  571. package/dist/commands/snapshot.js.map +1 -1
  572. package/dist/commands/start.d.ts.map +1 -1
  573. package/dist/commands/start.js +3 -0
  574. package/dist/commands/start.js.map +1 -1
  575. package/dist/commands/up.d.ts.map +1 -1
  576. package/dist/commands/up.js +3 -0
  577. package/dist/commands/up.js.map +1 -1
  578. package/dist/commands/walk.d.ts.map +1 -1
  579. package/dist/commands/walk.js +3 -0
  580. package/dist/commands/walk.js.map +1 -1
  581. package/dist/commands/workflow-render.d.ts +31 -0
  582. package/dist/commands/workflow-render.d.ts.map +1 -1
  583. package/dist/commands/workflow-render.js +84 -6
  584. package/dist/commands/workflow-render.js.map +1 -1
  585. package/dist/commands/workflow.d.ts.map +1 -1
  586. package/dist/commands/workflow.js +98 -8
  587. package/dist/commands/workflow.js.map +1 -1
  588. package/dist/config-store.d.ts +17 -4
  589. package/dist/config-store.d.ts.map +1 -1
  590. package/dist/config-store.js +139 -44
  591. package/dist/config-store.js.map +1 -1
  592. package/dist/daemon-lifecycle.d.ts +13 -16
  593. package/dist/daemon-lifecycle.d.ts.map +1 -1
  594. package/dist/daemon-lifecycle.js +28 -33
  595. package/dist/daemon-lifecycle.js.map +1 -1
  596. package/dist/index.d.ts +4 -0
  597. package/dist/index.d.ts.map +1 -1
  598. package/dist/index.js +3 -1
  599. package/dist/index.js.map +1 -1
  600. package/dist/lib/scope/mission-composition.d.ts +16 -0
  601. package/dist/lib/scope/mission-composition.d.ts.map +1 -0
  602. package/dist/lib/scope/mission-composition.js +110 -0
  603. package/dist/lib/scope/mission-composition.js.map +1 -0
  604. package/dist/lib/scope/scope-fs.d.ts +5 -0
  605. package/dist/lib/scope/scope-fs.d.ts.map +1 -1
  606. package/dist/lib/scope/scope-fs.js +36 -6
  607. package/dist/lib/scope/scope-fs.js.map +1 -1
  608. package/dist/lib/work-install.d.ts +17 -0
  609. package/dist/lib/work-install.d.ts.map +1 -1
  610. package/dist/lib/work-install.js +49 -6
  611. package/dist/lib/work-install.js.map +1 -1
  612. package/node_modules/@openrig/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
  613. package/node_modules/@openrig/daemon/dist/adapters/claude-code-adapter.js +4 -2
  614. package/node_modules/@openrig/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
  615. package/node_modules/@openrig/daemon/dist/build-info.js +3 -3
  616. package/node_modules/@openrig/daemon/dist/db/all-migrations.d.ts +1 -1
  617. package/node_modules/@openrig/daemon/dist/db/all-migrations.d.ts.map +1 -1
  618. package/node_modules/@openrig/daemon/dist/db/all-migrations.js +3 -1
  619. package/node_modules/@openrig/daemon/dist/db/all-migrations.js.map +1 -1
  620. package/node_modules/@openrig/daemon/dist/db/migrations/046_seat_identity_verdicts.d.ts +8 -5
  621. package/node_modules/@openrig/daemon/dist/db/migrations/046_seat_identity_verdicts.d.ts.map +1 -1
  622. package/node_modules/@openrig/daemon/dist/db/migrations/046_seat_identity_verdicts.js +8 -5
  623. package/node_modules/@openrig/daemon/dist/db/migrations/046_seat_identity_verdicts.js.map +1 -1
  624. package/node_modules/@openrig/daemon/dist/db/migrations/079_workflow_lifecycle_parallel.d.ts +8 -0
  625. package/node_modules/@openrig/daemon/dist/db/migrations/079_workflow_lifecycle_parallel.d.ts.map +1 -0
  626. package/node_modules/@openrig/daemon/dist/db/migrations/079_workflow_lifecycle_parallel.js +50 -0
  627. package/node_modules/@openrig/daemon/dist/db/migrations/079_workflow_lifecycle_parallel.js.map +1 -0
  628. package/node_modules/@openrig/daemon/dist/domain/active-occupant.d.ts +6 -1
  629. package/node_modules/@openrig/daemon/dist/domain/active-occupant.d.ts.map +1 -1
  630. package/node_modules/@openrig/daemon/dist/domain/active-occupant.js +47 -0
  631. package/node_modules/@openrig/daemon/dist/domain/active-occupant.js.map +1 -1
  632. package/node_modules/@openrig/daemon/dist/domain/bootstrap-orchestrator.d.ts.map +1 -1
  633. package/node_modules/@openrig/daemon/dist/domain/bootstrap-orchestrator.js +8 -1
  634. package/node_modules/@openrig/daemon/dist/domain/bootstrap-orchestrator.js.map +1 -1
  635. package/node_modules/@openrig/daemon/dist/domain/bundle-context-packs-router.d.ts +3 -3
  636. package/node_modules/@openrig/daemon/dist/domain/bundle-context-packs-router.d.ts.map +1 -1
  637. package/node_modules/@openrig/daemon/dist/domain/bundle-skills-router.d.ts +3 -0
  638. package/node_modules/@openrig/daemon/dist/domain/bundle-skills-router.d.ts.map +1 -1
  639. package/node_modules/@openrig/daemon/dist/domain/bundle-skills-router.js +5 -1
  640. package/node_modules/@openrig/daemon/dist/domain/bundle-skills-router.js.map +1 -1
  641. package/node_modules/@openrig/daemon/dist/domain/claim-service.d.ts +2 -0
  642. package/node_modules/@openrig/daemon/dist/domain/claim-service.d.ts.map +1 -1
  643. package/node_modules/@openrig/daemon/dist/domain/claim-service.js +33 -12
  644. package/node_modules/@openrig/daemon/dist/domain/claim-service.js.map +1 -1
  645. package/node_modules/@openrig/daemon/dist/domain/context-packs/context-pack-library-service.d.ts.map +1 -1
  646. package/node_modules/@openrig/daemon/dist/domain/context-packs/context-pack-library-service.js +9 -1
  647. package/node_modules/@openrig/daemon/dist/domain/context-packs/context-pack-library-service.js.map +1 -1
  648. package/node_modules/@openrig/daemon/dist/domain/context-packs/context-pack-types.d.ts +25 -0
  649. package/node_modules/@openrig/daemon/dist/domain/context-packs/context-pack-types.d.ts.map +1 -1
  650. package/node_modules/@openrig/daemon/dist/domain/context-packs/context-pack-types.js +3 -1
  651. package/node_modules/@openrig/daemon/dist/domain/context-packs/context-pack-types.js.map +1 -1
  652. package/node_modules/@openrig/daemon/dist/domain/context-packs/manifest-parser.d.ts.map +1 -1
  653. package/node_modules/@openrig/daemon/dist/domain/context-packs/manifest-parser.js +143 -3
  654. package/node_modules/@openrig/daemon/dist/domain/context-packs/manifest-parser.js.map +1 -1
  655. package/node_modules/@openrig/daemon/dist/domain/context-packs/profile-composer.d.ts +22 -1
  656. package/node_modules/@openrig/daemon/dist/domain/context-packs/profile-composer.d.ts.map +1 -1
  657. package/node_modules/@openrig/daemon/dist/domain/context-packs/profile-composer.js +105 -40
  658. package/node_modules/@openrig/daemon/dist/domain/context-packs/profile-composer.js.map +1 -1
  659. package/node_modules/@openrig/daemon/dist/domain/context-usage-store.d.ts +4 -0
  660. package/node_modules/@openrig/daemon/dist/domain/context-usage-store.d.ts.map +1 -1
  661. package/node_modules/@openrig/daemon/dist/domain/context-usage-store.js +8 -4
  662. package/node_modules/@openrig/daemon/dist/domain/context-usage-store.js.map +1 -1
  663. package/node_modules/@openrig/daemon/dist/domain/crash-cart-conductor.d.ts +13 -0
  664. package/node_modules/@openrig/daemon/dist/domain/crash-cart-conductor.d.ts.map +1 -1
  665. package/node_modules/@openrig/daemon/dist/domain/crash-cart-conductor.js +3 -1
  666. package/node_modules/@openrig/daemon/dist/domain/crash-cart-conductor.js.map +1 -1
  667. package/node_modules/@openrig/daemon/dist/domain/execution-view.d.ts.map +1 -1
  668. package/node_modules/@openrig/daemon/dist/domain/execution-view.js +145 -16
  669. package/node_modules/@openrig/daemon/dist/domain/execution-view.js.map +1 -1
  670. package/node_modules/@openrig/daemon/dist/domain/gateway/channel-operations.d.ts +39 -0
  671. package/node_modules/@openrig/daemon/dist/domain/gateway/channel-operations.d.ts.map +1 -0
  672. package/node_modules/@openrig/daemon/dist/domain/gateway/channel-operations.js +35 -0
  673. package/node_modules/@openrig/daemon/dist/domain/gateway/channel-operations.js.map +1 -0
  674. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.d.ts +3 -0
  675. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.d.ts.map +1 -1
  676. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.js +3 -0
  677. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.js.map +1 -1
  678. package/node_modules/@openrig/daemon/dist/domain/gateway/human-readiness.d.ts +37 -0
  679. package/node_modules/@openrig/daemon/dist/domain/gateway/human-readiness.d.ts.map +1 -0
  680. package/node_modules/@openrig/daemon/dist/domain/gateway/human-readiness.js +44 -0
  681. package/node_modules/@openrig/daemon/dist/domain/gateway/human-readiness.js.map +1 -0
  682. package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.d.ts +2 -7
  683. package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.d.ts.map +1 -1
  684. package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.js +2 -7
  685. package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.js.map +1 -1
  686. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.d.ts +16 -1
  687. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -1
  688. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.js +35 -12
  689. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.js.map +1 -1
  690. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.d.ts +1 -0
  691. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -1
  692. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.js +1 -0
  693. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -1
  694. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts +18 -0
  695. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
  696. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.js +62 -8
  697. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -1
  698. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/socket-inbound.d.ts +13 -0
  699. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/socket-inbound.d.ts.map +1 -1
  700. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/socket-inbound.js +59 -1
  701. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/socket-inbound.js.map +1 -1
  702. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/state-store.d.ts +21 -0
  703. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/state-store.d.ts.map +1 -1
  704. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/state-store.js +28 -1
  705. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/state-store.js.map +1 -1
  706. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-routing.d.ts +2 -0
  707. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-routing.d.ts.map +1 -1
  708. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-routing.js +6 -1
  709. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-routing.js.map +1 -1
  710. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts +4 -0
  711. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts.map +1 -1
  712. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-seat-map.js +11 -0
  713. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-seat-map.js.map +1 -1
  714. package/node_modules/@openrig/daemon/dist/domain/health-checkpoints.d.ts +57 -0
  715. package/node_modules/@openrig/daemon/dist/domain/health-checkpoints.d.ts.map +1 -0
  716. package/node_modules/@openrig/daemon/dist/domain/health-checkpoints.js +198 -0
  717. package/node_modules/@openrig/daemon/dist/domain/health-checkpoints.js.map +1 -0
  718. package/node_modules/@openrig/daemon/dist/domain/health-context.d.ts +14 -0
  719. package/node_modules/@openrig/daemon/dist/domain/health-context.d.ts.map +1 -0
  720. package/node_modules/@openrig/daemon/dist/domain/health-context.js +93 -0
  721. package/node_modules/@openrig/daemon/dist/domain/health-context.js.map +1 -0
  722. package/node_modules/@openrig/daemon/dist/domain/health-detectors.d.ts +106 -0
  723. package/node_modules/@openrig/daemon/dist/domain/health-detectors.d.ts.map +1 -0
  724. package/node_modules/@openrig/daemon/dist/domain/health-detectors.js +392 -0
  725. package/node_modules/@openrig/daemon/dist/domain/health-detectors.js.map +1 -0
  726. package/node_modules/@openrig/daemon/dist/domain/health-diagnosis.d.ts +143 -0
  727. package/node_modules/@openrig/daemon/dist/domain/health-diagnosis.d.ts.map +1 -0
  728. package/node_modules/@openrig/daemon/dist/domain/health-diagnosis.js +249 -0
  729. package/node_modules/@openrig/daemon/dist/domain/health-diagnosis.js.map +1 -0
  730. package/node_modules/@openrig/daemon/dist/domain/health-passive-ceremony.d.ts +19 -0
  731. package/node_modules/@openrig/daemon/dist/domain/health-passive-ceremony.d.ts.map +1 -0
  732. package/node_modules/@openrig/daemon/dist/domain/health-passive-ceremony.js +234 -0
  733. package/node_modules/@openrig/daemon/dist/domain/health-passive-ceremony.js.map +1 -0
  734. package/node_modules/@openrig/daemon/dist/domain/health-policy.d.ts +45 -0
  735. package/node_modules/@openrig/daemon/dist/domain/health-policy.d.ts.map +1 -0
  736. package/node_modules/@openrig/daemon/dist/domain/health-policy.js +89 -0
  737. package/node_modules/@openrig/daemon/dist/domain/health-policy.js.map +1 -0
  738. package/node_modules/@openrig/daemon/dist/domain/health-projection.d.ts +237 -0
  739. package/node_modules/@openrig/daemon/dist/domain/health-projection.d.ts.map +1 -0
  740. package/node_modules/@openrig/daemon/dist/domain/health-projection.js +312 -0
  741. package/node_modules/@openrig/daemon/dist/domain/health-projection.js.map +1 -0
  742. package/node_modules/@openrig/daemon/dist/domain/instance-initialization.d.ts +25 -0
  743. package/node_modules/@openrig/daemon/dist/domain/instance-initialization.d.ts.map +1 -0
  744. package/node_modules/@openrig/daemon/dist/domain/instance-initialization.js +81 -0
  745. package/node_modules/@openrig/daemon/dist/domain/instance-initialization.js.map +1 -0
  746. package/node_modules/@openrig/daemon/dist/domain/lifecycle-manifest.d.ts +19 -0
  747. package/node_modules/@openrig/daemon/dist/domain/lifecycle-manifest.d.ts.map +1 -0
  748. package/node_modules/@openrig/daemon/dist/domain/lifecycle-manifest.js +73 -0
  749. package/node_modules/@openrig/daemon/dist/domain/lifecycle-manifest.js.map +1 -0
  750. package/node_modules/@openrig/daemon/dist/domain/mission-control/mission-control-read-layer.d.ts.map +1 -1
  751. package/node_modules/@openrig/daemon/dist/domain/mission-control/mission-control-read-layer.js +14 -11
  752. package/node_modules/@openrig/daemon/dist/domain/mission-control/mission-control-read-layer.js.map +1 -1
  753. package/node_modules/@openrig/daemon/dist/domain/model-divergence/current-generation-record.d.ts +36 -36
  754. package/node_modules/@openrig/daemon/dist/domain/model-divergence/current-generation-record.d.ts.map +1 -1
  755. package/node_modules/@openrig/daemon/dist/domain/model-divergence/current-generation-record.js +104 -135
  756. package/node_modules/@openrig/daemon/dist/domain/model-divergence/current-generation-record.js.map +1 -1
  757. package/node_modules/@openrig/daemon/dist/domain/native-process-lineage.d.ts +10 -0
  758. package/node_modules/@openrig/daemon/dist/domain/native-process-lineage.d.ts.map +1 -0
  759. package/node_modules/@openrig/daemon/dist/domain/native-process-lineage.js +86 -0
  760. package/node_modules/@openrig/daemon/dist/domain/native-process-lineage.js.map +1 -0
  761. package/node_modules/@openrig/daemon/dist/domain/native-resume-probe.js +12 -1
  762. package/node_modules/@openrig/daemon/dist/domain/native-resume-probe.js.map +1 -1
  763. package/node_modules/@openrig/daemon/dist/domain/node-inventory.d.ts +2 -0
  764. package/node_modules/@openrig/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  765. package/node_modules/@openrig/daemon/dist/domain/node-inventory.js +4 -1
  766. package/node_modules/@openrig/daemon/dist/domain/node-inventory.js.map +1 -1
  767. package/node_modules/@openrig/daemon/dist/domain/node-launcher.d.ts +3 -0
  768. package/node_modules/@openrig/daemon/dist/domain/node-launcher.d.ts.map +1 -1
  769. package/node_modules/@openrig/daemon/dist/domain/node-launcher.js +21 -8
  770. package/node_modules/@openrig/daemon/dist/domain/node-launcher.js.map +1 -1
  771. package/node_modules/@openrig/daemon/dist/domain/pane-binding-observation.d.ts +22 -0
  772. package/node_modules/@openrig/daemon/dist/domain/pane-binding-observation.d.ts.map +1 -0
  773. package/node_modules/@openrig/daemon/dist/domain/pane-binding-observation.js +54 -0
  774. package/node_modules/@openrig/daemon/dist/domain/pane-binding-observation.js.map +1 -0
  775. package/node_modules/@openrig/daemon/dist/domain/policies/parked-owner-consumer.js +1 -1
  776. package/node_modules/@openrig/daemon/dist/domain/policies/parked-owner-consumer.js.map +1 -1
  777. package/node_modules/@openrig/daemon/dist/domain/policies/workflow-keepalive.d.ts.map +1 -1
  778. package/node_modules/@openrig/daemon/dist/domain/policies/workflow-keepalive.js +16 -2
  779. package/node_modules/@openrig/daemon/dist/domain/policies/workflow-keepalive.js.map +1 -1
  780. package/node_modules/@openrig/daemon/dist/domain/profile-resolver.d.ts +12 -0
  781. package/node_modules/@openrig/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
  782. package/node_modules/@openrig/daemon/dist/domain/profile-resolver.js +60 -0
  783. package/node_modules/@openrig/daemon/dist/domain/profile-resolver.js.map +1 -1
  784. package/node_modules/@openrig/daemon/dist/domain/project-lifecycle-compiler.d.ts +35 -0
  785. package/node_modules/@openrig/daemon/dist/domain/project-lifecycle-compiler.d.ts.map +1 -0
  786. package/node_modules/@openrig/daemon/dist/domain/project-lifecycle-compiler.js +219 -0
  787. package/node_modules/@openrig/daemon/dist/domain/project-lifecycle-compiler.js.map +1 -0
  788. package/node_modules/@openrig/daemon/dist/domain/provider/claude-usage-reader.d.ts +1 -1
  789. package/node_modules/@openrig/daemon/dist/domain/provider/claude-usage-reader.d.ts.map +1 -1
  790. package/node_modules/@openrig/daemon/dist/domain/provider/claude-usage-reader.js +28 -18
  791. package/node_modules/@openrig/daemon/dist/domain/provider/claude-usage-reader.js.map +1 -1
  792. package/node_modules/@openrig/daemon/dist/domain/queue-repository.d.ts +19 -1
  793. package/node_modules/@openrig/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  794. package/node_modules/@openrig/daemon/dist/domain/queue-repository.js +66 -5
  795. package/node_modules/@openrig/daemon/dist/domain/queue-repository.js.map +1 -1
  796. package/node_modules/@openrig/daemon/dist/domain/queue-retention.d.ts +3 -4
  797. package/node_modules/@openrig/daemon/dist/domain/queue-retention.d.ts.map +1 -1
  798. package/node_modules/@openrig/daemon/dist/domain/queue-retention.js +5 -8
  799. package/node_modules/@openrig/daemon/dist/domain/queue-retention.js.map +1 -1
  800. package/node_modules/@openrig/daemon/dist/domain/queue-transition-log.d.ts +33 -0
  801. package/node_modules/@openrig/daemon/dist/domain/queue-transition-log.d.ts.map +1 -1
  802. package/node_modules/@openrig/daemon/dist/domain/queue-transition-log.js +152 -0
  803. package/node_modules/@openrig/daemon/dist/domain/queue-transition-log.js.map +1 -1
  804. package/node_modules/@openrig/daemon/dist/domain/queue-wait-backoff.d.ts +21 -0
  805. package/node_modules/@openrig/daemon/dist/domain/queue-wait-backoff.d.ts.map +1 -0
  806. package/node_modules/@openrig/daemon/dist/domain/queue-wait-backoff.js +96 -0
  807. package/node_modules/@openrig/daemon/dist/domain/queue-wait-backoff.js.map +1 -0
  808. package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.d.ts +1 -0
  809. package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.d.ts.map +1 -1
  810. package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.js +8 -3
  811. package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.js.map +1 -1
  812. package/node_modules/@openrig/daemon/dist/domain/restore-attempt-receipt.d.ts +34 -0
  813. package/node_modules/@openrig/daemon/dist/domain/restore-attempt-receipt.d.ts.map +1 -0
  814. package/node_modules/@openrig/daemon/dist/domain/restore-attempt-receipt.js +59 -0
  815. package/node_modules/@openrig/daemon/dist/domain/restore-attempt-receipt.js.map +1 -0
  816. package/node_modules/@openrig/daemon/dist/domain/restore-orchestrator.d.ts +57 -24
  817. package/node_modules/@openrig/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
  818. package/node_modules/@openrig/daemon/dist/domain/restore-orchestrator.js +152 -26
  819. package/node_modules/@openrig/daemon/dist/domain/restore-orchestrator.js.map +1 -1
  820. package/node_modules/@openrig/daemon/dist/domain/restore-topology.d.ts +14 -0
  821. package/node_modules/@openrig/daemon/dist/domain/restore-topology.d.ts.map +1 -0
  822. package/node_modules/@openrig/daemon/dist/domain/restore-topology.js +27 -0
  823. package/node_modules/@openrig/daemon/dist/domain/restore-topology.js.map +1 -0
  824. package/node_modules/@openrig/daemon/dist/domain/rig-lifecycle-service.d.ts.map +1 -1
  825. package/node_modules/@openrig/daemon/dist/domain/rig-lifecycle-service.js +9 -0
  826. package/node_modules/@openrig/daemon/dist/domain/rig-lifecycle-service.js.map +1 -1
  827. package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.d.ts +19 -0
  828. package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  829. package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.js +65 -1
  830. package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  831. package/node_modules/@openrig/daemon/dist/domain/rigspec-preflight.d.ts +8 -0
  832. package/node_modules/@openrig/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
  833. package/node_modules/@openrig/daemon/dist/domain/rigspec-preflight.js +4 -0
  834. package/node_modules/@openrig/daemon/dist/domain/rigspec-preflight.js.map +1 -1
  835. package/node_modules/@openrig/daemon/dist/domain/seat-attention-reconciler.d.ts +23 -1
  836. package/node_modules/@openrig/daemon/dist/domain/seat-attention-reconciler.d.ts.map +1 -1
  837. package/node_modules/@openrig/daemon/dist/domain/seat-attention-reconciler.js +97 -46
  838. package/node_modules/@openrig/daemon/dist/domain/seat-attention-reconciler.js.map +1 -1
  839. package/node_modules/@openrig/daemon/dist/domain/seat-identity-reconciler.d.ts.map +1 -1
  840. package/node_modules/@openrig/daemon/dist/domain/seat-identity-reconciler.js +15 -6
  841. package/node_modules/@openrig/daemon/dist/domain/seat-identity-reconciler.js.map +1 -1
  842. package/node_modules/@openrig/daemon/dist/domain/seat-lifecycle-service.d.ts +47 -1
  843. package/node_modules/@openrig/daemon/dist/domain/seat-lifecycle-service.d.ts.map +1 -1
  844. package/node_modules/@openrig/daemon/dist/domain/seat-lifecycle-service.js +525 -29
  845. package/node_modules/@openrig/daemon/dist/domain/seat-lifecycle-service.js.map +1 -1
  846. package/node_modules/@openrig/daemon/dist/domain/session-registry.d.ts +8 -1
  847. package/node_modules/@openrig/daemon/dist/domain/session-registry.d.ts.map +1 -1
  848. package/node_modules/@openrig/daemon/dist/domain/session-registry.js +19 -0
  849. package/node_modules/@openrig/daemon/dist/domain/session-registry.js.map +1 -1
  850. package/node_modules/@openrig/daemon/dist/domain/skill-catalog.d.ts +81 -0
  851. package/node_modules/@openrig/daemon/dist/domain/skill-catalog.d.ts.map +1 -0
  852. package/node_modules/@openrig/daemon/dist/domain/skill-catalog.js +827 -0
  853. package/node_modules/@openrig/daemon/dist/domain/skill-catalog.js.map +1 -0
  854. package/node_modules/@openrig/daemon/dist/domain/skill-discovery.d.ts +3 -0
  855. package/node_modules/@openrig/daemon/dist/domain/skill-discovery.d.ts.map +1 -1
  856. package/node_modules/@openrig/daemon/dist/domain/skill-discovery.js +1 -1
  857. package/node_modules/@openrig/daemon/dist/domain/skill-discovery.js.map +1 -1
  858. package/node_modules/@openrig/daemon/dist/domain/snapshot-capture.d.ts +4 -1
  859. package/node_modules/@openrig/daemon/dist/domain/snapshot-capture.d.ts.map +1 -1
  860. package/node_modules/@openrig/daemon/dist/domain/snapshot-capture.js +38 -2
  861. package/node_modules/@openrig/daemon/dist/domain/snapshot-capture.js.map +1 -1
  862. package/node_modules/@openrig/daemon/dist/domain/snapshot-repository.d.ts +15 -1
  863. package/node_modules/@openrig/daemon/dist/domain/snapshot-repository.d.ts.map +1 -1
  864. package/node_modules/@openrig/daemon/dist/domain/snapshot-repository.js +103 -1
  865. package/node_modules/@openrig/daemon/dist/domain/snapshot-repository.js.map +1 -1
  866. package/node_modules/@openrig/daemon/dist/domain/startup-orchestrator.d.ts +2 -0
  867. package/node_modules/@openrig/daemon/dist/domain/startup-orchestrator.d.ts.map +1 -1
  868. package/node_modules/@openrig/daemon/dist/domain/startup-orchestrator.js +12 -0
  869. package/node_modules/@openrig/daemon/dist/domain/startup-orchestrator.js.map +1 -1
  870. package/node_modules/@openrig/daemon/dist/domain/system-world.d.ts +45 -0
  871. package/node_modules/@openrig/daemon/dist/domain/system-world.d.ts.map +1 -0
  872. package/node_modules/@openrig/daemon/dist/domain/system-world.js +123 -0
  873. package/node_modules/@openrig/daemon/dist/domain/system-world.js.map +1 -0
  874. package/node_modules/@openrig/daemon/dist/domain/telemetry-state-paths.d.ts +7 -0
  875. package/node_modules/@openrig/daemon/dist/domain/telemetry-state-paths.d.ts.map +1 -0
  876. package/node_modules/@openrig/daemon/dist/domain/telemetry-state-paths.js +20 -0
  877. package/node_modules/@openrig/daemon/dist/domain/telemetry-state-paths.js.map +1 -0
  878. package/node_modules/@openrig/daemon/dist/domain/types.d.ts +106 -4
  879. package/node_modules/@openrig/daemon/dist/domain/types.d.ts.map +1 -1
  880. package/node_modules/@openrig/daemon/dist/domain/types.js.map +1 -1
  881. package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.d.ts +16 -3
  882. package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
  883. package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.js +137 -41
  884. package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
  885. package/node_modules/@openrig/daemon/dist/domain/watchdog-jobs-repository.d.ts +2 -0
  886. package/node_modules/@openrig/daemon/dist/domain/watchdog-jobs-repository.d.ts.map +1 -1
  887. package/node_modules/@openrig/daemon/dist/domain/watchdog-jobs-repository.js +5 -0
  888. package/node_modules/@openrig/daemon/dist/domain/watchdog-jobs-repository.js.map +1 -1
  889. package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.d.ts +7 -23
  890. package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
  891. package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.js +44 -226
  892. package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
  893. package/node_modules/@openrig/daemon/dist/domain/workflow-boot-sweep.d.ts.map +1 -1
  894. package/node_modules/@openrig/daemon/dist/domain/workflow-boot-sweep.js +20 -6
  895. package/node_modules/@openrig/daemon/dist/domain/workflow-boot-sweep.js.map +1 -1
  896. package/node_modules/@openrig/daemon/dist/domain/workflow-instance-store.d.ts +33 -1
  897. package/node_modules/@openrig/daemon/dist/domain/workflow-instance-store.d.ts.map +1 -1
  898. package/node_modules/@openrig/daemon/dist/domain/workflow-instance-store.js +127 -2
  899. package/node_modules/@openrig/daemon/dist/domain/workflow-instance-store.js.map +1 -1
  900. package/node_modules/@openrig/daemon/dist/domain/workflow-keepalive-arming.d.ts +7 -5
  901. package/node_modules/@openrig/daemon/dist/domain/workflow-keepalive-arming.d.ts.map +1 -1
  902. package/node_modules/@openrig/daemon/dist/domain/workflow-keepalive-arming.js +27 -16
  903. package/node_modules/@openrig/daemon/dist/domain/workflow-keepalive-arming.js.map +1 -1
  904. package/node_modules/@openrig/daemon/dist/domain/workflow-projector.d.ts +30 -2
  905. package/node_modules/@openrig/daemon/dist/domain/workflow-projector.d.ts.map +1 -1
  906. package/node_modules/@openrig/daemon/dist/domain/workflow-projector.js +375 -14
  907. package/node_modules/@openrig/daemon/dist/domain/workflow-projector.js.map +1 -1
  908. package/node_modules/@openrig/daemon/dist/domain/workflow-runtime.d.ts +62 -2
  909. package/node_modules/@openrig/daemon/dist/domain/workflow-runtime.d.ts.map +1 -1
  910. package/node_modules/@openrig/daemon/dist/domain/workflow-runtime.js +391 -28
  911. package/node_modules/@openrig/daemon/dist/domain/workflow-runtime.js.map +1 -1
  912. package/node_modules/@openrig/daemon/dist/domain/workflow-spec-cache.d.ts +10 -2
  913. package/node_modules/@openrig/daemon/dist/domain/workflow-spec-cache.d.ts.map +1 -1
  914. package/node_modules/@openrig/daemon/dist/domain/workflow-spec-cache.js +101 -0
  915. package/node_modules/@openrig/daemon/dist/domain/workflow-spec-cache.js.map +1 -1
  916. package/node_modules/@openrig/daemon/dist/domain/workflow-types.d.ts +46 -1
  917. package/node_modules/@openrig/daemon/dist/domain/workflow-types.d.ts.map +1 -1
  918. package/node_modules/@openrig/daemon/dist/domain/workflow-types.js.map +1 -1
  919. package/node_modules/@openrig/daemon/dist/domain/workflow-validator.d.ts.map +1 -1
  920. package/node_modules/@openrig/daemon/dist/domain/workflow-validator.js +38 -3
  921. package/node_modules/@openrig/daemon/dist/domain/workflow-validator.js.map +1 -1
  922. package/node_modules/@openrig/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts +38 -9
  923. package/node_modules/@openrig/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
  924. package/node_modules/@openrig/daemon/dist/domain/workspace/default-workspace-scaffold.js +93 -347
  925. package/node_modules/@openrig/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
  926. package/node_modules/@openrig/daemon/dist/gateway-human-registry-surface.d.ts +1 -0
  927. package/node_modules/@openrig/daemon/dist/gateway-human-registry-surface.d.ts.map +1 -1
  928. package/node_modules/@openrig/daemon/dist/gateway-human-registry-surface.js +1 -0
  929. package/node_modules/@openrig/daemon/dist/gateway-human-registry-surface.js.map +1 -1
  930. package/node_modules/@openrig/daemon/dist/gateway-slack-surface.d.ts +1 -0
  931. package/node_modules/@openrig/daemon/dist/gateway-slack-surface.d.ts.map +1 -1
  932. package/node_modules/@openrig/daemon/dist/gateway-slack-surface.js +1 -0
  933. package/node_modules/@openrig/daemon/dist/gateway-slack-surface.js.map +1 -1
  934. package/node_modules/@openrig/daemon/dist/health-detectors-surface.d.ts +2 -0
  935. package/node_modules/@openrig/daemon/dist/health-detectors-surface.d.ts.map +1 -0
  936. package/node_modules/@openrig/daemon/dist/health-detectors-surface.js +2 -0
  937. package/node_modules/@openrig/daemon/dist/health-detectors-surface.js.map +1 -0
  938. package/node_modules/@openrig/daemon/dist/health-projection-surface.d.ts +2 -0
  939. package/node_modules/@openrig/daemon/dist/health-projection-surface.d.ts.map +1 -0
  940. package/node_modules/@openrig/daemon/dist/health-projection-surface.js +2 -0
  941. package/node_modules/@openrig/daemon/dist/health-projection-surface.js.map +1 -0
  942. package/node_modules/@openrig/daemon/dist/index.d.ts.map +1 -1
  943. package/node_modules/@openrig/daemon/dist/index.js +15 -0
  944. package/node_modules/@openrig/daemon/dist/index.js.map +1 -1
  945. package/node_modules/@openrig/daemon/dist/instance-initialization-surface.d.ts +3 -0
  946. package/node_modules/@openrig/daemon/dist/instance-initialization-surface.d.ts.map +1 -0
  947. package/node_modules/@openrig/daemon/dist/instance-initialization-surface.js +3 -0
  948. package/node_modules/@openrig/daemon/dist/instance-initialization-surface.js.map +1 -0
  949. package/node_modules/@openrig/daemon/dist/lib/pane-envelope.d.ts.map +1 -1
  950. package/node_modules/@openrig/daemon/dist/lib/pane-envelope.js +4 -1
  951. package/node_modules/@openrig/daemon/dist/lib/pane-envelope.js.map +1 -1
  952. package/node_modules/@openrig/daemon/dist/project-lifecycle-surface.d.ts +3 -0
  953. package/node_modules/@openrig/daemon/dist/project-lifecycle-surface.d.ts.map +1 -0
  954. package/node_modules/@openrig/daemon/dist/project-lifecycle-surface.js +3 -0
  955. package/node_modules/@openrig/daemon/dist/project-lifecycle-surface.js.map +1 -0
  956. package/node_modules/@openrig/daemon/dist/routes/bundles.js +10 -9
  957. package/node_modules/@openrig/daemon/dist/routes/bundles.js.map +1 -1
  958. package/node_modules/@openrig/daemon/dist/routes/config.d.ts.map +1 -1
  959. package/node_modules/@openrig/daemon/dist/routes/config.js +27 -49
  960. package/node_modules/@openrig/daemon/dist/routes/config.js.map +1 -1
  961. package/node_modules/@openrig/daemon/dist/routes/context-packs.d.ts.map +1 -1
  962. package/node_modules/@openrig/daemon/dist/routes/context-packs.js +114 -16
  963. package/node_modules/@openrig/daemon/dist/routes/context-packs.js.map +1 -1
  964. package/node_modules/@openrig/daemon/dist/routes/crash-cart.js +3 -0
  965. package/node_modules/@openrig/daemon/dist/routes/crash-cart.js.map +1 -1
  966. package/node_modules/@openrig/daemon/dist/routes/gateway.d.ts +5 -1
  967. package/node_modules/@openrig/daemon/dist/routes/gateway.d.ts.map +1 -1
  968. package/node_modules/@openrig/daemon/dist/routes/gateway.js +70 -22
  969. package/node_modules/@openrig/daemon/dist/routes/gateway.js.map +1 -1
  970. package/node_modules/@openrig/daemon/dist/routes/health-diagnosis.d.ts +3 -0
  971. package/node_modules/@openrig/daemon/dist/routes/health-diagnosis.d.ts.map +1 -0
  972. package/node_modules/@openrig/daemon/dist/routes/health-diagnosis.js +47 -0
  973. package/node_modules/@openrig/daemon/dist/routes/health-diagnosis.js.map +1 -0
  974. package/node_modules/@openrig/daemon/dist/routes/health.d.ts +3 -0
  975. package/node_modules/@openrig/daemon/dist/routes/health.d.ts.map +1 -0
  976. package/node_modules/@openrig/daemon/dist/routes/health.js +50 -0
  977. package/node_modules/@openrig/daemon/dist/routes/health.js.map +1 -0
  978. package/node_modules/@openrig/daemon/dist/routes/hosts.d.ts +2 -0
  979. package/node_modules/@openrig/daemon/dist/routes/hosts.d.ts.map +1 -1
  980. package/node_modules/@openrig/daemon/dist/routes/hosts.js +12 -5
  981. package/node_modules/@openrig/daemon/dist/routes/hosts.js.map +1 -1
  982. package/node_modules/@openrig/daemon/dist/routes/queue.d.ts.map +1 -1
  983. package/node_modules/@openrig/daemon/dist/routes/queue.js +20 -0
  984. package/node_modules/@openrig/daemon/dist/routes/queue.js.map +1 -1
  985. package/node_modules/@openrig/daemon/dist/routes/rigs.js +12 -1
  986. package/node_modules/@openrig/daemon/dist/routes/rigs.js.map +1 -1
  987. package/node_modules/@openrig/daemon/dist/routes/rigspec.js +9 -2
  988. package/node_modules/@openrig/daemon/dist/routes/rigspec.js.map +1 -1
  989. package/node_modules/@openrig/daemon/dist/routes/seat.js +21 -1
  990. package/node_modules/@openrig/daemon/dist/routes/seat.js.map +1 -1
  991. package/node_modules/@openrig/daemon/dist/routes/sessions.js +16 -6
  992. package/node_modules/@openrig/daemon/dist/routes/sessions.js.map +1 -1
  993. package/node_modules/@openrig/daemon/dist/routes/snapshots.d.ts.map +1 -1
  994. package/node_modules/@openrig/daemon/dist/routes/snapshots.js +41 -3
  995. package/node_modules/@openrig/daemon/dist/routes/snapshots.js.map +1 -1
  996. package/node_modules/@openrig/daemon/dist/routes/up.js +12 -1
  997. package/node_modules/@openrig/daemon/dist/routes/up.js.map +1 -1
  998. package/node_modules/@openrig/daemon/dist/routes/watchdog.d.ts.map +1 -1
  999. package/node_modules/@openrig/daemon/dist/routes/watchdog.js +7 -6
  1000. package/node_modules/@openrig/daemon/dist/routes/watchdog.js.map +1 -1
  1001. package/node_modules/@openrig/daemon/dist/routes/workflow.d.ts.map +1 -1
  1002. package/node_modules/@openrig/daemon/dist/routes/workflow.js +104 -39
  1003. package/node_modules/@openrig/daemon/dist/routes/workflow.js.map +1 -1
  1004. package/node_modules/@openrig/daemon/dist/server.d.ts +10 -0
  1005. package/node_modules/@openrig/daemon/dist/server.d.ts.map +1 -1
  1006. package/node_modules/@openrig/daemon/dist/server.js +9 -0
  1007. package/node_modules/@openrig/daemon/dist/server.js.map +1 -1
  1008. package/node_modules/@openrig/daemon/dist/skill-loadout-surface.d.ts +3 -0
  1009. package/node_modules/@openrig/daemon/dist/skill-loadout-surface.d.ts.map +1 -0
  1010. package/node_modules/@openrig/daemon/dist/skill-loadout-surface.js +2 -0
  1011. package/node_modules/@openrig/daemon/dist/skill-loadout-surface.js.map +1 -0
  1012. package/node_modules/@openrig/daemon/dist/startup.d.ts.map +1 -1
  1013. package/node_modules/@openrig/daemon/dist/startup.js +101 -66
  1014. package/node_modules/@openrig/daemon/dist/startup.js.map +1 -1
  1015. package/node_modules/@openrig/daemon/dist/system-world-surface.d.ts +2 -0
  1016. package/node_modules/@openrig/daemon/dist/system-world-surface.d.ts.map +1 -0
  1017. package/node_modules/@openrig/daemon/dist/system-world-surface.js +2 -0
  1018. package/node_modules/@openrig/daemon/dist/system-world-surface.js.map +1 -0
  1019. package/node_modules/@openrig/daemon/package.json +25 -1
  1020. package/package.json +1 -1
  1021. package/tui/dist/commands/registry.d.ts.map +1 -1
  1022. package/tui/dist/commands/registry.js +10 -1
  1023. package/tui/dist/commands/registry.js.map +1 -1
  1024. package/tui/dist/daemon-client.d.ts +13 -0
  1025. package/tui/dist/daemon-client.d.ts.map +1 -1
  1026. package/tui/dist/daemon-client.js +19 -0
  1027. package/tui/dist/daemon-client.js.map +1 -1
  1028. package/tui/dist/demo-data.d.ts.map +1 -1
  1029. package/tui/dist/demo-data.js +65 -9
  1030. package/tui/dist/demo-data.js.map +1 -1
  1031. package/tui/dist/detail.d.ts +9 -0
  1032. package/tui/dist/detail.d.ts.map +1 -1
  1033. package/tui/dist/detail.js.map +1 -1
  1034. package/tui/dist/execution/execution-model.d.ts +8 -2
  1035. package/tui/dist/execution/execution-model.d.ts.map +1 -1
  1036. package/tui/dist/execution/execution-model.js +482 -119
  1037. package/tui/dist/execution/execution-model.js.map +1 -1
  1038. package/tui/dist/health/health-model.d.ts +25 -0
  1039. package/tui/dist/health/health-model.d.ts.map +1 -0
  1040. package/tui/dist/health/health-model.js +322 -0
  1041. package/tui/dist/health/health-model.js.map +1 -0
  1042. package/tui/dist/hydrate.d.ts +3 -2
  1043. package/tui/dist/hydrate.d.ts.map +1 -1
  1044. package/tui/dist/hydrate.js +77 -8
  1045. package/tui/dist/hydrate.js.map +1 -1
  1046. package/tui/dist/input.d.ts +6 -1
  1047. package/tui/dist/input.d.ts.map +1 -1
  1048. package/tui/dist/input.js +22 -10
  1049. package/tui/dist/input.js.map +1 -1
  1050. package/tui/dist/main.js +39 -8
  1051. package/tui/dist/main.js.map +1 -1
  1052. package/tui/dist/navigator.d.ts.map +1 -1
  1053. package/tui/dist/navigator.js +10 -6
  1054. package/tui/dist/navigator.js.map +1 -1
  1055. package/tui/dist/render.d.ts.map +1 -1
  1056. package/tui/dist/render.js +617 -155
  1057. package/tui/dist/render.js.map +1 -1
  1058. package/tui/dist/scopes/scopes-model.d.ts +14 -8
  1059. package/tui/dist/scopes/scopes-model.d.ts.map +1 -1
  1060. package/tui/dist/scopes/scopes-model.js +218 -46
  1061. package/tui/dist/scopes/scopes-model.js.map +1 -1
  1062. package/tui/dist/socket-server.d.ts +13 -0
  1063. package/tui/dist/socket-server.d.ts.map +1 -1
  1064. package/tui/dist/socket-server.js +24 -0
  1065. package/tui/dist/socket-server.js.map +1 -1
  1066. package/tui/dist/state.d.ts.map +1 -1
  1067. package/tui/dist/state.js +31 -11
  1068. package/tui/dist/state.js.map +1 -1
  1069. package/tui/dist/stylize.d.ts.map +1 -1
  1070. package/tui/dist/stylize.js +22 -28
  1071. package/tui/dist/stylize.js.map +1 -1
  1072. package/tui/dist/theme.d.ts +1 -1
  1073. package/tui/dist/theme.d.ts.map +1 -1
  1074. package/tui/dist/theme.js +5 -4
  1075. package/tui/dist/theme.js.map +1 -1
  1076. package/tui/dist/types.d.ts +186 -1
  1077. package/tui/dist/types.d.ts.map +1 -1
  1078. package/tui/dist/visual-layout.d.ts +6 -0
  1079. package/tui/dist/visual-layout.d.ts.map +1 -0
  1080. package/tui/dist/visual-layout.js +8 -0
  1081. package/tui/dist/visual-layout.js.map +1 -0
  1082. package/ui/dist/assets/{index-B_wqzP0D.js → index-wyX378xb.js} +15 -15
  1083. package/ui/dist/index.html +1 -1
@@ -17,8 +17,9 @@ import { renderCrashCartView, renderUnverifiedView, renderRestoreLifecycleView,
17
17
  import { buildLedgerExplorer } from "./crash-cart/ledger-explorer.js";
18
18
  import { runtimeMarkSegs } from "./topology/runtime-marks.js";
19
19
  import { barCells, flashActive, reducedMotion, spinnerFrame } from "./motion.js";
20
+ import { explorerWidth, MOTION_FRAME_MS } from "./visual-layout.js";
20
21
  import { detailPage, fieldLine, sectionRule, listItem, alignedRow, LABEL_W } from "./detail.js";
21
- const EXPL_W = 30;
22
+ import { healthAgentLines, healthDetailLines, healthListLines, healthSummaryLine } from "./health/health-model.js";
22
23
  function pad(text, width) {
23
24
  const t = String(text ?? "");
24
25
  if (t.length <= width)
@@ -32,45 +33,298 @@ function padLeft(text, width) {
32
33
  return " ".repeat(width - t.length) + t;
33
34
  return t.slice(0, Math.max(width - 1, 0)) + "…";
34
35
  }
35
- const FULL_AGENT_COLS = [
36
- ["rig", "RIG", 18, "left"],
37
- ["pod", "POD", 8, "left"],
38
- ["agent", "AGENT", 16, "left"],
39
- ["runtime", "RUNTIME", 13, "left"],
40
- ["context", "CTX%", 4, "right"],
41
- ["tokens", "TOKENS", 7, "right"],
42
- ["status", "STATUS", 17, "left"],
43
- ["actions", "ACTIONS", 14, "left"],
44
- ];
45
36
  function columnsWidth(columns) {
46
37
  return columns.reduce((total, [, , width]) => total + width + 1, -1);
47
38
  }
48
39
  function agentColumns(contentWidth) {
49
- if (columnsWidth(FULL_AGENT_COLS) <= contentWidth)
50
- return FULL_AGENT_COLS;
51
- // At the 120-column fallback the content pane is 88 cells. Preserve the
52
- // operable identity/status/action path; telemetry cells yield first.
53
- const compactRest = [
54
- ["pod", "POD", 8, "left"],
55
- ["agent", "AGENT", 16, "left"],
56
- ["runtime", "RUNTIME", 13, "left"],
57
- ["status", "STATUS", 17, "left"],
58
- ["actions", "ACTIONS", 14, "left"],
40
+ if (contentWidth >= 110)
41
+ return [
42
+ ["pod", "POD", 8, "left"], ["seat", "SEAT", 15, "left"], ["runtime", "RT", 4, "left"],
43
+ ["model", "MODEL", 12, "left"], ["context", "CTX", 8, "right"], ["status", "STATE", 11, "left"],
44
+ ["queue", "Q", 3, "right"], ["work", "WORK", 15, "left"], ["now", "NOW", 27, "left"],
45
+ ["actions", "ACTIONS", 14, "left"],
46
+ ];
47
+ if (contentWidth >= 88)
48
+ return [
49
+ ["pod", "POD", 6, "left"], ["seat", "SEAT", 12, "left"], ["runtime", "RT", 3, "left"],
50
+ ["model", "MODEL", 8, "left"], ["context", "CTX", 6, "right"], ["status", "STATE", 9, "left"],
51
+ ["queue", "Q", 2, "right"], ["work", "WORK", 8, "left"], ["now", "NOW", 11, "left"],
52
+ ["actions", "ACTIONS", 14, "left"],
53
+ ];
54
+ // At 84x28 the L2 content pane is 58 cells. The three explicitly deferred
55
+ // columns (MODEL/NOW/ACTIONS) move to drill; identity, state and work remain.
56
+ const fixed = 6 + 12 + 3 + 5 + 9 + 2 + 6; // widths + separators, excluding WORK
57
+ return [
58
+ ["pod", "POD", 6, "left"], ["seat", "SEAT", 12, "left"], ["runtime", "RT", 3, "left"],
59
+ ["context", "CTX", 5, "right"], ["status", "STATE", 9, "left"], ["queue", "Q", 2, "right"],
60
+ ["work", "WORK", Math.max(4, contentWidth - fixed), "left"],
61
+ ];
62
+ }
63
+ function instanceAgentColumns(contentWidth) {
64
+ if (contentWidth >= 110)
65
+ return [
66
+ ["rig", "RIG", 13, "left"], ["pod", "POD", 8, "left"], ["seat", "SEAT", 14, "left"],
67
+ ["runtime", "RT", 3, "left"], ["context", "CTX", 7, "right"], ["status", "STATE", 10, "left"],
68
+ ["queue", "Q", 2, "right"], ["work", "WORK", 12, "left"], ["now", "NOW", Math.max(18, contentWidth - 78), "left"],
69
+ ];
70
+ if (contentWidth >= 78)
71
+ return [
72
+ ["rig", "RIG", 10, "left"], ["pod", "POD", 6, "left"], ["seat", "SEAT", 12, "left"],
73
+ ["runtime", "RT", 3, "left"], ["context", "CTX", 5, "right"], ["status", "STATE", 9, "left"],
74
+ ["queue", "Q", 2, "right"], ["work", "WORK", Math.max(8, contentWidth - 54), "left"],
75
+ ];
76
+ const fixed = 8 + 5 + 11 + 2 + 5 + 8 + 2 + 7;
77
+ return [
78
+ ["rig", "RIG", 8, "left"], ["pod", "POD", 5, "left"], ["seat", "SEAT", 11, "left"],
79
+ ["runtime", "RT", 2, "left"], ["context", "CTX", 5, "right"], ["status", "STATE", 8, "left"],
80
+ ["queue", "Q", 2, "right"], ["work", "WORK", Math.max(4, contentWidth - fixed), "left"],
59
81
  ];
60
- const rigWidth = Math.max(6, Math.min(18, contentWidth - columnsWidth(compactRest) - 1));
61
- return [["rig", "RIG", rigWidth, "left"], ...compactRest];
62
82
  }
63
83
  function tableRow(columns, cells) {
64
84
  return columns.map(([key, , width, align]) => align === "right" ? padLeft(cells[key], width) : pad(cells[key], width)).join(" ");
65
85
  }
86
+ function runtimeShort(runtime) {
87
+ if (/claude/i.test(runtime))
88
+ return "cl";
89
+ if (/codex/i.test(runtime))
90
+ return "cx";
91
+ if (/terminal/i.test(runtime))
92
+ return ">_";
93
+ if (/human/i.test(runtime))
94
+ return "hu";
95
+ return runtime.slice(0, 2) || "—";
96
+ }
97
+ /** Tables optimize for glance width; details retain the canonical model id. */
98
+ function tableModel(model) {
99
+ return model?.replace(/^claude-/i, "") || "—";
100
+ }
101
+ function contextCompact(value, narrow) {
102
+ if (value == null)
103
+ return "—";
104
+ if (narrow)
105
+ return `${value}%`;
106
+ const filled = Math.max(0, Math.min(3, Math.round(value / 33.4)));
107
+ return `${value}%${"▪".repeat(filled)}${"▫".repeat(3 - filled)}`;
108
+ }
109
+ function seatName(pod, name) {
110
+ for (const prefix of [`${pod}.`, `${pod}-`])
111
+ if (name.startsWith(prefix))
112
+ return name.slice(prefix.length);
113
+ return name;
114
+ }
115
+ function operationalState(status, motion) {
116
+ const key = status.toLowerCase().replaceAll("_", "-");
117
+ if (key === "active" || key === "working" || key === "running") {
118
+ if (!motion.reduced)
119
+ motion.used = true;
120
+ return { mark: motion.reduced ? "●" : motion.frame, word: "working" };
121
+ }
122
+ if (key === "attention-required" || key === "needs-attention" || key === "needs-input")
123
+ return { mark: "◐", word: "needs you" };
124
+ if (key === "blocked")
125
+ return { mark: "⚑", word: "blocked" };
126
+ if (key === "failed" || key === "down")
127
+ return { mark: "✕", word: "failed" };
128
+ if (key === "idle")
129
+ return { mark: "·", word: "idle" };
130
+ if (key === "detached" || key === "stopped")
131
+ return { mark: "○", word: "detached" };
132
+ return { mark: "?", word: "unknown" };
133
+ }
134
+ function queueFacts(snap, session) {
135
+ if (!session)
136
+ return { count: 0, work: "—", now: "—" };
137
+ const sources = [
138
+ ["needs you", snap.attention], ["blocked", snap.blocked], ["working", snap.inProgress], ["queued", snap.pending],
139
+ ];
140
+ const rows = [];
141
+ const seen = new Set();
142
+ for (const [role, items] of sources)
143
+ for (const row of items) {
144
+ if (row.destinationSession !== session || seen.has(row.qitemId))
145
+ continue;
146
+ seen.add(row.qitemId);
147
+ rows.push({ role, row });
148
+ }
149
+ const primary = rows[0];
150
+ if (!primary)
151
+ return { count: 0, work: "—", now: "—" };
152
+ const slice = primary.row.tags?.find((tag) => tag.startsWith("slice:"))?.slice("slice:".length);
153
+ const work = slice?.match(/^OPR(?:\.\d+){3}\.(\d+)$/)?.[1]
154
+ ? `S${slice.slice(slice.lastIndexOf(".") + 1)}`
155
+ : slice ?? "—";
156
+ const summary = primary.row.summary?.trim() || primary.row.body.split("\n").find((line) => line.trim())?.trim() || primary.row.qitemId;
157
+ const now = primary.role === "working" ? summary : `${primary.role} · ${summary}`;
158
+ return { count: rows.length, work, now };
159
+ }
160
+ function number(value) {
161
+ return value == null ? "—" : value.toLocaleString("en-US");
162
+ }
163
+ function wrapDetailValue(label, value, width) {
164
+ const prefix = ` ${`${label}:`.padEnd(LABEL_W)} `;
165
+ const continuation = " ".repeat(prefix.length);
166
+ const room = Math.max(8, width - prefix.length);
167
+ const words = value.trim().split(/\s+/).filter(Boolean);
168
+ const chunks = [];
169
+ let line = "";
170
+ for (const raw of words) {
171
+ let word = raw;
172
+ while (word.length > room) {
173
+ if (line) {
174
+ chunks.push(line);
175
+ line = "";
176
+ }
177
+ chunks.push(word.slice(0, room));
178
+ word = word.slice(room);
179
+ }
180
+ if (!word)
181
+ continue;
182
+ if (!line)
183
+ line = word;
184
+ else if (line.length + word.length + 1 <= room)
185
+ line += ` ${word}`;
186
+ else {
187
+ chunks.push(line);
188
+ line = word;
189
+ }
190
+ }
191
+ if (line)
192
+ chunks.push(line);
193
+ return (chunks.length ? chunks : [""]).map((chunk, index) => ({ text: `${index === 0 ? prefix : continuation}${chunk}` }));
194
+ }
195
+ function rowsForAgent(snap, session, sources) {
196
+ const rows = [];
197
+ const seen = new Set();
198
+ for (const source of sources)
199
+ for (const row of source) {
200
+ if (row.destinationSession !== session || seen.has(row.qitemId))
201
+ continue;
202
+ seen.add(row.qitemId);
203
+ rows.push(row);
204
+ }
205
+ return rows;
206
+ }
207
+ function workRows(rows, width) {
208
+ if (rows.length === 0)
209
+ return [fieldLine({ label: "rows", value: "none in the served bounded lists" })];
210
+ return rows.flatMap((row) => {
211
+ const summary = row.summary?.trim() || row.body.split("\n").find((line) => line.trim())?.trim() || "no summary served";
212
+ return [
213
+ ...wrapDetailValue("qitem", `${row.qitemId} · ${row.state}`, width),
214
+ ...wrapDetailValue("work", summary, width),
215
+ ...(row.blockedOn ? wrapDetailValue("blocker", `blocked on ${row.blockedOn}`, width) : []),
216
+ ];
217
+ });
218
+ }
219
+ function agentDetailLines(snap, found, contentWidth) {
220
+ const { agent, rig, pod } = found;
221
+ const session = agent.session;
222
+ const specInLibrary = !!agent.spec && !!findSpec(snap, agent.spec);
223
+ const currentRows = session ? rowsForAgent(snap, session, [snap.attention, snap.blocked, snap.inProgress]) : [];
224
+ const pendingRows = session ? rowsForAgent(snap, session, [snap.pending]) : [];
225
+ const recentRows = session ? rowsForAgent(snap, session, [snap.recentlyFinished]) : [];
226
+ const needs = session ? snap.needs.filter((item) => item.target === session) : [];
227
+ const visibleAssigned = currentRows.length + pendingRows.length;
228
+ const assigned = agent.assignedWorkCount ?? visibleAssigned;
229
+ const pending = agent.pendingWorkCount ?? pendingRows.length;
230
+ const inProgress = agent.inProgressWorkCount ?? currentRows.filter((row) => row.state === "in-progress").length;
231
+ const blocked = agent.blockedWorkCount ?? currentRows.filter((row) => row.state === "blocked").length;
232
+ const context = agent.context;
233
+ const meterWidth = Math.max(10, Math.min(36, contentWidth - 24));
234
+ const rtName = agent.runtime ?? "unknown";
235
+ const rtSegs = [
236
+ { text: " " },
237
+ { text: "runtime:", token: "dim" },
238
+ { text: " ".repeat(LABEL_W - "runtime:".length + 1) },
239
+ { text: rtName },
240
+ { text: " " },
241
+ ...runtimeMarkSegs(agent.runtime),
242
+ ];
243
+ const runtimeLine = { text: rtSegs.map((segment) => segment.text).join(""), segs: rtSegs };
244
+ const activityReason = agent.activity?.needsInput?.reason ?? agent.activity?.signalReason ?? null;
245
+ const needsRows = needs.length > 0
246
+ ? needs.flatMap((item) => [
247
+ ...wrapDetailValue("qitem", item.qitemId ?? "no actionable qitem id served", contentWidth),
248
+ ...wrapDetailValue("reason", item.detail, contentWidth),
249
+ ...(item.unblocks ? wrapDetailValue("action", `unblocks ${item.unblocks}`, contentWidth) : []),
250
+ ...(item.evidenceRef ? wrapDetailValue("evidence", item.evidenceRef, contentWidth) : []),
251
+ ])
252
+ : agent.activity?.needsInput && agent.activity.needsInput.count > 0
253
+ ? wrapDetailValue("reason", agent.activity.needsInput.reason ?? "input required; no reason served", contentWidth)
254
+ : [fieldLine({ label: "state", value: "none on the served projections" })];
255
+ return [
256
+ ...detailPage({ text: `agent ${agent.name} · ${agent.status}` }, [
257
+ {
258
+ title: `CONTEXT · ${context == null ? "unknown" : `${context}%`}`,
259
+ lines: [
260
+ fieldLine({ label: "meter", value: context == null ? "— (not yet known)" : `${context}% used ${barCells(context / 100, meterWidth)}` }),
261
+ fieldLine({ label: "tokens", value: `${number(agent.totalInputTokens)} input · ${number(agent.totalOutputTokens)} output · ${number(agent.contextWindowSize)} window` }),
262
+ runtimeLine,
263
+ ...(agent.attach ? [fieldLine({ label: "attach", value: agent.attach })] : []),
264
+ fieldLine({ label: "terminal", value: `term ▸ pod ${pod.name}`, link: { type: "act", act: "open-terminal", view: `pod:${rig.name}/${pod.name}` } }),
265
+ ],
266
+ },
267
+ {
268
+ title: "CURRENT ACTIVITY",
269
+ fields: [
270
+ { label: "activity", value: agent.activity?.activity ?? agent.status },
271
+ ...(activityReason ? [{ label: "reason", value: activityReason }] : []),
272
+ ...(agent.activity?.decidedBy ? [{ label: "decided by", value: agent.activity.decidedBy }] : []),
273
+ ...(agent.activity?.signalSource || agent.activity?.signalReason ? [{ label: "signal", value: `${agent.activity.signalSource ?? "unknown"} · ${agent.activity.signalReason ?? "no reason"}` }] : []),
274
+ ...(agent.activity?.eventAt ? [{ label: "changed", value: agent.activity.eventAt }] : []),
275
+ ],
276
+ },
277
+ {
278
+ title: "HEALTH",
279
+ lines: healthAgentLines(snap, {
280
+ kind: "seat",
281
+ rigId: rig.id ?? rig.name,
282
+ seatId: agent.nodeId ?? null,
283
+ seatName: agent.name,
284
+ local: found.host === snap.hosts[0],
285
+ }, contentWidth),
286
+ },
287
+ { title: `CURRENT WORK · ${currentRows.length}`, lines: workRows(currentRows, contentWidth) },
288
+ {
289
+ title: "QUEUE",
290
+ lines: [
291
+ ...wrapDetailValue("depth", `${assigned} assigned · ${pending} pending · ${inProgress} in progress · ${blocked} blocked`, contentWidth),
292
+ ...(agent.assignedWorkCount == null ? wrapDetailValue("basis", `${visibleAssigned} rows visible in bounded list reads; complete count not served`, contentWidth) : []),
293
+ ],
294
+ },
295
+ { title: `UP NEXT · ${pending}`, lines: workRows(pendingRows, contentWidth) },
296
+ { title: `NEEDS YOU · ${needs.length || agent.activity?.needsInput?.count || 0}`, lines: needsRows },
297
+ ...(recentRows.length ? [{ title: "RECENTLY FINISHED · bounded window", lines: workRows(recentRows, contentWidth) }] : []),
298
+ {
299
+ title: "SEAT",
300
+ fields: [
301
+ { label: "host", value: found.host.name },
302
+ { label: "rig", value: rig.name },
303
+ { label: "pod", value: pod.name },
304
+ ],
305
+ lines: [
306
+ fieldLine({ label: "cwd", value: agent.cwd ?? "— (not served)" }),
307
+ ],
308
+ },
309
+ {
310
+ title: "SPEC",
311
+ fields: [specInLibrary
312
+ ? { label: "spec", value: agent.spec, link: { type: "cross", kind: "spec-of", name: agent.name, target: { host: found.host.name, rig: rig.name, pod: pod.name } } }
313
+ : { label: "spec", value: agent.spec ? `${agent.spec} (not in library)` : "—" }],
314
+ },
315
+ ]),
316
+ ];
317
+ }
66
318
  function tabsLine(state, suffix) {
67
- // slice-17: three tabs, each its own click zone (the first zone starts at
319
+ // Each topology tab is its own click zone (the first zone starts at
68
320
  // content col 0, preserving the focus-marker floor); `tab graph` = the
69
321
  // topology graph view (frame-01 hatchet mainline)
70
322
  const labels = [
71
323
  ["table", state.viewTab === "table" ? "[ TABLE ]" : " TABLE "],
324
+ ["recent", state.viewTab === "recent" ? "[ RECENT ]" : " RECENT "],
72
325
  ["overview", state.viewTab === "overview" ? "[ OVERVIEW ]" : " OVERVIEW "],
73
326
  ["graph", state.viewTab === "graph" ? "[ GRAPH ]" : " GRAPH "],
327
+ ["health", state.viewTab === "health" ? "[ HEALTH ]" : " HEALTH "],
74
328
  ];
75
329
  const text = `${labels.map(([, label]) => label).join("")} ${suffix}`;
76
330
  const zones = [];
@@ -81,6 +335,100 @@ function tabsLine(state, suffix) {
81
335
  }
82
336
  return [{ text, zones }];
83
337
  }
338
+ function localClock(iso) {
339
+ const date = new Date(iso);
340
+ if (Number.isNaN(date.getTime()))
341
+ return "??:??";
342
+ return `${String(date.getHours()).padStart(2, "0")}:${String(date.getMinutes()).padStart(2, "0")}`;
343
+ }
344
+ function queueRows(snap) {
345
+ return [...snap.attention, ...snap.blocked, ...snap.inProgress, ...snap.pending, ...snap.recentlyFinished];
346
+ }
347
+ function recentWorkText(snap, row) {
348
+ const qitem = queueRows(snap).find((candidate) => candidate.qitemId === row.qitemId);
349
+ const work = qitem?.summary?.trim() || qitem?.body.split("\n").find((line) => line.trim())?.trim();
350
+ return row.summary?.trim() || work || "no work served";
351
+ }
352
+ function agentDrillForSession(snap, session) {
353
+ const found = findAgentBySession(snap, session);
354
+ return found
355
+ ? { type: "drill", resource: "agent", name: found.agent.name, target: { host: found.host.name, rig: found.rig.name, pod: found.pod.name } }
356
+ : undefined;
357
+ }
358
+ function recentTargetAction(snap, row) {
359
+ if (row.targetKind === "mission") {
360
+ if (snap.scopes?.some((mission) => mission.mission === row.target))
361
+ return { type: "scopes-mission-open", mission: row.target };
362
+ }
363
+ if (row.targetKind === "slice") {
364
+ for (const mission of snap.scopes ?? []) {
365
+ const slice = mission.slices.find((candidate) => candidate.id === row.target || candidate.dirName === row.target);
366
+ if (slice)
367
+ return { type: "scopes-open", mission: mission.mission, slice: slice.dirName };
368
+ }
369
+ }
370
+ const qitem = queueRows(snap).find((candidate) => candidate.qitemId === row.qitemId || candidate.qitemId === row.target);
371
+ return (qitem ? agentDrillForSession(snap, qitem.destinationSession) : undefined)
372
+ ?? agentDrillForSession(snap, row.actorSession)
373
+ ?? (row.rig && snap.hosts.some((host) => host.rigs.some((rig) => rig.name === row.rig))
374
+ ? { type: "drill", resource: "rig", name: row.rig }
375
+ : undefined);
376
+ }
377
+ function recentScopeMatches(snap, scope) {
378
+ const served = snap.recentTransitionsScope
379
+ ?? (snap.recentTransitionsRig ? { kind: "rig", rig: snap.recentTransitionsRig } : null);
380
+ if (!served || served.kind !== scope.kind)
381
+ return false;
382
+ return scope.kind === "instance" || (served.kind === "rig" && served.rig === scope.rig);
383
+ }
384
+ function recentLines(snap, scope, width, expanded) {
385
+ if (!recentScopeMatches(snap, scope) || snap.recentTransitions == null)
386
+ return [];
387
+ const timeW = 5;
388
+ const rows = expanded ? snap.recentTransitions : snap.recentTransitions.slice(-5);
389
+ const lines = [
390
+ ...(expanded ? [] : [{ text: "" }]),
391
+ sectionRule(`RECENT · ${scope.kind === "instance" ? "instance" : `rig ${scope.rig}`} · material queue transitions · newest last`, width),
392
+ ];
393
+ if (rows.length === 0)
394
+ return [...lines, { text: " No recorded transitions in the current window." }];
395
+ if (width < 78) {
396
+ const rigW = scope.kind === "instance" ? 9 : 0;
397
+ const changeW = Math.max(16, width - timeW - rigW - 2);
398
+ lines.push({ text: alignedRow([["TIME", timeW], ...(rigW ? [["RIG", rigW]] : []), ["CHANGE", changeW]]) });
399
+ for (const row of rows) {
400
+ const action = recentTargetAction(snap, row);
401
+ lines.push({
402
+ text: alignedRow([[localClock(row.ts), timeW], ...(rigW ? [[pad(row.rig ?? "?", rigW), rigW]] : []), [pad(row.change, changeW), changeW]]).slice(0, width),
403
+ ...(action ? { action } : {}),
404
+ });
405
+ lines.push({ text: ` ${pad(row.actorSession, Math.max(8, width - 8))}`.slice(0, width), ...(action ? { action } : {}) });
406
+ lines.push({ text: ` → ${row.target}`.slice(0, width), ...(action ? { action } : {}) });
407
+ lines.push(...wrapDetailValue("work", recentWorkText(snap, row), width)
408
+ .map((line) => ({ ...line, ...(action ? { action } : {}) })));
409
+ }
410
+ return lines;
411
+ }
412
+ const rigW = scope.kind === "instance" ? Math.min(16, Math.max(9, Math.floor(width * 0.13))) : 0;
413
+ const actorW = Math.min(26, Math.max(16, Math.floor(width * 0.21)));
414
+ const changeW = Math.min(36, Math.max(20, Math.floor(width * 0.28)));
415
+ const targetW = Math.max(10, width - timeW - rigW - actorW - changeW - (scope.kind === "instance" ? 4 : 3));
416
+ lines.push({ text: alignedRow([["TIME", timeW], ...(scope.kind === "instance" ? [["RIG", rigW]] : []), ["ACTOR", actorW], ["CHANGE", changeW], ["TARGET", targetW]]) });
417
+ for (const row of rows) {
418
+ const action = recentTargetAction(snap, row);
419
+ const text = alignedRow([
420
+ [localClock(row.ts), timeW],
421
+ ...(scope.kind === "instance" ? [[pad(row.rig ?? "?", rigW), rigW]] : []),
422
+ [pad(row.actorSession, actorW), actorW],
423
+ [pad(row.change, changeW), changeW],
424
+ [pad(row.target, targetW), targetW],
425
+ ]).slice(0, width);
426
+ lines.push({ text, ...(action ? { action } : {}) });
427
+ lines.push(...wrapDetailValue("work", recentWorkText(snap, row), width)
428
+ .map((line) => ({ ...line, ...(action ? { action } : {}) })));
429
+ }
430
+ return lines;
431
+ }
84
432
  function specTabsLine(state, name) {
85
433
  const active = state.viewTab === "topology" || state.viewTab === "yaml" ? state.viewTab : "configuration";
86
434
  const labels = ["topology", "configuration", "yaml"];
@@ -157,10 +505,133 @@ function fieldWrapped(label, values) {
157
505
  const first = wrapped[0].text.slice(valueCol);
158
506
  return [fieldLine({ label, value: first }), ...wrapped.slice(1)];
159
507
  }
508
+ function instanceContentLines(state, snap, host, contentWidth, motion) {
509
+ const lines = tabsLine(state, `instance ${host.name}`);
510
+ const scope = { kind: "instance", local: host === snap.hosts[0] };
511
+ if (state.viewTab === "health")
512
+ return [...lines, { text: "" }, ...healthListLines(snap, scope, contentWidth)];
513
+ if (state.viewTab === "recent") {
514
+ const recent = recentLines(snap, scope, contentWidth, true);
515
+ return recent.length > 0
516
+ ? [...lines, ...recent]
517
+ : [...lines, { text: "" }, { text: motion.loading ? `${motion.frame} instance RECENT read pending` : "(instance RECENT window not served)" }];
518
+ }
519
+ if (state.viewTab === "overview") {
520
+ return [
521
+ ...lines,
522
+ ...detailPage({ text: `instance ${host.name}` }, [
523
+ {
524
+ title: "instance",
525
+ fields: [
526
+ { label: "identity", value: host.name },
527
+ { label: "transport", value: host.id ?? "local" },
528
+ { label: "shape", value: `${host.rigs.length} rigs · ${host.rigs.reduce((n, rig) => n + rig.pods.reduce((m, pod) => m + pod.agents.length, 0), 0)} seats` },
529
+ ],
530
+ },
531
+ {
532
+ title: "rigs",
533
+ lines: host.rigs.length > 0
534
+ ? host.rigs.map((rig) => listItem(alignedRow([[rig.name, 20], [rig.lifecycleState ?? "unknown", 20], [`${rig.pods.length} pods · ${rig.pods.reduce((n, pod) => n + pod.agents.length, 0)} seats`, 24]]), { type: "drill", resource: "rig", name: rig.name, target: { host: host.name } }))
535
+ : [{ text: " (no local rigs served — proven empty)" }],
536
+ },
537
+ ]),
538
+ ];
539
+ }
540
+ if (state.viewTab === "graph") {
541
+ for (const rig of host.rigs) {
542
+ lines.push({ text: "" }, sectionRule(`rig ${rig.name} · ${rig.lifecycleState ?? "unknown"}`, contentWidth));
543
+ if (!rig.graph) {
544
+ if (motion.loading) {
545
+ if (!motion.reduced)
546
+ motion.used = true;
547
+ lines.push({ text: ` ${motion.frame} topology graph read pending` });
548
+ }
549
+ else if (snap.readErrors.some((error) => error.startsWith(`graph(${rig.name})`))) {
550
+ lines.push({ text: " ✕ topology graph read failed — named in the status line" });
551
+ }
552
+ else {
553
+ lines.push({ text: " (no topology graph served)" });
554
+ }
555
+ continue;
556
+ }
557
+ const canvas = renderGraphStyle(state.graphStyle, rig.graph, { host: host.name, rig: rig.name, selected: null }, contentWidth);
558
+ const plain = canvas.plainLines();
559
+ const segs = canvas.segLines();
560
+ for (let row = 0; row < plain.length; row++)
561
+ lines.push({
562
+ text: plain[row],
563
+ segs: segs[row],
564
+ zones: canvas.zones.filter((zone) => zone.y === row).map((zone) => ({ start: zone.start, end: zone.end, action: zone.action })),
565
+ });
566
+ }
567
+ if (host.rigs.length === 0)
568
+ lines.push({ text: "" }, { text: " (no local rigs served — proven empty)" });
569
+ lines.push({ text: "" }, { text: ` style: ${state.graphStyle} · style hatchet|braille|braille-fallback rides the command bar` });
570
+ return lines;
571
+ }
572
+ lines.push(healthSummaryLine(snap, scope, contentWidth));
573
+ lines.push({ text: state.filter ? `/ filter instance rows: ${state.filter} · / replace · esc clear` : "/ filter instance rows…" });
574
+ const columns = instanceAgentColumns(contentWidth);
575
+ lines.push({ text: tableRow(columns, { rig: "RIG", pod: "POD", seat: "SEAT", runtime: "RT", context: "CTX", status: "STATE", queue: "Q", work: "WORK", now: "NOW" }) });
576
+ lines.push({ text: "━".repeat(columnsWidth(columns)) });
577
+ let seatCount = 0;
578
+ let workingCount = 0;
579
+ let attentionCount = 0;
580
+ let openCount = 0;
581
+ for (const rig of host.rigs) {
582
+ const agents = rig.pods.flatMap((pod) => pod.agents.map((agent) => ({ pod: pod.name, agent })))
583
+ .filter(({ pod, agent }) => !state.filter || rig.name.includes(state.filter) || pod.includes(state.filter) || agent.name.includes(state.filter));
584
+ if (state.filter && agents.length === 0 && !rig.name.includes(state.filter))
585
+ continue;
586
+ const rigAction = { type: "drill", resource: "rig", name: rig.name, target: { host: host.name } };
587
+ if (agents.length === 0) {
588
+ lines.push({
589
+ text: tableRow(columns, { rig: rig.name, pod: "—", seat: "(no seats)", status: rig.lifecycleState ?? "unknown" }),
590
+ action: rigAction,
591
+ });
592
+ continue;
593
+ }
594
+ let previousPod = null;
595
+ for (const { pod, agent } of agents) {
596
+ const firstInPod = pod !== previousPod;
597
+ if (firstInPod && previousPod != null)
598
+ lines.push({ text: "┈".repeat(columnsWidth(columns)) });
599
+ previousPod = pod;
600
+ const stateCell = operationalState(agent.status, motion);
601
+ const queue = queueFacts(snap, agent.session);
602
+ seatCount += 1;
603
+ if (["active", "working", "running"].includes(agent.status))
604
+ workingCount += 1;
605
+ if (/attention|needs|blocked|unknown|failed/.test(agent.status))
606
+ attentionCount += 1;
607
+ openCount += queue.count;
608
+ lines.push({
609
+ text: tableRow(columns, {
610
+ rig: rig.name,
611
+ pod: firstInPod ? pod : "",
612
+ seat: `${stateCell.mark} ${seatName(pod, agent.name)}`,
613
+ runtime: runtimeShort(agent.runtime),
614
+ context: contextCompact(agent.context, contentWidth < 110),
615
+ status: stateCell.word,
616
+ queue: queue.count || "·",
617
+ work: queue.work,
618
+ now: queue.now,
619
+ }),
620
+ action: { type: "drill", resource: "agent", name: agent.name, target: { host: host.name, rig: rig.name, pod } },
621
+ zones: [{ start: 0, end: columns[0][2], action: rigAction }],
622
+ });
623
+ }
624
+ }
625
+ lines.push({ text: "" }, { text: `${host.rigs.length} rigs · ${seatCount} seats · ${workingCount} working · ${attentionCount} need attention · ${openCount} open rows` });
626
+ lines.push(...recentLines(snap, scope, contentWidth, false));
627
+ return lines;
628
+ }
160
629
  function contentLines(state, snap, contentWidth, motion) {
161
630
  const contentWidthForGraph = contentWidth;
162
631
  void contentWidthForGraph;
163
632
  const lines = [];
633
+ if (state.healthOpen)
634
+ return healthDetailLines(snap, state.healthOpen, contentWidth);
164
635
  // PULSE is a FULL-WIDTH view handled by an early return in renderScreen
165
636
  // (renderPulseScreen) — it never reaches the sidebar+content layout below.
166
637
  if (state.section === "topology") {
@@ -187,80 +658,13 @@ function contentLines(state, snap, contentWidth, motion) {
187
658
  const found = hostName ? findAgent(snap, leaf.name, { host: hostName, rig: rigName, pod: podName }) : findAgent(snap, leaf.name);
188
659
  if (!found)
189
660
  return [{ text: `agent "${leaf.name}" not in the current snapshot` }];
190
- const { agent, rig, pod } = found;
191
- const specInLibrary = !!agent.spec && !!findSpec(snap, agent.spec);
192
- // a4c9548a — S19 FOLLOW-ON FOUNDER RULING (binding, bounds the S19 marks
193
- // ruling): where there is ROOM, WRITE THE NAME — an icon NEVER replaces text
194
- // as the value. The detail page has room, so the runtime NAME is the VALUE
195
- // (honest placeholder when unserved); the mark's OWN token segments still ride
196
- // the seg channel (ROUND-4: colors/background survive stylization) but only
197
- // ACCOMPANY the name decoratively, never substitute. Topology cards remain
198
- // mark-only by space (layout.ts/hatchet.ts) — the ruling is bounded, not reversed.
199
- // LEG-7 LOW 2 (dead-arm cleanup, wave qitem 79159e6f): the daemon coerces a null runtime to the
200
- // string "unknown" BEFORE the wire (the icon-fix QA at 5a70e200 proved the old "— (not served)"
201
- // arm unreachable), so the defensive fallback matches that coercion — honest, never a misleading
202
- // placeholder. (The cwd field below keeps its own "— (not served)" — a legitimately-servable value.)
203
- const rtName = agent.runtime ?? "unknown";
204
- const rtSegs = [
205
- { text: " " },
206
- { text: "runtime:", token: "dim" },
207
- { text: " ".repeat(LABEL_W - "runtime:".length + 1) },
208
- { text: rtName },
209
- { text: " " },
210
- ...runtimeMarkSegs(agent.runtime),
211
- ];
212
- const runtimeLine = { text: rtSegs.map((g) => g.text).join(""), segs: rtSegs };
213
- return detailPage({ text: `agent ${agent.name}` }, [
214
- {
215
- title: "seat",
216
- fields: [
217
- { label: "state", value: agent.status },
218
- { label: "host", value: found.host.name },
219
- { label: "rig", value: rig.name },
220
- { label: "pod", value: pod.name },
221
- ],
222
- lines: [
223
- runtimeLine,
224
- fieldLine({
225
- label: "context",
226
- // ROUND-3 mr7: a quiet determinate bar rides REAL fractions only
227
- value: agent.context == null
228
- ? "— (not yet known)"
229
- : `${agent.context}% used · ${agent.tokens ?? "—"} tokens ${barCells(agent.context / 100, 10)}`,
230
- }),
231
- // S19 MR4 (§D9, founder: "very important"): the FULL absolute
232
- // working directory, verbatim; honest — when not served
233
- fieldLine({ label: "cwd", value: agent.cwd ?? "— (not served)" }),
234
- ],
235
- },
236
- {
237
- title: "spec",
238
- fields: [
239
- specInLibrary
240
- ? {
241
- label: "spec",
242
- value: agent.spec,
243
- link: { type: "cross", kind: "spec-of", name: agent.name, target: { host: found.host.name, rig: rig.name, pod: pod.name } },
244
- }
245
- : { label: "spec", value: agent.spec ? `${agent.spec} (not in library)` : "—" },
246
- ],
247
- },
248
- {
249
- title: "actions",
250
- fields: [
251
- ...(agent.attach ? [{ label: "attach", value: agent.attach }] : []),
252
- {
253
- label: "terminal",
254
- value: `term ▸ pod ${pod.name}`,
255
- link: { type: "act", act: "open-terminal", view: `pod:${rig.name}/${pod.name}` },
256
- },
257
- ],
258
- },
259
- ]);
661
+ return agentDetailLines(snap, found, contentWidth);
260
662
  }
261
- const rigName = state.drill.find((d) => d.kind === "rig")?.name ?? snap.hosts[0]?.rigs[0]?.name;
262
663
  const hostName = state.drill.find((d) => d.kind === "host")?.name;
263
664
  const host = (hostName ? snap.hosts.find((candidate) => candidate.name === hostName) : snap.hosts[0]);
665
+ if (leaf?.kind === "host" && host)
666
+ return instanceContentLines(state, snap, host, contentWidth, motion);
667
+ const rigName = state.drill.find((d) => d.kind === "rig")?.name ?? snap.hosts[0]?.rigs[0]?.name;
264
668
  const rig = host?.rigs.find((candidate) => candidate.name === rigName);
265
669
  if (!rig || !host) {
266
670
  // round-6 (guard): the ROOT topology branch consumes the OWNER's load
@@ -284,6 +688,15 @@ function contentLines(state, snap, contentWidth, motion) {
284
688
  .filter((a) => !state.filter || a.name.includes(state.filter) || a.pod.includes(state.filter));
285
689
  const suffix = `rig ${rig.name}${podFilter ? ` · pod ${podFilter}` : ""}${state.filter ? ` · filter "${state.filter}"` : ""}`;
286
690
  lines.push(...tabsLine(state, suffix));
691
+ const healthScope = { kind: "rig", rigId: rig.id ?? rig.name, rigName: rig.name, local: host === snap.hosts[0] };
692
+ if (state.viewTab === "health")
693
+ return [...lines, { text: "" }, ...healthListLines(snap, healthScope, contentWidth)];
694
+ if (state.viewTab === "recent") {
695
+ const recent = recentLines(snap, { kind: "rig", rig: rig.name }, contentWidth, true);
696
+ return recent.length > 0
697
+ ? [...lines, ...recent]
698
+ : [...lines, { text: "" }, { text: motion.loading ? `${motion.frame} rig RECENT read pending` : "(rig RECENT window not served)" }];
699
+ }
287
700
  if (state.viewTab === "graph") {
288
701
  // slice-17 topology view (frame-01): the rig's SERVED /graph projection
289
702
  // rendered by the style registry; honest-empty until the read answers.
@@ -332,7 +745,8 @@ function contentLines(state, snap, contentWidth, motion) {
332
745
  lines.push({ text: ` style: ${state.graphStyle} · style hatchet|braille|braille-fallback rides the command bar` });
333
746
  return lines;
334
747
  }
335
- lines.push({ text: state.filter ? `/ filter agents: ${state.filter}` : "/ filter agents…" });
748
+ lines.push(healthSummaryLine(snap, healthScope, contentWidth));
749
+ lines.push({ text: state.filter ? `/ filter agents: ${state.filter} · / replace · esc clear` : "/ filter agents…" });
336
750
  if (state.viewTab === "overview") {
337
751
  lines.push(...detailPage({ text: `rig ${rig.name}` }, [
338
752
  {
@@ -351,16 +765,24 @@ function contentLines(state, snap, contentWidth, motion) {
351
765
  return lines;
352
766
  }
353
767
  const agentCols = agentColumns(contentWidth);
768
+ const narrowFactory = !agentCols.some(([key]) => key === "model");
769
+ if (narrowFactory)
770
+ lines.push({ text: "MODEL/NOW/ACTIONS on drill (enter)" });
354
771
  lines.push({
355
772
  text: tableRow(agentCols, {
356
- rig: "RIG", pod: "POD", agent: "AGENT", runtime: "RUNTIME",
357
- context: "CTX%", tokens: "TOKENS", status: "STATUS", actions: "ACTIONS",
773
+ pod: "POD", seat: "SEAT", runtime: "RT", model: "MODEL", context: "CTX",
774
+ status: "STATE", queue: "Q", work: "WORK", now: "NOW", actions: "ACTIONS",
358
775
  }),
359
776
  });
360
- lines.push({ text: "─".repeat(columnsWidth(agentCols)) });
777
+ lines.push({ text: "━".repeat(columnsWidth(agentCols)) });
361
778
  const actionsIndex = agentCols.findIndex(([key]) => key === "actions");
362
- const actionsColStart = agentCols.slice(0, actionsIndex).reduce((n, [, , width]) => n + width + 1, 0);
779
+ const actionsColStart = actionsIndex < 0 ? -1 : agentCols.slice(0, actionsIndex).reduce((n, [, , width]) => n + width + 1, 0);
780
+ let previousPod = null;
363
781
  for (const a of rows) {
782
+ const firstInPod = a.pod !== previousPod;
783
+ if (firstInPod && previousPod != null && !narrowFactory)
784
+ lines.push({ text: "┈".repeat(columnsWidth(agentCols)) });
785
+ previousPod = a.pod;
364
786
  // ACTIONS = drive-structure ONLY (BR-9), each mapped to an EXISTING
365
787
  // write contract: `run ▸` = the rig-restore write (rendered only where
366
788
  // it applies — the seat is not running); `term ▸` = the terminal-open
@@ -368,25 +790,31 @@ function contentLines(state, snap, contentWidth, motion) {
368
790
  const canRun = a.canRun ?? !a.live;
369
791
  const actionsCell = canRun ? "run ▸ · term ▸" : "term ▸";
370
792
  const zones = [];
371
- const termOffset = actionsColStart + actionsCell.indexOf("term ▸");
372
- zones.push({ start: termOffset, end: termOffset + "term ▸".length, action: { type: "act", act: "open-terminal", view: `pod:${rig.name}/${a.pod}` } });
373
- if (canRun)
793
+ if (actionsColStart >= 0) {
794
+ const termOffset = actionsColStart + actionsCell.indexOf("term ▸");
795
+ zones.push({ start: termOffset, end: termOffset + "term ▸".length, action: { type: "act", act: "open-terminal", view: `pod:${rig.name}/${a.pod}` } });
796
+ }
797
+ if (canRun && actionsColStart >= 0)
374
798
  zones.push({
375
799
  start: actionsColStart,
376
800
  end: actionsColStart + "run ▸".length,
377
801
  action: { type: "act", act: "run", rigId: rig.id ?? rig.name, agent: a.name },
378
802
  });
803
+ const stateCell = operationalState(a.status, motion);
804
+ const queue = queueFacts(snap, a.session);
379
805
  lines.push({
380
806
  // the WHOLE row is the hit surface (not a testid'd control): clicking
381
807
  // any visible cell opens the agent; the ACTIONS zones override.
382
808
  text: tableRow(agentCols, {
383
- rig: rig.name,
384
- pod: a.pod,
385
- agent: a.name,
386
- runtime: a.runtime,
387
- context: a.context == null ? "—" : `${a.context}%`,
388
- tokens: a.tokens ?? "—",
389
- status: a.status,
809
+ pod: firstInPod ? a.pod : "",
810
+ seat: `${stateCell.mark} ${seatName(a.pod, a.name)}`,
811
+ runtime: runtimeShort(a.runtime),
812
+ model: tableModel(a.model),
813
+ context: contextCompact(a.context, narrowFactory),
814
+ status: stateCell.word,
815
+ queue: queue.count || "·",
816
+ work: queue.work,
817
+ now: queue.now,
390
818
  actions: actionsCell,
391
819
  }),
392
820
  action: { type: "drill", resource: "agent", name: a.name, target: { host: host.name, rig: rig.name, pod: a.pod } },
@@ -394,7 +822,11 @@ function contentLines(state, snap, contentWidth, motion) {
394
822
  });
395
823
  }
396
824
  lines.push({ text: "" });
397
- lines.push({ text: `${rows.length} of ${all.length} / ${rows.filter((agent) => agent.status === "idle").length} idle` });
825
+ const working = rows.filter((agent) => ["active", "working", "running"].includes(agent.status)).length;
826
+ const attention = rows.filter((agent) => /attention|needs|blocked|unknown|failed/.test(agent.status)).length;
827
+ lines.push({ text: `${rows.length} seats · ${working} working · ${attention} need attention · ${rows.reduce((n, agent) => n + queueFacts(snap, agent.session).count, 0)} open rows` });
828
+ if (!podFilter)
829
+ lines.push(...recentLines(snap, { kind: "rig", rig: rig.name }, contentWidth, false));
398
830
  return lines;
399
831
  }
400
832
  if (state.section === "specs") {
@@ -529,7 +961,7 @@ function contentLines(state, snap, contentWidth, motion) {
529
961
  return lines;
530
962
  }
531
963
  lines.push({ text: "SPEC LIBRARY" });
532
- lines.push({ text: state.filter ? `/ filter specs: ${state.filter}` : "/ filter specs…" });
964
+ lines.push({ text: state.filter ? `/ filter specs: ${state.filter} · / replace · esc clear` : "/ filter specs…" });
533
965
  // mirrors the explorer exactly (same grouping, same expansion state, same
534
966
  // filter-overrides-collapse rule) — glance consistency across panes
535
967
  const expandedSet = new Set(state.expanded);
@@ -623,8 +1055,9 @@ function contentLines(state, snap, contentWidth, motion) {
623
1055
  return lines;
624
1056
  }
625
1057
  if (state.section === "scopes") {
626
- // SCOPES owns both levels: mission selection opens the execution story;
627
- // slice selection retains the store-direct detail with a compact execution strip.
1058
+ // SCOPES owns both levels. Both mission-graph and Explorer slice routes land
1059
+ // on the same execution-backed canonical detail; store-direct content is
1060
+ // composed into that page instead of surviving as a competing destination.
628
1061
  const sel = state.scopesSelected;
629
1062
  const missionName = state.scopesMission;
630
1063
  const execution = snap.execution?.mission === missionName ? snap.execution : null;
@@ -632,7 +1065,16 @@ function contentLines(state, snap, contentWidth, motion) {
632
1065
  ? (snap.scopes ?? []).find((m) => m.mission === sel.mission)?.slices.find((sl) => sl.dirName === sel.slice) ?? null
633
1066
  : null;
634
1067
  if (state.executionOpen && execution) {
635
- return executionContentLines(execution, snap.scopes, snap.readErrors, state.executionOpen, contentWidth, false);
1068
+ return executionContentLines(execution, snap.scopes, snap.readErrors, state.executionOpen, contentWidth, false, snap.sliceDetail, {
1069
+ collapseReqs: state.scopesCollapseReqs,
1070
+ narrative: state.scopesNarrative,
1071
+ });
1072
+ }
1073
+ if (detail && execution) {
1074
+ return executionContentLines(execution, snap.scopes, snap.readErrors, `slice:${detail.id ?? detail.dirName}`, contentWidth, false, snap.sliceDetail, {
1075
+ collapseReqs: state.scopesCollapseReqs,
1076
+ narrative: state.scopesNarrative,
1077
+ });
636
1078
  }
637
1079
  if (!detail && missionName) {
638
1080
  const lines = executionContentLines(execution, snap.scopes, snap.readErrors, state.executionOpen, contentWidth, !snap.hydratedAt || snap.executionMission !== missionName);
@@ -642,7 +1084,7 @@ function contentLines(state, snap, contentWidth, motion) {
642
1084
  collapseReqs: state.scopesCollapseReqs,
643
1085
  narrative: state.scopesNarrative,
644
1086
  width: contentWidth,
645
- executionStrip: detail ? executionSliceStripLines(execution, detail.id ?? detail.dirName, detail.dirName, contentWidth, detail.status) : undefined,
1087
+ executionStrip: detail ? executionSliceStripLines(null, detail.id ?? detail.dirName, detail.dirName, contentWidth, detail.status) : undefined,
646
1088
  });
647
1089
  }
648
1090
  return [{ text: `(${state.section})` }];
@@ -670,14 +1112,17 @@ function spliceMarkerIntoSegs(segs, pos) {
670
1112
  }
671
1113
  return out;
672
1114
  }
673
- function paneRule(cols, joint, leftTitle, rightTitle) {
674
- const left = leftTitle ? `─ ${leftTitle} ` : "";
675
- const right = rightTitle ? `─ ${rightTitle} ` : "";
676
- const leftPart = (left + "─".repeat(EXPL_W)).slice(0, EXPL_W);
677
- const rightPart = (right + "─".repeat(cols)).slice(0, Math.max(cols - EXPL_W - 1, 0));
678
- return `${leftPart}${joint}${rightPart}`;
1115
+ function paneRule(cols, explW, joint, leftTitle, rightTitle) {
1116
+ void joint;
1117
+ const left = leftTitle ? `━ ${leftTitle} ` : "";
1118
+ const right = rightTitle ? `━ ${rightTitle} ` : "";
1119
+ const leftPart = (left + "━".repeat(explW)).slice(0, explW);
1120
+ const rightPart = (right + "━".repeat(cols)).slice(0, Math.max(cols - explW - 1, 0));
1121
+ return `${leftPart}╋${rightPart}`;
679
1122
  }
680
1123
  function keybindHints(state) {
1124
+ if (state.copyMode)
1125
+ return "drag to select/copy · v resume mouse · q quit";
681
1126
  // Affordance surfaces on REAL scrollability (contentMaxOffset), never gated
682
1127
  // behind already-being-content-focused — that gate was the catch-22 (the
683
1128
  // hint hid exactly where it was needed). When ↑↓ themselves scroll (a
@@ -686,7 +1131,8 @@ function keybindHints(state) {
686
1131
  const arrowsScroll = specDetailArrowsScroll(state);
687
1132
  const nav = arrowsScroll ? "↑↓ scroll" : "↑↓ move";
688
1133
  const pageScroll = state.contentMaxOffset > 0 && !arrowsScroll ? "⇞⇟ scroll · " : "";
689
- return `${nav} · ←→ pane · ⏎ open · ${pageScroll}: command · / filter · f footer · q quit`;
1134
+ const filter = state.filter ? "/ replace · esc clear" : "/ filter";
1135
+ return `${nav} · ←→ pane · ⏎ open · ${pageScroll}: command · ${filter} · v select/copy · f footer · q quit`;
690
1136
  }
691
1137
  /** The PULSE view renders FULL-WIDTH with NO explorer sidebar (increment 2). A
692
1138
  * minimal self-contained screen: cmd bar + a full-width titled rule + the pulse
@@ -712,8 +1158,19 @@ function truncateSegs(segs, width) {
712
1158
  }
713
1159
  return out;
714
1160
  }
1161
+ /** The disclosure cell is a distinct control from the row body. Hit lookup is
1162
+ * first-match, so register this one-cell target before the row-wide target. */
1163
+ function pushExplorerTargets(hitMap, row, display, y, explorerWidth) {
1164
+ if (row.disclosureAction) {
1165
+ const at = display.search(/[⌄›]/);
1166
+ if (at >= 0)
1167
+ hitMap.push({ y, x1: at + 2, x2: at + 2, action: row.disclosureAction });
1168
+ }
1169
+ hitMap.push({ y, x1: 1, x2: explorerWidth, action: row.action });
1170
+ }
715
1171
  function renderPulseScreen(state, snap, options, inputLine) {
716
1172
  const { cols = 120, rows = 32, nowMs = 0 } = options;
1173
+ const explW = explorerWidth(cols);
717
1174
  // FOUNDER OPTION-B (supersedes the earlier full-width ruling): PULSE renders as
718
1175
  // a content-pane view INSIDE the normal chrome — the EXPLORER sidebar STAYS (it
719
1176
  // is the founder's action path: from a needs-you row, mouse to the sidebar and
@@ -733,7 +1190,7 @@ function renderPulseScreen(state, snap, options, inputLine) {
733
1190
  const reduced = reducedMotion();
734
1191
  const load = options.load ?? { inFlight: false, settled: true };
735
1192
  const loading = load.inFlight || !load.settled;
736
- const frame = spinnerFrame(Math.floor(nowMs / 120), options.colorMode ?? "truecolor", reduced);
1193
+ const frame = spinnerFrame(Math.floor(nowMs / MOTION_FRAME_MS), options.colorMode ?? "truecolor", reduced);
737
1194
  const liveFlashes = (options.rowFlashes ?? []).filter((f) => flashActive(f.at, nowMs, 600, reduced));
738
1195
  const ackFlashes = (options.rowFlashes ?? []).filter((f) => flashActive(f.at, nowMs, 600, false));
739
1196
  const lines = [];
@@ -760,10 +1217,10 @@ function renderPulseScreen(state, snap, options, inputLine) {
760
1217
  lines.push(pad(`${mark} ${label}${alias} ${tail}`, cols));
761
1218
  }
762
1219
  }
763
- const explorerTitle = state.focusedPane === "explorer" ? "[ EXPLORER ]" : "EXPLORER";
764
- const contentTitle = state.focusedPane === "content" ? "[ PULSE ]" : "PULSE";
765
- lines.push(paneRule(cols, "┬", explorerTitle, contentTitle));
766
- const contentWidth = Math.max(cols - EXPL_W - 2, 0);
1220
+ const explorerTitle = state.focusedPane === "explorer" ? "{ EXPLORER }" : "EXPLORER";
1221
+ const contentTitle = state.focusedPane === "content" ? "{ PULSE }" : "PULSE";
1222
+ lines.push(paneRule(cols, explW, "top", explorerTitle, contentTitle));
1223
+ const contentWidth = Math.max(cols - explW - 2, 0);
767
1224
  const model = buildPulseModel(snap, nowMs);
768
1225
  const chromeRows = 3; // bottom rule + hint bar + status line
769
1226
  const bodyRows = Math.max(rows - 2 - chromeRows, 1);
@@ -802,7 +1259,7 @@ function renderPulseScreen(state, snap, options, inputLine) {
802
1259
  const visiblePulse = pulseLines.slice(contentStart, contentStart + bodyRows);
803
1260
  // EXPLORER sidebar = the normal navigator (same helpers as every other view).
804
1261
  const explorer = computeExplorerRows(state, snap);
805
- const { labels: explorerDisplay, metas: explorerMetas } = navigatorDisplay(explorer, snap, EXPL_W - 1);
1262
+ const { labels: explorerDisplay, metas: explorerMetas } = navigatorDisplay(explorer, snap, explW - 1);
806
1263
  const explorerStart = Math.min(Math.max(state.selection - bodyRows + 1, 0), Math.max(explorer.length - bodyRows, 0));
807
1264
  for (let i = 0; i < bodyRows; i++) {
808
1265
  const y = lines.length + 1;
@@ -812,16 +1269,16 @@ function renderPulseScreen(state, snap, options, inputLine) {
812
1269
  const flashed = row?.key != null && ackFlashes.some((f) => f.key === row.key);
813
1270
  if (flashed)
814
1271
  flashAck = true;
815
- const marker = explorerIndex === state.selection && row ? (flashed ? "»" : "›") : flashed ? "≈" : " ";
816
- const left = pad(row ? `${marker}${explorerDisplay[explorerIndex] ?? row.label}` : "", EXPL_W);
1272
+ const marker = explorerIndex === state.selection && row ? (flashed ? "◆" : "▶") : flashed ? "≈" : " ";
1273
+ const left = pad(row ? `${marker}${explorerDisplay[explorerIndex] ?? row.label}` : "", explW);
817
1274
  // CONTENT half = the pulse view, truncated to the content width. Selection is
818
1275
  // the per-cell bg on the segs (mock affordance), so the content marker slot
819
1276
  // stays blank — no "›" chevron (the native affordance the mock overrides).
820
1277
  const citem = visiblePulse[i];
821
1278
  const contentText = (citem?.text ?? "").slice(0, contentWidth);
822
- lines.push(pad(`${left}│ ${contentText}`, cols));
1279
+ lines.push(pad(`${left}┃ ${contentText}`, cols));
823
1280
  if (row) {
824
- hitMap.push({ y, x1: 1, x2: EXPL_W, action: row.action });
1281
+ pushExplorerTargets(hitMap, row, explorerDisplay[explorerIndex] ?? row.label, y, explW);
825
1282
  explorerRows.push({ ...row, y });
826
1283
  const em = explorerMetas[explorerIndex];
827
1284
  if (em && em.length)
@@ -833,16 +1290,16 @@ function renderPulseScreen(state, snap, options, inputLine) {
833
1290
  segRows[y] = truncateSegs(citem.segs, contentWidth);
834
1291
  }
835
1292
  // Lane cells → content targets, x mapped into the content column (origin =
836
- // EXPL_W + 3, matching the normal content zone geometry), clamped to `cols`.
1293
+ // explorer boundary + 3, matching normal content geometry), clamped to `cols`.
837
1294
  for (const t of visibleTargets) {
838
- const x1 = EXPL_W + 2 + t.x1;
1295
+ const x1 = explW + 2 + t.x1;
839
1296
  if (x1 > cols)
840
1297
  continue;
841
- const target = { y: t.lineIndex - contentStart + 3, x1, x2: Math.min(EXPL_W + 2 + t.x2, cols), action: t.action };
1298
+ const target = { y: t.lineIndex - contentStart + 3, x1, x2: Math.min(explW + 2 + t.x2, cols), action: t.action };
842
1299
  contentTargets.push(target);
843
1300
  hitMap.push(target);
844
1301
  }
845
- lines.push(paneRule(cols, "┴"));
1302
+ lines.push(paneRule(cols, explW, "bottom"));
846
1303
  lines.push(pad(keybindHints(state), cols));
847
1304
  const drillPath = state.drill.map((d) => d.name).join(" → ");
848
1305
  const readWarn = snap.readErrors.length > 0 ? ` ⚠ ${snap.readErrors.length} read(s) failed: ${snap.readErrors[0]}` : "";
@@ -858,6 +1315,7 @@ function renderPulseScreen(state, snap, options, inputLine) {
858
1315
  const anyFlash = model.lanes.some((l) => l.rows.some((r) => r.flashed));
859
1316
  return {
860
1317
  lines: lines.slice(0, rows),
1318
+ explorerWidth: explW,
861
1319
  hitMap,
862
1320
  contentTargets,
863
1321
  contentMaxOffset: maxContentOffset,
@@ -905,13 +1363,14 @@ function wrapContentLines(content, width) {
905
1363
  return out;
906
1364
  }
907
1365
  function crashCartShell(content, led, contentTitle, cols, rows, inputLine, opts) {
1366
+ const explW = explorerWidth(cols);
908
1367
  const lines = [];
909
1368
  const segRows = {};
910
1369
  lines.push(pad(`cmd ▸ ${inputLine}▊`, cols));
911
- lines.push(paneRule(cols, "┬", "EXPLORER", contentTitle));
1370
+ lines.push(paneRule(cols, explW, "top", "{ EXPLORER }", contentTitle));
912
1371
  // The ledger-fed explorer column: the honest marker, then one row per rig (name + seat count).
913
1372
  const leftRows = [led.note, "", ...led.rows.map((r) => `${r.label} (${r.seatCount})`)];
914
- const contentWidth = Math.max(cols - EXPL_W - 2, 0);
1373
+ const contentWidth = Math.max(cols - explW - 2, 0);
915
1374
  if (opts?.wrap)
916
1375
  content = wrapContentLines(content, contentWidth);
917
1376
  const bodyRows = Math.max(rows - 2 - 3, 1); // minus cmd bar + top rule + (bottom rule, hints, status)
@@ -922,14 +1381,14 @@ function crashCartShell(content, led, contentTitle, cols, rows, inputLine, opts)
922
1381
  const scroll = Math.max(0, Math.min(contentMaxOffset, opts?.scroll ?? 0));
923
1382
  for (let i = 0; i < bodyRows; i++) {
924
1383
  const y = lines.length + 1;
925
- const left = pad(leftRows[i] ?? "", EXPL_W);
1384
+ const left = pad(leftRows[i] ?? "", explW);
926
1385
  const citem = content[scroll + i];
927
1386
  const contentText = (citem?.text ?? "").slice(0, contentWidth);
928
- lines.push(pad(`${left}│ ${contentText}`, cols));
1387
+ lines.push(pad(`${left}┃ ${contentText}`, cols));
929
1388
  if (citem?.segs)
930
1389
  segRows[y] = truncateSegs(citem.segs, contentWidth);
931
1390
  }
932
- lines.push(paneRule(cols, "┴"));
1391
+ lines.push(paneRule(cols, explW, "bottom"));
933
1392
  lines.push(pad("", cols));
934
1393
  const scrollHint = contentMaxOffset > 0 ? ` · ↑↓ scroll (${scroll}/${contentMaxOffset})` : "";
935
1394
  lines.push(pad(`[crash-cart] daemon down · explorer ${led.note}${scrollHint}`, cols));
@@ -937,6 +1396,7 @@ function crashCartShell(content, led, contentTitle, cols, rows, inputLine, opts)
937
1396
  lines.push("");
938
1397
  return {
939
1398
  lines: lines.slice(0, rows),
1399
+ explorerWidth: explW,
940
1400
  hitMap: [],
941
1401
  contentTargets: [],
942
1402
  contentMaxOffset,
@@ -946,6 +1406,7 @@ function crashCartShell(content, led, contentTitle, cols, rows, inputLine, opts)
946
1406
  }
947
1407
  export function renderScreen(state, snap, options = {}, inputLine = "") {
948
1408
  const { cols = 120, rows = 32, nowMs = 0 } = options;
1409
+ const explW = explorerWidth(cols);
949
1410
  // 5.2 crash-cart (shell-placement rework, ruling 3c6c2be0): daemon-DOWN renders as a CONTENT-PANE
950
1411
  // view inside the standard shell — the explorer sidebar is ALWAYS present, ledger-fed + honestly
951
1412
  // marked (from the SAME one-JSON discovery, never a second read). Content moves into the right pane
@@ -986,7 +1447,7 @@ export function renderScreen(state, snap, options = {}, inputLine = "") {
986
1447
  const reduced = reducedMotion();
987
1448
  const load = options.load ?? { inFlight: false, settled: true };
988
1449
  const motion = {
989
- frame: spinnerFrame(Math.floor(nowMs / 120), options.colorMode ?? "truecolor", reduced),
1450
+ frame: spinnerFrame(Math.floor(nowMs / MOTION_FRAME_MS), options.colorMode ?? "truecolor", reduced),
990
1451
  reduced,
991
1452
  used: false,
992
1453
  loading: load.inFlight || !load.settled,
@@ -1016,14 +1477,14 @@ export function renderScreen(state, snap, options = {}, inputLine = "") {
1016
1477
  }
1017
1478
  const sectionTitle = { topology: "TOPOLOGY", specs: "SPECS", needs: "NEEDS-YOU" }[state.section] ?? state.section.toUpperCase();
1018
1479
  // active-pane emphasis (k9s-class chrome): the focused pane's title is bracketed
1019
- const explorerTitle = state.focusedPane === "explorer" ? "[ EXPLORER ]" : "EXPLORER";
1020
- const contentTitle = state.focusedPane === "content" ? `[ ${sectionTitle} ]` : sectionTitle;
1021
- lines.push(paneRule(cols, "┬", explorerTitle, contentTitle));
1480
+ const explorerTitle = state.focusedPane === "explorer" ? "{ EXPLORER }" : "EXPLORER";
1481
+ const contentTitle = state.focusedPane === "content" ? `{ ${sectionTitle} }` : sectionTitle;
1482
+ lines.push(paneRule(cols, explW, "top", explorerTitle, contentTitle));
1022
1483
  const explorer = computeExplorerRows(state, snap);
1023
1484
  // Slice-17: the file-tree re-skin is a DISPLAY transform only — rows, keys,
1024
1485
  // actions, and the hit-map all keep resolving against the row model above.
1025
- const { labels: explorerDisplay, metas: explorerMetas } = navigatorDisplay(explorer, snap, EXPL_W - 1);
1026
- const content = contentLines(state, snap, Math.max(cols - EXPL_W - 2, 0), motion);
1486
+ const { labels: explorerDisplay, metas: explorerMetas } = navigatorDisplay(explorer, snap, explW - 1);
1487
+ const content = contentLines(state, snap, Math.max(cols - explW - 2, 0), motion);
1027
1488
  const footer = state.footerOn ? snap.stream.at(-1) : undefined;
1028
1489
  // round-5 (guard): the tmux-style ONE-SHOT activity flash targets the
1029
1490
  // flashed agent's EXPLORER row — per-seat pane-output events from the
@@ -1073,8 +1534,8 @@ export function renderScreen(state, snap, options = {}, inputLine = "") {
1073
1534
  const flashed = row?.key != null && ackFlashes.some((f) => f.key === row.key);
1074
1535
  if (flashed)
1075
1536
  flashAck = true;
1076
- const marker = explorerIndex === state.selection && row ? (flashed ? "»" : "›") : flashed ? "≈" : " ";
1077
- const left = pad(row ? `${marker}${explorerDisplay[explorerIndex] ?? row.label}` : "", EXPL_W);
1537
+ const marker = explorerIndex === state.selection && row ? (flashed ? "◆" : "▶") : flashed ? "≈" : " ";
1538
+ const left = pad(row ? `${marker}${explorerDisplay[explorerIndex] ?? row.label}` : "", explW);
1078
1539
  const item = visibleContent[i];
1079
1540
  const targetIndex = contentTargets.length;
1080
1541
  const zones = item?.zones ?? [];
@@ -1095,9 +1556,9 @@ export function renderScreen(state, snap, options = {}, inputLine = "") {
1095
1556
  else
1096
1557
  contentMarker = "›";
1097
1558
  }
1098
- lines.push(pad(`${left}│${contentMarker}${contentText}`, cols));
1559
+ lines.push(pad(`${left}┃${contentMarker}${contentText}`, cols));
1099
1560
  if (row) {
1100
- hitMap.push({ y, x1: 1, x2: EXPL_W, action: row.action });
1561
+ pushExplorerTargets(hitMap, row, explorerDisplay[explorerIndex] ?? row.label, y, explW);
1101
1562
  explorerRows.push({ ...row, y });
1102
1563
  const em = explorerMetas[explorerIndex];
1103
1564
  if (em && em.length)
@@ -1107,12 +1568,12 @@ export function renderScreen(state, snap, options = {}, inputLine = "") {
1107
1568
  }
1108
1569
  // zones first: hit lookup takes the first match, so a zone wins over the row-wide action
1109
1570
  for (const z of zones) {
1110
- const target = { y, x1: EXPL_W + 3 + z.start, x2: EXPL_W + 2 + z.end, action: z.action };
1571
+ const target = { y, x1: explW + 3 + z.start, x2: explW + 2 + z.end, action: z.action };
1111
1572
  hitMap.push(target);
1112
1573
  contentTargets.push(target);
1113
1574
  }
1114
1575
  if (item?.action) {
1115
- const target = { y, x1: EXPL_W + 3, x2: cols, action: item.action };
1576
+ const target = { y, x1: explW + 3, x2: cols, action: item.action };
1116
1577
  hitMap.push(target);
1117
1578
  contentTargets.push(target);
1118
1579
  }
@@ -1123,13 +1584,14 @@ export function renderScreen(state, snap, options = {}, inputLine = "") {
1123
1584
  lines.push(pad(`≋ ${footer.tsEmitted.slice(11, 16)} ${footer.sourceSession}: ${footer.body}`, cols));
1124
1585
  const drillPath = state.drill.map((d) => d.name).join(" → ");
1125
1586
  const readWarn = snap.readErrors.length > 0 ? ` ⚠ ${snap.readErrors.length} read(s) failed: ${snap.readErrors[0]}` : "";
1126
- lines.push(paneRule(cols, "┴"));
1587
+ lines.push(paneRule(cols, explW, "bottom"));
1127
1588
  lines.push(pad(keybindHints(state), cols));
1128
1589
  lines.push(pad(`[${state.instanceId}] ${state.section}${drillPath ? " · " + drillPath : ""}${state.lastError ? " ✗ " + state.lastError : ""}${state.notice ? " ▸ " + state.notice : ""}${readWarn}`, cols));
1129
1590
  while (lines.length < rows)
1130
1591
  lines.push("");
1131
1592
  return {
1132
1593
  lines: lines.slice(0, rows),
1594
+ explorerWidth: explW,
1133
1595
  hitMap,
1134
1596
  contentTargets,
1135
1597
  contentMaxOffset: maxContentOffset,