@openrig/cli 0.0.1 → 0.1.1

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 (846) hide show
  1. package/daemon/assets/claude-statusline-context.cjs +80 -0
  2. package/daemon/assets/guidance/using-openrig.md +46 -0
  3. package/daemon/dist/adapters/claude-code-adapter.d.ts +67 -0
  4. package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -0
  5. package/daemon/dist/adapters/claude-code-adapter.js +317 -0
  6. package/daemon/dist/adapters/claude-code-adapter.js.map +1 -0
  7. package/daemon/dist/adapters/claude-resume.d.ts +23 -0
  8. package/daemon/dist/adapters/claude-resume.d.ts.map +1 -0
  9. package/daemon/dist/adapters/claude-resume.js +90 -0
  10. package/daemon/dist/adapters/claude-resume.js.map +1 -0
  11. package/daemon/dist/adapters/cmux-transport.d.ts +9 -0
  12. package/daemon/dist/adapters/cmux-transport.d.ts.map +1 -0
  13. package/daemon/dist/adapters/cmux-transport.js +64 -0
  14. package/daemon/dist/adapters/cmux-transport.js.map +1 -0
  15. package/daemon/dist/adapters/cmux.d.ts +50 -0
  16. package/daemon/dist/adapters/cmux.d.ts.map +1 -0
  17. package/daemon/dist/adapters/cmux.js +144 -0
  18. package/daemon/dist/adapters/cmux.js.map +1 -0
  19. package/daemon/dist/adapters/codex-resume.d.ts +10 -0
  20. package/daemon/dist/adapters/codex-resume.d.ts.map +1 -0
  21. package/daemon/dist/adapters/codex-resume.js +44 -0
  22. package/daemon/dist/adapters/codex-resume.js.map +1 -0
  23. package/daemon/dist/adapters/codex-runtime-adapter.d.ts +53 -0
  24. package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -0
  25. package/daemon/dist/adapters/codex-runtime-adapter.js +255 -0
  26. package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -0
  27. package/daemon/dist/adapters/shell-quote.d.ts +3 -0
  28. package/daemon/dist/adapters/shell-quote.d.ts.map +1 -0
  29. package/daemon/dist/adapters/shell-quote.js +5 -0
  30. package/daemon/dist/adapters/shell-quote.js.map +1 -0
  31. package/daemon/dist/adapters/terminal-adapter.d.ts +20 -0
  32. package/daemon/dist/adapters/terminal-adapter.d.ts.map +1 -0
  33. package/daemon/dist/adapters/terminal-adapter.js +25 -0
  34. package/daemon/dist/adapters/terminal-adapter.js.map +1 -0
  35. package/daemon/dist/adapters/tmux-exec.d.ts +7 -0
  36. package/daemon/dist/adapters/tmux-exec.d.ts.map +1 -0
  37. package/daemon/dist/adapters/tmux-exec.js +12 -0
  38. package/daemon/dist/adapters/tmux-exec.js.map +1 -0
  39. package/daemon/dist/adapters/tmux.d.ts +55 -0
  40. package/daemon/dist/adapters/tmux.d.ts.map +1 -0
  41. package/daemon/dist/adapters/tmux.js +244 -0
  42. package/daemon/dist/adapters/tmux.js.map +1 -0
  43. package/daemon/dist/db/connection.d.ts +7 -0
  44. package/daemon/dist/db/connection.d.ts.map +1 -0
  45. package/daemon/dist/db/connection.js +12 -0
  46. package/daemon/dist/db/connection.js.map +1 -0
  47. package/daemon/dist/db/migrate.d.ts +12 -0
  48. package/daemon/dist/db/migrate.d.ts.map +1 -0
  49. package/daemon/dist/db/migrate.js +27 -0
  50. package/daemon/dist/db/migrate.js.map +1 -0
  51. package/daemon/dist/db/migrations/001_core_schema.d.ts +3 -0
  52. package/daemon/dist/db/migrations/001_core_schema.d.ts.map +1 -0
  53. package/daemon/dist/db/migrations/001_core_schema.js +50 -0
  54. package/daemon/dist/db/migrations/001_core_schema.js.map +1 -0
  55. package/daemon/dist/db/migrations/002_bindings_sessions.d.ts +3 -0
  56. package/daemon/dist/db/migrations/002_bindings_sessions.d.ts.map +1 -0
  57. package/daemon/dist/db/migrations/002_bindings_sessions.js +29 -0
  58. package/daemon/dist/db/migrations/002_bindings_sessions.js.map +1 -0
  59. package/daemon/dist/db/migrations/003_events.d.ts +3 -0
  60. package/daemon/dist/db/migrations/003_events.d.ts.map +1 -0
  61. package/daemon/dist/db/migrations/003_events.js +22 -0
  62. package/daemon/dist/db/migrations/003_events.js.map +1 -0
  63. package/daemon/dist/db/migrations/004_snapshots.d.ts +3 -0
  64. package/daemon/dist/db/migrations/004_snapshots.d.ts.map +1 -0
  65. package/daemon/dist/db/migrations/004_snapshots.js +19 -0
  66. package/daemon/dist/db/migrations/004_snapshots.js.map +1 -0
  67. package/daemon/dist/db/migrations/005_checkpoints.d.ts +3 -0
  68. package/daemon/dist/db/migrations/005_checkpoints.d.ts.map +1 -0
  69. package/daemon/dist/db/migrations/005_checkpoints.js +22 -0
  70. package/daemon/dist/db/migrations/005_checkpoints.js.map +1 -0
  71. package/daemon/dist/db/migrations/006_resume_metadata.d.ts +3 -0
  72. package/daemon/dist/db/migrations/006_resume_metadata.d.ts.map +1 -0
  73. package/daemon/dist/db/migrations/006_resume_metadata.js +14 -0
  74. package/daemon/dist/db/migrations/006_resume_metadata.js.map +1 -0
  75. package/daemon/dist/db/migrations/007_node_spec_fields.d.ts +3 -0
  76. package/daemon/dist/db/migrations/007_node_spec_fields.d.ts.map +1 -0
  77. package/daemon/dist/db/migrations/007_node_spec_fields.js +11 -0
  78. package/daemon/dist/db/migrations/007_node_spec_fields.js.map +1 -0
  79. package/daemon/dist/db/migrations/008_packages.d.ts +3 -0
  80. package/daemon/dist/db/migrations/008_packages.d.ts.map +1 -0
  81. package/daemon/dist/db/migrations/008_packages.js +17 -0
  82. package/daemon/dist/db/migrations/008_packages.js.map +1 -0
  83. package/daemon/dist/db/migrations/009_install_journal.d.ts +3 -0
  84. package/daemon/dist/db/migrations/009_install_journal.d.ts.map +1 -0
  85. package/daemon/dist/db/migrations/009_install_journal.js +35 -0
  86. package/daemon/dist/db/migrations/009_install_journal.js.map +1 -0
  87. package/daemon/dist/db/migrations/010_journal_seq.d.ts +3 -0
  88. package/daemon/dist/db/migrations/010_journal_seq.d.ts.map +1 -0
  89. package/daemon/dist/db/migrations/010_journal_seq.js +36 -0
  90. package/daemon/dist/db/migrations/010_journal_seq.js.map +1 -0
  91. package/daemon/dist/db/migrations/011_bootstrap.d.ts +3 -0
  92. package/daemon/dist/db/migrations/011_bootstrap.d.ts.map +1 -0
  93. package/daemon/dist/db/migrations/011_bootstrap.js +43 -0
  94. package/daemon/dist/db/migrations/011_bootstrap.js.map +1 -0
  95. package/daemon/dist/db/migrations/012_discovery.d.ts +3 -0
  96. package/daemon/dist/db/migrations/012_discovery.d.ts.map +1 -0
  97. package/daemon/dist/db/migrations/012_discovery.js +28 -0
  98. package/daemon/dist/db/migrations/012_discovery.js.map +1 -0
  99. package/daemon/dist/db/migrations/013_discovery_fk_fix.d.ts +3 -0
  100. package/daemon/dist/db/migrations/013_discovery_fk_fix.d.ts.map +1 -0
  101. package/daemon/dist/db/migrations/013_discovery_fk_fix.js +37 -0
  102. package/daemon/dist/db/migrations/013_discovery_fk_fix.js.map +1 -0
  103. package/daemon/dist/db/migrations/014_agentspec_reboot.d.ts +3 -0
  104. package/daemon/dist/db/migrations/014_agentspec_reboot.d.ts.map +1 -0
  105. package/daemon/dist/db/migrations/014_agentspec_reboot.js +47 -0
  106. package/daemon/dist/db/migrations/014_agentspec_reboot.js.map +1 -0
  107. package/daemon/dist/db/migrations/015_startup_context.d.ts +3 -0
  108. package/daemon/dist/db/migrations/015_startup_context.d.ts.map +1 -0
  109. package/daemon/dist/db/migrations/015_startup_context.js +15 -0
  110. package/daemon/dist/db/migrations/015_startup_context.js.map +1 -0
  111. package/daemon/dist/db/migrations/016_chat_messages.d.ts +3 -0
  112. package/daemon/dist/db/migrations/016_chat_messages.d.ts.map +1 -0
  113. package/daemon/dist/db/migrations/016_chat_messages.js +17 -0
  114. package/daemon/dist/db/migrations/016_chat_messages.js.map +1 -0
  115. package/daemon/dist/db/migrations/017_pod_namespace.d.ts +3 -0
  116. package/daemon/dist/db/migrations/017_pod_namespace.d.ts.map +1 -0
  117. package/daemon/dist/db/migrations/017_pod_namespace.js +9 -0
  118. package/daemon/dist/db/migrations/017_pod_namespace.js.map +1 -0
  119. package/daemon/dist/db/migrations/018_context_usage.d.ts +3 -0
  120. package/daemon/dist/db/migrations/018_context_usage.d.ts.map +1 -0
  121. package/daemon/dist/db/migrations/018_context_usage.js +23 -0
  122. package/daemon/dist/db/migrations/018_context_usage.js.map +1 -0
  123. package/daemon/dist/db/migrations/019_external_cli_attachment.d.ts +3 -0
  124. package/daemon/dist/db/migrations/019_external_cli_attachment.d.ts.map +1 -0
  125. package/daemon/dist/db/migrations/019_external_cli_attachment.js +8 -0
  126. package/daemon/dist/db/migrations/019_external_cli_attachment.js.map +1 -0
  127. package/daemon/dist/domain/agent-manifest.d.ts +21 -0
  128. package/daemon/dist/domain/agent-manifest.d.ts.map +1 -0
  129. package/daemon/dist/domain/agent-manifest.js +322 -0
  130. package/daemon/dist/domain/agent-manifest.js.map +1 -0
  131. package/daemon/dist/domain/agent-preflight.d.ts +12 -0
  132. package/daemon/dist/domain/agent-preflight.d.ts.map +1 -0
  133. package/daemon/dist/domain/agent-preflight.js +37 -0
  134. package/daemon/dist/domain/agent-preflight.js.map +1 -0
  135. package/daemon/dist/domain/agent-resolver.d.ts +66 -0
  136. package/daemon/dist/domain/agent-resolver.d.ts.map +1 -0
  137. package/daemon/dist/domain/agent-resolver.js +193 -0
  138. package/daemon/dist/domain/agent-resolver.js.map +1 -0
  139. package/daemon/dist/domain/ask-service.d.ts +57 -0
  140. package/daemon/dist/domain/ask-service.d.ts.map +1 -0
  141. package/daemon/dist/domain/ask-service.js +129 -0
  142. package/daemon/dist/domain/ask-service.js.map +1 -0
  143. package/daemon/dist/domain/bootstrap-orchestrator.d.ts +76 -0
  144. package/daemon/dist/domain/bootstrap-orchestrator.d.ts.map +1 -0
  145. package/daemon/dist/domain/bootstrap-orchestrator.js +510 -0
  146. package/daemon/dist/domain/bootstrap-orchestrator.js.map +1 -0
  147. package/daemon/dist/domain/bootstrap-repository.d.ts +23 -0
  148. package/daemon/dist/domain/bootstrap-repository.d.ts.map +1 -0
  149. package/daemon/dist/domain/bootstrap-repository.js +78 -0
  150. package/daemon/dist/domain/bootstrap-repository.js.map +1 -0
  151. package/daemon/dist/domain/bootstrap-types.d.ts +43 -0
  152. package/daemon/dist/domain/bootstrap-types.d.ts.map +1 -0
  153. package/daemon/dist/domain/bootstrap-types.js +2 -0
  154. package/daemon/dist/domain/bootstrap-types.js.map +1 -0
  155. package/daemon/dist/domain/bundle-archive.d.ts +23 -0
  156. package/daemon/dist/domain/bundle-archive.d.ts.map +1 -0
  157. package/daemon/dist/domain/bundle-archive.js +156 -0
  158. package/daemon/dist/domain/bundle-archive.js.map +1 -0
  159. package/daemon/dist/domain/bundle-assembler.d.ts +34 -0
  160. package/daemon/dist/domain/bundle-assembler.d.ts.map +1 -0
  161. package/daemon/dist/domain/bundle-assembler.js +86 -0
  162. package/daemon/dist/domain/bundle-assembler.js.map +1 -0
  163. package/daemon/dist/domain/bundle-integrity.d.ts +30 -0
  164. package/daemon/dist/domain/bundle-integrity.d.ts.map +1 -0
  165. package/daemon/dist/domain/bundle-integrity.js +120 -0
  166. package/daemon/dist/domain/bundle-integrity.js.map +1 -0
  167. package/daemon/dist/domain/bundle-source-resolver.d.ts +44 -0
  168. package/daemon/dist/domain/bundle-source-resolver.d.ts.map +1 -0
  169. package/daemon/dist/domain/bundle-source-resolver.js +158 -0
  170. package/daemon/dist/domain/bundle-source-resolver.js.map +1 -0
  171. package/daemon/dist/domain/bundle-types.d.ts +78 -0
  172. package/daemon/dist/domain/bundle-types.d.ts.map +1 -0
  173. package/daemon/dist/domain/bundle-types.js +218 -0
  174. package/daemon/dist/domain/bundle-types.js.map +1 -0
  175. package/daemon/dist/domain/chat-repository.d.ts +31 -0
  176. package/daemon/dist/domain/chat-repository.d.ts.map +1 -0
  177. package/daemon/dist/domain/chat-repository.js +105 -0
  178. package/daemon/dist/domain/chat-repository.js.map +1 -0
  179. package/daemon/dist/domain/checkpoint-store.d.ts +24 -0
  180. package/daemon/dist/domain/checkpoint-store.d.ts.map +1 -0
  181. package/daemon/dist/domain/checkpoint-store.js +55 -0
  182. package/daemon/dist/domain/checkpoint-store.js.map +1 -0
  183. package/daemon/dist/domain/claim-service.d.ts +68 -0
  184. package/daemon/dist/domain/claim-service.d.ts.map +1 -0
  185. package/daemon/dist/domain/claim-service.js +250 -0
  186. package/daemon/dist/domain/claim-service.js.map +1 -0
  187. package/daemon/dist/domain/codex-thread-id.d.ts +4 -0
  188. package/daemon/dist/domain/codex-thread-id.d.ts.map +1 -0
  189. package/daemon/dist/domain/codex-thread-id.js +65 -0
  190. package/daemon/dist/domain/codex-thread-id.js.map +1 -0
  191. package/daemon/dist/domain/conflict-detector.d.ts +33 -0
  192. package/daemon/dist/domain/conflict-detector.d.ts.map +1 -0
  193. package/daemon/dist/domain/conflict-detector.js +138 -0
  194. package/daemon/dist/domain/conflict-detector.js.map +1 -0
  195. package/daemon/dist/domain/context-monitor.d.ts +30 -0
  196. package/daemon/dist/domain/context-monitor.d.ts.map +1 -0
  197. package/daemon/dist/domain/context-monitor.js +71 -0
  198. package/daemon/dist/domain/context-monitor.js.map +1 -0
  199. package/daemon/dist/domain/context-usage-store.d.ts +58 -0
  200. package/daemon/dist/domain/context-usage-store.d.ts.map +1 -0
  201. package/daemon/dist/domain/context-usage-store.js +195 -0
  202. package/daemon/dist/domain/context-usage-store.js.map +1 -0
  203. package/daemon/dist/domain/demo-rig-selector.d.ts +11 -0
  204. package/daemon/dist/domain/demo-rig-selector.d.ts.map +1 -0
  205. package/daemon/dist/domain/demo-rig-selector.js +21 -0
  206. package/daemon/dist/domain/demo-rig-selector.js.map +1 -0
  207. package/daemon/dist/domain/discovery-coordinator.d.ts +28 -0
  208. package/daemon/dist/domain/discovery-coordinator.d.ts.map +1 -0
  209. package/daemon/dist/domain/discovery-coordinator.js +107 -0
  210. package/daemon/dist/domain/discovery-coordinator.js.map +1 -0
  211. package/daemon/dist/domain/discovery-repository.d.ts +31 -0
  212. package/daemon/dist/domain/discovery-repository.d.ts.map +1 -0
  213. package/daemon/dist/domain/discovery-repository.js +75 -0
  214. package/daemon/dist/domain/discovery-repository.js.map +1 -0
  215. package/daemon/dist/domain/discovery-types.d.ts +27 -0
  216. package/daemon/dist/domain/discovery-types.d.ts.map +1 -0
  217. package/daemon/dist/domain/discovery-types.js +2 -0
  218. package/daemon/dist/domain/discovery-types.js.map +1 -0
  219. package/daemon/dist/domain/draft-rig-generator.d.ts +7 -0
  220. package/daemon/dist/domain/draft-rig-generator.d.ts.map +1 -0
  221. package/daemon/dist/domain/draft-rig-generator.js +87 -0
  222. package/daemon/dist/domain/draft-rig-generator.js.map +1 -0
  223. package/daemon/dist/domain/errors.d.ts +4 -0
  224. package/daemon/dist/domain/errors.d.ts.map +1 -0
  225. package/daemon/dist/domain/errors.js +7 -0
  226. package/daemon/dist/domain/errors.js.map +1 -0
  227. package/daemon/dist/domain/event-bus.d.ts +32 -0
  228. package/daemon/dist/domain/event-bus.d.ts.map +1 -0
  229. package/daemon/dist/domain/event-bus.js +82 -0
  230. package/daemon/dist/domain/event-bus.js.map +1 -0
  231. package/daemon/dist/domain/external-install-executor.d.ts +47 -0
  232. package/daemon/dist/domain/external-install-executor.d.ts.map +1 -0
  233. package/daemon/dist/domain/external-install-executor.js +87 -0
  234. package/daemon/dist/domain/external-install-executor.js.map +1 -0
  235. package/daemon/dist/domain/external-install-planner.d.ts +41 -0
  236. package/daemon/dist/domain/external-install-planner.d.ts.map +1 -0
  237. package/daemon/dist/domain/external-install-planner.js +83 -0
  238. package/daemon/dist/domain/external-install-planner.js.map +1 -0
  239. package/daemon/dist/domain/graph-projection.d.ts +60 -0
  240. package/daemon/dist/domain/graph-projection.d.ts.map +1 -0
  241. package/daemon/dist/domain/graph-projection.js +95 -0
  242. package/daemon/dist/domain/graph-projection.js.map +1 -0
  243. package/daemon/dist/domain/history-query.d.ts +34 -0
  244. package/daemon/dist/domain/history-query.d.ts.map +1 -0
  245. package/daemon/dist/domain/history-query.js +119 -0
  246. package/daemon/dist/domain/history-query.js.map +1 -0
  247. package/daemon/dist/domain/install-engine.d.ts +33 -0
  248. package/daemon/dist/domain/install-engine.d.ts.map +1 -0
  249. package/daemon/dist/domain/install-engine.js +154 -0
  250. package/daemon/dist/domain/install-engine.js.map +1 -0
  251. package/daemon/dist/domain/install-planner.d.ts +38 -0
  252. package/daemon/dist/domain/install-planner.d.ts.map +1 -0
  253. package/daemon/dist/domain/install-planner.js +243 -0
  254. package/daemon/dist/domain/install-planner.js.map +1 -0
  255. package/daemon/dist/domain/install-policy.d.ts +20 -0
  256. package/daemon/dist/domain/install-policy.d.ts.map +1 -0
  257. package/daemon/dist/domain/install-policy.js +56 -0
  258. package/daemon/dist/domain/install-policy.js.map +1 -0
  259. package/daemon/dist/domain/install-repository.d.ts +55 -0
  260. package/daemon/dist/domain/install-repository.d.ts.map +1 -0
  261. package/daemon/dist/domain/install-repository.js +122 -0
  262. package/daemon/dist/domain/install-repository.js.map +1 -0
  263. package/daemon/dist/domain/install-verifier.d.ts +31 -0
  264. package/daemon/dist/domain/install-verifier.d.ts.map +1 -0
  265. package/daemon/dist/domain/install-verifier.js +141 -0
  266. package/daemon/dist/domain/install-verifier.js.map +1 -0
  267. package/daemon/dist/domain/native-resume-probe.d.ts +19 -0
  268. package/daemon/dist/domain/native-resume-probe.d.ts.map +1 -0
  269. package/daemon/dist/domain/native-resume-probe.js +113 -0
  270. package/daemon/dist/domain/native-resume-probe.js.map +1 -0
  271. package/daemon/dist/domain/node-inventory.d.ts +33 -0
  272. package/daemon/dist/domain/node-inventory.d.ts.map +1 -0
  273. package/daemon/dist/domain/node-inventory.js +314 -0
  274. package/daemon/dist/domain/node-inventory.js.map +1 -0
  275. package/daemon/dist/domain/node-launcher.d.ts +42 -0
  276. package/daemon/dist/domain/node-launcher.d.ts.map +1 -0
  277. package/daemon/dist/domain/node-launcher.js +122 -0
  278. package/daemon/dist/domain/node-launcher.js.map +1 -0
  279. package/daemon/dist/domain/package-install-service.d.ts +64 -0
  280. package/daemon/dist/domain/package-install-service.d.ts.map +1 -0
  281. package/daemon/dist/domain/package-install-service.js +80 -0
  282. package/daemon/dist/domain/package-install-service.js.map +1 -0
  283. package/daemon/dist/domain/package-manifest.d.ts +93 -0
  284. package/daemon/dist/domain/package-manifest.d.ts.map +1 -0
  285. package/daemon/dist/domain/package-manifest.js +407 -0
  286. package/daemon/dist/domain/package-manifest.js.map +1 -0
  287. package/daemon/dist/domain/package-repository.d.ts +33 -0
  288. package/daemon/dist/domain/package-repository.d.ts.map +1 -0
  289. package/daemon/dist/domain/package-repository.js +63 -0
  290. package/daemon/dist/domain/package-repository.js.map +1 -0
  291. package/daemon/dist/domain/package-resolve-helper.d.ts +19 -0
  292. package/daemon/dist/domain/package-resolve-helper.d.ts.map +1 -0
  293. package/daemon/dist/domain/package-resolve-helper.js +47 -0
  294. package/daemon/dist/domain/package-resolve-helper.js.map +1 -0
  295. package/daemon/dist/domain/package-resolver.d.ts +19 -0
  296. package/daemon/dist/domain/package-resolver.d.ts.map +1 -0
  297. package/daemon/dist/domain/package-resolver.js +35 -0
  298. package/daemon/dist/domain/package-resolver.js.map +1 -0
  299. package/daemon/dist/domain/path-safety.d.ts +8 -0
  300. package/daemon/dist/domain/path-safety.d.ts.map +1 -0
  301. package/daemon/dist/domain/path-safety.js +24 -0
  302. package/daemon/dist/domain/path-safety.js.map +1 -0
  303. package/daemon/dist/domain/pod-bundle-assembler.d.ts +43 -0
  304. package/daemon/dist/domain/pod-bundle-assembler.d.ts.map +1 -0
  305. package/daemon/dist/domain/pod-bundle-assembler.js +198 -0
  306. package/daemon/dist/domain/pod-bundle-assembler.js.map +1 -0
  307. package/daemon/dist/domain/pod-repository.d.ts +47 -0
  308. package/daemon/dist/domain/pod-repository.d.ts.map +1 -0
  309. package/daemon/dist/domain/pod-repository.js +90 -0
  310. package/daemon/dist/domain/pod-repository.js.map +1 -0
  311. package/daemon/dist/domain/profile-resolver.d.ts +51 -0
  312. package/daemon/dist/domain/profile-resolver.d.ts.map +1 -0
  313. package/daemon/dist/domain/profile-resolver.js +201 -0
  314. package/daemon/dist/domain/profile-resolver.js.map +1 -0
  315. package/daemon/dist/domain/projection-planner.d.ts +54 -0
  316. package/daemon/dist/domain/projection-planner.d.ts.map +1 -0
  317. package/daemon/dist/domain/projection-planner.js +128 -0
  318. package/daemon/dist/domain/projection-planner.js.map +1 -0
  319. package/daemon/dist/domain/ps-projection.d.ts +22 -0
  320. package/daemon/dist/domain/ps-projection.d.ts.map +1 -0
  321. package/daemon/dist/domain/ps-projection.js +65 -0
  322. package/daemon/dist/domain/ps-projection.js.map +1 -0
  323. package/daemon/dist/domain/reconciler.d.ts +28 -0
  324. package/daemon/dist/domain/reconciler.d.ts.map +1 -0
  325. package/daemon/dist/domain/reconciler.js +66 -0
  326. package/daemon/dist/domain/reconciler.js.map +1 -0
  327. package/daemon/dist/domain/requirements-probe.d.ts +63 -0
  328. package/daemon/dist/domain/requirements-probe.d.ts.map +1 -0
  329. package/daemon/dist/domain/requirements-probe.js +172 -0
  330. package/daemon/dist/domain/requirements-probe.js.map +1 -0
  331. package/daemon/dist/domain/restore-orchestrator.d.ts +59 -0
  332. package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -0
  333. package/daemon/dist/domain/restore-orchestrator.js +477 -0
  334. package/daemon/dist/domain/restore-orchestrator.js.map +1 -0
  335. package/daemon/dist/domain/resume-metadata-refresher.d.ts +42 -0
  336. package/daemon/dist/domain/resume-metadata-refresher.d.ts.map +1 -0
  337. package/daemon/dist/domain/resume-metadata-refresher.js +167 -0
  338. package/daemon/dist/domain/resume-metadata-refresher.js.map +1 -0
  339. package/daemon/dist/domain/rig-expansion-service.d.ts +27 -0
  340. package/daemon/dist/domain/rig-expansion-service.d.ts.map +1 -0
  341. package/daemon/dist/domain/rig-expansion-service.js +121 -0
  342. package/daemon/dist/domain/rig-expansion-service.js.map +1 -0
  343. package/daemon/dist/domain/rig-lifecycle-service.d.ts +100 -0
  344. package/daemon/dist/domain/rig-lifecycle-service.d.ts.map +1 -0
  345. package/daemon/dist/domain/rig-lifecycle-service.js +421 -0
  346. package/daemon/dist/domain/rig-lifecycle-service.js.map +1 -0
  347. package/daemon/dist/domain/rig-repository.d.ts +44 -0
  348. package/daemon/dist/domain/rig-repository.d.ts.map +1 -0
  349. package/daemon/dist/domain/rig-repository.js +165 -0
  350. package/daemon/dist/domain/rig-repository.js.map +1 -0
  351. package/daemon/dist/domain/rig-teardown.d.ts +51 -0
  352. package/daemon/dist/domain/rig-teardown.d.ts.map +1 -0
  353. package/daemon/dist/domain/rig-teardown.js +142 -0
  354. package/daemon/dist/domain/rig-teardown.js.map +1 -0
  355. package/daemon/dist/domain/rigspec-codec.d.ts +17 -0
  356. package/daemon/dist/domain/rigspec-codec.d.ts.map +1 -0
  357. package/daemon/dist/domain/rigspec-codec.js +141 -0
  358. package/daemon/dist/domain/rigspec-codec.js.map +1 -0
  359. package/daemon/dist/domain/rigspec-exporter.d.ts +21 -0
  360. package/daemon/dist/domain/rigspec-exporter.d.ts.map +1 -0
  361. package/daemon/dist/domain/rigspec-exporter.js +186 -0
  362. package/daemon/dist/domain/rigspec-exporter.js.map +1 -0
  363. package/daemon/dist/domain/rigspec-instantiator.d.ts +133 -0
  364. package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -0
  365. package/daemon/dist/domain/rigspec-instantiator.js +1104 -0
  366. package/daemon/dist/domain/rigspec-instantiator.js.map +1 -0
  367. package/daemon/dist/domain/rigspec-preflight.d.ts +38 -0
  368. package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -0
  369. package/daemon/dist/domain/rigspec-preflight.js +198 -0
  370. package/daemon/dist/domain/rigspec-preflight.js.map +1 -0
  371. package/daemon/dist/domain/rigspec-schema.d.ts +25 -0
  372. package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -0
  373. package/daemon/dist/domain/rigspec-schema.js +516 -0
  374. package/daemon/dist/domain/rigspec-schema.js.map +1 -0
  375. package/daemon/dist/domain/role-resolver.d.ts +21 -0
  376. package/daemon/dist/domain/role-resolver.d.ts.map +1 -0
  377. package/daemon/dist/domain/role-resolver.js +83 -0
  378. package/daemon/dist/domain/role-resolver.js.map +1 -0
  379. package/daemon/dist/domain/runtime-adapter.d.ts +74 -0
  380. package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -0
  381. package/daemon/dist/domain/runtime-adapter.js +14 -0
  382. package/daemon/dist/domain/runtime-adapter.js.map +1 -0
  383. package/daemon/dist/domain/runtime-verifier.d.ts +45 -0
  384. package/daemon/dist/domain/runtime-verifier.d.ts.map +1 -0
  385. package/daemon/dist/domain/runtime-verifier.js +148 -0
  386. package/daemon/dist/domain/runtime-verifier.js.map +1 -0
  387. package/daemon/dist/domain/self-attach-service.d.ts +90 -0
  388. package/daemon/dist/domain/self-attach-service.d.ts.map +1 -0
  389. package/daemon/dist/domain/self-attach-service.js +202 -0
  390. package/daemon/dist/domain/self-attach-service.js.map +1 -0
  391. package/daemon/dist/domain/session-enricher.d.ts +29 -0
  392. package/daemon/dist/domain/session-enricher.d.ts.map +1 -0
  393. package/daemon/dist/domain/session-enricher.js +54 -0
  394. package/daemon/dist/domain/session-enricher.js.map +1 -0
  395. package/daemon/dist/domain/session-fingerprinter.d.ts +53 -0
  396. package/daemon/dist/domain/session-fingerprinter.d.ts.map +1 -0
  397. package/daemon/dist/domain/session-fingerprinter.js +118 -0
  398. package/daemon/dist/domain/session-fingerprinter.js.map +1 -0
  399. package/daemon/dist/domain/session-name.d.ts +28 -0
  400. package/daemon/dist/domain/session-name.d.ts.map +1 -0
  401. package/daemon/dist/domain/session-name.js +85 -0
  402. package/daemon/dist/domain/session-name.js.map +1 -0
  403. package/daemon/dist/domain/session-registry.d.ts +32 -0
  404. package/daemon/dist/domain/session-registry.d.ts.map +1 -0
  405. package/daemon/dist/domain/session-registry.js +142 -0
  406. package/daemon/dist/domain/session-registry.js.map +1 -0
  407. package/daemon/dist/domain/session-transport.d.ts +79 -0
  408. package/daemon/dist/domain/session-transport.d.ts.map +1 -0
  409. package/daemon/dist/domain/session-transport.js +403 -0
  410. package/daemon/dist/domain/session-transport.js.map +1 -0
  411. package/daemon/dist/domain/snapshot-capture.d.ts +27 -0
  412. package/daemon/dist/domain/snapshot-capture.d.ts.map +1 -0
  413. package/daemon/dist/domain/snapshot-capture.js +89 -0
  414. package/daemon/dist/domain/snapshot-capture.js.map +1 -0
  415. package/daemon/dist/domain/snapshot-repository.d.ts +19 -0
  416. package/daemon/dist/domain/snapshot-repository.d.ts.map +1 -0
  417. package/daemon/dist/domain/snapshot-repository.js +77 -0
  418. package/daemon/dist/domain/snapshot-repository.js.map +1 -0
  419. package/daemon/dist/domain/spec-library-service.d.ts +45 -0
  420. package/daemon/dist/domain/spec-library-service.d.ts.map +1 -0
  421. package/daemon/dist/domain/spec-library-service.js +197 -0
  422. package/daemon/dist/domain/spec-library-service.js.map +1 -0
  423. package/daemon/dist/domain/spec-review-service.d.ts +104 -0
  424. package/daemon/dist/domain/spec-review-service.d.ts.map +1 -0
  425. package/daemon/dist/domain/spec-review-service.js +220 -0
  426. package/daemon/dist/domain/spec-review-service.js.map +1 -0
  427. package/daemon/dist/domain/spec-validation-service.d.ts +21 -0
  428. package/daemon/dist/domain/spec-validation-service.d.ts.map +1 -0
  429. package/daemon/dist/domain/spec-validation-service.js +34 -0
  430. package/daemon/dist/domain/spec-validation-service.js.map +1 -0
  431. package/daemon/dist/domain/startup-orchestrator.d.ts +83 -0
  432. package/daemon/dist/domain/startup-orchestrator.d.ts.map +1 -0
  433. package/daemon/dist/domain/startup-orchestrator.js +252 -0
  434. package/daemon/dist/domain/startup-orchestrator.js.map +1 -0
  435. package/daemon/dist/domain/startup-resolver.d.ts +28 -0
  436. package/daemon/dist/domain/startup-resolver.d.ts.map +1 -0
  437. package/daemon/dist/domain/startup-resolver.js +57 -0
  438. package/daemon/dist/domain/startup-resolver.js.map +1 -0
  439. package/daemon/dist/domain/startup-validation.d.ts +31 -0
  440. package/daemon/dist/domain/startup-validation.d.ts.map +1 -0
  441. package/daemon/dist/domain/startup-validation.js +155 -0
  442. package/daemon/dist/domain/startup-validation.js.map +1 -0
  443. package/daemon/dist/domain/tmux-discovery-scanner.d.ts +29 -0
  444. package/daemon/dist/domain/tmux-discovery-scanner.d.ts.map +1 -0
  445. package/daemon/dist/domain/tmux-discovery-scanner.js +50 -0
  446. package/daemon/dist/domain/tmux-discovery-scanner.js.map +1 -0
  447. package/daemon/dist/domain/transcript-capture.d.ts +7 -0
  448. package/daemon/dist/domain/transcript-capture.d.ts.map +1 -0
  449. package/daemon/dist/domain/transcript-capture.js +15 -0
  450. package/daemon/dist/domain/transcript-capture.js.map +1 -0
  451. package/daemon/dist/domain/transcript-store.d.ts +19 -0
  452. package/daemon/dist/domain/transcript-store.d.ts.map +1 -0
  453. package/daemon/dist/domain/transcript-store.js +280 -0
  454. package/daemon/dist/domain/transcript-store.js.map +1 -0
  455. package/daemon/dist/domain/types.d.ts +720 -0
  456. package/daemon/dist/domain/types.d.ts.map +1 -0
  457. package/daemon/dist/domain/types.js +2 -0
  458. package/daemon/dist/domain/types.js.map +1 -0
  459. package/daemon/dist/domain/up-command-router.d.ts +25 -0
  460. package/daemon/dist/domain/up-command-router.d.ts.map +1 -0
  461. package/daemon/dist/domain/up-command-router.js +116 -0
  462. package/daemon/dist/domain/up-command-router.js.map +1 -0
  463. package/daemon/dist/domain/whoami-service.d.ts +86 -0
  464. package/daemon/dist/domain/whoami-service.d.ts.map +1 -0
  465. package/daemon/dist/domain/whoami-service.js +195 -0
  466. package/daemon/dist/domain/whoami-service.js.map +1 -0
  467. package/daemon/dist/index.d.ts +2 -0
  468. package/daemon/dist/index.d.ts.map +1 -0
  469. package/daemon/dist/index.js +21 -0
  470. package/daemon/dist/index.js.map +1 -0
  471. package/daemon/dist/openrig-compat.d.ts +9 -0
  472. package/daemon/dist/openrig-compat.d.ts.map +1 -0
  473. package/daemon/dist/openrig-compat.js +57 -0
  474. package/daemon/dist/openrig-compat.js.map +1 -0
  475. package/daemon/dist/routes/adapters.d.ts +3 -0
  476. package/daemon/dist/routes/adapters.d.ts.map +1 -0
  477. package/daemon/dist/routes/adapters.js +20 -0
  478. package/daemon/dist/routes/adapters.js.map +1 -0
  479. package/daemon/dist/routes/agents.d.ts +3 -0
  480. package/daemon/dist/routes/agents.d.ts.map +1 -0
  481. package/daemon/dist/routes/agents.js +13 -0
  482. package/daemon/dist/routes/agents.js.map +1 -0
  483. package/daemon/dist/routes/ask.d.ts +3 -0
  484. package/daemon/dist/routes/ask.d.ts.map +1 -0
  485. package/daemon/dist/routes/ask.js +15 -0
  486. package/daemon/dist/routes/ask.js.map +1 -0
  487. package/daemon/dist/routes/bootstrap.d.ts +3 -0
  488. package/daemon/dist/routes/bootstrap.d.ts.map +1 -0
  489. package/daemon/dist/routes/bootstrap.js +137 -0
  490. package/daemon/dist/routes/bootstrap.js.map +1 -0
  491. package/daemon/dist/routes/bundles.d.ts +3 -0
  492. package/daemon/dist/routes/bundles.d.ts.map +1 -0
  493. package/daemon/dist/routes/bundles.js +334 -0
  494. package/daemon/dist/routes/bundles.js.map +1 -0
  495. package/daemon/dist/routes/chat.d.ts +3 -0
  496. package/daemon/dist/routes/chat.d.ts.map +1 -0
  497. package/daemon/dist/routes/chat.js +138 -0
  498. package/daemon/dist/routes/chat.js.map +1 -0
  499. package/daemon/dist/routes/discovery.d.ts +3 -0
  500. package/daemon/dist/routes/discovery.d.ts.map +1 -0
  501. package/daemon/dist/routes/discovery.js +200 -0
  502. package/daemon/dist/routes/discovery.js.map +1 -0
  503. package/daemon/dist/routes/down.d.ts +3 -0
  504. package/daemon/dist/routes/down.d.ts.map +1 -0
  505. package/daemon/dist/routes/down.js +55 -0
  506. package/daemon/dist/routes/down.js.map +1 -0
  507. package/daemon/dist/routes/events.d.ts +3 -0
  508. package/daemon/dist/routes/events.d.ts.map +1 -0
  509. package/daemon/dist/routes/events.js +71 -0
  510. package/daemon/dist/routes/events.js.map +1 -0
  511. package/daemon/dist/routes/packages.d.ts +3 -0
  512. package/daemon/dist/routes/packages.d.ts.map +1 -0
  513. package/daemon/dist/routes/packages.js +341 -0
  514. package/daemon/dist/routes/packages.js.map +1 -0
  515. package/daemon/dist/routes/ps.d.ts +3 -0
  516. package/daemon/dist/routes/ps.d.ts.map +1 -0
  517. package/daemon/dist/routes/ps.js +7 -0
  518. package/daemon/dist/routes/ps.js.map +1 -0
  519. package/daemon/dist/routes/rigs.d.ts +3 -0
  520. package/daemon/dist/routes/rigs.d.ts.map +1 -0
  521. package/daemon/dist/routes/rigs.js +329 -0
  522. package/daemon/dist/routes/rigs.js.map +1 -0
  523. package/daemon/dist/routes/rigspec.d.ts +6 -0
  524. package/daemon/dist/routes/rigspec.d.ts.map +1 -0
  525. package/daemon/dist/routes/rigspec.js +182 -0
  526. package/daemon/dist/routes/rigspec.js.map +1 -0
  527. package/daemon/dist/routes/sessions.d.ts +5 -0
  528. package/daemon/dist/routes/sessions.d.ts.map +1 -0
  529. package/daemon/dist/routes/sessions.js +125 -0
  530. package/daemon/dist/routes/sessions.js.map +1 -0
  531. package/daemon/dist/routes/snapshots.d.ts +4 -0
  532. package/daemon/dist/routes/snapshots.d.ts.map +1 -0
  533. package/daemon/dist/routes/snapshots.js +77 -0
  534. package/daemon/dist/routes/snapshots.js.map +1 -0
  535. package/daemon/dist/routes/spec-library.d.ts +3 -0
  536. package/daemon/dist/routes/spec-library.d.ts.map +1 -0
  537. package/daemon/dist/routes/spec-library.js +95 -0
  538. package/daemon/dist/routes/spec-library.js.map +1 -0
  539. package/daemon/dist/routes/spec-review.d.ts +3 -0
  540. package/daemon/dist/routes/spec-review.d.ts.map +1 -0
  541. package/daemon/dist/routes/spec-review.js +41 -0
  542. package/daemon/dist/routes/spec-review.js.map +1 -0
  543. package/daemon/dist/routes/transcripts.d.ts +3 -0
  544. package/daemon/dist/routes/transcripts.d.ts.map +1 -0
  545. package/daemon/dist/routes/transcripts.js +130 -0
  546. package/daemon/dist/routes/transcripts.js.map +1 -0
  547. package/daemon/dist/routes/transport.d.ts +3 -0
  548. package/daemon/dist/routes/transport.d.ts.map +1 -0
  549. package/daemon/dist/routes/transport.js +89 -0
  550. package/daemon/dist/routes/transport.js.map +1 -0
  551. package/daemon/dist/routes/up.d.ts +3 -0
  552. package/daemon/dist/routes/up.d.ts.map +1 -0
  553. package/daemon/dist/routes/up.js +175 -0
  554. package/daemon/dist/routes/up.js.map +1 -0
  555. package/daemon/dist/routes/whoami.d.ts +3 -0
  556. package/daemon/dist/routes/whoami.d.ts.map +1 -0
  557. package/daemon/dist/routes/whoami.js +33 -0
  558. package/daemon/dist/routes/whoami.js.map +1 -0
  559. package/daemon/dist/seed.d.ts +2 -0
  560. package/daemon/dist/seed.d.ts.map +1 -0
  561. package/daemon/dist/seed.js +41 -0
  562. package/daemon/dist/seed.js.map +1 -0
  563. package/daemon/dist/server.d.ts +78 -0
  564. package/daemon/dist/server.d.ts.map +1 -0
  565. package/daemon/dist/server.js +206 -0
  566. package/daemon/dist/server.js.map +1 -0
  567. package/daemon/dist/startup.d.ts +21 -0
  568. package/daemon/dist/startup.d.ts.map +1 -0
  569. package/daemon/dist/startup.js +348 -0
  570. package/daemon/dist/startup.js.map +1 -0
  571. package/daemon/specs/adversarial-review.yaml +40 -0
  572. package/daemon/specs/agents/analyst/agent.yaml +21 -0
  573. package/daemon/specs/agents/analyst/guidance/role.md +27 -0
  574. package/daemon/specs/agents/design/agent.yaml +21 -0
  575. package/daemon/specs/agents/design/guidance/role.md +26 -0
  576. package/daemon/specs/agents/impl/agent.yaml +21 -0
  577. package/daemon/specs/agents/impl/guidance/role.md +27 -0
  578. package/daemon/specs/agents/lead/agent.yaml +21 -0
  579. package/daemon/specs/agents/lead/guidance/role.md +33 -0
  580. package/daemon/specs/agents/qa/agent.yaml +21 -0
  581. package/daemon/specs/agents/qa/guidance/role.md +26 -0
  582. package/daemon/specs/agents/reviewer/agent.yaml +21 -0
  583. package/daemon/specs/agents/reviewer/guidance/role.md +26 -0
  584. package/daemon/specs/agents/synthesizer/agent.yaml +21 -0
  585. package/daemon/specs/agents/synthesizer/guidance/role.md +26 -0
  586. package/daemon/specs/implementation-pair.yaml +27 -0
  587. package/daemon/specs/product-team.yaml +90 -0
  588. package/daemon/specs/research-team.yaml +40 -0
  589. package/dist/bin-wrapper.d.ts +5 -0
  590. package/dist/bin-wrapper.d.ts.map +1 -0
  591. package/dist/bin-wrapper.js +32 -0
  592. package/dist/bin-wrapper.js.map +1 -0
  593. package/dist/client.d.ts +21 -0
  594. package/dist/client.d.ts.map +1 -0
  595. package/dist/client.js +76 -0
  596. package/dist/client.js.map +1 -0
  597. package/dist/commands/adopt.d.ts +6 -0
  598. package/dist/commands/adopt.d.ts.map +1 -0
  599. package/dist/commands/adopt.js +212 -0
  600. package/dist/commands/adopt.js.map +1 -0
  601. package/dist/commands/agent.d.ts +7 -0
  602. package/dist/commands/agent.d.ts.map +1 -0
  603. package/dist/commands/agent.js +79 -0
  604. package/dist/commands/agent.js.map +1 -0
  605. package/dist/commands/ask.d.ts +4 -0
  606. package/dist/commands/ask.d.ts.map +1 -0
  607. package/dist/commands/ask.js +92 -0
  608. package/dist/commands/ask.js.map +1 -0
  609. package/dist/commands/attach.d.ts +14 -0
  610. package/dist/commands/attach.d.ts.map +1 -0
  611. package/dist/commands/attach.js +146 -0
  612. package/dist/commands/attach.js.map +1 -0
  613. package/dist/commands/bind.d.ts +4 -0
  614. package/dist/commands/bind.d.ts.map +1 -0
  615. package/dist/commands/bind.js +70 -0
  616. package/dist/commands/bind.js.map +1 -0
  617. package/dist/commands/bootstrap.d.ts +4 -0
  618. package/dist/commands/bootstrap.d.ts.map +1 -0
  619. package/dist/commands/bootstrap.js +141 -0
  620. package/dist/commands/bootstrap.js.map +1 -0
  621. package/dist/commands/broadcast.d.ts +4 -0
  622. package/dist/commands/broadcast.d.ts.map +1 -0
  623. package/dist/commands/broadcast.js +71 -0
  624. package/dist/commands/broadcast.js.map +1 -0
  625. package/dist/commands/bundle.d.ts +4 -0
  626. package/dist/commands/bundle.d.ts.map +1 -0
  627. package/dist/commands/bundle.js +129 -0
  628. package/dist/commands/bundle.js.map +1 -0
  629. package/dist/commands/capture.d.ts +4 -0
  630. package/dist/commands/capture.d.ts.map +1 -0
  631. package/dist/commands/capture.js +80 -0
  632. package/dist/commands/capture.js.map +1 -0
  633. package/dist/commands/chatroom.d.ts +4 -0
  634. package/dist/commands/chatroom.d.ts.map +1 -0
  635. package/dist/commands/chatroom.js +314 -0
  636. package/dist/commands/chatroom.js.map +1 -0
  637. package/dist/commands/claim.d.ts +4 -0
  638. package/dist/commands/claim.d.ts.map +1 -0
  639. package/dist/commands/claim.js +40 -0
  640. package/dist/commands/claim.js.map +1 -0
  641. package/dist/commands/config.d.ts +3 -0
  642. package/dist/commands/config.d.ts.map +1 -0
  643. package/dist/commands/config.js +74 -0
  644. package/dist/commands/config.js.map +1 -0
  645. package/dist/commands/daemon.d.ts +11 -0
  646. package/dist/commands/daemon.d.ts.map +1 -0
  647. package/dist/commands/daemon.js +167 -0
  648. package/dist/commands/daemon.js.map +1 -0
  649. package/dist/commands/discover.d.ts +4 -0
  650. package/dist/commands/discover.d.ts.map +1 -0
  651. package/dist/commands/discover.js +60 -0
  652. package/dist/commands/discover.js.map +1 -0
  653. package/dist/commands/doctor.d.ts +25 -0
  654. package/dist/commands/doctor.d.ts.map +1 -0
  655. package/dist/commands/doctor.js +155 -0
  656. package/dist/commands/doctor.js.map +1 -0
  657. package/dist/commands/down.d.ts +9 -0
  658. package/dist/commands/down.d.ts.map +1 -0
  659. package/dist/commands/down.js +96 -0
  660. package/dist/commands/down.js.map +1 -0
  661. package/dist/commands/expand.d.ts +4 -0
  662. package/dist/commands/expand.d.ts.map +1 -0
  663. package/dist/commands/expand.js +98 -0
  664. package/dist/commands/expand.js.map +1 -0
  665. package/dist/commands/export.d.ts +7 -0
  666. package/dist/commands/export.d.ts.map +1 -0
  667. package/dist/commands/export.js +46 -0
  668. package/dist/commands/export.js.map +1 -0
  669. package/dist/commands/import.d.ts +7 -0
  670. package/dist/commands/import.d.ts.map +1 -0
  671. package/dist/commands/import.js +157 -0
  672. package/dist/commands/import.js.map +1 -0
  673. package/dist/commands/launch.d.ts +4 -0
  674. package/dist/commands/launch.d.ts.map +1 -0
  675. package/dist/commands/launch.js +45 -0
  676. package/dist/commands/launch.js.map +1 -0
  677. package/dist/commands/mcp.d.ts +9 -0
  678. package/dist/commands/mcp.d.ts.map +1 -0
  679. package/dist/commands/mcp.js +52 -0
  680. package/dist/commands/mcp.js.map +1 -0
  681. package/dist/commands/package.d.ts +4 -0
  682. package/dist/commands/package.d.ts.map +1 -0
  683. package/dist/commands/package.js +234 -0
  684. package/dist/commands/package.js.map +1 -0
  685. package/dist/commands/preflight.d.ts +11 -0
  686. package/dist/commands/preflight.d.ts.map +1 -0
  687. package/dist/commands/preflight.js +53 -0
  688. package/dist/commands/preflight.js.map +1 -0
  689. package/dist/commands/ps.d.ts +9 -0
  690. package/dist/commands/ps.d.ts.map +1 -0
  691. package/dist/commands/ps.js +129 -0
  692. package/dist/commands/ps.js.map +1 -0
  693. package/dist/commands/release.d.ts +4 -0
  694. package/dist/commands/release.d.ts.map +1 -0
  695. package/dist/commands/release.js +69 -0
  696. package/dist/commands/release.js.map +1 -0
  697. package/dist/commands/remove.d.ts +4 -0
  698. package/dist/commands/remove.d.ts.map +1 -0
  699. package/dist/commands/remove.js +43 -0
  700. package/dist/commands/remove.js.map +1 -0
  701. package/dist/commands/requirements.d.ts +4 -0
  702. package/dist/commands/requirements.d.ts.map +1 -0
  703. package/dist/commands/requirements.js +66 -0
  704. package/dist/commands/requirements.js.map +1 -0
  705. package/dist/commands/restore.d.ts +4 -0
  706. package/dist/commands/restore.d.ts.map +1 -0
  707. package/dist/commands/restore.js +57 -0
  708. package/dist/commands/restore.js.map +1 -0
  709. package/dist/commands/rig.d.ts +7 -0
  710. package/dist/commands/rig.d.ts.map +1 -0
  711. package/dist/commands/rig.js +139 -0
  712. package/dist/commands/rig.js.map +1 -0
  713. package/dist/commands/send.d.ts +4 -0
  714. package/dist/commands/send.d.ts.map +1 -0
  715. package/dist/commands/send.js +59 -0
  716. package/dist/commands/send.js.map +1 -0
  717. package/dist/commands/shrink.d.ts +4 -0
  718. package/dist/commands/shrink.d.ts.map +1 -0
  719. package/dist/commands/shrink.js +53 -0
  720. package/dist/commands/shrink.js.map +1 -0
  721. package/dist/commands/snapshot.d.ts +4 -0
  722. package/dist/commands/snapshot.d.ts.map +1 -0
  723. package/dist/commands/snapshot.js +74 -0
  724. package/dist/commands/snapshot.js.map +1 -0
  725. package/dist/commands/specs.d.ts +22 -0
  726. package/dist/commands/specs.d.ts.map +1 -0
  727. package/dist/commands/specs.js +260 -0
  728. package/dist/commands/specs.js.map +1 -0
  729. package/dist/commands/status.d.ts +9 -0
  730. package/dist/commands/status.d.ts.map +1 -0
  731. package/dist/commands/status.js +68 -0
  732. package/dist/commands/status.js.map +1 -0
  733. package/dist/commands/transcript.d.ts +4 -0
  734. package/dist/commands/transcript.d.ts.map +1 -0
  735. package/dist/commands/transcript.js +77 -0
  736. package/dist/commands/transcript.js.map +1 -0
  737. package/dist/commands/ui.d.ts +8 -0
  738. package/dist/commands/ui.d.ts.map +1 -0
  739. package/dist/commands/ui.js +57 -0
  740. package/dist/commands/ui.js.map +1 -0
  741. package/dist/commands/unclaim.d.ts +4 -0
  742. package/dist/commands/unclaim.d.ts.map +1 -0
  743. package/dist/commands/unclaim.js +46 -0
  744. package/dist/commands/unclaim.js.map +1 -0
  745. package/dist/commands/up.d.ts +7 -0
  746. package/dist/commands/up.d.ts.map +1 -0
  747. package/dist/commands/up.js +195 -0
  748. package/dist/commands/up.js.map +1 -0
  749. package/dist/commands/whoami.d.ts +24 -0
  750. package/dist/commands/whoami.d.ts.map +1 -0
  751. package/dist/commands/whoami.js +196 -0
  752. package/dist/commands/whoami.js.map +1 -0
  753. package/dist/config-store.d.ts +23 -0
  754. package/dist/config-store.d.ts.map +1 -0
  755. package/dist/config-store.js +141 -0
  756. package/dist/config-store.js.map +1 -0
  757. package/dist/daemon-lifecycle.d.ts +60 -0
  758. package/dist/daemon-lifecycle.d.ts.map +1 -0
  759. package/dist/daemon-lifecycle.js +225 -0
  760. package/dist/daemon-lifecycle.js.map +1 -0
  761. package/dist/index.d.ts +51 -0
  762. package/dist/index.d.ts.map +1 -0
  763. package/dist/index.js +103 -0
  764. package/dist/index.js.map +1 -0
  765. package/dist/mcp-server.d.ts +9 -0
  766. package/dist/mcp-server.d.ts.map +1 -0
  767. package/dist/mcp-server.js +308 -0
  768. package/dist/mcp-server.js.map +1 -0
  769. package/dist/openrig-compat.d.ts +9 -0
  770. package/dist/openrig-compat.d.ts.map +1 -0
  771. package/dist/openrig-compat.js +57 -0
  772. package/dist/openrig-compat.js.map +1 -0
  773. package/dist/system-preflight.d.ts +36 -0
  774. package/dist/system-preflight.d.ts.map +1 -0
  775. package/dist/system-preflight.js +136 -0
  776. package/dist/system-preflight.js.map +1 -0
  777. package/package.json +46 -3
  778. package/ui/dist/assets/index-B09doO8H.js +139 -0
  779. package/ui/dist/assets/index-CrjgHtlk.js +224 -0
  780. package/ui/dist/assets/index-DGPFTQEV.css +1 -0
  781. package/ui/dist/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
  782. package/ui/dist/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
  783. package/ui/dist/assets/inter-cyrillic-500-normal-BasfLYem.woff2 +0 -0
  784. package/ui/dist/assets/inter-cyrillic-500-normal-CxZf_p3X.woff +0 -0
  785. package/ui/dist/assets/inter-cyrillic-600-normal-4D_pXhcN.woff +0 -0
  786. package/ui/dist/assets/inter-cyrillic-600-normal-CWCymEST.woff2 +0 -0
  787. package/ui/dist/assets/inter-cyrillic-700-normal-CjBOestx.woff2 +0 -0
  788. package/ui/dist/assets/inter-cyrillic-700-normal-DrXBdSj3.woff +0 -0
  789. package/ui/dist/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
  790. package/ui/dist/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
  791. package/ui/dist/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 +0 -0
  792. package/ui/dist/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff +0 -0
  793. package/ui/dist/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff +0 -0
  794. package/ui/dist/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 +0 -0
  795. package/ui/dist/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2 +0 -0
  796. package/ui/dist/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff +0 -0
  797. package/ui/dist/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
  798. package/ui/dist/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
  799. package/ui/dist/assets/inter-greek-500-normal-BIZE56-Y.woff2 +0 -0
  800. package/ui/dist/assets/inter-greek-500-normal-Xzm54t5V.woff +0 -0
  801. package/ui/dist/assets/inter-greek-600-normal-BZpKdvQh.woff +0 -0
  802. package/ui/dist/assets/inter-greek-600-normal-plRanbMR.woff2 +0 -0
  803. package/ui/dist/assets/inter-greek-700-normal-BUv2fZ6O.woff +0 -0
  804. package/ui/dist/assets/inter-greek-700-normal-C3JjAnD8.woff2 +0 -0
  805. package/ui/dist/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
  806. package/ui/dist/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
  807. package/ui/dist/assets/inter-greek-ext-500-normal-2j5mBUwD.woff +0 -0
  808. package/ui/dist/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 +0 -0
  809. package/ui/dist/assets/inter-greek-ext-600-normal-B8X0CLgF.woff +0 -0
  810. package/ui/dist/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 +0 -0
  811. package/ui/dist/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff +0 -0
  812. package/ui/dist/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2 +0 -0
  813. package/ui/dist/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  814. package/ui/dist/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
  815. package/ui/dist/assets/inter-latin-500-normal-BL9OpVg8.woff +0 -0
  816. package/ui/dist/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
  817. package/ui/dist/assets/inter-latin-600-normal-CiBQ2DWP.woff +0 -0
  818. package/ui/dist/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
  819. package/ui/dist/assets/inter-latin-700-normal-BLAVimhd.woff +0 -0
  820. package/ui/dist/assets/inter-latin-700-normal-Yt3aPRUw.woff2 +0 -0
  821. package/ui/dist/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
  822. package/ui/dist/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
  823. package/ui/dist/assets/inter-latin-ext-500-normal-BxGbmqWO.woff +0 -0
  824. package/ui/dist/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2 +0 -0
  825. package/ui/dist/assets/inter-latin-ext-600-normal-CIVaiw4L.woff +0 -0
  826. package/ui/dist/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 +0 -0
  827. package/ui/dist/assets/inter-latin-ext-700-normal-Ca8adRJv.woff2 +0 -0
  828. package/ui/dist/assets/inter-latin-ext-700-normal-TidjK2hL.woff +0 -0
  829. package/ui/dist/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
  830. package/ui/dist/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
  831. package/ui/dist/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
  832. package/ui/dist/assets/inter-vietnamese-500-normal-mJboJaSs.woff +0 -0
  833. package/ui/dist/assets/inter-vietnamese-600-normal-BuLX-rYi.woff +0 -0
  834. package/ui/dist/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
  835. package/ui/dist/assets/inter-vietnamese-700-normal-BZaoP0fm.woff +0 -0
  836. package/ui/dist/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2 +0 -0
  837. package/ui/dist/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
  838. package/ui/dist/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
  839. package/ui/dist/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  840. package/ui/dist/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  841. package/ui/dist/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
  842. package/ui/dist/assets/space-grotesk-latin-ext-wght-normal-D9tNdqV9.woff2 +0 -0
  843. package/ui/dist/assets/space-grotesk-latin-wght-normal-BhU9QXUp.woff2 +0 -0
  844. package/ui/dist/assets/space-grotesk-vietnamese-wght-normal-D0rl6rjA.woff2 +0 -0
  845. package/ui/dist/index.html +14 -0
  846. package/index.js +0 -2
@@ -0,0 +1,1104 @@
1
+ import nodePath from "node:path";
2
+ import { deriveCanonicalSessionName, validateSessionComponents } from "./session-name.js";
3
+ import { LegacyRigSpecSchema as RigSpecSchema } from "./rigspec-schema.js"; // TODO: AS-T08b — migrate to pod-aware RigSpec
4
+ import { LegacyRigSpecCodec as RigSpecCodec } from "./rigspec-codec.js"; // TODO: AS-T08b — migrate to pod-aware RigSpec
5
+ // Only these edge kinds constrain launch order
6
+ const LAUNCH_DEPENDENCY_KINDS = new Set(["delegates_to", "spawned_by"]);
7
+ export class RigInstantiator {
8
+ db;
9
+ rigRepo;
10
+ sessionRegistry;
11
+ eventBus;
12
+ nodeLauncher;
13
+ preflight;
14
+ tmuxAdapter;
15
+ constructor(deps) {
16
+ if (deps.db !== deps.rigRepo.db) {
17
+ throw new Error("RigInstantiator: rigRepo must share the same db handle");
18
+ }
19
+ if (deps.db !== deps.sessionRegistry.db) {
20
+ throw new Error("RigInstantiator: sessionRegistry must share the same db handle");
21
+ }
22
+ if (deps.db !== deps.eventBus.db) {
23
+ throw new Error("RigInstantiator: eventBus must share the same db handle");
24
+ }
25
+ if (deps.db !== deps.nodeLauncher.db) {
26
+ throw new Error("RigInstantiator: nodeLauncher must share the same db handle");
27
+ }
28
+ if (deps.db !== deps.preflight.db) {
29
+ throw new Error("RigInstantiator: preflight must share the same db handle");
30
+ }
31
+ this.db = deps.db;
32
+ this.rigRepo = deps.rigRepo;
33
+ this.sessionRegistry = deps.sessionRegistry;
34
+ this.eventBus = deps.eventBus;
35
+ this.nodeLauncher = deps.nodeLauncher;
36
+ this.preflight = deps.preflight;
37
+ this.tmuxAdapter = deps.tmuxAdapter;
38
+ }
39
+ async instantiate(spec) {
40
+ // 1. Validate
41
+ const raw = RigSpecCodec.parse(RigSpecCodec.serialize(spec));
42
+ const validation = RigSpecSchema.validate(raw);
43
+ if (!validation.valid) {
44
+ return { ok: false, code: "validation_failed", errors: validation.errors };
45
+ }
46
+ // 2. Preflight
47
+ const preflightResult = await this.preflight.check(spec);
48
+ if (!preflightResult.ready) {
49
+ return { ok: false, code: "preflight_failed", errors: preflightResult.errors, warnings: preflightResult.warnings };
50
+ }
51
+ // 3. Compute launch order BEFORE materialization (detect cycles early)
52
+ let launchOrder;
53
+ try {
54
+ launchOrder = this.computeLaunchOrder(spec);
55
+ }
56
+ catch (err) {
57
+ return {
58
+ ok: false,
59
+ code: "instantiate_error",
60
+ message: err instanceof Error ? err.message : String(err),
61
+ };
62
+ }
63
+ // 4. Atomic DB materialization: rig + nodes + edges
64
+ let rigId;
65
+ const nodeIdMap = {}; // logicalId -> DB id
66
+ try {
67
+ const txn = this.db.transaction(() => {
68
+ const rig = this.rigRepo.createRig(spec.name);
69
+ rigId = rig.id;
70
+ for (const specNode of spec.nodes) {
71
+ const node = this.rigRepo.addNode(rig.id, specNode.id, {
72
+ role: specNode.role,
73
+ runtime: specNode.runtime,
74
+ model: specNode.model,
75
+ cwd: specNode.cwd,
76
+ surfaceHint: specNode.surfaceHint,
77
+ workspace: specNode.workspace,
78
+ restorePolicy: specNode.restorePolicy,
79
+ packageRefs: specNode.packageRefs,
80
+ });
81
+ nodeIdMap[specNode.id] = node.id;
82
+ }
83
+ for (const specEdge of spec.edges) {
84
+ this.rigRepo.addEdge(rig.id, nodeIdMap[specEdge.from], nodeIdMap[specEdge.to], specEdge.kind);
85
+ }
86
+ });
87
+ txn();
88
+ }
89
+ catch (err) {
90
+ return {
91
+ ok: false,
92
+ code: "instantiate_error",
93
+ message: err instanceof Error ? err.message : String(err),
94
+ };
95
+ }
96
+ // 5. Launch nodes in topological order
97
+ const nodeResults = [];
98
+ const launchedSessionNames = [];
99
+ const instantiateWarnings = [];
100
+ for (const logicalId of launchOrder) {
101
+ const result = await this.nodeLauncher.launchNode(rigId, logicalId);
102
+ if (result.ok) {
103
+ nodeResults.push({ logicalId, status: "launched" });
104
+ launchedSessionNames.push(result.sessionName);
105
+ if (result.warnings?.length) {
106
+ instantiateWarnings.push(...result.warnings);
107
+ }
108
+ }
109
+ else {
110
+ nodeResults.push({ logicalId, status: "failed", error: result.message });
111
+ }
112
+ }
113
+ // Check for total launch failure — kill orphan sessions and clean up the rig
114
+ const allFailed = nodeResults.every((n) => n.status === "failed");
115
+ if (allFailed && nodeResults.length > 0) {
116
+ // Kill orphan tmux sessions (best-effort)
117
+ if (this.tmuxAdapter) {
118
+ for (const sessionName of launchedSessionNames) {
119
+ try {
120
+ await this.tmuxAdapter.killSession(sessionName);
121
+ }
122
+ catch { /* best-effort */ }
123
+ }
124
+ }
125
+ try {
126
+ this.rigRepo.deleteRig(rigId);
127
+ }
128
+ catch {
129
+ // Best-effort cleanup
130
+ }
131
+ return {
132
+ ok: false,
133
+ code: "instantiate_error",
134
+ message: "all node launches failed",
135
+ };
136
+ }
137
+ // 6. Propagate restorePolicy to session metadata (best-effort)
138
+ try {
139
+ for (const specNode of spec.nodes) {
140
+ const restorePolicy = specNode.restorePolicy ?? "resume_if_possible";
141
+ const sessions = this.sessionRegistry.getSessionsForRig(rigId);
142
+ const nodeDbId = nodeIdMap[specNode.id];
143
+ const session = sessions.find((s) => s.nodeId === nodeDbId);
144
+ if (session) {
145
+ this.db.prepare("UPDATE sessions SET restore_policy = ? WHERE id = ?")
146
+ .run(restorePolicy, session.id);
147
+ }
148
+ }
149
+ }
150
+ catch {
151
+ // Best-effort: import succeeded even if restorePolicy propagation fails
152
+ }
153
+ // 6. Emit rig.imported (best-effort)
154
+ try {
155
+ this.eventBus.emit({
156
+ type: "rig.imported",
157
+ rigId: rigId,
158
+ specName: spec.name,
159
+ specVersion: spec.version,
160
+ });
161
+ }
162
+ catch {
163
+ // Best-effort: import succeeded even if event persistence fails
164
+ }
165
+ return {
166
+ ok: true,
167
+ result: {
168
+ rigId: rigId,
169
+ specName: spec.name,
170
+ specVersion: spec.version,
171
+ nodes: nodeResults,
172
+ warnings: instantiateWarnings.length > 0 ? instantiateWarnings : undefined,
173
+ },
174
+ };
175
+ }
176
+ computeLaunchOrder(spec) {
177
+ const nodes = spec.nodes;
178
+ const edges = spec.edges;
179
+ const inDegree = {};
180
+ const adjacency = {};
181
+ for (const node of nodes) {
182
+ inDegree[node.id] = 0;
183
+ adjacency[node.id] = [];
184
+ }
185
+ for (const edge of edges) {
186
+ if (!LAUNCH_DEPENDENCY_KINDS.has(edge.kind))
187
+ continue;
188
+ let from;
189
+ let to;
190
+ if (edge.kind === "delegates_to") {
191
+ from = edge.from;
192
+ to = edge.to;
193
+ }
194
+ else {
195
+ // spawned_by: target (parent) before source (child)
196
+ from = edge.to;
197
+ to = edge.from;
198
+ }
199
+ if (adjacency[from]) {
200
+ adjacency[from].push(to);
201
+ inDegree[to] = (inDegree[to] ?? 0) + 1;
202
+ }
203
+ }
204
+ // Topological sort with alphabetical tiebreaker
205
+ const queue = Object.keys(inDegree)
206
+ .filter((id) => inDegree[id] === 0)
207
+ .sort();
208
+ const order = [];
209
+ while (queue.length > 0) {
210
+ const current = queue.shift();
211
+ order.push(current);
212
+ const neighbors = (adjacency[current] ?? []).slice().sort();
213
+ for (const neighbor of neighbors) {
214
+ inDegree[neighbor] = (inDegree[neighbor] ?? 1) - 1;
215
+ if ((inDegree[neighbor] ?? 0) === 0) {
216
+ // Insert sorted
217
+ let inserted = false;
218
+ for (let i = 0; i < queue.length; i++) {
219
+ if (queue[i].localeCompare(neighbor) > 0) {
220
+ queue.splice(i, 0, neighbor);
221
+ inserted = true;
222
+ break;
223
+ }
224
+ }
225
+ if (!inserted)
226
+ queue.push(neighbor);
227
+ }
228
+ }
229
+ }
230
+ // Cycle detection: if not all nodes reached, there's a cycle
231
+ if (order.length !== nodes.length) {
232
+ const missing = nodes.filter((n) => !order.includes(n.id)).map((n) => n.id);
233
+ throw new Error(`Dependency cycle detected among nodes: ${missing.join(", ")}`);
234
+ }
235
+ return order;
236
+ }
237
+ }
238
+ // -- Pod-aware instantiator (AgentSpec reboot) --
239
+ import { RigSpecCodec as PodRigSpecCodec } from "./rigspec-codec.js";
240
+ import { RigSpecSchema as PodRigSpecSchema } from "./rigspec-schema.js";
241
+ import { rigPreflight } from "./rigspec-preflight.js";
242
+ import { resolveAgentRef } from "./agent-resolver.js";
243
+ import { resolveNodeConfig } from "./profile-resolver.js";
244
+ import { resolveStartup } from "./startup-resolver.js";
245
+ import { planProjection } from "./projection-planner.js";
246
+ import { resolveConcreteHint } from "./runtime-adapter.js";
247
+ /**
248
+ * Pod-aware rig instantiator. Creates pods, nodes, edges, and runs
249
+ * startup orchestration per node with resolved agent specs.
250
+ */
251
+ export class PodRigInstantiator {
252
+ db;
253
+ deps;
254
+ constructor(deps) {
255
+ if (deps.db !== deps.rigRepo.db)
256
+ throw new Error("PodRigInstantiator: rigRepo must share the same db handle");
257
+ if (deps.db !== deps.sessionRegistry.db)
258
+ throw new Error("PodRigInstantiator: sessionRegistry must share the same db handle");
259
+ if (deps.db !== deps.eventBus.db)
260
+ throw new Error("PodRigInstantiator: eventBus must share the same db handle");
261
+ if (deps.db !== deps.nodeLauncher.db)
262
+ throw new Error("PodRigInstantiator: nodeLauncher must share the same db handle");
263
+ this.db = deps.db;
264
+ this.deps = deps;
265
+ }
266
+ async materialize(rigSpecYaml, rigRoot, opts) {
267
+ let raw;
268
+ try {
269
+ raw = PodRigSpecCodec.parse(rigSpecYaml);
270
+ }
271
+ catch (err) {
272
+ return { ok: false, code: "validation_failed", errors: [err.message] };
273
+ }
274
+ const targetRig = opts?.targetRigId ? this.deps.rigRepo.getRig(opts.targetRigId) : null;
275
+ if (opts?.targetRigId && !targetRig) {
276
+ return { ok: false, code: "target_rig_not_found", message: `Rig "${opts.targetRigId}" not found` };
277
+ }
278
+ const validation = PodRigSpecSchema.validate(raw, {
279
+ externalQualifiedIds: targetRig?.nodes.map((node) => node.logicalId),
280
+ });
281
+ if (!validation.valid) {
282
+ return { ok: false, code: "validation_failed", errors: validation.errors };
283
+ }
284
+ const rigSpec = PodRigSpecSchema.normalize(raw);
285
+ const preflight = rigPreflight({
286
+ rigSpecYaml,
287
+ rigRoot,
288
+ fsOps: this.deps.fsOps,
289
+ rigNameOverride: targetRig?.rig.name,
290
+ externalQualifiedIds: targetRig?.nodes.map((node) => node.logicalId),
291
+ });
292
+ if (!preflight.ready) {
293
+ return { ok: false, code: "preflight_failed", errors: preflight.errors, warnings: preflight.warnings };
294
+ }
295
+ const persistedEvents = [];
296
+ const nodeResults = [];
297
+ try {
298
+ let materializedRigId = opts?.targetRigId ?? "";
299
+ const tx = this.db.transaction(() => {
300
+ if (!materializedRigId) {
301
+ const rig = this.deps.rigRepo.createRig(rigSpec.name);
302
+ materializedRigId = rig.id;
303
+ persistedEvents.push(this.deps.eventBus.persistWithinTransaction({ type: "rig.created", rigId: materializedRigId }));
304
+ }
305
+ const currentRig = this.deps.rigRepo.getRig(materializedRigId);
306
+ const logicalIdToNodeId = new Map(currentRig.nodes.map((node) => [node.logicalId, node.id]));
307
+ const existingPodIds = new Set(currentRig.nodes
308
+ .map((node) => node.logicalId.includes(".") ? node.logicalId.split(".")[0] : null)
309
+ .filter((value) => value !== null));
310
+ for (const pod of rigSpec.pods) {
311
+ if (existingPodIds.has(pod.id)) {
312
+ throw { code: "materialize_conflict", message: `Pod id '${pod.id}' already exists in rig '${currentRig.rig.name}'` };
313
+ }
314
+ for (const member of pod.members) {
315
+ const qualifiedId = `${pod.id}.${member.id}`;
316
+ if (logicalIdToNodeId.has(qualifiedId)) {
317
+ throw { code: "materialize_conflict", message: `Logical ID '${qualifiedId}' already exists in rig '${currentRig.rig.name}'` };
318
+ }
319
+ }
320
+ }
321
+ const podIdMap = {};
322
+ for (const pod of rigSpec.pods) {
323
+ const podRecord = this.deps.podRepo.createPod(materializedRigId, pod.id, pod.label, {
324
+ summary: pod.summary,
325
+ continuityPolicyJson: pod.continuityPolicy ? JSON.stringify(pod.continuityPolicy) : undefined,
326
+ });
327
+ podIdMap[pod.id] = podRecord.id;
328
+ persistedEvents.push(this.deps.eventBus.persistWithinTransaction({
329
+ type: "pod.created",
330
+ rigId: materializedRigId,
331
+ podId: podRecord.id,
332
+ namespace: podRecord.namespace,
333
+ label: pod.label,
334
+ }));
335
+ for (const member of pod.members) {
336
+ const qualifiedId = `${pod.id}.${member.id}`;
337
+ const node = this.deps.rigRepo.addNode(materializedRigId, qualifiedId, {
338
+ runtime: member.runtime,
339
+ model: member.model,
340
+ cwd: member.cwd,
341
+ restorePolicy: member.restorePolicy,
342
+ podId: podRecord.id,
343
+ agentRef: member.agentRef,
344
+ profile: member.profile,
345
+ label: member.label,
346
+ });
347
+ logicalIdToNodeId.set(qualifiedId, node.id);
348
+ nodeResults.push({ logicalId: qualifiedId, status: "materialized" });
349
+ persistedEvents.push(this.deps.eventBus.persistWithinTransaction({
350
+ type: "node.added",
351
+ rigId: materializedRigId,
352
+ nodeId: node.id,
353
+ logicalId: qualifiedId,
354
+ }));
355
+ }
356
+ }
357
+ for (const pod of rigSpec.pods) {
358
+ for (const edge of pod.edges) {
359
+ const fromId = logicalIdToNodeId.get(`${pod.id}.${edge.from}`);
360
+ const toId = logicalIdToNodeId.get(`${pod.id}.${edge.to}`);
361
+ if (!fromId || !toId) {
362
+ throw { code: "materialize_conflict", message: `Pod-local edge references missing node: ${pod.id}.${edge.from} -> ${pod.id}.${edge.to}` };
363
+ }
364
+ this.deps.rigRepo.addEdge(materializedRigId, fromId, toId, edge.kind);
365
+ }
366
+ }
367
+ for (const edge of rigSpec.edges) {
368
+ const fromId = logicalIdToNodeId.get(edge.from);
369
+ const toId = logicalIdToNodeId.get(edge.to);
370
+ if (!fromId || !toId) {
371
+ throw { code: "materialize_conflict", message: `Cross-pod edge references missing node: ${edge.from} -> ${edge.to}` };
372
+ }
373
+ this.deps.rigRepo.addEdge(materializedRigId, fromId, toId, edge.kind);
374
+ }
375
+ if (!opts?.suppressSummaryEvent) {
376
+ persistedEvents.push(this.deps.eventBus.persistWithinTransaction({
377
+ type: "rig.imported",
378
+ rigId: materializedRigId,
379
+ specName: rigSpec.name,
380
+ specVersion: rigSpec.version,
381
+ }));
382
+ }
383
+ });
384
+ tx();
385
+ for (const event of persistedEvents) {
386
+ this.deps.eventBus.notifySubscribers(event);
387
+ }
388
+ return {
389
+ ok: true,
390
+ result: {
391
+ rigId: materializedRigId,
392
+ specName: rigSpec.name,
393
+ specVersion: rigSpec.version,
394
+ nodes: nodeResults,
395
+ },
396
+ };
397
+ }
398
+ catch (err) {
399
+ if (err && typeof err === "object" && "code" in err && "message" in err) {
400
+ const typed = err;
401
+ if (typed.code === "materialize_conflict") {
402
+ return { ok: false, code: "materialize_conflict", message: typed.message };
403
+ }
404
+ }
405
+ return { ok: false, code: "materialize_error", message: err instanceof Error ? err.message : String(err) };
406
+ }
407
+ }
408
+ async launchMaterialized(rigSpecYaml, rigRoot, targetRigId) {
409
+ let raw;
410
+ try {
411
+ raw = PodRigSpecCodec.parse(rigSpecYaml);
412
+ }
413
+ catch (err) {
414
+ return { ok: false, code: "validation_failed", errors: [err.message] };
415
+ }
416
+ const targetRig = this.deps.rigRepo.getRig(targetRigId);
417
+ if (!targetRig) {
418
+ return { ok: false, code: "target_rig_not_found", message: `Rig "${targetRigId}" not found` };
419
+ }
420
+ const validation = PodRigSpecSchema.validate(raw, {
421
+ externalQualifiedIds: targetRig.nodes.map((node) => node.logicalId),
422
+ });
423
+ if (!validation.valid) {
424
+ return { ok: false, code: "validation_failed", errors: validation.errors };
425
+ }
426
+ const rigSpec = PodRigSpecSchema.normalize(raw);
427
+ const launchOrder = this.computePodLaunchOrder(rigSpec);
428
+ const podWarnings = [];
429
+ const nodeResults = [];
430
+ for (const logicalId of launchOrder) {
431
+ const memberContext = this.findMemberContext(rigSpec, logicalId);
432
+ if (!memberContext) {
433
+ nodeResults.push({
434
+ logicalId,
435
+ nodeId: "",
436
+ status: "failed",
437
+ error: `Unable to resolve member definition for "${logicalId}"`,
438
+ });
439
+ continue;
440
+ }
441
+ const node = this.deps.rigRepo.getRig(targetRigId)?.nodes.find((entry) => entry.logicalId === logicalId);
442
+ if (!node) {
443
+ nodeResults.push({
444
+ logicalId,
445
+ nodeId: "",
446
+ status: "failed",
447
+ error: `Node "${logicalId}" not found after materialization`,
448
+ });
449
+ continue;
450
+ }
451
+ const launched = memberContext.member.agentRef === "builtin:terminal"
452
+ ? await this.launchExistingTerminalMember({
453
+ rigId: targetRigId,
454
+ rigSpec,
455
+ rigRoot,
456
+ pod: memberContext.pod,
457
+ member: memberContext.member,
458
+ qualifiedId: logicalId,
459
+ nodeId: node.id,
460
+ })
461
+ : await this.launchExistingAgentMember({
462
+ rigId: targetRigId,
463
+ rigSpec,
464
+ rigRoot,
465
+ pod: memberContext.pod,
466
+ member: memberContext.member,
467
+ qualifiedId: logicalId,
468
+ nodeId: node.id,
469
+ });
470
+ if (launched.warnings?.length) {
471
+ podWarnings.push(...launched.warnings);
472
+ }
473
+ nodeResults.push({
474
+ logicalId,
475
+ nodeId: node.id,
476
+ status: launched.status,
477
+ error: launched.error,
478
+ sessionName: launched.sessionName,
479
+ });
480
+ }
481
+ return {
482
+ ok: true,
483
+ result: {
484
+ nodes: nodeResults,
485
+ warnings: podWarnings.length > 0 ? podWarnings : undefined,
486
+ },
487
+ };
488
+ }
489
+ async instantiate(rigSpecYaml, rigRoot) {
490
+ // 1. Parse + validate
491
+ let rigSpec;
492
+ try {
493
+ const raw = PodRigSpecCodec.parse(rigSpecYaml);
494
+ const validation = PodRigSpecSchema.validate(raw);
495
+ if (!validation.valid) {
496
+ return { ok: false, code: "validation_failed", errors: validation.errors };
497
+ }
498
+ rigSpec = PodRigSpecSchema.normalize(raw);
499
+ }
500
+ catch (err) {
501
+ return { ok: false, code: "validation_failed", errors: [err.message] };
502
+ }
503
+ // 2. Preflight
504
+ const preflight = rigPreflight({ rigSpecYaml, rigRoot, fsOps: this.deps.fsOps });
505
+ if (!preflight.ready) {
506
+ return { ok: false, code: "preflight_failed", errors: preflight.errors, warnings: preflight.warnings };
507
+ }
508
+ // 3. Create rig
509
+ let rigId;
510
+ try {
511
+ const rig = this.deps.rigRepo.createRig(rigSpec.name);
512
+ rigId = rig.id;
513
+ }
514
+ catch (err) {
515
+ return { ok: false, code: "instantiate_error", message: err.message };
516
+ }
517
+ // 4. Compute launch order from edges (rejects cycles)
518
+ let launchOrder;
519
+ try {
520
+ launchOrder = this.computePodLaunchOrder(rigSpec);
521
+ }
522
+ catch (err) {
523
+ return { ok: false, code: "cycle_error", message: err.message };
524
+ }
525
+ // 5. Create pods + nodes + edges, then launch in topological order
526
+ const nodeResults = [];
527
+ const nodeIdMap = {}; // "pod.member" -> node DB id
528
+ const launchedSessionNames = []; // Track for orphan cleanup on total failure
529
+ const podInstantiateWarnings = [];
530
+ // Store per-member context for deferred launch
531
+ const memberContext = new Map();
532
+ // Phase 1: Create all pods and collect member entries
533
+ const podIdMap = {}; // pod.id -> DB pod id
534
+ const memberEntries = [];
535
+ for (const pod of rigSpec.pods) {
536
+ let podId;
537
+ try {
538
+ const podRecord = this.deps.podRepo.createPod(rigId, pod.id, pod.label, {
539
+ summary: pod.summary,
540
+ continuityPolicyJson: pod.continuityPolicy ? JSON.stringify(pod.continuityPolicy) : undefined,
541
+ });
542
+ podId = podRecord.id;
543
+ podIdMap[pod.id] = podId;
544
+ }
545
+ catch (err) {
546
+ nodeResults.push(...pod.members.map((m) => ({ logicalId: `${pod.id}.${m.id}`, status: "failed", error: `Pod creation failed: ${err.message}` })));
547
+ continue;
548
+ }
549
+ for (const member of pod.members) {
550
+ memberEntries.push({ pod, member, podId, qualifiedId: `${pod.id}.${member.id}` });
551
+ }
552
+ }
553
+ // Sort members by topological launch order
554
+ const orderMap = new Map(launchOrder.map((id, i) => [id, i]));
555
+ memberEntries.sort((a, b) => (orderMap.get(a.qualifiedId) ?? 999) - (orderMap.get(b.qualifiedId) ?? 999));
556
+ // Phase 2: Process members in launch order
557
+ for (const { pod, member, podId, qualifiedId } of memberEntries) {
558
+ // Terminal fast-path: skip agent resolution and profile resolution
559
+ if (member.agentRef === "builtin:terminal") {
560
+ const termResult = await this.processTerminalMember(rigId, rigSpec, rigRoot, pod, member, podId, qualifiedId, nodeIdMap, launchedSessionNames, podInstantiateWarnings);
561
+ nodeResults.push(termResult);
562
+ continue;
563
+ }
564
+ // Resolve agent ref
565
+ const resolveResult = resolveAgentRef(member.agentRef, rigRoot, this.deps.fsOps);
566
+ if (!resolveResult.ok) {
567
+ const msg = resolveResult.code === "validation_failed"
568
+ ? resolveResult.errors.join("; ")
569
+ : resolveResult.error;
570
+ nodeResults.push({ logicalId: qualifiedId, status: "failed", error: msg });
571
+ continue;
572
+ }
573
+ // Resolve node config (profile + precedence)
574
+ const configResult = resolveNodeConfig({
575
+ baseSpec: resolveResult.resolved,
576
+ importedSpecs: resolveResult.imports,
577
+ collisions: resolveResult.collisions,
578
+ profileName: member.profile,
579
+ member,
580
+ pod,
581
+ rig: rigSpec,
582
+ });
583
+ if (!configResult.ok) {
584
+ nodeResults.push({ logicalId: qualifiedId, status: "failed", error: configResult.errors.join("; ") });
585
+ continue;
586
+ }
587
+ // Create node
588
+ let nodeId;
589
+ try {
590
+ const node = this.deps.rigRepo.addNode(rigId, qualifiedId, {
591
+ runtime: member.runtime,
592
+ model: member.model,
593
+ cwd: member.cwd,
594
+ restorePolicy: configResult.config.restorePolicy,
595
+ podId,
596
+ agentRef: member.agentRef,
597
+ profile: member.profile,
598
+ label: member.label,
599
+ resolvedSpecName: configResult.config.resolvedSpecName,
600
+ resolvedSpecVersion: configResult.config.resolvedSpecVersion,
601
+ resolvedSpecHash: configResult.config.resolvedSpecHash,
602
+ });
603
+ nodeId = node.id;
604
+ nodeIdMap[qualifiedId] = nodeId;
605
+ }
606
+ catch (err) {
607
+ nodeResults.push({ logicalId: qualifiedId, status: "failed", error: err.message });
608
+ continue;
609
+ }
610
+ const launched = await this.launchExistingAgentMember({
611
+ rigId,
612
+ rigSpec,
613
+ rigRoot,
614
+ pod,
615
+ member,
616
+ qualifiedId,
617
+ nodeId,
618
+ resolveResult,
619
+ configResult,
620
+ });
621
+ if (launched.sessionName) {
622
+ launchedSessionNames.push(launched.sessionName);
623
+ }
624
+ if (launched.warnings?.length) {
625
+ podInstantiateWarnings.push(...launched.warnings);
626
+ }
627
+ nodeResults.push({
628
+ logicalId: qualifiedId,
629
+ status: launched.status,
630
+ error: launched.error,
631
+ });
632
+ }
633
+ // Create pod-local edges (after all members created)
634
+ for (const pod of rigSpec.pods) {
635
+ for (const edge of pod.edges) {
636
+ const fromId = nodeIdMap[`${pod.id}.${edge.from}`];
637
+ const toId = nodeIdMap[`${pod.id}.${edge.to}`];
638
+ if (fromId && toId) {
639
+ try {
640
+ this.deps.rigRepo.addEdge(rigId, fromId, toId, edge.kind);
641
+ }
642
+ catch { /* best-effort */ }
643
+ }
644
+ }
645
+ }
646
+ // Create cross-pod edges
647
+ for (const edge of rigSpec.edges) {
648
+ const fromId = nodeIdMap[edge.from];
649
+ const toId = nodeIdMap[edge.to];
650
+ if (fromId && toId) {
651
+ try {
652
+ this.deps.rigRepo.addEdge(rigId, fromId, toId, edge.kind);
653
+ }
654
+ catch { /* best-effort */ }
655
+ }
656
+ }
657
+ // Check for total failure — kill orphan tmux sessions and clean up rig
658
+ const allFailed = nodeResults.length > 0 && nodeResults.every((n) => n.status === "failed");
659
+ if (allFailed) {
660
+ // Kill orphan tmux sessions
661
+ if (this.deps.tmuxAdapter) {
662
+ for (const sessionName of launchedSessionNames) {
663
+ try {
664
+ await this.deps.tmuxAdapter.killSession(sessionName);
665
+ }
666
+ catch { /* best-effort */ }
667
+ }
668
+ }
669
+ try {
670
+ this.deps.rigRepo.deleteRig(rigId);
671
+ }
672
+ catch { /* best-effort */ }
673
+ const details = nodeResults.map((n) => `${n.logicalId}: ${n.error ?? "unknown"}`).join("; ");
674
+ return { ok: false, code: "instantiate_error", message: `all node launches/startups failed — ${details}` };
675
+ }
676
+ // Emit rig.imported
677
+ try {
678
+ this.deps.eventBus.emit({ type: "rig.imported", rigId, specName: rigSpec.name, specVersion: rigSpec.version });
679
+ }
680
+ catch { /* best-effort */ }
681
+ return {
682
+ ok: true,
683
+ result: { rigId, specName: rigSpec.name, specVersion: rigSpec.version, nodes: nodeResults, warnings: podInstantiateWarnings.length > 0 ? podInstantiateWarnings : undefined },
684
+ };
685
+ }
686
+ computePodLaunchOrder(rigSpec) {
687
+ const LAUNCH_DEP_KINDS = new Set(["delegates_to", "spawned_by"]);
688
+ const allIds = [];
689
+ const inDegree = {};
690
+ const adjacency = {};
691
+ // Collect all qualified member ids
692
+ for (const pod of rigSpec.pods) {
693
+ for (const member of pod.members) {
694
+ const qid = `${pod.id}.${member.id}`;
695
+ allIds.push(qid);
696
+ inDegree[qid] = 0;
697
+ adjacency[qid] = [];
698
+ }
699
+ }
700
+ // Build adjacency from pod-local edges (qualify them) and cross-pod edges (already qualified)
701
+ for (const pod of rigSpec.pods) {
702
+ for (const edge of pod.edges) {
703
+ if (!LAUNCH_DEP_KINDS.has(edge.kind))
704
+ continue;
705
+ const from = `${pod.id}.${edge.kind === "delegates_to" ? edge.from : edge.to}`;
706
+ const to = `${pod.id}.${edge.kind === "delegates_to" ? edge.to : edge.from}`;
707
+ if (adjacency[from]) {
708
+ adjacency[from].push(to);
709
+ inDegree[to] = (inDegree[to] ?? 0) + 1;
710
+ }
711
+ }
712
+ }
713
+ for (const edge of rigSpec.edges) {
714
+ if (!LAUNCH_DEP_KINDS.has(edge.kind))
715
+ continue;
716
+ const from = edge.kind === "delegates_to" ? edge.from : edge.to;
717
+ const to = edge.kind === "delegates_to" ? edge.to : edge.from;
718
+ if (adjacency[from] && adjacency[to]) {
719
+ adjacency[from].push(to);
720
+ inDegree[to] = (inDegree[to] ?? 0) + 1;
721
+ }
722
+ }
723
+ // Topological sort with alphabetical tiebreaker
724
+ const queue = allIds.filter((id) => inDegree[id] === 0).sort();
725
+ const order = [];
726
+ while (queue.length > 0) {
727
+ const current = queue.shift();
728
+ order.push(current);
729
+ for (const neighbor of (adjacency[current] ?? []).sort()) {
730
+ inDegree[neighbor] -= 1;
731
+ if (inDegree[neighbor] === 0) {
732
+ let inserted = false;
733
+ for (let i = 0; i < queue.length; i++) {
734
+ if (queue[i].localeCompare(neighbor) > 0) {
735
+ queue.splice(i, 0, neighbor);
736
+ inserted = true;
737
+ break;
738
+ }
739
+ }
740
+ if (!inserted)
741
+ queue.push(neighbor);
742
+ }
743
+ }
744
+ }
745
+ // Cycle detection: if any nodes remain unvisited, the graph has a cycle
746
+ if (order.length < allIds.length) {
747
+ const cycled = allIds.filter((id) => !order.includes(id));
748
+ throw new Error(`Dependency cycle detected among nodes: ${cycled.join(", ")}`);
749
+ }
750
+ return order;
751
+ }
752
+ async processTerminalMember(rigId, rigSpec, rigRoot, pod, member, podId, qualifiedId, nodeIdMap, launchedSessionNames, warnings) {
753
+ // Create node with sentinel values
754
+ let nodeId;
755
+ try {
756
+ const node = this.deps.rigRepo.addNode(rigId, qualifiedId, {
757
+ runtime: member.runtime,
758
+ model: member.model,
759
+ cwd: member.cwd,
760
+ restorePolicy: "checkpoint_only",
761
+ podId,
762
+ agentRef: member.agentRef,
763
+ profile: member.profile,
764
+ label: member.label,
765
+ });
766
+ nodeId = node.id;
767
+ nodeIdMap[qualifiedId] = nodeId;
768
+ }
769
+ catch (err) {
770
+ return { logicalId: qualifiedId, status: "failed", error: err.message };
771
+ }
772
+ const launched = await this.launchExistingTerminalMember({
773
+ rigId,
774
+ rigSpec,
775
+ rigRoot,
776
+ pod,
777
+ member,
778
+ qualifiedId,
779
+ nodeId,
780
+ });
781
+ if (launched.sessionName) {
782
+ launchedSessionNames.push(launched.sessionName);
783
+ }
784
+ if (launched.warnings?.length) {
785
+ warnings.push(...launched.warnings);
786
+ }
787
+ return {
788
+ logicalId: qualifiedId,
789
+ status: launched.status,
790
+ error: launched.error,
791
+ };
792
+ }
793
+ findMemberContext(rigSpec, qualifiedId) {
794
+ const [podId, memberId] = qualifiedId.split(".", 2);
795
+ if (!podId || !memberId)
796
+ return null;
797
+ const pod = rigSpec.pods.find((entry) => entry.id === podId);
798
+ const member = pod?.members.find((entry) => entry.id === memberId);
799
+ return pod && member ? { pod, member } : null;
800
+ }
801
+ async launchExistingAgentMember(input) {
802
+ const resolveResult = input.resolveResult ?? resolveAgentRef(input.member.agentRef, input.rigRoot, this.deps.fsOps);
803
+ if (!resolveResult.ok) {
804
+ const msg = resolveResult.code === "validation_failed"
805
+ ? resolveResult.errors.join("; ")
806
+ : resolveResult.error;
807
+ return { status: "failed", error: msg };
808
+ }
809
+ const configResult = input.configResult ?? resolveNodeConfig({
810
+ baseSpec: resolveResult.resolved,
811
+ importedSpecs: resolveResult.imports,
812
+ collisions: resolveResult.collisions,
813
+ profileName: input.member.profile,
814
+ member: input.member,
815
+ pod: input.pod,
816
+ rig: input.rigSpec,
817
+ });
818
+ if (!configResult.ok) {
819
+ return { status: "failed", error: configResult.errors.join("; ") };
820
+ }
821
+ this.updateNodeResolvedConfig(input.nodeId, configResult.config);
822
+ const sessionNameErrors = validateSessionComponents(input.pod.id, input.member.id, input.rigSpec.name);
823
+ if (sessionNameErrors.length > 0) {
824
+ return { status: "failed", error: sessionNameErrors.join("; ") };
825
+ }
826
+ const canonicalSessionName = deriveCanonicalSessionName(input.pod.id, input.member.id, input.rigSpec.name);
827
+ const launchResult = await this.deps.nodeLauncher.launchNode(input.rigId, input.qualifiedId, { sessionName: canonicalSessionName });
828
+ if (!launchResult.ok) {
829
+ return { status: "failed", error: launchResult.message };
830
+ }
831
+ try {
832
+ this.db.prepare("UPDATE sessions SET restore_policy = ? WHERE id = ?")
833
+ .run(configResult.config.restorePolicy, launchResult.session.id);
834
+ }
835
+ catch { /* best-effort */ }
836
+ const adapter = this.deps.adapters[input.member.runtime];
837
+ if (!adapter) {
838
+ return { status: "failed", error: `No adapter for runtime "${input.member.runtime}"`, sessionName: canonicalSessionName, warnings: launchResult.warnings };
839
+ }
840
+ const planResult = planProjection({
841
+ config: configResult.config,
842
+ collisions: resolveResult.collisions,
843
+ fsOps: this.deps.fsOps,
844
+ });
845
+ if (!planResult.ok) {
846
+ return { status: "failed", error: planResult.errors.join("; "), sessionName: canonicalSessionName, warnings: launchResult.warnings };
847
+ }
848
+ const resolvedFiles = this.buildResolvedStartupFiles(resolveResult.resolved.spec, resolveResult.resolved.sourcePath, resolveResult.resolved.spec.profiles[input.member.profile], input.rigSpec, input.rigRoot, input.pod, input.member);
849
+ const binding = {
850
+ id: launchResult.binding.id,
851
+ nodeId: input.nodeId,
852
+ tmuxSession: launchResult.binding.tmuxSession,
853
+ tmuxWindow: null,
854
+ tmuxPane: null,
855
+ cmuxWorkspace: null,
856
+ cmuxSurface: null,
857
+ updatedAt: "",
858
+ cwd: input.member.cwd ? (nodePath.isAbsolute(input.member.cwd) ? input.member.cwd : nodePath.resolve(input.rigRoot, input.member.cwd)) : input.rigRoot,
859
+ };
860
+ const startupResult = await this.deps.startupOrchestrator.startNode({
861
+ rigId: input.rigId,
862
+ nodeId: input.nodeId,
863
+ sessionId: launchResult.session.id,
864
+ binding,
865
+ adapter,
866
+ plan: planResult.plan,
867
+ resolvedStartupFiles: resolvedFiles,
868
+ startupActions: [
869
+ ...configResult.config.startup.actions,
870
+ this.buildSessionIdentityAction({
871
+ rigName: input.rigSpec.name,
872
+ pod: input.pod,
873
+ member: input.member,
874
+ runtime: input.member.runtime,
875
+ sessionName: canonicalSessionName,
876
+ resolvedSpecName: configResult.config.resolvedSpecName,
877
+ }),
878
+ ],
879
+ isRestore: false,
880
+ });
881
+ return {
882
+ status: startupResult.ok ? "launched" : "failed",
883
+ error: startupResult.ok ? undefined : startupResult.errors.join("; "),
884
+ sessionName: canonicalSessionName,
885
+ warnings: launchResult.warnings,
886
+ };
887
+ }
888
+ async launchExistingTerminalMember(input) {
889
+ const sessionNameErrors = validateSessionComponents(input.pod.id, input.member.id, input.rigSpec.name);
890
+ if (sessionNameErrors.length > 0) {
891
+ return { status: "failed", error: sessionNameErrors.join("; ") };
892
+ }
893
+ const canonicalSessionName = deriveCanonicalSessionName(input.pod.id, input.member.id, input.rigSpec.name);
894
+ const launchResult = await this.deps.nodeLauncher.launchNode(input.rigId, input.qualifiedId, { sessionName: canonicalSessionName });
895
+ if (!launchResult.ok) {
896
+ return { status: "failed", error: launchResult.message };
897
+ }
898
+ try {
899
+ this.db.prepare("UPDATE nodes SET restore_policy = ? WHERE id = ?")
900
+ .run("checkpoint_only", input.nodeId);
901
+ }
902
+ catch { /* best-effort */ }
903
+ try {
904
+ this.db.prepare("UPDATE sessions SET restore_policy = ? WHERE id = ?")
905
+ .run("checkpoint_only", launchResult.session.id);
906
+ }
907
+ catch { /* best-effort */ }
908
+ const startup = resolveStartup({
909
+ specStartup: { files: [], actions: [] },
910
+ profileStartup: undefined,
911
+ rigCultureFile: input.rigSpec.cultureFile,
912
+ rigStartup: input.rigSpec.startup,
913
+ podStartup: input.pod.startup,
914
+ memberStartup: input.member.startup,
915
+ operatorStartup: undefined,
916
+ });
917
+ const resolvedFiles = this.buildTerminalResolvedStartupFiles(input.rigSpec, input.rigRoot, input.pod, input.member);
918
+ const binding = {
919
+ id: launchResult.binding.id,
920
+ nodeId: input.nodeId,
921
+ tmuxSession: launchResult.binding.tmuxSession,
922
+ tmuxWindow: null,
923
+ tmuxPane: null,
924
+ cmuxWorkspace: null,
925
+ cmuxSurface: null,
926
+ updatedAt: "",
927
+ cwd: input.member.cwd ? (nodePath.isAbsolute(input.member.cwd) ? input.member.cwd : nodePath.resolve(input.rigRoot, input.member.cwd)) : input.rigRoot,
928
+ };
929
+ const adapter = this.deps.adapters["terminal"];
930
+ if (!adapter) {
931
+ return { status: "failed", error: 'No adapter for runtime "terminal"', sessionName: canonicalSessionName, warnings: launchResult.warnings };
932
+ }
933
+ const emptyPlan = {
934
+ entries: [],
935
+ diagnostics: [],
936
+ conflicts: [],
937
+ noOps: [],
938
+ runtime: "terminal",
939
+ cwd: input.member.cwd ? (nodePath.isAbsolute(input.member.cwd) ? input.member.cwd : nodePath.resolve(input.rigRoot, input.member.cwd)) : input.rigRoot,
940
+ };
941
+ const startupResult = await this.deps.startupOrchestrator.startNode({
942
+ rigId: input.rigId,
943
+ nodeId: input.nodeId,
944
+ sessionId: launchResult.session.id,
945
+ binding,
946
+ adapter,
947
+ plan: emptyPlan,
948
+ resolvedStartupFiles: resolvedFiles,
949
+ startupActions: startup.actions,
950
+ isRestore: false,
951
+ });
952
+ return {
953
+ status: startupResult.ok ? "launched" : "failed",
954
+ error: startupResult.ok ? undefined : startupResult.errors.join("; "),
955
+ sessionName: canonicalSessionName,
956
+ warnings: launchResult.warnings,
957
+ };
958
+ }
959
+ updateNodeResolvedConfig(nodeId, config) {
960
+ try {
961
+ this.db.prepare(`UPDATE nodes
962
+ SET restore_policy = ?,
963
+ resolved_spec_name = ?,
964
+ resolved_spec_version = ?,
965
+ resolved_spec_hash = ?
966
+ WHERE id = ?`).run(config.restorePolicy, config.resolvedSpecName, config.resolvedSpecVersion, config.resolvedSpecHash, nodeId);
967
+ }
968
+ catch {
969
+ /* best-effort */
970
+ }
971
+ }
972
+ buildTerminalResolvedStartupFiles(rigSpec, rigRoot, pod, member) {
973
+ const files = [];
974
+ // Skip layers 1-2 (agent base, profile) — terminal nodes have no agent spec
975
+ // Layer 3: Rig culture file
976
+ if (rigSpec.cultureFile) {
977
+ files.push({
978
+ path: rigSpec.cultureFile,
979
+ absolutePath: nodePath.resolve(rigRoot, rigSpec.cultureFile),
980
+ ownerRoot: rigRoot,
981
+ deliveryHint: "auto",
982
+ required: true,
983
+ appliesOn: ["fresh_start", "restore"],
984
+ });
985
+ }
986
+ // Layer 4: Rig startup
987
+ if (rigSpec.startup) {
988
+ for (const f of rigSpec.startup.files) {
989
+ files.push({ ...f, absolutePath: nodePath.resolve(rigRoot, f.path), ownerRoot: rigRoot });
990
+ }
991
+ }
992
+ // Layer 5: Pod startup
993
+ if (pod.startup) {
994
+ for (const f of pod.startup.files) {
995
+ files.push({ ...f, absolutePath: nodePath.resolve(rigRoot, f.path), ownerRoot: rigRoot });
996
+ }
997
+ }
998
+ // Layer 6: Member startup
999
+ if (member.startup) {
1000
+ for (const f of member.startup.files) {
1001
+ files.push({ ...f, absolutePath: nodePath.resolve(rigRoot, f.path), ownerRoot: rigRoot });
1002
+ }
1003
+ }
1004
+ return this.resolveAutoHints(files);
1005
+ }
1006
+ buildResolvedStartupFiles(agentSpec, agentSourcePath, profile, rigSpec, rigRoot, pod, member) {
1007
+ const files = [];
1008
+ // nodePath imported at top level (ESM)
1009
+ // 1. Agent base startup
1010
+ for (const f of agentSpec.startup.files) {
1011
+ files.push({ ...f, absolutePath: nodePath.resolve(agentSourcePath, f.path), ownerRoot: agentSourcePath });
1012
+ }
1013
+ // 2. Profile startup
1014
+ if (profile?.startup) {
1015
+ for (const f of profile.startup.files) {
1016
+ files.push({ ...f, absolutePath: nodePath.resolve(agentSourcePath, f.path), ownerRoot: agentSourcePath });
1017
+ }
1018
+ }
1019
+ // 3. Rig culture file
1020
+ if (rigSpec.cultureFile) {
1021
+ files.push({
1022
+ path: rigSpec.cultureFile,
1023
+ absolutePath: nodePath.resolve(rigRoot, rigSpec.cultureFile),
1024
+ ownerRoot: rigRoot,
1025
+ deliveryHint: "auto",
1026
+ required: true,
1027
+ appliesOn: ["fresh_start", "restore"],
1028
+ });
1029
+ }
1030
+ // 4. Rig startup
1031
+ if (rigSpec.startup) {
1032
+ for (const f of rigSpec.startup.files) {
1033
+ files.push({ ...f, absolutePath: nodePath.resolve(rigRoot, f.path), ownerRoot: rigRoot });
1034
+ }
1035
+ }
1036
+ // 5. Pod startup
1037
+ if (pod.startup) {
1038
+ for (const f of pod.startup.files) {
1039
+ files.push({ ...f, absolutePath: nodePath.resolve(rigRoot, f.path), ownerRoot: rigRoot });
1040
+ }
1041
+ }
1042
+ // 6. Member startup
1043
+ if (member.startup) {
1044
+ for (const f of member.startup.files) {
1045
+ files.push({ ...f, absolutePath: nodePath.resolve(rigRoot, f.path), ownerRoot: rigRoot });
1046
+ }
1047
+ }
1048
+ // 7. Built-in OpenRig onboarding overlay (appended last, does not replace agent guidance)
1049
+ const onboardingPath = nodePath.resolve(import.meta.dirname, "../../assets/guidance/using-openrig.md");
1050
+ files.push({
1051
+ path: "using-openrig.md",
1052
+ absolutePath: onboardingPath,
1053
+ ownerRoot: nodePath.resolve(import.meta.dirname, "../../assets"),
1054
+ deliveryHint: "guidance_merge",
1055
+ required: false,
1056
+ appliesOn: ["fresh_start", "restore"],
1057
+ });
1058
+ return this.resolveAutoHints(files);
1059
+ }
1060
+ buildSessionIdentityAction(input) {
1061
+ const lines = [
1062
+ "OpenRig session identity:",
1063
+ `- rig: ${input.rigName}`,
1064
+ `- pod: ${input.pod.id}`,
1065
+ `- pod_label: ${input.pod.label}`,
1066
+ `- member: ${input.member.id}`,
1067
+ input.member.label ? `- member_label: ${input.member.label}` : null,
1068
+ `- logical_id: ${input.pod.id}.${input.member.id}`,
1069
+ input.resolvedSpecName ? `- agent_spec: ${input.resolvedSpecName}` : null,
1070
+ `- runtime: ${input.runtime}`,
1071
+ `- session: ${input.sessionName}`,
1072
+ "This is your startup identity hint. For durable identity recovery after compaction, run:",
1073
+ " rig whoami --json",
1074
+ "That command returns your full topology context: rig, pod, peers, edges, and transcript path.",
1075
+ ].filter((line) => Boolean(line));
1076
+ return {
1077
+ type: "send_text",
1078
+ value: lines.join("\n"),
1079
+ phase: "after_ready",
1080
+ appliesOn: ["fresh_start", "restore"],
1081
+ idempotent: true,
1082
+ };
1083
+ }
1084
+ /**
1085
+ * Resolve any remaining 'auto' delivery hints to concrete hints at plan time.
1086
+ * Uses the shared resolveConcreteHint resolver (single source of truth).
1087
+ * After this, no file should have deliveryHint === 'auto'.
1088
+ */
1089
+ resolveAutoHints(files) {
1090
+ return files.map((f) => {
1091
+ if (f.deliveryHint !== "auto")
1092
+ return f;
1093
+ try {
1094
+ const content = this.deps.fsOps.readFile(f.absolutePath);
1095
+ return { ...f, deliveryHint: resolveConcreteHint(f.path, content) };
1096
+ }
1097
+ catch {
1098
+ // If file can't be read, default to send_text (safest — delivered after harness ready)
1099
+ return { ...f, deliveryHint: "send_text" };
1100
+ }
1101
+ });
1102
+ }
1103
+ }
1104
+ //# sourceMappingURL=rigspec-instantiator.js.map