@openrig/cli 0.1.12 → 0.3.0

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 (856) hide show
  1. package/daemon/assets/openrig-activity-hook-relay.cjs +104 -0
  2. package/daemon/dist/adapters/claude-code-adapter.d.ts +24 -6
  3. package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
  4. package/daemon/dist/adapters/claude-code-adapter.js +221 -65
  5. package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
  6. package/daemon/dist/adapters/claude-resume.d.ts +5 -0
  7. package/daemon/dist/adapters/claude-resume.d.ts.map +1 -1
  8. package/daemon/dist/adapters/claude-resume.js +13 -0
  9. package/daemon/dist/adapters/claude-resume.js.map +1 -1
  10. package/daemon/dist/adapters/codex-resume.d.ts +8 -1
  11. package/daemon/dist/adapters/codex-resume.d.ts.map +1 -1
  12. package/daemon/dist/adapters/codex-resume.js +74 -5
  13. package/daemon/dist/adapters/codex-resume.js.map +1 -1
  14. package/daemon/dist/adapters/codex-runtime-adapter.d.ts +9 -5
  15. package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  16. package/daemon/dist/adapters/codex-runtime-adapter.js +255 -28
  17. package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  18. package/daemon/dist/adapters/terminal-adapter.d.ts +2 -1
  19. package/daemon/dist/adapters/terminal-adapter.d.ts.map +1 -1
  20. package/daemon/dist/adapters/terminal-adapter.js +7 -1
  21. package/daemon/dist/adapters/terminal-adapter.js.map +1 -1
  22. package/daemon/dist/adapters/tmux.d.ts.map +1 -1
  23. package/daemon/dist/adapters/tmux.js +53 -5
  24. package/daemon/dist/adapters/tmux.js.map +1 -1
  25. package/daemon/dist/builtins/workflow-specs/basic-loop.yaml +76 -0
  26. package/daemon/dist/builtins/workflow-specs/conveyor.yaml +80 -0
  27. package/daemon/dist/db/migrations/021_seat_handover_observability.d.ts +3 -0
  28. package/daemon/dist/db/migrations/021_seat_handover_observability.d.ts.map +1 -0
  29. package/daemon/dist/db/migrations/021_seat_handover_observability.js +11 -0
  30. package/daemon/dist/db/migrations/021_seat_handover_observability.js.map +1 -0
  31. package/daemon/dist/db/migrations/022_node_codex_config_profile.d.ts +3 -0
  32. package/daemon/dist/db/migrations/022_node_codex_config_profile.d.ts.map +1 -0
  33. package/daemon/dist/db/migrations/022_node_codex_config_profile.js +7 -0
  34. package/daemon/dist/db/migrations/022_node_codex_config_profile.js.map +1 -0
  35. package/daemon/dist/db/migrations/023_stream_items.d.ts +16 -0
  36. package/daemon/dist/db/migrations/023_stream_items.d.ts.map +1 -0
  37. package/daemon/dist/db/migrations/023_stream_items.js +37 -0
  38. package/daemon/dist/db/migrations/023_stream_items.js.map +1 -0
  39. package/daemon/dist/db/migrations/024_queue_items.d.ts +19 -0
  40. package/daemon/dist/db/migrations/024_queue_items.d.ts.map +1 -0
  41. package/daemon/dist/db/migrations/024_queue_items.js +52 -0
  42. package/daemon/dist/db/migrations/024_queue_items.js.map +1 -0
  43. package/daemon/dist/db/migrations/025_queue_transitions.d.ts +13 -0
  44. package/daemon/dist/db/migrations/025_queue_transitions.d.ts.map +1 -0
  45. package/daemon/dist/db/migrations/025_queue_transitions.js +28 -0
  46. package/daemon/dist/db/migrations/025_queue_transitions.js.map +1 -0
  47. package/daemon/dist/db/migrations/026_inbox_entries.d.ts +14 -0
  48. package/daemon/dist/db/migrations/026_inbox_entries.d.ts.map +1 -0
  49. package/daemon/dist/db/migrations/026_inbox_entries.js +35 -0
  50. package/daemon/dist/db/migrations/026_inbox_entries.js.map +1 -0
  51. package/daemon/dist/db/migrations/027_outbox_entries.d.ts +12 -0
  52. package/daemon/dist/db/migrations/027_outbox_entries.d.ts.map +1 -0
  53. package/daemon/dist/db/migrations/027_outbox_entries.js +30 -0
  54. package/daemon/dist/db/migrations/027_outbox_entries.js.map +1 -0
  55. package/daemon/dist/db/migrations/028_project_classifications.d.ts +26 -0
  56. package/daemon/dist/db/migrations/028_project_classifications.d.ts.map +1 -0
  57. package/daemon/dist/db/migrations/028_project_classifications.js +44 -0
  58. package/daemon/dist/db/migrations/028_project_classifications.js.map +1 -0
  59. package/daemon/dist/db/migrations/029_classifier_leases.d.ts +22 -0
  60. package/daemon/dist/db/migrations/029_classifier_leases.d.ts.map +1 -0
  61. package/daemon/dist/db/migrations/029_classifier_leases.js +41 -0
  62. package/daemon/dist/db/migrations/029_classifier_leases.js.map +1 -0
  63. package/daemon/dist/db/migrations/030_views_custom.d.ts +15 -0
  64. package/daemon/dist/db/migrations/030_views_custom.d.ts.map +1 -0
  65. package/daemon/dist/db/migrations/030_views_custom.js +27 -0
  66. package/daemon/dist/db/migrations/030_views_custom.js.map +1 -0
  67. package/daemon/dist/db/migrations/031_watchdog_jobs.d.ts +34 -0
  68. package/daemon/dist/db/migrations/031_watchdog_jobs.d.ts.map +1 -0
  69. package/daemon/dist/db/migrations/031_watchdog_jobs.js +59 -0
  70. package/daemon/dist/db/migrations/031_watchdog_jobs.js.map +1 -0
  71. package/daemon/dist/db/migrations/032_watchdog_history.d.ts +28 -0
  72. package/daemon/dist/db/migrations/032_watchdog_history.d.ts.map +1 -0
  73. package/daemon/dist/db/migrations/032_watchdog_history.js +46 -0
  74. package/daemon/dist/db/migrations/032_watchdog_history.js.map +1 -0
  75. package/daemon/dist/db/migrations/033_workflow_specs.d.ts +30 -0
  76. package/daemon/dist/db/migrations/033_workflow_specs.d.ts.map +1 -0
  77. package/daemon/dist/db/migrations/033_workflow_specs.js +50 -0
  78. package/daemon/dist/db/migrations/033_workflow_specs.js.map +1 -0
  79. package/daemon/dist/db/migrations/034_workflow_instances.d.ts +42 -0
  80. package/daemon/dist/db/migrations/034_workflow_instances.d.ts.map +1 -0
  81. package/daemon/dist/db/migrations/034_workflow_instances.js +63 -0
  82. package/daemon/dist/db/migrations/034_workflow_instances.js.map +1 -0
  83. package/daemon/dist/db/migrations/035_workflow_step_trails.d.ts +29 -0
  84. package/daemon/dist/db/migrations/035_workflow_step_trails.d.ts.map +1 -0
  85. package/daemon/dist/db/migrations/035_workflow_step_trails.js +48 -0
  86. package/daemon/dist/db/migrations/035_workflow_step_trails.js.map +1 -0
  87. package/daemon/dist/db/migrations/036_watchdog_policy_enum_extension.d.ts +35 -0
  88. package/daemon/dist/db/migrations/036_watchdog_policy_enum_extension.d.ts.map +1 -0
  89. package/daemon/dist/db/migrations/036_watchdog_policy_enum_extension.js +43 -0
  90. package/daemon/dist/db/migrations/036_watchdog_policy_enum_extension.js.map +1 -0
  91. package/daemon/dist/db/migrations/037_mission_control_actions.d.ts +51 -0
  92. package/daemon/dist/db/migrations/037_mission_control_actions.d.ts.map +1 -0
  93. package/daemon/dist/db/migrations/037_mission_control_actions.js +74 -0
  94. package/daemon/dist/db/migrations/037_mission_control_actions.js.map +1 -0
  95. package/daemon/dist/db/migrations/038_workspace_primitive.d.ts +16 -0
  96. package/daemon/dist/db/migrations/038_workspace_primitive.d.ts.map +1 -0
  97. package/daemon/dist/db/migrations/038_workspace_primitive.js +20 -0
  98. package/daemon/dist/db/migrations/038_workspace_primitive.js.map +1 -0
  99. package/daemon/dist/db/migrations/039_queue_target_repo.d.ts +16 -0
  100. package/daemon/dist/db/migrations/039_queue_target_repo.d.ts.map +1 -0
  101. package/daemon/dist/db/migrations/039_queue_target_repo.js +21 -0
  102. package/daemon/dist/db/migrations/039_queue_target_repo.js.map +1 -0
  103. package/daemon/dist/domain/active-lens-store.d.ts +23 -0
  104. package/daemon/dist/domain/active-lens-store.d.ts.map +1 -0
  105. package/daemon/dist/domain/active-lens-store.js +87 -0
  106. package/daemon/dist/domain/active-lens-store.js.map +1 -0
  107. package/daemon/dist/domain/agent-activity-store.d.ts +42 -0
  108. package/daemon/dist/domain/agent-activity-store.d.ts.map +1 -0
  109. package/daemon/dist/domain/agent-activity-store.js +177 -0
  110. package/daemon/dist/domain/agent-activity-store.js.map +1 -0
  111. package/daemon/dist/domain/agent-images/agent-image-library-service.d.ts +68 -0
  112. package/daemon/dist/domain/agent-images/agent-image-library-service.d.ts.map +1 -0
  113. package/daemon/dist/domain/agent-images/agent-image-library-service.js +339 -0
  114. package/daemon/dist/domain/agent-images/agent-image-library-service.js.map +1 -0
  115. package/daemon/dist/domain/agent-images/agent-image-types.d.ts +113 -0
  116. package/daemon/dist/domain/agent-images/agent-image-types.d.ts.map +1 -0
  117. package/daemon/dist/domain/agent-images/agent-image-types.js +24 -0
  118. package/daemon/dist/domain/agent-images/agent-image-types.js.map +1 -0
  119. package/daemon/dist/domain/agent-images/evidence-guard.d.ts +26 -0
  120. package/daemon/dist/domain/agent-images/evidence-guard.d.ts.map +1 -0
  121. package/daemon/dist/domain/agent-images/evidence-guard.js +185 -0
  122. package/daemon/dist/domain/agent-images/evidence-guard.js.map +1 -0
  123. package/daemon/dist/domain/agent-images/manifest-parser.d.ts +3 -0
  124. package/daemon/dist/domain/agent-images/manifest-parser.d.ts.map +1 -0
  125. package/daemon/dist/domain/agent-images/manifest-parser.js +114 -0
  126. package/daemon/dist/domain/agent-images/manifest-parser.js.map +1 -0
  127. package/daemon/dist/domain/agent-images/resume-token-discovery.d.ts +28 -0
  128. package/daemon/dist/domain/agent-images/resume-token-discovery.d.ts.map +1 -0
  129. package/daemon/dist/domain/agent-images/resume-token-discovery.js +83 -0
  130. package/daemon/dist/domain/agent-images/resume-token-discovery.js.map +1 -0
  131. package/daemon/dist/domain/agent-images/snapshot-capturer.d.ts +36 -0
  132. package/daemon/dist/domain/agent-images/snapshot-capturer.d.ts.map +1 -0
  133. package/daemon/dist/domain/agent-images/snapshot-capturer.js +58 -0
  134. package/daemon/dist/domain/agent-images/snapshot-capturer.js.map +1 -0
  135. package/daemon/dist/domain/agent-manifest.d.ts.map +1 -1
  136. package/daemon/dist/domain/agent-manifest.js +3 -0
  137. package/daemon/dist/domain/agent-manifest.js.map +1 -1
  138. package/daemon/dist/domain/agent-starter-resolver.d.ts +94 -0
  139. package/daemon/dist/domain/agent-starter-resolver.d.ts.map +1 -0
  140. package/daemon/dist/domain/agent-starter-resolver.js +198 -0
  141. package/daemon/dist/domain/agent-starter-resolver.js.map +1 -0
  142. package/daemon/dist/domain/classifier-lease-manager.d.ts +130 -0
  143. package/daemon/dist/domain/classifier-lease-manager.d.ts.map +1 -0
  144. package/daemon/dist/domain/classifier-lease-manager.js +285 -0
  145. package/daemon/dist/domain/classifier-lease-manager.js.map +1 -0
  146. package/daemon/dist/domain/conflict-detector.d.ts.map +1 -1
  147. package/daemon/dist/domain/conflict-detector.js +6 -3
  148. package/daemon/dist/domain/conflict-detector.js.map +1 -1
  149. package/daemon/dist/domain/context-monitor.d.ts +5 -4
  150. package/daemon/dist/domain/context-monitor.d.ts.map +1 -1
  151. package/daemon/dist/domain/context-monitor.js +26 -11
  152. package/daemon/dist/domain/context-monitor.js.map +1 -1
  153. package/daemon/dist/domain/context-packs/bundle-assembler.d.ts +49 -0
  154. package/daemon/dist/domain/context-packs/bundle-assembler.d.ts.map +1 -0
  155. package/daemon/dist/domain/context-packs/bundle-assembler.js +81 -0
  156. package/daemon/dist/domain/context-packs/bundle-assembler.js.map +1 -0
  157. package/daemon/dist/domain/context-packs/context-pack-library-service.d.ts +41 -0
  158. package/daemon/dist/domain/context-packs/context-pack-library-service.d.ts.map +1 -0
  159. package/daemon/dist/domain/context-packs/context-pack-library-service.js +148 -0
  160. package/daemon/dist/domain/context-packs/context-pack-library-service.js.map +1 -0
  161. package/daemon/dist/domain/context-packs/context-pack-types.d.ts +64 -0
  162. package/daemon/dist/domain/context-packs/context-pack-types.d.ts.map +1 -0
  163. package/daemon/dist/domain/context-packs/context-pack-types.js +22 -0
  164. package/daemon/dist/domain/context-packs/context-pack-types.js.map +1 -0
  165. package/daemon/dist/domain/context-packs/manifest-parser.d.ts +3 -0
  166. package/daemon/dist/domain/context-packs/manifest-parser.d.ts.map +1 -0
  167. package/daemon/dist/domain/context-packs/manifest-parser.js +74 -0
  168. package/daemon/dist/domain/context-packs/manifest-parser.js.map +1 -0
  169. package/daemon/dist/domain/context-usage-store.d.ts +15 -2
  170. package/daemon/dist/domain/context-usage-store.d.ts.map +1 -1
  171. package/daemon/dist/domain/context-usage-store.js +157 -2
  172. package/daemon/dist/domain/context-usage-store.js.map +1 -1
  173. package/daemon/dist/domain/files/file-write-service.d.ts +61 -0
  174. package/daemon/dist/domain/files/file-write-service.d.ts.map +1 -0
  175. package/daemon/dist/domain/files/file-write-service.js +180 -0
  176. package/daemon/dist/domain/files/file-write-service.js.map +1 -0
  177. package/daemon/dist/domain/files/path-safety.d.ts +47 -0
  178. package/daemon/dist/domain/files/path-safety.d.ts.map +1 -0
  179. package/daemon/dist/domain/files/path-safety.js +176 -0
  180. package/daemon/dist/domain/files/path-safety.js.map +1 -0
  181. package/daemon/dist/domain/graph-projection.d.ts +14 -1
  182. package/daemon/dist/domain/graph-projection.d.ts.map +1 -1
  183. package/daemon/dist/domain/graph-projection.js +8 -0
  184. package/daemon/dist/domain/graph-projection.js.map +1 -1
  185. package/daemon/dist/domain/hot-potato-enforcer.d.ts +45 -0
  186. package/daemon/dist/domain/hot-potato-enforcer.d.ts.map +1 -0
  187. package/daemon/dist/domain/hot-potato-enforcer.js +94 -0
  188. package/daemon/dist/domain/hot-potato-enforcer.js.map +1 -0
  189. package/daemon/dist/domain/inbox-handler.d.ts +68 -0
  190. package/daemon/dist/domain/inbox-handler.d.ts.map +1 -0
  191. package/daemon/dist/domain/inbox-handler.js +177 -0
  192. package/daemon/dist/domain/inbox-handler.js.map +1 -0
  193. package/daemon/dist/domain/install-engine.d.ts.map +1 -1
  194. package/daemon/dist/domain/install-engine.js +22 -6
  195. package/daemon/dist/domain/install-engine.js.map +1 -1
  196. package/daemon/dist/domain/install-verifier.d.ts.map +1 -1
  197. package/daemon/dist/domain/install-verifier.js +10 -5
  198. package/daemon/dist/domain/install-verifier.js.map +1 -1
  199. package/daemon/dist/domain/managed-blocks.d.ts.map +1 -1
  200. package/daemon/dist/domain/managed-blocks.js +22 -3
  201. package/daemon/dist/domain/managed-blocks.js.map +1 -1
  202. package/daemon/dist/domain/mission-control/audit-browse.d.ts +26 -0
  203. package/daemon/dist/domain/mission-control/audit-browse.d.ts.map +1 -0
  204. package/daemon/dist/domain/mission-control/audit-browse.js +101 -0
  205. package/daemon/dist/domain/mission-control/audit-browse.js.map +1 -0
  206. package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts +51 -0
  207. package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts.map +1 -0
  208. package/daemon/dist/domain/mission-control/mission-control-action-log.js +124 -0
  209. package/daemon/dist/domain/mission-control/mission-control-action-log.js.map +1 -0
  210. package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.d.ts +131 -0
  211. package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.d.ts.map +1 -0
  212. package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.js +232 -0
  213. package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.js.map +1 -0
  214. package/daemon/dist/domain/mission-control/mission-control-read-layer.d.ts +85 -0
  215. package/daemon/dist/domain/mission-control/mission-control-read-layer.d.ts.map +1 -0
  216. package/daemon/dist/domain/mission-control/mission-control-read-layer.js +265 -0
  217. package/daemon/dist/domain/mission-control/mission-control-read-layer.js.map +1 -0
  218. package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts +69 -0
  219. package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts.map +1 -0
  220. package/daemon/dist/domain/mission-control/mission-control-write-contract.js +300 -0
  221. package/daemon/dist/domain/mission-control/mission-control-write-contract.js.map +1 -0
  222. package/daemon/dist/domain/mission-control/notification-adapter-ntfy.d.ts +18 -0
  223. package/daemon/dist/domain/mission-control/notification-adapter-ntfy.d.ts.map +1 -0
  224. package/daemon/dist/domain/mission-control/notification-adapter-ntfy.js +48 -0
  225. package/daemon/dist/domain/mission-control/notification-adapter-ntfy.js.map +1 -0
  226. package/daemon/dist/domain/mission-control/notification-adapter-types.d.ts +25 -0
  227. package/daemon/dist/domain/mission-control/notification-adapter-types.d.ts.map +1 -0
  228. package/daemon/dist/domain/mission-control/notification-adapter-types.js +7 -0
  229. package/daemon/dist/domain/mission-control/notification-adapter-types.js.map +1 -0
  230. package/daemon/dist/domain/mission-control/notification-adapter-webhook.d.ts +27 -0
  231. package/daemon/dist/domain/mission-control/notification-adapter-webhook.d.ts.map +1 -0
  232. package/daemon/dist/domain/mission-control/notification-adapter-webhook.js +47 -0
  233. package/daemon/dist/domain/mission-control/notification-adapter-webhook.js.map +1 -0
  234. package/daemon/dist/domain/mission-control/notification-dispatcher.d.ts +53 -0
  235. package/daemon/dist/domain/mission-control/notification-dispatcher.d.ts.map +1 -0
  236. package/daemon/dist/domain/mission-control/notification-dispatcher.js +181 -0
  237. package/daemon/dist/domain/mission-control/notification-dispatcher.js.map +1 -0
  238. package/daemon/dist/domain/native-resume-probe.d.ts +1 -1
  239. package/daemon/dist/domain/native-resume-probe.d.ts.map +1 -1
  240. package/daemon/dist/domain/native-resume-probe.js +67 -0
  241. package/daemon/dist/domain/native-resume-probe.js.map +1 -1
  242. package/daemon/dist/domain/node-inventory.d.ts +29 -1
  243. package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  244. package/daemon/dist/domain/node-inventory.js +184 -38
  245. package/daemon/dist/domain/node-inventory.js.map +1 -1
  246. package/daemon/dist/domain/node-launcher.d.ts +2 -0
  247. package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
  248. package/daemon/dist/domain/node-launcher.js +21 -7
  249. package/daemon/dist/domain/node-launcher.js.map +1 -1
  250. package/daemon/dist/domain/outbox-handler.d.ts +48 -0
  251. package/daemon/dist/domain/outbox-handler.d.ts.map +1 -0
  252. package/daemon/dist/domain/outbox-handler.js +106 -0
  253. package/daemon/dist/domain/outbox-handler.js.map +1 -0
  254. package/daemon/dist/domain/policies/artifact-pool-helpers.d.ts +64 -0
  255. package/daemon/dist/domain/policies/artifact-pool-helpers.d.ts.map +1 -0
  256. package/daemon/dist/domain/policies/artifact-pool-helpers.js +226 -0
  257. package/daemon/dist/domain/policies/artifact-pool-helpers.js.map +1 -0
  258. package/daemon/dist/domain/policies/artifact-pool-ready.d.ts +3 -0
  259. package/daemon/dist/domain/policies/artifact-pool-ready.d.ts.map +1 -0
  260. package/daemon/dist/domain/policies/artifact-pool-ready.js +41 -0
  261. package/daemon/dist/domain/policies/artifact-pool-ready.js.map +1 -0
  262. package/daemon/dist/domain/policies/edge-artifact-required.d.ts +3 -0
  263. package/daemon/dist/domain/policies/edge-artifact-required.d.ts.map +1 -0
  264. package/daemon/dist/domain/policies/edge-artifact-required.js +90 -0
  265. package/daemon/dist/domain/policies/edge-artifact-required.js.map +1 -0
  266. package/daemon/dist/domain/policies/periodic-reminder.d.ts +3 -0
  267. package/daemon/dist/domain/policies/periodic-reminder.d.ts.map +1 -0
  268. package/daemon/dist/domain/policies/periodic-reminder.js +30 -0
  269. package/daemon/dist/domain/policies/periodic-reminder.js.map +1 -0
  270. package/daemon/dist/domain/policies/types.d.ts +51 -0
  271. package/daemon/dist/domain/policies/types.d.ts.map +1 -0
  272. package/daemon/dist/domain/policies/types.js +9 -0
  273. package/daemon/dist/domain/policies/types.js.map +1 -0
  274. package/daemon/dist/domain/policies/workflow-keepalive.d.ts +7 -0
  275. package/daemon/dist/domain/policies/workflow-keepalive.d.ts.map +1 -0
  276. package/daemon/dist/domain/policies/workflow-keepalive.js +123 -0
  277. package/daemon/dist/domain/policies/workflow-keepalive.js.map +1 -0
  278. package/daemon/dist/domain/preview/preview-rate-limiter.d.ts +20 -0
  279. package/daemon/dist/domain/preview/preview-rate-limiter.d.ts.map +1 -0
  280. package/daemon/dist/domain/preview/preview-rate-limiter.js +46 -0
  281. package/daemon/dist/domain/preview/preview-rate-limiter.js.map +1 -0
  282. package/daemon/dist/domain/profile-resolver.d.ts +5 -0
  283. package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
  284. package/daemon/dist/domain/profile-resolver.js +62 -8
  285. package/daemon/dist/domain/profile-resolver.js.map +1 -1
  286. package/daemon/dist/domain/progress/progress-indexer.d.ts +73 -0
  287. package/daemon/dist/domain/progress/progress-indexer.d.ts.map +1 -0
  288. package/daemon/dist/domain/progress/progress-indexer.js +210 -0
  289. package/daemon/dist/domain/progress/progress-indexer.js.map +1 -0
  290. package/daemon/dist/domain/project-classifier.d.ts +75 -0
  291. package/daemon/dist/domain/project-classifier.d.ts.map +1 -0
  292. package/daemon/dist/domain/project-classifier.js +132 -0
  293. package/daemon/dist/domain/project-classifier.js.map +1 -0
  294. package/daemon/dist/domain/projection-planner.d.ts +1 -0
  295. package/daemon/dist/domain/projection-planner.d.ts.map +1 -1
  296. package/daemon/dist/domain/projection-planner.js +3 -0
  297. package/daemon/dist/domain/projection-planner.js.map +1 -1
  298. package/daemon/dist/domain/ps-projection.d.ts +31 -0
  299. package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
  300. package/daemon/dist/domain/ps-projection.js +38 -0
  301. package/daemon/dist/domain/ps-projection.js.map +1 -1
  302. package/daemon/dist/domain/queue-repository.d.ts +340 -0
  303. package/daemon/dist/domain/queue-repository.d.ts.map +1 -0
  304. package/daemon/dist/domain/queue-repository.js +744 -0
  305. package/daemon/dist/domain/queue-repository.js.map +1 -0
  306. package/daemon/dist/domain/queue-transition-log.d.ts +38 -0
  307. package/daemon/dist/domain/queue-transition-log.d.ts.map +1 -0
  308. package/daemon/dist/domain/queue-transition-log.js +52 -0
  309. package/daemon/dist/domain/queue-transition-log.js.map +1 -0
  310. package/daemon/dist/domain/rehydrate-eligibility.d.ts +16 -0
  311. package/daemon/dist/domain/rehydrate-eligibility.d.ts.map +1 -0
  312. package/daemon/dist/domain/rehydrate-eligibility.js +43 -0
  313. package/daemon/dist/domain/rehydrate-eligibility.js.map +1 -0
  314. package/daemon/dist/domain/restore-check-service.d.ts +203 -0
  315. package/daemon/dist/domain/restore-check-service.d.ts.map +1 -0
  316. package/daemon/dist/domain/restore-check-service.js +1060 -0
  317. package/daemon/dist/domain/restore-check-service.js.map +1 -0
  318. package/daemon/dist/domain/restore-orchestrator.d.ts +49 -3
  319. package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
  320. package/daemon/dist/domain/restore-orchestrator.js +464 -64
  321. package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
  322. package/daemon/dist/domain/rig-expansion-service.d.ts.map +1 -1
  323. package/daemon/dist/domain/rig-expansion-service.js +13 -0
  324. package/daemon/dist/domain/rig-expansion-service.js.map +1 -1
  325. package/daemon/dist/domain/rig-repository.d.ts +31 -1
  326. package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
  327. package/daemon/dist/domain/rig-repository.js +104 -5
  328. package/daemon/dist/domain/rig-repository.js.map +1 -1
  329. package/daemon/dist/domain/rig-teardown.d.ts.map +1 -1
  330. package/daemon/dist/domain/rig-teardown.js +5 -0
  331. package/daemon/dist/domain/rig-teardown.js.map +1 -1
  332. package/daemon/dist/domain/rigspec-codec.d.ts.map +1 -1
  333. package/daemon/dist/domain/rigspec-codec.js +28 -0
  334. package/daemon/dist/domain/rigspec-codec.js.map +1 -1
  335. package/daemon/dist/domain/rigspec-exporter.d.ts.map +1 -1
  336. package/daemon/dist/domain/rigspec-exporter.js +2 -0
  337. package/daemon/dist/domain/rigspec-exporter.js.map +1 -1
  338. package/daemon/dist/domain/rigspec-instantiator.d.ts +29 -0
  339. package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  340. package/daemon/dist/domain/rigspec-instantiator.js +194 -2
  341. package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  342. package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
  343. package/daemon/dist/domain/rigspec-schema.js +349 -0
  344. package/daemon/dist/domain/rigspec-schema.js.map +1 -1
  345. package/daemon/dist/domain/runtime-adapter.d.ts +38 -2
  346. package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -1
  347. package/daemon/dist/domain/runtime-adapter.js +5 -0
  348. package/daemon/dist/domain/runtime-adapter.js.map +1 -1
  349. package/daemon/dist/domain/seat-handover-planner.d.ts +84 -0
  350. package/daemon/dist/domain/seat-handover-planner.d.ts.map +1 -0
  351. package/daemon/dist/domain/seat-handover-planner.js +188 -0
  352. package/daemon/dist/domain/seat-handover-planner.js.map +1 -0
  353. package/daemon/dist/domain/seat-handover-service.d.ts +104 -0
  354. package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -0
  355. package/daemon/dist/domain/seat-handover-service.js +343 -0
  356. package/daemon/dist/domain/seat-handover-service.js.map +1 -0
  357. package/daemon/dist/domain/seat-status-service.d.ts +50 -0
  358. package/daemon/dist/domain/seat-status-service.d.ts.map +1 -0
  359. package/daemon/dist/domain/seat-status-service.js +66 -0
  360. package/daemon/dist/domain/seat-status-service.js.map +1 -0
  361. package/daemon/dist/domain/session-source-rebuild-resolver.d.ts +53 -0
  362. package/daemon/dist/domain/session-source-rebuild-resolver.d.ts.map +1 -0
  363. package/daemon/dist/domain/session-source-rebuild-resolver.js +59 -0
  364. package/daemon/dist/domain/session-source-rebuild-resolver.js.map +1 -0
  365. package/daemon/dist/domain/session-transport.d.ts +30 -0
  366. package/daemon/dist/domain/session-transport.d.ts.map +1 -1
  367. package/daemon/dist/domain/session-transport.js +322 -12
  368. package/daemon/dist/domain/session-transport.js.map +1 -1
  369. package/daemon/dist/domain/skill-discovery.d.ts +51 -0
  370. package/daemon/dist/domain/skill-discovery.d.ts.map +1 -0
  371. package/daemon/dist/domain/skill-discovery.js +144 -0
  372. package/daemon/dist/domain/skill-discovery.js.map +1 -0
  373. package/daemon/dist/domain/slices/slice-detail-projector.d.ts +182 -0
  374. package/daemon/dist/domain/slices/slice-detail-projector.d.ts.map +1 -0
  375. package/daemon/dist/domain/slices/slice-detail-projector.js +508 -0
  376. package/daemon/dist/domain/slices/slice-detail-projector.js.map +1 -0
  377. package/daemon/dist/domain/slices/slice-indexer.d.ts +118 -0
  378. package/daemon/dist/domain/slices/slice-indexer.d.ts.map +1 -0
  379. package/daemon/dist/domain/slices/slice-indexer.js +503 -0
  380. package/daemon/dist/domain/slices/slice-indexer.js.map +1 -0
  381. package/daemon/dist/domain/snapshot-repository.d.ts +18 -0
  382. package/daemon/dist/domain/snapshot-repository.d.ts.map +1 -1
  383. package/daemon/dist/domain/snapshot-repository.js +77 -0
  384. package/daemon/dist/domain/snapshot-repository.js.map +1 -1
  385. package/daemon/dist/domain/spec-library-service.d.ts +17 -2
  386. package/daemon/dist/domain/spec-library-service.d.ts.map +1 -1
  387. package/daemon/dist/domain/spec-library-service.js +31 -1
  388. package/daemon/dist/domain/spec-library-service.js.map +1 -1
  389. package/daemon/dist/domain/spec-library-workflow-scanner.d.ts +81 -0
  390. package/daemon/dist/domain/spec-library-workflow-scanner.d.ts.map +1 -0
  391. package/daemon/dist/domain/spec-library-workflow-scanner.js +171 -0
  392. package/daemon/dist/domain/spec-library-workflow-scanner.js.map +1 -0
  393. package/daemon/dist/domain/startup-orchestrator.d.ts +22 -3
  394. package/daemon/dist/domain/startup-orchestrator.d.ts.map +1 -1
  395. package/daemon/dist/domain/startup-orchestrator.js +31 -5
  396. package/daemon/dist/domain/startup-orchestrator.js.map +1 -1
  397. package/daemon/dist/domain/startup-validation.d.ts.map +1 -1
  398. package/daemon/dist/domain/startup-validation.js +57 -11
  399. package/daemon/dist/domain/startup-validation.js.map +1 -1
  400. package/daemon/dist/domain/steering/health-summary.d.ts +39 -0
  401. package/daemon/dist/domain/steering/health-summary.d.ts.map +1 -0
  402. package/daemon/dist/domain/steering/health-summary.js +100 -0
  403. package/daemon/dist/domain/steering/health-summary.js.map +1 -0
  404. package/daemon/dist/domain/steering/steering-composer.d.ts +102 -0
  405. package/daemon/dist/domain/steering/steering-composer.d.ts.map +1 -0
  406. package/daemon/dist/domain/steering/steering-composer.js +263 -0
  407. package/daemon/dist/domain/steering/steering-composer.js.map +1 -0
  408. package/daemon/dist/domain/stream-store.d.ts +56 -0
  409. package/daemon/dist/domain/stream-store.d.ts.map +1 -0
  410. package/daemon/dist/domain/stream-store.js +108 -0
  411. package/daemon/dist/domain/stream-store.js.map +1 -0
  412. package/daemon/dist/domain/transcript-capture.d.ts.map +1 -1
  413. package/daemon/dist/domain/transcript-capture.js +7 -4
  414. package/daemon/dist/domain/transcript-capture.js.map +1 -1
  415. package/daemon/dist/domain/transcript-redaction.d.ts +13 -0
  416. package/daemon/dist/domain/transcript-redaction.d.ts.map +1 -0
  417. package/daemon/dist/domain/transcript-redaction.js +34 -0
  418. package/daemon/dist/domain/transcript-redaction.js.map +1 -0
  419. package/daemon/dist/domain/transcript-rotation.d.ts +29 -0
  420. package/daemon/dist/domain/transcript-rotation.d.ts.map +1 -0
  421. package/daemon/dist/domain/transcript-rotation.js +109 -0
  422. package/daemon/dist/domain/transcript-rotation.js.map +1 -0
  423. package/daemon/dist/domain/transcript-store.d.ts +15 -0
  424. package/daemon/dist/domain/transcript-store.d.ts.map +1 -1
  425. package/daemon/dist/domain/transcript-store.js +64 -2
  426. package/daemon/dist/domain/transcript-store.js.map +1 -1
  427. package/daemon/dist/domain/types.d.ts +416 -4
  428. package/daemon/dist/domain/types.d.ts.map +1 -1
  429. package/daemon/dist/domain/types.js +8 -1
  430. package/daemon/dist/domain/types.js.map +1 -1
  431. package/daemon/dist/domain/user-settings/settings-store.d.ts +42 -0
  432. package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -0
  433. package/daemon/dist/domain/user-settings/settings-store.js +364 -0
  434. package/daemon/dist/domain/user-settings/settings-store.js.map +1 -0
  435. package/daemon/dist/domain/view-event-bridge.d.ts +12 -0
  436. package/daemon/dist/domain/view-event-bridge.d.ts.map +1 -0
  437. package/daemon/dist/domain/view-event-bridge.js +91 -0
  438. package/daemon/dist/domain/view-event-bridge.js.map +1 -0
  439. package/daemon/dist/domain/view-projector.d.ts +83 -0
  440. package/daemon/dist/domain/view-projector.d.ts.map +1 -0
  441. package/daemon/dist/domain/view-projector.js +296 -0
  442. package/daemon/dist/domain/view-projector.js.map +1 -0
  443. package/daemon/dist/domain/watchdog-history-log.d.ts +49 -0
  444. package/daemon/dist/domain/watchdog-history-log.d.ts.map +1 -0
  445. package/daemon/dist/domain/watchdog-history-log.js +67 -0
  446. package/daemon/dist/domain/watchdog-history-log.js.map +1 -0
  447. package/daemon/dist/domain/watchdog-jobs-repository.d.ts +81 -0
  448. package/daemon/dist/domain/watchdog-jobs-repository.d.ts.map +1 -0
  449. package/daemon/dist/domain/watchdog-jobs-repository.js +164 -0
  450. package/daemon/dist/domain/watchdog-jobs-repository.js.map +1 -0
  451. package/daemon/dist/domain/watchdog-policy-engine.d.ts +92 -0
  452. package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -0
  453. package/daemon/dist/domain/watchdog-policy-engine.js +442 -0
  454. package/daemon/dist/domain/watchdog-policy-engine.js.map +1 -0
  455. package/daemon/dist/domain/watchdog-scheduler.d.ts +76 -0
  456. package/daemon/dist/domain/watchdog-scheduler.d.ts.map +1 -0
  457. package/daemon/dist/domain/watchdog-scheduler.js +112 -0
  458. package/daemon/dist/domain/watchdog-scheduler.js.map +1 -0
  459. package/daemon/dist/domain/whoami-service.d.ts +29 -0
  460. package/daemon/dist/domain/whoami-service.d.ts.map +1 -1
  461. package/daemon/dist/domain/whoami-service.js +68 -0
  462. package/daemon/dist/domain/whoami-service.js.map +1 -1
  463. package/daemon/dist/domain/workflow/slice-workflow-binding.d.ts +21 -0
  464. package/daemon/dist/domain/workflow/slice-workflow-binding.d.ts.map +1 -0
  465. package/daemon/dist/domain/workflow/slice-workflow-binding.js +103 -0
  466. package/daemon/dist/domain/workflow/slice-workflow-binding.js.map +1 -0
  467. package/daemon/dist/domain/workflow/slice-workflow-projection.d.ts +81 -0
  468. package/daemon/dist/domain/workflow/slice-workflow-projection.d.ts.map +1 -0
  469. package/daemon/dist/domain/workflow/slice-workflow-projection.js +127 -0
  470. package/daemon/dist/domain/workflow/slice-workflow-projection.js.map +1 -0
  471. package/daemon/dist/domain/workflow/starter-spec-loader.d.ts +51 -0
  472. package/daemon/dist/domain/workflow/starter-spec-loader.d.ts.map +1 -0
  473. package/daemon/dist/domain/workflow/starter-spec-loader.js +140 -0
  474. package/daemon/dist/domain/workflow/starter-spec-loader.js.map +1 -0
  475. package/daemon/dist/domain/workflow-instance-store.d.ts +46 -0
  476. package/daemon/dist/domain/workflow-instance-store.d.ts.map +1 -0
  477. package/daemon/dist/domain/workflow-instance-store.js +116 -0
  478. package/daemon/dist/domain/workflow-instance-store.js.map +1 -0
  479. package/daemon/dist/domain/workflow-projector.d.ts +64 -0
  480. package/daemon/dist/domain/workflow-projector.d.ts.map +1 -0
  481. package/daemon/dist/domain/workflow-projector.js +432 -0
  482. package/daemon/dist/domain/workflow-projector.js.map +1 -0
  483. package/daemon/dist/domain/workflow-runtime.d.ts +63 -0
  484. package/daemon/dist/domain/workflow-runtime.d.ts.map +1 -0
  485. package/daemon/dist/domain/workflow-runtime.js +150 -0
  486. package/daemon/dist/domain/workflow-runtime.js.map +1 -0
  487. package/daemon/dist/domain/workflow-spec-cache.d.ts +42 -0
  488. package/daemon/dist/domain/workflow-spec-cache.d.ts.map +1 -0
  489. package/daemon/dist/domain/workflow-spec-cache.js +218 -0
  490. package/daemon/dist/domain/workflow-spec-cache.js.map +1 -0
  491. package/daemon/dist/domain/workflow-step-trail-log.d.ts +27 -0
  492. package/daemon/dist/domain/workflow-step-trail-log.d.ts.map +1 -0
  493. package/daemon/dist/domain/workflow-step-trail-log.js +73 -0
  494. package/daemon/dist/domain/workflow-step-trail-log.js.map +1 -0
  495. package/daemon/dist/domain/workflow-types.d.ts +108 -0
  496. package/daemon/dist/domain/workflow-types.d.ts.map +1 -0
  497. package/daemon/dist/domain/workflow-types.js +11 -0
  498. package/daemon/dist/domain/workflow-types.js.map +1 -0
  499. package/daemon/dist/domain/workflow-validator.d.ts +31 -0
  500. package/daemon/dist/domain/workflow-validator.d.ts.map +1 -0
  501. package/daemon/dist/domain/workflow-validator.js +115 -0
  502. package/daemon/dist/domain/workflow-validator.js.map +1 -0
  503. package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts +6 -0
  504. package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -0
  505. package/daemon/dist/domain/workspace/default-workspace-scaffold.js +207 -0
  506. package/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -0
  507. package/daemon/dist/domain/workspace/frontmatter-validator.d.ts +40 -0
  508. package/daemon/dist/domain/workspace/frontmatter-validator.d.ts.map +1 -0
  509. package/daemon/dist/domain/workspace/frontmatter-validator.js +185 -0
  510. package/daemon/dist/domain/workspace/frontmatter-validator.js.map +1 -0
  511. package/daemon/dist/domain/workspace/workspace-resolver.d.ts +25 -0
  512. package/daemon/dist/domain/workspace/workspace-resolver.d.ts.map +1 -0
  513. package/daemon/dist/domain/workspace/workspace-resolver.js +86 -0
  514. package/daemon/dist/domain/workspace/workspace-resolver.js.map +1 -0
  515. package/daemon/dist/index.d.ts.map +1 -1
  516. package/daemon/dist/index.js +30 -2
  517. package/daemon/dist/index.js.map +1 -1
  518. package/daemon/dist/middleware/auth-bearer-token.d.ts +49 -0
  519. package/daemon/dist/middleware/auth-bearer-token.d.ts.map +1 -0
  520. package/daemon/dist/middleware/auth-bearer-token.js +135 -0
  521. package/daemon/dist/middleware/auth-bearer-token.js.map +1 -0
  522. package/daemon/dist/openrig-compat.d.ts +1 -1
  523. package/daemon/dist/openrig-compat.d.ts.map +1 -1
  524. package/daemon/dist/openrig-compat.js +6 -4
  525. package/daemon/dist/openrig-compat.js.map +1 -1
  526. package/daemon/dist/routes/activity.d.ts +3 -0
  527. package/daemon/dist/routes/activity.d.ts.map +1 -0
  528. package/daemon/dist/routes/activity.js +47 -0
  529. package/daemon/dist/routes/activity.js.map +1 -0
  530. package/daemon/dist/routes/agent-images.d.ts +8 -0
  531. package/daemon/dist/routes/agent-images.d.ts.map +1 -0
  532. package/daemon/dist/routes/agent-images.js +253 -0
  533. package/daemon/dist/routes/agent-images.js.map +1 -0
  534. package/daemon/dist/routes/config.d.ts +3 -0
  535. package/daemon/dist/routes/config.d.ts.map +1 -0
  536. package/daemon/dist/routes/config.js +109 -0
  537. package/daemon/dist/routes/config.js.map +1 -0
  538. package/daemon/dist/routes/context-packs.d.ts +3 -0
  539. package/daemon/dist/routes/context-packs.d.ts.map +1 -0
  540. package/daemon/dist/routes/context-packs.js +129 -0
  541. package/daemon/dist/routes/context-packs.js.map +1 -0
  542. package/daemon/dist/routes/files.d.ts +17 -0
  543. package/daemon/dist/routes/files.d.ts.map +1 -0
  544. package/daemon/dist/routes/files.js +262 -0
  545. package/daemon/dist/routes/files.js.map +1 -0
  546. package/daemon/dist/routes/health-summary.d.ts +9 -0
  547. package/daemon/dist/routes/health-summary.d.ts.map +1 -0
  548. package/daemon/dist/routes/health-summary.js +33 -0
  549. package/daemon/dist/routes/health-summary.js.map +1 -0
  550. package/daemon/dist/routes/mission-control.d.ts +37 -0
  551. package/daemon/dist/routes/mission-control.d.ts.map +1 -0
  552. package/daemon/dist/routes/mission-control.js +283 -0
  553. package/daemon/dist/routes/mission-control.js.map +1 -0
  554. package/daemon/dist/routes/progress.d.ts +7 -0
  555. package/daemon/dist/routes/progress.d.ts.map +1 -0
  556. package/daemon/dist/routes/progress.js +33 -0
  557. package/daemon/dist/routes/progress.js.map +1 -0
  558. package/daemon/dist/routes/projects.d.ts +12 -0
  559. package/daemon/dist/routes/projects.d.ts.map +1 -0
  560. package/daemon/dist/routes/projects.js +178 -0
  561. package/daemon/dist/routes/projects.js.map +1 -0
  562. package/daemon/dist/routes/queue.d.ts +10 -0
  563. package/daemon/dist/routes/queue.d.ts.map +1 -0
  564. package/daemon/dist/routes/queue.js +425 -0
  565. package/daemon/dist/routes/queue.js.map +1 -0
  566. package/daemon/dist/routes/restore-check.d.ts +3 -0
  567. package/daemon/dist/routes/restore-check.d.ts.map +1 -0
  568. package/daemon/dist/routes/restore-check.js +200 -0
  569. package/daemon/dist/routes/restore-check.js.map +1 -0
  570. package/daemon/dist/routes/rigs.d.ts +3 -0
  571. package/daemon/dist/routes/rigs.d.ts.map +1 -1
  572. package/daemon/dist/routes/rigs.js +131 -9
  573. package/daemon/dist/routes/rigs.js.map +1 -1
  574. package/daemon/dist/routes/rigspec.js +6 -3
  575. package/daemon/dist/routes/rigspec.js.map +1 -1
  576. package/daemon/dist/routes/seat.d.ts +3 -0
  577. package/daemon/dist/routes/seat.d.ts.map +1 -0
  578. package/daemon/dist/routes/seat.js +69 -0
  579. package/daemon/dist/routes/seat.js.map +1 -0
  580. package/daemon/dist/routes/sessions.d.ts.map +1 -1
  581. package/daemon/dist/routes/sessions.js +144 -4
  582. package/daemon/dist/routes/sessions.js.map +1 -1
  583. package/daemon/dist/routes/slices.d.ts +9 -0
  584. package/daemon/dist/routes/slices.d.ts.map +1 -0
  585. package/daemon/dist/routes/slices.js +192 -0
  586. package/daemon/dist/routes/slices.js.map +1 -0
  587. package/daemon/dist/routes/snapshots.js +66 -29
  588. package/daemon/dist/routes/snapshots.js.map +1 -1
  589. package/daemon/dist/routes/spec-library.d.ts.map +1 -1
  590. package/daemon/dist/routes/spec-library.js +72 -5
  591. package/daemon/dist/routes/spec-library.js.map +1 -1
  592. package/daemon/dist/routes/steering.d.ts +7 -0
  593. package/daemon/dist/routes/steering.d.ts.map +1 -0
  594. package/daemon/dist/routes/steering.js +27 -0
  595. package/daemon/dist/routes/steering.js.map +1 -0
  596. package/daemon/dist/routes/stream.d.ts +9 -0
  597. package/daemon/dist/routes/stream.d.ts.map +1 -0
  598. package/daemon/dist/routes/stream.js +119 -0
  599. package/daemon/dist/routes/stream.js.map +1 -0
  600. package/daemon/dist/routes/transcripts.d.ts.map +1 -1
  601. package/daemon/dist/routes/transcripts.js +38 -0
  602. package/daemon/dist/routes/transcripts.js.map +1 -1
  603. package/daemon/dist/routes/transport.d.ts.map +1 -1
  604. package/daemon/dist/routes/transport.js +21 -0
  605. package/daemon/dist/routes/transport.js.map +1 -1
  606. package/daemon/dist/routes/up.d.ts.map +1 -1
  607. package/daemon/dist/routes/up.js +43 -4
  608. package/daemon/dist/routes/up.js.map +1 -1
  609. package/daemon/dist/routes/views.d.ts +13 -0
  610. package/daemon/dist/routes/views.d.ts.map +1 -0
  611. package/daemon/dist/routes/views.js +120 -0
  612. package/daemon/dist/routes/views.js.map +1 -0
  613. package/daemon/dist/routes/watchdog.d.ts +18 -0
  614. package/daemon/dist/routes/watchdog.d.ts.map +1 -0
  615. package/daemon/dist/routes/watchdog.js +148 -0
  616. package/daemon/dist/routes/watchdog.js.map +1 -0
  617. package/daemon/dist/routes/whoami.d.ts.map +1 -1
  618. package/daemon/dist/routes/whoami.js +6 -1
  619. package/daemon/dist/routes/whoami.js.map +1 -1
  620. package/daemon/dist/routes/workflow.d.ts +20 -0
  621. package/daemon/dist/routes/workflow.d.ts.map +1 -0
  622. package/daemon/dist/routes/workflow.js +227 -0
  623. package/daemon/dist/routes/workflow.js.map +1 -0
  624. package/daemon/dist/routes/workspace.d.ts +3 -0
  625. package/daemon/dist/routes/workspace.d.ts.map +1 -0
  626. package/daemon/dist/routes/workspace.js +53 -0
  627. package/daemon/dist/routes/workspace.js.map +1 -0
  628. package/daemon/dist/server.d.ts +81 -0
  629. package/daemon/dist/server.d.ts.map +1 -1
  630. package/daemon/dist/server.js +85 -1
  631. package/daemon/dist/server.js.map +1 -1
  632. package/daemon/dist/startup.d.ts +9 -0
  633. package/daemon/dist/startup.d.ts.map +1 -1
  634. package/daemon/dist/startup.js +585 -8
  635. package/daemon/dist/startup.js.map +1 -1
  636. package/daemon/docs/reference/agent-spec.md +19 -12
  637. package/daemon/docs/reference/agent-startup-guide.md +11 -11
  638. package/daemon/docs/reference/project-workspace.md +102 -0
  639. package/daemon/specs/agents/apps/vault-specialist/agent.yaml +2 -2
  640. package/daemon/specs/agents/apps/vault-specialist/guidance/role.md +0 -1
  641. package/daemon/specs/agents/conveyor/builder/agent.yaml +35 -0
  642. package/daemon/specs/agents/conveyor/builder/guidance/role.md +31 -0
  643. package/daemon/specs/agents/conveyor/builder/startup/context.md +9 -0
  644. package/daemon/specs/agents/conveyor/lead/agent.yaml +35 -0
  645. package/daemon/specs/agents/conveyor/lead/guidance/role.md +34 -0
  646. package/daemon/specs/agents/conveyor/lead/startup/context.md +15 -0
  647. package/daemon/specs/agents/conveyor/planner/agent.yaml +35 -0
  648. package/daemon/specs/agents/conveyor/planner/guidance/role.md +29 -0
  649. package/daemon/specs/agents/conveyor/planner/startup/context.md +12 -0
  650. package/daemon/specs/agents/conveyor/reviewer/agent.yaml +35 -0
  651. package/daemon/specs/agents/conveyor/reviewer/guidance/role.md +29 -0
  652. package/daemon/specs/agents/conveyor/reviewer/startup/context.md +10 -0
  653. package/daemon/specs/agents/design/product-designer/agent.yaml +1 -1
  654. package/daemon/specs/agents/development/implementer/agent.yaml +2 -2
  655. package/daemon/specs/agents/development/implementer/guidance/role.md +0 -1
  656. package/daemon/specs/agents/development/qa/agent.yaml +1 -1
  657. package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +2 -2
  658. package/daemon/specs/agents/orchestration/orchestrator/guidance/role.md +2 -3
  659. package/daemon/specs/agents/product-management/pm/agent.yaml +4 -0
  660. package/daemon/specs/agents/research/analyst/agent.yaml +1 -1
  661. package/daemon/specs/agents/research/synthesizer/agent.yaml +1 -1
  662. package/daemon/specs/agents/review/independent-reviewer/agent.yaml +1 -1
  663. package/daemon/specs/agents/shared/agent.yaml +17 -2
  664. package/daemon/specs/agents/shared/runtime/claude-mcp.fragment.json +12 -0
  665. package/daemon/specs/agents/shared/runtime/claude-settings.fragment.json +16 -0
  666. package/daemon/specs/agents/shared/runtime/codex-config.fragment.toml +5 -0
  667. package/daemon/specs/agents/shared/skills/claude-compact-in-place/SKILL.md +100 -0
  668. package/daemon/specs/agents/shared/skills/core/openrig-operator/SKILL.md +110 -0
  669. package/daemon/specs/agents/shared/skills/core/openrig-user/SKILL.md +69 -1
  670. package/daemon/specs/agents/shared/skills/core/openrig-user-settings/SKILL.md +153 -0
  671. package/daemon/specs/agents/shared/skills/pods/orchestration-team/SKILL.md +3 -0
  672. package/daemon/specs/agents/shared/skills/rig-architect/SKILL.md +11 -1
  673. package/daemon/specs/rigs/launch/conveyor/CULTURE.md +34 -0
  674. package/daemon/specs/rigs/launch/conveyor/README.md +33 -0
  675. package/daemon/specs/rigs/launch/conveyor/rig.yaml +72 -0
  676. package/daemon/specs/rigs/preview/product-team/CULTURE.md +2 -2
  677. package/daemon/specs/rigs/preview/product-team/rig.yaml +3 -4
  678. package/dist/bin-wrapper.js +0 -0
  679. package/dist/commands/agent-image.d.ts +4 -0
  680. package/dist/commands/agent-image.d.ts.map +1 -0
  681. package/dist/commands/agent-image.js +352 -0
  682. package/dist/commands/agent-image.js.map +1 -0
  683. package/dist/commands/capture.d.ts +7 -1
  684. package/dist/commands/capture.d.ts.map +1 -1
  685. package/dist/commands/capture.js +59 -1
  686. package/dist/commands/capture.js.map +1 -1
  687. package/dist/commands/compact-plan.d.ts +9 -0
  688. package/dist/commands/compact-plan.d.ts.map +1 -0
  689. package/dist/commands/compact-plan.js +354 -0
  690. package/dist/commands/compact-plan.js.map +1 -0
  691. package/dist/commands/config-init-workspace.d.ts +35 -0
  692. package/dist/commands/config-init-workspace.d.ts.map +1 -0
  693. package/dist/commands/config-init-workspace.js +300 -0
  694. package/dist/commands/config-init-workspace.js.map +1 -0
  695. package/dist/commands/config.d.ts.map +1 -1
  696. package/dist/commands/config.js +78 -18
  697. package/dist/commands/config.js.map +1 -1
  698. package/dist/commands/context-pack.d.ts +4 -0
  699. package/dist/commands/context-pack.d.ts.map +1 -0
  700. package/dist/commands/context-pack.js +357 -0
  701. package/dist/commands/context-pack.js.map +1 -0
  702. package/dist/commands/context.d.ts +9 -0
  703. package/dist/commands/context.d.ts.map +1 -0
  704. package/dist/commands/context.js +220 -0
  705. package/dist/commands/context.js.map +1 -0
  706. package/dist/commands/daemon.d.ts.map +1 -1
  707. package/dist/commands/daemon.js +8 -0
  708. package/dist/commands/daemon.js.map +1 -1
  709. package/dist/commands/expand.d.ts.map +1 -1
  710. package/dist/commands/expand.js +15 -4
  711. package/dist/commands/expand.js.map +1 -1
  712. package/dist/commands/heartbeat.d.ts +99 -0
  713. package/dist/commands/heartbeat.d.ts.map +1 -0
  714. package/dist/commands/heartbeat.js +393 -0
  715. package/dist/commands/heartbeat.js.map +1 -0
  716. package/dist/commands/import.d.ts.map +1 -1
  717. package/dist/commands/import.js +7 -2
  718. package/dist/commands/import.js.map +1 -1
  719. package/dist/commands/project.d.ts +14 -0
  720. package/dist/commands/project.d.ts.map +1 -0
  721. package/dist/commands/project.js +157 -0
  722. package/dist/commands/project.js.map +1 -0
  723. package/dist/commands/ps.d.ts +20 -3
  724. package/dist/commands/ps.d.ts.map +1 -1
  725. package/dist/commands/ps.js +614 -33
  726. package/dist/commands/ps.js.map +1 -1
  727. package/dist/commands/queue.d.ts +16 -0
  728. package/dist/commands/queue.d.ts.map +1 -0
  729. package/dist/commands/queue.js +410 -0
  730. package/dist/commands/queue.js.map +1 -0
  731. package/dist/commands/restore-check.d.ts +9 -0
  732. package/dist/commands/restore-check.d.ts.map +1 -0
  733. package/dist/commands/restore-check.js +234 -0
  734. package/dist/commands/restore-check.js.map +1 -0
  735. package/dist/commands/restore-packet.d.ts +9 -0
  736. package/dist/commands/restore-packet.d.ts.map +1 -0
  737. package/dist/commands/restore-packet.js +383 -0
  738. package/dist/commands/restore-packet.js.map +1 -0
  739. package/dist/commands/restore.d.ts.map +1 -1
  740. package/dist/commands/restore.js +44 -1
  741. package/dist/commands/restore.js.map +1 -1
  742. package/dist/commands/seat.d.ts +5 -0
  743. package/dist/commands/seat.d.ts.map +1 -0
  744. package/dist/commands/seat.js +170 -0
  745. package/dist/commands/seat.js.map +1 -0
  746. package/dist/commands/send.d.ts +19 -1
  747. package/dist/commands/send.d.ts.map +1 -1
  748. package/dist/commands/send.js +116 -5
  749. package/dist/commands/send.js.map +1 -1
  750. package/dist/commands/setup.js +3 -3
  751. package/dist/commands/setup.js.map +1 -1
  752. package/dist/commands/specs.d.ts +4 -2
  753. package/dist/commands/specs.d.ts.map +1 -1
  754. package/dist/commands/specs.js +111 -24
  755. package/dist/commands/specs.js.map +1 -1
  756. package/dist/commands/stream.d.ts +12 -0
  757. package/dist/commands/stream.d.ts.map +1 -0
  758. package/dist/commands/stream.js +111 -0
  759. package/dist/commands/stream.js.map +1 -0
  760. package/dist/commands/up.d.ts.map +1 -1
  761. package/dist/commands/up.js +79 -5
  762. package/dist/commands/up.js.map +1 -1
  763. package/dist/commands/view.d.ts +12 -0
  764. package/dist/commands/view.d.ts.map +1 -0
  765. package/dist/commands/view.js +82 -0
  766. package/dist/commands/view.js.map +1 -0
  767. package/dist/commands/watchdog.d.ts +15 -0
  768. package/dist/commands/watchdog.d.ts.map +1 -0
  769. package/dist/commands/watchdog.js +120 -0
  770. package/dist/commands/watchdog.js.map +1 -0
  771. package/dist/commands/whoami.d.ts +8 -1
  772. package/dist/commands/whoami.d.ts.map +1 -1
  773. package/dist/commands/whoami.js +69 -5
  774. package/dist/commands/whoami.js.map +1 -1
  775. package/dist/commands/workflow.d.ts +17 -0
  776. package/dist/commands/workflow.d.ts.map +1 -0
  777. package/dist/commands/workflow.js +175 -0
  778. package/dist/commands/workflow.js.map +1 -0
  779. package/dist/commands/workspace.d.ts +6 -0
  780. package/dist/commands/workspace.d.ts.map +1 -0
  781. package/dist/commands/workspace.js +83 -0
  782. package/dist/commands/workspace.js.map +1 -0
  783. package/dist/config-store.d.ts +73 -1
  784. package/dist/config-store.d.ts.map +1 -1
  785. package/dist/config-store.js +314 -42
  786. package/dist/config-store.js.map +1 -1
  787. package/dist/cross-host-cli-helpers.d.ts +12 -0
  788. package/dist/cross-host-cli-helpers.d.ts.map +1 -0
  789. package/dist/cross-host-cli-helpers.js +48 -0
  790. package/dist/cross-host-cli-helpers.js.map +1 -0
  791. package/dist/cross-host-executor.d.ts +84 -0
  792. package/dist/cross-host-executor.d.ts.map +1 -0
  793. package/dist/cross-host-executor.js +138 -0
  794. package/dist/cross-host-executor.js.map +1 -0
  795. package/dist/daemon-lifecycle.d.ts +22 -0
  796. package/dist/daemon-lifecycle.d.ts.map +1 -1
  797. package/dist/daemon-lifecycle.js +41 -0
  798. package/dist/daemon-lifecycle.js.map +1 -1
  799. package/dist/host-registry.d.ts +50 -0
  800. package/dist/host-registry.d.ts.map +1 -0
  801. package/dist/host-registry.js +116 -0
  802. package/dist/host-registry.js.map +1 -0
  803. package/dist/index.d.ts +24 -0
  804. package/dist/index.d.ts.map +1 -1
  805. package/dist/index.js +30 -0
  806. package/dist/index.js.map +1 -1
  807. package/dist/mcp-server.d.ts.map +1 -1
  808. package/dist/mcp-server.js +22 -2
  809. package/dist/mcp-server.js.map +1 -1
  810. package/dist/openrig-compat.d.ts +1 -1
  811. package/dist/openrig-compat.d.ts.map +1 -1
  812. package/dist/openrig-compat.js +6 -4
  813. package/dist/openrig-compat.js.map +1 -1
  814. package/dist/restore-packet/claude-transcript-parser.d.ts +12 -0
  815. package/dist/restore-packet/claude-transcript-parser.d.ts.map +1 -0
  816. package/dist/restore-packet/claude-transcript-parser.js +221 -0
  817. package/dist/restore-packet/claude-transcript-parser.js.map +1 -0
  818. package/dist/restore-packet/codex-jsonl-parser.d.ts +11 -0
  819. package/dist/restore-packet/codex-jsonl-parser.d.ts.map +1 -0
  820. package/dist/restore-packet/codex-jsonl-parser.js +159 -0
  821. package/dist/restore-packet/codex-jsonl-parser.js.map +1 -0
  822. package/dist/restore-packet/omitted-records.d.ts +60 -0
  823. package/dist/restore-packet/omitted-records.d.ts.map +1 -0
  824. package/dist/restore-packet/omitted-records.js +116 -0
  825. package/dist/restore-packet/omitted-records.js.map +1 -0
  826. package/dist/restore-packet/packet-writer.d.ts +59 -0
  827. package/dist/restore-packet/packet-writer.d.ts.map +1 -0
  828. package/dist/restore-packet/packet-writer.js +224 -0
  829. package/dist/restore-packet/packet-writer.js.map +1 -0
  830. package/dist/restore-packet/redaction.d.ts +30 -0
  831. package/dist/restore-packet/redaction.d.ts.map +1 -0
  832. package/dist/restore-packet/redaction.js +71 -0
  833. package/dist/restore-packet/redaction.js.map +1 -0
  834. package/dist/restore-packet/runtime-detect.d.ts +19 -0
  835. package/dist/restore-packet/runtime-detect.d.ts.map +1 -0
  836. package/dist/restore-packet/runtime-detect.js +81 -0
  837. package/dist/restore-packet/runtime-detect.js.map +1 -0
  838. package/dist/restore-packet/schema-validator.d.ts +13 -0
  839. package/dist/restore-packet/schema-validator.d.ts.map +1 -0
  840. package/dist/restore-packet/schema-validator.js +245 -0
  841. package/dist/restore-packet/schema-validator.js.map +1 -0
  842. package/dist/restore-packet/types.d.ts +76 -0
  843. package/dist/restore-packet/types.d.ts.map +1 -0
  844. package/dist/restore-packet/types.js +15 -0
  845. package/dist/restore-packet/types.js.map +1 -0
  846. package/dist/schemas/restore-summary.schema.json +98 -0
  847. package/package.json +10 -3
  848. package/scripts/check-abi.mjs +123 -0
  849. package/ui/dist/assets/index-BDHU1JUK.js +412 -0
  850. package/ui/dist/assets/index-DXTyJSqu.css +1 -0
  851. package/ui/dist/graphics/operator-climber-monochrome.png +0 -0
  852. package/ui/dist/index.html +3 -2
  853. package/daemon/specs/agents/shared/skills/mental-model-ha/SKILL.md +0 -953
  854. package/ui/dist/assets/index-B09doO8H.js +0 -139
  855. package/ui/dist/assets/index-Ccd-jwRN.js +0 -225
  856. package/ui/dist/assets/index-DlMH-REm.css +0 -1
@@ -2,40 +2,447 @@ import { Command } from "commander";
2
2
  import { DaemonClient } from "../client.js";
3
3
  import { getDaemonStatus, getDaemonUrl } from "../daemon-lifecycle.js";
4
4
  import { realDeps } from "./daemon.js";
5
+ import { loadHostRegistry, resolveHost } from "../host-registry.js";
6
+ import { runCrossHostCommand } from "../cross-host-executor.js";
7
+ import { emitCrossHostError, emitCrossHostFailure } from "../cross-host-cli-helpers.js";
8
+ // L3-followup: human-output budgets bound default terminal output for hosts
9
+ // with realistic agent counts. `--full` opts out. JSON output remains
10
+ // unbounded by default for back-compat (Decision C hybrid).
11
+ const HUMAN_RIG_BUDGET = 50;
12
+ const HUMAN_NODE_BUDGET = 100;
13
+ // L3-followup: --filter accepts only this allow-list. Unknown keys produce a
14
+ // clear error with the supported list (Guard Review Checklist: filter-parser
15
+ // security).
16
+ //
17
+ // PL-019 item 1: extends the allow-list with the nested key `agentActivity.state`.
18
+ // This is the only nested filter key v0 supports; the parser checks for the
19
+ // dotted form explicitly. Bare `agentActivity` is intentionally NOT a filter
20
+ // key — it's an object, not a scalar; project it via --fields if you need it.
21
+ const ALLOWED_FILTER_KEYS = new Set([
22
+ "status",
23
+ "lifecycleState",
24
+ "name-prefix",
25
+ "name",
26
+ "agentActivity.state",
27
+ // PL-012: context-usage filters. percent is numeric (>=, >, <=, <, =);
28
+ // state is enum (critical / warning / low / unknown — lockstep with
29
+ // computeContextHealthSummary tier vocabulary).
30
+ "contextUsage.percent",
31
+ "contextUsage.state",
32
+ ]);
33
+ // PL-019 item 1: when filter key is `agentActivity.state`, the value is
34
+ // validated against the AgentActivityState enum. Invalid values produce a
35
+ // three-part error (what failed / what's allowed / what to do).
36
+ const ALLOWED_AGENT_ACTIVITY_STATES = new Set(["running", "needs_input", "idle", "unknown"]);
37
+ // PL-012: ALLOWED_CONTEXT_USAGE_STATES — must stay lockstep with the
38
+ // daemon's computeContextHealthSummary urgency vocab.
39
+ const ALLOWED_CONTEXT_USAGE_STATES = new Set(["critical", "warning", "low", "unknown"]);
40
+ const NUMERIC_FILTER_KEYS = new Set(["contextUsage.percent"]);
41
+ const NUMERIC_OPERATORS = [">=", "<=", ">", "<", "="];
42
+ // C9a: --fields accepts a per-level allow-list. Unknown keys produce a clear
43
+ // error with the supported list, mirroring the --filter rejection pattern.
44
+ // Per-level because rig and node entries have different schemas (PsEntry
45
+ // rig-level vs NodeEntry node-level).
46
+ //
47
+ // Source of truth: PsEntry / NodeEntry interfaces above. `name` exists at
48
+ // rig-level only; `rigName` is the alias and exists at both levels (per the
49
+ // closed `rig ps trust and scale-safety` slice at openrig 0a9fb43).
50
+ const ALLOWED_RIG_FIELDS = new Set([
51
+ "rigId",
52
+ "name",
53
+ "rigName",
54
+ "nodeCount",
55
+ "runningCount",
56
+ "status",
57
+ "lifecycleState",
58
+ "uptime",
59
+ "latestSnapshot",
60
+ ]);
61
+ const ALLOWED_NODE_FIELDS = new Set([
62
+ "rigId",
63
+ "rigName",
64
+ "logicalId",
65
+ "podId",
66
+ "podNamespace",
67
+ "canonicalSessionName",
68
+ "nodeKind",
69
+ "runtime",
70
+ "sessionStatus",
71
+ "startupStatus",
72
+ "restoreOutcome",
73
+ "lifecycleState",
74
+ "tmuxAttachCommand",
75
+ "resumeCommand",
76
+ "latestError",
77
+ "agentActivity",
78
+ "contextUsage",
79
+ ]);
80
+ function parseFilter(filter) {
81
+ // PL-012: pre-detect numeric comparators (>=, <=, >, <, =) so callers
82
+ // can write `contextUsage.percent>=80`. Order matters: check >= and
83
+ // <= before > and < so the longer prefix wins.
84
+ let op = "=";
85
+ let opIdx = -1;
86
+ for (const candidate of NUMERIC_OPERATORS) {
87
+ const i = filter.indexOf(candidate);
88
+ if (i !== -1) {
89
+ // Prefer the leftmost match; on tie, prefer the longest comparator.
90
+ if (opIdx === -1 || i < opIdx || (i === opIdx && candidate.length > op.length)) {
91
+ opIdx = i;
92
+ op = candidate;
93
+ }
94
+ }
95
+ }
96
+ if (opIdx === -1) {
97
+ return { error: `--filter must be key<op>value (op = ${NUMERIC_OPERATORS.join(", ")}); got: '${filter}'` };
98
+ }
99
+ const key = filter.slice(0, opIdx);
100
+ const value = filter.slice(opIdx + op.length);
101
+ if (!ALLOWED_FILTER_KEYS.has(key)) {
102
+ return {
103
+ error: `Unknown --filter key '${key}'. Supported: ${[...ALLOWED_FILTER_KEYS].sort().join(", ")}`,
104
+ };
105
+ }
106
+ if (!value) {
107
+ return { error: `--filter value is empty for key '${key}'` };
108
+ }
109
+ // PL-012: numeric-keyed filters validate the value parses as a finite
110
+ // number. Three-part error per the existing convention.
111
+ if (NUMERIC_FILTER_KEYS.has(key)) {
112
+ const numericValue = Number(value);
113
+ if (!Number.isFinite(numericValue)) {
114
+ return {
115
+ error: `--filter ${key}${op}'${value}' is not a numeric value. ` +
116
+ `Allowed: a finite number (e.g., ${key}>=80). ` +
117
+ `Use 'rig ps --nodes --fields contextUsage --json' to see what daemon is reporting.`,
118
+ };
119
+ }
120
+ return { key, value, op, numericValue };
121
+ }
122
+ // PL-012: contextUsage.state enum guard — same shape as agentActivity.state.
123
+ if (key === "contextUsage.state" && !ALLOWED_CONTEXT_USAGE_STATES.has(value)) {
124
+ return {
125
+ error: `--filter contextUsage.state='${value}' is not a valid context state. ` +
126
+ `Allowed: ${[...ALLOWED_CONTEXT_USAGE_STATES].sort().join(", ")}. ` +
127
+ `Use 'rig ps --nodes --fields contextUsage --json' to see what daemon is reporting.`,
128
+ };
129
+ }
130
+ // PL-019 item 1: agentActivity.state is enum-valued; reject invalid values
131
+ // up-front so operators don't get a silent empty result on a typo. Three-part
132
+ // shape per `feedback_smart_agents_no_bureaucracy.md`: what failed / what's
133
+ // allowed / what to do.
134
+ if (key === "agentActivity.state" && !ALLOWED_AGENT_ACTIVITY_STATES.has(value)) {
135
+ return {
136
+ error: `--filter agentActivity.state='${value}' is not a valid activity state. ` +
137
+ `Allowed: ${[...ALLOWED_AGENT_ACTIVITY_STATES].sort().join(", ")}. ` +
138
+ `Use 'rig ps --nodes --fields agentActivity --json' to see what daemon is reporting.`,
139
+ };
140
+ }
141
+ // Non-numeric keys must use op = "=".
142
+ if (op !== "=") {
143
+ return {
144
+ error: `--filter ${key}${op}... uses a numeric comparator on a non-numeric key. ` +
145
+ `Allowed numeric keys: ${[...NUMERIC_FILTER_KEYS].sort().join(", ")}. ` +
146
+ `Use ${key}=<value> for equality.`,
147
+ };
148
+ }
149
+ return { key, value, op };
150
+ }
151
+ // PL-012: derive a context-usage tier from a numeric percent. Lockstep
152
+ // with daemon-side computeContextHealthSummary thresholds.
153
+ function deriveContextUsageState(percent) {
154
+ if (typeof percent !== "number")
155
+ return "unknown";
156
+ if (percent >= 80)
157
+ return "critical";
158
+ if (percent >= 60)
159
+ return "warning";
160
+ return "low";
161
+ }
162
+ // C9a: validate --fields against a per-level allow-list. Mirrors parseFilter's
163
+ // shape: rejects with a sorted-supported-list error message including the
164
+ // unknown key(s) quoted. The level-aware "Hint" fires when an operator types
165
+ // `--fields name` against a node query (the most likely confusion case
166
+ // preserved by the rigName/name aliasing at rig-level only).
167
+ function parseFields(input, allowed, level) {
168
+ const fields = input.split(",").map((f) => f.trim()).filter((f) => f.length > 0);
169
+ if (fields.length === 0) {
170
+ return { error: `--fields cannot be empty` };
171
+ }
172
+ const unknown = fields.filter((f) => !allowed.has(f));
173
+ if (unknown.length > 0) {
174
+ const sorted = [...allowed].sort().join(", ");
175
+ const hint = level === "nodes" && unknown.includes("name")
176
+ ? ` Hint: 'name' is a rig-level field; use 'rigName' for node entries.`
177
+ : "";
178
+ const keyWord = unknown.length > 1 ? "keys" : "key";
179
+ return {
180
+ error: `Unknown --fields ${keyWord} ${unknown.map((u) => `'${u}'`).join(", ")}. Supported: ${sorted}.${hint}`,
181
+ };
182
+ }
183
+ return fields;
184
+ }
185
+ function applyRigFilter(entries, filter) {
186
+ return entries.filter((e) => {
187
+ if (filter.key === "status")
188
+ return e.status === filter.value;
189
+ if (filter.key === "lifecycleState")
190
+ return e.lifecycleState === filter.value;
191
+ if (filter.key === "name-prefix")
192
+ return (e.rigName ?? e.name).startsWith(filter.value);
193
+ if (filter.key === "name")
194
+ return (e.rigName ?? e.name) === filter.value;
195
+ // PL-019 item 1: agentActivity.state is node-level only; at the rig
196
+ // level it has no meaning, so the filter passes everything through and
197
+ // the user gets all rigs (the operator can `--nodes` to scope it).
198
+ if (filter.key === "agentActivity.state")
199
+ return true;
200
+ // PL-012: contextUsage.* filters are node-level only.
201
+ if (filter.key === "contextUsage.percent" || filter.key === "contextUsage.state")
202
+ return true;
203
+ return true;
204
+ });
205
+ }
206
+ function applyNodeFilter(entries, filter) {
207
+ return entries.filter((n) => {
208
+ // status maps to sessionStatus for nodes; lifecycleState applies directly.
209
+ if (filter.key === "status")
210
+ return n.sessionStatus === filter.value;
211
+ if (filter.key === "lifecycleState")
212
+ return n.lifecycleState === filter.value;
213
+ if (filter.key === "name-prefix")
214
+ return n.rigName.startsWith(filter.value);
215
+ if (filter.key === "name")
216
+ return n.rigName === filter.value;
217
+ // PL-019 item 1: nested-key traversal for agentActivity.state. Nodes
218
+ // without an agentActivity attachment never match a non-unknown filter
219
+ // value (the daemon reports `unknown` when it has no signal — explicit).
220
+ if (filter.key === "agentActivity.state")
221
+ return n.agentActivity?.state === filter.value;
222
+ // PL-012: contextUsage.percent — numeric comparison. Nodes with no
223
+ // sample fail every comparator (operator can filter on
224
+ // contextUsage.state=unknown to find them).
225
+ if (filter.key === "contextUsage.percent") {
226
+ const pct = n.contextUsage?.usedPercentage;
227
+ if (typeof pct !== "number" || filter.numericValue === undefined)
228
+ return false;
229
+ switch (filter.op) {
230
+ case ">=": return pct >= filter.numericValue;
231
+ case ">": return pct > filter.numericValue;
232
+ case "<=": return pct <= filter.numericValue;
233
+ case "<": return pct < filter.numericValue;
234
+ case "=": return pct === filter.numericValue;
235
+ }
236
+ }
237
+ if (filter.key === "contextUsage.state") {
238
+ const derived = n.contextUsage?.state ?? deriveContextUsageState(n.contextUsage?.usedPercentage ?? null);
239
+ return derived === filter.value;
240
+ }
241
+ return true;
242
+ });
243
+ }
244
+ function selectFields(entries, fields) {
245
+ return entries.map((e) => {
246
+ const out = {};
247
+ for (const f of fields)
248
+ out[f] = e[f];
249
+ return out;
250
+ });
251
+ }
252
+ function summarizeRigs(entries) {
253
+ const byLifecycle = {};
254
+ const byStatus = {};
255
+ let totalRunning = 0;
256
+ for (const e of entries) {
257
+ const ls = e.lifecycleState ?? "unknown";
258
+ byLifecycle[ls] = (byLifecycle[ls] ?? 0) + 1;
259
+ byStatus[e.status] = (byStatus[e.status] ?? 0) + 1;
260
+ if (e.status === "running")
261
+ totalRunning++;
262
+ }
263
+ return { totalRigs: entries.length, totalRunning, byLifecycle, byStatus };
264
+ }
265
+ function summarizeNodes(entries) {
266
+ const byLifecycle = {};
267
+ const bySessionStatus = {};
268
+ for (const n of entries) {
269
+ const ls = n.lifecycleState ?? "unknown";
270
+ byLifecycle[ls] = (byLifecycle[ls] ?? 0) + 1;
271
+ const ss = n.sessionStatus ?? "unknown";
272
+ bySessionStatus[ss] = (bySessionStatus[ss] ?? 0) + 1;
273
+ }
274
+ return { totalNodes: entries.length, byLifecycle, bySessionStatus };
275
+ }
276
+ // Compact rig-level lifecycle codes for the rig table header (3-char fixed width).
277
+ function abbrevRigLifecycle(state) {
278
+ if (!state)
279
+ return "—";
280
+ if (state === "running")
281
+ return "run";
282
+ if (state === "recoverable")
283
+ return "rec";
284
+ if (state === "stopped")
285
+ return "stp";
286
+ if (state === "degraded")
287
+ return "deg";
288
+ if (state === "attention_required")
289
+ return "att";
290
+ return "—";
291
+ }
292
+ // Compact per-node lifecycle codes for the nodes table.
293
+ function abbrevNodeLifecycle(state) {
294
+ if (!state)
295
+ return "—";
296
+ if (state === "running")
297
+ return "run";
298
+ if (state === "recoverable")
299
+ return "rec";
300
+ if (state === "detached")
301
+ return "det";
302
+ if (state === "attention_required")
303
+ return "att";
304
+ return "—";
305
+ }
5
306
  /**
6
307
  * `rig ps` — list running rigs and optionally their nodes.
7
- * @param depsOverride - injectable deps for testing
8
- * @returns Commander command
308
+ *
309
+ * L3-followup adds CLI-side shaping flags (`--limit`, `--fields`, `--summary`,
310
+ * `--filter`, `--full`) for context-window-safe output on large hosts. Default
311
+ * `rig ps` (human) truncates to ~50 rigs with an explicit footer naming totals
312
+ * and the `--full` opt-out. Default `rig ps --json` keeps the bare-array shape
313
+ * for back-compat; the truncation/envelope shape only applies when at least
314
+ * one of `--limit`/`--summary`/`--fields`/`--filter` is specified.
9
315
  */
10
316
  export function psCommand(depsOverride) {
11
317
  const cmd = new Command("ps")
12
318
  .description("List rigs and their status")
13
319
  .addHelpText("after", `
14
320
  Examples:
15
- rig ps Show all rigs with status
16
- rig ps --json JSON output for piping/parsing
17
- rig ps --nodes Show per-node detail for all rigs
18
- rig ps --nodes --json Node inventory as JSON array
321
+ rig ps Show all rigs (human; truncated to ${HUMAN_RIG_BUDGET} with footer)
322
+ rig ps --full Disable human truncation
323
+ rig ps --json JSON output (bare array; back-compat)
324
+ rig ps --json --limit 20 Bounded JSON envelope
325
+ rig ps --json --summary Aggregate-only JSON (no per-rig entries)
326
+ rig ps --json --fields rigName,status,lifecycleState
327
+ Project JSON to named fields
328
+ rig ps --filter lifecycleState=attention_required
329
+ Show only rigs needing attention
330
+ rig ps --filter status=running Show only running rigs
331
+ rig ps --filter name-prefix=demo Filter by rig-name prefix
332
+ rig ps --nodes Per-node detail (human; truncated to ${HUMAN_NODE_BUDGET})
333
+ rig ps --nodes --json --limit 50 Bounded per-node JSON envelope
334
+ rig ps --nodes --active Show only nodes whose agentActivity.state == running (PL-019)
335
+ rig ps --nodes --filter agentActivity.state=running
336
+ Same as --active (the explicit form)
337
+ rig ps --host vm-claude-test --nodes --json Run on a remote host via single-hop ssh
338
+
339
+ JSON output entries include both \`name\` and \`rigName\` (alias) for forward
340
+ compatibility; agent code should prefer \`rigName\` (matches per-node JSON).
341
+
342
+ --filter accepts: status, lifecycleState, name-prefix, name, agentActivity.state.
343
+ Other keys are rejected. agentActivity.state is node-level (use with --nodes);
344
+ allowed values: running, needs_input, idle, unknown.
345
+
346
+ --fields accepts (rig-level): rigId, name, rigName, nodeCount, runningCount,
347
+ status, lifecycleState, uptime, latestSnapshot.
348
+ --fields accepts (node-level, with --nodes): rigId, rigName, logicalId, podId,
349
+ podNamespace, canonicalSessionName, nodeKind, runtime, sessionStatus,
350
+ startupStatus, restoreOutcome, lifecycleState, tmuxAttachCommand,
351
+ resumeCommand, latestError, agentActivity. Other keys are rejected.
352
+ \`name\` is rig-level only; for node entries use \`rigName\`. Nested-field
353
+ projection (e.g. \`agentActivity.state\`) is not supported in this slice; pass
354
+ \`agentActivity\` to project the whole object and read the nested value
355
+ downstream.
356
+
357
+ --host runs the same command on a remote host declared in ~/.openrig/hosts.yaml
358
+ via single-hop ssh (CLI-side shell-out; daemon untouched). The remote rig's
359
+ output is what counts and is surfaced verbatim on success; failure is
360
+ distinguished into ssh-unreachable / permission-gate / remote-daemon-unreachable
361
+ / remote-command-failed.
19
362
 
20
363
  Exit codes:
21
364
  0 Success
22
- 1 Daemon not running
365
+ 1 Daemon not running, or invalid --filter / --limit / --fields
23
366
  2 Failed to fetch data from daemon`);
24
367
  const getDepsF = () => depsOverride ?? { lifecycleDeps: realDeps(), clientFactory: (url) => new DaemonClient(url) };
25
368
  cmd
26
369
  .option("--json", "JSON output for agents")
27
370
  .option("--nodes", "Show per-node detail for all rigs")
371
+ .option("--full", "Disable default human-output truncation")
372
+ .option("--limit <n>", "Limit number of entries (rigs or nodes)")
373
+ .option("--fields <list>", "Comma-separated field list to project (JSON only)")
374
+ .option("--summary", "Emit aggregate-only output (counts by status/lifecycle)")
375
+ .option("--filter <key=value>", "Filter entries; supported keys: status, lifecycleState, name-prefix, name, agentActivity.state")
376
+ .option("--active", "Shortcut for --filter agentActivity.state=running (PL-019)")
377
+ .option("--host <id>", "Run on a remote host declared in ~/.openrig/hosts.yaml (CLI-side ssh shell-out)")
28
378
  .action(async (opts) => {
29
379
  const deps = getDepsF();
380
+ // --- Cross-host short-circuit (CLI-side ssh shell-out; daemon untouched) ---
381
+ if (opts.host) {
382
+ await runCrossHostPs(opts.host, opts, deps);
383
+ return;
384
+ }
30
385
  const status = await getDaemonStatus(deps.lifecycleDeps);
31
386
  if (status.state !== "running" || status.healthy === false) {
32
387
  console.error("Daemon not running. Start it with: rig daemon start");
33
388
  process.exitCode = 1;
34
389
  return;
35
390
  }
391
+ // Parse filter once up front so unknown keys/malformed filters surface
392
+ // as exit-1 errors before any HTTP call.
393
+ //
394
+ // PL-019 item 1: --active is sugar for --filter agentActivity.state=running.
395
+ // Combining --active with --filter is rejected (composition is
396
+ // ambiguous — pick one explicit form). Parity is verified end-to-end
397
+ // by the focused test: `--active` and the explicit filter must yield
398
+ // identical output on the same fixture.
399
+ let effectiveFilter = opts.filter;
400
+ if (opts.active) {
401
+ if (effectiveFilter) {
402
+ console.error(`--active and --filter cannot be combined. ` +
403
+ `--active is sugar for --filter agentActivity.state=running. ` +
404
+ `Pick one form, or compose by upgrading to --filter directly.`);
405
+ process.exitCode = 1;
406
+ return;
407
+ }
408
+ effectiveFilter = "agentActivity.state=running";
409
+ }
410
+ let parsedFilter = null;
411
+ if (effectiveFilter) {
412
+ const result = parseFilter(effectiveFilter);
413
+ if ("error" in result) {
414
+ console.error(result.error);
415
+ process.exitCode = 1;
416
+ return;
417
+ }
418
+ parsedFilter = result;
419
+ }
420
+ const limit = opts.limit !== undefined ? Number(opts.limit) : null;
421
+ if (limit !== null && (!Number.isInteger(limit) || limit < 0)) {
422
+ console.error(`--limit must be a non-negative integer; got '${opts.limit}'`);
423
+ process.exitCode = 1;
424
+ return;
425
+ }
426
+ // C9a: validate --fields against the per-level allow-list before any HTTP
427
+ // call, mirroring the --filter validation above. Level is determined by
428
+ // --nodes; both branches downstream use the same `fields` variable, so
429
+ // one up-front validation covers both paths.
430
+ let fields = null;
431
+ if (opts.fields !== undefined) {
432
+ const fieldsLevel = opts.nodes ? "nodes" : "rig";
433
+ const fieldsAllowed = fieldsLevel === "nodes" ? ALLOWED_NODE_FIELDS : ALLOWED_RIG_FIELDS;
434
+ const fieldsResult = parseFields(opts.fields, fieldsAllowed, fieldsLevel);
435
+ if ("error" in fieldsResult) {
436
+ console.error(fieldsResult.error);
437
+ process.exitCode = 1;
438
+ return;
439
+ }
440
+ fields = fieldsResult;
441
+ }
442
+ const useEnvelope = parsedFilter !== null || limit !== null || fields !== null || opts.summary === true;
36
443
  const client = deps.clientFactory(getDaemonUrl(status));
37
444
  if (opts.nodes) {
38
- await handleNodes(client, opts.json ?? false);
445
+ await handleNodes(client, opts, parsedFilter, limit, fields, useEnvelope);
39
446
  return;
40
447
  }
41
448
  const res = await client.get("/api/ps");
@@ -44,26 +451,75 @@ Exit codes:
44
451
  process.exitCode = 2;
45
452
  return;
46
453
  }
47
- const entries = res.data;
454
+ const all = res.data;
455
+ // Apply CLI-side filter (Amendment A: prefer CLI shaping).
456
+ const filtered = parsedFilter ? applyRigFilter(all, parsedFilter) : all;
457
+ // Summary mode short-circuits per-entry output.
458
+ if (opts.summary) {
459
+ const summary = summarizeRigs(filtered);
460
+ if (opts.json) {
461
+ console.log(JSON.stringify(summary));
462
+ }
463
+ else {
464
+ console.log(`totalRigs: ${summary.totalRigs}`);
465
+ console.log(`totalRunning: ${summary.totalRunning}`);
466
+ console.log(`byStatus: ${JSON.stringify(summary.byStatus)}`);
467
+ console.log(`byLifecycle: ${JSON.stringify(summary.byLifecycle)}`);
468
+ }
469
+ return;
470
+ }
471
+ // Apply --limit on top of filter (CLI side; daemon stays bare-array).
472
+ const limited = limit !== null ? filtered.slice(0, limit) : filtered;
473
+ const truncated = limit !== null && filtered.length > limit;
474
+ // Field projection runs last so requested fields apply to the limited set.
475
+ const projected = fields ? selectFields(limited, fields) : limited;
48
476
  if (opts.json) {
49
- console.log(JSON.stringify(entries));
477
+ if (useEnvelope) {
478
+ // Envelope only on flag use; default JSON stays a bare array for compat.
479
+ const envelope = {
480
+ entries: projected,
481
+ totalRigs: filtered.length,
482
+ truncated,
483
+ };
484
+ if (truncated)
485
+ envelope.hint = "rig ps --full --json";
486
+ console.log(JSON.stringify(envelope));
487
+ }
488
+ else {
489
+ console.log(JSON.stringify(projected));
490
+ }
50
491
  return;
51
492
  }
52
- if (entries.length === 0) {
53
- console.log("No rigs");
493
+ if (limited.length === 0) {
494
+ if (parsedFilter) {
495
+ console.log(`No rigs match --filter ${parsedFilter.key}=${parsedFilter.value}`);
496
+ }
497
+ else {
498
+ console.log("No rigs");
499
+ }
54
500
  return;
55
501
  }
56
- // Formatted table
57
- const header = padRigRow("RIG", "NODES", "RUNNING", "STATUS", "UPTIME", "SNAPSHOT");
502
+ // Human output: apply default truncation budget unless --full.
503
+ const humanList = (opts.full || limit !== null) ? limited : limited.slice(0, HUMAN_RIG_BUDGET);
504
+ const humanTruncated = !opts.full && limit === null && filtered.length > HUMAN_RIG_BUDGET;
505
+ const header = padRigRow("RIG", "NODES", "RUNNING", "STATUS", "LIFECYCLE", "UPTIME", "SNAPSHOT");
58
506
  console.log(header);
59
- for (const e of entries) {
60
- console.log(padRigRow(e.name, String(e.nodeCount), String(e.runningCount), e.status, e.uptime ?? "—", e.latestSnapshot ?? "—"));
507
+ for (const e of humanList) {
508
+ console.log(padRigRow(e.rigName ?? e.name, String(e.nodeCount), String(e.runningCount), e.status, abbrevRigLifecycle(e.lifecycleState), e.uptime ?? "—", e.latestSnapshot ?? "—"));
509
+ }
510
+ if (humanTruncated) {
511
+ const remaining = filtered.length - HUMAN_RIG_BUDGET;
512
+ console.log(`... and ${remaining} more rig${remaining === 1 ? "" : "s"} (truncated at ${HUMAN_RIG_BUDGET}).`);
513
+ console.log("Run 'rig ps --full' to see all, or 'rig ps --filter lifecycleState=attention_required' to narrow.");
514
+ }
515
+ else if (truncated) {
516
+ const remaining = filtered.length - (limit ?? 0);
517
+ console.log(`... and ${remaining} more rig${remaining === 1 ? "" : "s"} (--limit ${limit}).`);
61
518
  }
62
519
  });
63
520
  return cmd;
64
521
  }
65
- async function handleNodes(client, json) {
66
- // Fetch rig list first
522
+ async function handleNodes(client, opts, parsedFilter, limit, fields, useEnvelope) {
67
523
  const rigRes = await client.get("/api/ps");
68
524
  if (rigRes.status >= 400) {
69
525
  console.error(`Failed to fetch rig list from daemon (HTTP ${rigRes.status}). Check daemon status with: rig status`);
@@ -74,56 +530,181 @@ async function handleNodes(client, json) {
74
530
  for (const rig of rigRes.data) {
75
531
  const nodesRes = await client.get(`/api/rigs/${encodeURIComponent(rig.rigId)}/nodes`);
76
532
  if (nodesRes.status >= 400) {
77
- console.error(`Warning: failed to fetch nodes for rig "${rig.name}" (HTTP ${nodesRes.status}). List rigs with: rig ps`);
533
+ console.error(`Warning: failed to fetch nodes for rig "${rig.rigName ?? rig.name}" (HTTP ${nodesRes.status}). List rigs with: rig ps`);
78
534
  continue;
79
535
  }
80
536
  allNodes.push(...nodesRes.data);
81
537
  }
82
- if (json) {
83
- console.log(JSON.stringify(allNodes));
538
+ const filtered = parsedFilter ? applyNodeFilter(allNodes, parsedFilter) : allNodes;
539
+ if (opts.summary) {
540
+ const summary = summarizeNodes(filtered);
541
+ if (opts.json) {
542
+ console.log(JSON.stringify(summary));
543
+ }
544
+ else {
545
+ console.log(`totalNodes: ${summary.totalNodes}`);
546
+ console.log(`bySessionStatus: ${JSON.stringify(summary.bySessionStatus)}`);
547
+ console.log(`byLifecycle: ${JSON.stringify(summary.byLifecycle)}`);
548
+ }
84
549
  return;
85
550
  }
86
- if (allNodes.length === 0) {
87
- console.log("No nodes");
551
+ const limited = limit !== null ? filtered.slice(0, limit) : filtered;
552
+ const limitTruncated = limit !== null && filtered.length > limit;
553
+ const projected = fields ? selectFields(limited, fields) : limited;
554
+ if (opts.json) {
555
+ if (useEnvelope) {
556
+ const envelope = {
557
+ entries: projected,
558
+ totalNodes: filtered.length,
559
+ truncated: limitTruncated,
560
+ };
561
+ if (limitTruncated)
562
+ envelope.hint = "rig ps --nodes --full --json";
563
+ console.log(JSON.stringify(envelope));
564
+ }
565
+ else {
566
+ console.log(JSON.stringify(projected));
567
+ }
88
568
  return;
89
569
  }
90
- const header = padNodeRow("RIG", "POD", "MEMBER", "SESSION", "RUNTIME", "STATUS", "STARTUP", "RESTORE", "ERROR");
570
+ if (limited.length === 0) {
571
+ if (parsedFilter) {
572
+ console.log(`No nodes match --filter ${parsedFilter.key}=${parsedFilter.value}`);
573
+ }
574
+ else {
575
+ console.log("No nodes");
576
+ }
577
+ return;
578
+ }
579
+ const humanList = (opts.full || limit !== null) ? limited : limited.slice(0, HUMAN_NODE_BUDGET);
580
+ const humanTruncated = !opts.full && limit === null && filtered.length > HUMAN_NODE_BUDGET;
581
+ const header = padNodeRow("RIG", "POD", "MEMBER", "SESSION", "RUNTIME", "STATUS", "STARTUP", "LIFECYCLE", "ACTIVITY", "CTX", "RESTORE", "ERROR");
91
582
  console.log(header);
92
- for (const n of allNodes) {
583
+ for (const n of humanList) {
93
584
  const parts = n.logicalId.split(".");
94
585
  const pod = n.podNamespace ?? (parts.length > 1 ? parts[0] : "—");
95
586
  const member = parts.length > 1 ? parts.slice(1).join(".") : n.logicalId;
96
587
  const rig = `${n.rigName}#${n.rigId}`;
97
- console.log(padNodeRow(rig, pod, member, n.canonicalSessionName ?? "—", n.runtime ?? "—", n.sessionStatus ?? "—", n.startupStatus ?? "—", n.restoreOutcome, n.latestError ? truncate(n.latestError, 30) : "—"));
588
+ console.log(padNodeRow(rig, pod, member, n.canonicalSessionName ?? "—", n.runtime ?? "—", n.sessionStatus ?? "—", n.startupStatus ?? "—", abbrevNodeLifecycle(n.lifecycleState), formatActivity(n.agentActivity), formatContextUsage(n.contextUsage), n.restoreOutcome, n.latestError ? truncate(n.latestError, 30) : "—"));
589
+ }
590
+ if (humanTruncated) {
591
+ const remaining = filtered.length - HUMAN_NODE_BUDGET;
592
+ console.log(`... and ${remaining} more node${remaining === 1 ? "" : "s"} (truncated at ${HUMAN_NODE_BUDGET}).`);
593
+ console.log("Run 'rig ps --nodes --full' to see all, or '--filter lifecycleState=attention_required' to narrow.");
594
+ }
595
+ else if (limitTruncated) {
596
+ const remaining = filtered.length - (limit ?? 0);
597
+ console.log(`... and ${remaining} more node${remaining === 1 ? "" : "s"} (--limit ${limit}).`);
98
598
  }
99
599
  }
600
+ function formatActivity(activity) {
601
+ if (!activity)
602
+ return "unknown";
603
+ if (activity.state === "running")
604
+ return "running";
605
+ if (activity.state === "needs_input")
606
+ return "needs_input";
607
+ if (activity.state === "idle")
608
+ return "idle";
609
+ return "unknown";
610
+ }
100
611
  function truncate(s, max) {
101
612
  return s.length > max ? s.slice(0, max - 1) + "…" : s;
102
613
  }
103
614
  function fitCell(value, width) {
104
615
  return truncate(value, width).padEnd(width);
105
616
  }
106
- function padRigRow(rig, nodes, running, status, uptime, snapshot) {
617
+ function padRigRow(rig, nodes, running, status, lifecycle, uptime, snapshot) {
107
618
  return [
108
619
  fitCell(rig, 24),
109
620
  fitCell(nodes, 7),
110
621
  fitCell(running, 9),
111
622
  fitCell(status, 10),
623
+ fitCell(lifecycle, 11),
112
624
  fitCell(uptime, 11),
113
625
  snapshot,
114
626
  ].join("");
115
627
  }
116
- function padNodeRow(rig, pod, member, session, runtime, status, startup, restore, error) {
628
+ function padNodeRow(rig, pod, member, session, runtime, status, startup, lifecycle, activity, ctx, restore, error) {
117
629
  return [
118
- fitCell(rig, 32),
119
- fitCell(pod, 12),
120
- fitCell(member, 16),
121
- fitCell(session, 40),
122
- fitCell(runtime, 14),
630
+ fitCell(rig, 30),
631
+ fitCell(pod, 10),
632
+ fitCell(member, 14),
633
+ fitCell(session, 34),
634
+ fitCell(runtime, 12),
123
635
  fitCell(status, 10),
124
636
  fitCell(startup, 10),
637
+ fitCell(lifecycle, 11),
638
+ fitCell(activity, 12),
639
+ fitCell(ctx, 6),
125
640
  fitCell(restore, 10),
126
641
  error,
127
642
  ].join("");
128
643
  }
644
+ // PL-012: render context-usage as a 5-char cell — "<percent>%" when
645
+ // known + fresh, "<percent>%*" when known but stale, "??" when unknown.
646
+ // 4-char width keeps the table compact without truncating two-digit
647
+ // percentages (e.g., "98%*" or "5%").
648
+ function formatContextUsage(ctx) {
649
+ if (!ctx || ctx.availability !== "known" || typeof ctx.usedPercentage !== "number") {
650
+ return "??";
651
+ }
652
+ const stale = ctx.fresh === false ? "*" : "";
653
+ return `${ctx.usedPercentage}%${stale}`;
654
+ }
655
+ async function runCrossHostPs(hostId, opts, deps) {
656
+ const loader = deps.hostRegistryLoader ?? loadHostRegistry;
657
+ const runner = deps.crossHostRun ?? runCrossHostCommand;
658
+ const registry = loader();
659
+ if (!registry.ok) {
660
+ emitCrossHostError(hostId, "registry-load-failed", registry.error, opts.json);
661
+ return;
662
+ }
663
+ const resolved = resolveHost(registry.registry, hostId);
664
+ if (!resolved.ok) {
665
+ emitCrossHostError(hostId, "unknown-host", resolved.error, opts.json);
666
+ return;
667
+ }
668
+ const host = resolved.host;
669
+ // Reconstruct argv. `rig ps` has no positional args; all flags propagate.
670
+ const argv = ["rig", "ps"];
671
+ if (opts.nodes)
672
+ argv.push("--nodes");
673
+ if (opts.full)
674
+ argv.push("--full");
675
+ if (opts.limit !== undefined)
676
+ argv.push("--limit", opts.limit);
677
+ if (opts.fields !== undefined)
678
+ argv.push("--fields", opts.fields);
679
+ if (opts.summary)
680
+ argv.push("--summary");
681
+ if (opts.filter !== undefined)
682
+ argv.push("--filter", opts.filter);
683
+ if (opts.json)
684
+ argv.push("--json");
685
+ const result = await runner(host, argv);
686
+ if (opts.json) {
687
+ if (result.ok) {
688
+ // Verbatim remote stdout passthrough — the remote `rig ps --json` already
689
+ // produced the correct JSON shape (bare array OR envelope per its own
690
+ // shaping flags); we do NOT double-wrap.
691
+ if (result.stdout)
692
+ process.stdout.write(result.stdout);
693
+ if (result.stderr)
694
+ process.stderr.write(result.stderr);
695
+ return;
696
+ }
697
+ emitCrossHostFailure(host.id, host.target, result, true);
698
+ return;
699
+ }
700
+ console.log(`[via host=${host.id} (${host.target})]`);
701
+ if (result.ok) {
702
+ if (result.stdout)
703
+ process.stdout.write(result.stdout);
704
+ if (result.stderr)
705
+ process.stderr.write(result.stderr);
706
+ return;
707
+ }
708
+ emitCrossHostFailure(host.id, host.target, result, false);
709
+ }
129
710
  //# sourceMappingURL=ps.js.map