@openrig/cli 0.5.12 → 0.5.14

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 (584) hide show
  1. package/daemon/assets/plugins/openrig-core/skills/messaging-the-human/SKILL.md +40 -5
  2. package/daemon/context-packs/onboarding-width/manifest.yaml +1 -1
  3. package/daemon/context-packs/onboarding-width/public-what-you-can-do.md +89 -10
  4. package/daemon/context-packs/skills/agent-operated-software/manifest.yaml +1 -1
  5. package/daemon/context-packs/skills/agent-operated-workflows/manifest.yaml +1 -1
  6. package/daemon/context-packs/skills/applying-a-permission-policy/manifest.yaml +1 -1
  7. package/daemon/context-packs/skills/claude-compaction-restore/manifest.yaml +1 -1
  8. package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +1 -1
  9. package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +1 -1
  10. package/daemon/context-packs/skills/core/cross-host-rig-commands/manifest.yaml +1 -1
  11. package/daemon/context-packs/skills/core/human-in-the-loop/manifest.yaml +1 -1
  12. package/daemon/context-packs/skills/core/messaging-the-human/SKILL.md +40 -5
  13. package/daemon/context-packs/skills/core/messaging-the-human/manifest.yaml +1 -1
  14. package/daemon/context-packs/skills/core/openrig-architect/manifest.yaml +1 -1
  15. package/daemon/context-packs/skills/core/openrig-cmux/manifest.yaml +1 -1
  16. package/daemon/context-packs/skills/core/openrig-herdr/manifest.yaml +1 -1
  17. package/daemon/context-packs/skills/core/openrig-skills/manifest.yaml +1 -1
  18. package/daemon/context-packs/skills/core/openrig-upgrade/manifest.yaml +1 -1
  19. package/daemon/context-packs/skills/core/rig-bundles-and-shareable-artifacts/manifest.yaml +1 -1
  20. package/daemon/context-packs/skills/core/rig-lifecycle/manifest.yaml +1 -1
  21. package/daemon/context-packs/skills/core/session-source-fork/manifest.yaml +1 -1
  22. package/daemon/context-packs/skills/core/specification-system/manifest.yaml +1 -1
  23. package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/manifest.yaml +1 -1
  24. package/daemon/context-packs/skills/core/watchdog/manifest.yaml +1 -1
  25. package/daemon/context-packs/skills/delegating-work/manifest.yaml +1 -1
  26. package/daemon/context-packs/skills/forming-an-openrig-mental-model/manifest.yaml +1 -1
  27. package/daemon/context-packs/skills/loading-addressable-markdown/manifest.yaml +1 -1
  28. package/daemon/context-packs/skills/mission-slice-sop/manifest.yaml +1 -1
  29. package/daemon/context-packs/skills/openrig-operating-model/manifest.yaml +1 -1
  30. package/daemon/context-packs/skills/openrig-user/manifest.yaml +1 -1
  31. package/daemon/context-packs/skills/orienting-to-an-inherited-seat/manifest.yaml +1 -1
  32. package/daemon/context-packs/skills/pm/backlog-capture/manifest.yaml +1 -1
  33. package/daemon/context-packs/skills/pm/context-builder/manifest.yaml +1 -1
  34. package/daemon/context-packs/skills/pm/exec-summary/manifest.yaml +1 -1
  35. package/daemon/context-packs/skills/pm/office-hours/manifest.yaml +1 -1
  36. package/daemon/context-packs/skills/pm/plan-review/manifest.yaml +1 -1
  37. package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +1 -1
  38. package/daemon/context-packs/skills/pm/ui-mockup/manifest.yaml +1 -1
  39. package/daemon/context-packs/skills/pods/development-team/manifest.yaml +1 -1
  40. package/daemon/context-packs/skills/pods/orchestration-team/manifest.yaml +1 -1
  41. package/daemon/context-packs/skills/pods/oversight-team/manifest.yaml +1 -1
  42. package/daemon/context-packs/skills/pods/review-team/manifest.yaml +1 -1
  43. package/daemon/context-packs/skills/process/agent-browser/manifest.yaml +1 -1
  44. package/daemon/context-packs/skills/process/context-engineering/manifest.yaml +1 -1
  45. package/daemon/context-packs/skills/process/dogfood/manifest.yaml +1 -1
  46. package/daemon/context-packs/skills/process/frontend-design/manifest.yaml +1 -1
  47. package/daemon/context-packs/skills/process/systematic-debugging/manifest.yaml +1 -1
  48. package/daemon/context-packs/skills/process/test-driven-development/manifest.yaml +1 -1
  49. package/daemon/context-packs/skills/process/verification-before-completion/manifest.yaml +1 -1
  50. package/daemon/context-packs/skills/queue-handoff/manifest.yaml +1 -1
  51. package/daemon/context-packs/skills/refocusing/manifest.yaml +1 -1
  52. package/daemon/context-packs/skills/retiring-and-inheriting-a-seat/manifest.yaml +1 -1
  53. package/daemon/context-packs/skills/seat-continuity-and-handover/manifest.yaml +1 -1
  54. package/daemon/context-packs/skills/session-compaction-and-restore/manifest.yaml +1 -1
  55. package/daemon/context-packs/skills/software-for-agents/manifest.yaml +1 -1
  56. package/daemon/context-packs/world-example/manifest.yaml +1 -1
  57. package/daemon/context-packs/world-public/manifest.yaml +1 -1
  58. package/daemon/dist/attention-surface.d.ts +38 -0
  59. package/daemon/dist/attention-surface.d.ts.map +1 -0
  60. package/daemon/dist/attention-surface.js +3 -0
  61. package/daemon/dist/attention-surface.js.map +1 -0
  62. package/daemon/dist/build-info.js +3 -3
  63. package/daemon/dist/db/all-migrations.d.ts +1 -1
  64. package/daemon/dist/db/all-migrations.d.ts.map +1 -1
  65. package/daemon/dist/db/all-migrations.js +12 -2
  66. package/daemon/dist/db/all-migrations.js.map +1 -1
  67. package/daemon/dist/db/migrations/080_scoped_operating_posture.d.ts +4 -0
  68. package/daemon/dist/db/migrations/080_scoped_operating_posture.d.ts.map +1 -0
  69. package/daemon/dist/db/migrations/080_scoped_operating_posture.js +21 -0
  70. package/daemon/dist/db/migrations/080_scoped_operating_posture.js.map +1 -0
  71. package/daemon/dist/db/migrations/081_human_notification_intent.d.ts +3 -0
  72. package/daemon/dist/db/migrations/081_human_notification_intent.d.ts.map +1 -0
  73. package/daemon/dist/db/migrations/081_human_notification_intent.js +9 -0
  74. package/daemon/dist/db/migrations/081_human_notification_intent.js.map +1 -0
  75. package/daemon/dist/db/migrations/082_archive_identity_provenance.d.ts +5 -0
  76. package/daemon/dist/db/migrations/082_archive_identity_provenance.d.ts.map +1 -0
  77. package/daemon/dist/db/migrations/082_archive_identity_provenance.js +7 -0
  78. package/daemon/dist/db/migrations/082_archive_identity_provenance.js.map +1 -0
  79. package/daemon/dist/db/migrations/083_review_read_indexes.d.ts +4 -0
  80. package/daemon/dist/db/migrations/083_review_read_indexes.d.ts.map +1 -0
  81. package/daemon/dist/db/migrations/083_review_read_indexes.js +12 -0
  82. package/daemon/dist/db/migrations/083_review_read_indexes.js.map +1 -0
  83. package/daemon/dist/db/migrations/084_inventory_event_indexes.d.ts +5 -0
  84. package/daemon/dist/db/migrations/084_inventory_event_indexes.d.ts.map +1 -0
  85. package/daemon/dist/db/migrations/084_inventory_event_indexes.js +14 -0
  86. package/daemon/dist/db/migrations/084_inventory_event_indexes.js.map +1 -0
  87. package/daemon/dist/domain/execution-view.d.ts +1 -0
  88. package/daemon/dist/domain/execution-view.d.ts.map +1 -1
  89. package/daemon/dist/domain/execution-view.js +38 -19
  90. package/daemon/dist/domain/execution-view.js.map +1 -1
  91. package/daemon/dist/domain/files/file-read.d.ts +17 -0
  92. package/daemon/dist/domain/files/file-read.d.ts.map +1 -0
  93. package/daemon/dist/domain/files/file-read.js +24 -0
  94. package/daemon/dist/domain/files/file-read.js.map +1 -0
  95. package/daemon/dist/domain/gateway/connections-projection.d.ts +4 -4
  96. package/daemon/dist/domain/gateway/slack/message.d.ts +13 -12
  97. package/daemon/dist/domain/gateway/slack/message.d.ts.map +1 -1
  98. package/daemon/dist/domain/gateway/slack/message.js +40 -77
  99. package/daemon/dist/domain/gateway/slack/message.js.map +1 -1
  100. package/daemon/dist/domain/gateway/slack/outbound-driver.d.ts +2 -0
  101. package/daemon/dist/domain/gateway/slack/outbound-driver.d.ts.map +1 -1
  102. package/daemon/dist/domain/gateway/slack/outbound-driver.js +2 -0
  103. package/daemon/dist/domain/gateway/slack/outbound-driver.js.map +1 -1
  104. package/daemon/dist/domain/gateway/slack/queue-access.d.ts +2 -0
  105. package/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -1
  106. package/daemon/dist/domain/gateway/slack/queue-access.js +2 -0
  107. package/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -1
  108. package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +4 -1
  109. package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -1
  110. package/daemon/dist/domain/gateway/slack/slack-delivery.js +85 -3
  111. package/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -1
  112. package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
  113. package/daemon/dist/domain/gateway/slack/slack-subsystem.js +8 -1
  114. package/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -1
  115. package/daemon/dist/domain/health-context.d.ts +3 -0
  116. package/daemon/dist/domain/health-context.d.ts.map +1 -1
  117. package/daemon/dist/domain/health-context.js +78 -6
  118. package/daemon/dist/domain/health-context.js.map +1 -1
  119. package/daemon/dist/domain/health-detectors.d.ts +2 -1
  120. package/daemon/dist/domain/health-detectors.d.ts.map +1 -1
  121. package/daemon/dist/domain/health-detectors.js +8 -2
  122. package/daemon/dist/domain/health-detectors.js.map +1 -1
  123. package/daemon/dist/domain/health-diagnosis.d.ts +51 -1
  124. package/daemon/dist/domain/health-diagnosis.d.ts.map +1 -1
  125. package/daemon/dist/domain/health-diagnosis.js +60 -9
  126. package/daemon/dist/domain/health-diagnosis.js.map +1 -1
  127. package/daemon/dist/domain/health-passive-ceremony.d.ts +7 -1
  128. package/daemon/dist/domain/health-passive-ceremony.d.ts.map +1 -1
  129. package/daemon/dist/domain/health-passive-ceremony.js +59 -26
  130. package/daemon/dist/domain/health-passive-ceremony.js.map +1 -1
  131. package/daemon/dist/domain/health-projection.d.ts +2 -0
  132. package/daemon/dist/domain/health-projection.d.ts.map +1 -1
  133. package/daemon/dist/domain/health-projection.js.map +1 -1
  134. package/daemon/dist/domain/policies/delivery-digest-flush.d.ts.map +1 -1
  135. package/daemon/dist/domain/policies/delivery-digest-flush.js +23 -3
  136. package/daemon/dist/domain/policies/delivery-digest-flush.js.map +1 -1
  137. package/daemon/dist/domain/proof/judgments.d.ts +10 -3
  138. package/daemon/dist/domain/proof/judgments.d.ts.map +1 -1
  139. package/daemon/dist/domain/proof/judgments.js +26 -8
  140. package/daemon/dist/domain/proof/judgments.js.map +1 -1
  141. package/daemon/dist/domain/queue-repository.d.ts +19 -6
  142. package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  143. package/daemon/dist/domain/queue-repository.js +61 -11
  144. package/daemon/dist/domain/queue-repository.js.map +1 -1
  145. package/daemon/dist/domain/queue-retention.d.ts.map +1 -1
  146. package/daemon/dist/domain/queue-retention.js +6 -2
  147. package/daemon/dist/domain/queue-retention.js.map +1 -1
  148. package/daemon/dist/domain/queue-transition-log.d.ts +1 -0
  149. package/daemon/dist/domain/queue-transition-log.d.ts.map +1 -1
  150. package/daemon/dist/domain/queue-transition-log.js +19 -7
  151. package/daemon/dist/domain/queue-transition-log.js.map +1 -1
  152. package/daemon/dist/domain/review/fleet-compose.d.ts +7 -6
  153. package/daemon/dist/domain/review/fleet-compose.d.ts.map +1 -1
  154. package/daemon/dist/domain/review/fleet-compose.js +25 -11
  155. package/daemon/dist/domain/review/fleet-compose.js.map +1 -1
  156. package/daemon/dist/domain/rig-mode/operating-posture.d.ts +49 -0
  157. package/daemon/dist/domain/rig-mode/operating-posture.d.ts.map +1 -0
  158. package/daemon/dist/domain/rig-mode/operating-posture.js +255 -0
  159. package/daemon/dist/domain/rig-mode/operating-posture.js.map +1 -0
  160. package/daemon/dist/domain/rig-mode/rig-mode-defaults.d.ts.map +1 -1
  161. package/daemon/dist/domain/rig-mode/rig-mode-defaults.js +20 -0
  162. package/daemon/dist/domain/rig-mode/rig-mode-defaults.js.map +1 -1
  163. package/daemon/dist/domain/rig-mode/rig-mode-store.d.ts +2 -2
  164. package/daemon/dist/domain/rig-mode/rig-mode-store.d.ts.map +1 -1
  165. package/daemon/dist/domain/rig-mode/rig-mode-store.js +19 -3
  166. package/daemon/dist/domain/rig-mode/rig-mode-store.js.map +1 -1
  167. package/daemon/dist/domain/rig-mode/rig-mode-types.d.ts +12 -7
  168. package/daemon/dist/domain/rig-mode/rig-mode-types.d.ts.map +1 -1
  169. package/daemon/dist/domain/rig-mode/rig-mode-types.js +14 -3
  170. package/daemon/dist/domain/rig-mode/rig-mode-types.js.map +1 -1
  171. package/daemon/dist/domain/scope/scope-view-projection.d.ts +2 -2
  172. package/daemon/dist/domain/scope/scope-view-projection.d.ts.map +1 -1
  173. package/daemon/dist/domain/scope/scope-view-projection.js +2 -2
  174. package/daemon/dist/domain/scope/scope-view-projection.js.map +1 -1
  175. package/daemon/dist/domain/slices/slice-detail-projector.d.ts +1 -0
  176. package/daemon/dist/domain/slices/slice-detail-projector.d.ts.map +1 -1
  177. package/daemon/dist/domain/slices/slice-detail-projector.js +3 -0
  178. package/daemon/dist/domain/slices/slice-detail-projector.js.map +1 -1
  179. package/daemon/dist/domain/slices/slice-indexer.d.ts +4 -0
  180. package/daemon/dist/domain/slices/slice-indexer.d.ts.map +1 -1
  181. package/daemon/dist/domain/slices/slice-indexer.js +10 -1
  182. package/daemon/dist/domain/slices/slice-indexer.js.map +1 -1
  183. package/daemon/dist/domain/terminal/herdr-adapter.d.ts +2 -0
  184. package/daemon/dist/domain/terminal/herdr-adapter.d.ts.map +1 -1
  185. package/daemon/dist/domain/terminal/herdr-adapter.js +1 -1
  186. package/daemon/dist/domain/terminal/herdr-adapter.js.map +1 -1
  187. package/daemon/dist/domain/terminal/terminal-service.d.ts +30 -2
  188. package/daemon/dist/domain/terminal/terminal-service.d.ts.map +1 -1
  189. package/daemon/dist/domain/terminal/terminal-service.js +53 -13
  190. package/daemon/dist/domain/terminal/terminal-service.js.map +1 -1
  191. package/daemon/dist/domain/view-projector.d.ts +2 -0
  192. package/daemon/dist/domain/view-projector.d.ts.map +1 -1
  193. package/daemon/dist/domain/view-projector.js +1 -1
  194. package/daemon/dist/domain/view-projector.js.map +1 -1
  195. package/daemon/dist/domain/workspace/project-catalog.d.ts +18 -0
  196. package/daemon/dist/domain/workspace/project-catalog.d.ts.map +1 -0
  197. package/daemon/dist/domain/workspace/project-catalog.js +66 -0
  198. package/daemon/dist/domain/workspace/project-catalog.js.map +1 -0
  199. package/daemon/dist/domain/workspace/project-read.d.ts +29 -0
  200. package/daemon/dist/domain/workspace/project-read.d.ts.map +1 -0
  201. package/daemon/dist/domain/workspace/project-read.js +125 -0
  202. package/daemon/dist/domain/workspace/project-read.js.map +1 -0
  203. package/daemon/dist/health-projection-surface.d.ts +1 -0
  204. package/daemon/dist/health-projection-surface.d.ts.map +1 -1
  205. package/daemon/dist/local-reading-surface.d.ts +3 -0
  206. package/daemon/dist/local-reading-surface.d.ts.map +1 -0
  207. package/daemon/dist/local-reading-surface.js +3 -0
  208. package/daemon/dist/local-reading-surface.js.map +1 -0
  209. package/daemon/dist/project-catalog-surface.d.ts +2 -0
  210. package/daemon/dist/project-catalog-surface.d.ts.map +1 -0
  211. package/daemon/dist/project-catalog-surface.js +2 -0
  212. package/daemon/dist/project-catalog-surface.js.map +1 -0
  213. package/daemon/dist/routes/attention.d.ts +3 -0
  214. package/daemon/dist/routes/attention.d.ts.map +1 -0
  215. package/daemon/dist/routes/attention.js +155 -0
  216. package/daemon/dist/routes/attention.js.map +1 -0
  217. package/daemon/dist/routes/files.d.ts +1 -1
  218. package/daemon/dist/routes/files.d.ts.map +1 -1
  219. package/daemon/dist/routes/files.js +4 -24
  220. package/daemon/dist/routes/files.js.map +1 -1
  221. package/daemon/dist/routes/queue.d.ts +4 -18
  222. package/daemon/dist/routes/queue.d.ts.map +1 -1
  223. package/daemon/dist/routes/queue.js +23 -33
  224. package/daemon/dist/routes/queue.js.map +1 -1
  225. package/daemon/dist/routes/review.js +1 -1
  226. package/daemon/dist/routes/rig-mode.d.ts.map +1 -1
  227. package/daemon/dist/routes/rig-mode.js +67 -14
  228. package/daemon/dist/routes/rig-mode.js.map +1 -1
  229. package/daemon/dist/routes/rigs.js +5 -1
  230. package/daemon/dist/routes/rigs.js.map +1 -1
  231. package/daemon/dist/routes/scopes.d.ts.map +1 -1
  232. package/daemon/dist/routes/scopes.js +74 -20
  233. package/daemon/dist/routes/scopes.js.map +1 -1
  234. package/daemon/dist/routes/slices.d.ts +2 -2
  235. package/daemon/dist/routes/slices.d.ts.map +1 -1
  236. package/daemon/dist/routes/slices.js +18 -1
  237. package/daemon/dist/routes/slices.js.map +1 -1
  238. package/daemon/dist/routes/spec-library.d.ts.map +1 -1
  239. package/daemon/dist/routes/spec-library.js +11 -2
  240. package/daemon/dist/routes/spec-library.js.map +1 -1
  241. package/daemon/dist/routes/terminal.d.ts.map +1 -1
  242. package/daemon/dist/routes/terminal.js +14 -4
  243. package/daemon/dist/routes/terminal.js.map +1 -1
  244. package/daemon/dist/routes/views.d.ts.map +1 -1
  245. package/daemon/dist/routes/views.js +11 -1
  246. package/daemon/dist/routes/views.js.map +1 -1
  247. package/daemon/dist/server.d.ts +1 -0
  248. package/daemon/dist/server.d.ts.map +1 -1
  249. package/daemon/dist/server.js +3 -0
  250. package/daemon/dist/server.js.map +1 -1
  251. package/daemon/dist/startup.d.ts.map +1 -1
  252. package/daemon/dist/startup.js +19 -5
  253. package/daemon/dist/startup.js.map +1 -1
  254. package/daemon/docs/reference/getting-started.md +13 -1
  255. package/daemon/docs/reference/health-diagnosis.md +83 -6
  256. package/daemon/docs/reference/project-workspace.md +23 -0
  257. package/daemon/docs/reference/scoped-operating-posture.md +95 -0
  258. package/daemon/specs/agents/shared/skills/core/messaging-the-human/SKILL.md +40 -5
  259. package/dist/build-info.js +3 -3
  260. package/dist/commands/context.d.ts.map +1 -1
  261. package/dist/commands/context.js +66 -124
  262. package/dist/commands/context.js.map +1 -1
  263. package/dist/commands/health.d.ts.map +1 -1
  264. package/dist/commands/health.js +17 -2
  265. package/dist/commands/health.js.map +1 -1
  266. package/dist/commands/queue.d.ts.map +1 -1
  267. package/dist/commands/queue.js +5 -1
  268. package/dist/commands/queue.js.map +1 -1
  269. package/dist/commands/rig-mode.d.ts +2 -2
  270. package/dist/commands/rig-mode.d.ts.map +1 -1
  271. package/dist/commands/rig-mode.js +36 -11
  272. package/dist/commands/rig-mode.js.map +1 -1
  273. package/dist/lib/context-git.d.ts +141 -0
  274. package/dist/lib/context-git.d.ts.map +1 -0
  275. package/dist/lib/context-git.js +256 -0
  276. package/dist/lib/context-git.js.map +1 -0
  277. package/dist/lib/context-install.d.ts +5 -0
  278. package/dist/lib/context-install.d.ts.map +1 -0
  279. package/dist/lib/context-install.js +125 -0
  280. package/dist/lib/context-install.js.map +1 -0
  281. package/dist/lib/work-install.d.ts.map +1 -1
  282. package/dist/lib/work-install.js +11 -36
  283. package/dist/lib/work-install.js.map +1 -1
  284. package/dist/local-reading.d.ts +31 -0
  285. package/dist/local-reading.d.ts.map +1 -0
  286. package/dist/local-reading.js +62 -0
  287. package/dist/local-reading.js.map +1 -0
  288. package/node_modules/@openrig/daemon/dist/attention-surface.d.ts +38 -0
  289. package/node_modules/@openrig/daemon/dist/attention-surface.d.ts.map +1 -0
  290. package/node_modules/@openrig/daemon/dist/attention-surface.js +3 -0
  291. package/node_modules/@openrig/daemon/dist/attention-surface.js.map +1 -0
  292. package/node_modules/@openrig/daemon/dist/build-info.js +3 -3
  293. package/node_modules/@openrig/daemon/dist/db/all-migrations.d.ts +1 -1
  294. package/node_modules/@openrig/daemon/dist/db/all-migrations.d.ts.map +1 -1
  295. package/node_modules/@openrig/daemon/dist/db/all-migrations.js +12 -2
  296. package/node_modules/@openrig/daemon/dist/db/all-migrations.js.map +1 -1
  297. package/node_modules/@openrig/daemon/dist/db/migrations/080_scoped_operating_posture.d.ts +4 -0
  298. package/node_modules/@openrig/daemon/dist/db/migrations/080_scoped_operating_posture.d.ts.map +1 -0
  299. package/node_modules/@openrig/daemon/dist/db/migrations/080_scoped_operating_posture.js +21 -0
  300. package/node_modules/@openrig/daemon/dist/db/migrations/080_scoped_operating_posture.js.map +1 -0
  301. package/node_modules/@openrig/daemon/dist/db/migrations/081_human_notification_intent.d.ts +3 -0
  302. package/node_modules/@openrig/daemon/dist/db/migrations/081_human_notification_intent.d.ts.map +1 -0
  303. package/node_modules/@openrig/daemon/dist/db/migrations/081_human_notification_intent.js +9 -0
  304. package/node_modules/@openrig/daemon/dist/db/migrations/081_human_notification_intent.js.map +1 -0
  305. package/node_modules/@openrig/daemon/dist/db/migrations/082_archive_identity_provenance.d.ts +5 -0
  306. package/node_modules/@openrig/daemon/dist/db/migrations/082_archive_identity_provenance.d.ts.map +1 -0
  307. package/node_modules/@openrig/daemon/dist/db/migrations/082_archive_identity_provenance.js +7 -0
  308. package/node_modules/@openrig/daemon/dist/db/migrations/082_archive_identity_provenance.js.map +1 -0
  309. package/node_modules/@openrig/daemon/dist/db/migrations/083_review_read_indexes.d.ts +4 -0
  310. package/node_modules/@openrig/daemon/dist/db/migrations/083_review_read_indexes.d.ts.map +1 -0
  311. package/node_modules/@openrig/daemon/dist/db/migrations/083_review_read_indexes.js +12 -0
  312. package/node_modules/@openrig/daemon/dist/db/migrations/083_review_read_indexes.js.map +1 -0
  313. package/node_modules/@openrig/daemon/dist/db/migrations/084_inventory_event_indexes.d.ts +5 -0
  314. package/node_modules/@openrig/daemon/dist/db/migrations/084_inventory_event_indexes.d.ts.map +1 -0
  315. package/node_modules/@openrig/daemon/dist/db/migrations/084_inventory_event_indexes.js +14 -0
  316. package/node_modules/@openrig/daemon/dist/db/migrations/084_inventory_event_indexes.js.map +1 -0
  317. package/node_modules/@openrig/daemon/dist/domain/execution-view.d.ts +1 -0
  318. package/node_modules/@openrig/daemon/dist/domain/execution-view.d.ts.map +1 -1
  319. package/node_modules/@openrig/daemon/dist/domain/execution-view.js +38 -19
  320. package/node_modules/@openrig/daemon/dist/domain/execution-view.js.map +1 -1
  321. package/node_modules/@openrig/daemon/dist/domain/files/file-read.d.ts +17 -0
  322. package/node_modules/@openrig/daemon/dist/domain/files/file-read.d.ts.map +1 -0
  323. package/node_modules/@openrig/daemon/dist/domain/files/file-read.js +24 -0
  324. package/node_modules/@openrig/daemon/dist/domain/files/file-read.js.map +1 -0
  325. package/node_modules/@openrig/daemon/dist/domain/gateway/connections-projection.d.ts +4 -4
  326. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.d.ts +13 -12
  327. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.d.ts.map +1 -1
  328. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.js +40 -77
  329. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.js.map +1 -1
  330. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.d.ts +2 -0
  331. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.d.ts.map +1 -1
  332. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.js +2 -0
  333. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.js.map +1 -1
  334. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.d.ts +2 -0
  335. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -1
  336. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.js +2 -0
  337. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -1
  338. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +4 -1
  339. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -1
  340. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.js +85 -3
  341. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -1
  342. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
  343. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.js +8 -1
  344. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -1
  345. package/node_modules/@openrig/daemon/dist/domain/health-context.d.ts +3 -0
  346. package/node_modules/@openrig/daemon/dist/domain/health-context.d.ts.map +1 -1
  347. package/node_modules/@openrig/daemon/dist/domain/health-context.js +78 -6
  348. package/node_modules/@openrig/daemon/dist/domain/health-context.js.map +1 -1
  349. package/node_modules/@openrig/daemon/dist/domain/health-detectors.d.ts +2 -1
  350. package/node_modules/@openrig/daemon/dist/domain/health-detectors.d.ts.map +1 -1
  351. package/node_modules/@openrig/daemon/dist/domain/health-detectors.js +8 -2
  352. package/node_modules/@openrig/daemon/dist/domain/health-detectors.js.map +1 -1
  353. package/node_modules/@openrig/daemon/dist/domain/health-diagnosis.d.ts +51 -1
  354. package/node_modules/@openrig/daemon/dist/domain/health-diagnosis.d.ts.map +1 -1
  355. package/node_modules/@openrig/daemon/dist/domain/health-diagnosis.js +60 -9
  356. package/node_modules/@openrig/daemon/dist/domain/health-diagnosis.js.map +1 -1
  357. package/node_modules/@openrig/daemon/dist/domain/health-passive-ceremony.d.ts +7 -1
  358. package/node_modules/@openrig/daemon/dist/domain/health-passive-ceremony.d.ts.map +1 -1
  359. package/node_modules/@openrig/daemon/dist/domain/health-passive-ceremony.js +59 -26
  360. package/node_modules/@openrig/daemon/dist/domain/health-passive-ceremony.js.map +1 -1
  361. package/node_modules/@openrig/daemon/dist/domain/health-projection.d.ts +2 -0
  362. package/node_modules/@openrig/daemon/dist/domain/health-projection.d.ts.map +1 -1
  363. package/node_modules/@openrig/daemon/dist/domain/health-projection.js.map +1 -1
  364. package/node_modules/@openrig/daemon/dist/domain/policies/delivery-digest-flush.d.ts.map +1 -1
  365. package/node_modules/@openrig/daemon/dist/domain/policies/delivery-digest-flush.js +23 -3
  366. package/node_modules/@openrig/daemon/dist/domain/policies/delivery-digest-flush.js.map +1 -1
  367. package/node_modules/@openrig/daemon/dist/domain/proof/judgments.d.ts +10 -3
  368. package/node_modules/@openrig/daemon/dist/domain/proof/judgments.d.ts.map +1 -1
  369. package/node_modules/@openrig/daemon/dist/domain/proof/judgments.js +26 -8
  370. package/node_modules/@openrig/daemon/dist/domain/proof/judgments.js.map +1 -1
  371. package/node_modules/@openrig/daemon/dist/domain/queue-repository.d.ts +19 -6
  372. package/node_modules/@openrig/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  373. package/node_modules/@openrig/daemon/dist/domain/queue-repository.js +61 -11
  374. package/node_modules/@openrig/daemon/dist/domain/queue-repository.js.map +1 -1
  375. package/node_modules/@openrig/daemon/dist/domain/queue-retention.d.ts.map +1 -1
  376. package/node_modules/@openrig/daemon/dist/domain/queue-retention.js +6 -2
  377. package/node_modules/@openrig/daemon/dist/domain/queue-retention.js.map +1 -1
  378. package/node_modules/@openrig/daemon/dist/domain/queue-transition-log.d.ts +1 -0
  379. package/node_modules/@openrig/daemon/dist/domain/queue-transition-log.d.ts.map +1 -1
  380. package/node_modules/@openrig/daemon/dist/domain/queue-transition-log.js +19 -7
  381. package/node_modules/@openrig/daemon/dist/domain/queue-transition-log.js.map +1 -1
  382. package/node_modules/@openrig/daemon/dist/domain/review/fleet-compose.d.ts +7 -6
  383. package/node_modules/@openrig/daemon/dist/domain/review/fleet-compose.d.ts.map +1 -1
  384. package/node_modules/@openrig/daemon/dist/domain/review/fleet-compose.js +25 -11
  385. package/node_modules/@openrig/daemon/dist/domain/review/fleet-compose.js.map +1 -1
  386. package/node_modules/@openrig/daemon/dist/domain/rig-mode/operating-posture.d.ts +49 -0
  387. package/node_modules/@openrig/daemon/dist/domain/rig-mode/operating-posture.d.ts.map +1 -0
  388. package/node_modules/@openrig/daemon/dist/domain/rig-mode/operating-posture.js +255 -0
  389. package/node_modules/@openrig/daemon/dist/domain/rig-mode/operating-posture.js.map +1 -0
  390. package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-defaults.d.ts.map +1 -1
  391. package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-defaults.js +20 -0
  392. package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-defaults.js.map +1 -1
  393. package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-store.d.ts +2 -2
  394. package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-store.d.ts.map +1 -1
  395. package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-store.js +19 -3
  396. package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-store.js.map +1 -1
  397. package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-types.d.ts +12 -7
  398. package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-types.d.ts.map +1 -1
  399. package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-types.js +14 -3
  400. package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-types.js.map +1 -1
  401. package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.d.ts +2 -2
  402. package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.d.ts.map +1 -1
  403. package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.js +2 -2
  404. package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.js.map +1 -1
  405. package/node_modules/@openrig/daemon/dist/domain/slices/slice-detail-projector.d.ts +1 -0
  406. package/node_modules/@openrig/daemon/dist/domain/slices/slice-detail-projector.d.ts.map +1 -1
  407. package/node_modules/@openrig/daemon/dist/domain/slices/slice-detail-projector.js +3 -0
  408. package/node_modules/@openrig/daemon/dist/domain/slices/slice-detail-projector.js.map +1 -1
  409. package/node_modules/@openrig/daemon/dist/domain/slices/slice-indexer.d.ts +4 -0
  410. package/node_modules/@openrig/daemon/dist/domain/slices/slice-indexer.d.ts.map +1 -1
  411. package/node_modules/@openrig/daemon/dist/domain/slices/slice-indexer.js +10 -1
  412. package/node_modules/@openrig/daemon/dist/domain/slices/slice-indexer.js.map +1 -1
  413. package/node_modules/@openrig/daemon/dist/domain/terminal/herdr-adapter.d.ts +2 -0
  414. package/node_modules/@openrig/daemon/dist/domain/terminal/herdr-adapter.d.ts.map +1 -1
  415. package/node_modules/@openrig/daemon/dist/domain/terminal/herdr-adapter.js +1 -1
  416. package/node_modules/@openrig/daemon/dist/domain/terminal/herdr-adapter.js.map +1 -1
  417. package/node_modules/@openrig/daemon/dist/domain/terminal/terminal-service.d.ts +30 -2
  418. package/node_modules/@openrig/daemon/dist/domain/terminal/terminal-service.d.ts.map +1 -1
  419. package/node_modules/@openrig/daemon/dist/domain/terminal/terminal-service.js +53 -13
  420. package/node_modules/@openrig/daemon/dist/domain/terminal/terminal-service.js.map +1 -1
  421. package/node_modules/@openrig/daemon/dist/domain/view-projector.d.ts +2 -0
  422. package/node_modules/@openrig/daemon/dist/domain/view-projector.d.ts.map +1 -1
  423. package/node_modules/@openrig/daemon/dist/domain/view-projector.js +1 -1
  424. package/node_modules/@openrig/daemon/dist/domain/view-projector.js.map +1 -1
  425. package/node_modules/@openrig/daemon/dist/domain/workspace/project-catalog.d.ts +18 -0
  426. package/node_modules/@openrig/daemon/dist/domain/workspace/project-catalog.d.ts.map +1 -0
  427. package/node_modules/@openrig/daemon/dist/domain/workspace/project-catalog.js +66 -0
  428. package/node_modules/@openrig/daemon/dist/domain/workspace/project-catalog.js.map +1 -0
  429. package/node_modules/@openrig/daemon/dist/domain/workspace/project-read.d.ts +29 -0
  430. package/node_modules/@openrig/daemon/dist/domain/workspace/project-read.d.ts.map +1 -0
  431. package/node_modules/@openrig/daemon/dist/domain/workspace/project-read.js +125 -0
  432. package/node_modules/@openrig/daemon/dist/domain/workspace/project-read.js.map +1 -0
  433. package/node_modules/@openrig/daemon/dist/health-projection-surface.d.ts +1 -0
  434. package/node_modules/@openrig/daemon/dist/health-projection-surface.d.ts.map +1 -1
  435. package/node_modules/@openrig/daemon/dist/local-reading-surface.d.ts +3 -0
  436. package/node_modules/@openrig/daemon/dist/local-reading-surface.d.ts.map +1 -0
  437. package/node_modules/@openrig/daemon/dist/local-reading-surface.js +3 -0
  438. package/node_modules/@openrig/daemon/dist/local-reading-surface.js.map +1 -0
  439. package/node_modules/@openrig/daemon/dist/project-catalog-surface.d.ts +2 -0
  440. package/node_modules/@openrig/daemon/dist/project-catalog-surface.d.ts.map +1 -0
  441. package/node_modules/@openrig/daemon/dist/project-catalog-surface.js +2 -0
  442. package/node_modules/@openrig/daemon/dist/project-catalog-surface.js.map +1 -0
  443. package/node_modules/@openrig/daemon/dist/routes/attention.d.ts +3 -0
  444. package/node_modules/@openrig/daemon/dist/routes/attention.d.ts.map +1 -0
  445. package/node_modules/@openrig/daemon/dist/routes/attention.js +155 -0
  446. package/node_modules/@openrig/daemon/dist/routes/attention.js.map +1 -0
  447. package/node_modules/@openrig/daemon/dist/routes/files.d.ts +1 -1
  448. package/node_modules/@openrig/daemon/dist/routes/files.d.ts.map +1 -1
  449. package/node_modules/@openrig/daemon/dist/routes/files.js +4 -24
  450. package/node_modules/@openrig/daemon/dist/routes/files.js.map +1 -1
  451. package/node_modules/@openrig/daemon/dist/routes/queue.d.ts +4 -18
  452. package/node_modules/@openrig/daemon/dist/routes/queue.d.ts.map +1 -1
  453. package/node_modules/@openrig/daemon/dist/routes/queue.js +23 -33
  454. package/node_modules/@openrig/daemon/dist/routes/queue.js.map +1 -1
  455. package/node_modules/@openrig/daemon/dist/routes/review.js +1 -1
  456. package/node_modules/@openrig/daemon/dist/routes/rig-mode.d.ts.map +1 -1
  457. package/node_modules/@openrig/daemon/dist/routes/rig-mode.js +67 -14
  458. package/node_modules/@openrig/daemon/dist/routes/rig-mode.js.map +1 -1
  459. package/node_modules/@openrig/daemon/dist/routes/rigs.js +5 -1
  460. package/node_modules/@openrig/daemon/dist/routes/rigs.js.map +1 -1
  461. package/node_modules/@openrig/daemon/dist/routes/scopes.d.ts.map +1 -1
  462. package/node_modules/@openrig/daemon/dist/routes/scopes.js +74 -20
  463. package/node_modules/@openrig/daemon/dist/routes/scopes.js.map +1 -1
  464. package/node_modules/@openrig/daemon/dist/routes/slices.d.ts +2 -2
  465. package/node_modules/@openrig/daemon/dist/routes/slices.d.ts.map +1 -1
  466. package/node_modules/@openrig/daemon/dist/routes/slices.js +18 -1
  467. package/node_modules/@openrig/daemon/dist/routes/slices.js.map +1 -1
  468. package/node_modules/@openrig/daemon/dist/routes/spec-library.d.ts.map +1 -1
  469. package/node_modules/@openrig/daemon/dist/routes/spec-library.js +11 -2
  470. package/node_modules/@openrig/daemon/dist/routes/spec-library.js.map +1 -1
  471. package/node_modules/@openrig/daemon/dist/routes/terminal.d.ts.map +1 -1
  472. package/node_modules/@openrig/daemon/dist/routes/terminal.js +14 -4
  473. package/node_modules/@openrig/daemon/dist/routes/terminal.js.map +1 -1
  474. package/node_modules/@openrig/daemon/dist/routes/views.d.ts.map +1 -1
  475. package/node_modules/@openrig/daemon/dist/routes/views.js +11 -1
  476. package/node_modules/@openrig/daemon/dist/routes/views.js.map +1 -1
  477. package/node_modules/@openrig/daemon/dist/server.d.ts +1 -0
  478. package/node_modules/@openrig/daemon/dist/server.d.ts.map +1 -1
  479. package/node_modules/@openrig/daemon/dist/server.js +3 -0
  480. package/node_modules/@openrig/daemon/dist/server.js.map +1 -1
  481. package/node_modules/@openrig/daemon/dist/startup.d.ts.map +1 -1
  482. package/node_modules/@openrig/daemon/dist/startup.js +19 -5
  483. package/node_modules/@openrig/daemon/dist/startup.js.map +1 -1
  484. package/node_modules/@openrig/daemon/package.json +13 -1
  485. package/package.json +1 -1
  486. package/tui/dist/attention/attention-model.d.ts +23 -0
  487. package/tui/dist/attention/attention-model.d.ts.map +1 -0
  488. package/tui/dist/attention/attention-model.js +85 -0
  489. package/tui/dist/attention/attention-model.js.map +1 -0
  490. package/tui/dist/attention/source-continuity.d.ts +9 -0
  491. package/tui/dist/attention/source-continuity.d.ts.map +1 -0
  492. package/tui/dist/attention/source-continuity.js +38 -0
  493. package/tui/dist/attention/source-continuity.js.map +1 -0
  494. package/tui/dist/commands/help.d.ts +4 -0
  495. package/tui/dist/commands/help.d.ts.map +1 -0
  496. package/tui/dist/commands/help.js +43 -0
  497. package/tui/dist/commands/help.js.map +1 -0
  498. package/tui/dist/commands/registry.d.ts.map +1 -1
  499. package/tui/dist/commands/registry.js +15 -1
  500. package/tui/dist/commands/registry.js.map +1 -1
  501. package/tui/dist/config/config-model.d.ts.map +1 -1
  502. package/tui/dist/config/config-model.js +33 -9
  503. package/tui/dist/config/config-model.js.map +1 -1
  504. package/tui/dist/connections/connections-model.js +1 -1
  505. package/tui/dist/connections/connections-model.js.map +1 -1
  506. package/tui/dist/daemon-client.d.ts +39 -7
  507. package/tui/dist/daemon-client.d.ts.map +1 -1
  508. package/tui/dist/daemon-client.js +74 -15
  509. package/tui/dist/daemon-client.js.map +1 -1
  510. package/tui/dist/demo-data.d.ts.map +1 -1
  511. package/tui/dist/demo-data.js +1 -0
  512. package/tui/dist/demo-data.js.map +1 -1
  513. package/tui/dist/detail.d.ts.map +1 -1
  514. package/tui/dist/detail.js +20 -7
  515. package/tui/dist/detail.js.map +1 -1
  516. package/tui/dist/execution/execution-model.d.ts +1 -0
  517. package/tui/dist/execution/execution-model.d.ts.map +1 -1
  518. package/tui/dist/execution/execution-model.js +88 -119
  519. package/tui/dist/execution/execution-model.js.map +1 -1
  520. package/tui/dist/health/health-model.d.ts.map +1 -1
  521. package/tui/dist/health/health-model.js +26 -34
  522. package/tui/dist/health/health-model.js.map +1 -1
  523. package/tui/dist/hydrate.d.ts +1 -1
  524. package/tui/dist/hydrate.d.ts.map +1 -1
  525. package/tui/dist/hydrate.js +89 -23
  526. package/tui/dist/hydrate.js.map +1 -1
  527. package/tui/dist/input.d.ts.map +1 -1
  528. package/tui/dist/input.js +20 -3
  529. package/tui/dist/input.js.map +1 -1
  530. package/tui/dist/live.d.ts +3 -1
  531. package/tui/dist/live.d.ts.map +1 -1
  532. package/tui/dist/live.js +66 -7
  533. package/tui/dist/live.js.map +1 -1
  534. package/tui/dist/local-reading.d.ts +54 -0
  535. package/tui/dist/local-reading.d.ts.map +1 -0
  536. package/tui/dist/local-reading.js +122 -0
  537. package/tui/dist/local-reading.js.map +1 -0
  538. package/tui/dist/main.js +121 -34
  539. package/tui/dist/main.js.map +1 -1
  540. package/tui/dist/motion.d.ts +2 -0
  541. package/tui/dist/motion.d.ts.map +1 -1
  542. package/tui/dist/motion.js +4 -0
  543. package/tui/dist/motion.js.map +1 -1
  544. package/tui/dist/navigator.d.ts.map +1 -1
  545. package/tui/dist/navigator.js +14 -3
  546. package/tui/dist/navigator.js.map +1 -1
  547. package/tui/dist/page-read.d.ts +19 -0
  548. package/tui/dist/page-read.d.ts.map +1 -0
  549. package/tui/dist/page-read.js +84 -0
  550. package/tui/dist/page-read.js.map +1 -0
  551. package/tui/dist/pulse/pulse-model.d.ts.map +1 -1
  552. package/tui/dist/pulse/pulse-model.js +3 -4
  553. package/tui/dist/pulse/pulse-model.js.map +1 -1
  554. package/tui/dist/reading.d.ts +36 -0
  555. package/tui/dist/reading.d.ts.map +1 -0
  556. package/tui/dist/reading.js +89 -0
  557. package/tui/dist/reading.js.map +1 -0
  558. package/tui/dist/render.d.ts +5 -0
  559. package/tui/dist/render.d.ts.map +1 -1
  560. package/tui/dist/render.js +190 -174
  561. package/tui/dist/render.js.map +1 -1
  562. package/tui/dist/scopes/scopes-model.d.ts +3 -0
  563. package/tui/dist/scopes/scopes-model.d.ts.map +1 -1
  564. package/tui/dist/scopes/scopes-model.js +8 -2
  565. package/tui/dist/scopes/scopes-model.js.map +1 -1
  566. package/tui/dist/sections.d.ts +2 -0
  567. package/tui/dist/sections.d.ts.map +1 -1
  568. package/tui/dist/sections.js +9 -5
  569. package/tui/dist/sections.js.map +1 -1
  570. package/tui/dist/startup.d.ts +10 -1
  571. package/tui/dist/startup.d.ts.map +1 -1
  572. package/tui/dist/startup.js +99 -27
  573. package/tui/dist/startup.js.map +1 -1
  574. package/tui/dist/state.d.ts.map +1 -1
  575. package/tui/dist/state.js +121 -22
  576. package/tui/dist/state.js.map +1 -1
  577. package/tui/dist/stylize.js +28 -28
  578. package/tui/dist/stylize.js.map +1 -1
  579. package/tui/dist/terminals/terminal-model.d.ts +57 -0
  580. package/tui/dist/terminals/terminal-model.d.ts.map +1 -0
  581. package/tui/dist/terminals/terminal-model.js +113 -0
  582. package/tui/dist/terminals/terminal-model.js.map +1 -0
  583. package/tui/dist/types.d.ts +84 -1
  584. package/tui/dist/types.d.ts.map +1 -1
@@ -1,3 +1,7 @@
1
+ import { helpScreen } from "./commands/help.js";
2
+ import { commandFocusVisible } from "./motion.js";
3
+ import { attentionLines } from "./attention/attention-model.js";
4
+ import { fileLines, externalLines, fileTargetForPath, referenceLines, referenceAction } from "./reading.js";
1
5
  import { DEFAULT_TIME_ZONE, displayTime } from "./time.js";
2
6
  import { startupLines } from "./startup.js";
3
7
  import { configLines } from "./config/config-model.js";
@@ -9,10 +13,8 @@ import { connectionsLines } from "./connections/connections-model.js";
9
13
  // SAME semantic actions commands produce (PIN 1). Isolated seam: a substrate
10
14
  // swap touches only this module (spike verdict revisit trigger).
11
15
  import { computeExplorerRows, findAgent, findSpec, findAgentBySession, agentsRunningSpec, agentsRunningSpecTargets, specDetailArrowsScroll } from "./state.js";
12
- import { filterPalette } from "./commands/palette.js";
13
16
  import { scopesContentLines } from "./scopes/scopes-model.js";
14
17
  import { executionContentLines, executionSliceStripLines } from "./execution/execution-model.js";
15
- import { COMMAND_REGISTRY } from "./commands/registry.js";
16
18
  import { navigatorDisplay } from "./navigator.js";
17
19
  import { renderGraphStyle } from "./topology/render-graph.js";
18
20
  import { buildPulseModel } from "./pulse/pulse-model.js";
@@ -22,6 +24,7 @@ import { buildLedgerExplorer } from "./crash-cart/ledger-explorer.js";
22
24
  import { runtimeMarkSegs } from "./topology/runtime-marks.js";
23
25
  import { barCells, flashActive, reducedMotion, spinnerFrame } from "./motion.js";
24
26
  import { explorerWidth, MOTION_FRAME_MS } from "./visual-layout.js";
27
+ import { terminalLines } from "./terminals/terminal-model.js";
25
28
  import { detailPage, fieldLine, sectionRule, listItem, alignedRow, LABEL_W, wrapDetailLines } from "./detail.js";
26
29
  import { healthAgentLines, healthDetailLines, healthListLines, healthSummaryLine } from "./health/health-model.js";
27
30
  function pad(text, width) {
@@ -434,11 +437,11 @@ function timeZoneLines(state, width) {
434
437
  listItem("Back · Esc", { type: "back" }),
435
438
  ], width);
436
439
  }
437
- function specTabsLine(state, name) {
440
+ function specTabsLine(state) {
438
441
  const active = state.viewTab === "topology" || state.viewTab === "yaml" ? state.viewTab : "configuration";
439
442
  const labels = ["topology", "configuration", "yaml"];
440
443
  const parts = labels.map((tab) => (tab === active ? `[ ${tab.toUpperCase()} ]` : ` ${tab.toUpperCase()} `));
441
- const text = `rig spec ${name} ${parts.join(" ")}`;
444
+ const text = parts.join(" ");
442
445
  return {
443
446
  text,
444
447
  zones: labels.map((tab, index) => {
@@ -469,6 +472,25 @@ function sourceProvenance(spec) {
469
472
  return "user library";
470
473
  return spec.sourceState === "library_item" ? "library" : "source unknown";
471
474
  }
475
+ function specSourceLines(spec, snap) {
476
+ if (!spec.sourcePath)
477
+ return [{ text: "Source path unavailable; no current-file claim." }];
478
+ const target = fileTargetForPath(spec.resolvedSourcePath ?? spec.sourcePath, snap.fileRoots ?? []) ?? { root: "", path: spec.sourcePath };
479
+ const lines = [fieldLine({ label: "source", value: `${displayPath(spec.sourcePath, 56)} · ${sourceProvenance(spec)}` }), listItem("View current source", { type: "file-open", target })];
480
+ if (!target.root)
481
+ lines.push({ text: "Source is not mapped to a configured readable root." });
482
+ if (target.root) {
483
+ lines.push({ text: `Readable root: ${target.root}` }, ...referenceLines(spec.description ?? "", target));
484
+ const markdownLinks = new Set([...((spec.description ?? "").matchAll(/\[[^\]\n]+\]\(<?([^\s)>]+)/g))].map((match) => match[1]));
485
+ // Prose paths stay relative to the named source, not an inferred checkout.
486
+ for (const match of (spec.description ?? "").matchAll(/(?:[\w.-]+\/)+[\w.-]+\.(?:md|txt|ya?ml)(?:#[\w-]+)?/g)) {
487
+ if (markdownLinks.has(match[0]))
488
+ continue;
489
+ lines.push(listItem(`Reference: ${match[0]} · relative to source`, referenceAction(target, match[0])));
490
+ }
491
+ }
492
+ return lines;
493
+ }
472
494
  function displayPath(path, max = 68) {
473
495
  if (path.length <= max)
474
496
  return path;
@@ -530,13 +552,13 @@ function instanceContentLines(state, snap, host, contentWidth, motion) {
530
552
  fields: [
531
553
  { label: "identity", value: host.name },
532
554
  { label: "transport", value: host.id ?? "local" },
533
- { 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` },
534
556
  ],
535
557
  },
536
558
  {
537
559
  title: "rigs",
538
560
  lines: host.rigs.length > 0
539
- ? 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 } }))
540
562
  : [{ text: " (no local rigs served — proven empty)" }],
541
563
  },
542
564
  ]),
@@ -591,7 +613,7 @@ function instanceContentLines(state, snap, host, contentWidth, motion) {
591
613
  const rigAction = { type: "drill", resource: "rig", name: rig.name, target: { host: host.name } };
592
614
  if (agents.length === 0) {
593
615
  lines.push({
594
- 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" }),
595
617
  action: rigAction,
596
618
  });
597
619
  continue;
@@ -627,11 +649,17 @@ function instanceContentLines(state, snap, host, contentWidth, motion) {
627
649
  });
628
650
  }
629
651
  }
630
- 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` });
631
653
  lines.push(...recentLines(snap, scope, contentWidth, false, state.timeZone));
632
654
  return lines;
633
655
  }
634
656
  function contentLines(state, snap, contentWidth, motion) {
657
+ if (state.file) {
658
+ const read = JSON.stringify(snap.fileRead?.target) === JSON.stringify(state.file) ? snap.fileRead?.result : null;
659
+ return [...(state.project ? wrapDetailLines([{ text: `Project ${state.project.id} · ${state.project.root}` }], contentWidth) : []), ...fileLines(read, state.file, contentWidth)];
660
+ }
661
+ if (state.externalUrl)
662
+ return externalLines(state.externalUrl, contentWidth);
635
663
  const contentWidthForGraph = contentWidth;
636
664
  void contentWidthForGraph;
637
665
  const lines = [];
@@ -639,12 +667,16 @@ function contentLines(state, snap, contentWidth, motion) {
639
667
  return timeZoneLines(state, contentWidth);
640
668
  if (state.recentOpen)
641
669
  return recentDetailLines(state, snap, contentWidth);
670
+ if (state.section === "terminals")
671
+ return terminalLines(state, snap, contentWidth);
642
672
  if (state.section === "config")
643
673
  return configLines(state, snap, contentWidth);
644
674
  if (state.section === "connections")
645
675
  return connectionsLines(snap, contentWidth, state.timeZone);
646
676
  if (state.healthOpen)
647
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)];
648
680
  // PULSE is a FULL-WIDTH view handled by an early return in renderScreen
649
681
  // (renderPulseScreen) — it never reaches the sidebar+content layout below.
650
682
  if (state.section === "topology") {
@@ -677,9 +709,18 @@ function contentLines(state, snap, contentWidth, motion) {
677
709
  const host = (hostName ? snap.hosts.find((candidate) => candidate.name === hostName) : snap.hosts[0]);
678
710
  if (leaf?.kind === "host" && host)
679
711
  return instanceContentLines(state, snap, host, contentWidth, motion);
680
- 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;
681
719
  const rig = host?.rigs.find((candidate) => candidate.name === rigName);
682
720
  if (!rig || !host) {
721
+ const notLoaded = snap.readErrors.find((error) => error.startsWith("Live data not loaded"));
722
+ if (notLoaded)
723
+ return [{ text: notLoaded }];
683
724
  // round-6 (guard): the ROOT topology branch consumes the OWNER's load
684
725
  // truth like every other read surface — a real in-flight cold start
685
726
  // renders the spinner; after settlement only a NAMED rigs-summary
@@ -694,6 +735,10 @@ function contentLines(state, snap, contentWidth, motion) {
694
735
  }
695
736
  return [{ text: "(no rigs served — proven empty, not fabricated)" }];
696
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` }];
697
742
  const podFilter = leaf?.kind === "pod" ? leaf.name : null;
698
743
  const all = rig.pods.flatMap((p) => p.agents.map((a) => ({ pod: p.name, ...a })));
699
744
  const rows = all
@@ -848,13 +893,13 @@ function contentLines(state, snap, contentWidth, motion) {
848
893
  if (leaf?.kind === "spec") {
849
894
  const spec = findSpec(snap, leaf.name);
850
895
  if (!spec)
851
- return [{ text: `spec "${leaf.name}" not in the current snapshot` }];
896
+ return [{ text: snap.readErrors.find((error) => error.startsWith("specs-library")) ?? (!snap.specsLoaded ? "Specs catalog read pending" : `spec "${leaf.name}" not in the current catalog`) }];
852
897
  if (spec.kind === "rig")
853
- lines.push(specTabsLine(state, spec.name));
898
+ lines.push(specTabsLine(state));
854
899
  lines.push({ text: `${spec.kind} spec ${spec.name}` });
855
900
  lines.push(fieldLine({ label: "purpose", value: spec.description ?? "not declared in the available source" }));
856
901
  lines.push(fieldLine({ label: "provenance", value: `${sourceProvenance(spec)} · ${spec.sourceState ?? "source state not served"}` }));
857
- lines.push(fieldLine({ label: "source", value: spec.sourcePath ?? "path unavailable" }));
902
+ lines.push(...specSourceLines(spec, snap));
858
903
  lines.push({ text: " Authored declaration. Resource availability is not the effective loadout of a running seat." });
859
904
  lines.push(sectionRule("Observed consumers · open for effective runtime/configuration", contentWidth));
860
905
  for (const consumer of spec.consumers ?? []) {
@@ -871,8 +916,6 @@ function contentLines(state, snap, contentWidth, motion) {
871
916
  if (spec.sourceUnavailable)
872
917
  return wrapDetailLines([...lines, { text: ` Source unavailable: ${spec.sourceUnavailable}` }], contentWidth);
873
918
  if (spec.kind === "rig") {
874
- if (spec.sourcePath)
875
- lines.push(fieldLine({ label: "source", value: `${displayPath(spec.sourcePath, 56)} · ${sourceProvenance(spec)}` }));
876
919
  if (state.viewTab === "topology") {
877
920
  // ROUND-4 item 1: the established table treatment, not unformatted rows
878
921
  const nodes = spec.graph?.nodes ?? [];
@@ -994,142 +1037,106 @@ function contentLines(state, snap, contentWidth, motion) {
994
1037
  }
995
1038
  return wrapDetailLines(lines, contentWidth);
996
1039
  }
997
- lines.push({ text: "SPEC LIBRARY" });
998
- lines.push({ text: state.filter ? `/ filter specs: ${state.filter} · / replace · esc clear` : "/ filter specs…" });
999
- // mirrors the explorer exactly (same grouping, same expansion state, same
1000
- // filter-overrides-collapse rule) — glance consistency across panes
1001
- const expandedSet = new Set(state.expanded);
1002
- for (const kind of ["rig", "agent", "workflow"]) {
1003
- const shown = snap.specs.filter((s) => s.kind === kind).filter((s) => !state.filter || s.name.includes(state.filter));
1004
- if (shown.length === 0 && !snap.specs.some((s) => s.kind === kind))
1005
- continue;
1006
- lines.push({ text: ` ${kind.toUpperCase()} (${shown.length})` });
1007
- if (kind !== "agent") {
1008
- for (const s of shown)
1009
- lines.push({ text: ` ▪ ${s.name}`, action: { type: "drill", resource: "spec", name: s.name } });
1010
- continue;
1011
- }
1012
- const groups = new Map();
1013
- for (const s of shown) {
1014
- const namespace = s.namespace ?? "(root)";
1015
- groups.set(namespace, [...(groups.get(namespace) ?? []), s]);
1016
- }
1017
- for (const [namespace, specs] of [...groups.entries()].sort(([a], [b]) => a.localeCompare(b))) {
1018
- const open = namespace === "(root)" || expandedSet.has(`folder:${namespace}`) || !!state.filter;
1019
- if (namespace !== "(root)")
1020
- lines.push({
1021
- text: ` ${open ? "▾" : "▸"} ${namespace}/ (${specs.length})`,
1022
- action: { type: "toggle-expand", key: `folder:${namespace}` },
1023
- });
1024
- if (!open)
1025
- continue;
1026
- for (const s of specs)
1027
- lines.push({
1028
- text: `${namespace === "(root)" ? " " : " "}▪ ${s.name}`,
1029
- action: { type: "drill", resource: "spec", name: s.name },
1030
- });
1031
- }
1032
- }
1033
- if (snap.specs.length === 0) {
1034
- // round-5 (guard): spin only while the owner is loading; settled empty
1035
- // is PROVEN empty and a settled failure is named — neither spins
1036
- if (motion.loading) {
1037
- if (!motion.reduced)
1038
- motion.used = true;
1039
- lines.push({ text: ` ${motion.frame} library read pending — honest-empty` });
1040
- }
1041
- else if (snap.readErrors.some((e) => e.startsWith("specs-library"))) {
1042
- lines.push({ text: " ✕ library read failed — named in the status line" });
1043
- }
1044
- else {
1045
- lines.push({ text: " (library empty — proven, no specs served)" });
1046
- }
1047
- }
1048
- return lines;
1049
- }
1050
- if (state.section === "needs") {
1051
- lines.push({ text: "NEEDS-YOU" });
1052
- for (const item of snap.needs) {
1053
- // open/navigate is the ONLY in-TUI action (B3): the click target joins
1054
- // the item's session back to topology; unresolvable targets never
1055
- // advertise a control that can only fail.
1056
- lines.push(needsLine(item.source === "agent" ? " ☐ " : " ⚑ ", item, snap));
1057
- }
1058
- if (snap.needs.length === 0 && snap.humanQueueProbed)
1059
- lines.push({ text: " (no fleet attention items right now)" });
1060
- if (snap.hostsDown.length > 0) {
1061
- // composed BESIDE the items (a separate shipped read), never into the item shape
1062
- lines.push({ text: "" });
1063
- lines.push({ text: " hosts/rigs down:" });
1064
- // NB: glyphs here must be single-cell — U+26D4 ⛔ is emoji-width (2 cells)
1065
- // and wraps a full-width padded line, shearing every row below it.
1066
- for (const h of snap.hostsDown)
1067
- lines.push({ text: ` ✖ ${alignedRow([[h.hostId, 28], [h.status, 26]])} ${h.error ?? ""}`.trimEnd() });
1040
+ if (state.filter)
1041
+ lines.push({ text: `/ filter specs: ${state.filter} · / replace · esc clear` });
1042
+ const selected = computeExplorerRows(state, snap)[state.selection]?.action;
1043
+ const spec = selected?.type === "drill" && selected.resource === "spec" ? findSpec(snap, selected.name) : null;
1044
+ if (spec) {
1045
+ lines.push({ text: `${spec.name} · ${spec.kind} · ${sourceProvenance(spec)}` });
1046
+ lines.push({ text: "" }, { text: spec.description?.trim() || "Purpose not declared in the available source." });
1047
+ if (spec.kind === "rig")
1048
+ lines.push(fieldLine({ label: "contents", value: `${spec.pods?.length ?? 0} pods · ${spec.pods?.reduce((n, p) => n + p.members.length, 0) ?? spec.legacyNodes?.length ?? 0} members · ${spec.agentRefs?.join(", ") || "no member references served"}` }));
1049
+ else if (spec.kind === "agent")
1050
+ lines.push(fieldLine({ label: "contents", value: `${spec.runtime ?? "runtime not declared"} · ${(spec.skills ?? []).length} skills · ${(spec.startupFiles ?? []).length} startup files` }));
1051
+ else
1052
+ lines.push(fieldLine({ label: "contents", value: `${spec.rolesCount ?? "unknown"} roles · ${spec.stepsCount ?? "unknown"} steps` }));
1053
+ lines.push({ text: "" }, listItem("Read details · Enter", { type: "drill", resource: "spec", name: spec.name }), ...specSourceLines(spec, snap));
1054
+ if (spec.sourceUnavailable)
1055
+ lines.push({ text: `Source unavailable: ${spec.sourceUnavailable}` });
1068
1056
  }
1069
- lines.push({ text: "" });
1070
- if (!snap.humanQueueProbed) {
1071
- if (motion.loading) {
1072
- // region discipline (max ONE persistent animation): while a derived ⚑
1073
- // item pulses on this page, the pending spinner degrades to the honest
1074
- // static dot instead of animating beside it
1075
- const pulseVisible = snap.needs.some((item) => item.source === "derived") && !motion.reduced;
1076
- const spin = pulseVisible ? "·" : motion.frame;
1077
- if (!pulseVisible && !motion.reduced)
1078
- motion.used = true;
1079
- lines.push({ text: ` ${spin} human-queue: not yet known (read pending)` });
1080
- }
1081
- else {
1082
- // round-5 (guard): settled-unprobed is a static truth (hosts down or
1083
- // registry unavailable) — "(read pending)" would be a false claim
1084
- lines.push({ text: " human-queue: not yet known (hosts unreachable or registry unavailable)" });
1057
+ else {
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: "" });
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` });
1062
+ if (!snap.specs.length) {
1063
+ if (motion.loading) {
1064
+ if (!motion.reduced)
1065
+ motion.used = true;
1066
+ lines.push({ text: ` ${motion.frame} library read pending` });
1067
+ }
1068
+ else {
1069
+ const failure = snap.readErrors.find((error) => error.startsWith("specs-library"));
1070
+ const notLoaded = snap.readErrors.find((error) => error.startsWith("Live data not loaded"));
1071
+ lines.push({ text: failure ? ` ✕ library read failed: ${failure}` : notLoaded ?? (snap.specsLoaded === false ? "Specs catalog read unavailable" : " (library empty — proven, no specs served)") });
1072
+ }
1085
1073
  }
1086
1074
  }
1087
- else if (!snap.needs.some((item) => item.source === "agent"))
1088
- lines.push({ text: " human-queue: no items (proven empty — surfacing adoption pending)" });
1089
- return lines;
1075
+ return wrapDetailLines(lines, contentWidth);
1090
1076
  }
1077
+ if (state.section === "needs")
1078
+ return attentionLines(state, snap, contentWidth);
1091
1079
  if (state.section === "scopes") {
1092
- if (!state.scopesMission && snap.execution) {
1093
- const selected = snap.execution;
1094
- const instances = selected.lifecycle_instances;
1080
+ const catalog = snap.projects;
1081
+ if (!state.project && catalog !== undefined)
1095
1082
  return wrapDetailLines([
1096
- { text: "SCOPES · choose a mission in the explorer" },
1097
- listItem(`Default mission · ${selected.mission}`, { type: "scopes-mission-open", mission: selected.mission }),
1098
- { text: ` Workflows: ${instances ? instances.map((instance) => String(instance.status ?? "unknown")).join(", ") || "none bound" : "projection unavailable"}` },
1099
- { text: ` Execution snapshot: ${displayTime(selected.derived_at, state.timeZone)}. Other missions load when selected.` },
1083
+ { text: "PROJECTS · select a project" },
1084
+ { text: catalog ? `Catalog: ${catalog.catalogPath}` : "Project catalog unavailable or loading" },
1085
+ ...(snap.readErrors ?? []).map(text => ({ text })),
1086
+ ...(catalog?.projects ?? []).flatMap(p => [listItem(`${p.name} · ${p.id}`, { type: "project-select", id: p.id }), { text: p.root }, ...(p.error ? [{ text: `Unavailable: ${p.error}` }] : [])]),
1087
+ ...(catalog?.projects.length === 0 ? [{ text: "No projects declared in this catalog." }] : []),
1100
1088
  ], contentWidth);
1101
- }
1089
+ const identity = state.project ? wrapDetailLines([{ text: `PROJECT ${state.project.id}` }, { text: state.project.root }], contentWidth) : [];
1090
+ if (state.project && (snap.projectRead?.id !== state.project.id || snap.projectRead?.root !== state.project.root))
1091
+ return [...identity, { text: "Reading selected project…" }];
1092
+ const entry = catalog?.projects.find(p => p.id === state.project.id && p.root === state.project.root);
1093
+ const errors = (snap.readErrors ?? []).map(text => ({ text: `Unavailable: ${text}` }));
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)] : [];
1098
+ if (state.project && (!entry || entry.error))
1099
+ return [...projectHeader, { text: "Choose a project again or go Back." }];
1100
+ if (state.project && !state.scopesMission)
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." }] : [])];
1102
1102
  // SCOPES owns both levels. Both mission-graph and Explorer slice routes land
1103
1103
  // on the same execution-backed canonical detail; store-direct content is
1104
1104
  // composed into that page instead of surviving as a competing destination.
1105
1105
  const sel = state.scopesSelected;
1106
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)];
1107
1110
  const execution = snap.execution?.mission === missionName ? snap.execution : null;
1108
1111
  const detail = sel
1109
1112
  ? (snap.scopes ?? []).find((m) => m.mission === sel.mission)?.slices.find((sl) => sl.dirName === sel.slice) ?? null
1110
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 })));
1111
1118
  if (state.executionOpen && execution) {
1112
- return executionContentLines(execution, snap.scopes, snap.readErrors, state.executionOpen, contentWidth, false, snap.sliceDetail, {
1113
- collapseReqs: state.scopesCollapseReqs,
1114
- narrative: state.scopesNarrative,
1115
- }, state.timeZone);
1119
+ return [...projectHeader, ...executionContentLines(execution, snap.scopes, snap.readErrors, state.executionOpen, contentWidth, false, snap.sliceDetail, {
1120
+ collapseReqs: state.scopesCollapseReqs,
1121
+ narrative: state.scopesNarrative,
1122
+ }, state.timeZone)];
1116
1123
  }
1117
1124
  if (detail && execution) {
1118
- return executionContentLines(execution, snap.scopes, snap.readErrors, `slice:${detail.id ?? detail.dirName}`, contentWidth, false, snap.sliceDetail, {
1119
- collapseReqs: state.scopesCollapseReqs,
1120
- narrative: state.scopesNarrative,
1121
- }, state.timeZone);
1125
+ return [...projectHeader, ...executionContentLines(execution, snap.scopes, snap.readErrors, `slice:${detail.id ?? detail.dirName}`, contentWidth, false, snap.sliceDetail, {
1126
+ collapseReqs: state.scopesCollapseReqs,
1127
+ narrative: state.scopesNarrative,
1128
+ }, state.timeZone)];
1122
1129
  }
1123
1130
  if (!detail && missionName) {
1124
1131
  const lines = executionContentLines(execution, snap.scopes, snap.readErrors, state.executionOpen, contentWidth, !snap.hydratedAt || snap.executionMission !== missionName, undefined, undefined, state.timeZone);
1125
- return execution ? lines : [{ text: ` ${missionName} EXECUTION` }, ...lines];
1132
+ return [...projectHeader, ...(execution ? lines : [{ text: ` ${missionName} EXECUTION` }, ...lines])];
1126
1133
  }
1127
- return scopesContentLines(detail, missionName, {
1128
- collapseReqs: state.scopesCollapseReqs,
1129
- narrative: state.scopesNarrative,
1130
- width: contentWidth,
1131
- executionStrip: detail ? executionSliceStripLines(null, detail.id ?? detail.dirName, detail.dirName, contentWidth, detail.status) : undefined,
1132
- });
1134
+ return [...projectHeader, ...scopesContentLines(detail, missionName, {
1135
+ collapseReqs: state.scopesCollapseReqs,
1136
+ narrative: state.scopesNarrative,
1137
+ width: contentWidth,
1138
+ executionStrip: detail ? executionSliceStripLines(null, detail.id ?? detail.dirName, detail.dirName, contentWidth, detail.status) : undefined,
1139
+ })];
1133
1140
  }
1134
1141
  return [{ text: `(${state.section})` }];
1135
1142
  }
@@ -1216,6 +1223,15 @@ function pushExplorerTargets(hitMap, row, display, y, explorerWidth) {
1216
1223
  }
1217
1224
  hitMap.push({ y, x1: 1, x2: explorerWidth, action: row.action });
1218
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
+ }
1219
1235
  function renderPulseScreen(state, snap, options, inputLine) {
1220
1236
  const { cols = 120, rows = 32, nowMs = 0 } = options;
1221
1237
  const explW = explorerWidth(cols);
@@ -1249,7 +1265,9 @@ function renderPulseScreen(state, snap, options, inputLine) {
1249
1265
  const contentTargets = [];
1250
1266
  const flashRows = [];
1251
1267
  let flashAck = false;
1252
- 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" } });
1253
1271
  if (options.completion) {
1254
1272
  lines.push(pad(options.completion.message, cols));
1255
1273
  for (const candidate of options.completion.candidates.slice(0, 4))
@@ -1257,21 +1275,6 @@ function renderPulseScreen(state, snap, options, inputLine) {
1257
1275
  if (options.completion.candidates.length > 4)
1258
1276
  lines.push(pad(" … keep typing to narrow matches", cols));
1259
1277
  }
1260
- // REGISTRY I3 — the palette overlay: fuzzy rows over the ONE registry; unavailable
1261
- // entries render DIMMED-WITH-REASON, never hidden (PM pin); bounded height.
1262
- if (state.palette) {
1263
- const rows = filterPalette(state.palette.query, COMMAND_REGISTRY, options.commandContext ?? "standard");
1264
- const sel = Math.min(state.palette.selection, Math.max(0, rows.length - 1));
1265
- lines.push(pad(`? ${state.palette.query}▊ (${rows.length} commands · ↑↓ · ⏎ run · esc close)`, cols));
1266
- for (let i = 0; i < Math.min(rows.length, 8); i += 1) {
1267
- const r = rows[i];
1268
- const mark = i === sel ? "▸" : " ";
1269
- const label = `${r.entry.name}${r.entry.args ? " " + r.entry.args : ""}`;
1270
- const alias = r.entry.aliases.length ? ` (${r.entry.aliases.join(",")})` : "";
1271
- const tail = r.available ? r.entry.description : `${r.entry.description} — unavailable: ${r.reason}`;
1272
- lines.push(pad(`${mark} ${label}${alias} ${tail}`, cols));
1273
- }
1274
- }
1275
1278
  const explorerTitle = state.focusedPane === "explorer" ? "{ EXPLORER }" : "EXPLORER";
1276
1279
  const contentTitle = state.focusedPane === "content" ? "{ PULSE }" : "PULSE";
1277
1280
  lines.push(paneRule(cols, explW, "top", explorerTitle, contentTitle));
@@ -1463,18 +1466,34 @@ function crashCartShell(content, led, contentTitle, cols, rows, inputLine, opts)
1463
1466
  };
1464
1467
  }
1465
1468
  export function renderScreen(state, snap, options = {}, inputLine = "") {
1469
+ if (state.palette)
1470
+ return helpScreen(state.palette, options.commandContext ?? "standard", options.cols ?? 120, options.rows ?? 32);
1471
+ const screen = renderBody(state, snap, options, inputLine);
1472
+ const commandReady = !options.startup?.open && !options.restore && !options.unavailable && (!options.daemonState || options.daemonState === "up");
1473
+ if (commandReady) {
1474
+ const reduced = reducedMotion();
1475
+ if (!commandFocusVisible(options.nowMs ?? 0, inputLine.length > 0, reduced)) {
1476
+ const line = screen.lines[0];
1477
+ screen.lines[0] = line.slice(0, 6) + " " + line.slice(7);
1478
+ }
1479
+ screen.commandMotionActive = !reduced && inputLine.length === 0;
1480
+ }
1481
+ return screen;
1482
+ }
1483
+ function renderBody(state, snap, options = {}, inputLine = "") {
1466
1484
  const { cols = 120, rows = 32, nowMs = 0 } = options;
1467
- const explW = explorerWidth(cols);
1485
+ const fullReading = !options.startup?.open && (!!state.file || !!state.externalUrl || (cols <= 90 && state.section === "specs" && state.drill.length > 0));
1486
+ const explW = fullReading ? 0 : explorerWidth(cols);
1468
1487
  if (options.startup?.open) {
1469
1488
  const startup = options.startup;
1470
1489
  const content = wrapContentLines(startupLines(startup).map((line) => ({ ...line,
1471
1490
  text: line.text.replace(/\x1b\[[0-9;?]*[A-Za-z]/g, "").replace(/[\x00-\x1f\x7f]/g, " ")
1472
1491
  .replace(/(https?:\/\/)[^\s/@]+:[^\s/@]+@/gi, "$1[redacted]@").replace(/Bearer\s+[^\s]+/gi, "Bearer [redacted]"),
1473
1492
  })), Math.max(1, cols - explW - 2));
1474
- const selected = content.findIndex((line) => line.action?.type === "startup" && line.action.key === `select:${startup.selected}`);
1475
- const scroll = startup.expanded ? startup.scroll : Math.max(0, selected - Math.max(1, rows - 12));
1493
+ const selected = content.findIndex((line) => line.action?.type === "startup" && line.action.key === `select:${startup.local?.selected ?? startup.selected}`);
1494
+ const scroll = startup.local && !startup.local.result.entries ? startup.local.scroll : startup.expanded ? startup.scroll : Math.max(0, selected - Math.max(1, rows - 12));
1476
1495
  const screen = crashCartShell(content, { note: "startup", rows: [] }, "START AND RETURN", cols, rows, "", { scroll });
1477
- screen.lines[rows - 1] = pad("↑↓ choose · Enter select · r refresh · d details · Esc back · q quit", cols);
1496
+ screen.lines[rows - 1] = pad("? Help · w Skip · L Local · ↑↓ scroll · Enter read · Esc Back · q Quit", cols);
1478
1497
  return screen;
1479
1498
  }
1480
1499
  // 5.2 crash-cart (shell-placement rework, ruling 3c6c2be0): daemon-DOWN renders as a CONTENT-PANE
@@ -1529,7 +1548,7 @@ export function renderScreen(state, snap, options = {}, inputLine = "") {
1529
1548
  // PULSE (founder Option-B): a content-pane view inside the NORMAL explorer│
1530
1549
  // content chrome — renderPulseScreen builds its own split (sidebar + lanes)
1531
1550
  // and rides the same segRows paint path, so it returns before the table layout.
1532
- if (state.viewTab === "pulse")
1551
+ if (state.viewTab === "pulse" && options.load?.settled !== false)
1533
1552
  return renderPulseScreen(state, snap, options, inputLine);
1534
1553
  // S19 round-5 (guard): one spinner frame per render pass from caller time;
1535
1554
  // `loading` comes from the refresh OWNER (omitted = settled — demo/fixture
@@ -1548,8 +1567,10 @@ export function renderScreen(state, snap, options = {}, inputLine = "") {
1548
1567
  // current insertion point for EMPTY and non-empty buffers alike — the
1549
1568
  // shell accepts typing from the empty state, so the honest readiness
1550
1569
  // affordance must show BEFORE the first key (no new focus state; stylize
1551
- // gives the cell SGR blink; zero effect on hit geometry).
1552
- lines.push(pad(`cmd ▸ ${inputLine}▊${inputLine ? "" : " Tab complete · ? help · timezone"}`, cols));
1570
+ // paints the cell; the shared motion clock controls its visibility).
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" } });
1553
1574
  if (options.completion) {
1554
1575
  lines.push(pad(options.completion.message, cols));
1555
1576
  for (const candidate of options.completion.candidates.slice(0, 4))
@@ -1557,31 +1578,26 @@ export function renderScreen(state, snap, options = {}, inputLine = "") {
1557
1578
  if (options.completion.candidates.length > 4)
1558
1579
  lines.push(pad(" … keep typing to narrow matches", cols));
1559
1580
  }
1560
- // REGISTRY I3 — the palette overlay: fuzzy rows over the ONE registry; unavailable
1561
- // entries render DIMMED-WITH-REASON, never hidden (PM pin); bounded height.
1562
- if (state.palette) {
1563
- const rows = filterPalette(state.palette.query, COMMAND_REGISTRY, options.commandContext ?? "standard");
1564
- const sel = Math.min(state.palette.selection, Math.max(0, rows.length - 1));
1565
- lines.push(pad(`? ${state.palette.query}▊ (${rows.length} commands · ↑↓ · ⏎ run · esc close)`, cols));
1566
- for (let i = 0; i < Math.min(rows.length, 8); i += 1) {
1567
- const r = rows[i];
1568
- const mark = i === sel ? "▸" : " ";
1569
- const label = `${r.entry.name}${r.entry.args ? " " + r.entry.args : ""}`;
1570
- const alias = r.entry.aliases.length ? ` (${r.entry.aliases.join(",")})` : "";
1571
- const tail = r.available ? r.entry.description : `${r.entry.description} — unavailable: ${r.reason}`;
1572
- lines.push(pad(`${mark} ${label}${alias} ${tail}`, cols));
1573
- }
1574
- }
1575
- const sectionTitle = { topology: "TOPOLOGY", specs: "SPECS", needs: "NEEDS-YOU" }[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();
1576
1582
  // active-pane emphasis (k9s-class chrome): the focused pane's title is bracketed
1577
1583
  const explorerTitle = state.focusedPane === "explorer" ? "{ EXPLORER }" : "EXPLORER";
1578
1584
  const contentTitle = state.focusedPane === "content" ? `{ ${sectionTitle} }` : sectionTitle;
1579
- lines.push(paneRule(cols, explW, "top", explorerTitle, contentTitle));
1580
- const explorer = computeExplorerRows(state, snap);
1585
+ lines.push(fullReading ? pad(`━ ${state.file ? "READ" : state.externalUrl ? "EXTERNAL URL" : "SPECS"} · Esc / ← Back `, cols) : paneRule(cols, explW, "top", explorerTitle, contentTitle));
1586
+ const explorer = fullReading ? [] : computeExplorerRows(state, snap);
1581
1587
  // Slice-17: the file-tree re-skin is a DISPLAY transform only — rows, keys,
1582
1588
  // actions, and the hit-map all keep resolving against the row model above.
1583
1589
  const { labels: explorerDisplay, metas: explorerMetas } = navigatorDisplay(explorer, snap, explW - 1);
1584
- const content = contentLines(state, snap, Math.max(cols - explW - 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;
1585
1601
  const footer = state.footerOn ? snap.stream.at(-1) : undefined;
1586
1602
  // round-5 (guard): the tmux-style ONE-SHOT activity flash targets the
1587
1603
  // flashed agent's EXPLORER row — per-seat pane-output events from the
@@ -1653,7 +1669,7 @@ export function renderScreen(state, snap, options = {}, inputLine = "") {
1653
1669
  else
1654
1670
  contentMarker = "›";
1655
1671
  }
1656
- lines.push(pad(`${left}┃${contentMarker}${contentText}`, cols));
1672
+ lines.push(pad(fullReading ? `${contentMarker}${contentText}` : `${left}┃${contentMarker}${contentText}`, cols));
1657
1673
  if (row) {
1658
1674
  pushExplorerTargets(hitMap, row, explorerDisplay[explorerIndex] ?? row.label, y, explW);
1659
1675
  explorerRows.push({ ...row, y });
@@ -1665,12 +1681,12 @@ export function renderScreen(state, snap, options = {}, inputLine = "") {
1665
1681
  }
1666
1682
  // zones first: hit lookup takes the first match, so a zone wins over the row-wide action
1667
1683
  for (const z of zones) {
1668
- const target = { y, x1: explW + 3 + z.start, x2: explW + 2 + z.end, action: z.action };
1684
+ const target = { y, x1: (fullReading ? 2 : explW + 3) + z.start, x2: (fullReading ? 1 : explW + 2) + z.end, action: z.action };
1669
1685
  hitMap.push(target);
1670
1686
  contentTargets.push(target);
1671
1687
  }
1672
1688
  if (item?.action) {
1673
- const target = { y, x1: explW + 3, x2: cols, action: item.action };
1689
+ const target = { y, x1: fullReading ? 2 : explW + 3, x2: cols, action: item.action };
1674
1690
  hitMap.push(target);
1675
1691
  contentTargets.push(target);
1676
1692
  }
@@ -1681,8 +1697,8 @@ export function renderScreen(state, snap, options = {}, inputLine = "") {
1681
1697
  lines.push(pad(`≋ ${displayTime(footer.tsEmitted, state.timeZone)} ${footer.sourceSession}: ${footer.body}`, cols));
1682
1698
  const drillPath = state.drill.map((d) => d.name).join(" → ");
1683
1699
  const readWarn = snap.readErrors.length > 0 ? ` ⚠ ${snap.readErrors.length} read(s) failed: ${snap.readErrors[0]}` : "";
1684
- lines.push(paneRule(cols, explW, "bottom"));
1685
- lines.push(pad(keybindHints(state), cols));
1700
+ lines.push(fullReading ? "━".repeat(cols) : paneRule(cols, explW, "bottom"));
1701
+ lines.push(pad(fullReading ? "↑↓ scroll / links · → links · Enter open · Esc Back · refresh · v copy" : keybindHints(state), cols));
1686
1702
  lines.push(pad(`[${state.instanceId}] ${state.section}${drillPath ? " · " + drillPath : ""}${state.lastError ? " ✗ " + state.lastError : ""}${state.notice ? " ▸ " + state.notice : ""}${readWarn}${state.timeZoneWarning ? " · ⚠ timezone; run timezone" : ""}`, cols));
1687
1703
  while (lines.length < rows)
1688
1704
  lines.push("");