@openrig/cli 0.2.0 → 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 (469) hide show
  1. package/daemon/dist/adapters/claude-code-adapter.d.ts +10 -0
  2. package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
  3. package/daemon/dist/adapters/claude-code-adapter.js +41 -3
  4. package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
  5. package/daemon/dist/builtins/workflow-specs/basic-loop.yaml +76 -0
  6. package/daemon/dist/builtins/workflow-specs/conveyor.yaml +80 -0
  7. package/daemon/dist/db/migrations/026_inbox_entries.d.ts +1 -1
  8. package/daemon/dist/db/migrations/026_inbox_entries.js +1 -1
  9. package/daemon/dist/db/migrations/029_classifier_leases.d.ts +1 -1
  10. package/daemon/dist/db/migrations/029_classifier_leases.js +1 -1
  11. package/daemon/dist/db/migrations/037_mission_control_actions.d.ts +51 -0
  12. package/daemon/dist/db/migrations/037_mission_control_actions.d.ts.map +1 -0
  13. package/daemon/dist/db/migrations/037_mission_control_actions.js +74 -0
  14. package/daemon/dist/db/migrations/037_mission_control_actions.js.map +1 -0
  15. package/daemon/dist/db/migrations/038_workspace_primitive.d.ts +16 -0
  16. package/daemon/dist/db/migrations/038_workspace_primitive.d.ts.map +1 -0
  17. package/daemon/dist/db/migrations/038_workspace_primitive.js +20 -0
  18. package/daemon/dist/db/migrations/038_workspace_primitive.js.map +1 -0
  19. package/daemon/dist/db/migrations/039_queue_target_repo.d.ts +16 -0
  20. package/daemon/dist/db/migrations/039_queue_target_repo.d.ts.map +1 -0
  21. package/daemon/dist/db/migrations/039_queue_target_repo.js +21 -0
  22. package/daemon/dist/db/migrations/039_queue_target_repo.js.map +1 -0
  23. package/daemon/dist/domain/active-lens-store.d.ts +23 -0
  24. package/daemon/dist/domain/active-lens-store.d.ts.map +1 -0
  25. package/daemon/dist/domain/active-lens-store.js +87 -0
  26. package/daemon/dist/domain/active-lens-store.js.map +1 -0
  27. package/daemon/dist/domain/agent-images/agent-image-library-service.d.ts +68 -0
  28. package/daemon/dist/domain/agent-images/agent-image-library-service.d.ts.map +1 -0
  29. package/daemon/dist/domain/agent-images/agent-image-library-service.js +339 -0
  30. package/daemon/dist/domain/agent-images/agent-image-library-service.js.map +1 -0
  31. package/daemon/dist/domain/agent-images/agent-image-types.d.ts +113 -0
  32. package/daemon/dist/domain/agent-images/agent-image-types.d.ts.map +1 -0
  33. package/daemon/dist/domain/agent-images/agent-image-types.js +24 -0
  34. package/daemon/dist/domain/agent-images/agent-image-types.js.map +1 -0
  35. package/daemon/dist/domain/agent-images/evidence-guard.d.ts +26 -0
  36. package/daemon/dist/domain/agent-images/evidence-guard.d.ts.map +1 -0
  37. package/daemon/dist/domain/agent-images/evidence-guard.js +185 -0
  38. package/daemon/dist/domain/agent-images/evidence-guard.js.map +1 -0
  39. package/daemon/dist/domain/agent-images/manifest-parser.d.ts +3 -0
  40. package/daemon/dist/domain/agent-images/manifest-parser.d.ts.map +1 -0
  41. package/daemon/dist/domain/agent-images/manifest-parser.js +114 -0
  42. package/daemon/dist/domain/agent-images/manifest-parser.js.map +1 -0
  43. package/daemon/dist/domain/agent-images/resume-token-discovery.d.ts +28 -0
  44. package/daemon/dist/domain/agent-images/resume-token-discovery.d.ts.map +1 -0
  45. package/daemon/dist/domain/agent-images/resume-token-discovery.js +83 -0
  46. package/daemon/dist/domain/agent-images/resume-token-discovery.js.map +1 -0
  47. package/daemon/dist/domain/agent-images/snapshot-capturer.d.ts +36 -0
  48. package/daemon/dist/domain/agent-images/snapshot-capturer.d.ts.map +1 -0
  49. package/daemon/dist/domain/agent-images/snapshot-capturer.js +58 -0
  50. package/daemon/dist/domain/agent-images/snapshot-capturer.js.map +1 -0
  51. package/daemon/dist/domain/agent-starter-resolver.d.ts +10 -16
  52. package/daemon/dist/domain/agent-starter-resolver.d.ts.map +1 -1
  53. package/daemon/dist/domain/agent-starter-resolver.js +11 -13
  54. package/daemon/dist/domain/agent-starter-resolver.js.map +1 -1
  55. package/daemon/dist/domain/classifier-lease-manager.d.ts +1 -1
  56. package/daemon/dist/domain/classifier-lease-manager.js +1 -1
  57. package/daemon/dist/domain/conflict-detector.d.ts.map +1 -1
  58. package/daemon/dist/domain/conflict-detector.js +6 -3
  59. package/daemon/dist/domain/conflict-detector.js.map +1 -1
  60. package/daemon/dist/domain/context-monitor.d.ts +5 -4
  61. package/daemon/dist/domain/context-monitor.d.ts.map +1 -1
  62. package/daemon/dist/domain/context-monitor.js +26 -11
  63. package/daemon/dist/domain/context-monitor.js.map +1 -1
  64. package/daemon/dist/domain/context-packs/bundle-assembler.d.ts +49 -0
  65. package/daemon/dist/domain/context-packs/bundle-assembler.d.ts.map +1 -0
  66. package/daemon/dist/domain/context-packs/bundle-assembler.js +81 -0
  67. package/daemon/dist/domain/context-packs/bundle-assembler.js.map +1 -0
  68. package/daemon/dist/domain/context-packs/context-pack-library-service.d.ts +41 -0
  69. package/daemon/dist/domain/context-packs/context-pack-library-service.d.ts.map +1 -0
  70. package/daemon/dist/domain/context-packs/context-pack-library-service.js +148 -0
  71. package/daemon/dist/domain/context-packs/context-pack-library-service.js.map +1 -0
  72. package/daemon/dist/domain/context-packs/context-pack-types.d.ts +64 -0
  73. package/daemon/dist/domain/context-packs/context-pack-types.d.ts.map +1 -0
  74. package/daemon/dist/domain/context-packs/context-pack-types.js +22 -0
  75. package/daemon/dist/domain/context-packs/context-pack-types.js.map +1 -0
  76. package/daemon/dist/domain/context-packs/manifest-parser.d.ts +3 -0
  77. package/daemon/dist/domain/context-packs/manifest-parser.d.ts.map +1 -0
  78. package/daemon/dist/domain/context-packs/manifest-parser.js +74 -0
  79. package/daemon/dist/domain/context-packs/manifest-parser.js.map +1 -0
  80. package/daemon/dist/domain/context-usage-store.d.ts +14 -1
  81. package/daemon/dist/domain/context-usage-store.d.ts.map +1 -1
  82. package/daemon/dist/domain/context-usage-store.js +156 -1
  83. package/daemon/dist/domain/context-usage-store.js.map +1 -1
  84. package/daemon/dist/domain/files/file-write-service.d.ts +61 -0
  85. package/daemon/dist/domain/files/file-write-service.d.ts.map +1 -0
  86. package/daemon/dist/domain/files/file-write-service.js +180 -0
  87. package/daemon/dist/domain/files/file-write-service.js.map +1 -0
  88. package/daemon/dist/domain/files/path-safety.d.ts +47 -0
  89. package/daemon/dist/domain/files/path-safety.d.ts.map +1 -0
  90. package/daemon/dist/domain/files/path-safety.js +176 -0
  91. package/daemon/dist/domain/files/path-safety.js.map +1 -0
  92. package/daemon/dist/domain/graph-projection.d.ts +14 -1
  93. package/daemon/dist/domain/graph-projection.d.ts.map +1 -1
  94. package/daemon/dist/domain/graph-projection.js +8 -0
  95. package/daemon/dist/domain/graph-projection.js.map +1 -1
  96. package/daemon/dist/domain/install-engine.d.ts.map +1 -1
  97. package/daemon/dist/domain/install-engine.js +22 -6
  98. package/daemon/dist/domain/install-engine.js.map +1 -1
  99. package/daemon/dist/domain/install-verifier.d.ts.map +1 -1
  100. package/daemon/dist/domain/install-verifier.js +10 -5
  101. package/daemon/dist/domain/install-verifier.js.map +1 -1
  102. package/daemon/dist/domain/managed-blocks.d.ts.map +1 -1
  103. package/daemon/dist/domain/managed-blocks.js +22 -3
  104. package/daemon/dist/domain/managed-blocks.js.map +1 -1
  105. package/daemon/dist/domain/mission-control/audit-browse.d.ts +26 -0
  106. package/daemon/dist/domain/mission-control/audit-browse.d.ts.map +1 -0
  107. package/daemon/dist/domain/mission-control/audit-browse.js +101 -0
  108. package/daemon/dist/domain/mission-control/audit-browse.js.map +1 -0
  109. package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts +51 -0
  110. package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts.map +1 -0
  111. package/daemon/dist/domain/mission-control/mission-control-action-log.js +124 -0
  112. package/daemon/dist/domain/mission-control/mission-control-action-log.js.map +1 -0
  113. package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.d.ts +131 -0
  114. package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.d.ts.map +1 -0
  115. package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.js +232 -0
  116. package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.js.map +1 -0
  117. package/daemon/dist/domain/mission-control/mission-control-read-layer.d.ts +85 -0
  118. package/daemon/dist/domain/mission-control/mission-control-read-layer.d.ts.map +1 -0
  119. package/daemon/dist/domain/mission-control/mission-control-read-layer.js +265 -0
  120. package/daemon/dist/domain/mission-control/mission-control-read-layer.js.map +1 -0
  121. package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts +69 -0
  122. package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts.map +1 -0
  123. package/daemon/dist/domain/mission-control/mission-control-write-contract.js +300 -0
  124. package/daemon/dist/domain/mission-control/mission-control-write-contract.js.map +1 -0
  125. package/daemon/dist/domain/mission-control/notification-adapter-ntfy.d.ts +18 -0
  126. package/daemon/dist/domain/mission-control/notification-adapter-ntfy.d.ts.map +1 -0
  127. package/daemon/dist/domain/mission-control/notification-adapter-ntfy.js +48 -0
  128. package/daemon/dist/domain/mission-control/notification-adapter-ntfy.js.map +1 -0
  129. package/daemon/dist/domain/mission-control/notification-adapter-types.d.ts +25 -0
  130. package/daemon/dist/domain/mission-control/notification-adapter-types.d.ts.map +1 -0
  131. package/daemon/dist/domain/mission-control/notification-adapter-types.js +7 -0
  132. package/daemon/dist/domain/mission-control/notification-adapter-types.js.map +1 -0
  133. package/daemon/dist/domain/mission-control/notification-adapter-webhook.d.ts +27 -0
  134. package/daemon/dist/domain/mission-control/notification-adapter-webhook.d.ts.map +1 -0
  135. package/daemon/dist/domain/mission-control/notification-adapter-webhook.js +47 -0
  136. package/daemon/dist/domain/mission-control/notification-adapter-webhook.js.map +1 -0
  137. package/daemon/dist/domain/mission-control/notification-dispatcher.d.ts +53 -0
  138. package/daemon/dist/domain/mission-control/notification-dispatcher.d.ts.map +1 -0
  139. package/daemon/dist/domain/mission-control/notification-dispatcher.js +181 -0
  140. package/daemon/dist/domain/mission-control/notification-dispatcher.js.map +1 -0
  141. package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  142. package/daemon/dist/domain/node-inventory.js +24 -0
  143. package/daemon/dist/domain/node-inventory.js.map +1 -1
  144. package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
  145. package/daemon/dist/domain/node-launcher.js +7 -5
  146. package/daemon/dist/domain/node-launcher.js.map +1 -1
  147. package/daemon/dist/domain/preview/preview-rate-limiter.d.ts +20 -0
  148. package/daemon/dist/domain/preview/preview-rate-limiter.d.ts.map +1 -0
  149. package/daemon/dist/domain/preview/preview-rate-limiter.js +46 -0
  150. package/daemon/dist/domain/preview/preview-rate-limiter.js.map +1 -0
  151. package/daemon/dist/domain/profile-resolver.d.ts +5 -0
  152. package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
  153. package/daemon/dist/domain/profile-resolver.js +62 -8
  154. package/daemon/dist/domain/profile-resolver.js.map +1 -1
  155. package/daemon/dist/domain/progress/progress-indexer.d.ts +73 -0
  156. package/daemon/dist/domain/progress/progress-indexer.d.ts.map +1 -0
  157. package/daemon/dist/domain/progress/progress-indexer.js +210 -0
  158. package/daemon/dist/domain/progress/progress-indexer.js.map +1 -0
  159. package/daemon/dist/domain/project-classifier.d.ts +1 -1
  160. package/daemon/dist/domain/queue-repository.d.ts +22 -4
  161. package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  162. package/daemon/dist/domain/queue-repository.js +80 -22
  163. package/daemon/dist/domain/queue-repository.js.map +1 -1
  164. package/daemon/dist/domain/rehydrate-eligibility.d.ts +16 -0
  165. package/daemon/dist/domain/rehydrate-eligibility.d.ts.map +1 -0
  166. package/daemon/dist/domain/rehydrate-eligibility.js +43 -0
  167. package/daemon/dist/domain/rehydrate-eligibility.js.map +1 -0
  168. package/daemon/dist/domain/restore-check-service.d.ts.map +1 -1
  169. package/daemon/dist/domain/restore-check-service.js +19 -6
  170. package/daemon/dist/domain/restore-check-service.js.map +1 -1
  171. package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
  172. package/daemon/dist/domain/restore-orchestrator.js +4 -2
  173. package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
  174. package/daemon/dist/domain/rig-repository.d.ts +14 -0
  175. package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
  176. package/daemon/dist/domain/rig-repository.js +41 -0
  177. package/daemon/dist/domain/rig-repository.js.map +1 -1
  178. package/daemon/dist/domain/rig-teardown.d.ts.map +1 -1
  179. package/daemon/dist/domain/rig-teardown.js +5 -0
  180. package/daemon/dist/domain/rig-teardown.js.map +1 -1
  181. package/daemon/dist/domain/rigspec-codec.d.ts.map +1 -1
  182. package/daemon/dist/domain/rigspec-codec.js +15 -0
  183. package/daemon/dist/domain/rigspec-codec.js.map +1 -1
  184. package/daemon/dist/domain/rigspec-instantiator.d.ts +29 -0
  185. package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  186. package/daemon/dist/domain/rigspec-instantiator.js +136 -4
  187. package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  188. package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
  189. package/daemon/dist/domain/rigspec-schema.js +157 -4
  190. package/daemon/dist/domain/rigspec-schema.js.map +1 -1
  191. package/daemon/dist/domain/runtime-adapter.d.ts +11 -0
  192. package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -1
  193. package/daemon/dist/domain/runtime-adapter.js.map +1 -1
  194. package/daemon/dist/domain/skill-discovery.d.ts +51 -0
  195. package/daemon/dist/domain/skill-discovery.d.ts.map +1 -0
  196. package/daemon/dist/domain/skill-discovery.js +144 -0
  197. package/daemon/dist/domain/skill-discovery.js.map +1 -0
  198. package/daemon/dist/domain/slices/slice-detail-projector.d.ts +182 -0
  199. package/daemon/dist/domain/slices/slice-detail-projector.d.ts.map +1 -0
  200. package/daemon/dist/domain/slices/slice-detail-projector.js +508 -0
  201. package/daemon/dist/domain/slices/slice-detail-projector.js.map +1 -0
  202. package/daemon/dist/domain/slices/slice-indexer.d.ts +118 -0
  203. package/daemon/dist/domain/slices/slice-indexer.d.ts.map +1 -0
  204. package/daemon/dist/domain/slices/slice-indexer.js +503 -0
  205. package/daemon/dist/domain/slices/slice-indexer.js.map +1 -0
  206. package/daemon/dist/domain/spec-library-service.d.ts +17 -2
  207. package/daemon/dist/domain/spec-library-service.d.ts.map +1 -1
  208. package/daemon/dist/domain/spec-library-service.js +31 -1
  209. package/daemon/dist/domain/spec-library-service.js.map +1 -1
  210. package/daemon/dist/domain/spec-library-workflow-scanner.d.ts +81 -0
  211. package/daemon/dist/domain/spec-library-workflow-scanner.d.ts.map +1 -0
  212. package/daemon/dist/domain/spec-library-workflow-scanner.js +171 -0
  213. package/daemon/dist/domain/spec-library-workflow-scanner.js.map +1 -0
  214. package/daemon/dist/domain/startup-validation.d.ts.map +1 -1
  215. package/daemon/dist/domain/startup-validation.js +57 -11
  216. package/daemon/dist/domain/startup-validation.js.map +1 -1
  217. package/daemon/dist/domain/steering/health-summary.d.ts +39 -0
  218. package/daemon/dist/domain/steering/health-summary.d.ts.map +1 -0
  219. package/daemon/dist/domain/steering/health-summary.js +100 -0
  220. package/daemon/dist/domain/steering/health-summary.js.map +1 -0
  221. package/daemon/dist/domain/steering/steering-composer.d.ts +102 -0
  222. package/daemon/dist/domain/steering/steering-composer.d.ts.map +1 -0
  223. package/daemon/dist/domain/steering/steering-composer.js +263 -0
  224. package/daemon/dist/domain/steering/steering-composer.js.map +1 -0
  225. package/daemon/dist/domain/transcript-capture.d.ts.map +1 -1
  226. package/daemon/dist/domain/transcript-capture.js +7 -4
  227. package/daemon/dist/domain/transcript-capture.js.map +1 -1
  228. package/daemon/dist/domain/transcript-rotation.d.ts +29 -0
  229. package/daemon/dist/domain/transcript-rotation.d.ts.map +1 -0
  230. package/daemon/dist/domain/transcript-rotation.js +109 -0
  231. package/daemon/dist/domain/transcript-rotation.js.map +1 -0
  232. package/daemon/dist/domain/transcript-store.d.ts.map +1 -1
  233. package/daemon/dist/domain/transcript-store.js +7 -1
  234. package/daemon/dist/domain/transcript-store.js.map +1 -1
  235. package/daemon/dist/domain/types.d.ts +101 -2
  236. package/daemon/dist/domain/types.d.ts.map +1 -1
  237. package/daemon/dist/domain/types.js +8 -1
  238. package/daemon/dist/domain/types.js.map +1 -1
  239. package/daemon/dist/domain/user-settings/settings-store.d.ts +42 -0
  240. package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -0
  241. package/daemon/dist/domain/user-settings/settings-store.js +364 -0
  242. package/daemon/dist/domain/user-settings/settings-store.js.map +1 -0
  243. package/daemon/dist/domain/view-event-bridge.d.ts.map +1 -1
  244. package/daemon/dist/domain/view-event-bridge.js +2 -3
  245. package/daemon/dist/domain/view-event-bridge.js.map +1 -1
  246. package/daemon/dist/domain/whoami-service.d.ts +29 -0
  247. package/daemon/dist/domain/whoami-service.d.ts.map +1 -1
  248. package/daemon/dist/domain/whoami-service.js +68 -0
  249. package/daemon/dist/domain/whoami-service.js.map +1 -1
  250. package/daemon/dist/domain/workflow/slice-workflow-binding.d.ts +21 -0
  251. package/daemon/dist/domain/workflow/slice-workflow-binding.d.ts.map +1 -0
  252. package/daemon/dist/domain/workflow/slice-workflow-binding.js +103 -0
  253. package/daemon/dist/domain/workflow/slice-workflow-binding.js.map +1 -0
  254. package/daemon/dist/domain/workflow/slice-workflow-projection.d.ts +81 -0
  255. package/daemon/dist/domain/workflow/slice-workflow-projection.d.ts.map +1 -0
  256. package/daemon/dist/domain/workflow/slice-workflow-projection.js +127 -0
  257. package/daemon/dist/domain/workflow/slice-workflow-projection.js.map +1 -0
  258. package/daemon/dist/domain/workflow/starter-spec-loader.d.ts +51 -0
  259. package/daemon/dist/domain/workflow/starter-spec-loader.d.ts.map +1 -0
  260. package/daemon/dist/domain/workflow/starter-spec-loader.js +140 -0
  261. package/daemon/dist/domain/workflow/starter-spec-loader.js.map +1 -0
  262. package/daemon/dist/domain/workflow-projector.js +11 -3
  263. package/daemon/dist/domain/workflow-projector.js.map +1 -1
  264. package/daemon/dist/domain/workflow-spec-cache.d.ts +7 -0
  265. package/daemon/dist/domain/workflow-spec-cache.d.ts.map +1 -1
  266. package/daemon/dist/domain/workflow-spec-cache.js +62 -15
  267. package/daemon/dist/domain/workflow-spec-cache.js.map +1 -1
  268. package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts +6 -0
  269. package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -0
  270. package/daemon/dist/domain/workspace/default-workspace-scaffold.js +207 -0
  271. package/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -0
  272. package/daemon/dist/domain/workspace/frontmatter-validator.d.ts +40 -0
  273. package/daemon/dist/domain/workspace/frontmatter-validator.d.ts.map +1 -0
  274. package/daemon/dist/domain/workspace/frontmatter-validator.js +185 -0
  275. package/daemon/dist/domain/workspace/frontmatter-validator.js.map +1 -0
  276. package/daemon/dist/domain/workspace/workspace-resolver.d.ts +25 -0
  277. package/daemon/dist/domain/workspace/workspace-resolver.d.ts.map +1 -0
  278. package/daemon/dist/domain/workspace/workspace-resolver.js +86 -0
  279. package/daemon/dist/domain/workspace/workspace-resolver.js.map +1 -0
  280. package/daemon/dist/index.d.ts.map +1 -1
  281. package/daemon/dist/index.js +10 -1
  282. package/daemon/dist/index.js.map +1 -1
  283. package/daemon/dist/middleware/auth-bearer-token.d.ts +49 -0
  284. package/daemon/dist/middleware/auth-bearer-token.d.ts.map +1 -0
  285. package/daemon/dist/middleware/auth-bearer-token.js +135 -0
  286. package/daemon/dist/middleware/auth-bearer-token.js.map +1 -0
  287. package/daemon/dist/openrig-compat.d.ts +1 -1
  288. package/daemon/dist/openrig-compat.d.ts.map +1 -1
  289. package/daemon/dist/openrig-compat.js +6 -4
  290. package/daemon/dist/openrig-compat.js.map +1 -1
  291. package/daemon/dist/routes/agent-images.d.ts +8 -0
  292. package/daemon/dist/routes/agent-images.d.ts.map +1 -0
  293. package/daemon/dist/routes/agent-images.js +253 -0
  294. package/daemon/dist/routes/agent-images.js.map +1 -0
  295. package/daemon/dist/routes/config.d.ts +3 -0
  296. package/daemon/dist/routes/config.d.ts.map +1 -0
  297. package/daemon/dist/routes/config.js +109 -0
  298. package/daemon/dist/routes/config.js.map +1 -0
  299. package/daemon/dist/routes/context-packs.d.ts +3 -0
  300. package/daemon/dist/routes/context-packs.d.ts.map +1 -0
  301. package/daemon/dist/routes/context-packs.js +129 -0
  302. package/daemon/dist/routes/context-packs.js.map +1 -0
  303. package/daemon/dist/routes/files.d.ts +17 -0
  304. package/daemon/dist/routes/files.d.ts.map +1 -0
  305. package/daemon/dist/routes/files.js +262 -0
  306. package/daemon/dist/routes/files.js.map +1 -0
  307. package/daemon/dist/routes/health-summary.d.ts +9 -0
  308. package/daemon/dist/routes/health-summary.d.ts.map +1 -0
  309. package/daemon/dist/routes/health-summary.js +33 -0
  310. package/daemon/dist/routes/health-summary.js.map +1 -0
  311. package/daemon/dist/routes/mission-control.d.ts +37 -0
  312. package/daemon/dist/routes/mission-control.d.ts.map +1 -0
  313. package/daemon/dist/routes/mission-control.js +283 -0
  314. package/daemon/dist/routes/mission-control.js.map +1 -0
  315. package/daemon/dist/routes/progress.d.ts +7 -0
  316. package/daemon/dist/routes/progress.d.ts.map +1 -0
  317. package/daemon/dist/routes/progress.js +33 -0
  318. package/daemon/dist/routes/progress.js.map +1 -0
  319. package/daemon/dist/routes/queue.d.ts.map +1 -1
  320. package/daemon/dist/routes/queue.js +52 -1
  321. package/daemon/dist/routes/queue.js.map +1 -1
  322. package/daemon/dist/routes/rigs.d.ts +3 -0
  323. package/daemon/dist/routes/rigs.d.ts.map +1 -1
  324. package/daemon/dist/routes/rigs.js +73 -7
  325. package/daemon/dist/routes/rigs.js.map +1 -1
  326. package/daemon/dist/routes/rigspec.js +6 -3
  327. package/daemon/dist/routes/rigspec.js.map +1 -1
  328. package/daemon/dist/routes/sessions.d.ts.map +1 -1
  329. package/daemon/dist/routes/sessions.js +119 -0
  330. package/daemon/dist/routes/sessions.js.map +1 -1
  331. package/daemon/dist/routes/slices.d.ts +9 -0
  332. package/daemon/dist/routes/slices.d.ts.map +1 -0
  333. package/daemon/dist/routes/slices.js +192 -0
  334. package/daemon/dist/routes/slices.js.map +1 -0
  335. package/daemon/dist/routes/spec-library.d.ts.map +1 -1
  336. package/daemon/dist/routes/spec-library.js +72 -5
  337. package/daemon/dist/routes/spec-library.js.map +1 -1
  338. package/daemon/dist/routes/steering.d.ts +7 -0
  339. package/daemon/dist/routes/steering.d.ts.map +1 -0
  340. package/daemon/dist/routes/steering.js +27 -0
  341. package/daemon/dist/routes/steering.js.map +1 -0
  342. package/daemon/dist/routes/up.d.ts.map +1 -1
  343. package/daemon/dist/routes/up.js +21 -3
  344. package/daemon/dist/routes/up.js.map +1 -1
  345. package/daemon/dist/routes/whoami.d.ts.map +1 -1
  346. package/daemon/dist/routes/whoami.js +6 -1
  347. package/daemon/dist/routes/whoami.js.map +1 -1
  348. package/daemon/dist/routes/workflow.d.ts.map +1 -1
  349. package/daemon/dist/routes/workflow.js +43 -0
  350. package/daemon/dist/routes/workflow.js.map +1 -1
  351. package/daemon/dist/routes/workspace.d.ts +3 -0
  352. package/daemon/dist/routes/workspace.d.ts.map +1 -0
  353. package/daemon/dist/routes/workspace.js +53 -0
  354. package/daemon/dist/routes/workspace.js.map +1 -0
  355. package/daemon/dist/server.d.ts +51 -0
  356. package/daemon/dist/server.d.ts.map +1 -1
  357. package/daemon/dist/server.js +52 -1
  358. package/daemon/dist/server.js.map +1 -1
  359. package/daemon/dist/startup.d.ts +9 -0
  360. package/daemon/dist/startup.d.ts.map +1 -1
  361. package/daemon/dist/startup.js +385 -2
  362. package/daemon/dist/startup.js.map +1 -1
  363. package/daemon/docs/reference/agent-spec.md +7 -7
  364. package/daemon/docs/reference/agent-startup-guide.md +2 -2
  365. package/daemon/docs/reference/project-workspace.md +102 -0
  366. package/daemon/specs/agents/apps/vault-specialist/agent.yaml +1 -1
  367. package/daemon/specs/agents/apps/vault-specialist/guidance/role.md +0 -1
  368. package/daemon/specs/agents/conveyor/builder/agent.yaml +35 -0
  369. package/daemon/specs/agents/conveyor/builder/guidance/role.md +31 -0
  370. package/daemon/specs/agents/conveyor/builder/startup/context.md +9 -0
  371. package/daemon/specs/agents/conveyor/lead/agent.yaml +35 -0
  372. package/daemon/specs/agents/conveyor/lead/guidance/role.md +34 -0
  373. package/daemon/specs/agents/conveyor/lead/startup/context.md +15 -0
  374. package/daemon/specs/agents/conveyor/planner/agent.yaml +35 -0
  375. package/daemon/specs/agents/conveyor/planner/guidance/role.md +29 -0
  376. package/daemon/specs/agents/conveyor/planner/startup/context.md +12 -0
  377. package/daemon/specs/agents/conveyor/reviewer/agent.yaml +35 -0
  378. package/daemon/specs/agents/conveyor/reviewer/guidance/role.md +29 -0
  379. package/daemon/specs/agents/conveyor/reviewer/startup/context.md +10 -0
  380. package/daemon/specs/agents/development/implementer/agent.yaml +1 -1
  381. package/daemon/specs/agents/development/implementer/guidance/role.md +0 -1
  382. package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +1 -1
  383. package/daemon/specs/agents/orchestration/orchestrator/guidance/role.md +2 -3
  384. package/daemon/specs/agents/shared/agent.yaml +0 -2
  385. package/daemon/specs/agents/shared/skills/core/openrig-user/SKILL.md +25 -0
  386. package/daemon/specs/agents/shared/skills/core/openrig-user-settings/SKILL.md +153 -0
  387. package/daemon/specs/agents/shared/skills/rig-architect/SKILL.md +1 -1
  388. package/daemon/specs/rigs/launch/conveyor/CULTURE.md +34 -0
  389. package/daemon/specs/rigs/launch/conveyor/README.md +33 -0
  390. package/daemon/specs/rigs/launch/conveyor/rig.yaml +72 -0
  391. package/daemon/specs/rigs/preview/product-team/CULTURE.md +2 -2
  392. package/daemon/specs/rigs/preview/product-team/rig.yaml +3 -4
  393. package/dist/commands/agent-image.d.ts +4 -0
  394. package/dist/commands/agent-image.d.ts.map +1 -0
  395. package/dist/commands/agent-image.js +352 -0
  396. package/dist/commands/agent-image.js.map +1 -0
  397. package/dist/commands/config-init-workspace.d.ts +35 -0
  398. package/dist/commands/config-init-workspace.d.ts.map +1 -0
  399. package/dist/commands/config-init-workspace.js +300 -0
  400. package/dist/commands/config-init-workspace.js.map +1 -0
  401. package/dist/commands/config.d.ts.map +1 -1
  402. package/dist/commands/config.js +78 -18
  403. package/dist/commands/config.js.map +1 -1
  404. package/dist/commands/context-pack.d.ts +4 -0
  405. package/dist/commands/context-pack.d.ts.map +1 -0
  406. package/dist/commands/context-pack.js +357 -0
  407. package/dist/commands/context-pack.js.map +1 -0
  408. package/dist/commands/daemon.d.ts.map +1 -1
  409. package/dist/commands/daemon.js +8 -0
  410. package/dist/commands/daemon.js.map +1 -1
  411. package/dist/commands/import.d.ts.map +1 -1
  412. package/dist/commands/import.js +7 -2
  413. package/dist/commands/import.js.map +1 -1
  414. package/dist/commands/ps.d.ts.map +1 -1
  415. package/dist/commands/ps.js +173 -14
  416. package/dist/commands/ps.js.map +1 -1
  417. package/dist/commands/queue.d.ts.map +1 -1
  418. package/dist/commands/queue.js +9 -0
  419. package/dist/commands/queue.js.map +1 -1
  420. package/dist/commands/send.d.ts +7 -0
  421. package/dist/commands/send.d.ts.map +1 -1
  422. package/dist/commands/send.js +24 -1
  423. package/dist/commands/send.js.map +1 -1
  424. package/dist/commands/specs.d.ts +4 -2
  425. package/dist/commands/specs.d.ts.map +1 -1
  426. package/dist/commands/specs.js +12 -8
  427. package/dist/commands/specs.js.map +1 -1
  428. package/dist/commands/up.d.ts.map +1 -1
  429. package/dist/commands/up.js +17 -3
  430. package/dist/commands/up.js.map +1 -1
  431. package/dist/commands/whoami.d.ts.map +1 -1
  432. package/dist/commands/whoami.js +9 -4
  433. package/dist/commands/whoami.js.map +1 -1
  434. package/dist/commands/workflow.d.ts.map +1 -1
  435. package/dist/commands/workflow.js +37 -0
  436. package/dist/commands/workflow.js.map +1 -1
  437. package/dist/commands/workspace.d.ts +6 -0
  438. package/dist/commands/workspace.d.ts.map +1 -0
  439. package/dist/commands/workspace.js +83 -0
  440. package/dist/commands/workspace.js.map +1 -0
  441. package/dist/config-store.d.ts +73 -1
  442. package/dist/config-store.d.ts.map +1 -1
  443. package/dist/config-store.js +314 -42
  444. package/dist/config-store.js.map +1 -1
  445. package/dist/daemon-lifecycle.d.ts +22 -0
  446. package/dist/daemon-lifecycle.d.ts.map +1 -1
  447. package/dist/daemon-lifecycle.js +41 -0
  448. package/dist/daemon-lifecycle.js.map +1 -1
  449. package/dist/index.d.ts +4 -0
  450. package/dist/index.d.ts.map +1 -1
  451. package/dist/index.js +6 -0
  452. package/dist/index.js.map +1 -1
  453. package/dist/openrig-compat.d.ts +1 -1
  454. package/dist/openrig-compat.d.ts.map +1 -1
  455. package/dist/openrig-compat.js +6 -4
  456. package/dist/openrig-compat.js.map +1 -1
  457. package/dist/restore-packet/claude-transcript-parser.js +1 -1
  458. package/dist/restore-packet/claude-transcript-parser.js.map +1 -1
  459. package/dist/restore-packet/codex-jsonl-parser.js +1 -1
  460. package/dist/restore-packet/codex-jsonl-parser.js.map +1 -1
  461. package/package.json +2 -2
  462. package/ui/dist/assets/index-BDHU1JUK.js +412 -0
  463. package/ui/dist/assets/index-DXTyJSqu.css +1 -0
  464. package/ui/dist/graphics/operator-climber-monochrome.png +0 -0
  465. package/ui/dist/index.html +3 -2
  466. package/daemon/specs/agents/shared/skills/mental-model-ha/SKILL.md +0 -956
  467. package/ui/dist/assets/index-B09doO8H.js +0 -139
  468. package/ui/dist/assets/index-Dec25siz.css +0 -1
  469. package/ui/dist/assets/index-GNYaWmBj.js +0 -225
@@ -0,0 +1,102 @@
1
+ export interface SteeringComposerOpts {
2
+ /** Workspace root (e.g., the openrig-work substrate dir). Optional
3
+ * per-piece overrides (steeringPath / roadmapPath / deliveryReadyDir)
4
+ * trump the workspace-root-derived defaults. */
5
+ workspaceRoot: string | null;
6
+ steeringPath?: string | null;
7
+ roadmapPath?: string | null;
8
+ deliveryReadyDir?: string | null;
9
+ /** Per-lane top-N items to surface; default 3 (PRD § Item 1D). */
10
+ topNPerLane?: number;
11
+ }
12
+ export interface PriorityStackPayload {
13
+ /** Verbatim STEERING.md content. UI renders via the v0 MarkdownViewer
14
+ * for consistency with the Files browser. */
15
+ content: string;
16
+ absolutePath: string;
17
+ mtime: string;
18
+ byteCount: number;
19
+ }
20
+ export interface RoadmapRailItem {
21
+ line: number;
22
+ text: string;
23
+ done: boolean;
24
+ /** Detected PL-XXX rail-item code if present (e.g., "PL-019"). */
25
+ railItemCode: string | null;
26
+ /** True for the first unchecked item on the rail (UI marks visually). */
27
+ isNextUnchecked: boolean;
28
+ }
29
+ export interface RoadmapRailPayload {
30
+ absolutePath: string;
31
+ mtime: string;
32
+ items: RoadmapRailItem[];
33
+ /** Total checkbox rows / done / next-unchecked-line for header. */
34
+ counts: {
35
+ total: number;
36
+ done: number;
37
+ nextUncheckedLine: number | null;
38
+ };
39
+ }
40
+ export interface LaneRailItem {
41
+ line: number;
42
+ text: string;
43
+ status: "active" | "done" | "blocked" | "unknown";
44
+ /** True when this is the lane's "next pull" per the Priority Rail
45
+ * Rule: first non-done, non-blocked checkbox row on the lane. */
46
+ isNextPull: boolean;
47
+ }
48
+ export interface LaneRailPayload {
49
+ /** "mode-0" / "mode-1" / etc. — derived from the file's parent dir. */
50
+ laneId: string;
51
+ absolutePath: string;
52
+ mtime: string;
53
+ /** Top-N items shown on the steering panel (active/blocked first;
54
+ * done items only filling remainder). */
55
+ topItems: LaneRailItem[];
56
+ /** Lane-health aggregate counts across ALL rows in the file. */
57
+ healthBadges: {
58
+ active: number;
59
+ blocked: number;
60
+ done: number;
61
+ total: number;
62
+ };
63
+ /** Convenience: line number of the lane's next-pull row, null if none. */
64
+ nextPullLine: number | null;
65
+ }
66
+ export interface SteeringPayload {
67
+ priorityStack: PriorityStackPayload | null;
68
+ roadmapRail: RoadmapRailPayload | null;
69
+ laneRails: LaneRailPayload[];
70
+ /** Surface-level diagnostics for the UI to render setup hints when
71
+ * individual sources are missing. Each entry names the env var that
72
+ * would resolve it. */
73
+ unavailableSources: Array<{
74
+ section: string;
75
+ reason: string;
76
+ envVar?: string;
77
+ }>;
78
+ }
79
+ export declare function steeringOptsFromEnv(env?: NodeJS.ProcessEnv): SteeringComposerOpts;
80
+ export interface SteeringSettingsDefaults {
81
+ workspaceRoot: string;
82
+ workspaceSteeringPath: string;
83
+ }
84
+ export declare function steeringOptsFromSettings(settings: SteeringSettingsDefaults, env?: NodeJS.ProcessEnv): SteeringComposerOpts;
85
+ export declare class SteeringComposer {
86
+ private readonly opts;
87
+ constructor(opts: SteeringComposerOpts);
88
+ /** True when at least one source is resolvable. Routes use this to
89
+ * decide between 200 (with possibly-empty unavailableSources) and
90
+ * 503 (no sources at all). */
91
+ isReady(): boolean;
92
+ compose(): SteeringPayload;
93
+ private composePriorityStack;
94
+ private composeRoadmapRail;
95
+ private composeLaneRails;
96
+ private composeLaneFromFile;
97
+ private resolveSteeringPath;
98
+ private resolveRoadmapPath;
99
+ private resolveDeliveryReadyDir;
100
+ }
101
+ export declare function matchRailItemCode(text: string): string | null;
102
+ //# sourceMappingURL=steering-composer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steering-composer.d.ts","sourceRoot":"","sources":["../../../src/domain/steering/steering-composer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,263 @@
1
+ // Operator Surface Reconciliation v0 — steering composer.
2
+ //
3
+ // Item 1 (HEADLINE): one-screen composed steering surface. Daemon-side
4
+ // composer reads four filesystem sources and returns a payload the UI
5
+ // renders across the priority-stack / roadmap-rail / lane-rails panels.
6
+ //
7
+ // Why this composer and NOT a full daemon orchestration of Mission
8
+ // Control + agentActivity + everything: the steering UI fetches PL-005
9
+ // queue views (in-motion / loop-state) and health summaries via their
10
+ // own existing endpoints, so the composer stays narrow + testable. The
11
+ // composer is responsible only for the filesystem-derived pieces:
12
+ // - STEERING.md priority stack (verbatim render upstream)
13
+ // - roadmap PROGRESS.md (PL-XXX checklist + next-unchecked marker)
14
+ // - delivery-ready/mode-{0..3}/PROGRESS.md (per-lane top-N + health
15
+ // badges + next-pull marker per Priority Rail Rule semantics)
16
+ //
17
+ // Configuration: per the env-var-pivot pattern from UI Enhancement
18
+ // Pack v0 (ConfigStore's strict VALID_KEYS won't admit dynamic family
19
+ // keys cleanly), the steering composer reads a single workspace root
20
+ // from OPENRIG_STEERING_WORKSPACE. Everything else derives relative to
21
+ // that root: STEERING.md, roadmap/PROGRESS.md, delivery-ready/mode-*/
22
+ // PROGRESS.md. Operator-overridable via OPENRIG_STEERING_PATH /
23
+ // OPENRIG_ROADMAP_PATH / OPENRIG_DELIVERY_READY_DIR for non-canonical
24
+ // layouts. Empty/unset → composer.isReady() = false → route returns
25
+ // 503 with structured setup hint.
26
+ import * as fs from "node:fs";
27
+ import * as path from "node:path";
28
+ import { ProgressIndexer } from "../progress/progress-indexer.js";
29
+ const ENV_WORKSPACE = "OPENRIG_STEERING_WORKSPACE";
30
+ const ENV_LEGACY_WORKSPACE = "RIGGED_STEERING_WORKSPACE";
31
+ const ENV_STEERING_PATH = "OPENRIG_STEERING_PATH";
32
+ const ENV_ROADMAP_PATH = "OPENRIG_ROADMAP_PATH";
33
+ const ENV_DELIVERY_READY_DIR = "OPENRIG_DELIVERY_READY_DIR";
34
+ export function steeringOptsFromEnv(env = process.env) {
35
+ // Use || (not ??) so an empty-string env var falls through to the next
36
+ // candidate. Same precedent as the UI Enhancement Pack v0 env helpers.
37
+ const workspaceRoot = (env[ENV_WORKSPACE] || env[ENV_LEGACY_WORKSPACE] || "").trim() || null;
38
+ return {
39
+ workspaceRoot,
40
+ steeringPath: (env[ENV_STEERING_PATH] || "").trim() || null,
41
+ roadmapPath: (env[ENV_ROADMAP_PATH] || "").trim() || null,
42
+ deliveryReadyDir: (env[ENV_DELIVERY_READY_DIR] || "").trim() || null,
43
+ };
44
+ }
45
+ export function steeringOptsFromSettings(settings, env = process.env) {
46
+ const envOpts = steeringOptsFromEnv(env);
47
+ return {
48
+ workspaceRoot: envOpts.workspaceRoot ?? settings.workspaceRoot,
49
+ steeringPath: envOpts.steeringPath ?? settings.workspaceSteeringPath,
50
+ roadmapPath: envOpts.roadmapPath ?? null,
51
+ deliveryReadyDir: envOpts.deliveryReadyDir ?? null,
52
+ };
53
+ }
54
+ export class SteeringComposer {
55
+ opts;
56
+ constructor(opts) {
57
+ this.opts = {
58
+ workspaceRoot: opts.workspaceRoot,
59
+ steeringPath: opts.steeringPath ?? null,
60
+ roadmapPath: opts.roadmapPath ?? null,
61
+ deliveryReadyDir: opts.deliveryReadyDir ?? null,
62
+ topNPerLane: opts.topNPerLane ?? 3,
63
+ };
64
+ }
65
+ /** True when at least one source is resolvable. Routes use this to
66
+ * decide between 200 (with possibly-empty unavailableSources) and
67
+ * 503 (no sources at all). */
68
+ isReady() {
69
+ return Boolean(this.resolveSteeringPath() ||
70
+ this.resolveRoadmapPath() ||
71
+ this.resolveDeliveryReadyDir());
72
+ }
73
+ compose() {
74
+ const unavailableSources = [];
75
+ const priorityStack = this.composePriorityStack(unavailableSources);
76
+ const roadmapRail = this.composeRoadmapRail(unavailableSources);
77
+ const laneRails = this.composeLaneRails(unavailableSources);
78
+ return { priorityStack, roadmapRail, laneRails, unavailableSources };
79
+ }
80
+ // --- per-section composers ---
81
+ composePriorityStack(unavailableSources) {
82
+ const p = this.resolveSteeringPath();
83
+ if (!p) {
84
+ unavailableSources.push({ section: "priorityStack", reason: "STEERING.md path not configured", envVar: ENV_STEERING_PATH });
85
+ return null;
86
+ }
87
+ try {
88
+ const content = fs.readFileSync(p, "utf-8");
89
+ const stat = fs.statSync(p);
90
+ return {
91
+ content,
92
+ absolutePath: p,
93
+ mtime: stat.mtime.toISOString(),
94
+ byteCount: stat.size,
95
+ };
96
+ }
97
+ catch (err) {
98
+ unavailableSources.push({
99
+ section: "priorityStack",
100
+ reason: `failed to read STEERING.md: ${err instanceof Error ? err.message : String(err)}`,
101
+ envVar: ENV_STEERING_PATH,
102
+ });
103
+ return null;
104
+ }
105
+ }
106
+ composeRoadmapRail(unavailableSources) {
107
+ const p = this.resolveRoadmapPath();
108
+ if (!p) {
109
+ unavailableSources.push({ section: "roadmapRail", reason: "roadmap PROGRESS.md path not configured", envVar: ENV_ROADMAP_PATH });
110
+ return null;
111
+ }
112
+ let content;
113
+ let mtime;
114
+ try {
115
+ content = fs.readFileSync(p, "utf-8");
116
+ mtime = fs.statSync(p).mtime;
117
+ }
118
+ catch (err) {
119
+ unavailableSources.push({
120
+ section: "roadmapRail",
121
+ reason: `failed to read roadmap PROGRESS.md: ${err instanceof Error ? err.message : String(err)}`,
122
+ envVar: ENV_ROADMAP_PATH,
123
+ });
124
+ return null;
125
+ }
126
+ const items = [];
127
+ let nextUncheckedSet = false;
128
+ let nextUncheckedLine = null;
129
+ let total = 0;
130
+ let done = 0;
131
+ const lines = content.split("\n");
132
+ for (let i = 0; i < lines.length; i++) {
133
+ const m = lines[i].match(/^\s*(?:[-*]\s+)?\[([ xX])\]\s+(.+)$/);
134
+ if (!m)
135
+ continue;
136
+ const isDone = m[1].toLowerCase() === "x";
137
+ const text = m[2].trim();
138
+ total++;
139
+ if (isDone)
140
+ done++;
141
+ const railCode = matchRailItemCode(text);
142
+ const isNextUnchecked = !isDone && !nextUncheckedSet;
143
+ if (isNextUnchecked) {
144
+ nextUncheckedSet = true;
145
+ nextUncheckedLine = i + 1;
146
+ }
147
+ items.push({
148
+ line: i + 1,
149
+ text,
150
+ done: isDone,
151
+ railItemCode: railCode,
152
+ isNextUnchecked,
153
+ });
154
+ }
155
+ return {
156
+ absolutePath: p,
157
+ mtime: mtime.toISOString(),
158
+ items,
159
+ counts: { total, done, nextUncheckedLine },
160
+ };
161
+ }
162
+ composeLaneRails(unavailableSources) {
163
+ const dir = this.resolveDeliveryReadyDir();
164
+ if (!dir) {
165
+ unavailableSources.push({
166
+ section: "laneRails",
167
+ reason: "delivery-ready directory not configured",
168
+ envVar: ENV_DELIVERY_READY_DIR,
169
+ });
170
+ return [];
171
+ }
172
+ // Use the existing ProgressIndexer to parse mode-{0..3}/PROGRESS.md
173
+ // — same checkbox-status semantics as the UI Enhancement Pack v0
174
+ // /progress view, so the steering view stays consistent with what
175
+ // the operator sees in the Progress workspace.
176
+ const indexer = new ProgressIndexer({
177
+ roots: [{ name: "delivery-ready", canonicalPath: dir }],
178
+ maxDepth: 3,
179
+ });
180
+ const result = indexer.scan();
181
+ const lanes = [];
182
+ for (const file of result.files) {
183
+ // Derive laneId from "mode-N/PROGRESS.md" or fallback to relPath.
184
+ const m = file.relPath.match(/^(mode-\d+)\/PROGRESS\.md$/);
185
+ const laneId = m ? m[1] : file.relPath.replace(/\/?PROGRESS\.md$/i, "") || file.relPath;
186
+ lanes.push(this.composeLaneFromFile(laneId, file));
187
+ }
188
+ lanes.sort((a, b) => a.laneId.localeCompare(b.laneId));
189
+ return lanes;
190
+ }
191
+ composeLaneFromFile(laneId, file) {
192
+ const checkboxRows = file.rows.filter((r) => r.kind === "checkbox");
193
+ // Priority Rail Rule "next pull": first non-done, non-blocked
194
+ // checkbox row on the lane. Per the workstream-continuity convention
195
+ // (cited in the PRD), shelf/queue recency does NOT override; first
196
+ // ready item wins.
197
+ const nextPullIdx = checkboxRows.findIndex((r) => r.status !== "done" && r.status !== "blocked");
198
+ const nextPullLine = nextPullIdx >= 0 ? (checkboxRows[nextPullIdx]?.line ?? null) : null;
199
+ // Top-N: prefer active+blocked rows; only fall back to done if there
200
+ // aren't enough non-done rows to fill N (rare on healthy lanes,
201
+ // common on closed lanes).
202
+ const N = this.opts.topNPerLane;
203
+ const nonDoneRows = checkboxRows.filter((r) => r.status !== "done");
204
+ const doneRows = checkboxRows.filter((r) => r.status === "done");
205
+ const orderedSelection = [...nonDoneRows, ...doneRows].slice(0, N);
206
+ const topItems = orderedSelection.map((r) => ({
207
+ line: r.line,
208
+ text: r.text,
209
+ status: r.status,
210
+ isNextPull: r.line === nextPullLine,
211
+ }));
212
+ return {
213
+ laneId,
214
+ absolutePath: file.absolutePath,
215
+ mtime: file.mtime,
216
+ topItems,
217
+ healthBadges: {
218
+ active: file.counts.active,
219
+ blocked: file.counts.blocked,
220
+ done: file.counts.done,
221
+ total: file.counts.total,
222
+ },
223
+ nextPullLine,
224
+ };
225
+ }
226
+ // --- path resolvers ---
227
+ resolveSteeringPath() {
228
+ if (this.opts.steeringPath)
229
+ return this.opts.steeringPath;
230
+ if (!this.opts.workspaceRoot)
231
+ return null;
232
+ const candidate = path.join(this.opts.workspaceRoot, "STEERING.md");
233
+ return fs.existsSync(candidate) ? candidate : null;
234
+ }
235
+ resolveRoadmapPath() {
236
+ if (this.opts.roadmapPath)
237
+ return this.opts.roadmapPath;
238
+ if (!this.opts.workspaceRoot)
239
+ return null;
240
+ const candidate = path.join(this.opts.workspaceRoot, "roadmap", "PROGRESS.md");
241
+ return fs.existsSync(candidate) ? candidate : null;
242
+ }
243
+ resolveDeliveryReadyDir() {
244
+ if (this.opts.deliveryReadyDir)
245
+ return this.opts.deliveryReadyDir;
246
+ if (!this.opts.workspaceRoot)
247
+ return null;
248
+ const candidate = path.join(this.opts.workspaceRoot, "delivery-ready");
249
+ try {
250
+ const st = fs.statSync(candidate);
251
+ if (st.isDirectory())
252
+ return candidate;
253
+ }
254
+ catch { /* fall through */ }
255
+ return null;
256
+ }
257
+ }
258
+ const RAIL_CODE_REGEX = /\b(PL-\d{2,4})\b/;
259
+ export function matchRailItemCode(text) {
260
+ const m = text.match(RAIL_CODE_REGEX);
261
+ return m ? m[1] : null;
262
+ }
263
+ //# sourceMappingURL=steering-composer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steering-composer.js","sourceRoot":"","sources":["../../../src/domain/steering/steering-composer.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"transcript-capture.d.ts","sourceRoot":"","sources":["../../src/domain/transcript-capture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,EAC3C,eAAe,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EACnD,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBhD"}
1
+ {"version":3,"file":"transcript-capture.d.ts","sourceRoot":"","sources":["../../src/domain/transcript-capture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAM7D,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,EAC3C,eAAe,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EACnD,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAsBhD"}
@@ -1,3 +1,4 @@
1
+ import { startTranscriptRotation, getTranscriptRotationOptionsFromEnv, } from "./transcript-rotation.js";
1
2
  export async function startTmuxTranscriptCapture(tmuxAdapter, transcriptStore, rigName, sessionName) {
2
3
  if (!tmuxAdapter || !transcriptStore?.enabled) {
3
4
  return { started: false, reason: "transcript_capture_unavailable" };
@@ -6,10 +7,12 @@ export async function startTmuxTranscriptCapture(tmuxAdapter, transcriptStore, r
6
7
  return { started: false, reason: "transcript_dir_unavailable" };
7
8
  }
8
9
  const transcriptPath = transcriptStore.getTranscriptPath(rigName, sessionName);
9
- const pipeResult = await tmuxAdapter.startPipePane(sessionName, transcriptPath);
10
- if (!pipeResult.ok) {
11
- return { started: false, reason: pipeResult.message };
12
- }
10
+ // V1 pre-release CLI/daemon Item 1: bounded-trail rotation replaces
11
+ // the pipe-pane infinite-growth file. Defaults from env vars + 1000
12
+ // line / 2s baseline; failure inside rotation is best-effort silent
13
+ // and never blocks launch (the prior pipe-pane site treated failure
14
+ // as launch-warning, not launch-blocker, so behavior stays).
15
+ startTranscriptRotation(tmuxAdapter, sessionName, transcriptPath, getTranscriptRotationOptionsFromEnv());
13
16
  return { started: true };
14
17
  }
15
18
  //# sourceMappingURL=transcript-capture.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transcript-capture.js","sourceRoot":"","sources":["../../src/domain/transcript-capture.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,WAA2C,EAC3C,eAAmD,EACnD,OAAe,EACf,WAAmB;IAEnB,IAAI,CAAC,WAAW,IAAI,CAAC,eAAe,EAAE,OAAO,EAAE,CAAC;QAC9C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,gCAAgC,EAAE,CAAC;IACtE,CAAC;IAED,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;QAClD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,cAAc,GAAG,eAAe,CAAC,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC/E,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,aAAa,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAChF,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC;IACxD,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"transcript-capture.js","sourceRoot":"","sources":["../../src/domain/transcript-capture.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,uBAAuB,EACvB,mCAAmC,GACpC,MAAM,0BAA0B,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,WAA2C,EAC3C,eAAmD,EACnD,OAAe,EACf,WAAmB;IAEnB,IAAI,CAAC,WAAW,IAAI,CAAC,eAAe,EAAE,OAAO,EAAE,CAAC;QAC9C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,gCAAgC,EAAE,CAAC;IACtE,CAAC;IAED,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;QAClD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,cAAc,GAAG,eAAe,CAAC,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC/E,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,6DAA6D;IAC7D,uBAAuB,CACrB,WAAW,EACX,WAAW,EACX,cAAc,EACd,mCAAmC,EAAE,CACtC,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { TmuxAdapter } from "../adapters/tmux.js";
2
+ export interface TranscriptRotationOptions {
3
+ /** Trailing line count to capture each tick. */
4
+ lines: number;
5
+ /** Poll interval in milliseconds. */
6
+ pollIntervalMs: number;
7
+ }
8
+ export declare const DEFAULT_TRANSCRIPT_LINES = 1000;
9
+ export declare const DEFAULT_TRANSCRIPT_POLL_INTERVAL_MS = 2000;
10
+ /** Resolve rotation options from env vars, falling back to defaults.
11
+ * File-stored config (rig config set transcripts.lines …) is loaded
12
+ * via the daemon settings-store at startup; consumers that need the
13
+ * file-stored value can pass an explicit options object instead. */
14
+ export declare function getTranscriptRotationOptionsFromEnv(): TranscriptRotationOptions;
15
+ /** Start a per-session capture-pane rotation timer. Idempotent: a
16
+ * second start for the same session replaces the first timer. The
17
+ * first tick fires immediately so the transcript file is populated
18
+ * before the first poll interval elapses. */
19
+ export declare function startTranscriptRotation(tmuxAdapter: TmuxAdapter, sessionName: string, outputPath: string, opts: TranscriptRotationOptions): void;
20
+ /** Clear the rotation timer for a session. Safe to call when no timer
21
+ * is registered. */
22
+ export declare function stopTranscriptRotation(sessionName: string): void;
23
+ /** Test-only: count of active rotators. Production code should not
24
+ * depend on this. */
25
+ export declare function getActiveRotationCount(): number;
26
+ /** Test-only: clear all active rotators. Production code should not
27
+ * call this; use stopTranscriptRotation for individual sessions. */
28
+ export declare function clearAllTranscriptRotationsForTest(): void;
29
+ //# sourceMappingURL=transcript-rotation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-rotation.d.ts","sourceRoot":"","sources":["../../src/domain/transcript-rotation.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,WAAW,yBAAyB;IACxC,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAC7C,eAAO,MAAM,mCAAmC,OAAO,CAAC;AAExD;;;qEAGqE;AACrE,wBAAgB,mCAAmC,IAAI,yBAAyB,CAM/E;AAWD;;;8CAG8C;AAC9C,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,yBAAyB,GAC9B,IAAI,CA2CN;AAED;qBACqB;AACrB,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAMhE;AAED;sBACsB;AACtB,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED;qEACqE;AACrE,wBAAgB,kCAAkC,IAAI,IAAI,CAGzD"}
@@ -0,0 +1,109 @@
1
+ // V1 pre-release CLI/daemon Item 1 — bounded-trail transcript rotation.
2
+ //
3
+ // Replaces the legacy `tmux pipe-pane` mechanism (infinite-growth file)
4
+ // with a periodic `tmux capture-pane -t <session> -p -S -<lines>` shellout
5
+ // that atomically overwrites the transcript file. File size stays bounded
6
+ // by trailing line count + line-byte ceiling, not by session duration.
7
+ //
8
+ // Tunables (env: OPENRIG_TRANSCRIPTS_LINES / OPENRIG_TRANSCRIPTS_POLL_INTERVAL_SECONDS;
9
+ // allowlist keys transcripts.lines / transcripts.poll_interval_seconds):
10
+ // - lines: number of trailing lines to capture per tick (default 1000)
11
+ // - pollIntervalMs: millisecond cadence between ticks (default 2000)
12
+ //
13
+ // SC-29 EXCEPTION #4 declared in pre-release CLI/daemon ACK §5.
14
+ import * as fs from "node:fs";
15
+ import * as path from "node:path";
16
+ import { readOpenRigEnv } from "../openrig-compat.js";
17
+ export const DEFAULT_TRANSCRIPT_LINES = 1000;
18
+ export const DEFAULT_TRANSCRIPT_POLL_INTERVAL_MS = 2000;
19
+ /** Resolve rotation options from env vars, falling back to defaults.
20
+ * File-stored config (rig config set transcripts.lines …) is loaded
21
+ * via the daemon settings-store at startup; consumers that need the
22
+ * file-stored value can pass an explicit options object instead. */
23
+ export function getTranscriptRotationOptionsFromEnv() {
24
+ const linesRaw = readOpenRigEnv("OPENRIG_TRANSCRIPTS_LINES");
25
+ const pollRaw = readOpenRigEnv("OPENRIG_TRANSCRIPTS_POLL_INTERVAL_SECONDS");
26
+ const lines = parsePositiveInt(linesRaw, DEFAULT_TRANSCRIPT_LINES);
27
+ const pollSeconds = parsePositiveInt(pollRaw, DEFAULT_TRANSCRIPT_POLL_INTERVAL_MS / 1000);
28
+ return { lines, pollIntervalMs: pollSeconds * 1000 };
29
+ }
30
+ function parsePositiveInt(raw, fallback) {
31
+ if (raw === undefined)
32
+ return fallback;
33
+ const n = parseInt(raw, 10);
34
+ if (!Number.isFinite(n) || n <= 0)
35
+ return fallback;
36
+ return n;
37
+ }
38
+ const activeTimers = new Map();
39
+ /** Start a per-session capture-pane rotation timer. Idempotent: a
40
+ * second start for the same session replaces the first timer. The
41
+ * first tick fires immediately so the transcript file is populated
42
+ * before the first poll interval elapses. */
43
+ export function startTranscriptRotation(tmuxAdapter, sessionName, outputPath, opts) {
44
+ stopTranscriptRotation(sessionName);
45
+ const tick = async () => {
46
+ try {
47
+ const content = await tmuxAdapter.capturePaneContent(sessionName, opts.lines);
48
+ if (content === null)
49
+ return;
50
+ // Preserve SESSION BOUNDARY lines that the restore orchestrator
51
+ // writes to the transcript file before launch. The capture-pane
52
+ // overwrite would otherwise wipe them on the first tick. The
53
+ // marker is the only structural header the transcript file is
54
+ // expected to carry across rotations; everything else is
55
+ // terminal-scrollback content from capture-pane.
56
+ let header = "";
57
+ try {
58
+ if (fs.existsSync(outputPath)) {
59
+ const prev = fs.readFileSync(outputPath, "utf8");
60
+ const boundaryLines = prev
61
+ .split("\n")
62
+ .filter((line) => line.startsWith("--- SESSION BOUNDARY:"));
63
+ if (boundaryLines.length > 0)
64
+ header = boundaryLines.join("\n") + "\n";
65
+ }
66
+ }
67
+ catch {
68
+ // Best-effort header read; missing file or read error means no header.
69
+ }
70
+ fs.mkdirSync(path.dirname(outputPath), { recursive: true });
71
+ const tmpPath = `${outputPath}.tmp.${process.pid}`;
72
+ fs.writeFileSync(tmpPath, header + content);
73
+ fs.renameSync(tmpPath, outputPath);
74
+ }
75
+ catch {
76
+ // Best-effort capture: target session may have died, output path
77
+ // may be unwritable, etc. The next tick retries; failure here
78
+ // does not bubble up to the daemon's launch / lifecycle paths.
79
+ }
80
+ };
81
+ void tick();
82
+ const timer = setInterval(tick, opts.pollIntervalMs);
83
+ // Don't keep the daemon process alive solely on transcript timers.
84
+ if (typeof timer.unref === "function")
85
+ timer.unref();
86
+ activeTimers.set(sessionName, timer);
87
+ }
88
+ /** Clear the rotation timer for a session. Safe to call when no timer
89
+ * is registered. */
90
+ export function stopTranscriptRotation(sessionName) {
91
+ const timer = activeTimers.get(sessionName);
92
+ if (timer) {
93
+ clearInterval(timer);
94
+ activeTimers.delete(sessionName);
95
+ }
96
+ }
97
+ /** Test-only: count of active rotators. Production code should not
98
+ * depend on this. */
99
+ export function getActiveRotationCount() {
100
+ return activeTimers.size;
101
+ }
102
+ /** Test-only: clear all active rotators. Production code should not
103
+ * call this; use stopTranscriptRotation for individual sessions. */
104
+ export function clearAllTranscriptRotationsForTest() {
105
+ for (const timer of activeTimers.values())
106
+ clearInterval(timer);
107
+ activeTimers.clear();
108
+ }
109
+ //# sourceMappingURL=transcript-rotation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-rotation.js","sourceRoot":"","sources":["../../src/domain/transcript-rotation.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"transcript-store.d.ts","sourceRoot":"","sources":["../../src/domain/transcript-store.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAiKD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;gBAEvB,IAAI,CAAC,EAAE,mBAAmB;IAKtC,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAS/D,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAe7C,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAYlF,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAqB/B,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IA+B5E,OAAO,CAAC,gBAAgB;IAkBxB;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAU7D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAU5E,OAAO,CAAC,QAAQ;CA+CjB"}
1
+ {"version":3,"file":"transcript-store.d.ts","sourceRoot":"","sources":["../../src/domain/transcript-store.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAiKD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;gBAEvB,IAAI,CAAC,EAAE,mBAAmB;IAKtC,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAS/D,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAe7C,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAkBlF,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAqB/B,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IA+B5E,OAAO,CAAC,gBAAgB;IAkBxB;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAU7D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAU5E,OAAO,CAAC,QAAQ;CA+CjB"}
@@ -1,5 +1,5 @@
1
1
  import { mkdirSync, appendFileSync, existsSync, openSync, readSync, closeSync, statSync, readFileSync } from "node:fs";
2
- import { join } from "node:path";
2
+ import { join, dirname } from "node:path";
3
3
  import { StringDecoder } from "node:string_decoder";
4
4
  import { getCompatibleOpenRigPath } from "../openrig-compat.js";
5
5
  const DEFAULT_ROOT = getCompatibleOpenRigPath("transcripts");
@@ -197,6 +197,12 @@ export class TranscriptStore {
197
197
  return false;
198
198
  try {
199
199
  const filePath = this.getTranscriptPath(rigName, sessionName);
200
+ // Ensure the rig directory exists so the marker write succeeds
201
+ // even when called before the launcher's ensureTranscriptDir.
202
+ // Restore orchestration writes the marker before launch; the
203
+ // launcher creates the dir later, which used to lose markers
204
+ // for the first restore on a fresh rig.
205
+ mkdirSync(dirname(filePath), { recursive: true });
200
206
  const marker = `--- SESSION BOUNDARY: ${reason} at ${new Date().toISOString()} ---\n`;
201
207
  appendFileSync(filePath, marker, "utf-8");
202
208
  return true;