@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
@@ -1 +1 @@
1
- {"version":3,"file":"runner.module.js","sourceRoot":"","sources":["../../src/runners/runner.module.ts"],"names":[],"mappings":";;;;;;AAAA;;;;;GAKG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAiBvD,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,YAAY;IAfxB,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,cAAc,CAAC;QACzB,SAAS,EAAE;YACT,iBAAiB;YACjB,iBAAiB;YACjB,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,aAAa,EAAE;YACtD;gBACE,OAAO,EAAE,SAAS;gBAClB,UAAU,EAAE,CAAC,EAAqB,EAAE,EAAE,CACpC,cAAc,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;gBAC9D,MAAM,EAAE,CAAC,iBAAiB,CAAC;aAC5B;SACF;QACD,OAAO,EAAE,CAAC,SAAS,EAAE,iBAAiB,CAAC;KACxC,CAAC;GACW,YAAY,CAAG"}
1
+ {"version":3,"file":"runner.module.js","sourceRoot":"","sources":["../../src/runners/runner.module.ts"],"names":[],"mappings":";;;;;;AAAA;;;;;GAKG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAmBvD,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,YAAY;IAjBxB,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,cAAc,CAAC;QACzB,SAAS,EAAE;YACT,iBAAiB;YACjB,YAAY;YACZ,iBAAiB;YACjB,eAAe;YACf,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,aAAa,EAAE;YACtD;gBACE,OAAO,EAAE,SAAS;gBAClB,UAAU,EAAE,CAAC,EAAqB,EAAE,KAAmB,EAAE,EAAE,CACzD,cAAc,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;gBAChF,MAAM,EAAE,CAAC,iBAAiB,EAAE,YAAY,CAAC;aAC1C;SACF;QACD,OAAO,EAAE,CAAC,SAAS,EAAE,iBAAiB,EAAE,eAAe,CAAC;KACzD,CAAC;GACW,YAAY,CAAG"}
@@ -0,0 +1,63 @@
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
+ /**
14
+ * worktree.service.ts — @Injectable wrapper over the per-run git worktree manager (plan 0017).
15
+ *
16
+ * DBOS-SEALED: zero @dbos-inc imports. PipelineService registers `ensure`/`release` as memoized DBOS
17
+ * steps and wires them into the data-driven adapter's run lifecycle (create after live preflight,
18
+ * release at terminal via the workflow `finally`).
19
+ *
20
+ * Resolves the BASE target-repo checkout (where `git worktree add/remove` run) and the feature branch
21
+ * (the SAME `branchName` the integrator commits/pushes on) so the worktree is created already on that
22
+ * branch — making the integrator's branchExists→switch path a no-op and avoiding its dirty-tree
23
+ * `switch -c origin/<base>` failure.
24
+ */
25
+ import { Inject, Injectable } from '@nestjs/common';
26
+ import { RunService } from '../revisium/run.service.js';
27
+ import { getConfig } from '../config.js';
28
+ import { branchName } from './integrator.js';
29
+ import { createRunWorktree, releaseRunWorktree } from '../worker/git-worktree-manager.js';
30
+ let WorktreeService = class WorktreeService {
31
+ runService;
32
+ resolveBaseCwd;
33
+ constructor(runService) {
34
+ this.runService = runService;
35
+ this.resolveBaseCwd = this.runService.makeResolveTaskCwd();
36
+ }
37
+ /** Create-if-absent the run's isolated worktree. Arrow property: safe to pass unbound to registerStep. */
38
+ ensure = async (runId, taskId, title, base) => {
39
+ const baseRepoCwd = await this.resolveBaseCwd(taskId);
40
+ const branch = branchName(taskId, title);
41
+ return createRunWorktree({ runId, baseRepoCwd, base, branch, dataDir: getConfig().dataDir });
42
+ };
43
+ /** Release the run's worktree (best-effort, idempotent). Arrow property for safe unbound registration. */
44
+ release = async (runId, taskId) => {
45
+ let baseRepoCwd;
46
+ try {
47
+ baseRepoCwd = await this.resolveBaseCwd(taskId);
48
+ }
49
+ catch {
50
+ // Task/repo no longer resolvable — nothing to remove from; the worktree dir (if any) is orphaned
51
+ // and will be swept by `git worktree prune` on a later run against the same base repo.
52
+ return;
53
+ }
54
+ releaseRunWorktree({ runId, baseRepoCwd, dataDir: getConfig().dataDir });
55
+ };
56
+ };
57
+ WorktreeService = __decorate([
58
+ Injectable(),
59
+ __param(0, Inject(RunService)),
60
+ __metadata("design:paramtypes", [RunService])
61
+ ], WorktreeService);
62
+ export { WorktreeService };
63
+ //# sourceMappingURL=worktree.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.service.js","sourceRoot":"","sources":["../../src/runners/worktree.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAGnF,IAAM,eAAe,GAArB,MAAM,eAAe;IAGuB;IAFhC,cAAc,CAAsC;IAErE,YAAiD,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;QACrE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC;IAC7D,CAAC;IAED,0GAA0G;IAC1G,MAAM,GAAG,KAAK,EACZ,KAAa,EACb,MAAc,EACd,KAAa,EACb,IAAY,EACuB,EAAE;QACrC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACzC,OAAO,iBAAiB,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/F,CAAC,CAAC;IAEF,0GAA0G;IAC1G,OAAO,GAAG,KAAK,EAAE,KAAa,EAAE,MAAc,EAAiB,EAAE;QAC/D,IAAI,WAAmB,CAAC;QACxB,IAAI,CAAC;YACH,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,iGAAiG;YACjG,uFAAuF;YACvF,OAAO;QACT,CAAC;QACD,kBAAkB,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC,CAAC;CACH,CAAA;AA/BY,eAAe;IAD3B,UAAU,EAAE;IAIE,WAAA,MAAM,CAAC,UAAU,CAAC,CAAA;qCAA8B,UAAU;GAH5D,eAAe,CA+B3B"}
@@ -0,0 +1,47 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { createRequire } from 'node:module';
3
+ import { dirname, join } from 'node:path';
4
+ let tsxCliPath;
5
+ function resolveTsxCliPath() {
6
+ if (tsxCliPath)
7
+ return tsxCliPath;
8
+ const require = createRequire(import.meta.url);
9
+ const tsxPackagePath = require.resolve('tsx/package.json');
10
+ const tsxPackage = require(tsxPackagePath);
11
+ const tsxBin = typeof tsxPackage.bin === 'string' ? tsxPackage.bin : tsxPackage.bin.tsx;
12
+ if (!tsxBin)
13
+ throw new Error('Could not resolve tsx CLI path from package.json');
14
+ tsxCliPath = join(dirname(tsxPackagePath), tsxBin);
15
+ return tsxCliPath;
16
+ }
17
+ export function runCli(args, deps = {}) {
18
+ return new Promise((resolve, reject) => {
19
+ const spawnCli = deps.spawn ?? spawn;
20
+ const child = spawnCli(process.execPath, [deps.tsxCliPath ?? resolveTsxCliPath(), 'src/cli/index.ts', ...args], {
21
+ stdio: ['ignore', 'pipe', 'pipe'],
22
+ });
23
+ let stdout = '';
24
+ let stderr = '';
25
+ child.stdout.setEncoding('utf8');
26
+ child.stderr.setEncoding('utf8');
27
+ child.stdout.on('data', (chunk) => {
28
+ stdout += chunk;
29
+ });
30
+ child.stderr.on('data', (chunk) => {
31
+ stderr += chunk;
32
+ });
33
+ child.on('error', reject);
34
+ child.on('close', (status) => resolve({ stdout, stderr, status }));
35
+ });
36
+ }
37
+ export function matchId(output, pattern, label) {
38
+ const match = pattern.exec(output);
39
+ if (!match?.[1])
40
+ throw new Error(`Could not parse ${label} from CLI output:\n${output}`);
41
+ return match[1];
42
+ }
43
+ export function assertIncludes(str, sub, label) {
44
+ if (!str.includes(sub))
45
+ throw new Error(`${label}: expected output to include "${sub}".\nGot:\n${str}`);
46
+ }
47
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/smoke/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,IAAI,UAA8B,CAAC;AAenC,SAAS,iBAAiB;IACxB,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAClC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,cAAc,CAA6C,CAAC;IACvF,MAAM,MAAM,GAAG,OAAO,UAAU,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;IACxF,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACjF,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;IACnD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAc,EAAE,OAAmB,EAAE;IAC1D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;QACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,UAAU,IAAI,iBAAiB,EAAE,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAC,EAAE;YAC9G,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QACH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,MAAM,IAAI,KAAK,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,MAAM,IAAI,KAAK,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,MAAc,EAAE,OAAe,EAAE,KAAa;IACpE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,sBAAsB,MAAM,EAAE,CAAC,CAAC;IACzF,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,GAAW,EAAE,KAAa;IACpE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,iCAAiC,GAAG,aAAa,GAAG,EAAE,CAAC,CAAC;AAC1G,CAAC"}
@@ -0,0 +1,113 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { homedir, tmpdir } from 'node:os';
3
+ import { basename, dirname, join, resolve } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ const sourceDir = dirname(fileURLToPath(import.meta.url));
6
+ const repoRoot = resolve(sourceDir, '..', '..');
7
+ const configPath = join(repoRoot, 'revisium.config.json');
8
+ const DEFAULT_GRAPHQL_PORT_OFFSET = 1;
9
+ function expandHome(path) {
10
+ if (path === '~')
11
+ return homedir();
12
+ if (path.startsWith('~/'))
13
+ return join(homedir(), path.slice(2));
14
+ return path;
15
+ }
16
+ function loadRawConfig() {
17
+ return JSON.parse(readFileSync(configPath, 'utf8'));
18
+ }
19
+ function parseRequiredPort(name, disallowed) {
20
+ const raw = process.env[name];
21
+ if (!raw)
22
+ throw new Error(`${name} is required for state-touching smoke scripts`);
23
+ if (!/^\d+$/.test(raw.trim()))
24
+ throw new Error(`${name} must be a TCP port, got ${raw}`);
25
+ const port = Number(raw);
26
+ if (!Number.isInteger(port) || port <= 0 || port > 65_535) {
27
+ throw new Error(`${name} must be a TCP port, got ${raw}`);
28
+ }
29
+ const reason = disallowed.get(port);
30
+ if (reason) {
31
+ throw new Error(`${name} must not use ${reason} (${port})`);
32
+ }
33
+ return port;
34
+ }
35
+ function assertTempDataDir(dataDir, defaultDataDir) {
36
+ const resolved = resolve(expandHome(dataDir));
37
+ const resolvedDefault = resolve(expandHome(defaultDataDir));
38
+ if (resolved === resolvedDefault) {
39
+ throw new Error(`REVO_DATA_DIR must not use default production data dir ${defaultDataDir}`);
40
+ }
41
+ const tempRoots = [resolve(tmpdir()), '/tmp', '/private/tmp'];
42
+ if (!tempRoots.some((root) => resolved === root || resolved.startsWith(`${root}/`))) {
43
+ throw new Error(`REVO_DATA_DIR must be a temp task-specific path, got ${resolved}`);
44
+ }
45
+ if (basename(resolved) === basename(resolve(tmpdir())) || resolved === resolve(tmpdir())) {
46
+ throw new Error(`REVO_DATA_DIR must be task-specific, got temp root ${resolved}`);
47
+ }
48
+ return resolved;
49
+ }
50
+ function parseRequiredDbosDb() {
51
+ const dbosDb = process.env.REVO_DBOS_DB;
52
+ if (!dbosDb)
53
+ throw new Error('REVO_DBOS_DB is required for state-touching smoke scripts');
54
+ if (dbosDb === 'dbos')
55
+ throw new Error('REVO_DBOS_DB must not use default production database dbos');
56
+ if (!/^[a-z_][a-z0-9_]*$/i.test(dbosDb)) {
57
+ throw new Error(`Invalid REVO_DBOS_DB '${dbosDb}': must be a SQL identifier`);
58
+ }
59
+ return dbosDb;
60
+ }
61
+ export function resolveSmokeIsolation(options) {
62
+ const rawConfig = loadRawConfig();
63
+ const rawDataDir = process.env.REVO_DATA_DIR;
64
+ if (!rawDataDir)
65
+ throw new Error('REVO_DATA_DIR is required for state-touching smoke scripts');
66
+ const dataDir = assertTempDataDir(rawDataDir, rawConfig.dataDir);
67
+ const httpPort = parseRequiredPort('REVO_PORT', new Map([[rawConfig.preferredPort, 'default production HTTP port']]));
68
+ const pgPort = parseRequiredPort('REVO_PG_PORT', new Map([[rawConfig.preferredPgPort, 'default production PostgreSQL port']]));
69
+ const dbosDb = parseRequiredDbosDb();
70
+ let graphqlPort;
71
+ if (options.requireGraphqlPort) {
72
+ graphqlPort = parseRequiredPort('REVO_GRAPHQL_PORT', new Map([
73
+ [rawConfig.preferredPort + DEFAULT_GRAPHQL_PORT_OFFSET, 'default-derived production GraphQL port'],
74
+ [httpPort + DEFAULT_GRAPHQL_PORT_OFFSET, 'implicit derived GraphQL port'],
75
+ ]));
76
+ }
77
+ const isolation = {
78
+ scriptName: options.scriptName,
79
+ dataDir,
80
+ httpPort,
81
+ pgPort,
82
+ dbosDb,
83
+ };
84
+ if (typeof graphqlPort === 'number') {
85
+ isolation.graphqlPort = graphqlPort;
86
+ }
87
+ return isolation;
88
+ }
89
+ export function printSmokeIsolation(isolation) {
90
+ console.log(`smokeIsolationScript=${isolation.scriptName}`);
91
+ console.log(`smokeIsolationDataDir=${isolation.dataDir}`);
92
+ console.log(`smokeIsolationHttpPort=${isolation.httpPort}`);
93
+ console.log(`smokeIsolationPgPort=${isolation.pgPort}`);
94
+ console.log(`smokeIsolationDbosDb=${isolation.dbosDb}`);
95
+ if (isolation.graphqlPort !== undefined) {
96
+ console.log(`smokeIsolationGraphqlPort=${isolation.graphqlPort}`);
97
+ }
98
+ }
99
+ export function assertSmokeIsolation(options) {
100
+ const isolation = resolveSmokeIsolation(options);
101
+ printSmokeIsolation(isolation);
102
+ return isolation;
103
+ }
104
+ export function guardSmokeIsolation(options) {
105
+ try {
106
+ return assertSmokeIsolation(options);
107
+ }
108
+ catch (error) {
109
+ console.error(`Smoke isolation guard failed: ${error instanceof Error ? error.message : String(error)}`);
110
+ process.exit(1);
111
+ }
112
+ }
113
+ //# sourceMappingURL=isolation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isolation.js","sourceRoot":"","sources":["../../src/smoke/isolation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,281 @@
1
+ /**
2
+ * RunWatchService — bounded long-poll watch primitive over many runs (slice 141 D2).
3
+ *
4
+ * The MCP HTTP transport is stateless-per-request with a request timeout (see McpHttpService): no
5
+ * session, no held async-iterator, no server-initiated SSE survives one POST. So we cannot "subscribe
6
+ * over MCP"; instead we convert the daemon's existing in-process push (APP_PUB_SUB) into a bounded
7
+ * long-poll that RETURNS UNDER THE BRIDGE TIMEOUT with a resume cursor.
8
+ *
9
+ * Correctness rests on the SWEEP + CURSOR, not the push. The push (option A) only lowers latency; a
10
+ * pure poll (option B, no pubSub) is an equivalent-correctness degrade. Delivery is **at-least-once +
11
+ * idempotent**: `resolveRunState` is a point-in-time LEVEL read (a gate is `inbox.find(approval)`, not
12
+ * an event edge), so the cursor is a per-run *marker* watermark — a re-call suppresses a run whose
13
+ * actionable level it already delivered, and reports it again only when the marker changes (a new gate
14
+ * id, or a status transition). Approving the same gate twice is already guarded downstream.
15
+ */
16
+ import { ControlPlaneError } from '../control-plane/errors.js';
17
+ // Single source of truth for the topic names (a zero-import leaf module, so no import cycle). The
18
+ // ControlPlaneSubscriptionBridge publishes these from the Postgres LISTEN feed, each payload carrying
19
+ // `runId` — the field we filter wakeups on.
20
+ import { INBOX_ITEM_ADDED_TOPIC, RUN_UPDATED_TOPIC } from '../api/graphql-api/graphql-ws/constants.js';
21
+ export const MAX_RUN_IDS = 50;
22
+ /** Below the SDK inner-hop default of 60000ms with margin for two serial hops + the sweep itself. */
23
+ export const MAX_SERVER_HOLD_MS = 45_000;
24
+ export const DEFAULT_SERVER_HOLD_MS = 28_000;
25
+ const WAKEUP_DEBOUNCE_MS = 75;
26
+ const POLL_INTERVAL_MS = 500;
27
+ const GATE_STATES = new Set(['pending_gate', 'question']);
28
+ const WATCH_STATES = new Set([
29
+ 'pending_gate',
30
+ 'question',
31
+ 'completed',
32
+ 'failed',
33
+ 'blocked',
34
+ ]);
35
+ const TERMINAL_RUN_STATUS = new Set(['completed', 'failed', 'cancelled']);
36
+ /** Defensive cap on caller-supplied cursor size (a legitimate cursor only carries the watched runs, ≤ MAX_RUN_IDS). */
37
+ const MAX_CURSOR_ENTRIES = 200;
38
+ /** The topics this watch composes off APP_PUB_SUB — exported so a test can assert sync with constants.js. */
39
+ export const WATCH_TOPICS = [INBOX_ITEM_ADDED_TOPIC, RUN_UPDATED_TOPIC];
40
+ export function clampServerHold(timeoutMs) {
41
+ const requested = timeoutMs ?? DEFAULT_SERVER_HOLD_MS;
42
+ if (!Number.isFinite(requested) || requested < 0)
43
+ return DEFAULT_SERVER_HOLD_MS;
44
+ return Math.min(requested, MAX_SERVER_HOLD_MS);
45
+ }
46
+ /**
47
+ * The cursor marker for an *actionable* run level. A *changed* marker (vs the caller's cursor) is a new
48
+ * transition worth delivering: a gate is keyed by its inbox id (deterministic per gateKey, so a
49
+ * *different* gate yields a different id), a terminal/blocked run by its status. `running` is not
50
+ * actionable and is never recorded — `null`.
51
+ */
52
+ function markerFor(state) {
53
+ switch (state.state) {
54
+ case 'pending_gate':
55
+ case 'question':
56
+ return `g:${state.inbox?.id ?? ''}`;
57
+ case 'completed':
58
+ return 'c';
59
+ case 'failed':
60
+ return 'f';
61
+ case 'blocked':
62
+ return `b:${state.runStatus}`;
63
+ case 'running':
64
+ return null;
65
+ }
66
+ }
67
+ function encodeCursor(markers) {
68
+ return Buffer.from(JSON.stringify({ v: 1, m: markers }), 'utf8').toString('base64url');
69
+ }
70
+ function decodeCursor(cursor) {
71
+ if (!cursor)
72
+ return {};
73
+ try {
74
+ const parsed = JSON.parse(Buffer.from(cursor, 'base64url').toString('utf8'));
75
+ if (!parsed || parsed.v !== 1 || !parsed.m || typeof parsed.m !== 'object')
76
+ return {};
77
+ // Keep only well-formed string markers, capped — a forged/oversized cursor can't force unbounded work.
78
+ const out = {};
79
+ for (const [runId, marker] of Object.entries(parsed.m)) {
80
+ if (typeof marker !== 'string')
81
+ continue;
82
+ out[runId] = marker;
83
+ if (Object.keys(out).length >= MAX_CURSOR_ENTRIES)
84
+ break;
85
+ }
86
+ return out;
87
+ }
88
+ catch {
89
+ return {};
90
+ }
91
+ }
92
+ export class RunWatchService {
93
+ api;
94
+ pubSub;
95
+ constructor(api, pubSub) {
96
+ this.api = api;
97
+ this.pubSub = pubSub;
98
+ }
99
+ /** Block until any watched run hits an approval/question gate (or the hold elapses). */
100
+ waitForAnyGate(input) {
101
+ return this.watch(input, GATE_STATES);
102
+ }
103
+ /** Like waitForAnyGate, but also surfaces terminal (completed/failed) and blocked transitions. */
104
+ watchRuns(input) {
105
+ return this.watch(input, WATCH_STATES);
106
+ }
107
+ async watch(input, actionable) {
108
+ const prev = decodeCursor(input.cursor);
109
+ const runIds = await this.resolveRunIds(input.runIds);
110
+ const serverHold = clampServerHold(input.timeoutMs);
111
+ // 1. Initial sweep first — deliver anything already actionable (the common "already gated" case
112
+ // returns instantly) without arming a subscription. A transition that lands AFTER this read but
113
+ // BEFORE the subscription resolves is not lost: the cursor re-call's next sweep observes it.
114
+ const sweep = await this.sweep(runIds);
115
+ const initial = collectNew(sweep, prev, actionable);
116
+ const cursor0 = mergeCursor(sweep, actionable);
117
+ if (initial.length > 0) {
118
+ return { transitions: initial, cursor: encodeCursor(cursor0), timedOut: false };
119
+ }
120
+ if (runIds.length === 0 || serverHold <= 0 || input.signal?.aborted) {
121
+ return { transitions: [], cursor: encodeCursor(cursor0), timedOut: true };
122
+ }
123
+ // 2. Nothing actionable yet → hold this single request open for the next transition.
124
+ return this.holdForTransition(runIds, prev, actionable, cursor0, serverHold, input.signal);
125
+ }
126
+ holdForTransition(runIds, prev, actionable, cursor0, serverHold, signal) {
127
+ return new Promise((resolve) => {
128
+ let settled = false;
129
+ const subIds = [];
130
+ const dirty = new Set();
131
+ const watched = new Set(runIds);
132
+ let debounceTimer;
133
+ let pollTimer;
134
+ const timeout = () => ({ transitions: [], cursor: encodeCursor(cursor0), timedOut: true });
135
+ const onAbort = () => settle(timeout());
136
+ const cleanup = () => {
137
+ clearTimeout(holdTimer);
138
+ if (debounceTimer)
139
+ clearTimeout(debounceTimer);
140
+ if (pollTimer)
141
+ clearInterval(pollTimer);
142
+ // Detach the pubsub subscription — a held-open request that is torn down (abort/timeout) must
143
+ // not leak a subscriber on the long-lived APP_PUB_SUB.
144
+ for (const id of subIds)
145
+ this.pubSub?.unsubscribe(id);
146
+ subIds.length = 0;
147
+ signal?.removeEventListener('abort', onAbort);
148
+ };
149
+ const settle = (result) => {
150
+ if (settled)
151
+ return;
152
+ settled = true;
153
+ cleanup();
154
+ resolve(result);
155
+ };
156
+ const reSweep = async () => {
157
+ const ids = dirty.size > 0 ? [...dirty] : runIds;
158
+ dirty.clear();
159
+ let states;
160
+ try {
161
+ states = await this.sweep(ids);
162
+ }
163
+ catch {
164
+ return; // transient; a later wakeup/poll retries
165
+ }
166
+ if (settled)
167
+ return;
168
+ const found = collectNew(states, prev, actionable);
169
+ // Merge the re-swept (dirty) runs' markers over this call's initial cursor so the other watched
170
+ // runs keep theirs; still this-call-only (no cross-call carry-forward → bounded).
171
+ if (found.length > 0) {
172
+ settle({ transitions: found, cursor: encodeCursor({ ...cursor0, ...mergeCursor(states, actionable) }), timedOut: false });
173
+ }
174
+ };
175
+ // Coalesce a burst of wakeups into one re-sweep per tick (each sweep is ~4 control-plane reads/run).
176
+ const scheduleReSweep = () => {
177
+ if (settled || debounceTimer)
178
+ return;
179
+ debounceTimer = setTimeout(() => {
180
+ debounceTimer = undefined;
181
+ void reSweep();
182
+ }, WAKEUP_DEBOUNCE_MS);
183
+ };
184
+ // res.on('close') in McpHttpService aborts extra.signal mid-handler (SDK protocol _onclose).
185
+ if (signal)
186
+ signal.addEventListener('abort', onAbort, { once: true });
187
+ const holdTimer = setTimeout(() => settle(timeout()), serverHold);
188
+ if (this.pubSub) {
189
+ const onMessage = (payload) => {
190
+ const rid = payload?.runId;
191
+ if (rid !== undefined && !watched.has(rid))
192
+ return; // not one of ours
193
+ if (rid)
194
+ dirty.add(rid);
195
+ scheduleReSweep();
196
+ };
197
+ for (const topic of WATCH_TOPICS) {
198
+ this.pubSub
199
+ .subscribe(topic, onMessage)
200
+ .then((id) => {
201
+ // The hold may have settled (timer/abort) before subscribe resolved — detach immediately.
202
+ if (settled)
203
+ this.pubSub?.unsubscribe(id);
204
+ else
205
+ subIds.push(id);
206
+ })
207
+ .catch(() => undefined);
208
+ }
209
+ }
210
+ else {
211
+ // Option B: no push source → poll. Same sweep+cursor correctness, latency rises by one interval.
212
+ pollTimer = setInterval(() => {
213
+ if (!settled)
214
+ void reSweep();
215
+ }, POLL_INTERVAL_MS);
216
+ }
217
+ });
218
+ }
219
+ async resolveRunIds(provided) {
220
+ if (provided && provided.length > 0) {
221
+ if (provided.length > MAX_RUN_IDS) {
222
+ throw new Error(`VALIDATION_FAILURE: watch supports at most ${MAX_RUN_IDS} runIds (received ${provided.length}); narrow the set`);
223
+ }
224
+ return [...new Set(provided)];
225
+ }
226
+ // Omitted → watch every active (non-terminal) run, capped. A run that terminates between polls drops
227
+ // out of this set, so omit-mode is best-effort for terminal transitions — pass explicit runIds for
228
+ // guaranteed terminal delivery (those are always swept regardless of status).
229
+ const runs = await this.api.listRuns({});
230
+ return runs
231
+ .filter((run) => !TERMINAL_RUN_STATUS.has(run.status))
232
+ .map((run) => run.runId)
233
+ .slice(0, MAX_RUN_IDS);
234
+ }
235
+ sweep(runIds) {
236
+ return Promise.all(runIds.map((runId) => this.api.resolveRunState(runId).catch((error) => {
237
+ if (error instanceof ControlPlaneError && error.code === 'ROW_NOT_FOUND') {
238
+ return { runId, state: 'failed', nextAction: 'run not found', runStatus: 'not_found', workflowStatus: '' };
239
+ }
240
+ // A transient read error must not masquerade as a terminal transition; keep waiting.
241
+ return { runId, state: 'running', nextAction: 'transient read error; will retry', runStatus: 'unknown', workflowStatus: '' };
242
+ })));
243
+ }
244
+ }
245
+ function collectNew(states, prev, actionable) {
246
+ const out = [];
247
+ for (const state of states) {
248
+ if (!actionable.has(state.state))
249
+ continue;
250
+ const marker = markerFor(state);
251
+ if (prev[state.runId] === marker)
252
+ continue;
253
+ out.push({
254
+ runId: state.runId,
255
+ state: state.state,
256
+ nextAction: state.nextAction,
257
+ inbox: state.inbox,
258
+ latestBlockingEvent: state.latestBlockingEvent,
259
+ });
260
+ }
261
+ return out;
262
+ }
263
+ /**
264
+ * Build the next cursor from THIS sweep only — no carry-forward of prior keys, so it never grows beyond
265
+ * the watched set (bounds it at ≤ MAX_RUN_IDS). Records a marker only for states actionable in the
266
+ * CURRENT mode: a tool must not advance the cursor past a transition it did not deliver (else a later
267
+ * call in the other mode — e.g. watch_runs after wait_for_any_gate saw a `completed` run — would
268
+ * wrongly suppress it). `running` and other non-actionable states carry no marker.
269
+ */
270
+ function mergeCursor(states, actionable) {
271
+ const next = {};
272
+ for (const state of states) {
273
+ if (!actionable.has(state.state))
274
+ continue;
275
+ const marker = markerFor(state);
276
+ if (marker !== null)
277
+ next[state.runId] = marker;
278
+ }
279
+ return next;
280
+ }
281
+ //# sourceMappingURL=run-watch.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-watch.service.js","sourceRoot":"","sources":["../../src/task-control-plane/run-watch.service.ts"],"names":[],"mappings":"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"}