@revisium/orchestrator 0.1.0-alpha.4 → 0.1.0-alpha.6

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 (465) hide show
  1. package/README.md +149 -1
  2. package/control-plane/bootstrap.config.json +1 -0
  3. package/control-plane/default-playbook/catalog/pipelines.json +289 -52
  4. package/control-plane/default-playbook/catalog/roles.json +9 -0
  5. package/control-plane/default-playbook/prompts/analyst.md +3 -1
  6. package/control-plane/default-playbook/prompts/reviewer.md +2 -2
  7. package/control-plane/default-playbook/prompts/triager.md +51 -0
  8. package/control-plane/default-playbook/prompts/watcher.md +2 -2
  9. package/dist/api/graphql-api/filters/agent-observability-exception.filter.js +24 -0
  10. package/dist/api/graphql-api/filters/agent-observability-exception.filter.js.map +1 -0
  11. package/dist/api/graphql-api/filters/graphql-validation-exception.filter.js +36 -0
  12. package/dist/api/graphql-api/filters/graphql-validation-exception.filter.js.map +1 -0
  13. package/dist/api/graphql-api/graphql-api.module.js +77 -0
  14. package/dist/api/graphql-api/graphql-api.module.js.map +1 -0
  15. package/dist/api/graphql-api/graphql-ws/agent-observability-subscription-bridge.service.js +296 -0
  16. package/dist/api/graphql-api/graphql-ws/agent-observability-subscription-bridge.service.js.map +1 -0
  17. package/dist/api/graphql-api/graphql-ws/agent-observability-subscription-mappers.js +64 -0
  18. package/dist/api/graphql-api/graphql-ws/agent-observability-subscription-mappers.js.map +1 -0
  19. package/dist/api/graphql-api/graphql-ws/constants.js +11 -0
  20. package/dist/api/graphql-api/graphql-ws/constants.js.map +1 -0
  21. package/dist/api/graphql-api/graphql-ws/pubsub.module.js +32 -0
  22. package/dist/api/graphql-api/graphql-ws/pubsub.module.js.map +1 -0
  23. package/dist/api/graphql-api/graphql-ws/run-progress-subscription-poller.service.js +101 -0
  24. package/dist/api/graphql-api/graphql-ws/run-progress-subscription-poller.service.js.map +1 -0
  25. package/dist/api/graphql-api/graphql-ws/subscription-bridge.service.js +115 -0
  26. package/dist/api/graphql-api/graphql-ws/subscription-bridge.service.js.map +1 -0
  27. package/dist/api/graphql-api/graphql-ws/subscription-mappers.js +85 -0
  28. package/dist/api/graphql-api/graphql-ws/subscription-mappers.js.map +1 -0
  29. package/dist/api/graphql-api/graphql-ws/ws.js +22 -0
  30. package/dist/api/graphql-api/graphql-ws/ws.js.map +1 -0
  31. package/dist/api/graphql-api/inbox/inbox-subscription.resolver.js +56 -0
  32. package/dist/api/graphql-api/inbox/inbox-subscription.resolver.js.map +1 -0
  33. package/dist/api/graphql-api/inbox/inbox.resolver.js +125 -0
  34. package/dist/api/graphql-api/inbox/inbox.resolver.js.map +1 -0
  35. package/dist/api/graphql-api/inbox/inputs/answer-question.input.js +33 -0
  36. package/dist/api/graphql-api/inbox/inputs/answer-question.input.js.map +1 -0
  37. package/dist/api/graphql-api/inbox/inputs/gate-decision.input.js +27 -0
  38. package/dist/api/graphql-api/inbox/inputs/gate-decision.input.js.map +1 -0
  39. package/dist/api/graphql-api/inbox/inputs/list-inbox.input.js +28 -0
  40. package/dist/api/graphql-api/inbox/inputs/list-inbox.input.js.map +1 -0
  41. package/dist/api/graphql-api/inbox/inputs/resolve-inbox-item.input.js +38 -0
  42. package/dist/api/graphql-api/inbox/inputs/resolve-inbox-item.input.js.map +1 -0
  43. package/dist/api/graphql-api/inbox/model/gate-risk.model.js +53 -0
  44. package/dist/api/graphql-api/inbox/model/gate-risk.model.js.map +1 -0
  45. package/dist/api/graphql-api/inbox/model/inbox-connection.model.js +16 -0
  46. package/dist/api/graphql-api/inbox/model/inbox-connection.model.js.map +1 -0
  47. package/dist/api/graphql-api/inbox/model/inbox-item.model.js +88 -0
  48. package/dist/api/graphql-api/inbox/model/inbox-item.model.js.map +1 -0
  49. package/dist/api/graphql-api/inbox/model/inbox-resolution.model.js +48 -0
  50. package/dist/api/graphql-api/inbox/model/inbox-resolution.model.js.map +1 -0
  51. package/dist/api/graphql-api/method/inputs/list-method.input.js +15 -0
  52. package/dist/api/graphql-api/method/inputs/list-method.input.js.map +1 -0
  53. package/dist/api/graphql-api/method/method.resolver.js +90 -0
  54. package/dist/api/graphql-api/method/method.resolver.js.map +1 -0
  55. package/dist/api/graphql-api/method/model/alternative-role-group.model.js +32 -0
  56. package/dist/api/graphql-api/method/model/alternative-role-group.model.js.map +1 -0
  57. package/dist/api/graphql-api/method/model/pipeline-connection.model.js +16 -0
  58. package/dist/api/graphql-api/method/model/pipeline-connection.model.js.map +1 -0
  59. package/dist/api/graphql-api/method/model/pipeline.model.js +69 -0
  60. package/dist/api/graphql-api/method/model/pipeline.model.js.map +1 -0
  61. package/dist/api/graphql-api/method/model/playbook-connection.model.js +16 -0
  62. package/dist/api/graphql-api/method/model/playbook-connection.model.js.map +1 -0
  63. package/dist/api/graphql-api/method/model/playbook.model.js +47 -0
  64. package/dist/api/graphql-api/method/model/playbook.model.js.map +1 -0
  65. package/dist/api/graphql-api/method/model/role-connection.model.js +16 -0
  66. package/dist/api/graphql-api/method/model/role-connection.model.js.map +1 -0
  67. package/dist/api/graphql-api/method/model/role.model.js +98 -0
  68. package/dist/api/graphql-api/method/model/role.model.js.map +1 -0
  69. package/dist/api/graphql-api/pr/inputs/pr-readiness.input.js +52 -0
  70. package/dist/api/graphql-api/pr/inputs/pr-readiness.input.js.map +1 -0
  71. package/dist/api/graphql-api/pr/model/pr-readiness.model.js +403 -0
  72. package/dist/api/graphql-api/pr/model/pr-readiness.model.js.map +1 -0
  73. package/dist/api/graphql-api/pr/pr.resolver.js +76 -0
  74. package/dist/api/graphql-api/pr/pr.resolver.js.map +1 -0
  75. package/dist/api/graphql-api/registerGraphqlEnums.js +9 -0
  76. package/dist/api/graphql-api/registerGraphqlEnums.js.map +1 -0
  77. package/dist/api/graphql-api/runs/inputs/create-run.input.js +63 -0
  78. package/dist/api/graphql-api/runs/inputs/create-run.input.js.map +1 -0
  79. package/dist/api/graphql-api/runs/inputs/get-agent-log.input.js +48 -0
  80. package/dist/api/graphql-api/runs/inputs/get-agent-log.input.js.map +1 -0
  81. package/dist/api/graphql-api/runs/inputs/get-run-attempts.input.js +32 -0
  82. package/dist/api/graphql-api/runs/inputs/get-run-attempts.input.js.map +1 -0
  83. package/dist/api/graphql-api/runs/inputs/get-run-events.input.js +28 -0
  84. package/dist/api/graphql-api/runs/inputs/get-run-events.input.js.map +1 -0
  85. package/dist/api/graphql-api/runs/inputs/list-runs.input.js +23 -0
  86. package/dist/api/graphql-api/runs/inputs/list-runs.input.js.map +1 -0
  87. package/dist/api/graphql-api/runs/inputs/simulate-route.input.js +43 -0
  88. package/dist/api/graphql-api/runs/inputs/simulate-route.input.js.map +1 -0
  89. package/dist/api/graphql-api/runs/model/agent-activity.model.js +367 -0
  90. package/dist/api/graphql-api/runs/model/agent-activity.model.js.map +1 -0
  91. package/dist/api/graphql-api/runs/model/create-run-result.model.js +53 -0
  92. package/dist/api/graphql-api/runs/model/create-run-result.model.js.map +1 -0
  93. package/dist/api/graphql-api/runs/model/run-attempt.model.js +114 -0
  94. package/dist/api/graphql-api/runs/model/run-attempt.model.js.map +1 -0
  95. package/dist/api/graphql-api/runs/model/run-connection.model.js +16 -0
  96. package/dist/api/graphql-api/runs/model/run-connection.model.js.map +1 -0
  97. package/dist/api/graphql-api/runs/model/run-cost.model.js +67 -0
  98. package/dist/api/graphql-api/runs/model/run-cost.model.js.map +1 -0
  99. package/dist/api/graphql-api/runs/model/run-digest.model.js +41 -0
  100. package/dist/api/graphql-api/runs/model/run-digest.model.js.map +1 -0
  101. package/dist/api/graphql-api/runs/model/run-event-connection.model.js +16 -0
  102. package/dist/api/graphql-api/runs/model/run-event-connection.model.js.map +1 -0
  103. package/dist/api/graphql-api/runs/model/run-event.model.js +58 -0
  104. package/dist/api/graphql-api/runs/model/run-event.model.js.map +1 -0
  105. package/dist/api/graphql-api/runs/model/run-progress.model.js +33 -0
  106. package/dist/api/graphql-api/runs/model/run-progress.model.js.map +1 -0
  107. package/dist/api/graphql-api/runs/model/run-workflow.model.js +287 -0
  108. package/dist/api/graphql-api/runs/model/run-workflow.model.js.map +1 -0
  109. package/dist/api/graphql-api/runs/model/run.model.js +57 -0
  110. package/dist/api/graphql-api/runs/model/run.model.js.map +1 -0
  111. package/dist/api/graphql-api/runs/model/usage.model.js +32 -0
  112. package/dist/api/graphql-api/runs/model/usage.model.js.map +1 -0
  113. package/dist/api/graphql-api/runs/run-digest.resolver.js +40 -0
  114. package/dist/api/graphql-api/runs/run-digest.resolver.js.map +1 -0
  115. package/dist/api/graphql-api/runs/run-events.resolver.js +45 -0
  116. package/dist/api/graphql-api/runs/run-events.resolver.js.map +1 -0
  117. package/dist/api/graphql-api/runs/run-progress.resolver.js +53 -0
  118. package/dist/api/graphql-api/runs/run-progress.resolver.js.map +1 -0
  119. package/dist/api/graphql-api/runs/runs-subscription.resolver.js +124 -0
  120. package/dist/api/graphql-api/runs/runs-subscription.resolver.js.map +1 -0
  121. package/dist/api/graphql-api/runs/runs.resolver.js +165 -0
  122. package/dist/api/graphql-api/runs/runs.resolver.js.map +1 -0
  123. package/dist/api/graphql-api/share/graphql-param-types.js +6 -0
  124. package/dist/api/graphql-api/share/graphql-param-types.js.map +1 -0
  125. package/dist/api/graphql-api/share/inputs/connection.input.js +27 -0
  126. package/dist/api/graphql-api/share/inputs/connection.input.js.map +1 -0
  127. package/dist/api/graphql-api/share/inputs/run-subscription.input.js +22 -0
  128. package/dist/api/graphql-api/share/inputs/run-subscription.input.js.map +1 -0
  129. package/dist/api/graphql-api/share/model/paginated.model.js +75 -0
  130. package/dist/api/graphql-api/share/model/paginated.model.js.map +1 -0
  131. package/dist/api/graphql-api/system/model/daemon-status.model.js +47 -0
  132. package/dist/api/graphql-api/system/model/daemon-status.model.js.map +1 -0
  133. package/dist/api/graphql-api/system/model/doctor-result.model.js +33 -0
  134. package/dist/api/graphql-api/system/model/doctor-result.model.js.map +1 -0
  135. package/dist/api/graphql-api/system/model/project.model.js +37 -0
  136. package/dist/api/graphql-api/system/model/project.model.js.map +1 -0
  137. package/dist/api/graphql-api/system/model/repository-context.model.js +70 -0
  138. package/dist/api/graphql-api/system/model/repository-context.model.js.map +1 -0
  139. package/dist/api/graphql-api/system/model/repository-validation.model.js +62 -0
  140. package/dist/api/graphql-api/system/model/repository-validation.model.js.map +1 -0
  141. package/dist/api/graphql-api/system/model/system-status.model.js +29 -0
  142. package/dist/api/graphql-api/system/model/system-status.model.js.map +1 -0
  143. package/dist/api/graphql-api/system/system.resolver.js +83 -0
  144. package/dist/api/graphql-api/system/system.resolver.js.map +1 -0
  145. package/dist/cli/commands/doctor-report.js +39 -0
  146. package/dist/cli/commands/doctor-report.js.map +1 -0
  147. package/dist/cli/commands/lifecycle.js +237 -0
  148. package/dist/cli/commands/lifecycle.js.map +1 -0
  149. package/dist/cli/commands/mcp.js +46 -8
  150. package/dist/cli/commands/mcp.js.map +1 -1
  151. package/dist/cli/commands/revisium-helpers.js +2 -2
  152. package/dist/cli/index.js +5 -29
  153. package/dist/cli/index.js.map +1 -1
  154. package/dist/cli/program.js +7 -21
  155. package/dist/cli/program.js.map +1 -1
  156. package/dist/config.js +57 -5
  157. package/dist/config.js.map +1 -1
  158. package/dist/control-plane/bootstrap.js +93 -0
  159. package/dist/control-plane/bootstrap.js.map +1 -0
  160. package/dist/control-plane/change-notifications.js +35 -0
  161. package/dist/control-plane/change-notifications.js.map +1 -0
  162. package/dist/control-plane/data-access.js +10 -3
  163. package/dist/control-plane/data-access.js.map +1 -1
  164. package/dist/control-plane/inbox.js +5 -31
  165. package/dist/control-plane/inbox.js.map +1 -1
  166. package/dist/control-plane/index.js +1 -1
  167. package/dist/control-plane/index.js.map +1 -1
  168. package/dist/control-plane/resolve-cwd.js +76 -8
  169. package/dist/control-plane/resolve-cwd.js.map +1 -1
  170. package/dist/control-plane/schema-migration.js +7 -11
  171. package/dist/control-plane/schema-migration.js.map +1 -1
  172. package/dist/control-plane/seed-default-playbook.js +23 -0
  173. package/dist/control-plane/seed-default-playbook.js.map +1 -1
  174. package/dist/control-plane/steps.js +15 -349
  175. package/dist/control-plane/steps.js.map +1 -1
  176. package/dist/e2e/kit/agents.js +43 -8
  177. package/dist/e2e/kit/agents.js.map +1 -1
  178. package/dist/e2e/kit/assertions.js +57 -14
  179. package/dist/e2e/kit/assertions.js.map +1 -1
  180. package/dist/e2e/kit/drive.js +0 -4
  181. package/dist/e2e/kit/drive.js.map +1 -1
  182. package/dist/e2e/kit/fake-integrator.js +16 -1
  183. package/dist/e2e/kit/fake-integrator.js.map +1 -1
  184. package/dist/e2e/kit/gh-emulator.js +173 -10
  185. package/dist/e2e/kit/gh-emulator.js.map +1 -1
  186. package/dist/e2e/kit/git-target-repo.js +35 -3
  187. package/dist/e2e/kit/git-target-repo.js.map +1 -1
  188. package/dist/e2e/kit/harness.js +16 -3
  189. package/dist/e2e/kit/harness.js.map +1 -1
  190. package/dist/e2e/kit/scenarios.js +1 -1
  191. package/dist/e2e/recovery-dd-crash-child.js +3 -2
  192. package/dist/e2e/recovery-dd-crash-child.js.map +1 -1
  193. package/dist/engine/dbos.module.js +2 -1
  194. package/dist/engine/dbos.module.js.map +1 -1
  195. package/dist/engine/dbos.service.js +89 -18
  196. package/dist/engine/dbos.service.js.map +1 -1
  197. package/dist/engine/ensure-postgres.js +11 -9
  198. package/dist/engine/ensure-postgres.js.map +1 -1
  199. package/dist/features/inbox/commands/handlers/inbox-command.handlers.js +80 -0
  200. package/dist/features/inbox/commands/handlers/inbox-command.handlers.js.map +1 -0
  201. package/dist/features/inbox/commands/impl/answer-question.command.js +7 -0
  202. package/dist/features/inbox/commands/impl/answer-question.command.js.map +1 -0
  203. package/dist/features/inbox/commands/impl/approve-gate.command.js +7 -0
  204. package/dist/features/inbox/commands/impl/approve-gate.command.js.map +1 -0
  205. package/dist/features/inbox/commands/impl/reject-gate.command.js +7 -0
  206. package/dist/features/inbox/commands/impl/reject-gate.command.js.map +1 -0
  207. package/dist/features/inbox/commands/impl/resolve-inbox-item.command.js +7 -0
  208. package/dist/features/inbox/commands/impl/resolve-inbox-item.command.js.map +1 -0
  209. package/dist/features/inbox/commands/index.js +8 -0
  210. package/dist/features/inbox/commands/index.js.map +1 -0
  211. package/dist/features/inbox/inbox-api.module.js +23 -0
  212. package/dist/features/inbox/inbox-api.module.js.map +1 -0
  213. package/dist/features/inbox/inbox-api.service.js +63 -0
  214. package/dist/features/inbox/inbox-api.service.js.map +1 -0
  215. package/dist/features/inbox/queries/handlers/inbox-query.handlers.js +111 -0
  216. package/dist/features/inbox/queries/handlers/inbox-query.handlers.js.map +1 -0
  217. package/dist/features/inbox/queries/impl/get-inbox-item.query.js +7 -0
  218. package/dist/features/inbox/queries/impl/get-inbox-item.query.js.map +1 -0
  219. package/dist/features/inbox/queries/impl/get-pending-decisions.query.js +7 -0
  220. package/dist/features/inbox/queries/impl/get-pending-decisions.query.js.map +1 -0
  221. package/dist/features/inbox/queries/impl/list-inbox.query.js +7 -0
  222. package/dist/features/inbox/queries/impl/list-inbox.query.js.map +1 -0
  223. package/dist/features/inbox/queries/impl/summarize-gate-risk.query.js +7 -0
  224. package/dist/features/inbox/queries/impl/summarize-gate-risk.query.js.map +1 -0
  225. package/dist/features/inbox/queries/index.js +8 -0
  226. package/dist/features/inbox/queries/index.js.map +1 -0
  227. package/dist/features/method/commands/index.js +2 -0
  228. package/dist/features/method/commands/index.js.map +1 -0
  229. package/dist/features/method/method-api.module.js +23 -0
  230. package/dist/features/method/method-api.module.js.map +1 -0
  231. package/dist/features/method/method-api.service.js +47 -0
  232. package/dist/features/method/method-api.service.js.map +1 -0
  233. package/dist/features/method/queries/handlers/method-query.handlers.js +115 -0
  234. package/dist/features/method/queries/handlers/method-query.handlers.js.map +1 -0
  235. package/dist/features/method/queries/impl/get-pipeline.query.js +7 -0
  236. package/dist/features/method/queries/impl/get-pipeline.query.js.map +1 -0
  237. package/dist/features/method/queries/impl/get-role.query.js +7 -0
  238. package/dist/features/method/queries/impl/get-role.query.js.map +1 -0
  239. package/dist/features/method/queries/impl/list-pipelines.query.js +7 -0
  240. package/dist/features/method/queries/impl/list-pipelines.query.js.map +1 -0
  241. package/dist/features/method/queries/impl/list-playbooks.query.js +7 -0
  242. package/dist/features/method/queries/impl/list-playbooks.query.js.map +1 -0
  243. package/dist/features/method/queries/impl/list-roles.query.js +7 -0
  244. package/dist/features/method/queries/impl/list-roles.query.js.map +1 -0
  245. package/dist/features/method/queries/index.js +9 -0
  246. package/dist/features/method/queries/index.js.map +1 -0
  247. package/dist/features/pr/commands/index.js +2 -0
  248. package/dist/features/pr/commands/index.js.map +1 -0
  249. package/dist/features/pr/pr-api.module.js +23 -0
  250. package/dist/features/pr/pr-api.module.js.map +1 -0
  251. package/dist/features/pr/pr-api.service.js +35 -0
  252. package/dist/features/pr/pr-api.service.js.map +1 -0
  253. package/dist/features/pr/queries/handlers/pr-query.handlers.js +48 -0
  254. package/dist/features/pr/queries/handlers/pr-query.handlers.js.map +1 -0
  255. package/dist/features/pr/queries/impl/get-pr-readiness.query.js +7 -0
  256. package/dist/features/pr/queries/impl/get-pr-readiness.query.js.map +1 -0
  257. package/dist/features/pr/queries/impl/list-pr-feedback.query.js +7 -0
  258. package/dist/features/pr/queries/impl/list-pr-feedback.query.js.map +1 -0
  259. package/dist/features/pr/queries/index.js +3 -0
  260. package/dist/features/pr/queries/index.js.map +1 -0
  261. package/dist/features/runs/commands/handlers/runs-command.handlers.js +32 -0
  262. package/dist/features/runs/commands/handlers/runs-command.handlers.js.map +1 -0
  263. package/dist/features/runs/commands/impl/create-run.command.js +7 -0
  264. package/dist/features/runs/commands/impl/create-run.command.js.map +1 -0
  265. package/dist/features/runs/commands/index.js +3 -0
  266. package/dist/features/runs/commands/index.js.map +1 -0
  267. package/dist/features/runs/queries/handlers/runs-query.handlers.js +359 -0
  268. package/dist/features/runs/queries/handlers/runs-query.handlers.js.map +1 -0
  269. package/dist/features/runs/queries/impl/get-agent-activity.query.js +7 -0
  270. package/dist/features/runs/queries/impl/get-agent-activity.query.js.map +1 -0
  271. package/dist/features/runs/queries/impl/get-agent-attempts.query.js +7 -0
  272. package/dist/features/runs/queries/impl/get-agent-attempts.query.js.map +1 -0
  273. package/dist/features/runs/queries/impl/get-agent-log.query.js +7 -0
  274. package/dist/features/runs/queries/impl/get-agent-log.query.js.map +1 -0
  275. package/dist/features/runs/queries/impl/get-run-attempts.query.js +7 -0
  276. package/dist/features/runs/queries/impl/get-run-attempts.query.js.map +1 -0
  277. package/dist/features/runs/queries/impl/get-run-digest.query.js +7 -0
  278. package/dist/features/runs/queries/impl/get-run-digest.query.js.map +1 -0
  279. package/dist/features/runs/queries/impl/get-run-events.query.js +7 -0
  280. package/dist/features/runs/queries/impl/get-run-events.query.js.map +1 -0
  281. package/dist/features/runs/queries/impl/get-run-progress.query.js +7 -0
  282. package/dist/features/runs/queries/impl/get-run-progress.query.js.map +1 -0
  283. package/dist/features/runs/queries/impl/get-run-workflow.query.js +7 -0
  284. package/dist/features/runs/queries/impl/get-run-workflow.query.js.map +1 -0
  285. package/dist/features/runs/queries/impl/get-run.query.js +7 -0
  286. package/dist/features/runs/queries/impl/get-run.query.js.map +1 -0
  287. package/dist/features/runs/queries/impl/list-runs.query.js +7 -0
  288. package/dist/features/runs/queries/impl/list-runs.query.js.map +1 -0
  289. package/dist/features/runs/queries/impl/simulate-route.query.js +7 -0
  290. package/dist/features/runs/queries/impl/simulate-route.query.js.map +1 -0
  291. package/dist/features/runs/queries/index.js +15 -0
  292. package/dist/features/runs/queries/index.js.map +1 -0
  293. package/dist/features/runs/runs-api.module.js +23 -0
  294. package/dist/features/runs/runs-api.module.js.map +1 -0
  295. package/dist/features/runs/runs-api.service.js +79 -0
  296. package/dist/features/runs/runs-api.service.js.map +1 -0
  297. package/dist/features/shared/connection.js +39 -0
  298. package/dist/features/shared/connection.js.map +1 -0
  299. package/dist/features/system/commands/index.js +2 -0
  300. package/dist/features/system/commands/index.js.map +1 -0
  301. package/dist/features/system/queries/handlers/system-query.handlers.js +96 -0
  302. package/dist/features/system/queries/handlers/system-query.handlers.js.map +1 -0
  303. package/dist/features/system/queries/impl/doctor.query.js +4 -0
  304. package/dist/features/system/queries/impl/doctor.query.js.map +1 -0
  305. package/dist/features/system/queries/impl/get-project.query.js +4 -0
  306. package/dist/features/system/queries/impl/get-project.query.js.map +1 -0
  307. package/dist/features/system/queries/impl/get-repository-context.query.js +7 -0
  308. package/dist/features/system/queries/impl/get-repository-context.query.js.map +1 -0
  309. package/dist/features/system/queries/impl/get-status.query.js +4 -0
  310. package/dist/features/system/queries/impl/get-status.query.js.map +1 -0
  311. package/dist/features/system/queries/impl/validate-repository.query.js +7 -0
  312. package/dist/features/system/queries/impl/validate-repository.query.js.map +1 -0
  313. package/dist/features/system/queries/index.js +9 -0
  314. package/dist/features/system/queries/index.js.map +1 -0
  315. package/dist/features/system/system-api.module.js +23 -0
  316. package/dist/features/system/system-api.module.js.map +1 -0
  317. package/dist/features/system/system-api.service.js +47 -0
  318. package/dist/features/system/system-api.service.js.map +1 -0
  319. package/dist/host/daemon.js +68 -0
  320. package/dist/host/daemon.js.map +1 -0
  321. package/dist/host/ensure-host.js +109 -0
  322. package/dist/host/ensure-host.js.map +1 -0
  323. package/dist/host/host-runtime.js +52 -0
  324. package/dist/host/host-runtime.js.map +1 -0
  325. package/dist/host/host.lifecycle.js +16 -3
  326. package/dist/host/host.lifecycle.js.map +1 -1
  327. package/dist/http/graphql-host.js +56 -0
  328. package/dist/http/graphql-host.js.map +1 -0
  329. package/dist/{mcp/mcp.module.js → http/graphql-host.module.js} +12 -10
  330. package/dist/http/graphql-host.module.js.map +1 -0
  331. package/dist/infrastructure/metrics/graphql/graphql-metrics.js +91 -0
  332. package/dist/infrastructure/metrics/graphql/graphql-metrics.js.map +1 -0
  333. package/dist/mcp/mcp-capabilities.js +6 -1
  334. package/dist/mcp/mcp-capabilities.js.map +1 -1
  335. package/dist/mcp/mcp-facade.service.js +24 -0
  336. package/dist/mcp/mcp-facade.service.js.map +1 -1
  337. package/dist/mcp/mcp-http.service.js +95 -0
  338. package/dist/mcp/mcp-http.service.js.map +1 -0
  339. package/dist/mcp/mcp-tools.js +58 -0
  340. package/dist/mcp/mcp-tools.js.map +1 -1
  341. package/dist/observability/agent-activity-reporter.js +185 -0
  342. package/dist/observability/agent-activity-reporter.js.map +1 -0
  343. package/dist/observability/agent-observability.service.js +1142 -0
  344. package/dist/observability/agent-observability.service.js.map +1 -0
  345. package/dist/observability/index.js +4 -0
  346. package/dist/observability/index.js.map +1 -0
  347. package/dist/observability/types.js +11 -0
  348. package/dist/observability/types.js.map +1 -0
  349. package/dist/pipeline/await-human.js +8 -4
  350. package/dist/pipeline/await-human.js.map +1 -1
  351. package/dist/pipeline/data-driven-task.workflow.js +184 -73
  352. package/dist/pipeline/data-driven-task.workflow.js.map +1 -1
  353. package/dist/pipeline/data-driven-template.js +3 -3
  354. package/dist/pipeline/pipeline.module.js +1 -1
  355. package/dist/pipeline/pipeline.module.js.map +1 -1
  356. package/dist/pipeline/{develop-task.workflow.js → pipeline.service.js} +97 -26
  357. package/dist/pipeline/pipeline.service.js.map +1 -0
  358. package/dist/pipeline-core/kit/fixtures.js +94 -0
  359. package/dist/pipeline-core/kit/fixtures.js.map +1 -1
  360. package/dist/pipeline-core/validate-capability.js +23 -0
  361. package/dist/pipeline-core/validate-capability.js.map +1 -0
  362. package/dist/pipeline-core/validate-conflicts.js +37 -0
  363. package/dist/pipeline-core/validate-conflicts.js.map +1 -0
  364. package/dist/pipeline-core/validate-dataflow.js +180 -0
  365. package/dist/pipeline-core/validate-dataflow.js.map +1 -0
  366. package/dist/pipeline-core/validate-diff.js +158 -0
  367. package/dist/pipeline-core/validate-diff.js.map +1 -0
  368. package/dist/pipeline-core/validate-edges.js +44 -0
  369. package/dist/pipeline-core/validate-edges.js.map +1 -0
  370. package/dist/pipeline-core/validate-graph.js +123 -0
  371. package/dist/pipeline-core/validate-graph.js.map +1 -0
  372. package/dist/pipeline-core/validate-loops.js +226 -0
  373. package/dist/pipeline-core/validate-loops.js.map +1 -0
  374. package/dist/pipeline-core/validate-parallel.js +132 -0
  375. package/dist/pipeline-core/validate-parallel.js.map +1 -0
  376. package/dist/pipeline-core/validate-sink.js +27 -0
  377. package/dist/pipeline-core/validate-sink.js.map +1 -0
  378. package/dist/pipeline-core/validate-topology.js +140 -0
  379. package/dist/pipeline-core/validate-topology.js.map +1 -0
  380. package/dist/pipeline-core/validate-verdict.js +72 -0
  381. package/dist/pipeline-core/validate-verdict.js.map +1 -0
  382. package/dist/pipeline-core/validate.js +34 -1107
  383. package/dist/pipeline-core/validate.js.map +1 -1
  384. package/dist/revisium/run.service.js +31 -8
  385. package/dist/revisium/run.service.js.map +1 -1
  386. package/dist/run/create-run.js +5 -31
  387. package/dist/run/create-run.js.map +1 -1
  388. package/dist/run/inspect-run.js +2 -29
  389. package/dist/run/inspect-run.js.map +1 -1
  390. package/dist/run/terminal-run-status.js +7 -30
  391. package/dist/run/terminal-run-status.js.map +1 -1
  392. package/dist/runners/claude-code.service.js +1 -0
  393. package/dist/runners/claude-code.service.js.map +1 -1
  394. package/dist/runners/codex.service.js +51 -0
  395. package/dist/runners/codex.service.js.map +1 -0
  396. package/dist/runners/integrator-branch-naming.js +24 -0
  397. package/dist/runners/integrator-branch-naming.js.map +1 -0
  398. package/dist/runners/integrator-git.js +84 -0
  399. package/dist/runners/integrator-git.js.map +1 -0
  400. package/dist/runners/integrator-remote.js +34 -0
  401. package/dist/runners/integrator-remote.js.map +1 -0
  402. package/dist/runners/integrator-types.js +9 -0
  403. package/dist/runners/integrator-types.js.map +1 -0
  404. package/dist/runners/integrator.js +250 -134
  405. package/dist/runners/integrator.js.map +1 -1
  406. package/dist/runners/runner.module.js +7 -3
  407. package/dist/runners/runner.module.js.map +1 -1
  408. package/dist/runners/worktree.service.js +63 -0
  409. package/dist/runners/worktree.service.js.map +1 -0
  410. package/dist/smoke/cli.js +47 -0
  411. package/dist/smoke/cli.js.map +1 -0
  412. package/dist/smoke/isolation.js +113 -0
  413. package/dist/smoke/isolation.js.map +1 -0
  414. package/dist/task-control-plane/task-control-plane-api.service.js +317 -4
  415. package/dist/task-control-plane/task-control-plane-api.service.js.map +1 -1
  416. package/dist/task-control-plane/task-control-plane.module.js +22 -3
  417. package/dist/task-control-plane/task-control-plane.module.js.map +1 -1
  418. package/dist/worker/artifact-store.js +6 -1
  419. package/dist/worker/artifact-store.js.map +1 -1
  420. package/dist/worker/build-context.js +135 -1
  421. package/dist/worker/build-context.js.map +1 -1
  422. package/dist/worker/claude-code-runner.js +79 -82
  423. package/dist/worker/claude-code-runner.js.map +1 -1
  424. package/dist/worker/codex-runner.js +474 -0
  425. package/dist/worker/codex-runner.js.map +1 -0
  426. package/dist/worker/git-worktree-manager.js +148 -0
  427. package/dist/worker/git-worktree-manager.js.map +1 -0
  428. package/dist/worker/result-envelope.js +75 -63
  429. package/dist/worker/result-envelope.js.map +1 -1
  430. package/dist/worker/runner-common.js +106 -0
  431. package/dist/worker/runner-common.js.map +1 -0
  432. package/dist/worker/runner-dispatch.js +3 -1
  433. package/dist/worker/runner-dispatch.js.map +1 -1
  434. package/dist/worker/runner.js.map +1 -1
  435. package/dist/worker/stub-runner.js +3 -3
  436. package/dist/worker/stub-runner.js.map +1 -1
  437. package/package.json +15 -7
  438. package/dist/app.module.js +0 -28
  439. package/dist/app.module.js.map +0 -1
  440. package/dist/cli/commands/bootstrap.js +0 -100
  441. package/dist/cli/commands/bootstrap.js.map +0 -1
  442. package/dist/cli/commands/dev.js +0 -143
  443. package/dist/cli/commands/dev.js.map +0 -1
  444. package/dist/cli/commands/inbox.js +0 -288
  445. package/dist/cli/commands/inbox.js.map +0 -1
  446. package/dist/cli/commands/playbook.js +0 -74
  447. package/dist/cli/commands/playbook.js.map +0 -1
  448. package/dist/cli/commands/poll-workflow-state.js +0 -144
  449. package/dist/cli/commands/poll-workflow-state.js.map +0 -1
  450. package/dist/cli/commands/revisium-context.js +0 -23
  451. package/dist/cli/commands/revisium-context.js.map +0 -1
  452. package/dist/cli/commands/revisium.js +0 -89
  453. package/dist/cli/commands/revisium.js.map +0 -1
  454. package/dist/cli/commands/run.js +0 -453
  455. package/dist/cli/commands/run.js.map +0 -1
  456. package/dist/cli/live-guard.js +0 -49
  457. package/dist/cli/live-guard.js.map +0 -1
  458. package/dist/cli/needs-host.js +0 -77
  459. package/dist/cli/needs-host.js.map +0 -1
  460. package/dist/mcp/mcp-stdio.service.js +0 -48
  461. package/dist/mcp/mcp-stdio.service.js.map +0 -1
  462. package/dist/mcp/mcp.module.js.map +0 -1
  463. package/dist/pipeline/develop-task.workflow.js.map +0 -1
  464. package/dist/worker/worktree-manager.js +0 -7
  465. package/dist/worker/worktree-manager.js.map +0 -1
@@ -0,0 +1,109 @@
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 { isHostRunning, readHostRuntime, removeHostRuntime, } from './host-runtime.js';
15
+ const DEFAULT_TIMEOUT_MS = 120_000;
16
+ /** Budget to let an alive-but-not-yet-healthy daemon finish booting before giving up. */
17
+ const DEFAULT_RECHECK_MS = 20_000;
18
+ const POLL_INTERVAL_MS = 300;
19
+ /** The GraphQL port the daemon listens on — must match startGraphqlHost's resolution. */
20
+ export function expectedGraphqlPort() {
21
+ const env = process.env['REVO_GRAPHQL_PORT'];
22
+ if (env && /^\d+$/.test(env.trim()))
23
+ return Number(env.trim());
24
+ return resolveDefaultGraphqlPort();
25
+ }
26
+ /** GraphQL liveness probe: the daemon answers a trivial query on its port. */
27
+ export async function isGraphqlHealthy(port) {
28
+ try {
29
+ const res = await fetch(`http://127.0.0.1:${port}/graphql`, {
30
+ method: 'POST',
31
+ headers: { 'content-type': 'application/json' },
32
+ body: JSON.stringify({ query: '{ __typename }' }),
33
+ signal: AbortSignal.timeout(3000),
34
+ });
35
+ return res.ok;
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ }
41
+ /**
42
+ * Ready = `host.json` present with a LIVE pid AND GraphQL answering. The daemon writes host.json
43
+ * last (after the control-plane bootstrap), so readiness implies the whole stack is usable — not
44
+ * merely that the GraphQL socket is open.
45
+ */
46
+ async function waitForReady(timeoutMs) {
47
+ const deadline = Date.now() + timeoutMs;
48
+ for (;;) {
49
+ const runtime = readHostRuntime();
50
+ if (runtime && isAlive(runtime.pid) && (await isGraphqlHealthy(runtime.graphqlPort)))
51
+ return runtime;
52
+ if (Date.now() >= deadline)
53
+ return null;
54
+ await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
55
+ }
56
+ }
57
+ /**
58
+ * Build the argv to re-invoke THIS CLI as the detached daemon. Handles dev (tsx running the `.ts`
59
+ * source — node needs the tsx loader) vs prod (node running the compiled `.js` entry directly).
60
+ * `entry` defaults to this process's script; it is a parameter so the dev/prod split is unit-testable.
61
+ */
62
+ export function daemonSpawnArgv(entry = process.argv[1]) {
63
+ const daemonArgs = ['__daemon'];
64
+ if (entry.endsWith('.ts')) {
65
+ return [process.execPath, ['--import', 'tsx', entry, ...daemonArgs]];
66
+ }
67
+ return [process.execPath, [entry, ...daemonArgs]];
68
+ }
69
+ function spawnDaemon() {
70
+ const out = openSync(getConfig().hostLogFile, 'a');
71
+ const [cmd, args] = daemonSpawnArgv();
72
+ // env inheritance carries the resolved profile (REVO_PROFILE / REVO_* knobs) to the daemon.
73
+ const child = spawn(cmd, args, { detached: true, stdio: ['ignore', out, out], env: process.env });
74
+ closeSync(out);
75
+ if (!child.pid)
76
+ throw new Error('Failed to spawn Revo host daemon: spawn returned no pid');
77
+ child.unref(); // detached — the daemon outlives this CLI process
78
+ }
79
+ /** Attach to the running host daemon, or spawn one if absent — the only way the stack acquires a host. */
80
+ export async function ensureHost(options = {}) {
81
+ const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
82
+ const recheckMs = options.recheckMs ?? DEFAULT_RECHECK_MS;
83
+ const existing = readHostRuntime();
84
+ if (existing && isHostRunning()) {
85
+ if (await isGraphqlHealthy(existing.graphqlPort)) {
86
+ return { runtime: existing, alreadyRunning: true };
87
+ }
88
+ // Alive but not ready — likely mid-boot/bootstrap. Wait; never spawn a duplicate (port collision).
89
+ const ready = await waitForReady(recheckMs);
90
+ if (ready)
91
+ return { runtime: ready, alreadyRunning: true };
92
+ throw new Error(`Revo host daemon (pid ${existing.pid}) is alive but not healthy on GraphQL port ` +
93
+ `${existing.graphqlPort}. Stop it with \`revo stop\` and retry.`);
94
+ }
95
+ // No live daemon — clear a stale host.json (dead pid), then spawn a fresh detached one.
96
+ // Known limitation (matches ensureRevisium's deferred concurrent-cold-start): this check-then-spawn
97
+ // is not atomic, so two ensureHost() callers racing with no live daemon could both spawn `__daemon`.
98
+ // The second daemon's startGraphqlHost fails fast (the GraphQL port is already bound) and exits, so
99
+ // it cannot become a second DBOS owner; full cross-process spawn locking is deferred.
100
+ if (existing)
101
+ removeHostRuntime();
102
+ spawnDaemon();
103
+ const ready = await waitForReady(timeoutMs);
104
+ if (!ready) {
105
+ throw new Error(`Revo host daemon did not become ready within ${timeoutMs / 1000}s — see \`revo logs\`.`);
106
+ }
107
+ return { runtime: ready, alreadyRunning: false };
108
+ }
109
+ //# 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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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Host daemon runtime file (`host.json`) — the tracked identity of the long-lived Revo/NestJS
3
+ * host daemon, the single DBOS owner (ADR 0006). It lives beside the standalone `runtime.json`
4
+ * in the profile data dir but is a SEPARATE file: the standalone daemon and the host daemon have
5
+ * independent lifecycles, so conflating them would let one's stale pid mask the other's state.
6
+ *
7
+ * Shape is intentionally minimal — only what `ensureHost`/`status`/clients need: the pid to prove
8
+ * liveness, the GraphQL port that is the client transport, and the profile/startedAt for display
9
+ * and compare-and-delete identity. Standalone HTTP/pg ports stay in `runtime.json` (readRuntime).
10
+ */
11
+ import { existsSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
12
+ import { join } from 'node:path';
13
+ import { getConfig, isAlive } from '../config.js';
14
+ export function hostRuntimeFile() {
15
+ return join(getConfig().dataDir, 'host.json');
16
+ }
17
+ export function readHostRuntime() {
18
+ const file = hostRuntimeFile();
19
+ if (!existsSync(file))
20
+ return null;
21
+ try {
22
+ return JSON.parse(readFileSync(file, 'utf8'));
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ }
28
+ export function writeHostRuntime(state) {
29
+ writeFileSync(hostRuntimeFile(), JSON.stringify(state, null, 2));
30
+ }
31
+ export function removeHostRuntime() {
32
+ const file = hostRuntimeFile();
33
+ if (existsSync(file))
34
+ rmSync(file);
35
+ }
36
+ /**
37
+ * Remove `host.json` ONLY if the file on disk still matches the snapshot (same pid AND startedAt).
38
+ * A replaced file (a concurrently-started daemon) or an already-removed file is a safe no-op — so
39
+ * cleanup can never delete a runtime that belongs to another daemon (compare-and-delete).
40
+ */
41
+ export function removeHostRuntimeIfMatches(snapshot) {
42
+ const current = readHostRuntime();
43
+ if (current?.pid === snapshot.pid && current?.startedAt === snapshot.startedAt) {
44
+ removeHostRuntime();
45
+ }
46
+ }
47
+ /** True when `host.json` records a daemon whose pid is still alive (liveness, not health). */
48
+ export function isHostRunning() {
49
+ const runtime = readHostRuntime();
50
+ return runtime !== null && isAlive(runtime.pid);
51
+ }
52
+ //# sourceMappingURL=host-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-runtime.js","sourceRoot":"","sources":["../../src/host/host-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAclD,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAqB,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAuB;IACtD,aAAa,CAAC,eAAe,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,QAA6B;IACtE,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,IAAI,OAAO,EAAE,GAAG,KAAK,QAAQ,CAAC,GAAG,IAAI,OAAO,EAAE,SAAS,KAAK,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC/E,iBAAiB,EAAE,CAAC;IACtB,CAAC;AACH,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,OAAO,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAClD,CAAC"}
@@ -7,6 +7,9 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
10
13
  /**
11
14
  * HostLifecycle — OnApplicationBootstrap / OnApplicationShutdown.
12
15
  *
@@ -23,17 +26,23 @@ var __metadata = (this && this.__metadata) || function (k, v) {
23
26
  * the daemon is detached+unref'd and is a shared, long-lived process; subsequent
24
27
  * `revo dev:status <id>` invocations must find the same daemon + embedded Postgres.
25
28
  */
26
- import { Injectable } from '@nestjs/common';
29
+ import { Inject, Injectable, Optional } from '@nestjs/common';
27
30
  import { DbosService } from '../engine/dbos.service.js';
28
31
  import { ensureRevisium, readPostmasterPgPort } from './ensure-revisium.js';
29
32
  import { dbosSystemDatabaseUrl, ensurePostgres } from '../engine/ensure-postgres.js';
33
+ import { TaskControlPlaneApiService } from '../task-control-plane/task-control-plane-api.service.js';
30
34
  function isMcpStdioHost() {
31
35
  return process.env.REVO_MCP_STDIO === '1';
32
36
  }
37
+ function keepControlPlaneBootstrapDependency(_api) {
38
+ // The constructor dependency forces the control-plane provider graph to instantiate
39
+ // before DBOS.launch(); pipeline registration must precede launch.
40
+ }
33
41
  let HostLifecycle = class HostLifecycle {
34
42
  dbosService;
35
- constructor(dbosService) {
43
+ constructor(dbosService, taskControlPlaneApi) {
36
44
  this.dbosService = dbosService;
45
+ keepControlPlaneBootstrapDependency(taskControlPlaneApi);
37
46
  }
38
47
  async onApplicationBootstrap() {
39
48
  // Step 1: Ensure Revisium daemon is running (auto-start if absent).
@@ -69,7 +78,11 @@ let HostLifecycle = class HostLifecycle {
69
78
  };
70
79
  HostLifecycle = __decorate([
71
80
  Injectable(),
72
- __metadata("design:paramtypes", [DbosService])
81
+ __param(0, Inject(DbosService)),
82
+ __param(1, Optional()),
83
+ __param(1, Inject(TaskControlPlaneApiService)),
84
+ __metadata("design:paramtypes", [DbosService,
85
+ TaskControlPlaneApiService])
73
86
  ], HostLifecycle);
74
87
  export { HostLifecycle };
75
88
  //# sourceMappingURL=host.lifecycle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"host.lifecycle.js","sourceRoot":"","sources":["../../src/host/host.lifecycle.ts"],"names":[],"mappings":";;;;;;;;;AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,UAAU,EAAiD,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAErF,SAAS,cAAc;IACrB,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG,CAAC;AAC5C,CAAC;AAGM,IAAM,aAAa,GAAnB,MAAM,aAAa;IACK;IAA7B,YAA6B,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;IAAG,CAAC;IAEzD,KAAK,CAAC,sBAAsB;QAC1B,oEAAoE;QACpE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;QAE3C,0DAA0D;QAC1D,IAAI,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;QAElC,oDAAoD;QACpD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACrD,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;gBACjD,MAAM,IAAI,KAAK,CACb,sCAAsC,OAAO,CAAC,MAAM,oCAAoC,MAAM,IAAI;oBAChG,6DAA6D,CAChE,CAAC;YACJ,CAAC;YACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,YAAY,GAAG,MAAM,CAAC;YACxB,CAAC;QACH,CAAC;QACD,2FAA2F;QAE3F,6CAA6C;QAC7C,MAAM,cAAc,CAAC,YAAY,CAAC,CAAC;QAEnC,qCAAqC;QACrC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,qBAAqB,CAAC,YAAY,CAAC,EAAE;YAC9D,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;SAChD,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,qBAAqB;QACzB,gEAAgE;QAChE,qCAAqC;QACrC,6EAA6E;QAC7E,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IACpC,CAAC;CACF,CAAA;AAzCY,aAAa;IADzB,UAAU,EAAE;qCAE+B,WAAW;GAD1C,aAAa,CAyCzB"}
1
+ {"version":3,"file":"host.lifecycle.js","sourceRoot":"","sources":["../../src/host/host.lifecycle.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAiD,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC7G,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,0BAA0B,EAAE,MAAM,yDAAyD,CAAC;AAErG,SAAS,cAAc;IACrB,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG,CAAC;AAC5C,CAAC;AAED,SAAS,mCAAmC,CAAC,IAA4C;IACvF,oFAAoF;IACpF,mEAAmE;AACrE,CAAC;AAGM,IAAM,aAAa,GAAnB,MAAM,aAAa;IAEgB;IADxC,YACwC,WAAwB,EAG9D,mBAAgD;QAHV,gBAAW,GAAX,WAAW,CAAa;QAK9D,mCAAmC,CAAC,mBAAmB,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,sBAAsB;QAC1B,oEAAoE;QACpE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;QAE3C,0DAA0D;QAC1D,IAAI,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;QAElC,oDAAoD;QACpD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACrD,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;gBACjD,MAAM,IAAI,KAAK,CACb,sCAAsC,OAAO,CAAC,MAAM,oCAAoC,MAAM,IAAI;oBAChG,6DAA6D,CAChE,CAAC;YACJ,CAAC;YACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,YAAY,GAAG,MAAM,CAAC;YACxB,CAAC;QACH,CAAC;QACD,2FAA2F;QAE3F,6CAA6C;QAC7C,MAAM,cAAc,CAAC,YAAY,CAAC,CAAC;QAEnC,qCAAqC;QACrC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,qBAAqB,CAAC,YAAY,CAAC,EAAE;YAC9D,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;SAChD,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,qBAAqB;QACzB,gEAAgE;QAChE,qCAAqC;QACrC,6EAA6E;QAC7E,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IACpC,CAAC;CACF,CAAA;AAhDY,aAAa;IADzB,UAAU,EAAE;IAGR,WAAA,MAAM,CAAC,WAAW,CAAC,CAAA;IACnB,WAAA,QAAQ,EAAE,CAAA;IACV,WAAA,MAAM,CAAC,0BAA0B,CAAC,CAAA;qCAFgB,WAAW;QAGxC,0BAA0B;GALvC,aAAa,CAgDzB"}
@@ -0,0 +1,56 @@
1
+ import { ValidationPipe } from '@nestjs/common';
2
+ import { NestFactory } from '@nestjs/core';
3
+ import { addWsServer } from '../api/graphql-api/graphql-ws/ws.js';
4
+ import { isPortFree, resolveDefaultGraphqlPort } from '../config.js';
5
+ import { GraphqlHostModule } from './graphql-host.module.js';
6
+ export const DEFAULT_GRAPHQL_HOST = '127.0.0.1';
7
+ const defaultDeps = {
8
+ isPortFree,
9
+ };
10
+ function parsePort(raw) {
11
+ if (!raw)
12
+ return resolveDefaultGraphqlPort();
13
+ const candidate = raw.trim();
14
+ if (!/^\d+$/.test(candidate)) {
15
+ throw new TypeError(`Invalid GraphQL port: ${raw}`);
16
+ }
17
+ const port = Number(candidate);
18
+ if (!Number.isInteger(port) || port <= 0 || port > 65_535) {
19
+ throw new TypeError(`Invalid GraphQL port: ${raw}`);
20
+ }
21
+ return port;
22
+ }
23
+ export function resolveGraphqlHostOptions(options = {}) {
24
+ const host = options.host ?? process.env.REVO_GRAPHQL_HOST ?? DEFAULT_GRAPHQL_HOST;
25
+ if (host !== DEFAULT_GRAPHQL_HOST) {
26
+ throw new TypeError(`GraphQL host must bind ${DEFAULT_GRAPHQL_HOST} in v1; received ${host}`);
27
+ }
28
+ return {
29
+ host,
30
+ port: options.port ?? parsePort(process.env.REVO_GRAPHQL_PORT),
31
+ };
32
+ }
33
+ export async function startGraphqlHost(options = {}, deps = defaultDeps) {
34
+ const resolved = resolveGraphqlHostOptions(options);
35
+ if (resolved.host !== DEFAULT_GRAPHQL_HOST) {
36
+ throw new Error(`GraphQL host must bind ${DEFAULT_GRAPHQL_HOST} in v1; received ${resolved.host}`);
37
+ }
38
+ if (!(await deps.isPortFree(resolved.port))) {
39
+ throw new Error(`GraphQL port ${resolved.port} is already in use; set REVO_GRAPHQL_PORT or --port to a free isolated port.`);
40
+ }
41
+ const app = await NestFactory.create(GraphqlHostModule, { logger: ['error', 'warn'] });
42
+ app.useGlobalPipes(new ValidationPipe({ transform: true }));
43
+ await app.listen(resolved.port, resolved.host);
44
+ const ws = addWsServer(app);
45
+ const close = app.close.bind(app);
46
+ app.close = async () => {
47
+ await ws.dispose();
48
+ await close();
49
+ };
50
+ return {
51
+ app,
52
+ ...resolved,
53
+ url: `http://${resolved.host}:${resolved.port}/graphql`,
54
+ };
55
+ }
56
+ //# sourceMappingURL=graphql-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql-host.js","sourceRoot":"","sources":["../../src/http/graphql-host.ts"],"names":[],"mappings":"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"}
@@ -5,17 +5,19 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  import { Module } from '@nestjs/common';
8
+ import { GraphqlApiModule } from '../api/graphql-api/graphql-api.module.js';
9
+ import { HostLifecycle } from '../host/host.lifecycle.js';
8
10
  import { TaskControlPlaneModule } from '../task-control-plane/task-control-plane.module.js';
9
- import { McpFacadeService } from './mcp-facade.service.js';
10
- import { McpStdioService } from './mcp-stdio.service.js';
11
- let McpModule = class McpModule {
11
+ // The daemon serves BOTH front doors (ADR 0006): GraphQL (frontend) + MCP (agents), over one host
12
+ // process that is the single DBOS owner. The MCP server is built directly from TaskControlPlaneApi-
13
+ // Service (see daemon.ts) — no separate McpModule in the graph.
14
+ let GraphqlHostModule = class GraphqlHostModule {
12
15
  };
13
- McpModule = __decorate([
16
+ GraphqlHostModule = __decorate([
14
17
  Module({
15
- imports: [TaskControlPlaneModule],
16
- providers: [McpFacadeService, McpStdioService],
17
- exports: [McpFacadeService, McpStdioService],
18
+ imports: [TaskControlPlaneModule, GraphqlApiModule],
19
+ providers: [HostLifecycle],
18
20
  })
19
- ], McpModule);
20
- export { McpModule };
21
- //# sourceMappingURL=mcp.module.js.map
21
+ ], GraphqlHostModule);
22
+ export { GraphqlHostModule };
23
+ //# sourceMappingURL=graphql-host.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql-host.module.js","sourceRoot":"","sources":["../../src/http/graphql-host.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oDAAoD,CAAC;AAE5F,kGAAkG;AAClG,oGAAoG;AACpG,gEAAgE;AAKzD,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;CAAG,CAAA;AAApB,iBAAiB;IAJ7B,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,sBAAsB,EAAE,gBAAgB,CAAC;QACnD,SAAS,EAAE,CAAC,aAAa,CAAC;KAC3B,CAAC;GACW,iBAAiB,CAAG"}
@@ -0,0 +1,91 @@
1
+ import { getOperationAST, parse } from 'graphql';
2
+ const ANONYMOUS_OPERATION = 'anonymous';
3
+ const OVERFLOW_OPERATION_LABEL = { operationName: 'other', operationType: 'unknown' };
4
+ export const MAX_GRAPHQL_OPERATION_LABELS = 256;
5
+ function key(label) {
6
+ return `${label.operationType}:${label.operationName}`;
7
+ }
8
+ function isExecutionResult(value) {
9
+ return typeof value === 'object' && value !== null && ('data' in value || 'errors' in value);
10
+ }
11
+ function resultHasErrors(result) {
12
+ return isExecutionResult(result) && Array.isArray(result.errors) && result.errors.length > 0;
13
+ }
14
+ export function identifyGraphqlOperation(params) {
15
+ const query = params.query;
16
+ if (!query) {
17
+ return { operationName: params.operationName ?? ANONYMOUS_OPERATION, operationType: 'unknown' };
18
+ }
19
+ try {
20
+ const document = parse(query);
21
+ const operation = getOperationAST(document, params.operationName);
22
+ return {
23
+ operationName: params.operationName ?? operation?.name?.value ?? ANONYMOUS_OPERATION,
24
+ operationType: operation?.operation ?? 'unknown',
25
+ };
26
+ }
27
+ catch {
28
+ return { operationName: params.operationName ?? ANONYMOUS_OPERATION, operationType: 'unknown' };
29
+ }
30
+ }
31
+ export class GraphqlOperationMetrics {
32
+ records = new Map();
33
+ record(input) {
34
+ let label = { operationName: input.operationName, operationType: input.operationType };
35
+ const labelKey = key(label);
36
+ const overflowKey = key(OVERFLOW_OPERATION_LABEL);
37
+ const leavesRoomForOverflow = this.records.size < MAX_GRAPHQL_OPERATION_LABELS - (this.records.has(overflowKey) ? 0 : 1);
38
+ if (!this.records.has(labelKey) && !leavesRoomForOverflow) {
39
+ label = OVERFLOW_OPERATION_LABEL;
40
+ }
41
+ const current = this.records.get(key(label)) ?? {
42
+ ...label,
43
+ count: 0,
44
+ errorCount: 0,
45
+ totalDurationMs: 0,
46
+ maxDurationMs: 0,
47
+ };
48
+ current.count += 1;
49
+ current.errorCount += input.errored ? 1 : 0;
50
+ current.totalDurationMs += input.durationMs;
51
+ current.maxDurationMs = Math.max(current.maxDurationMs, input.durationMs);
52
+ this.records.set(key(label), current);
53
+ }
54
+ snapshot() {
55
+ return [...this.records.values()]
56
+ .map((record) => ({ ...record }))
57
+ .sort((a, b) => `${a.operationType}:${a.operationName}`.localeCompare(`${b.operationType}:${b.operationName}`));
58
+ }
59
+ reset() {
60
+ this.records.clear();
61
+ }
62
+ }
63
+ export const graphqlOperationMetrics = new GraphqlOperationMetrics();
64
+ export function createGraphqlMetricsPlugin(metrics = graphqlOperationMetrics, now = () => performance.now()) {
65
+ return {
66
+ onParams({ params, paramsHandler, setParamsHandler }) {
67
+ const operation = identifyGraphqlOperation(params);
68
+ setParamsHandler(async (payload) => {
69
+ const startedAt = now();
70
+ try {
71
+ const result = await paramsHandler(payload);
72
+ metrics.record({
73
+ ...operation,
74
+ durationMs: Math.max(0, now() - startedAt),
75
+ errored: resultHasErrors(result),
76
+ });
77
+ return result;
78
+ }
79
+ catch (error) {
80
+ metrics.record({
81
+ ...operation,
82
+ durationMs: Math.max(0, now() - startedAt),
83
+ errored: true,
84
+ });
85
+ throw error;
86
+ }
87
+ });
88
+ },
89
+ };
90
+ }
91
+ //# sourceMappingURL=graphql-metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql-metrics.js","sourceRoot":"","sources":["../../../../src/infrastructure/metrics/graphql/graphql-metrics.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,11 @@ export const MCP_TOOL_NAMES = [
13
13
  'get_run',
14
14
  'get_run_events',
15
15
  'get_run_log',
16
+ 'get_agent_activity',
17
+ 'get_agent_attempts',
18
+ 'get_agent_log',
19
+ 'tail_agent_log',
20
+ 'read_agent_output_events',
16
21
  'get_run_digest',
17
22
  'wait_for_run',
18
23
  'list_inbox',
@@ -37,7 +42,7 @@ export const MCP_INSTRUCTIONS = `Revo is a local-first software-development task
37
42
 
38
43
  Use these tools to manage tasks end-to-end from your coding agent:
39
44
  - create and start runs;
40
- - inspect run status, events, attempts, and digests;
45
+ - inspect run status, events, attempts, agent activity, bounded logs, and digests;
41
46
  - resolve human inbox gates and questions;
42
47
  - inspect installed playbooks, roles, and pipelines;
43
48
  - inspect PR readiness and actionable review feedback before resuming work;
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-capabilities.js","sourceRoot":"","sources":["../../src/mcp/mcp-capabilities.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,YAAY;IACZ,QAAQ;IACR,kBAAkB;IAClB,qBAAqB;IACrB,wBAAwB;IACxB,aAAa;IACb,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,WAAW;IACX,SAAS;IACT,gBAAgB;IAChB,aAAa;IACb,gBAAgB;IAChB,cAAc;IACd,YAAY;IACZ,gBAAgB;IAChB,uBAAuB;IACvB,cAAc;IACd,aAAa;IACb,iBAAiB;IACjB,oBAAoB;IACpB,qBAAqB;IACrB,kBAAkB;IAClB,gBAAgB;IAChB,YAAY;IACZ,UAAU;IACV,gBAAgB;IAChB,cAAc;IACd,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;CACV,CAAC;AAIX,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;qDAWqB,CAAC"}
1
+ {"version":3,"file":"mcp-capabilities.js","sourceRoot":"","sources":["../../src/mcp/mcp-capabilities.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,YAAY;IACZ,QAAQ;IACR,kBAAkB;IAClB,qBAAqB;IACrB,wBAAwB;IACxB,aAAa;IACb,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,WAAW;IACX,SAAS;IACT,gBAAgB;IAChB,aAAa;IACb,oBAAoB;IACpB,oBAAoB;IACpB,eAAe;IACf,gBAAgB;IAChB,0BAA0B;IAC1B,gBAAgB;IAChB,cAAc;IACd,YAAY;IACZ,gBAAgB;IAChB,uBAAuB;IACvB,cAAc;IACd,aAAa;IACb,iBAAiB;IACjB,oBAAoB;IACpB,qBAAqB;IACrB,kBAAkB;IAClB,gBAAgB;IAChB,YAAY;IACZ,UAAU;IACV,gBAAgB;IAChB,cAAc;IACd,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;CACV,CAAC;AAIX,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;qDAWqB,CAAC"}
@@ -10,6 +10,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
10
10
  import { Injectable } from '@nestjs/common';
11
11
  import { TaskControlPlaneApiService, } from '../task-control-plane/task-control-plane-api.service.js';
12
12
  import { ControlPlaneError } from '../control-plane/errors.js';
13
+ import { AgentObservabilityError } from '../observability/types.js';
13
14
  import { CreateRunWorkflowError } from '../run/create-run.js';
14
15
  import { MCP_TOOL_NAMES } from './mcp-capabilities.js';
15
16
  function formatCause(error) {
@@ -21,6 +22,14 @@ function formatCause(error) {
21
22
  return error.message;
22
23
  return String(error);
23
24
  }
25
+ function exposeApplicationError(promise) {
26
+ return promise.catch((error) => {
27
+ if (error instanceof AgentObservabilityError) {
28
+ throw new Error(`${error.code}: ${error.message}`);
29
+ }
30
+ throw error;
31
+ });
32
+ }
24
33
  let McpFacadeService = class McpFacadeService {
25
34
  api;
26
35
  constructor(api) {
@@ -85,6 +94,21 @@ let McpFacadeService = class McpFacadeService {
85
94
  getRunLog(input) {
86
95
  return this.api.getRunLog(input);
87
96
  }
97
+ getAgentActivity(runId) {
98
+ return exposeApplicationError(this.api.getAgentActivity(runId));
99
+ }
100
+ getAgentAttempts(runId) {
101
+ return exposeApplicationError(this.api.getAgentAttempts(runId));
102
+ }
103
+ getAgentLog(input) {
104
+ return exposeApplicationError(this.api.getAgentLog(input));
105
+ }
106
+ tailAgentLog(input) {
107
+ return exposeApplicationError(this.api.readAgentOutputEvents(input));
108
+ }
109
+ readAgentOutputEvents(input) {
110
+ return exposeApplicationError(this.api.readAgentOutputEvents(input));
111
+ }
88
112
  getRunDigest(runId) {
89
113
  return this.api.getRunDigest(runId);
90
114
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-facade.service.js","sourceRoot":"","sources":["../../src/mcp/mcp-facade.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-facade.service.js","sourceRoot":"","sources":["../../src/mcp/mcp-facade.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * McpHttpService — hosts the Revo MCP server over StreamableHTTP inside the host daemon (ADR 0006),
3
+ * so `revo mcp` can be a thin stdio→HTTP bridge instead of building its own AppModule + DBOS.
4
+ *
5
+ * Stateless: a fresh McpServer + transport per request (Revo's tools are request/response; no
6
+ * server-initiated sessions/streaming needed). Same tool surface as the stdio path — both register
7
+ * `registerRevoMcpTools` over the one in-daemon McpFacadeService, so the bridge needs no GraphQL
8
+ * mapping and every tool runs against the single DBOS-owning host.
9
+ */
10
+ import { createServer } from 'node:http';
11
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
12
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
13
+ import { readPackageVersion } from '../package-info.js';
14
+ import { MCP_INSTRUCTIONS } from './mcp-capabilities.js';
15
+ import { registerRevoMcpTools } from './mcp-tools.js';
16
+ /** Cap the request body so a malformed/oversized local request can't balloon daemon memory. */
17
+ const MAX_BODY_BYTES = 4 * 1024 * 1024;
18
+ function readBody(req) {
19
+ return new Promise((resolve, reject) => {
20
+ let raw = '';
21
+ let size = 0;
22
+ req.on('data', (chunk) => {
23
+ size += chunk.length;
24
+ if (size > MAX_BODY_BYTES) {
25
+ reject(new Error('request body too large'));
26
+ req.destroy();
27
+ return;
28
+ }
29
+ raw += chunk;
30
+ });
31
+ req.on('end', () => {
32
+ try {
33
+ resolve(raw ? JSON.parse(raw) : undefined);
34
+ }
35
+ catch (err) {
36
+ reject(err instanceof Error ? err : new Error(String(err)));
37
+ }
38
+ });
39
+ req.on('error', reject);
40
+ });
41
+ }
42
+ /**
43
+ * Plain class (not a Nest provider): the daemon constructs it with a DI-resolved McpFacadeService
44
+ * (`app.get(McpFacadeService)`) and a port. Keeping it out of the provider graph avoids a DI edge
45
+ * that left the injected facade undefined when resolved via the host app.
46
+ */
47
+ export class McpHttpService {
48
+ facade;
49
+ constructor(facade) {
50
+ this.facade = facade;
51
+ }
52
+ /** Bind the MCP endpoint on 127.0.0.1:port. Returns the http.Server so the daemon can close it. */
53
+ async start(port) {
54
+ const server = createServer((req, res) => {
55
+ this.dispatch(req, res).catch(() => {
56
+ // A dispatch failure must still return a deterministic response, never an unhandled rejection.
57
+ if (!res.headersSent)
58
+ res.writeHead(500).end();
59
+ });
60
+ });
61
+ await new Promise((resolve, reject) => {
62
+ server.once('error', reject);
63
+ server.listen(port, '127.0.0.1', () => {
64
+ server.off('error', reject);
65
+ resolve();
66
+ });
67
+ });
68
+ return server;
69
+ }
70
+ /** Handle one HTTP request: POST → a fresh stateless McpServer + StreamableHTTP transport; else 405. */
71
+ async dispatch(req, res) {
72
+ if (req.method !== 'POST') {
73
+ res.writeHead(405).end();
74
+ return;
75
+ }
76
+ let body;
77
+ try {
78
+ body = await readBody(req);
79
+ }
80
+ catch {
81
+ res.writeHead(400).end();
82
+ return;
83
+ }
84
+ const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined, enableJsonResponse: true });
85
+ const server = new McpServer({ name: 'revo', version: readPackageVersion() }, { instructions: MCP_INSTRUCTIONS });
86
+ registerRevoMcpTools(server, this.facade);
87
+ res.on('close', () => {
88
+ transport.close().catch(() => undefined);
89
+ server.close().catch(() => undefined);
90
+ });
91
+ await server.connect(transport);
92
+ await transport.handleRequest(req, res, body);
93
+ }
94
+ }
95
+ //# sourceMappingURL=mcp-http.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-http.service.js","sourceRoot":"","sources":["../../src/mcp/mcp-http.service.ts"],"names":[],"mappings":"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"}