@openrig/cli 0.5.13 → 0.5.15

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 (434) hide show
  1. package/daemon/assets/plugins/openrig-core/skills/applying-a-permission-policy/SKILL.md +159 -108
  2. package/daemon/assets/plugins/openrig-core/skills/messaging-the-human/SKILL.md +40 -5
  3. package/daemon/assets/plugins/openrig-core/skills/openrig-skills/SKILL.md +1 -0
  4. package/daemon/context-packs/onboarding-width/manifest.yaml +1 -1
  5. package/daemon/context-packs/onboarding-width/public-what-you-can-do.md +48 -14
  6. package/daemon/context-packs/skills/agent-operated-software/manifest.yaml +1 -1
  7. package/daemon/context-packs/skills/agent-operated-workflows/manifest.yaml +1 -1
  8. package/daemon/context-packs/skills/applying-a-permission-policy/SKILL.md +159 -108
  9. package/daemon/context-packs/skills/applying-a-permission-policy/manifest.yaml +3 -3
  10. package/daemon/context-packs/skills/claude-compaction-restore/manifest.yaml +1 -1
  11. package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +1 -1
  12. package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +1 -1
  13. package/daemon/context-packs/skills/core/cross-host-rig-commands/manifest.yaml +1 -1
  14. package/daemon/context-packs/skills/core/human-in-the-loop/manifest.yaml +1 -1
  15. package/daemon/context-packs/skills/core/messaging-the-human/SKILL.md +40 -5
  16. package/daemon/context-packs/skills/core/messaging-the-human/manifest.yaml +1 -1
  17. package/daemon/context-packs/skills/core/openrig-architect/manifest.yaml +1 -1
  18. package/daemon/context-packs/skills/core/openrig-cmux/manifest.yaml +1 -1
  19. package/daemon/context-packs/skills/core/openrig-herdr/manifest.yaml +1 -1
  20. package/daemon/context-packs/skills/core/openrig-skills/SKILL.md +1 -0
  21. package/daemon/context-packs/skills/core/openrig-skills/manifest.yaml +1 -1
  22. package/daemon/context-packs/skills/core/openrig-software-factory/SKILL.md +138 -0
  23. package/daemon/context-packs/skills/core/openrig-software-factory/manifest.yaml +12 -0
  24. package/daemon/context-packs/skills/core/openrig-software-factory/references/worked-example.md +543 -0
  25. package/daemon/context-packs/skills/core/openrig-upgrade/manifest.yaml +1 -1
  26. package/daemon/context-packs/skills/core/rig-bundles-and-shareable-artifacts/manifest.yaml +1 -1
  27. package/daemon/context-packs/skills/core/rig-lifecycle/manifest.yaml +1 -1
  28. package/daemon/context-packs/skills/core/session-source-fork/manifest.yaml +1 -1
  29. package/daemon/context-packs/skills/core/specification-system/manifest.yaml +1 -1
  30. package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/manifest.yaml +1 -1
  31. package/daemon/context-packs/skills/core/watchdog/manifest.yaml +1 -1
  32. package/daemon/context-packs/skills/delegating-work/manifest.yaml +1 -1
  33. package/daemon/context-packs/skills/forming-an-openrig-mental-model/manifest.yaml +1 -1
  34. package/daemon/context-packs/skills/loading-addressable-markdown/manifest.yaml +1 -1
  35. package/daemon/context-packs/skills/mission-slice-sop/manifest.yaml +1 -1
  36. package/daemon/context-packs/skills/openrig-operating-model/manifest.yaml +1 -1
  37. package/daemon/context-packs/skills/openrig-user/manifest.yaml +1 -1
  38. package/daemon/context-packs/skills/orienting-to-an-inherited-seat/manifest.yaml +1 -1
  39. package/daemon/context-packs/skills/pm/backlog-capture/manifest.yaml +1 -1
  40. package/daemon/context-packs/skills/pm/context-builder/manifest.yaml +1 -1
  41. package/daemon/context-packs/skills/pm/exec-summary/manifest.yaml +1 -1
  42. package/daemon/context-packs/skills/pm/office-hours/manifest.yaml +1 -1
  43. package/daemon/context-packs/skills/pm/plan-review/manifest.yaml +1 -1
  44. package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +1 -1
  45. package/daemon/context-packs/skills/pm/ui-mockup/manifest.yaml +1 -1
  46. package/daemon/context-packs/skills/pods/development-team/manifest.yaml +1 -1
  47. package/daemon/context-packs/skills/pods/orchestration-team/manifest.yaml +1 -1
  48. package/daemon/context-packs/skills/pods/oversight-team/manifest.yaml +1 -1
  49. package/daemon/context-packs/skills/pods/review-team/manifest.yaml +1 -1
  50. package/daemon/context-packs/skills/process/agent-browser/manifest.yaml +1 -1
  51. package/daemon/context-packs/skills/process/context-engineering/manifest.yaml +1 -1
  52. package/daemon/context-packs/skills/process/dogfood/manifest.yaml +1 -1
  53. package/daemon/context-packs/skills/process/frontend-design/manifest.yaml +1 -1
  54. package/daemon/context-packs/skills/process/systematic-debugging/manifest.yaml +1 -1
  55. package/daemon/context-packs/skills/process/test-driven-development/manifest.yaml +1 -1
  56. package/daemon/context-packs/skills/process/verification-before-completion/manifest.yaml +1 -1
  57. package/daemon/context-packs/skills/queue-handoff/manifest.yaml +1 -1
  58. package/daemon/context-packs/skills/refocusing/manifest.yaml +1 -1
  59. package/daemon/context-packs/skills/retiring-and-inheriting-a-seat/manifest.yaml +1 -1
  60. package/daemon/context-packs/skills/seat-continuity-and-handover/manifest.yaml +1 -1
  61. package/daemon/context-packs/skills/session-compaction-and-restore/manifest.yaml +1 -1
  62. package/daemon/context-packs/skills/software-for-agents/manifest.yaml +1 -1
  63. package/daemon/context-packs/world-example/manifest.yaml +1 -1
  64. package/daemon/context-packs/world-public/manifest.yaml +1 -1
  65. package/daemon/dist/adapters/codex-runtime-adapter.d.ts +5 -15
  66. package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  67. package/daemon/dist/adapters/codex-runtime-adapter.js +79 -93
  68. package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  69. package/daemon/dist/adapters/pi-runner-protocol.d.ts.map +1 -1
  70. package/daemon/dist/adapters/pi-runner-protocol.js +14 -9
  71. package/daemon/dist/adapters/pi-runner-protocol.js.map +1 -1
  72. package/daemon/dist/adapters/pi-runner.d.ts +6 -15
  73. package/daemon/dist/adapters/pi-runner.d.ts.map +1 -1
  74. package/daemon/dist/adapters/pi-runner.js +151 -71
  75. package/daemon/dist/adapters/pi-runner.js.map +1 -1
  76. package/daemon/dist/attention-surface.d.ts +2 -0
  77. package/daemon/dist/attention-surface.d.ts.map +1 -1
  78. package/daemon/dist/attention-surface.js +2 -1
  79. package/daemon/dist/attention-surface.js.map +1 -1
  80. package/daemon/dist/build-info.js +3 -3
  81. package/daemon/dist/db/all-migrations.d.ts +1 -1
  82. package/daemon/dist/db/all-migrations.d.ts.map +1 -1
  83. package/daemon/dist/db/all-migrations.js +10 -2
  84. package/daemon/dist/db/all-migrations.js.map +1 -1
  85. package/daemon/dist/db/migrations/081_human_notification_intent.d.ts +3 -0
  86. package/daemon/dist/db/migrations/081_human_notification_intent.d.ts.map +1 -0
  87. package/daemon/dist/db/migrations/081_human_notification_intent.js +9 -0
  88. package/daemon/dist/db/migrations/081_human_notification_intent.js.map +1 -0
  89. package/daemon/dist/db/migrations/082_archive_identity_provenance.d.ts +5 -0
  90. package/daemon/dist/db/migrations/082_archive_identity_provenance.d.ts.map +1 -0
  91. package/daemon/dist/db/migrations/082_archive_identity_provenance.js +7 -0
  92. package/daemon/dist/db/migrations/082_archive_identity_provenance.js.map +1 -0
  93. package/daemon/dist/db/migrations/083_review_read_indexes.d.ts +4 -0
  94. package/daemon/dist/db/migrations/083_review_read_indexes.d.ts.map +1 -0
  95. package/daemon/dist/db/migrations/083_review_read_indexes.js +12 -0
  96. package/daemon/dist/db/migrations/083_review_read_indexes.js.map +1 -0
  97. package/daemon/dist/db/migrations/084_inventory_event_indexes.d.ts +5 -0
  98. package/daemon/dist/db/migrations/084_inventory_event_indexes.d.ts.map +1 -0
  99. package/daemon/dist/db/migrations/084_inventory_event_indexes.js +14 -0
  100. package/daemon/dist/db/migrations/084_inventory_event_indexes.js.map +1 -0
  101. package/daemon/dist/domain/bootstrap-orchestrator.js +2 -2
  102. package/daemon/dist/domain/bootstrap-orchestrator.js.map +1 -1
  103. package/daemon/dist/domain/execution-view.d.ts.map +1 -1
  104. package/daemon/dist/domain/execution-view.js +18 -5
  105. package/daemon/dist/domain/execution-view.js.map +1 -1
  106. package/daemon/dist/domain/gateway/connections-projection.d.ts +3 -3
  107. package/daemon/dist/domain/gateway/slack/message.d.ts +13 -12
  108. package/daemon/dist/domain/gateway/slack/message.d.ts.map +1 -1
  109. package/daemon/dist/domain/gateway/slack/message.js +40 -77
  110. package/daemon/dist/domain/gateway/slack/message.js.map +1 -1
  111. package/daemon/dist/domain/gateway/slack/outbound-driver.d.ts +2 -0
  112. package/daemon/dist/domain/gateway/slack/outbound-driver.d.ts.map +1 -1
  113. package/daemon/dist/domain/gateway/slack/outbound-driver.js +2 -0
  114. package/daemon/dist/domain/gateway/slack/outbound-driver.js.map +1 -1
  115. package/daemon/dist/domain/gateway/slack/queue-access.d.ts +2 -0
  116. package/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -1
  117. package/daemon/dist/domain/gateway/slack/queue-access.js +2 -0
  118. package/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -1
  119. package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +4 -1
  120. package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -1
  121. package/daemon/dist/domain/gateway/slack/slack-delivery.js +85 -3
  122. package/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -1
  123. package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
  124. package/daemon/dist/domain/gateway/slack/slack-subsystem.js +8 -1
  125. package/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -1
  126. package/daemon/dist/domain/native-process-lineage.d.ts +23 -0
  127. package/daemon/dist/domain/native-process-lineage.d.ts.map +1 -1
  128. package/daemon/dist/domain/native-process-lineage.js +84 -4
  129. package/daemon/dist/domain/native-process-lineage.js.map +1 -1
  130. package/daemon/dist/domain/policies/delivery-digest-flush.d.ts.map +1 -1
  131. package/daemon/dist/domain/policies/delivery-digest-flush.js +23 -3
  132. package/daemon/dist/domain/policies/delivery-digest-flush.js.map +1 -1
  133. package/daemon/dist/domain/proof/judgments.d.ts +10 -3
  134. package/daemon/dist/domain/proof/judgments.d.ts.map +1 -1
  135. package/daemon/dist/domain/proof/judgments.js +26 -8
  136. package/daemon/dist/domain/proof/judgments.js.map +1 -1
  137. package/daemon/dist/domain/queue-repository.d.ts +19 -6
  138. package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  139. package/daemon/dist/domain/queue-repository.js +61 -11
  140. package/daemon/dist/domain/queue-repository.js.map +1 -1
  141. package/daemon/dist/domain/queue-retention.d.ts.map +1 -1
  142. package/daemon/dist/domain/queue-retention.js +6 -2
  143. package/daemon/dist/domain/queue-retention.js.map +1 -1
  144. package/daemon/dist/domain/queue-transition-log.d.ts +1 -0
  145. package/daemon/dist/domain/queue-transition-log.d.ts.map +1 -1
  146. package/daemon/dist/domain/queue-transition-log.js +19 -7
  147. package/daemon/dist/domain/queue-transition-log.js.map +1 -1
  148. package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
  149. package/daemon/dist/domain/restore-orchestrator.js +20 -3
  150. package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
  151. package/daemon/dist/domain/review/fleet-compose.d.ts +7 -6
  152. package/daemon/dist/domain/review/fleet-compose.d.ts.map +1 -1
  153. package/daemon/dist/domain/review/fleet-compose.js +25 -11
  154. package/daemon/dist/domain/review/fleet-compose.js.map +1 -1
  155. package/daemon/dist/domain/rigspec-instantiator.d.ts +18 -0
  156. package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  157. package/daemon/dist/domain/rigspec-instantiator.js +109 -6
  158. package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  159. package/daemon/dist/domain/scope/scope-view-projection.d.ts +2 -2
  160. package/daemon/dist/domain/scope/scope-view-projection.d.ts.map +1 -1
  161. package/daemon/dist/domain/scope/scope-view-projection.js +2 -2
  162. package/daemon/dist/domain/scope/scope-view-projection.js.map +1 -1
  163. package/daemon/dist/domain/seat-attention-reconciler.d.ts +2 -6
  164. package/daemon/dist/domain/seat-attention-reconciler.d.ts.map +1 -1
  165. package/daemon/dist/domain/seat-attention-reconciler.js +15 -6
  166. package/daemon/dist/domain/seat-attention-reconciler.js.map +1 -1
  167. package/daemon/dist/domain/seat-identity-reconciler.d.ts +5 -1
  168. package/daemon/dist/domain/seat-identity-reconciler.d.ts.map +1 -1
  169. package/daemon/dist/domain/seat-identity-reconciler.js +36 -10
  170. package/daemon/dist/domain/seat-identity-reconciler.js.map +1 -1
  171. package/daemon/dist/domain/seat-lifecycle-service.d.ts +3 -0
  172. package/daemon/dist/domain/seat-lifecycle-service.d.ts.map +1 -1
  173. package/daemon/dist/domain/seat-lifecycle-service.js +3 -0
  174. package/daemon/dist/domain/seat-lifecycle-service.js.map +1 -1
  175. package/daemon/dist/domain/terminal/terminal-service.d.ts +2 -0
  176. package/daemon/dist/domain/terminal/terminal-service.d.ts.map +1 -1
  177. package/daemon/dist/domain/terminal/terminal-service.js +4 -1
  178. package/daemon/dist/domain/terminal/terminal-service.js.map +1 -1
  179. package/daemon/dist/domain/workspace/project-read.d.ts +1 -1
  180. package/daemon/dist/domain/workspace/project-read.d.ts.map +1 -1
  181. package/daemon/dist/domain/workspace/project-read.js +24 -6
  182. package/daemon/dist/domain/workspace/project-read.js.map +1 -1
  183. package/daemon/dist/routes/attention.js +2 -2
  184. package/daemon/dist/routes/attention.js.map +1 -1
  185. package/daemon/dist/routes/queue.d.ts +4 -18
  186. package/daemon/dist/routes/queue.d.ts.map +1 -1
  187. package/daemon/dist/routes/queue.js +23 -33
  188. package/daemon/dist/routes/queue.js.map +1 -1
  189. package/daemon/dist/routes/review.js +1 -1
  190. package/daemon/dist/routes/rigs.js +5 -1
  191. package/daemon/dist/routes/rigs.js.map +1 -1
  192. package/daemon/dist/routes/scopes.d.ts.map +1 -1
  193. package/daemon/dist/routes/scopes.js +37 -28
  194. package/daemon/dist/routes/scopes.js.map +1 -1
  195. package/daemon/dist/routes/sessions.js +12 -1
  196. package/daemon/dist/routes/sessions.js.map +1 -1
  197. package/daemon/dist/routes/up.js +4 -4
  198. package/daemon/dist/routes/up.js.map +1 -1
  199. package/daemon/dist/startup.d.ts.map +1 -1
  200. package/daemon/dist/startup.js +11 -1
  201. package/daemon/dist/startup.js.map +1 -1
  202. package/daemon/docs/reference/agent-startup-guide.md +11 -3
  203. package/daemon/docs/reference/getting-started.md +211 -14
  204. package/daemon/docs/reference/rig-spec.md +7 -0
  205. package/daemon/policies/builtin/yolo.policy.md +14 -4
  206. package/daemon/specs/agents/shared/skills/core/messaging-the-human/SKILL.md +40 -5
  207. package/daemon/specs/agents/shared/skills/core/openrig-skills/SKILL.md +1 -0
  208. package/daemon/specs/agents/shared/skills/core/openrig-software-factory/SKILL.md +138 -0
  209. package/daemon/specs/agents/shared/skills/core/openrig-software-factory/references/worked-example.md +543 -0
  210. package/dist/build-info.js +3 -3
  211. package/dist/commands/launch.d.ts.map +1 -1
  212. package/dist/commands/launch.js +27 -2
  213. package/dist/commands/launch.js.map +1 -1
  214. package/dist/commands/queue.d.ts.map +1 -1
  215. package/dist/commands/queue.js +5 -1
  216. package/dist/commands/queue.js.map +1 -1
  217. package/dist/commands/up.d.ts.map +1 -1
  218. package/dist/commands/up.js +13 -2
  219. package/dist/commands/up.js.map +1 -1
  220. package/node_modules/@openrig/daemon/dist/adapters/codex-runtime-adapter.d.ts +5 -15
  221. package/node_modules/@openrig/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  222. package/node_modules/@openrig/daemon/dist/adapters/codex-runtime-adapter.js +79 -93
  223. package/node_modules/@openrig/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  224. package/node_modules/@openrig/daemon/dist/adapters/pi-runner-protocol.d.ts.map +1 -1
  225. package/node_modules/@openrig/daemon/dist/adapters/pi-runner-protocol.js +14 -9
  226. package/node_modules/@openrig/daemon/dist/adapters/pi-runner-protocol.js.map +1 -1
  227. package/node_modules/@openrig/daemon/dist/adapters/pi-runner.d.ts +6 -15
  228. package/node_modules/@openrig/daemon/dist/adapters/pi-runner.d.ts.map +1 -1
  229. package/node_modules/@openrig/daemon/dist/adapters/pi-runner.js +151 -71
  230. package/node_modules/@openrig/daemon/dist/adapters/pi-runner.js.map +1 -1
  231. package/node_modules/@openrig/daemon/dist/attention-surface.d.ts +2 -0
  232. package/node_modules/@openrig/daemon/dist/attention-surface.d.ts.map +1 -1
  233. package/node_modules/@openrig/daemon/dist/attention-surface.js +2 -1
  234. package/node_modules/@openrig/daemon/dist/attention-surface.js.map +1 -1
  235. package/node_modules/@openrig/daemon/dist/build-info.js +3 -3
  236. package/node_modules/@openrig/daemon/dist/db/all-migrations.d.ts +1 -1
  237. package/node_modules/@openrig/daemon/dist/db/all-migrations.d.ts.map +1 -1
  238. package/node_modules/@openrig/daemon/dist/db/all-migrations.js +10 -2
  239. package/node_modules/@openrig/daemon/dist/db/all-migrations.js.map +1 -1
  240. package/node_modules/@openrig/daemon/dist/db/migrations/081_human_notification_intent.d.ts +3 -0
  241. package/node_modules/@openrig/daemon/dist/db/migrations/081_human_notification_intent.d.ts.map +1 -0
  242. package/node_modules/@openrig/daemon/dist/db/migrations/081_human_notification_intent.js +9 -0
  243. package/node_modules/@openrig/daemon/dist/db/migrations/081_human_notification_intent.js.map +1 -0
  244. package/node_modules/@openrig/daemon/dist/db/migrations/082_archive_identity_provenance.d.ts +5 -0
  245. package/node_modules/@openrig/daemon/dist/db/migrations/082_archive_identity_provenance.d.ts.map +1 -0
  246. package/node_modules/@openrig/daemon/dist/db/migrations/082_archive_identity_provenance.js +7 -0
  247. package/node_modules/@openrig/daemon/dist/db/migrations/082_archive_identity_provenance.js.map +1 -0
  248. package/node_modules/@openrig/daemon/dist/db/migrations/083_review_read_indexes.d.ts +4 -0
  249. package/node_modules/@openrig/daemon/dist/db/migrations/083_review_read_indexes.d.ts.map +1 -0
  250. package/node_modules/@openrig/daemon/dist/db/migrations/083_review_read_indexes.js +12 -0
  251. package/node_modules/@openrig/daemon/dist/db/migrations/083_review_read_indexes.js.map +1 -0
  252. package/node_modules/@openrig/daemon/dist/db/migrations/084_inventory_event_indexes.d.ts +5 -0
  253. package/node_modules/@openrig/daemon/dist/db/migrations/084_inventory_event_indexes.d.ts.map +1 -0
  254. package/node_modules/@openrig/daemon/dist/db/migrations/084_inventory_event_indexes.js +14 -0
  255. package/node_modules/@openrig/daemon/dist/db/migrations/084_inventory_event_indexes.js.map +1 -0
  256. package/node_modules/@openrig/daemon/dist/domain/bootstrap-orchestrator.js +2 -2
  257. package/node_modules/@openrig/daemon/dist/domain/bootstrap-orchestrator.js.map +1 -1
  258. package/node_modules/@openrig/daemon/dist/domain/execution-view.d.ts.map +1 -1
  259. package/node_modules/@openrig/daemon/dist/domain/execution-view.js +18 -5
  260. package/node_modules/@openrig/daemon/dist/domain/execution-view.js.map +1 -1
  261. package/node_modules/@openrig/daemon/dist/domain/gateway/connections-projection.d.ts +3 -3
  262. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.d.ts +13 -12
  263. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.d.ts.map +1 -1
  264. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.js +40 -77
  265. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.js.map +1 -1
  266. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.d.ts +2 -0
  267. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.d.ts.map +1 -1
  268. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.js +2 -0
  269. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.js.map +1 -1
  270. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.d.ts +2 -0
  271. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -1
  272. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.js +2 -0
  273. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -1
  274. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +4 -1
  275. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -1
  276. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.js +85 -3
  277. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -1
  278. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
  279. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.js +8 -1
  280. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -1
  281. package/node_modules/@openrig/daemon/dist/domain/native-process-lineage.d.ts +23 -0
  282. package/node_modules/@openrig/daemon/dist/domain/native-process-lineage.d.ts.map +1 -1
  283. package/node_modules/@openrig/daemon/dist/domain/native-process-lineage.js +84 -4
  284. package/node_modules/@openrig/daemon/dist/domain/native-process-lineage.js.map +1 -1
  285. package/node_modules/@openrig/daemon/dist/domain/policies/delivery-digest-flush.d.ts.map +1 -1
  286. package/node_modules/@openrig/daemon/dist/domain/policies/delivery-digest-flush.js +23 -3
  287. package/node_modules/@openrig/daemon/dist/domain/policies/delivery-digest-flush.js.map +1 -1
  288. package/node_modules/@openrig/daemon/dist/domain/proof/judgments.d.ts +10 -3
  289. package/node_modules/@openrig/daemon/dist/domain/proof/judgments.d.ts.map +1 -1
  290. package/node_modules/@openrig/daemon/dist/domain/proof/judgments.js +26 -8
  291. package/node_modules/@openrig/daemon/dist/domain/proof/judgments.js.map +1 -1
  292. package/node_modules/@openrig/daemon/dist/domain/queue-repository.d.ts +19 -6
  293. package/node_modules/@openrig/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  294. package/node_modules/@openrig/daemon/dist/domain/queue-repository.js +61 -11
  295. package/node_modules/@openrig/daemon/dist/domain/queue-repository.js.map +1 -1
  296. package/node_modules/@openrig/daemon/dist/domain/queue-retention.d.ts.map +1 -1
  297. package/node_modules/@openrig/daemon/dist/domain/queue-retention.js +6 -2
  298. package/node_modules/@openrig/daemon/dist/domain/queue-retention.js.map +1 -1
  299. package/node_modules/@openrig/daemon/dist/domain/queue-transition-log.d.ts +1 -0
  300. package/node_modules/@openrig/daemon/dist/domain/queue-transition-log.d.ts.map +1 -1
  301. package/node_modules/@openrig/daemon/dist/domain/queue-transition-log.js +19 -7
  302. package/node_modules/@openrig/daemon/dist/domain/queue-transition-log.js.map +1 -1
  303. package/node_modules/@openrig/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
  304. package/node_modules/@openrig/daemon/dist/domain/restore-orchestrator.js +20 -3
  305. package/node_modules/@openrig/daemon/dist/domain/restore-orchestrator.js.map +1 -1
  306. package/node_modules/@openrig/daemon/dist/domain/review/fleet-compose.d.ts +7 -6
  307. package/node_modules/@openrig/daemon/dist/domain/review/fleet-compose.d.ts.map +1 -1
  308. package/node_modules/@openrig/daemon/dist/domain/review/fleet-compose.js +25 -11
  309. package/node_modules/@openrig/daemon/dist/domain/review/fleet-compose.js.map +1 -1
  310. package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.d.ts +18 -0
  311. package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  312. package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.js +109 -6
  313. package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  314. package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.d.ts +2 -2
  315. package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.d.ts.map +1 -1
  316. package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.js +2 -2
  317. package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.js.map +1 -1
  318. package/node_modules/@openrig/daemon/dist/domain/seat-attention-reconciler.d.ts +2 -6
  319. package/node_modules/@openrig/daemon/dist/domain/seat-attention-reconciler.d.ts.map +1 -1
  320. package/node_modules/@openrig/daemon/dist/domain/seat-attention-reconciler.js +15 -6
  321. package/node_modules/@openrig/daemon/dist/domain/seat-attention-reconciler.js.map +1 -1
  322. package/node_modules/@openrig/daemon/dist/domain/seat-identity-reconciler.d.ts +5 -1
  323. package/node_modules/@openrig/daemon/dist/domain/seat-identity-reconciler.d.ts.map +1 -1
  324. package/node_modules/@openrig/daemon/dist/domain/seat-identity-reconciler.js +36 -10
  325. package/node_modules/@openrig/daemon/dist/domain/seat-identity-reconciler.js.map +1 -1
  326. package/node_modules/@openrig/daemon/dist/domain/seat-lifecycle-service.d.ts +3 -0
  327. package/node_modules/@openrig/daemon/dist/domain/seat-lifecycle-service.d.ts.map +1 -1
  328. package/node_modules/@openrig/daemon/dist/domain/seat-lifecycle-service.js +3 -0
  329. package/node_modules/@openrig/daemon/dist/domain/seat-lifecycle-service.js.map +1 -1
  330. package/node_modules/@openrig/daemon/dist/domain/terminal/terminal-service.d.ts +2 -0
  331. package/node_modules/@openrig/daemon/dist/domain/terminal/terminal-service.d.ts.map +1 -1
  332. package/node_modules/@openrig/daemon/dist/domain/terminal/terminal-service.js +4 -1
  333. package/node_modules/@openrig/daemon/dist/domain/terminal/terminal-service.js.map +1 -1
  334. package/node_modules/@openrig/daemon/dist/domain/workspace/project-read.d.ts +1 -1
  335. package/node_modules/@openrig/daemon/dist/domain/workspace/project-read.d.ts.map +1 -1
  336. package/node_modules/@openrig/daemon/dist/domain/workspace/project-read.js +24 -6
  337. package/node_modules/@openrig/daemon/dist/domain/workspace/project-read.js.map +1 -1
  338. package/node_modules/@openrig/daemon/dist/routes/attention.js +2 -2
  339. package/node_modules/@openrig/daemon/dist/routes/attention.js.map +1 -1
  340. package/node_modules/@openrig/daemon/dist/routes/queue.d.ts +4 -18
  341. package/node_modules/@openrig/daemon/dist/routes/queue.d.ts.map +1 -1
  342. package/node_modules/@openrig/daemon/dist/routes/queue.js +23 -33
  343. package/node_modules/@openrig/daemon/dist/routes/queue.js.map +1 -1
  344. package/node_modules/@openrig/daemon/dist/routes/review.js +1 -1
  345. package/node_modules/@openrig/daemon/dist/routes/rigs.js +5 -1
  346. package/node_modules/@openrig/daemon/dist/routes/rigs.js.map +1 -1
  347. package/node_modules/@openrig/daemon/dist/routes/scopes.d.ts.map +1 -1
  348. package/node_modules/@openrig/daemon/dist/routes/scopes.js +37 -28
  349. package/node_modules/@openrig/daemon/dist/routes/scopes.js.map +1 -1
  350. package/node_modules/@openrig/daemon/dist/routes/sessions.js +12 -1
  351. package/node_modules/@openrig/daemon/dist/routes/sessions.js.map +1 -1
  352. package/node_modules/@openrig/daemon/dist/routes/up.js +4 -4
  353. package/node_modules/@openrig/daemon/dist/routes/up.js.map +1 -1
  354. package/node_modules/@openrig/daemon/dist/startup.d.ts.map +1 -1
  355. package/node_modules/@openrig/daemon/dist/startup.js +11 -1
  356. package/node_modules/@openrig/daemon/dist/startup.js.map +1 -1
  357. package/node_modules/@openrig/daemon/package.json +1 -1
  358. package/package.json +1 -1
  359. package/tui/dist/attention/attention-model.d.ts +19 -0
  360. package/tui/dist/attention/attention-model.d.ts.map +1 -1
  361. package/tui/dist/attention/attention-model.js +46 -5
  362. package/tui/dist/attention/attention-model.js.map +1 -1
  363. package/tui/dist/attention/source-continuity.d.ts +9 -0
  364. package/tui/dist/attention/source-continuity.d.ts.map +1 -0
  365. package/tui/dist/attention/source-continuity.js +38 -0
  366. package/tui/dist/attention/source-continuity.js.map +1 -0
  367. package/tui/dist/commands/help.d.ts.map +1 -1
  368. package/tui/dist/commands/help.js +1 -0
  369. package/tui/dist/commands/help.js.map +1 -1
  370. package/tui/dist/commands/registry.d.ts.map +1 -1
  371. package/tui/dist/commands/registry.js +3 -2
  372. package/tui/dist/commands/registry.js.map +1 -1
  373. package/tui/dist/config/config-model.js +1 -1
  374. package/tui/dist/config/config-model.js.map +1 -1
  375. package/tui/dist/connections/connections-model.js +1 -1
  376. package/tui/dist/connections/connections-model.js.map +1 -1
  377. package/tui/dist/daemon-client.d.ts +15 -2
  378. package/tui/dist/daemon-client.d.ts.map +1 -1
  379. package/tui/dist/daemon-client.js +14 -5
  380. package/tui/dist/daemon-client.js.map +1 -1
  381. package/tui/dist/demo-data.d.ts.map +1 -1
  382. package/tui/dist/demo-data.js +1 -0
  383. package/tui/dist/demo-data.js.map +1 -1
  384. package/tui/dist/execution/execution-model.d.ts +1 -0
  385. package/tui/dist/execution/execution-model.d.ts.map +1 -1
  386. package/tui/dist/execution/execution-model.js +88 -119
  387. package/tui/dist/execution/execution-model.js.map +1 -1
  388. package/tui/dist/hydrate.d.ts.map +1 -1
  389. package/tui/dist/hydrate.js +40 -25
  390. package/tui/dist/hydrate.js.map +1 -1
  391. package/tui/dist/live.d.ts +3 -1
  392. package/tui/dist/live.d.ts.map +1 -1
  393. package/tui/dist/live.js +66 -7
  394. package/tui/dist/live.js.map +1 -1
  395. package/tui/dist/main.js +50 -7
  396. package/tui/dist/main.js.map +1 -1
  397. package/tui/dist/navigator.d.ts.map +1 -1
  398. package/tui/dist/navigator.js +14 -3
  399. package/tui/dist/navigator.js.map +1 -1
  400. package/tui/dist/page-read.d.ts +19 -0
  401. package/tui/dist/page-read.d.ts.map +1 -0
  402. package/tui/dist/page-read.js +84 -0
  403. package/tui/dist/page-read.js.map +1 -0
  404. package/tui/dist/pulse/pulse-model.d.ts.map +1 -1
  405. package/tui/dist/pulse/pulse-model.js +3 -4
  406. package/tui/dist/pulse/pulse-model.js.map +1 -1
  407. package/tui/dist/render.d.ts +5 -0
  408. package/tui/dist/render.d.ts.map +1 -1
  409. package/tui/dist/render.js +60 -14
  410. package/tui/dist/render.js.map +1 -1
  411. package/tui/dist/scopes/scopes-model.d.ts +2 -0
  412. package/tui/dist/scopes/scopes-model.d.ts.map +1 -1
  413. package/tui/dist/scopes/scopes-model.js +8 -2
  414. package/tui/dist/scopes/scopes-model.js.map +1 -1
  415. package/tui/dist/sections.d.ts +2 -0
  416. package/tui/dist/sections.d.ts.map +1 -1
  417. package/tui/dist/sections.js +6 -3
  418. package/tui/dist/sections.js.map +1 -1
  419. package/tui/dist/startup.d.ts +4 -1
  420. package/tui/dist/startup.d.ts.map +1 -1
  421. package/tui/dist/startup.js +41 -15
  422. package/tui/dist/startup.js.map +1 -1
  423. package/tui/dist/state.d.ts.map +1 -1
  424. package/tui/dist/state.js +30 -18
  425. package/tui/dist/state.js.map +1 -1
  426. package/tui/dist/stylize.d.ts.map +1 -1
  427. package/tui/dist/stylize.js +18 -27
  428. package/tui/dist/stylize.js.map +1 -1
  429. package/tui/dist/terminals/terminal-model.d.ts +2 -0
  430. package/tui/dist/terminals/terminal-model.d.ts.map +1 -1
  431. package/tui/dist/terminals/terminal-model.js +28 -10
  432. package/tui/dist/terminals/terminal-model.js.map +1 -1
  433. package/tui/dist/types.d.ts +12 -1
  434. package/tui/dist/types.d.ts.map +1 -1
@@ -552,13 +552,13 @@ function instanceContentLines(state, snap, host, contentWidth, motion) {
552
552
  fields: [
553
553
  { label: "identity", value: host.name },
554
554
  { label: "transport", value: host.id ?? "local" },
555
- { 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` },
555
+ { label: "shape", value: host.rigs.some(r => r.inventoryUnavailable) ? `${host.rigs.length} rigs · seat inventory incomplete` : `${host.rigs.length} rigs · ${host.rigs.reduce((n, rig) => n + rig.pods.reduce((m, pod) => m + pod.agents.length, 0), 0)} seats` },
556
556
  ],
557
557
  },
558
558
  {
559
559
  title: "rigs",
560
560
  lines: host.rigs.length > 0
561
- ? 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 } }))
561
+ ? host.rigs.map((rig) => listItem(alignedRow([[rig.name, 20], [rig.lifecycleState ?? "unknown", 20], [rig.inventoryUnavailable ? "inventory unavailable" : `${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 } }))
562
562
  : [{ text: " (no local rigs served — proven empty)" }],
563
563
  },
564
564
  ]),
@@ -613,7 +613,7 @@ function instanceContentLines(state, snap, host, contentWidth, motion) {
613
613
  const rigAction = { type: "drill", resource: "rig", name: rig.name, target: { host: host.name } };
614
614
  if (agents.length === 0) {
615
615
  lines.push({
616
- text: tableRow(columns, { rig: rig.name, pod: "—", seat: "(no seats)", status: rig.lifecycleState ?? "unknown" }),
616
+ text: tableRow(columns, { rig: rig.name, pod: "—", seat: rig.inventoryUnavailable ? "(read failed)" : "(no seats)", status: rig.lifecycleState ?? "unknown" }),
617
617
  action: rigAction,
618
618
  });
619
619
  continue;
@@ -649,7 +649,7 @@ function instanceContentLines(state, snap, host, contentWidth, motion) {
649
649
  });
650
650
  }
651
651
  }
652
- lines.push({ text: "" }, { text: `${host.rigs.length} rigs · ${seatCount} seats · ${workingCount} working · ${attentionCount} need attention · ${openCount} open rows` });
652
+ lines.push({ text: "" }, { text: host.rigs.some(r => r.inventoryUnavailable) ? `${host.rigs.length} rigs · inventory incomplete · ${seatCount} seats read` : `${host.rigs.length} rigs · ${seatCount} seats · ${workingCount} working · ${attentionCount} need attention · ${openCount} open rows` });
653
653
  lines.push(...recentLines(snap, scope, contentWidth, false, state.timeZone));
654
654
  return lines;
655
655
  }
@@ -675,6 +675,8 @@ function contentLines(state, snap, contentWidth, motion) {
675
675
  return connectionsLines(snap, contentWidth, state.timeZone);
676
676
  if (state.healthOpen)
677
677
  return healthDetailLines(snap, state.healthOpen, contentWidth, state.timeZone);
678
+ if (state.section === "system")
679
+ return [{ text: "System · Instance health" }, { text: "" }, ...healthListLines(snap, { kind: "instance", local: true }, contentWidth)];
678
680
  // PULSE is a FULL-WIDTH view handled by an early return in renderScreen
679
681
  // (renderPulseScreen) — it never reaches the sidebar+content layout below.
680
682
  if (state.section === "topology") {
@@ -707,7 +709,13 @@ function contentLines(state, snap, contentWidth, motion) {
707
709
  const host = (hostName ? snap.hosts.find((candidate) => candidate.name === hostName) : snap.hosts[0]);
708
710
  if (leaf?.kind === "host" && host)
709
711
  return instanceContentLines(state, snap, host, contentWidth, motion);
710
- const rigName = state.drill.find((d) => d.kind === "rig")?.name ?? snap.hosts[0]?.rigs[0]?.name;
712
+ if (!leaf && host?.rigs.length)
713
+ return wrapDetailLines([
714
+ { text: `TOPOLOGY · ${host.name}` }, { text: "Choose a rig to read its seats and work." },
715
+ { text: `${host.rigs.length} rig${host.rigs.length === 1 ? "" : "s"} · select one in Explorer` },
716
+ { text: "Bright ▦ live agents · gray ▦ none · ? unknown" },
717
+ ], contentWidth);
718
+ const rigName = state.drill.find((d) => d.kind === "rig")?.name;
711
719
  const rig = host?.rigs.find((candidate) => candidate.name === rigName);
712
720
  if (!rig || !host) {
713
721
  const notLoaded = snap.readErrors.find((error) => error.startsWith("Live data not loaded"));
@@ -727,6 +735,10 @@ function contentLines(state, snap, contentWidth, motion) {
727
735
  }
728
736
  return [{ text: "(no rigs served — proven empty, not fabricated)" }];
729
737
  }
738
+ if (rig.inventoryNotLoaded)
739
+ return [{ text: `Reading ${rig.name}…` }];
740
+ if (rig.inventoryUnavailable)
741
+ return [{ text: `Inventory unavailable for ${rig.name} · refresh to Retry` }];
730
742
  const podFilter = leaf?.kind === "pod" ? leaf.name : null;
731
743
  const all = rig.pods.flatMap((p) => p.agents.map((a) => ({ pod: p.name, ...a })));
732
744
  const rows = all
@@ -1044,8 +1056,9 @@ function contentLines(state, snap, contentWidth, motion) {
1044
1056
  }
1045
1057
  else {
1046
1058
  lines.push({ text: "SPEC LIBRARY" }, { text: "Choose a spec at left to preview its purpose, contents and source." }, { text: "Enter reads details · / filters · source opens current disk content" }, { text: "" });
1047
- for (const kind of ["rig", "agent", "workflow"])
1048
- lines.push({ text: `${kind}: ${snap.specs.filter((spec) => spec.kind === kind).length} available` });
1059
+ if (snap.specsLoaded !== false && !snap.readErrors.some(e => e.startsWith("specs-library")))
1060
+ for (const kind of ["rig", "agent", "workflow"])
1061
+ lines.push({ text: `${kind}: ${snap.specs.filter((spec) => spec.kind === kind).length} available` });
1049
1062
  if (!snap.specs.length) {
1050
1063
  if (motion.loading) {
1051
1064
  if (!motion.reduced)
@@ -1078,20 +1091,30 @@ function contentLines(state, snap, contentWidth, motion) {
1078
1091
  return [...identity, { text: "Reading selected project…" }];
1079
1092
  const entry = catalog?.projects.find(p => p.id === state.project.id && p.root === state.project.root);
1080
1093
  const errors = (snap.readErrors ?? []).map(text => ({ text: `Unavailable: ${text}` }));
1081
- const projectHeader = state.project ? [...identity, listItem("Read current source", { type: "project-source" }), ...wrapDetailLines(errors, contentWidth)] : [];
1094
+ const missionOverview = !!state.scopesMission && !state.scopesSelected && !state.executionOpen;
1095
+ const projectHeader = state.project ? missionOverview
1096
+ ? [{ text: `PROJECT ${state.project.id}`, action: { type: "project-source" } }, ...wrapDetailLines(errors, contentWidth)]
1097
+ : [...identity, listItem("Read current source", { type: "project-source" }), ...wrapDetailLines(errors, contentWidth)] : [];
1082
1098
  if (state.project && (!entry || entry.error))
1083
1099
  return [...projectHeader, { text: "Choose a project again or go Back." }];
1084
1100
  if (state.project && !state.scopesMission)
1085
- return [...projectHeader, { text: "Choose a mission" }, ...(snap.scopes ?? []).map(m => listItem(m.mission, { type: "scopes-mission-open", mission: m.mission })), ...(!snap.scopes?.length && !errors.length ? [{ text: "No missions found in this project." }] : [])];
1101
+ return [...projectHeader, { text: "Choose a mission" }, ...(snap.scopes ?? []).map(m => listItem(m.mission + (m.error ? " · source unavailable" : ""), { type: "scopes-mission-open", mission: m.mission })), ...(!snap.scopes?.length && !errors.length ? [{ text: "No missions found in this project." }] : [])];
1086
1102
  // SCOPES owns both levels. Both mission-graph and Explorer slice routes land
1087
1103
  // on the same execution-backed canonical detail; store-direct content is
1088
1104
  // composed into that page instead of surviving as a competing destination.
1089
1105
  const sel = state.scopesSelected;
1090
1106
  const missionName = state.scopesMission;
1107
+ const mission = snap.scopes?.find(m => m.mission === missionName);
1108
+ if (mission?.error)
1109
+ return [...projectHeader, ...wrapDetailLines([{ text: `${missionName} · Source unavailable` }, { text: mission.error }, { text: "Correct the source and refresh; Back returns to other missions." }], contentWidth)];
1091
1110
  const execution = snap.execution?.mission === missionName ? snap.execution : null;
1092
1111
  const detail = sel
1093
1112
  ? (snap.scopes ?? []).find((m) => m.mission === sel.mission)?.slices.find((sl) => sl.dirName === sel.slice) ?? null
1094
1113
  : null;
1114
+ if (detail?.error)
1115
+ return [...projectHeader, ...wrapDetailLines([{ text: `${missionName}/${detail.dirName} · Source unavailable` }, { text: detail.error }, { text: "Correct the source and refresh; Back returns to other slices." }], contentWidth)];
1116
+ if (!sel && !state.executionOpen)
1117
+ projectHeader.push(...(mission?.slices.filter(s => s.error) ?? []).map(s => listItem(`${s.dirName} · source unavailable`, { type: "scopes-open", mission: missionName, slice: s.dirName })));
1095
1118
  if (state.executionOpen && execution) {
1096
1119
  return [...projectHeader, ...executionContentLines(execution, snap.scopes, snap.readErrors, state.executionOpen, contentWidth, false, snap.sliceDetail, {
1097
1120
  collapseReqs: state.scopesCollapseReqs,
@@ -1200,6 +1223,15 @@ function pushExplorerTargets(hitMap, row, display, y, explorerWidth) {
1200
1223
  }
1201
1224
  hitMap.push({ y, x1: 1, x2: explorerWidth, action: row.action });
1202
1225
  }
1226
+ function readStatus(load, zone) {
1227
+ const at = load.retainedAt ?? load.lastSuccessAt;
1228
+ const basis = at === undefined ? "" : ` · last ${displayTime(new Date(at).toISOString(), zone)}`;
1229
+ if (load.inFlight)
1230
+ return `${load.settled ? "Refreshing" : "Loading"}…${basis} · ? Help`;
1231
+ if (load.stale)
1232
+ return `${at === undefined ? "Read failed" : "Could not refresh"}${basis} · refresh to Retry`;
1233
+ return `Tab complete · ? help${basis}`;
1234
+ }
1203
1235
  function renderPulseScreen(state, snap, options, inputLine) {
1204
1236
  const { cols = 120, rows = 32, nowMs = 0 } = options;
1205
1237
  const explW = explorerWidth(cols);
@@ -1233,7 +1265,9 @@ function renderPulseScreen(state, snap, options, inputLine) {
1233
1265
  const contentTargets = [];
1234
1266
  const flashRows = [];
1235
1267
  let flashAck = false;
1236
- lines.push(pad(`cmd ▸ ${inputLine}▊${load.stale ? " · readiness unconfirmed — refreshing or authority unavailable" : load.connection && load.connection !== "connected" ? " · live updates unavailable — last HTTP basis; quiet refresh active" : inputLine ? "" : " Tab complete · ? help · timezone"}`, cols));
1268
+ lines.push(pad(`cmd ▸ ${inputLine}▊${inputLine ? "" : " " + readStatus(load, state.timeZone)}`, cols));
1269
+ if (load.stale && !inputLine)
1270
+ hitMap.push({ y: 1, x1: 9, x2: cols, action: { type: "noop" } });
1237
1271
  if (options.completion) {
1238
1272
  lines.push(pad(options.completion.message, cols));
1239
1273
  for (const candidate of options.completion.candidates.slice(0, 4))
@@ -1514,7 +1548,7 @@ function renderBody(state, snap, options = {}, inputLine = "") {
1514
1548
  // PULSE (founder Option-B): a content-pane view inside the NORMAL explorer│
1515
1549
  // content chrome — renderPulseScreen builds its own split (sidebar + lanes)
1516
1550
  // and rides the same segRows paint path, so it returns before the table layout.
1517
- if (state.viewTab === "pulse")
1551
+ if (state.viewTab === "pulse" && options.load?.settled !== false)
1518
1552
  return renderPulseScreen(state, snap, options, inputLine);
1519
1553
  // S19 round-5 (guard): one spinner frame per render pass from caller time;
1520
1554
  // `loading` comes from the refresh OWNER (omitted = settled — demo/fixture
@@ -1534,7 +1568,9 @@ function renderBody(state, snap, options = {}, inputLine = "") {
1534
1568
  // shell accepts typing from the empty state, so the honest readiness
1535
1569
  // affordance must show BEFORE the first key (no new focus state; stylize
1536
1570
  // paints the cell; the shared motion clock controls its visibility).
1537
- lines.push(pad(`cmd ▸ ${inputLine}▊${inputLine ? "" : " Tab complete · ? help · timezone"}`, cols));
1571
+ lines.push(pad(`cmd ▸ ${inputLine}▊${inputLine ? "" : " " + readStatus(load, state.timeZone)}`, cols));
1572
+ if (load.stale && !inputLine)
1573
+ hitMap.push({ y: 1, x1: 9, x2: cols, action: { type: "noop" } });
1538
1574
  if (options.completion) {
1539
1575
  lines.push(pad(options.completion.message, cols));
1540
1576
  for (const candidate of options.completion.candidates.slice(0, 4))
@@ -1542,7 +1578,7 @@ function renderBody(state, snap, options = {}, inputLine = "") {
1542
1578
  if (options.completion.candidates.length > 4)
1543
1579
  lines.push(pad(" … keep typing to narrow matches", cols));
1544
1580
  }
1545
- const sectionTitle = { topology: "TOPOLOGY", specs: "SPECS", scopes: "PROJECTS", needs: "ATTENTION" }[state.section] ?? state.section.toUpperCase();
1581
+ const sectionTitle = { topology: "TOPOLOGY", specs: "SPECS", scopes: "PROJECTS", needs: "FEED", system: "SYSTEM · HEALTH", config: "SYSTEM · CONFIGURATION", connections: "SYSTEM · CONNECTIONS" }[state.section] ?? state.section.toUpperCase();
1546
1582
  // active-pane emphasis (k9s-class chrome): the focused pane's title is bracketed
1547
1583
  const explorerTitle = state.focusedPane === "explorer" ? "{ EXPLORER }" : "EXPLORER";
1548
1584
  const contentTitle = state.focusedPane === "content" ? `{ ${sectionTitle} }` : sectionTitle;
@@ -1551,7 +1587,17 @@ function renderBody(state, snap, options = {}, inputLine = "") {
1551
1587
  // Slice-17: the file-tree re-skin is a DISPLAY transform only — rows, keys,
1552
1588
  // actions, and the hit-map all keep resolving against the row model above.
1553
1589
  const { labels: explorerDisplay, metas: explorerMetas } = navigatorDisplay(explorer, snap, explW - 1);
1554
- const content = contentLines(state, snap, Math.max(cols - explW - (fullReading ? 1 : 2), 0), motion);
1590
+ const contentWidth = Math.max(cols - explW - (fullReading ? 1 : 2), 0);
1591
+ const previous = !load.settled && !state.externalUrl ? options.previousPage : undefined;
1592
+ const content = previous
1593
+ ? [...wrapDetailLines([{ text: `Previous: ${previous.state.section} · ${previous.state.file ? `${previous.state.file.root}/${previous.state.file.path}` : previous.state.drill.map(d => d.name).join(" / ") || [previous.state.project?.id, previous.state.scopesMission, previous.state.terminalView].filter(Boolean).join(" / ") || "overview"}` }], contentWidth),
1594
+ { text: `Opening ${sectionTitle.toLowerCase()}… · Explorer remains available` },
1595
+ ...contentLines(previous.state, previous.snapshot, contentWidth, { ...motion, loading: false }).map(line => ({ text: line.text }))]
1596
+ : !load.settled && !state.externalUrl
1597
+ ? [{ text: `${sectionTitle} · choose a location in Explorer` }, { text: `${motion.frame} ${sectionTitle.toLowerCase()} read pending…` }]
1598
+ : contentLines(state, snap, contentWidth, motion);
1599
+ if (!load.settled && !reduced)
1600
+ motion.used = true;
1555
1601
  const footer = state.footerOn ? snap.stream.at(-1) : undefined;
1556
1602
  // round-5 (guard): the tmux-style ONE-SHOT activity flash targets the
1557
1603
  // flashed agent's EXPLORER row — per-seat pane-output events from the