@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,113 @@
1
+ export type AgentImageRuntime = "claude-code" | "codex";
2
+ export interface AgentImageManifest {
3
+ name: string;
4
+ version: string;
5
+ runtime: AgentImageRuntime;
6
+ /** Source seat's canonical session name, e.g. "velocity-driver@openrig-velocity". */
7
+ sourceSeat: string;
8
+ /** Native conversation id captured at snapshot time. Claude: the
9
+ * resume_token from the sessions table. Codex: the thread_id from
10
+ * codex-thread-id.ts. */
11
+ sourceSessionId: string;
12
+ /** Same value as sourceSessionId for v0 — kept as a separate field
13
+ * in the manifest so future versions can split runtime conversation
14
+ * identity from a runtime-resume token without breaking older
15
+ * manifests. */
16
+ sourceResumeToken: string;
17
+ /** PL-016 source-cwd behavior: the
18
+ * source seat's resolved cwd at snapshot time. Captured so the
19
+ * Use-as-starter snippet can emit `cwd: <source_cwd>` and the fork
20
+ * starts in the SAME directory the parent session was created in
21
+ * — Claude's project-dir-scoped session storage works because the
22
+ * jsonl file lives there. The daemon does NOT override cwd at fork
23
+ * dispatch — if operator manually changes the rig.yaml cwd, fork
24
+ * fails honestly with "no conversation found". Optional: manifests
25
+ * authored before source_cwd support omit this field; snippet renders
26
+ * without cwd line for back-compat. */
27
+ sourceCwd?: string;
28
+ createdAt: string;
29
+ notes?: string;
30
+ /** Optional supplementary files (analogous to context_pack files).
31
+ * v0 ships no consumers for this surface beyond passthrough; the
32
+ * startup orchestrator will compose them into the seat's cwd at
33
+ * launch time when the v0+1 trigger names them. */
34
+ files: AgentImageManifestFile[];
35
+ /** Operator-supplied or capturer-derived estimate. Used for at-a-
36
+ * glance display in the library; the library service ALSO computes
37
+ * a derivedEstimatedTokens from the actual on-disk content size. */
38
+ estimatedTokens?: number;
39
+ /** Lineage chain populated when the image is forked from another
40
+ * image (image creation can record `lineage: [<parent>, ...]`). */
41
+ lineage?: string[];
42
+ }
43
+ export interface AgentImageManifestFile {
44
+ path: string;
45
+ role: string;
46
+ summary?: string;
47
+ }
48
+ export interface AgentImageStats {
49
+ /** Incremented atomically when the image is consumed (either by
50
+ * rig fork / agent-image fork or by a session_source: mode:
51
+ * agent_image consumer at instantiation time). */
52
+ forkCount: number;
53
+ /** ISO timestamp of the most-recent consumption. */
54
+ lastUsedAt: string | null;
55
+ /** Daemon-derived estimate of total bytes under the image dir
56
+ * (manifest + supplementary files). */
57
+ estimatedSizeBytes: number;
58
+ /** Fully-resolved lineage chain (mirrors manifest.lineage; kept on
59
+ * stats so it's mutable independently when a parent image is
60
+ * renamed). */
61
+ lineage: string[];
62
+ }
63
+ export type AgentImageSourceType = "user_file" | "workspace" | "builtin";
64
+ export interface AgentImageEntry {
65
+ /** Stable id `agent-image:<name>:<version>` parallel to context-pack:. */
66
+ id: string;
67
+ kind: "agent-image";
68
+ name: string;
69
+ version: string;
70
+ runtime: AgentImageRuntime;
71
+ sourceSeat: string;
72
+ sourceSessionId: string;
73
+ /** Source seat's cwd at snapshot time. null when the manifest predates
74
+ * source_cwd support (back-compat surface). Consumed
75
+ * by the Use-as-starter snippet generator. */
76
+ sourceCwd: string | null;
77
+ notes: string | null;
78
+ createdAt: string;
79
+ sourceType: AgentImageSourceType;
80
+ /** Absolute path to the image directory. */
81
+ sourcePath: string;
82
+ /** Path relative to the discovery root that found this image. */
83
+ relativePath: string;
84
+ /** Most-recent mtime under the image dir. */
85
+ updatedAt: string;
86
+ manifestEstimatedTokens: number | null;
87
+ derivedEstimatedTokens: number;
88
+ files: AgentImageEntryFile[];
89
+ /** Resume-token surface kept separate from manifest data so the
90
+ * library/list/get routes can omit it when the operator is browsing
91
+ * but include it when the consumer is the instantiator. */
92
+ sourceResumeToken: string;
93
+ stats: AgentImageStats;
94
+ lineage: string[];
95
+ /** True when an explicit `pin` file exists at <sourcePath>/.pinned.
96
+ * Pinned images are protected from `prune` regardless of active-
97
+ * reference scan results. */
98
+ pinned: boolean;
99
+ }
100
+ export interface AgentImageEntryFile {
101
+ path: string;
102
+ role: string;
103
+ summary: string | null;
104
+ absolutePath: string | null;
105
+ bytes: number | null;
106
+ estimatedTokens: number | null;
107
+ }
108
+ export declare class AgentImageError extends Error {
109
+ readonly code: "manifest_missing" | "manifest_parse_error" | "manifest_invalid" | "image_not_found" | "image_referenced" | "image_pinned" | "runtime_mismatch" | "stats_write_failed";
110
+ readonly details?: Record<string, unknown> | undefined;
111
+ constructor(code: "manifest_missing" | "manifest_parse_error" | "manifest_invalid" | "image_not_found" | "image_referenced" | "image_pinned" | "runtime_mismatch" | "stats_write_failed", message: string, details?: Record<string, unknown> | undefined);
112
+ }
113
+ //# sourceMappingURL=agent-image-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-image-types.d.ts","sourceRoot":"","sources":["../../../src/domain/agent-images/agent-image-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ // Fork Primitive + Starter Agent Images v0 (PL-016) — typed primitive
2
+ // parallel to skills + workflow_specs + context_packs (PL-014).
3
+ //
4
+ // An agent_image is a snapshot bundle of a productive seat's
5
+ // resumable state — runtime-specific resume token (Claude resume_token
6
+ // / Codex thread_id), source-seat lineage, optional cwd-deltas + notes
7
+ // — surfaced in the Specs library and consumable by AgentSpec
8
+ // `session_source: mode: agent_image, ref: { kind: image_name, ... }`.
9
+ // Storage at ~/.openrig/agent-images/<name>/ + workspace-local
10
+ // .openrig/agent-images/<name>/.
11
+ //
12
+ // MVP single-host context: filesystem-canonical; NO new SQLite tables;
13
+ // library cache is in-memory at the daemon scope.
14
+ export class AgentImageError extends Error {
15
+ code;
16
+ details;
17
+ constructor(code, message, details) {
18
+ super(message);
19
+ this.code = code;
20
+ this.details = details;
21
+ this.name = "AgentImageError";
22
+ }
23
+ }
24
+ //# sourceMappingURL=agent-image-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-image-types.js","sourceRoot":"","sources":["../../../src/domain/agent-images/agent-image-types.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,gEAAgE;AAChE,EAAE;AACF,6DAA6D;AAC7D,uEAAuE;AACvE,uEAAuE;AACvE,8DAA8D;AAC9D,uEAAuE;AACvE,+DAA+D;AAC/D,iCAAiC;AACjC,EAAE;AACF,uEAAuE;AACvE,kDAAkD;AAoHlD,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAEtB;IAUA;IAXlB,YACkB,IAQQ,EACxB,OAAe,EACC,OAAiC;QAEjD,KAAK,CAAC,OAAO,CAAC,CAAC;QAZC,SAAI,GAAJ,IAAI,CAQI;QAER,YAAO,GAAP,OAAO,CAA0B;QAGjD,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF"}
@@ -0,0 +1,26 @@
1
+ import type { AgentImageEntry } from "./agent-image-types.js";
2
+ export type ProtectionReason = "pinned" | "referenced_by_agent_spec" | "referenced_by_rig_spec" | "lineage_descendant_of_protected";
3
+ export interface ImageProtectionStatus {
4
+ imageId: string;
5
+ imageName: string;
6
+ imageVersion: string;
7
+ protected: boolean;
8
+ reasons: ProtectionReason[];
9
+ /** Specific filesystem paths that hold the protective references. */
10
+ references: string[];
11
+ }
12
+ export interface EvidenceGuardOpts {
13
+ /** All images in the library (so lineage-based protection can
14
+ * traverse the chain without re-walking discovery roots). */
15
+ images: readonly AgentImageEntry[];
16
+ /** Spec-library directories to walk for active references. Each is
17
+ * walked recursively for `*.yaml` / `*.yml` files. */
18
+ specRoots: readonly string[];
19
+ }
20
+ /**
21
+ * Compute protection status for every image. The result is parallel to
22
+ * the input array order; the protected image set is what `prune` MUST
23
+ * skip unless --force is supplied.
24
+ */
25
+ export declare function evaluateProtection(opts: EvidenceGuardOpts): ImageProtectionStatus[];
26
+ //# sourceMappingURL=evidence-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence-guard.d.ts","sourceRoot":"","sources":["../../../src/domain/agent-images/evidence-guard.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,MAAM,gBAAgB,GACxB,QAAQ,GACR,0BAA0B,GAC1B,wBAAwB,GACxB,iCAAiC,CAAC;AAEtC,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,qEAAqE;IACrE,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC;kEAC8D;IAC9D,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IACnC;2DACuD;IACvD,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,GAAG,qBAAqB,EAAE,CA8DnF"}
@@ -0,0 +1,185 @@
1
+ // Fork Primitive + Starter Agent Images v0 (PL-016) — evidence-
2
+ // preservation guard for `rig agent-image prune` / DELETE
3
+ // /api/agent-images/library/:id.
4
+ //
5
+ // PRD § Item 6 — CATASTROPHIC BOUNCE if dropped. An image is protected
6
+ // from deletion if ANY:
7
+ //
8
+ // - Pinned (operator placed `.pinned` sentinel via `rig agent-image pin`)
9
+ // - Referenced by an active agent.yaml (session_source: mode:
10
+ // agent_image, ref.value: <name>) — scanned across discovery roots
11
+ // for spec library files
12
+ // - Referenced by a rig spec in the spec library (members[].session_source)
13
+ // - Lineage descendant of another protected image (transitive
14
+ // protection up the chain)
15
+ //
16
+ // The guard fails CLOSED. Operator may pass --force to override.
17
+ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
18
+ import { join } from "node:path";
19
+ import { parse as parseYaml } from "yaml";
20
+ /**
21
+ * Compute protection status for every image. The result is parallel to
22
+ * the input array order; the protected image set is what `prune` MUST
23
+ * skip unless --force is supplied.
24
+ */
25
+ export function evaluateProtection(opts) {
26
+ const referencedNames = scanSpecRootsForReferences(opts.specRoots);
27
+ // Pass 1: compute direct protection (pinned + referenced).
28
+ const statuses = new Map();
29
+ const protectedNameSet = new Set();
30
+ for (const img of opts.images) {
31
+ const refs = referencedNames.get(img.name) ?? [];
32
+ const reasons = [];
33
+ if (img.pinned)
34
+ reasons.push("pinned");
35
+ // Distinguish agent.yaml-shaped vs rig.yaml-shaped references when
36
+ // both surface; but the scanner returns paths, and the path-based
37
+ // tag is stored alongside. Simplification at v0: any file whose
38
+ // basename is `agent.yaml` is agent-spec; otherwise rig-spec.
39
+ const seenReason = new Set();
40
+ for (const ref of refs) {
41
+ const reason = ref.endsWith("/agent.yaml")
42
+ ? "referenced_by_agent_spec"
43
+ : "referenced_by_rig_spec";
44
+ if (!seenReason.has(reason)) {
45
+ reasons.push(reason);
46
+ seenReason.add(reason);
47
+ }
48
+ }
49
+ const status = {
50
+ imageId: img.id,
51
+ imageName: img.name,
52
+ imageVersion: img.version,
53
+ protected: reasons.length > 0,
54
+ reasons,
55
+ references: refs,
56
+ };
57
+ statuses.set(img.name, status);
58
+ if (status.protected)
59
+ protectedNameSet.add(img.name);
60
+ }
61
+ // Pass 2: transitive lineage protection. An image whose lineage
62
+ // includes a protected image becomes protected too. Iterate to a
63
+ // fixed point so multi-hop chains converge.
64
+ let changed = true;
65
+ while (changed) {
66
+ changed = false;
67
+ for (const img of opts.images) {
68
+ const status = statuses.get(img.name);
69
+ if (status.protected)
70
+ continue;
71
+ // img's lineage lists ANCESTORS. We protect a DESCENDANT of a
72
+ // protected image — meaning if any ancestor of `img` is
73
+ // protected, `img` itself becomes protected by transit.
74
+ for (const ancestor of img.lineage) {
75
+ if (protectedNameSet.has(ancestor)) {
76
+ status.protected = true;
77
+ status.reasons.push("lineage_descendant_of_protected");
78
+ status.references.push(`lineage-of:${ancestor}`);
79
+ protectedNameSet.add(img.name);
80
+ changed = true;
81
+ break;
82
+ }
83
+ }
84
+ }
85
+ }
86
+ return opts.images.map((img) => statuses.get(img.name));
87
+ }
88
+ /** Walk spec-library roots for YAML files and collect file paths that
89
+ * reference any agent_image by name. The match is conservative: any
90
+ * YAML that contains a `mode: agent_image` directive WITH a
91
+ * `value: <name>` field is treated as a reference. False positives are
92
+ * acceptable (over-protection); false negatives would cause
93
+ * catastrophic data loss. */
94
+ function scanSpecRootsForReferences(roots) {
95
+ const out = new Map();
96
+ for (const root of roots) {
97
+ if (!existsSync(root))
98
+ continue;
99
+ walkYaml(root, (absPath) => {
100
+ let raw;
101
+ try {
102
+ raw = readFileSync(absPath, "utf-8");
103
+ }
104
+ catch {
105
+ return;
106
+ }
107
+ if (!raw.includes("agent_image"))
108
+ return;
109
+ let parsed;
110
+ try {
111
+ parsed = parseYaml(raw);
112
+ }
113
+ catch {
114
+ return;
115
+ }
116
+ const refs = collectImageRefs(parsed);
117
+ for (const name of refs) {
118
+ const existing = out.get(name) ?? [];
119
+ existing.push(absPath);
120
+ out.set(name, existing);
121
+ }
122
+ });
123
+ }
124
+ return out;
125
+ }
126
+ function walkYaml(root, visit) {
127
+ const stack = [root];
128
+ while (stack.length > 0) {
129
+ const current = stack.pop();
130
+ let entries;
131
+ try {
132
+ entries = readdirSync(current, { withFileTypes: true });
133
+ }
134
+ catch {
135
+ continue;
136
+ }
137
+ for (const entry of entries) {
138
+ const abs = join(current, entry.name);
139
+ if (entry.isDirectory()) {
140
+ stack.push(abs);
141
+ }
142
+ else if (entry.isFile() && (entry.name.endsWith(".yaml") || entry.name.endsWith(".yml"))) {
143
+ try {
144
+ if (statSync(abs).size > 5_000_000)
145
+ continue; // skip suspiciously large YAML files
146
+ }
147
+ catch {
148
+ continue;
149
+ }
150
+ visit(abs);
151
+ }
152
+ }
153
+ }
154
+ }
155
+ /** Recursively walk a parsed YAML tree and collect the `value` of any
156
+ * `session_source: { mode: agent_image, ref: { kind: image_name, value: <name> } }`. */
157
+ function collectImageRefs(node, acc = new Set()) {
158
+ if (!node || typeof node !== "object")
159
+ return acc;
160
+ if (Array.isArray(node)) {
161
+ for (const item of node)
162
+ collectImageRefs(item, acc);
163
+ return acc;
164
+ }
165
+ const obj = node;
166
+ // Match shape: session_source: { mode: agent_image, ref: { value: <name> } }
167
+ const ss = obj["session_source"] ?? obj["sessionSource"];
168
+ if (ss && typeof ss === "object" && !Array.isArray(ss)) {
169
+ const ssObj = ss;
170
+ if (ssObj["mode"] === "agent_image") {
171
+ const ref = ssObj["ref"];
172
+ if (ref && typeof ref === "object" && !Array.isArray(ref)) {
173
+ const value = ref["value"];
174
+ if (typeof value === "string" && value.length > 0)
175
+ acc.add(value);
176
+ }
177
+ }
178
+ }
179
+ // Recurse into all values regardless — a rig.yaml has session_source
180
+ // nested inside members[].
181
+ for (const v of Object.values(obj))
182
+ collectImageRefs(v, acc);
183
+ return acc;
184
+ }
185
+ //# sourceMappingURL=evidence-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence-guard.js","sourceRoot":"","sources":["../../../src/domain/agent-images/evidence-guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type AgentImageManifest } from "./agent-image-types.js";
2
+ export declare function parseAgentImageManifest(rawYaml: string, sourcePath: string): AgentImageManifest;
3
+ //# sourceMappingURL=manifest-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-parser.d.ts","sourceRoot":"","sources":["../../../src/domain/agent-images/manifest-parser.ts"],"names":[],"mappings":"AAQA,OAAO,EAEL,KAAK,kBAAkB,EAGxB,MAAM,wBAAwB,CAAC;AAKhC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,kBAAkB,CAoK/F"}
@@ -0,0 +1,114 @@
1
+ // Fork Primitive + Starter Agent Images v0 (PL-016) — manifest parser.
2
+ //
3
+ // Parses ~/.openrig/agent-images/<name>/manifest.yaml into a typed
4
+ // AgentImageManifest. Pure (no fs touches in the parser; caller hands
5
+ // in raw YAML). Validation guards: required field checks, runtime
6
+ // allow-list, path-traversal rejection on supplementary files.
7
+ import { parse as parseYaml } from "yaml";
8
+ import { AgentImageError, } from "./agent-image-types.js";
9
+ const ALLOWED_RUNTIMES = new Set(["claude-code", "codex"]);
10
+ const ALLOWED_FILE_SUFFIXES = [".md", ".markdown", ".yaml", ".yml", ".txt", ".json"];
11
+ export function parseAgentImageManifest(rawYaml, sourcePath) {
12
+ let parsed;
13
+ try {
14
+ parsed = parseYaml(rawYaml);
15
+ }
16
+ catch (err) {
17
+ throw new AgentImageError("manifest_parse_error", `manifest at ${sourcePath} is not valid YAML: ${err.message}`, { sourcePath });
18
+ }
19
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
20
+ throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} must be a YAML object at the root`, { sourcePath });
21
+ }
22
+ const obj = parsed;
23
+ const name = obj["name"];
24
+ if (typeof name !== "string" || name.length === 0) {
25
+ throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} is missing required field 'name'`, { sourcePath });
26
+ }
27
+ const versionRaw = obj["version"];
28
+ if (versionRaw === undefined || versionRaw === null) {
29
+ throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} is missing required field 'version'`, { sourcePath });
30
+ }
31
+ const version = String(versionRaw);
32
+ const runtime = obj["runtime"];
33
+ if (typeof runtime !== "string" || !ALLOWED_RUNTIMES.has(runtime)) {
34
+ throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} has invalid runtime '${runtime}'; allowed: ${[...ALLOWED_RUNTIMES].join(", ")}`, { sourcePath, runtime });
35
+ }
36
+ // Source seat / session id / resume token are required on a real
37
+ // image. The PRD's v0 manifest schema reads these as load-bearing —
38
+ // an image without a resume token can't be consumed.
39
+ const sourceSeatRaw = obj["source_seat"] ?? obj["sourceSeat"];
40
+ if (typeof sourceSeatRaw !== "string" || sourceSeatRaw.length === 0) {
41
+ throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} is missing required field 'source_seat'`, { sourcePath });
42
+ }
43
+ const sourceSessionIdRaw = obj["source_session_id"] ?? obj["sourceSessionId"];
44
+ if (typeof sourceSessionIdRaw !== "string" || sourceSessionIdRaw.length === 0) {
45
+ throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} is missing required field 'source_session_id'`, { sourcePath });
46
+ }
47
+ const sourceResumeTokenRaw = obj["source_resume_token"] ?? obj["sourceResumeToken"];
48
+ if (typeof sourceResumeTokenRaw !== "string" || sourceResumeTokenRaw.length === 0) {
49
+ throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} is missing required field 'source_resume_token'`, { sourcePath });
50
+ }
51
+ const createdAtRaw = obj["created_at"] ?? obj["createdAt"];
52
+ const createdAt = typeof createdAtRaw === "string" && createdAtRaw.length > 0
53
+ ? createdAtRaw
54
+ : new Date(0).toISOString();
55
+ const notes = typeof obj["notes"] === "string" ? obj["notes"] : undefined;
56
+ // PL-016 source-cwd behavior: optional
57
+ // source_cwd captured at snapshot time. Manifests authored before this
58
+ // fix omit the field; consumers fall back to "no cwd line" rendering
59
+ // (back-compat).
60
+ const sourceCwdRaw = obj["source_cwd"] ?? obj["sourceCwd"];
61
+ const sourceCwd = typeof sourceCwdRaw === "string" && sourceCwdRaw.length > 0
62
+ ? sourceCwdRaw
63
+ : undefined;
64
+ const filesRaw = obj["files"];
65
+ const files = [];
66
+ if (Array.isArray(filesRaw)) {
67
+ for (let i = 0; i < filesRaw.length; i++) {
68
+ const f = filesRaw[i];
69
+ if (!f || typeof f !== "object" || Array.isArray(f)) {
70
+ throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} has malformed entry at files[${i}] (must be object with path + role)`, { sourcePath, index: i });
71
+ }
72
+ const fr = f;
73
+ const path = fr["path"];
74
+ if (typeof path !== "string" || path.length === 0) {
75
+ throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} files[${i}] missing 'path'`, { sourcePath, index: i });
76
+ }
77
+ if (path.includes("..") || path.startsWith("/")) {
78
+ throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} files[${i}].path '${path}' must be a relative path inside the image (no '..', no leading '/')`, { sourcePath, index: i, path });
79
+ }
80
+ if (!ALLOWED_FILE_SUFFIXES.some((s) => path.endsWith(s))) {
81
+ throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} files[${i}].path '${path}' has unsupported suffix; allowed: ${ALLOWED_FILE_SUFFIXES.join(", ")}`, { sourcePath, index: i, path });
82
+ }
83
+ const role = fr["role"];
84
+ if (typeof role !== "string" || role.length === 0) {
85
+ throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} files[${i}] missing 'role'`, { sourcePath, index: i, path });
86
+ }
87
+ const summary = typeof fr["summary"] === "string" ? fr["summary"] : undefined;
88
+ files.push(summary === undefined ? { path, role } : { path, role, summary });
89
+ }
90
+ }
91
+ const estimatedTokensRaw = obj["estimated_tokens"] ?? obj["estimatedTokens"];
92
+ const estimatedTokens = typeof estimatedTokensRaw === "number" && Number.isFinite(estimatedTokensRaw)
93
+ ? Math.max(0, Math.floor(estimatedTokensRaw))
94
+ : undefined;
95
+ const lineageRaw = obj["lineage"];
96
+ const lineage = Array.isArray(lineageRaw)
97
+ ? lineageRaw.filter((l) => typeof l === "string" && l.length > 0)
98
+ : undefined;
99
+ return {
100
+ name,
101
+ version,
102
+ runtime: runtime,
103
+ sourceSeat: sourceSeatRaw,
104
+ sourceSessionId: sourceSessionIdRaw,
105
+ sourceResumeToken: sourceResumeTokenRaw,
106
+ ...(sourceCwd !== undefined ? { sourceCwd } : {}),
107
+ createdAt,
108
+ ...(notes !== undefined ? { notes } : {}),
109
+ files,
110
+ ...(estimatedTokens !== undefined ? { estimatedTokens } : {}),
111
+ ...(lineage !== undefined ? { lineage } : {}),
112
+ };
113
+ }
114
+ //# sourceMappingURL=manifest-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-parser.js","sourceRoot":"","sources":["../../../src/domain/agent-images/manifest-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type Database from "better-sqlite3";
2
+ export type DiscoveryRuntime = "claude-code" | "codex";
3
+ export interface DiscoveryResult {
4
+ runtime: DiscoveryRuntime;
5
+ /** Native conversation id (Claude resume_token / Codex thread_id /
6
+ * external_session_name for external-CLI Codex seats). null when
7
+ * the daemon can't surface one yet. */
8
+ nativeId: string | null;
9
+ /** PL-016 source-cwd behavior: source
10
+ * seat's resolved cwd from the nodes table. Captured here so
11
+ * SnapshotCapturer (and any future fork route) can persist it on
12
+ * the manifest without an additional query. null when the source
13
+ * node has no recorded cwd. */
14
+ nodeCwd: string | null;
15
+ }
16
+ export interface DiscoveryFailure {
17
+ code: "session_not_found" | "runtime_unsupported";
18
+ message: string;
19
+ }
20
+ export type DiscoveryOutcome = {
21
+ ok: true;
22
+ result: DiscoveryResult;
23
+ } | {
24
+ ok: false;
25
+ failure: DiscoveryFailure;
26
+ };
27
+ export declare function discoverResumeToken(db: Database.Database, sourceSession: string): DiscoveryOutcome;
28
+ //# sourceMappingURL=resume-token-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume-token-discovery.d.ts","sourceRoot":"","sources":["../../../src/domain/agent-images/resume-token-discovery.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,OAAO,CAAC;AAEvD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,gBAAgB,CAAC;IAC1B;;4CAEwC;IACxC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;;;;oCAIgC;IAChC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,mBAAmB,GAAG,qBAAqB,CAAC;IAClD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAEhH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,GAAG,gBAAgB,CAgDlG"}
@@ -0,0 +1,83 @@
1
+ // Fork Primitive + Starter Agent Images v0 (PL-016) — runtime-specific
2
+ // resume-token discovery.
3
+ //
4
+ // Given a canonical session name, returns the native conversation id
5
+ // the runtime uses for fork/resume. Shared between SnapshotCapturer
6
+ // (capture into image) and the /api/agent-images/fork route (one-shot
7
+ // fork without snapshot side effect).
8
+ //
9
+ // Honest failure mode: returns null when no token is available rather
10
+ // than fabricating one (architecture.md § Resume honesty).
11
+ export function discoverResumeToken(db, sourceSession) {
12
+ const sessionRow = db
13
+ .prepare("SELECT id, node_id, resume_token FROM sessions WHERE session_name = ? ORDER BY id DESC LIMIT 1")
14
+ .get(sourceSession);
15
+ if (!sessionRow) {
16
+ return {
17
+ ok: false,
18
+ failure: {
19
+ code: "session_not_found",
20
+ message: `Source session '${sourceSession}' not found. Run 'rig ps --nodes' to see what's running.`,
21
+ },
22
+ };
23
+ }
24
+ const nodeRow = db
25
+ .prepare("SELECT runtime, cwd FROM nodes WHERE id = ?")
26
+ .get(sessionRow.node_id);
27
+ const runtime = nodeRow?.runtime ?? null;
28
+ const nodeCwd = nodeRow?.cwd ?? null;
29
+ if (runtime !== "claude-code" && runtime !== "codex") {
30
+ return {
31
+ ok: false,
32
+ failure: {
33
+ code: "runtime_unsupported",
34
+ message: `Source session '${sourceSession}' has runtime '${runtime ?? "(unknown)"}' which has no native fork primitive. Only claude-code and codex sessions can be forked.`,
35
+ },
36
+ };
37
+ }
38
+ if (runtime === "claude-code") {
39
+ const contextSessionId = discoverClaudeContextSessionId(db, sessionRow.node_id, sourceSession);
40
+ return {
41
+ ok: true,
42
+ result: { runtime, nativeId: contextSessionId ?? sessionRow.resume_token ?? null, nodeCwd },
43
+ };
44
+ }
45
+ // Codex managed tmux seats persist the captured native thread id on the
46
+ // sessions row after launch. Use it directly for image capture/fork.
47
+ if (sessionRow.resume_token) {
48
+ return { ok: true, result: { runtime, nativeId: sessionRow.resume_token, nodeCwd } };
49
+ }
50
+ // Codex external_cli seats may not have a sessions.resume_token; the
51
+ // external_session_name on the binding row holds the native conversation id.
52
+ const bindingRow = db
53
+ .prepare("SELECT external_session_name, attachment_type FROM bindings WHERE node_id = ?")
54
+ .get(sessionRow.node_id);
55
+ if (bindingRow?.attachment_type === "external_cli" && bindingRow.external_session_name) {
56
+ return { ok: true, result: { runtime, nativeId: bindingRow.external_session_name, nodeCwd } };
57
+ }
58
+ return { ok: true, result: { runtime, nativeId: null, nodeCwd } };
59
+ }
60
+ function discoverClaudeContextSessionId(db, nodeId, sourceSession) {
61
+ try {
62
+ const row = db
63
+ .prepare(`
64
+ SELECT session_id, session_name
65
+ FROM context_usage
66
+ WHERE node_id = ?
67
+ LIMIT 1
68
+ `)
69
+ .get(nodeId);
70
+ if (!row)
71
+ return null;
72
+ if (row.session_name && row.session_name !== sourceSession)
73
+ return null;
74
+ const nativeId = row.session_id?.trim();
75
+ return nativeId ? nativeId : null;
76
+ }
77
+ catch {
78
+ // Back-compat for minimal test DBs or older stores: fall back to the
79
+ // persisted sessions.resume_token rather than making discovery fail.
80
+ return null;
81
+ }
82
+ }
83
+ //# sourceMappingURL=resume-token-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume-token-discovery.js","sourceRoot":"","sources":["../../../src/domain/agent-images/resume-token-discovery.ts"],"names":[],"mappings":"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"}