@revisium/orchestrator 0.0.0 → 0.1.0-alpha.10

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 (547) hide show
  1. package/README.md +202 -1
  2. package/control-plane/bootstrap.config.json +104 -2
  3. package/control-plane/default-playbook/catalog/pipelines.json +657 -0
  4. package/control-plane/default-playbook/catalog/roles.json +65 -0
  5. package/control-plane/default-playbook/package.json +5 -0
  6. package/control-plane/default-playbook/playbook.json +13 -0
  7. package/control-plane/default-playbook/prompts/analyst.md +29 -0
  8. package/control-plane/default-playbook/prompts/developer.md +26 -0
  9. package/control-plane/default-playbook/prompts/integrator.md +20 -0
  10. package/control-plane/default-playbook/prompts/orchestrator.md +23 -0
  11. package/control-plane/default-playbook/prompts/reviewer.md +28 -0
  12. package/control-plane/default-playbook/prompts/triager.md +51 -0
  13. package/control-plane/default-playbook/prompts/watcher.md +24 -0
  14. package/dist/api/graphql-api/filters/agent-observability-exception.filter.js +24 -0
  15. package/dist/api/graphql-api/filters/agent-observability-exception.filter.js.map +1 -0
  16. package/dist/api/graphql-api/filters/graphql-validation-exception.filter.js +36 -0
  17. package/dist/api/graphql-api/filters/graphql-validation-exception.filter.js.map +1 -0
  18. package/dist/api/graphql-api/graphql-api.module.js +77 -0
  19. package/dist/api/graphql-api/graphql-api.module.js.map +1 -0
  20. package/dist/api/graphql-api/graphql-ws/agent-observability-subscription-bridge.service.js +296 -0
  21. package/dist/api/graphql-api/graphql-ws/agent-observability-subscription-bridge.service.js.map +1 -0
  22. package/dist/api/graphql-api/graphql-ws/agent-observability-subscription-mappers.js +64 -0
  23. package/dist/api/graphql-api/graphql-ws/agent-observability-subscription-mappers.js.map +1 -0
  24. package/dist/api/graphql-api/graphql-ws/constants.js +11 -0
  25. package/dist/api/graphql-api/graphql-ws/constants.js.map +1 -0
  26. package/dist/api/graphql-api/graphql-ws/pubsub.module.js +32 -0
  27. package/dist/api/graphql-api/graphql-ws/pubsub.module.js.map +1 -0
  28. package/dist/api/graphql-api/graphql-ws/run-progress-subscription-poller.service.js +101 -0
  29. package/dist/api/graphql-api/graphql-ws/run-progress-subscription-poller.service.js.map +1 -0
  30. package/dist/api/graphql-api/graphql-ws/subscription-bridge.service.js +115 -0
  31. package/dist/api/graphql-api/graphql-ws/subscription-bridge.service.js.map +1 -0
  32. package/dist/api/graphql-api/graphql-ws/subscription-mappers.js +85 -0
  33. package/dist/api/graphql-api/graphql-ws/subscription-mappers.js.map +1 -0
  34. package/dist/api/graphql-api/graphql-ws/ws.js +22 -0
  35. package/dist/api/graphql-api/graphql-ws/ws.js.map +1 -0
  36. package/dist/api/graphql-api/inbox/inbox-subscription.resolver.js +56 -0
  37. package/dist/api/graphql-api/inbox/inbox-subscription.resolver.js.map +1 -0
  38. package/dist/api/graphql-api/inbox/inbox.resolver.js +125 -0
  39. package/dist/api/graphql-api/inbox/inbox.resolver.js.map +1 -0
  40. package/dist/api/graphql-api/inbox/inputs/answer-question.input.js +33 -0
  41. package/dist/api/graphql-api/inbox/inputs/answer-question.input.js.map +1 -0
  42. package/dist/api/graphql-api/inbox/inputs/gate-decision.input.js +27 -0
  43. package/dist/api/graphql-api/inbox/inputs/gate-decision.input.js.map +1 -0
  44. package/dist/api/graphql-api/inbox/inputs/list-inbox.input.js +28 -0
  45. package/dist/api/graphql-api/inbox/inputs/list-inbox.input.js.map +1 -0
  46. package/dist/api/graphql-api/inbox/inputs/resolve-inbox-item.input.js +38 -0
  47. package/dist/api/graphql-api/inbox/inputs/resolve-inbox-item.input.js.map +1 -0
  48. package/dist/api/graphql-api/inbox/model/gate-risk.model.js +53 -0
  49. package/dist/api/graphql-api/inbox/model/gate-risk.model.js.map +1 -0
  50. package/dist/api/graphql-api/inbox/model/inbox-connection.model.js +16 -0
  51. package/dist/api/graphql-api/inbox/model/inbox-connection.model.js.map +1 -0
  52. package/dist/api/graphql-api/inbox/model/inbox-item.model.js +88 -0
  53. package/dist/api/graphql-api/inbox/model/inbox-item.model.js.map +1 -0
  54. package/dist/api/graphql-api/inbox/model/inbox-resolution.model.js +48 -0
  55. package/dist/api/graphql-api/inbox/model/inbox-resolution.model.js.map +1 -0
  56. package/dist/api/graphql-api/method/inputs/list-method.input.js +15 -0
  57. package/dist/api/graphql-api/method/inputs/list-method.input.js.map +1 -0
  58. package/dist/api/graphql-api/method/method.resolver.js +90 -0
  59. package/dist/api/graphql-api/method/method.resolver.js.map +1 -0
  60. package/dist/api/graphql-api/method/model/alternative-role-group.model.js +32 -0
  61. package/dist/api/graphql-api/method/model/alternative-role-group.model.js.map +1 -0
  62. package/dist/api/graphql-api/method/model/pipeline-connection.model.js +16 -0
  63. package/dist/api/graphql-api/method/model/pipeline-connection.model.js.map +1 -0
  64. package/dist/api/graphql-api/method/model/pipeline.model.js +69 -0
  65. package/dist/api/graphql-api/method/model/pipeline.model.js.map +1 -0
  66. package/dist/api/graphql-api/method/model/playbook-connection.model.js +16 -0
  67. package/dist/api/graphql-api/method/model/playbook-connection.model.js.map +1 -0
  68. package/dist/api/graphql-api/method/model/playbook.model.js +47 -0
  69. package/dist/api/graphql-api/method/model/playbook.model.js.map +1 -0
  70. package/dist/api/graphql-api/method/model/role-connection.model.js +16 -0
  71. package/dist/api/graphql-api/method/model/role-connection.model.js.map +1 -0
  72. package/dist/api/graphql-api/method/model/role.model.js +98 -0
  73. package/dist/api/graphql-api/method/model/role.model.js.map +1 -0
  74. package/dist/api/graphql-api/pr/inputs/pr-readiness.input.js +52 -0
  75. package/dist/api/graphql-api/pr/inputs/pr-readiness.input.js.map +1 -0
  76. package/dist/api/graphql-api/pr/model/pr-readiness.model.js +403 -0
  77. package/dist/api/graphql-api/pr/model/pr-readiness.model.js.map +1 -0
  78. package/dist/api/graphql-api/pr/pr.resolver.js +76 -0
  79. package/dist/api/graphql-api/pr/pr.resolver.js.map +1 -0
  80. package/dist/api/graphql-api/registerGraphqlEnums.js +9 -0
  81. package/dist/api/graphql-api/registerGraphqlEnums.js.map +1 -0
  82. package/dist/api/graphql-api/runs/inputs/create-run.input.js +63 -0
  83. package/dist/api/graphql-api/runs/inputs/create-run.input.js.map +1 -0
  84. package/dist/api/graphql-api/runs/inputs/get-agent-log.input.js +48 -0
  85. package/dist/api/graphql-api/runs/inputs/get-agent-log.input.js.map +1 -0
  86. package/dist/api/graphql-api/runs/inputs/get-run-attempts.input.js +32 -0
  87. package/dist/api/graphql-api/runs/inputs/get-run-attempts.input.js.map +1 -0
  88. package/dist/api/graphql-api/runs/inputs/get-run-events.input.js +28 -0
  89. package/dist/api/graphql-api/runs/inputs/get-run-events.input.js.map +1 -0
  90. package/dist/api/graphql-api/runs/inputs/list-runs.input.js +23 -0
  91. package/dist/api/graphql-api/runs/inputs/list-runs.input.js.map +1 -0
  92. package/dist/api/graphql-api/runs/inputs/simulate-route.input.js +43 -0
  93. package/dist/api/graphql-api/runs/inputs/simulate-route.input.js.map +1 -0
  94. package/dist/api/graphql-api/runs/model/agent-activity.model.js +367 -0
  95. package/dist/api/graphql-api/runs/model/agent-activity.model.js.map +1 -0
  96. package/dist/api/graphql-api/runs/model/create-run-result.model.js +53 -0
  97. package/dist/api/graphql-api/runs/model/create-run-result.model.js.map +1 -0
  98. package/dist/api/graphql-api/runs/model/run-attempt.model.js +114 -0
  99. package/dist/api/graphql-api/runs/model/run-attempt.model.js.map +1 -0
  100. package/dist/api/graphql-api/runs/model/run-connection.model.js +16 -0
  101. package/dist/api/graphql-api/runs/model/run-connection.model.js.map +1 -0
  102. package/dist/api/graphql-api/runs/model/run-cost.model.js +67 -0
  103. package/dist/api/graphql-api/runs/model/run-cost.model.js.map +1 -0
  104. package/dist/api/graphql-api/runs/model/run-digest.model.js +41 -0
  105. package/dist/api/graphql-api/runs/model/run-digest.model.js.map +1 -0
  106. package/dist/api/graphql-api/runs/model/run-event-connection.model.js +16 -0
  107. package/dist/api/graphql-api/runs/model/run-event-connection.model.js.map +1 -0
  108. package/dist/api/graphql-api/runs/model/run-event.model.js +58 -0
  109. package/dist/api/graphql-api/runs/model/run-event.model.js.map +1 -0
  110. package/dist/api/graphql-api/runs/model/run-progress.model.js +33 -0
  111. package/dist/api/graphql-api/runs/model/run-progress.model.js.map +1 -0
  112. package/dist/api/graphql-api/runs/model/run-workflow.model.js +287 -0
  113. package/dist/api/graphql-api/runs/model/run-workflow.model.js.map +1 -0
  114. package/dist/api/graphql-api/runs/model/run.model.js +57 -0
  115. package/dist/api/graphql-api/runs/model/run.model.js.map +1 -0
  116. package/dist/api/graphql-api/runs/model/usage.model.js +32 -0
  117. package/dist/api/graphql-api/runs/model/usage.model.js.map +1 -0
  118. package/dist/api/graphql-api/runs/run-digest.resolver.js +40 -0
  119. package/dist/api/graphql-api/runs/run-digest.resolver.js.map +1 -0
  120. package/dist/api/graphql-api/runs/run-events.resolver.js +45 -0
  121. package/dist/api/graphql-api/runs/run-events.resolver.js.map +1 -0
  122. package/dist/api/graphql-api/runs/run-progress.resolver.js +53 -0
  123. package/dist/api/graphql-api/runs/run-progress.resolver.js.map +1 -0
  124. package/dist/api/graphql-api/runs/runs-subscription.resolver.js +124 -0
  125. package/dist/api/graphql-api/runs/runs-subscription.resolver.js.map +1 -0
  126. package/dist/api/graphql-api/runs/runs.resolver.js +165 -0
  127. package/dist/api/graphql-api/runs/runs.resolver.js.map +1 -0
  128. package/dist/api/graphql-api/share/graphql-param-types.js +6 -0
  129. package/dist/api/graphql-api/share/graphql-param-types.js.map +1 -0
  130. package/dist/api/graphql-api/share/inputs/connection.input.js +27 -0
  131. package/dist/api/graphql-api/share/inputs/connection.input.js.map +1 -0
  132. package/dist/api/graphql-api/share/inputs/run-subscription.input.js +22 -0
  133. package/dist/api/graphql-api/share/inputs/run-subscription.input.js.map +1 -0
  134. package/dist/api/graphql-api/share/model/paginated.model.js +75 -0
  135. package/dist/api/graphql-api/share/model/paginated.model.js.map +1 -0
  136. package/dist/api/graphql-api/system/model/daemon-status.model.js +47 -0
  137. package/dist/api/graphql-api/system/model/daemon-status.model.js.map +1 -0
  138. package/dist/api/graphql-api/system/model/doctor-result.model.js +33 -0
  139. package/dist/api/graphql-api/system/model/doctor-result.model.js.map +1 -0
  140. package/dist/api/graphql-api/system/model/project.model.js +37 -0
  141. package/dist/api/graphql-api/system/model/project.model.js.map +1 -0
  142. package/dist/api/graphql-api/system/model/repository-context.model.js +70 -0
  143. package/dist/api/graphql-api/system/model/repository-context.model.js.map +1 -0
  144. package/dist/api/graphql-api/system/model/repository-validation.model.js +62 -0
  145. package/dist/api/graphql-api/system/model/repository-validation.model.js.map +1 -0
  146. package/dist/api/graphql-api/system/model/system-status.model.js +29 -0
  147. package/dist/api/graphql-api/system/model/system-status.model.js.map +1 -0
  148. package/dist/api/graphql-api/system/system.resolver.js +83 -0
  149. package/dist/api/graphql-api/system/system.resolver.js.map +1 -0
  150. package/dist/cli/commands/doctor-report.js +70 -0
  151. package/dist/cli/commands/doctor-report.js.map +1 -0
  152. package/dist/cli/commands/lifecycle.js +463 -0
  153. package/dist/cli/commands/lifecycle.js.map +1 -0
  154. package/dist/cli/commands/mcp.js +53 -8
  155. package/dist/cli/commands/mcp.js.map +1 -1
  156. package/dist/cli/commands/process-tree.js +87 -0
  157. package/dist/cli/commands/process-tree.js.map +1 -0
  158. package/dist/cli/commands/revisium-helpers.js +2 -2
  159. package/dist/cli/commands/rogue-reaper.js +63 -0
  160. package/dist/cli/commands/rogue-reaper.js.map +1 -0
  161. package/dist/cli/index.js +5 -29
  162. package/dist/cli/index.js.map +1 -1
  163. package/dist/cli/program.js +7 -23
  164. package/dist/cli/program.js.map +1 -1
  165. package/dist/config.js +79 -1
  166. package/dist/config.js.map +1 -1
  167. package/dist/control-plane/bootstrap.js +101 -0
  168. package/dist/control-plane/bootstrap.js.map +1 -0
  169. package/dist/control-plane/change-notifications.js +35 -0
  170. package/dist/control-plane/change-notifications.js.map +1 -0
  171. package/dist/control-plane/client-transport.js +74 -41
  172. package/dist/control-plane/client-transport.js.map +1 -1
  173. package/dist/control-plane/data-access.js +13 -5
  174. package/dist/control-plane/data-access.js.map +1 -1
  175. package/dist/control-plane/definitions.js +1 -1
  176. package/dist/control-plane/definitions.js.map +1 -1
  177. package/dist/control-plane/inbox.js +5 -31
  178. package/dist/control-plane/inbox.js.map +1 -1
  179. package/dist/control-plane/index.js +1 -1
  180. package/dist/control-plane/index.js.map +1 -1
  181. package/dist/control-plane/json-fields.js +2 -0
  182. package/dist/control-plane/json-fields.js.map +1 -1
  183. package/dist/control-plane/resolve-cwd.js +76 -8
  184. package/dist/control-plane/resolve-cwd.js.map +1 -1
  185. package/dist/control-plane/schema-migration.js +82 -0
  186. package/dist/control-plane/schema-migration.js.map +1 -0
  187. package/dist/control-plane/seed-default-playbook.js +141 -0
  188. package/dist/control-plane/seed-default-playbook.js.map +1 -0
  189. package/dist/control-plane/steps.js +15 -349
  190. package/dist/control-plane/steps.js.map +1 -1
  191. package/dist/control-plane/tables.js +1 -0
  192. package/dist/control-plane/tables.js.map +1 -1
  193. package/dist/e2e/kit/agents.js +148 -0
  194. package/dist/e2e/kit/agents.js.map +1 -0
  195. package/dist/e2e/kit/assertions.js +163 -0
  196. package/dist/e2e/kit/assertions.js.map +1 -0
  197. package/dist/e2e/kit/crash.js +44 -0
  198. package/dist/e2e/kit/crash.js.map +1 -0
  199. package/dist/e2e/kit/drive.js +45 -0
  200. package/dist/e2e/kit/drive.js.map +1 -0
  201. package/dist/e2e/kit/env.js +16 -0
  202. package/dist/e2e/kit/env.js.map +1 -0
  203. package/dist/e2e/kit/fake-integrator.js +57 -0
  204. package/dist/e2e/kit/fake-integrator.js.map +1 -0
  205. package/dist/e2e/kit/gh-emulator.js +213 -0
  206. package/dist/e2e/kit/gh-emulator.js.map +1 -0
  207. package/dist/e2e/kit/git-target-repo.js +115 -0
  208. package/dist/e2e/kit/git-target-repo.js.map +1 -0
  209. package/dist/e2e/kit/harness.js +72 -0
  210. package/dist/e2e/kit/harness.js.map +1 -0
  211. package/dist/e2e/kit/index.js +14 -0
  212. package/dist/e2e/kit/index.js.map +1 -0
  213. package/dist/e2e/kit/mcp.js +32 -0
  214. package/dist/e2e/kit/mcp.js.map +1 -0
  215. package/dist/e2e/kit/scenarios.js +196 -0
  216. package/dist/e2e/kit/scenarios.js.map +1 -0
  217. package/dist/e2e/recovery-crash-child.js +29 -0
  218. package/dist/e2e/recovery-crash-child.js.map +1 -0
  219. package/dist/e2e/recovery-dd-crash-child.js +43 -0
  220. package/dist/e2e/recovery-dd-crash-child.js.map +1 -0
  221. package/dist/engine/dbos.module.js +2 -1
  222. package/dist/engine/dbos.module.js.map +1 -1
  223. package/dist/engine/dbos.service.js +89 -18
  224. package/dist/engine/dbos.service.js.map +1 -1
  225. package/dist/engine/ensure-postgres.js +18 -4
  226. package/dist/engine/ensure-postgres.js.map +1 -1
  227. package/dist/features/inbox/commands/handlers/inbox-command.handlers.js +80 -0
  228. package/dist/features/inbox/commands/handlers/inbox-command.handlers.js.map +1 -0
  229. package/dist/features/inbox/commands/impl/answer-question.command.js +7 -0
  230. package/dist/features/inbox/commands/impl/answer-question.command.js.map +1 -0
  231. package/dist/features/inbox/commands/impl/approve-gate.command.js +7 -0
  232. package/dist/features/inbox/commands/impl/approve-gate.command.js.map +1 -0
  233. package/dist/features/inbox/commands/impl/reject-gate.command.js +7 -0
  234. package/dist/features/inbox/commands/impl/reject-gate.command.js.map +1 -0
  235. package/dist/features/inbox/commands/impl/resolve-inbox-item.command.js +7 -0
  236. package/dist/features/inbox/commands/impl/resolve-inbox-item.command.js.map +1 -0
  237. package/dist/features/inbox/commands/index.js +8 -0
  238. package/dist/features/inbox/commands/index.js.map +1 -0
  239. package/dist/features/inbox/inbox-api.module.js +23 -0
  240. package/dist/features/inbox/inbox-api.module.js.map +1 -0
  241. package/dist/features/inbox/inbox-api.service.js +63 -0
  242. package/dist/features/inbox/inbox-api.service.js.map +1 -0
  243. package/dist/features/inbox/queries/handlers/inbox-query.handlers.js +111 -0
  244. package/dist/features/inbox/queries/handlers/inbox-query.handlers.js.map +1 -0
  245. package/dist/features/inbox/queries/impl/get-inbox-item.query.js +7 -0
  246. package/dist/features/inbox/queries/impl/get-inbox-item.query.js.map +1 -0
  247. package/dist/features/inbox/queries/impl/get-pending-decisions.query.js +7 -0
  248. package/dist/features/inbox/queries/impl/get-pending-decisions.query.js.map +1 -0
  249. package/dist/features/inbox/queries/impl/list-inbox.query.js +7 -0
  250. package/dist/features/inbox/queries/impl/list-inbox.query.js.map +1 -0
  251. package/dist/features/inbox/queries/impl/summarize-gate-risk.query.js +7 -0
  252. package/dist/features/inbox/queries/impl/summarize-gate-risk.query.js.map +1 -0
  253. package/dist/features/inbox/queries/index.js +8 -0
  254. package/dist/features/inbox/queries/index.js.map +1 -0
  255. package/dist/features/method/commands/index.js +2 -0
  256. package/dist/features/method/commands/index.js.map +1 -0
  257. package/dist/features/method/method-api.module.js +23 -0
  258. package/dist/features/method/method-api.module.js.map +1 -0
  259. package/dist/features/method/method-api.service.js +47 -0
  260. package/dist/features/method/method-api.service.js.map +1 -0
  261. package/dist/features/method/queries/handlers/method-query.handlers.js +115 -0
  262. package/dist/features/method/queries/handlers/method-query.handlers.js.map +1 -0
  263. package/dist/features/method/queries/impl/get-pipeline.query.js +7 -0
  264. package/dist/features/method/queries/impl/get-pipeline.query.js.map +1 -0
  265. package/dist/features/method/queries/impl/get-role.query.js +7 -0
  266. package/dist/features/method/queries/impl/get-role.query.js.map +1 -0
  267. package/dist/features/method/queries/impl/list-pipelines.query.js +7 -0
  268. package/dist/features/method/queries/impl/list-pipelines.query.js.map +1 -0
  269. package/dist/features/method/queries/impl/list-playbooks.query.js +7 -0
  270. package/dist/features/method/queries/impl/list-playbooks.query.js.map +1 -0
  271. package/dist/features/method/queries/impl/list-roles.query.js +7 -0
  272. package/dist/features/method/queries/impl/list-roles.query.js.map +1 -0
  273. package/dist/features/method/queries/index.js +9 -0
  274. package/dist/features/method/queries/index.js.map +1 -0
  275. package/dist/features/pr/commands/index.js +2 -0
  276. package/dist/features/pr/commands/index.js.map +1 -0
  277. package/dist/features/pr/pr-api.module.js +23 -0
  278. package/dist/features/pr/pr-api.module.js.map +1 -0
  279. package/dist/features/pr/pr-api.service.js +35 -0
  280. package/dist/features/pr/pr-api.service.js.map +1 -0
  281. package/dist/features/pr/queries/handlers/pr-query.handlers.js +48 -0
  282. package/dist/features/pr/queries/handlers/pr-query.handlers.js.map +1 -0
  283. package/dist/features/pr/queries/impl/get-pr-readiness.query.js +7 -0
  284. package/dist/features/pr/queries/impl/get-pr-readiness.query.js.map +1 -0
  285. package/dist/features/pr/queries/impl/list-pr-feedback.query.js +7 -0
  286. package/dist/features/pr/queries/impl/list-pr-feedback.query.js.map +1 -0
  287. package/dist/features/pr/queries/index.js +3 -0
  288. package/dist/features/pr/queries/index.js.map +1 -0
  289. package/dist/features/runs/commands/handlers/runs-command.handlers.js +32 -0
  290. package/dist/features/runs/commands/handlers/runs-command.handlers.js.map +1 -0
  291. package/dist/features/runs/commands/impl/create-run.command.js +7 -0
  292. package/dist/features/runs/commands/impl/create-run.command.js.map +1 -0
  293. package/dist/features/runs/commands/index.js +3 -0
  294. package/dist/features/runs/commands/index.js.map +1 -0
  295. package/dist/features/runs/queries/handlers/runs-query.handlers.js +359 -0
  296. package/dist/features/runs/queries/handlers/runs-query.handlers.js.map +1 -0
  297. package/dist/features/runs/queries/impl/get-agent-activity.query.js +7 -0
  298. package/dist/features/runs/queries/impl/get-agent-activity.query.js.map +1 -0
  299. package/dist/features/runs/queries/impl/get-agent-attempts.query.js +7 -0
  300. package/dist/features/runs/queries/impl/get-agent-attempts.query.js.map +1 -0
  301. package/dist/features/runs/queries/impl/get-agent-log.query.js +7 -0
  302. package/dist/features/runs/queries/impl/get-agent-log.query.js.map +1 -0
  303. package/dist/features/runs/queries/impl/get-run-attempts.query.js +7 -0
  304. package/dist/features/runs/queries/impl/get-run-attempts.query.js.map +1 -0
  305. package/dist/features/runs/queries/impl/get-run-digest.query.js +7 -0
  306. package/dist/features/runs/queries/impl/get-run-digest.query.js.map +1 -0
  307. package/dist/features/runs/queries/impl/get-run-events.query.js +7 -0
  308. package/dist/features/runs/queries/impl/get-run-events.query.js.map +1 -0
  309. package/dist/features/runs/queries/impl/get-run-progress.query.js +7 -0
  310. package/dist/features/runs/queries/impl/get-run-progress.query.js.map +1 -0
  311. package/dist/features/runs/queries/impl/get-run-workflow.query.js +7 -0
  312. package/dist/features/runs/queries/impl/get-run-workflow.query.js.map +1 -0
  313. package/dist/features/runs/queries/impl/get-run.query.js +7 -0
  314. package/dist/features/runs/queries/impl/get-run.query.js.map +1 -0
  315. package/dist/features/runs/queries/impl/list-runs.query.js +7 -0
  316. package/dist/features/runs/queries/impl/list-runs.query.js.map +1 -0
  317. package/dist/features/runs/queries/impl/simulate-route.query.js +7 -0
  318. package/dist/features/runs/queries/impl/simulate-route.query.js.map +1 -0
  319. package/dist/features/runs/queries/index.js +15 -0
  320. package/dist/features/runs/queries/index.js.map +1 -0
  321. package/dist/features/runs/runs-api.module.js +23 -0
  322. package/dist/features/runs/runs-api.module.js.map +1 -0
  323. package/dist/features/runs/runs-api.service.js +79 -0
  324. package/dist/features/runs/runs-api.service.js.map +1 -0
  325. package/dist/features/shared/connection.js +39 -0
  326. package/dist/features/shared/connection.js.map +1 -0
  327. package/dist/features/system/commands/index.js +2 -0
  328. package/dist/features/system/commands/index.js.map +1 -0
  329. package/dist/features/system/queries/handlers/system-query.handlers.js +96 -0
  330. package/dist/features/system/queries/handlers/system-query.handlers.js.map +1 -0
  331. package/dist/features/system/queries/impl/doctor.query.js +4 -0
  332. package/dist/features/system/queries/impl/doctor.query.js.map +1 -0
  333. package/dist/features/system/queries/impl/get-project.query.js +4 -0
  334. package/dist/features/system/queries/impl/get-project.query.js.map +1 -0
  335. package/dist/features/system/queries/impl/get-repository-context.query.js +7 -0
  336. package/dist/features/system/queries/impl/get-repository-context.query.js.map +1 -0
  337. package/dist/features/system/queries/impl/get-status.query.js +4 -0
  338. package/dist/features/system/queries/impl/get-status.query.js.map +1 -0
  339. package/dist/features/system/queries/impl/validate-repository.query.js +7 -0
  340. package/dist/features/system/queries/impl/validate-repository.query.js.map +1 -0
  341. package/dist/features/system/queries/index.js +9 -0
  342. package/dist/features/system/queries/index.js.map +1 -0
  343. package/dist/features/system/system-api.module.js +23 -0
  344. package/dist/features/system/system-api.module.js.map +1 -0
  345. package/dist/features/system/system-api.service.js +47 -0
  346. package/dist/features/system/system-api.service.js.map +1 -0
  347. package/dist/host/daemon.js +99 -0
  348. package/dist/host/daemon.js.map +1 -0
  349. package/dist/host/dbos-identity.js +42 -0
  350. package/dist/host/dbos-identity.js.map +1 -0
  351. package/dist/host/ensure-host.js +120 -0
  352. package/dist/host/ensure-host.js.map +1 -0
  353. package/dist/host/host-runtime.js +90 -0
  354. package/dist/host/host-runtime.js.map +1 -0
  355. package/dist/host/host.lifecycle.js +16 -3
  356. package/dist/host/host.lifecycle.js.map +1 -1
  357. package/dist/host/queue-ownership.js +70 -0
  358. package/dist/host/queue-ownership.js.map +1 -0
  359. package/dist/host/queue-poller-census.js +47 -0
  360. package/dist/host/queue-poller-census.js.map +1 -0
  361. package/dist/http/graphql-host.js +56 -0
  362. package/dist/http/graphql-host.js.map +1 -0
  363. package/dist/{mcp/mcp.module.js → http/graphql-host.module.js} +12 -10
  364. package/dist/http/graphql-host.module.js.map +1 -0
  365. package/dist/infrastructure/metrics/graphql/graphql-metrics.js +91 -0
  366. package/dist/infrastructure/metrics/graphql/graphql-metrics.js.map +1 -0
  367. package/dist/mcp/mcp-capabilities.js +9 -1
  368. package/dist/mcp/mcp-capabilities.js.map +1 -1
  369. package/dist/mcp/mcp-facade.service.js +68 -5
  370. package/dist/mcp/mcp-facade.service.js.map +1 -1
  371. package/dist/mcp/mcp-http.service.js +95 -0
  372. package/dist/mcp/mcp-http.service.js.map +1 -0
  373. package/dist/mcp/mcp-tools.js +93 -7
  374. package/dist/mcp/mcp-tools.js.map +1 -1
  375. package/dist/observability/agent-activity-reporter.js +185 -0
  376. package/dist/observability/agent-activity-reporter.js.map +1 -0
  377. package/dist/observability/agent-observability.service.js +1142 -0
  378. package/dist/observability/agent-observability.service.js.map +1 -0
  379. package/dist/observability/index.js +4 -0
  380. package/dist/observability/index.js.map +1 -0
  381. package/dist/observability/types.js +11 -0
  382. package/dist/observability/types.js.map +1 -0
  383. package/dist/pipeline/await-human.js +8 -4
  384. package/dist/pipeline/await-human.js.map +1 -1
  385. package/dist/pipeline/data-driven-task.workflow.js +667 -0
  386. package/dist/pipeline/data-driven-task.workflow.js.map +1 -0
  387. package/dist/pipeline/data-driven-template.js +57 -0
  388. package/dist/pipeline/data-driven-template.js.map +1 -0
  389. package/dist/pipeline/pipeline.module.js +2 -2
  390. package/dist/pipeline/pipeline.module.js.map +1 -1
  391. package/dist/pipeline/pipeline.service.js +412 -0
  392. package/dist/pipeline/pipeline.service.js.map +1 -0
  393. package/dist/pipeline/route-contract.js +82 -0
  394. package/dist/pipeline/route-contract.js.map +1 -0
  395. package/dist/pipeline-core/index.js +16 -0
  396. package/dist/pipeline-core/index.js.map +1 -0
  397. package/dist/pipeline-core/interpret.js +353 -0
  398. package/dist/pipeline-core/interpret.js.map +1 -0
  399. package/dist/pipeline-core/kit/assertions.js +61 -0
  400. package/dist/pipeline-core/kit/assertions.js.map +1 -0
  401. package/dist/pipeline-core/kit/builders.js +138 -0
  402. package/dist/pipeline-core/kit/builders.js.map +1 -0
  403. package/dist/pipeline-core/kit/drive.js +96 -0
  404. package/dist/pipeline-core/kit/drive.js.map +1 -0
  405. package/dist/pipeline-core/kit/fixtures.js +342 -0
  406. package/dist/pipeline-core/kit/fixtures.js.map +1 -0
  407. package/dist/pipeline-core/kit/index.js +13 -0
  408. package/dist/pipeline-core/kit/index.js.map +1 -0
  409. package/dist/pipeline-core/types.js +134 -0
  410. package/dist/pipeline-core/types.js.map +1 -0
  411. package/dist/pipeline-core/validate-capability.js +23 -0
  412. package/dist/pipeline-core/validate-capability.js.map +1 -0
  413. package/dist/pipeline-core/validate-conflicts.js +37 -0
  414. package/dist/pipeline-core/validate-conflicts.js.map +1 -0
  415. package/dist/pipeline-core/validate-dataflow.js +212 -0
  416. package/dist/pipeline-core/validate-dataflow.js.map +1 -0
  417. package/dist/pipeline-core/validate-diff.js +158 -0
  418. package/dist/pipeline-core/validate-diff.js.map +1 -0
  419. package/dist/pipeline-core/validate-edges.js +44 -0
  420. package/dist/pipeline-core/validate-edges.js.map +1 -0
  421. package/dist/pipeline-core/validate-graph.js +123 -0
  422. package/dist/pipeline-core/validate-graph.js.map +1 -0
  423. package/dist/pipeline-core/validate-loops.js +226 -0
  424. package/dist/pipeline-core/validate-loops.js.map +1 -0
  425. package/dist/pipeline-core/validate-parallel.js +132 -0
  426. package/dist/pipeline-core/validate-parallel.js.map +1 -0
  427. package/dist/pipeline-core/validate-sink.js +27 -0
  428. package/dist/pipeline-core/validate-sink.js.map +1 -0
  429. package/dist/pipeline-core/validate-topology.js +140 -0
  430. package/dist/pipeline-core/validate-topology.js.map +1 -0
  431. package/dist/pipeline-core/validate-verdict.js +72 -0
  432. package/dist/pipeline-core/validate-verdict.js.map +1 -0
  433. package/dist/pipeline-core/validate.js +119 -0
  434. package/dist/pipeline-core/validate.js.map +1 -0
  435. package/dist/playbook/catalog-loader.js +14 -1
  436. package/dist/playbook/catalog-loader.js.map +1 -1
  437. package/dist/playbook/import-mapper.js +14 -38
  438. package/dist/playbook/import-mapper.js.map +1 -1
  439. package/dist/playbook/manifest.js +1 -1
  440. package/dist/revisium/playbooks.service.js +107 -19
  441. package/dist/revisium/playbooks.service.js.map +1 -1
  442. package/dist/revisium/roles.service.js +1 -1
  443. package/dist/revisium/roles.service.js.map +1 -1
  444. package/dist/revisium/run.service.js +55 -8
  445. package/dist/revisium/run.service.js.map +1 -1
  446. package/dist/run/append-event.js +24 -1
  447. package/dist/run/append-event.js.map +1 -1
  448. package/dist/run/block-run.js +17 -0
  449. package/dist/run/block-run.js.map +1 -0
  450. package/dist/run/complete-run.js +18 -0
  451. package/dist/run/complete-run.js.map +1 -0
  452. package/dist/run/create-run.js +33 -36
  453. package/dist/run/create-run.js.map +1 -1
  454. package/dist/run/inspect-run.js +31 -30
  455. package/dist/run/inspect-run.js.map +1 -1
  456. package/dist/run/run-outputs.js +88 -0
  457. package/dist/run/run-outputs.js.map +1 -0
  458. package/dist/run/terminal-run-status.js +66 -7
  459. package/dist/run/terminal-run-status.js.map +1 -1
  460. package/dist/runners/claude-code.service.js +5 -0
  461. package/dist/runners/claude-code.service.js.map +1 -1
  462. package/dist/runners/codex.service.js +51 -0
  463. package/dist/runners/codex.service.js.map +1 -0
  464. package/dist/runners/integrator-branch-naming.js +39 -0
  465. package/dist/runners/integrator-branch-naming.js.map +1 -0
  466. package/dist/runners/integrator-git.js +84 -0
  467. package/dist/runners/integrator-git.js.map +1 -0
  468. package/dist/runners/integrator-remote.js +34 -0
  469. package/dist/runners/integrator-remote.js.map +1 -0
  470. package/dist/runners/integrator-types.js +9 -0
  471. package/dist/runners/integrator-types.js.map +1 -0
  472. package/dist/runners/integrator.js +327 -147
  473. package/dist/runners/integrator.js.map +1 -1
  474. package/dist/runners/runner.module.js +7 -3
  475. package/dist/runners/runner.module.js.map +1 -1
  476. package/dist/runners/worktree.service.js +63 -0
  477. package/dist/runners/worktree.service.js.map +1 -0
  478. package/dist/smoke/cli.js +47 -0
  479. package/dist/smoke/cli.js.map +1 -0
  480. package/dist/smoke/isolation.js +113 -0
  481. package/dist/smoke/isolation.js.map +1 -0
  482. package/dist/task-control-plane/run-watch.service.js +281 -0
  483. package/dist/task-control-plane/run-watch.service.js.map +1 -0
  484. package/dist/task-control-plane/task-control-plane-api.service.js +569 -23
  485. package/dist/task-control-plane/task-control-plane-api.service.js.map +1 -1
  486. package/dist/task-control-plane/task-control-plane.module.js +22 -3
  487. package/dist/task-control-plane/task-control-plane.module.js.map +1 -1
  488. package/dist/worker/artifact-store.js +116 -0
  489. package/dist/worker/artifact-store.js.map +1 -0
  490. package/dist/worker/build-context.js +169 -2
  491. package/dist/worker/build-context.js.map +1 -1
  492. package/dist/worker/claude-code-runner.js +159 -68
  493. package/dist/worker/claude-code-runner.js.map +1 -1
  494. package/dist/worker/codex-runner.js +474 -0
  495. package/dist/worker/codex-runner.js.map +1 -0
  496. package/dist/worker/git-worktree-manager.js +129 -65
  497. package/dist/worker/git-worktree-manager.js.map +1 -1
  498. package/dist/worker/process-executor.js +23 -2
  499. package/dist/worker/process-executor.js.map +1 -1
  500. package/dist/worker/result-envelope.js +115 -57
  501. package/dist/worker/result-envelope.js.map +1 -1
  502. package/dist/worker/runner-common.js +106 -0
  503. package/dist/worker/runner-common.js.map +1 -0
  504. package/dist/worker/runner-dispatch.js +4 -1
  505. package/dist/worker/runner-dispatch.js.map +1 -1
  506. package/dist/worker/runner.js +11 -1
  507. package/dist/worker/runner.js.map +1 -1
  508. package/dist/worker/stub-runner.js +7 -45
  509. package/dist/worker/stub-runner.js.map +1 -1
  510. package/package.json +32 -7
  511. package/dist/app.module.js +0 -28
  512. package/dist/app.module.js.map +0 -1
  513. package/dist/cli/commands/bootstrap.js +0 -39
  514. package/dist/cli/commands/bootstrap.js.map +0 -1
  515. package/dist/cli/commands/dev.js +0 -143
  516. package/dist/cli/commands/dev.js.map +0 -1
  517. package/dist/cli/commands/inbox.js +0 -288
  518. package/dist/cli/commands/inbox.js.map +0 -1
  519. package/dist/cli/commands/playbook.js +0 -74
  520. package/dist/cli/commands/playbook.js.map +0 -1
  521. package/dist/cli/commands/poll-workflow-state.js +0 -144
  522. package/dist/cli/commands/poll-workflow-state.js.map +0 -1
  523. package/dist/cli/commands/revisium-context.js +0 -23
  524. package/dist/cli/commands/revisium-context.js.map +0 -1
  525. package/dist/cli/commands/revisium.js +0 -89
  526. package/dist/cli/commands/revisium.js.map +0 -1
  527. package/dist/cli/commands/run.js +0 -426
  528. package/dist/cli/commands/run.js.map +0 -1
  529. package/dist/cli/commands/work.js +0 -149
  530. package/dist/cli/commands/work.js.map +0 -1
  531. package/dist/cli/live-guard.js +0 -49
  532. package/dist/cli/live-guard.js.map +0 -1
  533. package/dist/cli/needs-host.js +0 -78
  534. package/dist/cli/needs-host.js.map +0 -1
  535. package/dist/mcp/mcp-stdio.service.js +0 -48
  536. package/dist/mcp/mcp-stdio.service.js.map +0 -1
  537. package/dist/mcp/mcp.module.js.map +0 -1
  538. package/dist/pipeline/develop-task.workflow.js +0 -497
  539. package/dist/pipeline/develop-task.workflow.js.map +0 -1
  540. package/dist/worker/loop.js +0 -122
  541. package/dist/worker/loop.js.map +0 -1
  542. package/dist/worker/script-runner.js +0 -28
  543. package/dist/worker/script-runner.js.map +0 -1
  544. package/dist/worker/worker-id.js +0 -18
  545. package/dist/worker/worker-id.js.map +0 -1
  546. package/dist/worker/worktree-manager.js +0 -7
  547. package/dist/worker/worktree-manager.js.map +0 -1
@@ -0,0 +1,39 @@
1
+ const DEFAULT_FIRST = 50;
2
+ const MAX_FIRST = 500;
3
+ function encodeCursor(index) {
4
+ return Buffer.from(String(index), 'utf8').toString('base64url');
5
+ }
6
+ function decodeCursor(cursor) {
7
+ if (!cursor)
8
+ return -1;
9
+ const raw = Buffer.from(cursor, 'base64url').toString('utf8');
10
+ const index = Number(raw);
11
+ return Number.isInteger(index) && index >= 0 ? index : -1;
12
+ }
13
+ function normalizeFirst(first) {
14
+ return Math.min(Math.max(first ?? DEFAULT_FIRST, 0), MAX_FIRST);
15
+ }
16
+ export function connectionFetchLimit(input = {}) {
17
+ const start = decodeCursor(input.after) + 1;
18
+ return start + normalizeFirst(input.first) + 1;
19
+ }
20
+ export function toConnection(items, input = {}) {
21
+ const first = normalizeFirst(input.first);
22
+ const start = decodeCursor(input.after) + 1;
23
+ const page = items.slice(start, start + first);
24
+ const edges = page.map((node, offset) => ({
25
+ cursor: encodeCursor(start + offset),
26
+ node,
27
+ }));
28
+ return {
29
+ edges,
30
+ totalCount: items.length,
31
+ pageInfo: {
32
+ startCursor: edges[0]?.cursor,
33
+ endCursor: edges.at(-1)?.cursor,
34
+ hasPreviousPage: start > 0,
35
+ hasNextPage: start + first < items.length,
36
+ },
37
+ };
38
+ }
39
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/features/shared/connection.ts"],"names":[],"mappings":"AAOA,MAAM,aAAa,GAAG,EAAE,CAAC;AACzB,MAAM,SAAS,GAAG,GAAG,CAAC;AAEtB,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,YAAY,CAAC,MAA0B;IAC9C,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC,CAAC;IACvB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,cAAc,CAAC,KAAyB;IAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,aAAa,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAyB,EAAE;IAC9D,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5C,OAAO,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,YAAY,CAAI,KAAU,EAAE,QAAyB,EAAE;IACrE,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACxC,MAAM,EAAE,YAAY,CAAC,KAAK,GAAG,MAAM,CAAC;QACpC,IAAI;KACL,CAAC,CAAC,CAAC;IACJ,OAAO;QACL,KAAK;QACL,UAAU,EAAE,KAAK,CAAC,MAAM;QACxB,QAAQ,EAAE;YACR,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM;YAC7B,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM;YAC/B,eAAe,EAAE,KAAK,GAAG,CAAC;YAC1B,WAAW,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,MAAM;SAC1C;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const systemCommandHandlers = [];
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/features/system/commands/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC"}
@@ -0,0 +1,96 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { Inject } from '@nestjs/common';
14
+ import { QueryHandler } from '@nestjs/cqrs';
15
+ import { TaskControlPlaneApiService } from '../../../../task-control-plane/task-control-plane-api.service.js';
16
+ import { DoctorQuery } from '../impl/doctor.query.js';
17
+ import { GetProjectQuery } from '../impl/get-project.query.js';
18
+ import { GetRepositoryContextQuery } from '../impl/get-repository-context.query.js';
19
+ import { GetStatusQuery } from '../impl/get-status.query.js';
20
+ import { ValidateRepositoryQuery } from '../impl/validate-repository.query.js';
21
+ let GetStatusHandler = class GetStatusHandler {
22
+ api;
23
+ constructor(api) {
24
+ this.api = api;
25
+ }
26
+ execute() {
27
+ return this.api.getStatus();
28
+ }
29
+ };
30
+ GetStatusHandler = __decorate([
31
+ QueryHandler(GetStatusQuery),
32
+ __param(0, Inject(TaskControlPlaneApiService)),
33
+ __metadata("design:paramtypes", [TaskControlPlaneApiService])
34
+ ], GetStatusHandler);
35
+ export { GetStatusHandler };
36
+ let GetProjectHandler = class GetProjectHandler {
37
+ api;
38
+ constructor(api) {
39
+ this.api = api;
40
+ }
41
+ async execute() {
42
+ return this.api.getProject();
43
+ }
44
+ };
45
+ GetProjectHandler = __decorate([
46
+ QueryHandler(GetProjectQuery),
47
+ __param(0, Inject(TaskControlPlaneApiService)),
48
+ __metadata("design:paramtypes", [TaskControlPlaneApiService])
49
+ ], GetProjectHandler);
50
+ export { GetProjectHandler };
51
+ let DoctorHandler = class DoctorHandler {
52
+ api;
53
+ constructor(api) {
54
+ this.api = api;
55
+ }
56
+ execute() {
57
+ return this.api.doctor();
58
+ }
59
+ };
60
+ DoctorHandler = __decorate([
61
+ QueryHandler(DoctorQuery),
62
+ __param(0, Inject(TaskControlPlaneApiService)),
63
+ __metadata("design:paramtypes", [TaskControlPlaneApiService])
64
+ ], DoctorHandler);
65
+ export { DoctorHandler };
66
+ let ValidateRepositoryHandler = class ValidateRepositoryHandler {
67
+ api;
68
+ constructor(api) {
69
+ this.api = api;
70
+ }
71
+ execute(query) {
72
+ return this.api.validateRepository(query.data.repo);
73
+ }
74
+ };
75
+ ValidateRepositoryHandler = __decorate([
76
+ QueryHandler(ValidateRepositoryQuery),
77
+ __param(0, Inject(TaskControlPlaneApiService)),
78
+ __metadata("design:paramtypes", [TaskControlPlaneApiService])
79
+ ], ValidateRepositoryHandler);
80
+ export { ValidateRepositoryHandler };
81
+ let GetRepositoryContextHandler = class GetRepositoryContextHandler {
82
+ api;
83
+ constructor(api) {
84
+ this.api = api;
85
+ }
86
+ execute(query) {
87
+ return this.api.getRepositoryContext(query.data.repo);
88
+ }
89
+ };
90
+ GetRepositoryContextHandler = __decorate([
91
+ QueryHandler(GetRepositoryContextQuery),
92
+ __param(0, Inject(TaskControlPlaneApiService)),
93
+ __metadata("design:paramtypes", [TaskControlPlaneApiService])
94
+ ], GetRepositoryContextHandler);
95
+ export { GetRepositoryContextHandler };
96
+ //# sourceMappingURL=system-query.handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-query.handlers.js","sourceRoot":"","sources":["../../../../../src/features/system/queries/handlers/system-query.handlers.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAiB,YAAY,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,kEAAkE,CAAC;AAC9G,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAGxE,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IACsC;IAAjE,YAAiE,GAA+B;QAA/B,QAAG,GAAH,GAAG,CAA4B;IAAG,CAAC;IAEpG,OAAO;QACL,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;IAC9B,CAAC;CACF,CAAA;AANY,gBAAgB;IAD5B,YAAY,CAAC,cAAc,CAAC;IAEd,WAAA,MAAM,CAAC,0BAA0B,CAAC,CAAA;qCAAuB,0BAA0B;GADrF,gBAAgB,CAM5B;;AAGM,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IACqC;IAAjE,YAAiE,GAA+B;QAA/B,QAAG,GAAH,GAAG,CAA4B;IAAG,CAAC;IAEpG,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;IAC/B,CAAC;CACF,CAAA;AANY,iBAAiB;IAD7B,YAAY,CAAC,eAAe,CAAC;IAEf,WAAA,MAAM,CAAC,0BAA0B,CAAC,CAAA;qCAAuB,0BAA0B;GADrF,iBAAiB,CAM7B;;AAGM,IAAM,aAAa,GAAnB,MAAM,aAAa;IACyC;IAAjE,YAAiE,GAA+B;QAA/B,QAAG,GAAH,GAAG,CAA4B;IAAG,CAAC;IAEpG,OAAO;QACL,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IAC3B,CAAC;CACF,CAAA;AANY,aAAa;IADzB,YAAY,CAAC,WAAW,CAAC;IAEX,WAAA,MAAM,CAAC,0BAA0B,CAAC,CAAA;qCAAuB,0BAA0B;GADrF,aAAa,CAMzB;;AAGM,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IAC6B;IAAjE,YAAiE,GAA+B;QAA/B,QAAG,GAAH,GAAG,CAA4B;IAAG,CAAC;IAEpG,OAAO,CAAC,KAA8B;QACpC,OAAO,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;CACF,CAAA;AANY,yBAAyB;IADrC,YAAY,CAAC,uBAAuB,CAAC;IAEvB,WAAA,MAAM,CAAC,0BAA0B,CAAC,CAAA;qCAAuB,0BAA0B;GADrF,yBAAyB,CAMrC;;AAGM,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IAC2B;IAAjE,YAAiE,GAA+B;QAA/B,QAAG,GAAH,GAAG,CAA4B;IAAG,CAAC;IAEpG,OAAO,CAAC,KAAgC;QACtC,OAAO,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;CACF,CAAA;AANY,2BAA2B;IADvC,YAAY,CAAC,yBAAyB,CAAC;IAEzB,WAAA,MAAM,CAAC,0BAA0B,CAAC,CAAA;qCAAuB,0BAA0B;GADrF,2BAA2B,CAMvC"}
@@ -0,0 +1,4 @@
1
+ export class DoctorQuery {
2
+ kind = 'doctor';
3
+ }
4
+ //# sourceMappingURL=doctor.query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.query.js","sourceRoot":"","sources":["../../../../../src/features/system/queries/impl/doctor.query.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,WAAW;IACb,IAAI,GAAG,QAAQ,CAAC;CAC1B"}
@@ -0,0 +1,4 @@
1
+ export class GetProjectQuery {
2
+ kind = 'getProject';
3
+ }
4
+ //# sourceMappingURL=get-project.query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-project.query.js","sourceRoot":"","sources":["../../../../../src/features/system/queries/impl/get-project.query.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAe;IACjB,IAAI,GAAG,YAAY,CAAC;CAC9B"}
@@ -0,0 +1,7 @@
1
+ export class GetRepositoryContextQuery {
2
+ data;
3
+ constructor(data) {
4
+ this.data = data;
5
+ }
6
+ }
7
+ //# sourceMappingURL=get-repository-context.query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-repository-context.query.js","sourceRoot":"","sources":["../../../../../src/features/system/queries/impl/get-repository-context.query.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,yBAAyB;IACf;IAArB,YAAqB,IAAmC;QAAnC,SAAI,GAAJ,IAAI,CAA+B;IAAG,CAAC;CAC7D"}
@@ -0,0 +1,4 @@
1
+ export class GetStatusQuery {
2
+ kind = 'getStatus';
3
+ }
4
+ //# sourceMappingURL=get-status.query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-status.query.js","sourceRoot":"","sources":["../../../../../src/features/system/queries/impl/get-status.query.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,WAAW,CAAC;CAC7B"}
@@ -0,0 +1,7 @@
1
+ export class ValidateRepositoryQuery {
2
+ data;
3
+ constructor(data) {
4
+ this.data = data;
5
+ }
6
+ }
7
+ //# sourceMappingURL=validate-repository.query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-repository.query.js","sourceRoot":"","sources":["../../../../../src/features/system/queries/impl/validate-repository.query.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,uBAAuB;IACb;IAArB,YAAqB,IAAiC;QAAjC,SAAI,GAAJ,IAAI,CAA6B;IAAG,CAAC;CAC3D"}
@@ -0,0 +1,9 @@
1
+ import { DoctorHandler, GetProjectHandler, GetRepositoryContextHandler, GetStatusHandler, ValidateRepositoryHandler, } from './handlers/system-query.handlers.js';
2
+ export const systemQueryHandlers = [
3
+ DoctorHandler,
4
+ GetProjectHandler,
5
+ GetRepositoryContextHandler,
6
+ GetStatusHandler,
7
+ ValidateRepositoryHandler,
8
+ ];
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/features/system/queries/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,2BAA2B,EAC3B,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,qCAAqC,CAAC;AAE7C,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,aAAa;IACb,iBAAiB;IACjB,2BAA2B;IAC3B,gBAAgB;IAChB,yBAAyB;CAC1B,CAAC"}
@@ -0,0 +1,23 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { Module } from '@nestjs/common';
8
+ import { CqrsModule } from '@nestjs/cqrs';
9
+ import { TaskControlPlaneModule } from '../../task-control-plane/task-control-plane.module.js';
10
+ import { systemCommandHandlers } from './commands/index.js';
11
+ import { SystemApiService } from './system-api.service.js';
12
+ import { systemQueryHandlers } from './queries/index.js';
13
+ let SystemApiModule = class SystemApiModule {
14
+ };
15
+ SystemApiModule = __decorate([
16
+ Module({
17
+ imports: [CqrsModule, TaskControlPlaneModule],
18
+ providers: [SystemApiService, ...systemQueryHandlers, ...systemCommandHandlers],
19
+ exports: [SystemApiService],
20
+ })
21
+ ], SystemApiModule);
22
+ export { SystemApiModule };
23
+ //# sourceMappingURL=system-api.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-api.module.js","sourceRoot":"","sources":["../../../src/features/system/system-api.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,uDAAuD,CAAC;AAC/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAOlD,IAAM,eAAe,GAArB,MAAM,eAAe;CAAG,CAAA;AAAlB,eAAe;IAL3B,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,UAAU,EAAE,sBAAsB,CAAC;QAC7C,SAAS,EAAE,CAAC,gBAAgB,EAAE,GAAG,mBAAmB,EAAE,GAAG,qBAAqB,CAAC;QAC/E,OAAO,EAAE,CAAC,gBAAgB,CAAC;KAC5B,CAAC;GACW,eAAe,CAAG"}
@@ -0,0 +1,47 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { Inject, Injectable } from '@nestjs/common';
14
+ import { QueryBus } from '@nestjs/cqrs';
15
+ import { DoctorQuery } from './queries/impl/doctor.query.js';
16
+ import { GetProjectQuery } from './queries/impl/get-project.query.js';
17
+ import { GetRepositoryContextQuery } from './queries/impl/get-repository-context.query.js';
18
+ import { GetStatusQuery } from './queries/impl/get-status.query.js';
19
+ import { ValidateRepositoryQuery } from './queries/impl/validate-repository.query.js';
20
+ let SystemApiService = class SystemApiService {
21
+ queryBus;
22
+ constructor(queryBus) {
23
+ this.queryBus = queryBus;
24
+ }
25
+ status() {
26
+ return this.queryBus.execute(new GetStatusQuery());
27
+ }
28
+ project() {
29
+ return this.queryBus.execute(new GetProjectQuery());
30
+ }
31
+ doctor() {
32
+ return this.queryBus.execute(new DoctorQuery());
33
+ }
34
+ validateRepository(data) {
35
+ return this.queryBus.execute(new ValidateRepositoryQuery(data));
36
+ }
37
+ repositoryContext(data) {
38
+ return this.queryBus.execute(new GetRepositoryContextQuery(data));
39
+ }
40
+ };
41
+ SystemApiService = __decorate([
42
+ Injectable(),
43
+ __param(0, Inject(QueryBus)),
44
+ __metadata("design:paramtypes", [QueryBus])
45
+ ], SystemApiService);
46
+ export { SystemApiService };
47
+ //# sourceMappingURL=system-api.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-api.service.js","sourceRoot":"","sources":["../../../src/features/system/system-api.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAsC,MAAM,gDAAgD,CAAC;AAC/H,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAoC,MAAM,6CAA6C,CAAC;AAGjH,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IACoB;IAA/C,YAA+C,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;IAAG,CAAC;IAErE,MAAM;QACJ,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,kBAAkB,CAAC,IAAiC;QAClD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,iBAAiB,CAAC,IAAmC;QACnD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC;IACpE,CAAC;CACF,CAAA;AAtBY,gBAAgB;IAD5B,UAAU,EAAE;IAEE,WAAA,MAAM,CAAC,QAAQ,CAAC,CAAA;qCAA4B,QAAQ;GADtD,gBAAgB,CAsB5B"}
@@ -0,0 +1,99 @@
1
+ import { getConfig } from '../config.js';
2
+ import { startGraphqlHost } from '../http/graphql-host.js';
3
+ import { ensureRevisium } from './ensure-revisium.js';
4
+ import { bootstrapControlPlane, listInstalledPlaybooks } from '../control-plane/bootstrap.js';
5
+ import { createDaemonInstaller, seedDefaultPlaybook, seedDefaultPlaybookBestEffort, } from '../control-plane/seed-default-playbook.js';
6
+ import { McpFacadeService } from '../mcp/mcp-facade.service.js';
7
+ import { McpHttpService } from '../mcp/mcp-http.service.js';
8
+ import { RunWatchService } from '../task-control-plane/run-watch.service.js';
9
+ import { TaskControlPlaneApiService } from '../task-control-plane/task-control-plane-api.service.js';
10
+ import { APP_PUB_SUB } from '../api/graphql-api/graphql-ws/constants.js';
11
+ import { hostCodeVersion, removeHostRuntimeIfMatches, writeHostRuntime } from './host-runtime.js';
12
+ import { acquireQueueOwnership } from './queue-ownership.js';
13
+ /** MCP endpoint port: REVO_MCP_PORT, else the GraphQL port + 1 (kept in the profile band). */
14
+ function resolveMcpPort(graphqlPort) {
15
+ const env = process.env['REVO_MCP_PORT'];
16
+ return env && /^\d+$/.test(env.trim()) ? Number(env.trim()) : graphqlPort + 1;
17
+ }
18
+ /** The detached host-daemon entrypoint (spawned by ensureHost): boot the stack, then serve + stay alive. */
19
+ export async function runHostDaemon() {
20
+ // 1. Standalone up first, then 2. all control-plane writes via fresh client scopes — BEFORE the
21
+ // service layer (startGraphqlHost) caches its read scope, so same-boot reads see a ready control-plane.
22
+ const { runtime } = await ensureRevisium();
23
+ // Singleton gate (slice 139): exactly ONE host daemon per profile may own + poll the dev-tasks
24
+ // queue. Acquired here — BEFORE DBOS.launch()/queue polling (startGraphqlHost) — so a daemon that
25
+ // lost a concurrent cold-start race exits cleanly without ever touching the queue; ensureHost then
26
+ // attaches to the winner via host.json. Crash-safe: the connection-scoped advisory lock frees itself
27
+ // if this process dies.
28
+ const ownership = await acquireQueueOwnership(getConfig().profile, runtime.pgPort);
29
+ if (!ownership.owned) {
30
+ console.error(`[host] profile "${getConfig().profile}" is already owned by another daemon — exiting; the owner serves the queue.`);
31
+ process.exit(0);
32
+ }
33
+ await bootstrapControlPlane(runtime.httpPort);
34
+ await seedDefaultPlaybookBestEffort(() => seedDefaultPlaybook(createDaemonInstaller(() => listInstalledPlaybooks(runtime.httpPort))));
35
+ // 3. Now bring up the Nest/GraphQL/DBOS layer (HostLifecycle re-ensures Revisium = no-op).
36
+ const started = await startGraphqlHost();
37
+ // 4. MCP front door + 5. host.json. Wrapped so a failure AFTER startGraphqlHost (DBOS already
38
+ // launched) never leaves a live DBOS owner without host.json: on error we close the MCP server +
39
+ // Nest app (→ DBOS.shutdown) and exit non-zero, so ensureHost reports the failure, not a zombie.
40
+ let mcpServer;
41
+ try {
42
+ // Build the MCP facade from the DI-resolved TaskControlPlaneApiService (the surface the GraphQL
43
+ // resolvers use): resolving McpFacadeService itself via app.get left its injected `api` undefined.
44
+ const mcpPort = resolveMcpPort(started.port);
45
+ const api = started.app.get(TaskControlPlaneApiService, { strict: false });
46
+ // Option A (slice 141 D2): give the watch primitive APP_PUB_SUB so a gate/terminal wakes a held
47
+ // long-poll instead of polling. PubSubModule is @Global, so it resolves off the started handle; if
48
+ // it can't, RunWatchService degrades to its internal poll (option B) — same correctness.
49
+ let watchPubSub;
50
+ try {
51
+ watchPubSub = started.app.get(APP_PUB_SUB, { strict: false });
52
+ }
53
+ catch {
54
+ watchPubSub = undefined;
55
+ }
56
+ const runWatch = new RunWatchService(api, watchPubSub);
57
+ mcpServer = await new McpHttpService(new McpFacadeService(api, runWatch)).start(mcpPort);
58
+ const startedAt = new Date().toISOString();
59
+ const snapshot = { pid: process.pid, startedAt };
60
+ // host.json is written LAST — its presence is the "fully ready" signal ensureHost waits on.
61
+ writeHostRuntime({
62
+ pid: process.pid,
63
+ graphqlPort: started.port,
64
+ mcpPort,
65
+ startedAt,
66
+ profile: getConfig().profile,
67
+ version: hostCodeVersion(),
68
+ });
69
+ const runningMcp = mcpServer;
70
+ let closing = false;
71
+ const shutdown = () => {
72
+ if (closing)
73
+ return;
74
+ closing = true;
75
+ runningMcp.close();
76
+ started.app
77
+ .close() // → HostLifecycle.onApplicationShutdown → DBOS.shutdown()
78
+ .catch(() => undefined)
79
+ .finally(() => {
80
+ ownership
81
+ .release() // free the dev-tasks ownership lock for the next daemon
82
+ .catch(() => undefined)
83
+ .finally(() => {
84
+ removeHostRuntimeIfMatches(snapshot);
85
+ process.exit(0);
86
+ });
87
+ });
88
+ };
89
+ process.on('SIGTERM', shutdown);
90
+ process.on('SIGINT', shutdown);
91
+ }
92
+ catch (err) {
93
+ mcpServer?.close();
94
+ await started.app.close().catch(() => undefined);
95
+ await ownership.release().catch(() => undefined);
96
+ throw err;
97
+ }
98
+ }
99
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/host/daemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Pinned DBOS identity for the host daemon (slice 140, Part A Layer 2).
3
+ *
4
+ * DBOS derives two identifiers from the environment AT IMPORT TIME (dbos-sdk `utils.js` `globalParams`
5
+ * is a module-level literal: `executorID = process.env.DBOS__VMID || 'local'`,
6
+ * `appVersion = process.env.DBOS__APPVERSION || ''`). Left unset, every daemon is `executorID='local'`
7
+ * with a source-MD5 appVersion — indistinguishable in `pg_stat_activity` and brittle across releases.
8
+ * We pin both, so:
9
+ * - executorID = `revo-<profile>` makes each daemon's DBOS connections self-identifying in
10
+ * `pg_stat_activity.application_name` (`dbos_transact_<executorID>_<appVersion>`), which is the
11
+ * ONLY way `revo doctor` can see a rogue/legacy poller that holds no inbound port.
12
+ * - appVersion = a value WE control, decoupled from the npm release version. DBOS recovery keys on
13
+ * a HARD `application_version` equality, so a per-release version would strand in-flight PENDING
14
+ * work on every alpha bump. Pinning a stable workflow version keeps recovery working across a
15
+ * routine upgrade; it is bumped ONLY when the durable workflow/step SOURCE actually changes.
16
+ *
17
+ * Because `globalParams` is read at import time, the pin must be present in the daemon process's
18
+ * environment from the start — it is applied to the detached child's env in `ensure-host.spawnDaemon`,
19
+ * never mutated after the dbos-sdk module has loaded.
20
+ */
21
+ /**
22
+ * Pinned DBOS `appVersion`. NOT the npm package version — bump this ONLY when the durable DBOS
23
+ * workflow/step function SOURCE changes (which moves the recovery/dequeue version boundary). A routine
24
+ * release that does not touch workflow-step code keeps this value so in-flight work recovers cleanly.
25
+ */
26
+ export const DBOS_WORKFLOW_VERSION = '1';
27
+ /** Stable per-profile DBOS executor id (`revo-<profile>`) — the owner identity the census matches on. */
28
+ export function dbosExecutorId(profile) {
29
+ return `revo-${profile}`;
30
+ }
31
+ /**
32
+ * The `DBOS__VMID` / `DBOS__APPVERSION` env pin for a profile's daemon. An explicitly-SET value in
33
+ * `env` wins (so a custom layout / test can override) — including an explicit empty string, hence `??`
34
+ * not `||`; only an absent (undefined) var falls back to the pinned defaults.
35
+ */
36
+ export function dbosEnvPin(profile, env = process.env) {
37
+ return {
38
+ DBOS__VMID: env['DBOS__VMID'] ?? dbosExecutorId(profile),
39
+ DBOS__APPVERSION: env['DBOS__APPVERSION'] ?? DBOS_WORKFLOW_VERSION,
40
+ };
41
+ }
42
+ //# sourceMappingURL=dbos-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dbos-identity.js","sourceRoot":"","sources":["../../src/host/dbos-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAEzC,yGAAyG;AACzG,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,QAAQ,OAAO,EAAE,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,OAAe,EACf,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO;QACL,UAAU,EAAE,GAAG,CAAC,YAAY,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC;QACxD,gBAAgB,EAAE,GAAG,CAAC,kBAAkB,CAAC,IAAI,qBAAqB;KACnE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * ensureHost() — attach-or-spawn the long-lived Revo host daemon (ADR 0006), mirroring the
3
+ * three-state model of ensureRevisium:
4
+ * 1. HEALTHY → attach, return alreadyRunning=true.
5
+ * 2. ALIVE BUT UNHEALTHY → wait for it to finish booting; never spawn a duplicate (the GraphQL
6
+ * port would collide), then throw if it stays unhealthy.
7
+ * 3. NO LIVE DAEMON → spawn detached + unref, wait for GraphQL health.
8
+ *
9
+ * The daemon is the single DBOS owner; this helper is the ONLY way the stack acquires a host.
10
+ */
11
+ import { spawn } from 'node:child_process';
12
+ import { closeSync, openSync } from 'node:fs';
13
+ import { getConfig, isAlive, resolveDefaultGraphqlPort } from '../config.js';
14
+ import { hostCodeVersion, isHostRunning, readHostRuntime, removeHostRuntime, } from './host-runtime.js';
15
+ import { dbosEnvPin } from './dbos-identity.js';
16
+ const DEFAULT_TIMEOUT_MS = 120_000;
17
+ /** Budget to let an alive-but-not-yet-healthy daemon finish booting before giving up. */
18
+ const DEFAULT_RECHECK_MS = 20_000;
19
+ const POLL_INTERVAL_MS = 300;
20
+ /** The GraphQL port the daemon listens on — must match startGraphqlHost's resolution. */
21
+ export function expectedGraphqlPort() {
22
+ const env = process.env['REVO_GRAPHQL_PORT'];
23
+ if (env && /^\d+$/.test(env.trim()))
24
+ return Number(env.trim());
25
+ return resolveDefaultGraphqlPort();
26
+ }
27
+ /** GraphQL liveness probe: the daemon answers a trivial query on its port. */
28
+ export async function isGraphqlHealthy(port) {
29
+ try {
30
+ const res = await fetch(`http://127.0.0.1:${port}/graphql`, {
31
+ method: 'POST',
32
+ headers: { 'content-type': 'application/json' },
33
+ body: JSON.stringify({ query: '{ __typename }' }),
34
+ signal: AbortSignal.timeout(3000),
35
+ });
36
+ return res.ok;
37
+ }
38
+ catch {
39
+ return false;
40
+ }
41
+ }
42
+ /**
43
+ * Ready = `host.json` present with a LIVE pid AND GraphQL answering. The daemon writes host.json
44
+ * last (after the control-plane bootstrap), so readiness implies the whole stack is usable — not
45
+ * merely that the GraphQL socket is open.
46
+ */
47
+ async function waitForReady(timeoutMs) {
48
+ const deadline = Date.now() + timeoutMs;
49
+ for (;;) {
50
+ const runtime = readHostRuntime();
51
+ if (runtime && isAlive(runtime.pid) && (await isGraphqlHealthy(runtime.graphqlPort)))
52
+ return runtime;
53
+ if (Date.now() >= deadline)
54
+ return null;
55
+ await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
56
+ }
57
+ }
58
+ /**
59
+ * Build the argv to re-invoke THIS CLI as the detached daemon. Handles dev (tsx running the `.ts`
60
+ * source — node needs the tsx loader) vs prod (node running the compiled `.js` entry directly).
61
+ * `entry` defaults to this process's script; it is a parameter so the dev/prod split is unit-testable.
62
+ */
63
+ export function daemonSpawnArgv(entry = process.argv[1]) {
64
+ const daemonArgs = ['__daemon'];
65
+ if (entry.endsWith('.ts')) {
66
+ return [process.execPath, ['--import', 'tsx', entry, ...daemonArgs]];
67
+ }
68
+ return [process.execPath, [entry, ...daemonArgs]];
69
+ }
70
+ function spawnDaemon() {
71
+ const out = openSync(getConfig().hostLogFile, 'a');
72
+ const [cmd, args] = daemonSpawnArgv();
73
+ // env inheritance carries the resolved profile (REVO_PROFILE / REVO_* knobs) to the daemon, PLUS the
74
+ // pinned DBOS identity (DBOS__VMID/DBOS__APPVERSION). dbos-sdk reads those at IMPORT time, so they
75
+ // must be in the child's env from the start — set here, never mutated after launch (slice 140).
76
+ const env = { ...process.env, ...dbosEnvPin(getConfig().profile, process.env) };
77
+ const child = spawn(cmd, args, { detached: true, stdio: ['ignore', out, out], env });
78
+ closeSync(out);
79
+ if (!child.pid)
80
+ throw new Error('Failed to spawn Revo host daemon: spawn returned no pid');
81
+ child.unref(); // detached — the daemon outlives this CLI process
82
+ }
83
+ /** Attach to the running host daemon, or spawn one if absent — the only way the stack acquires a host. */
84
+ export async function ensureHost(options = {}) {
85
+ const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
86
+ const recheckMs = options.recheckMs ?? DEFAULT_RECHECK_MS;
87
+ const existing = readHostRuntime();
88
+ if (existing && isHostRunning()) {
89
+ if (await isGraphqlHealthy(existing.graphqlPort)) {
90
+ // Version-check (slice 139): surface a daemon running a DIFFERENT build than this install so it
91
+ // can't silently serve stale behavior. We warn (not auto-kill) to avoid disrupting in-flight runs;
92
+ // `revo restart` (or `doctor`) replaces it. A 0.0.0 dev checkout doesn't change version → no warn.
93
+ if (existing.version !== undefined && existing.version !== hostCodeVersion()) {
94
+ console.warn(`[host] attached to a daemon running version ${existing.version}, but this build is ` +
95
+ `${hostCodeVersion()} — run \`revo restart\` to replace the stale daemon.`);
96
+ }
97
+ return { runtime: existing, alreadyRunning: true };
98
+ }
99
+ // Alive but not ready — likely mid-boot/bootstrap. Wait; never spawn a duplicate (port collision).
100
+ const ready = await waitForReady(recheckMs);
101
+ if (ready)
102
+ return { runtime: ready, alreadyRunning: true };
103
+ throw new Error(`Revo host daemon (pid ${existing.pid}) is alive but not healthy on GraphQL port ` +
104
+ `${existing.graphqlPort}. Stop it with \`revo stop\` and retry.`);
105
+ }
106
+ // No live daemon — clear a stale host.json (dead pid), then spawn a fresh detached one.
107
+ // The check-then-spawn is not atomic, but the daemon's advisory-lock singleton (slice 139,
108
+ // queue-ownership.ts) makes a concurrent cold-start safe: if two ensureHost() callers both spawn
109
+ // `__daemon`, only one wins the per-profile lock and lives; the loser exits before DBOS/queue, and
110
+ // every waiter observes the winner's host.json via waitForReady.
111
+ if (existing)
112
+ removeHostRuntime();
113
+ spawnDaemon();
114
+ const ready = await waitForReady(timeoutMs);
115
+ if (!ready) {
116
+ throw new Error(`Revo host daemon did not become ready within ${timeoutMs / 1000}s — see \`revo logs\`.`);
117
+ }
118
+ return { runtime: ready, alreadyRunning: false };
119
+ }
120
+ //# sourceMappingURL=ensure-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-host.js","sourceRoot":"","sources":["../../src/host/ensure-host.ts"],"names":[],"mappings":"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"}