@revisium/orchestrator 0.0.0 → 0.1.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (547) hide show
  1. package/README.md +202 -1
  2. package/control-plane/bootstrap.config.json +104 -2
  3. package/control-plane/default-playbook/catalog/pipelines.json +657 -0
  4. package/control-plane/default-playbook/catalog/roles.json +65 -0
  5. package/control-plane/default-playbook/package.json +5 -0
  6. package/control-plane/default-playbook/playbook.json +13 -0
  7. package/control-plane/default-playbook/prompts/analyst.md +29 -0
  8. package/control-plane/default-playbook/prompts/developer.md +26 -0
  9. package/control-plane/default-playbook/prompts/integrator.md +20 -0
  10. package/control-plane/default-playbook/prompts/orchestrator.md +23 -0
  11. package/control-plane/default-playbook/prompts/reviewer.md +28 -0
  12. package/control-plane/default-playbook/prompts/triager.md +51 -0
  13. package/control-plane/default-playbook/prompts/watcher.md +24 -0
  14. package/dist/api/graphql-api/filters/agent-observability-exception.filter.js +24 -0
  15. package/dist/api/graphql-api/filters/agent-observability-exception.filter.js.map +1 -0
  16. package/dist/api/graphql-api/filters/graphql-validation-exception.filter.js +36 -0
  17. package/dist/api/graphql-api/filters/graphql-validation-exception.filter.js.map +1 -0
  18. package/dist/api/graphql-api/graphql-api.module.js +77 -0
  19. package/dist/api/graphql-api/graphql-api.module.js.map +1 -0
  20. package/dist/api/graphql-api/graphql-ws/agent-observability-subscription-bridge.service.js +296 -0
  21. package/dist/api/graphql-api/graphql-ws/agent-observability-subscription-bridge.service.js.map +1 -0
  22. package/dist/api/graphql-api/graphql-ws/agent-observability-subscription-mappers.js +64 -0
  23. package/dist/api/graphql-api/graphql-ws/agent-observability-subscription-mappers.js.map +1 -0
  24. package/dist/api/graphql-api/graphql-ws/constants.js +11 -0
  25. package/dist/api/graphql-api/graphql-ws/constants.js.map +1 -0
  26. package/dist/api/graphql-api/graphql-ws/pubsub.module.js +32 -0
  27. package/dist/api/graphql-api/graphql-ws/pubsub.module.js.map +1 -0
  28. package/dist/api/graphql-api/graphql-ws/run-progress-subscription-poller.service.js +101 -0
  29. package/dist/api/graphql-api/graphql-ws/run-progress-subscription-poller.service.js.map +1 -0
  30. package/dist/api/graphql-api/graphql-ws/subscription-bridge.service.js +115 -0
  31. package/dist/api/graphql-api/graphql-ws/subscription-bridge.service.js.map +1 -0
  32. package/dist/api/graphql-api/graphql-ws/subscription-mappers.js +85 -0
  33. package/dist/api/graphql-api/graphql-ws/subscription-mappers.js.map +1 -0
  34. package/dist/api/graphql-api/graphql-ws/ws.js +22 -0
  35. package/dist/api/graphql-api/graphql-ws/ws.js.map +1 -0
  36. package/dist/api/graphql-api/inbox/inbox-subscription.resolver.js +56 -0
  37. package/dist/api/graphql-api/inbox/inbox-subscription.resolver.js.map +1 -0
  38. package/dist/api/graphql-api/inbox/inbox.resolver.js +125 -0
  39. package/dist/api/graphql-api/inbox/inbox.resolver.js.map +1 -0
  40. package/dist/api/graphql-api/inbox/inputs/answer-question.input.js +33 -0
  41. package/dist/api/graphql-api/inbox/inputs/answer-question.input.js.map +1 -0
  42. package/dist/api/graphql-api/inbox/inputs/gate-decision.input.js +27 -0
  43. package/dist/api/graphql-api/inbox/inputs/gate-decision.input.js.map +1 -0
  44. package/dist/api/graphql-api/inbox/inputs/list-inbox.input.js +28 -0
  45. package/dist/api/graphql-api/inbox/inputs/list-inbox.input.js.map +1 -0
  46. package/dist/api/graphql-api/inbox/inputs/resolve-inbox-item.input.js +38 -0
  47. package/dist/api/graphql-api/inbox/inputs/resolve-inbox-item.input.js.map +1 -0
  48. package/dist/api/graphql-api/inbox/model/gate-risk.model.js +53 -0
  49. package/dist/api/graphql-api/inbox/model/gate-risk.model.js.map +1 -0
  50. package/dist/api/graphql-api/inbox/model/inbox-connection.model.js +16 -0
  51. package/dist/api/graphql-api/inbox/model/inbox-connection.model.js.map +1 -0
  52. package/dist/api/graphql-api/inbox/model/inbox-item.model.js +88 -0
  53. package/dist/api/graphql-api/inbox/model/inbox-item.model.js.map +1 -0
  54. package/dist/api/graphql-api/inbox/model/inbox-resolution.model.js +48 -0
  55. package/dist/api/graphql-api/inbox/model/inbox-resolution.model.js.map +1 -0
  56. package/dist/api/graphql-api/method/inputs/list-method.input.js +15 -0
  57. package/dist/api/graphql-api/method/inputs/list-method.input.js.map +1 -0
  58. package/dist/api/graphql-api/method/method.resolver.js +90 -0
  59. package/dist/api/graphql-api/method/method.resolver.js.map +1 -0
  60. package/dist/api/graphql-api/method/model/alternative-role-group.model.js +32 -0
  61. package/dist/api/graphql-api/method/model/alternative-role-group.model.js.map +1 -0
  62. package/dist/api/graphql-api/method/model/pipeline-connection.model.js +16 -0
  63. package/dist/api/graphql-api/method/model/pipeline-connection.model.js.map +1 -0
  64. package/dist/api/graphql-api/method/model/pipeline.model.js +69 -0
  65. package/dist/api/graphql-api/method/model/pipeline.model.js.map +1 -0
  66. package/dist/api/graphql-api/method/model/playbook-connection.model.js +16 -0
  67. package/dist/api/graphql-api/method/model/playbook-connection.model.js.map +1 -0
  68. package/dist/api/graphql-api/method/model/playbook.model.js +47 -0
  69. package/dist/api/graphql-api/method/model/playbook.model.js.map +1 -0
  70. package/dist/api/graphql-api/method/model/role-connection.model.js +16 -0
  71. package/dist/api/graphql-api/method/model/role-connection.model.js.map +1 -0
  72. package/dist/api/graphql-api/method/model/role.model.js +98 -0
  73. package/dist/api/graphql-api/method/model/role.model.js.map +1 -0
  74. package/dist/api/graphql-api/pr/inputs/pr-readiness.input.js +52 -0
  75. package/dist/api/graphql-api/pr/inputs/pr-readiness.input.js.map +1 -0
  76. package/dist/api/graphql-api/pr/model/pr-readiness.model.js +403 -0
  77. package/dist/api/graphql-api/pr/model/pr-readiness.model.js.map +1 -0
  78. package/dist/api/graphql-api/pr/pr.resolver.js +76 -0
  79. package/dist/api/graphql-api/pr/pr.resolver.js.map +1 -0
  80. package/dist/api/graphql-api/registerGraphqlEnums.js +9 -0
  81. package/dist/api/graphql-api/registerGraphqlEnums.js.map +1 -0
  82. package/dist/api/graphql-api/runs/inputs/create-run.input.js +63 -0
  83. package/dist/api/graphql-api/runs/inputs/create-run.input.js.map +1 -0
  84. package/dist/api/graphql-api/runs/inputs/get-agent-log.input.js +48 -0
  85. package/dist/api/graphql-api/runs/inputs/get-agent-log.input.js.map +1 -0
  86. package/dist/api/graphql-api/runs/inputs/get-run-attempts.input.js +32 -0
  87. package/dist/api/graphql-api/runs/inputs/get-run-attempts.input.js.map +1 -0
  88. package/dist/api/graphql-api/runs/inputs/get-run-events.input.js +28 -0
  89. package/dist/api/graphql-api/runs/inputs/get-run-events.input.js.map +1 -0
  90. package/dist/api/graphql-api/runs/inputs/list-runs.input.js +23 -0
  91. package/dist/api/graphql-api/runs/inputs/list-runs.input.js.map +1 -0
  92. package/dist/api/graphql-api/runs/inputs/simulate-route.input.js +43 -0
  93. package/dist/api/graphql-api/runs/inputs/simulate-route.input.js.map +1 -0
  94. package/dist/api/graphql-api/runs/model/agent-activity.model.js +367 -0
  95. package/dist/api/graphql-api/runs/model/agent-activity.model.js.map +1 -0
  96. package/dist/api/graphql-api/runs/model/create-run-result.model.js +53 -0
  97. package/dist/api/graphql-api/runs/model/create-run-result.model.js.map +1 -0
  98. package/dist/api/graphql-api/runs/model/run-attempt.model.js +114 -0
  99. package/dist/api/graphql-api/runs/model/run-attempt.model.js.map +1 -0
  100. package/dist/api/graphql-api/runs/model/run-connection.model.js +16 -0
  101. package/dist/api/graphql-api/runs/model/run-connection.model.js.map +1 -0
  102. package/dist/api/graphql-api/runs/model/run-cost.model.js +67 -0
  103. package/dist/api/graphql-api/runs/model/run-cost.model.js.map +1 -0
  104. package/dist/api/graphql-api/runs/model/run-digest.model.js +41 -0
  105. package/dist/api/graphql-api/runs/model/run-digest.model.js.map +1 -0
  106. package/dist/api/graphql-api/runs/model/run-event-connection.model.js +16 -0
  107. package/dist/api/graphql-api/runs/model/run-event-connection.model.js.map +1 -0
  108. package/dist/api/graphql-api/runs/model/run-event.model.js +58 -0
  109. package/dist/api/graphql-api/runs/model/run-event.model.js.map +1 -0
  110. package/dist/api/graphql-api/runs/model/run-progress.model.js +33 -0
  111. package/dist/api/graphql-api/runs/model/run-progress.model.js.map +1 -0
  112. package/dist/api/graphql-api/runs/model/run-workflow.model.js +287 -0
  113. package/dist/api/graphql-api/runs/model/run-workflow.model.js.map +1 -0
  114. package/dist/api/graphql-api/runs/model/run.model.js +57 -0
  115. package/dist/api/graphql-api/runs/model/run.model.js.map +1 -0
  116. package/dist/api/graphql-api/runs/model/usage.model.js +32 -0
  117. package/dist/api/graphql-api/runs/model/usage.model.js.map +1 -0
  118. package/dist/api/graphql-api/runs/run-digest.resolver.js +40 -0
  119. package/dist/api/graphql-api/runs/run-digest.resolver.js.map +1 -0
  120. package/dist/api/graphql-api/runs/run-events.resolver.js +45 -0
  121. package/dist/api/graphql-api/runs/run-events.resolver.js.map +1 -0
  122. package/dist/api/graphql-api/runs/run-progress.resolver.js +53 -0
  123. package/dist/api/graphql-api/runs/run-progress.resolver.js.map +1 -0
  124. package/dist/api/graphql-api/runs/runs-subscription.resolver.js +124 -0
  125. package/dist/api/graphql-api/runs/runs-subscription.resolver.js.map +1 -0
  126. package/dist/api/graphql-api/runs/runs.resolver.js +165 -0
  127. package/dist/api/graphql-api/runs/runs.resolver.js.map +1 -0
  128. package/dist/api/graphql-api/share/graphql-param-types.js +6 -0
  129. package/dist/api/graphql-api/share/graphql-param-types.js.map +1 -0
  130. package/dist/api/graphql-api/share/inputs/connection.input.js +27 -0
  131. package/dist/api/graphql-api/share/inputs/connection.input.js.map +1 -0
  132. package/dist/api/graphql-api/share/inputs/run-subscription.input.js +22 -0
  133. package/dist/api/graphql-api/share/inputs/run-subscription.input.js.map +1 -0
  134. package/dist/api/graphql-api/share/model/paginated.model.js +75 -0
  135. package/dist/api/graphql-api/share/model/paginated.model.js.map +1 -0
  136. package/dist/api/graphql-api/system/model/daemon-status.model.js +47 -0
  137. package/dist/api/graphql-api/system/model/daemon-status.model.js.map +1 -0
  138. package/dist/api/graphql-api/system/model/doctor-result.model.js +33 -0
  139. package/dist/api/graphql-api/system/model/doctor-result.model.js.map +1 -0
  140. package/dist/api/graphql-api/system/model/project.model.js +37 -0
  141. package/dist/api/graphql-api/system/model/project.model.js.map +1 -0
  142. package/dist/api/graphql-api/system/model/repository-context.model.js +70 -0
  143. package/dist/api/graphql-api/system/model/repository-context.model.js.map +1 -0
  144. package/dist/api/graphql-api/system/model/repository-validation.model.js +62 -0
  145. package/dist/api/graphql-api/system/model/repository-validation.model.js.map +1 -0
  146. package/dist/api/graphql-api/system/model/system-status.model.js +29 -0
  147. package/dist/api/graphql-api/system/model/system-status.model.js.map +1 -0
  148. package/dist/api/graphql-api/system/system.resolver.js +83 -0
  149. package/dist/api/graphql-api/system/system.resolver.js.map +1 -0
  150. package/dist/cli/commands/doctor-report.js +70 -0
  151. package/dist/cli/commands/doctor-report.js.map +1 -0
  152. package/dist/cli/commands/lifecycle.js +463 -0
  153. package/dist/cli/commands/lifecycle.js.map +1 -0
  154. package/dist/cli/commands/mcp.js +53 -8
  155. package/dist/cli/commands/mcp.js.map +1 -1
  156. package/dist/cli/commands/process-tree.js +87 -0
  157. package/dist/cli/commands/process-tree.js.map +1 -0
  158. package/dist/cli/commands/revisium-helpers.js +2 -2
  159. package/dist/cli/commands/rogue-reaper.js +63 -0
  160. package/dist/cli/commands/rogue-reaper.js.map +1 -0
  161. package/dist/cli/index.js +5 -29
  162. package/dist/cli/index.js.map +1 -1
  163. package/dist/cli/program.js +7 -23
  164. package/dist/cli/program.js.map +1 -1
  165. package/dist/config.js +79 -1
  166. package/dist/config.js.map +1 -1
  167. package/dist/control-plane/bootstrap.js +101 -0
  168. package/dist/control-plane/bootstrap.js.map +1 -0
  169. package/dist/control-plane/change-notifications.js +35 -0
  170. package/dist/control-plane/change-notifications.js.map +1 -0
  171. package/dist/control-plane/client-transport.js +74 -41
  172. package/dist/control-plane/client-transport.js.map +1 -1
  173. package/dist/control-plane/data-access.js +13 -5
  174. package/dist/control-plane/data-access.js.map +1 -1
  175. package/dist/control-plane/definitions.js +1 -1
  176. package/dist/control-plane/definitions.js.map +1 -1
  177. package/dist/control-plane/inbox.js +5 -31
  178. package/dist/control-plane/inbox.js.map +1 -1
  179. package/dist/control-plane/index.js +1 -1
  180. package/dist/control-plane/index.js.map +1 -1
  181. package/dist/control-plane/json-fields.js +2 -0
  182. package/dist/control-plane/json-fields.js.map +1 -1
  183. package/dist/control-plane/resolve-cwd.js +76 -8
  184. package/dist/control-plane/resolve-cwd.js.map +1 -1
  185. package/dist/control-plane/schema-migration.js +82 -0
  186. package/dist/control-plane/schema-migration.js.map +1 -0
  187. package/dist/control-plane/seed-default-playbook.js +141 -0
  188. package/dist/control-plane/seed-default-playbook.js.map +1 -0
  189. package/dist/control-plane/steps.js +15 -349
  190. package/dist/control-plane/steps.js.map +1 -1
  191. package/dist/control-plane/tables.js +1 -0
  192. package/dist/control-plane/tables.js.map +1 -1
  193. package/dist/e2e/kit/agents.js +148 -0
  194. package/dist/e2e/kit/agents.js.map +1 -0
  195. package/dist/e2e/kit/assertions.js +163 -0
  196. package/dist/e2e/kit/assertions.js.map +1 -0
  197. package/dist/e2e/kit/crash.js +44 -0
  198. package/dist/e2e/kit/crash.js.map +1 -0
  199. package/dist/e2e/kit/drive.js +45 -0
  200. package/dist/e2e/kit/drive.js.map +1 -0
  201. package/dist/e2e/kit/env.js +16 -0
  202. package/dist/e2e/kit/env.js.map +1 -0
  203. package/dist/e2e/kit/fake-integrator.js +57 -0
  204. package/dist/e2e/kit/fake-integrator.js.map +1 -0
  205. package/dist/e2e/kit/gh-emulator.js +213 -0
  206. package/dist/e2e/kit/gh-emulator.js.map +1 -0
  207. package/dist/e2e/kit/git-target-repo.js +115 -0
  208. package/dist/e2e/kit/git-target-repo.js.map +1 -0
  209. package/dist/e2e/kit/harness.js +72 -0
  210. package/dist/e2e/kit/harness.js.map +1 -0
  211. package/dist/e2e/kit/index.js +14 -0
  212. package/dist/e2e/kit/index.js.map +1 -0
  213. package/dist/e2e/kit/mcp.js +32 -0
  214. package/dist/e2e/kit/mcp.js.map +1 -0
  215. package/dist/e2e/kit/scenarios.js +196 -0
  216. package/dist/e2e/kit/scenarios.js.map +1 -0
  217. package/dist/e2e/recovery-crash-child.js +29 -0
  218. package/dist/e2e/recovery-crash-child.js.map +1 -0
  219. package/dist/e2e/recovery-dd-crash-child.js +43 -0
  220. package/dist/e2e/recovery-dd-crash-child.js.map +1 -0
  221. package/dist/engine/dbos.module.js +2 -1
  222. package/dist/engine/dbos.module.js.map +1 -1
  223. package/dist/engine/dbos.service.js +89 -18
  224. package/dist/engine/dbos.service.js.map +1 -1
  225. package/dist/engine/ensure-postgres.js +18 -4
  226. package/dist/engine/ensure-postgres.js.map +1 -1
  227. package/dist/features/inbox/commands/handlers/inbox-command.handlers.js +80 -0
  228. package/dist/features/inbox/commands/handlers/inbox-command.handlers.js.map +1 -0
  229. package/dist/features/inbox/commands/impl/answer-question.command.js +7 -0
  230. package/dist/features/inbox/commands/impl/answer-question.command.js.map +1 -0
  231. package/dist/features/inbox/commands/impl/approve-gate.command.js +7 -0
  232. package/dist/features/inbox/commands/impl/approve-gate.command.js.map +1 -0
  233. package/dist/features/inbox/commands/impl/reject-gate.command.js +7 -0
  234. package/dist/features/inbox/commands/impl/reject-gate.command.js.map +1 -0
  235. package/dist/features/inbox/commands/impl/resolve-inbox-item.command.js +7 -0
  236. package/dist/features/inbox/commands/impl/resolve-inbox-item.command.js.map +1 -0
  237. package/dist/features/inbox/commands/index.js +8 -0
  238. package/dist/features/inbox/commands/index.js.map +1 -0
  239. package/dist/features/inbox/inbox-api.module.js +23 -0
  240. package/dist/features/inbox/inbox-api.module.js.map +1 -0
  241. package/dist/features/inbox/inbox-api.service.js +63 -0
  242. package/dist/features/inbox/inbox-api.service.js.map +1 -0
  243. package/dist/features/inbox/queries/handlers/inbox-query.handlers.js +111 -0
  244. package/dist/features/inbox/queries/handlers/inbox-query.handlers.js.map +1 -0
  245. package/dist/features/inbox/queries/impl/get-inbox-item.query.js +7 -0
  246. package/dist/features/inbox/queries/impl/get-inbox-item.query.js.map +1 -0
  247. package/dist/features/inbox/queries/impl/get-pending-decisions.query.js +7 -0
  248. package/dist/features/inbox/queries/impl/get-pending-decisions.query.js.map +1 -0
  249. package/dist/features/inbox/queries/impl/list-inbox.query.js +7 -0
  250. package/dist/features/inbox/queries/impl/list-inbox.query.js.map +1 -0
  251. package/dist/features/inbox/queries/impl/summarize-gate-risk.query.js +7 -0
  252. package/dist/features/inbox/queries/impl/summarize-gate-risk.query.js.map +1 -0
  253. package/dist/features/inbox/queries/index.js +8 -0
  254. package/dist/features/inbox/queries/index.js.map +1 -0
  255. package/dist/features/method/commands/index.js +2 -0
  256. package/dist/features/method/commands/index.js.map +1 -0
  257. package/dist/features/method/method-api.module.js +23 -0
  258. package/dist/features/method/method-api.module.js.map +1 -0
  259. package/dist/features/method/method-api.service.js +47 -0
  260. package/dist/features/method/method-api.service.js.map +1 -0
  261. package/dist/features/method/queries/handlers/method-query.handlers.js +115 -0
  262. package/dist/features/method/queries/handlers/method-query.handlers.js.map +1 -0
  263. package/dist/features/method/queries/impl/get-pipeline.query.js +7 -0
  264. package/dist/features/method/queries/impl/get-pipeline.query.js.map +1 -0
  265. package/dist/features/method/queries/impl/get-role.query.js +7 -0
  266. package/dist/features/method/queries/impl/get-role.query.js.map +1 -0
  267. package/dist/features/method/queries/impl/list-pipelines.query.js +7 -0
  268. package/dist/features/method/queries/impl/list-pipelines.query.js.map +1 -0
  269. package/dist/features/method/queries/impl/list-playbooks.query.js +7 -0
  270. package/dist/features/method/queries/impl/list-playbooks.query.js.map +1 -0
  271. package/dist/features/method/queries/impl/list-roles.query.js +7 -0
  272. package/dist/features/method/queries/impl/list-roles.query.js.map +1 -0
  273. package/dist/features/method/queries/index.js +9 -0
  274. package/dist/features/method/queries/index.js.map +1 -0
  275. package/dist/features/pr/commands/index.js +2 -0
  276. package/dist/features/pr/commands/index.js.map +1 -0
  277. package/dist/features/pr/pr-api.module.js +23 -0
  278. package/dist/features/pr/pr-api.module.js.map +1 -0
  279. package/dist/features/pr/pr-api.service.js +35 -0
  280. package/dist/features/pr/pr-api.service.js.map +1 -0
  281. package/dist/features/pr/queries/handlers/pr-query.handlers.js +48 -0
  282. package/dist/features/pr/queries/handlers/pr-query.handlers.js.map +1 -0
  283. package/dist/features/pr/queries/impl/get-pr-readiness.query.js +7 -0
  284. package/dist/features/pr/queries/impl/get-pr-readiness.query.js.map +1 -0
  285. package/dist/features/pr/queries/impl/list-pr-feedback.query.js +7 -0
  286. package/dist/features/pr/queries/impl/list-pr-feedback.query.js.map +1 -0
  287. package/dist/features/pr/queries/index.js +3 -0
  288. package/dist/features/pr/queries/index.js.map +1 -0
  289. package/dist/features/runs/commands/handlers/runs-command.handlers.js +32 -0
  290. package/dist/features/runs/commands/handlers/runs-command.handlers.js.map +1 -0
  291. package/dist/features/runs/commands/impl/create-run.command.js +7 -0
  292. package/dist/features/runs/commands/impl/create-run.command.js.map +1 -0
  293. package/dist/features/runs/commands/index.js +3 -0
  294. package/dist/features/runs/commands/index.js.map +1 -0
  295. package/dist/features/runs/queries/handlers/runs-query.handlers.js +359 -0
  296. package/dist/features/runs/queries/handlers/runs-query.handlers.js.map +1 -0
  297. package/dist/features/runs/queries/impl/get-agent-activity.query.js +7 -0
  298. package/dist/features/runs/queries/impl/get-agent-activity.query.js.map +1 -0
  299. package/dist/features/runs/queries/impl/get-agent-attempts.query.js +7 -0
  300. package/dist/features/runs/queries/impl/get-agent-attempts.query.js.map +1 -0
  301. package/dist/features/runs/queries/impl/get-agent-log.query.js +7 -0
  302. package/dist/features/runs/queries/impl/get-agent-log.query.js.map +1 -0
  303. package/dist/features/runs/queries/impl/get-run-attempts.query.js +7 -0
  304. package/dist/features/runs/queries/impl/get-run-attempts.query.js.map +1 -0
  305. package/dist/features/runs/queries/impl/get-run-digest.query.js +7 -0
  306. package/dist/features/runs/queries/impl/get-run-digest.query.js.map +1 -0
  307. package/dist/features/runs/queries/impl/get-run-events.query.js +7 -0
  308. package/dist/features/runs/queries/impl/get-run-events.query.js.map +1 -0
  309. package/dist/features/runs/queries/impl/get-run-progress.query.js +7 -0
  310. package/dist/features/runs/queries/impl/get-run-progress.query.js.map +1 -0
  311. package/dist/features/runs/queries/impl/get-run-workflow.query.js +7 -0
  312. package/dist/features/runs/queries/impl/get-run-workflow.query.js.map +1 -0
  313. package/dist/features/runs/queries/impl/get-run.query.js +7 -0
  314. package/dist/features/runs/queries/impl/get-run.query.js.map +1 -0
  315. package/dist/features/runs/queries/impl/list-runs.query.js +7 -0
  316. package/dist/features/runs/queries/impl/list-runs.query.js.map +1 -0
  317. package/dist/features/runs/queries/impl/simulate-route.query.js +7 -0
  318. package/dist/features/runs/queries/impl/simulate-route.query.js.map +1 -0
  319. package/dist/features/runs/queries/index.js +15 -0
  320. package/dist/features/runs/queries/index.js.map +1 -0
  321. package/dist/features/runs/runs-api.module.js +23 -0
  322. package/dist/features/runs/runs-api.module.js.map +1 -0
  323. package/dist/features/runs/runs-api.service.js +79 -0
  324. package/dist/features/runs/runs-api.service.js.map +1 -0
  325. package/dist/features/shared/connection.js +39 -0
  326. package/dist/features/shared/connection.js.map +1 -0
  327. package/dist/features/system/commands/index.js +2 -0
  328. package/dist/features/system/commands/index.js.map +1 -0
  329. package/dist/features/system/queries/handlers/system-query.handlers.js +96 -0
  330. package/dist/features/system/queries/handlers/system-query.handlers.js.map +1 -0
  331. package/dist/features/system/queries/impl/doctor.query.js +4 -0
  332. package/dist/features/system/queries/impl/doctor.query.js.map +1 -0
  333. package/dist/features/system/queries/impl/get-project.query.js +4 -0
  334. package/dist/features/system/queries/impl/get-project.query.js.map +1 -0
  335. package/dist/features/system/queries/impl/get-repository-context.query.js +7 -0
  336. package/dist/features/system/queries/impl/get-repository-context.query.js.map +1 -0
  337. package/dist/features/system/queries/impl/get-status.query.js +4 -0
  338. package/dist/features/system/queries/impl/get-status.query.js.map +1 -0
  339. package/dist/features/system/queries/impl/validate-repository.query.js +7 -0
  340. package/dist/features/system/queries/impl/validate-repository.query.js.map +1 -0
  341. package/dist/features/system/queries/index.js +9 -0
  342. package/dist/features/system/queries/index.js.map +1 -0
  343. package/dist/features/system/system-api.module.js +23 -0
  344. package/dist/features/system/system-api.module.js.map +1 -0
  345. package/dist/features/system/system-api.service.js +47 -0
  346. package/dist/features/system/system-api.service.js.map +1 -0
  347. package/dist/host/daemon.js +99 -0
  348. package/dist/host/daemon.js.map +1 -0
  349. package/dist/host/dbos-identity.js +42 -0
  350. package/dist/host/dbos-identity.js.map +1 -0
  351. package/dist/host/ensure-host.js +120 -0
  352. package/dist/host/ensure-host.js.map +1 -0
  353. package/dist/host/host-runtime.js +90 -0
  354. package/dist/host/host-runtime.js.map +1 -0
  355. package/dist/host/host.lifecycle.js +16 -3
  356. package/dist/host/host.lifecycle.js.map +1 -1
  357. package/dist/host/queue-ownership.js +70 -0
  358. package/dist/host/queue-ownership.js.map +1 -0
  359. package/dist/host/queue-poller-census.js +47 -0
  360. package/dist/host/queue-poller-census.js.map +1 -0
  361. package/dist/http/graphql-host.js +56 -0
  362. package/dist/http/graphql-host.js.map +1 -0
  363. package/dist/{mcp/mcp.module.js → http/graphql-host.module.js} +12 -10
  364. package/dist/http/graphql-host.module.js.map +1 -0
  365. package/dist/infrastructure/metrics/graphql/graphql-metrics.js +91 -0
  366. package/dist/infrastructure/metrics/graphql/graphql-metrics.js.map +1 -0
  367. package/dist/mcp/mcp-capabilities.js +9 -1
  368. package/dist/mcp/mcp-capabilities.js.map +1 -1
  369. package/dist/mcp/mcp-facade.service.js +68 -5
  370. package/dist/mcp/mcp-facade.service.js.map +1 -1
  371. package/dist/mcp/mcp-http.service.js +95 -0
  372. package/dist/mcp/mcp-http.service.js.map +1 -0
  373. package/dist/mcp/mcp-tools.js +93 -7
  374. package/dist/mcp/mcp-tools.js.map +1 -1
  375. package/dist/observability/agent-activity-reporter.js +185 -0
  376. package/dist/observability/agent-activity-reporter.js.map +1 -0
  377. package/dist/observability/agent-observability.service.js +1142 -0
  378. package/dist/observability/agent-observability.service.js.map +1 -0
  379. package/dist/observability/index.js +4 -0
  380. package/dist/observability/index.js.map +1 -0
  381. package/dist/observability/types.js +11 -0
  382. package/dist/observability/types.js.map +1 -0
  383. package/dist/pipeline/await-human.js +8 -4
  384. package/dist/pipeline/await-human.js.map +1 -1
  385. package/dist/pipeline/data-driven-task.workflow.js +667 -0
  386. package/dist/pipeline/data-driven-task.workflow.js.map +1 -0
  387. package/dist/pipeline/data-driven-template.js +57 -0
  388. package/dist/pipeline/data-driven-template.js.map +1 -0
  389. package/dist/pipeline/pipeline.module.js +2 -2
  390. package/dist/pipeline/pipeline.module.js.map +1 -1
  391. package/dist/pipeline/pipeline.service.js +412 -0
  392. package/dist/pipeline/pipeline.service.js.map +1 -0
  393. package/dist/pipeline/route-contract.js +82 -0
  394. package/dist/pipeline/route-contract.js.map +1 -0
  395. package/dist/pipeline-core/index.js +16 -0
  396. package/dist/pipeline-core/index.js.map +1 -0
  397. package/dist/pipeline-core/interpret.js +353 -0
  398. package/dist/pipeline-core/interpret.js.map +1 -0
  399. package/dist/pipeline-core/kit/assertions.js +61 -0
  400. package/dist/pipeline-core/kit/assertions.js.map +1 -0
  401. package/dist/pipeline-core/kit/builders.js +138 -0
  402. package/dist/pipeline-core/kit/builders.js.map +1 -0
  403. package/dist/pipeline-core/kit/drive.js +96 -0
  404. package/dist/pipeline-core/kit/drive.js.map +1 -0
  405. package/dist/pipeline-core/kit/fixtures.js +342 -0
  406. package/dist/pipeline-core/kit/fixtures.js.map +1 -0
  407. package/dist/pipeline-core/kit/index.js +13 -0
  408. package/dist/pipeline-core/kit/index.js.map +1 -0
  409. package/dist/pipeline-core/types.js +134 -0
  410. package/dist/pipeline-core/types.js.map +1 -0
  411. package/dist/pipeline-core/validate-capability.js +23 -0
  412. package/dist/pipeline-core/validate-capability.js.map +1 -0
  413. package/dist/pipeline-core/validate-conflicts.js +37 -0
  414. package/dist/pipeline-core/validate-conflicts.js.map +1 -0
  415. package/dist/pipeline-core/validate-dataflow.js +212 -0
  416. package/dist/pipeline-core/validate-dataflow.js.map +1 -0
  417. package/dist/pipeline-core/validate-diff.js +158 -0
  418. package/dist/pipeline-core/validate-diff.js.map +1 -0
  419. package/dist/pipeline-core/validate-edges.js +44 -0
  420. package/dist/pipeline-core/validate-edges.js.map +1 -0
  421. package/dist/pipeline-core/validate-graph.js +123 -0
  422. package/dist/pipeline-core/validate-graph.js.map +1 -0
  423. package/dist/pipeline-core/validate-loops.js +226 -0
  424. package/dist/pipeline-core/validate-loops.js.map +1 -0
  425. package/dist/pipeline-core/validate-parallel.js +132 -0
  426. package/dist/pipeline-core/validate-parallel.js.map +1 -0
  427. package/dist/pipeline-core/validate-sink.js +27 -0
  428. package/dist/pipeline-core/validate-sink.js.map +1 -0
  429. package/dist/pipeline-core/validate-topology.js +140 -0
  430. package/dist/pipeline-core/validate-topology.js.map +1 -0
  431. package/dist/pipeline-core/validate-verdict.js +72 -0
  432. package/dist/pipeline-core/validate-verdict.js.map +1 -0
  433. package/dist/pipeline-core/validate.js +119 -0
  434. package/dist/pipeline-core/validate.js.map +1 -0
  435. package/dist/playbook/catalog-loader.js +14 -1
  436. package/dist/playbook/catalog-loader.js.map +1 -1
  437. package/dist/playbook/import-mapper.js +14 -38
  438. package/dist/playbook/import-mapper.js.map +1 -1
  439. package/dist/playbook/manifest.js +1 -1
  440. package/dist/revisium/playbooks.service.js +107 -19
  441. package/dist/revisium/playbooks.service.js.map +1 -1
  442. package/dist/revisium/roles.service.js +1 -1
  443. package/dist/revisium/roles.service.js.map +1 -1
  444. package/dist/revisium/run.service.js +55 -8
  445. package/dist/revisium/run.service.js.map +1 -1
  446. package/dist/run/append-event.js +24 -1
  447. package/dist/run/append-event.js.map +1 -1
  448. package/dist/run/block-run.js +17 -0
  449. package/dist/run/block-run.js.map +1 -0
  450. package/dist/run/complete-run.js +18 -0
  451. package/dist/run/complete-run.js.map +1 -0
  452. package/dist/run/create-run.js +33 -36
  453. package/dist/run/create-run.js.map +1 -1
  454. package/dist/run/inspect-run.js +31 -30
  455. package/dist/run/inspect-run.js.map +1 -1
  456. package/dist/run/run-outputs.js +88 -0
  457. package/dist/run/run-outputs.js.map +1 -0
  458. package/dist/run/terminal-run-status.js +66 -7
  459. package/dist/run/terminal-run-status.js.map +1 -1
  460. package/dist/runners/claude-code.service.js +5 -0
  461. package/dist/runners/claude-code.service.js.map +1 -1
  462. package/dist/runners/codex.service.js +51 -0
  463. package/dist/runners/codex.service.js.map +1 -0
  464. package/dist/runners/integrator-branch-naming.js +39 -0
  465. package/dist/runners/integrator-branch-naming.js.map +1 -0
  466. package/dist/runners/integrator-git.js +84 -0
  467. package/dist/runners/integrator-git.js.map +1 -0
  468. package/dist/runners/integrator-remote.js +34 -0
  469. package/dist/runners/integrator-remote.js.map +1 -0
  470. package/dist/runners/integrator-types.js +9 -0
  471. package/dist/runners/integrator-types.js.map +1 -0
  472. package/dist/runners/integrator.js +327 -147
  473. package/dist/runners/integrator.js.map +1 -1
  474. package/dist/runners/runner.module.js +7 -3
  475. package/dist/runners/runner.module.js.map +1 -1
  476. package/dist/runners/worktree.service.js +63 -0
  477. package/dist/runners/worktree.service.js.map +1 -0
  478. package/dist/smoke/cli.js +47 -0
  479. package/dist/smoke/cli.js.map +1 -0
  480. package/dist/smoke/isolation.js +113 -0
  481. package/dist/smoke/isolation.js.map +1 -0
  482. package/dist/task-control-plane/run-watch.service.js +281 -0
  483. package/dist/task-control-plane/run-watch.service.js.map +1 -0
  484. package/dist/task-control-plane/task-control-plane-api.service.js +569 -23
  485. package/dist/task-control-plane/task-control-plane-api.service.js.map +1 -1
  486. package/dist/task-control-plane/task-control-plane.module.js +22 -3
  487. package/dist/task-control-plane/task-control-plane.module.js.map +1 -1
  488. package/dist/worker/artifact-store.js +116 -0
  489. package/dist/worker/artifact-store.js.map +1 -0
  490. package/dist/worker/build-context.js +169 -2
  491. package/dist/worker/build-context.js.map +1 -1
  492. package/dist/worker/claude-code-runner.js +159 -68
  493. package/dist/worker/claude-code-runner.js.map +1 -1
  494. package/dist/worker/codex-runner.js +474 -0
  495. package/dist/worker/codex-runner.js.map +1 -0
  496. package/dist/worker/git-worktree-manager.js +129 -65
  497. package/dist/worker/git-worktree-manager.js.map +1 -1
  498. package/dist/worker/process-executor.js +23 -2
  499. package/dist/worker/process-executor.js.map +1 -1
  500. package/dist/worker/result-envelope.js +115 -57
  501. package/dist/worker/result-envelope.js.map +1 -1
  502. package/dist/worker/runner-common.js +106 -0
  503. package/dist/worker/runner-common.js.map +1 -0
  504. package/dist/worker/runner-dispatch.js +4 -1
  505. package/dist/worker/runner-dispatch.js.map +1 -1
  506. package/dist/worker/runner.js +11 -1
  507. package/dist/worker/runner.js.map +1 -1
  508. package/dist/worker/stub-runner.js +7 -45
  509. package/dist/worker/stub-runner.js.map +1 -1
  510. package/package.json +32 -7
  511. package/dist/app.module.js +0 -28
  512. package/dist/app.module.js.map +0 -1
  513. package/dist/cli/commands/bootstrap.js +0 -39
  514. package/dist/cli/commands/bootstrap.js.map +0 -1
  515. package/dist/cli/commands/dev.js +0 -143
  516. package/dist/cli/commands/dev.js.map +0 -1
  517. package/dist/cli/commands/inbox.js +0 -288
  518. package/dist/cli/commands/inbox.js.map +0 -1
  519. package/dist/cli/commands/playbook.js +0 -74
  520. package/dist/cli/commands/playbook.js.map +0 -1
  521. package/dist/cli/commands/poll-workflow-state.js +0 -144
  522. package/dist/cli/commands/poll-workflow-state.js.map +0 -1
  523. package/dist/cli/commands/revisium-context.js +0 -23
  524. package/dist/cli/commands/revisium-context.js.map +0 -1
  525. package/dist/cli/commands/revisium.js +0 -89
  526. package/dist/cli/commands/revisium.js.map +0 -1
  527. package/dist/cli/commands/run.js +0 -426
  528. package/dist/cli/commands/run.js.map +0 -1
  529. package/dist/cli/commands/work.js +0 -149
  530. package/dist/cli/commands/work.js.map +0 -1
  531. package/dist/cli/live-guard.js +0 -49
  532. package/dist/cli/live-guard.js.map +0 -1
  533. package/dist/cli/needs-host.js +0 -78
  534. package/dist/cli/needs-host.js.map +0 -1
  535. package/dist/mcp/mcp-stdio.service.js +0 -48
  536. package/dist/mcp/mcp-stdio.service.js.map +0 -1
  537. package/dist/mcp/mcp.module.js.map +0 -1
  538. package/dist/pipeline/develop-task.workflow.js +0 -497
  539. package/dist/pipeline/develop-task.workflow.js.map +0 -1
  540. package/dist/worker/loop.js +0 -122
  541. package/dist/worker/loop.js.map +0 -1
  542. package/dist/worker/script-runner.js +0 -28
  543. package/dist/worker/script-runner.js.map +0 -1
  544. package/dist/worker/worker-id.js +0 -18
  545. package/dist/worker/worker-id.js.map +0 -1
  546. package/dist/worker/worktree-manager.js +0 -7
  547. package/dist/worker/worktree-manager.js.map +0 -1
@@ -0,0 +1,82 @@
1
+ import { readFileSync } from 'node:fs';
2
+ function isRecord(value) {
3
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
4
+ }
5
+ function escapePointer(segment) {
6
+ return segment.replaceAll('~', '~0').replaceAll('/', '~1');
7
+ }
8
+ function schemaProperties(schema) {
9
+ if (!isRecord(schema))
10
+ return {};
11
+ return isRecord(schema.properties) ? schema.properties : {};
12
+ }
13
+ function stableJson(value) {
14
+ if (!isRecord(value) && !Array.isArray(value))
15
+ return JSON.stringify(value);
16
+ if (Array.isArray(value))
17
+ return `[${value.map(stableJson).join(',')}]`;
18
+ const entries = Object.keys(value)
19
+ .sort((a, b) => a.localeCompare(b))
20
+ .map((key) => `${JSON.stringify(key)}:${stableJson(value[key])}`);
21
+ return `{${entries.join(',')}}`;
22
+ }
23
+ export function computeAdditiveSchemaPatches(currentSchema, desiredSchema) {
24
+ const currentProps = schemaProperties(currentSchema);
25
+ const desiredProps = schemaProperties(desiredSchema);
26
+ const patches = [];
27
+ for (const [name, desired] of Object.entries(desiredProps)) {
28
+ const path = `/properties/${escapePointer(name)}`;
29
+ if (!(name in currentProps)) {
30
+ patches.push({ op: 'add', path, value: desired });
31
+ continue;
32
+ }
33
+ if (stableJson(currentProps[name]) !== stableJson(desired)) {
34
+ patches.push({ op: 'replace', path, value: desired });
35
+ }
36
+ }
37
+ return patches;
38
+ }
39
+ function loadBootstrapTables(configPath) {
40
+ const parsed = JSON.parse(readFileSync(configPath, 'utf8'));
41
+ if (!Array.isArray(parsed.tables))
42
+ return [];
43
+ return parsed.tables.flatMap((item) => {
44
+ if (!isRecord(item) || typeof item.id !== 'string' || !isRecord(item.schema))
45
+ return [];
46
+ return [{ id: item.id, schema: item.schema }];
47
+ });
48
+ }
49
+ /**
50
+ * Apply the bootstrap.config.json table schemas additively onto a caller-provided DRAFT scope:
51
+ * create missing tables, patch additive drift on existing ones. Does NOT commit — the caller owns the
52
+ * scope and commits the whole bootstrap once (one `client.revision('draft')` → tables + rows → commit).
53
+ */
54
+ export async function applyAdditiveSchemaMigration(draft, configPath) {
55
+ const tables = loadBootstrapTables(configPath);
56
+ const updatedTables = [];
57
+ let patchCount = 0;
58
+ for (const table of tables) {
59
+ let currentSchema;
60
+ try {
61
+ currentSchema = await draft.getTableSchema(table.id);
62
+ }
63
+ catch {
64
+ // Table absent on an upgraded control-plane (e.g. `run_outputs`, added in 0016). The previous
65
+ // code only PATCHED existing tables, so a brand-new table would never land on an already-
66
+ // bootstrapped control-plane. Create it from the bootstrap schema (fresh bootstrap already
67
+ // creates every config table; this covers the upgrade path).
68
+ await draft.createTable(table.id, table.schema);
69
+ updatedTables.push(table.id);
70
+ patchCount += 1;
71
+ continue;
72
+ }
73
+ const patches = computeAdditiveSchemaPatches(currentSchema, table.schema);
74
+ if (patches.length === 0)
75
+ continue;
76
+ await draft.updateTable(table.id, patches);
77
+ updatedTables.push(table.id);
78
+ patchCount += patches.length;
79
+ }
80
+ return { updatedTables, patches: patchCount };
81
+ }
82
+ //# sourceMappingURL=schema-migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-migration.js","sourceRoot":"","sources":["../../src/control-plane/schema-migration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * seed-default-playbook.ts — install the BUILT-IN DEFAULT playbook during `revo bootstrap` (slice 5,
3
+ * plan 0015).
4
+ *
5
+ * The default is DATA, not engine code: a committed playbook source under
6
+ * `control-plane/default-playbook/` (manifest + roles/pipelines catalogs carrying data-driven
7
+ * `template_json`). `revo bootstrap` seeds the control-plane SCHEMA (bootstrap.config.json), then this
8
+ * installs the default playbook so a FRESH control-plane has a working `feature-development` +
9
+ * `local-change` pipeline out-of-the-box — without depending on the external agent-playbook repo.
10
+ *
11
+ * Idempotent: skips when the default playbook is already installed (so re-running bootstrap is a
12
+ * no-op), and tolerates a benign concurrent/duplicate commit ("revision is not a draft").
13
+ */
14
+ import { join } from 'node:path';
15
+ import { existsSync } from 'node:fs';
16
+ import { repoRoot } from '../config.js';
17
+ import { PlaybookInstaller } from '../playbook/playbook-installer.js';
18
+ import { resolvePlaybookSource } from '../playbook/source-resolver.js';
19
+ import { createVersionedMeaningAccess } from './versioned-meaning.js';
20
+ /** Installed row id of the built-in default playbook (distinct from the e2e fixture playbook). */
21
+ export const DEFAULT_PLAYBOOK_ID = 'revisium-default';
22
+ /**
23
+ * Source directory of the committed default playbook. Packaged at the repo/package root (see the
24
+ * package `files` allowlist) so the SHIPPED `revo bootstrap` (running from dist/) resolves it.
25
+ */
26
+ export const DEFAULT_PLAYBOOK_SOURCE = join(repoRoot, 'control-plane', 'default-playbook');
27
+ /**
28
+ * Compare two `x.y.z` semver strings numerically: returns >0 when `a` is newer, <0 when older, 0 when
29
+ * equal. Missing/non-numeric components read as 0 (so `0.1` == `0.1.0`). We hand-roll this rather than
30
+ * pull in a `semver` dependency: the default playbook only ever carries simple dotted release versions,
31
+ * and an unparsable component degrades to "older" via the missing-version path in the caller.
32
+ */
33
+ function compareSemver(a, b) {
34
+ const parse = (v) => v.split('.').map((part) => Number.parseInt(part, 10) || 0);
35
+ const left = parse(a);
36
+ const right = parse(b);
37
+ const length = Math.max(left.length, right.length);
38
+ for (let i = 0; i < length; i += 1) {
39
+ const diff = (left[i] ?? 0) - (right[i] ?? 0);
40
+ if (diff !== 0)
41
+ return diff;
42
+ }
43
+ return 0;
44
+ }
45
+ /**
46
+ * True for a benign "already committed / nothing to do" race during a concurrent bootstrap. Matched
47
+ * narrowly against the explicit duplicate-commit signals (Revisium draft commit + control-plane
48
+ * ROW_CONFLICT) — a generic `already` substring would misclassify unrelated installer failures as a
49
+ * race and silently swallow them.
50
+ */
51
+ function isBenignInstallRace(err) {
52
+ const message = err instanceof Error ? err.message : String(err);
53
+ return /revision is not a draft|nothing to commit|ROW_CONFLICT/i.test(message);
54
+ }
55
+ /**
56
+ * Install the built-in default playbook if it is not already present, OR re-install (overwrite) it when
57
+ * the BUNDLED version is newer than the installed row's version. Returns a status discriminant so the
58
+ * caller can log appropriately; never throws on a benign duplicate-install race.
59
+ *
60
+ * Version-aware re-seed (slice 144): a warm profile that merely already HAS the default playbook used to
61
+ * skip unconditionally, so `npm i -g` a newer bundle + `revo restart` kept the OLD playbook. Now we read
62
+ * the bundled version from the source package.json (the same value `resolvePlaybookSource` records on the
63
+ * installed row) and compare it to the installed row's recorded version:
64
+ * - bundle NEWER → re-seed (the installer upserts by row id, so the install path is the overwrite).
65
+ * - equal/older → skip (idempotent; never downgrade).
66
+ * - installed row has NO version (pre-versioning install) → treat as older → re-seed once.
67
+ * `install()` is the same upsert+commit path used for a fresh install, so re-seed stays idempotent.
68
+ */
69
+ export async function seedDefaultPlaybook(installer, source = DEFAULT_PLAYBOOK_SOURCE, log = () => { }) {
70
+ if (!existsSync(source)) {
71
+ throw new Error(`default playbook source not found: ${source}`);
72
+ }
73
+ // `listPlaybooks` is the accurate presence signal: bootstrap seeds role/profile rows but NOT a
74
+ // playbook record, so this is empty until the default playbook is installed.
75
+ const installed = await installer.listPlaybooks();
76
+ const existing = installed.find((p) => p.id === DEFAULT_PLAYBOOK_ID);
77
+ if (existing) {
78
+ // The bundled version lives in the source package.json — resolve it the same way the installer does
79
+ // so the comparison is against the exact value that lands on the row.
80
+ // RELEASE DISCIPLINE: this re-seed only fires when the bundled version is NEWER, so any change to the
81
+ // playbook CONTENT (catalog/pipelines.json, catalog/roles.json, prompts/) MUST bump
82
+ // control-plane/default-playbook/package.json — otherwise an upgraded bundle with new content keeps the
83
+ // SAME version and silently skips re-seeding (this is exactly the D3 dogfood gap; see slice 144).
84
+ const bundledVersion = resolvePlaybookSource(source).version;
85
+ const installedVersion = existing.version ?? '';
86
+ // A pre-versioning row (no recorded version) reads as "0.0.0" → strictly older → re-seed once so the
87
+ // one-time upgrade lands; thereafter the versions match and we skip.
88
+ const comparison = compareSemver(bundledVersion, installedVersion || '0.0.0');
89
+ if (comparison <= 0) {
90
+ log(`Default playbook ${DEFAULT_PLAYBOOK_ID} up to date ` +
91
+ `(installed ${installedVersion || '(none)'} >= bundled ${bundledVersion}) — skipping seed.`);
92
+ return { status: 'already-installed' };
93
+ }
94
+ log(`Default playbook ${DEFAULT_PLAYBOOK_ID} bundle is newer ` +
95
+ `(installed ${installedVersion || '(none)'} -> bundled ${bundledVersion}) — re-seeding.`);
96
+ }
97
+ try {
98
+ const result = await installer.install({ source, name: DEFAULT_PLAYBOOK_ID, commit: true });
99
+ return { status: 'installed', result };
100
+ }
101
+ catch (err) {
102
+ if (isBenignInstallRace(err))
103
+ return { status: 'raced' };
104
+ throw err;
105
+ }
106
+ }
107
+ /**
108
+ * Default-daemon installer adapter used by `revo bootstrap`: a minimal {@link DefaultPlaybookInstaller}
109
+ * backed by the live draft scope (the same versioned-meaning access the `revo playbook install` CLI
110
+ * uses). Reads the installed playbooks list from HEAD via the provided reader.
111
+ */
112
+ export function createDaemonInstaller(listPlaybooks) {
113
+ return {
114
+ listPlaybooks,
115
+ install: (options) => new PlaybookInstaller({ access: createVersionedMeaningAccess({}) }).install(options),
116
+ };
117
+ }
118
+ /**
119
+ * Run {@link seedDefaultPlaybook} as a BEST-EFFORT step: report the outcome but never throw. The
120
+ * schema is the critical bootstrap artifact; a playbook-seed failure must not fail stack bring-up
121
+ * (it is logged so the operator can re-run the install). `runSeed`/`log` are injected so the logging
122
+ * policy is unit-testable without a live daemon.
123
+ */
124
+ export async function seedDefaultPlaybookBestEffort(runSeed, log = (message) => console.error(message)) {
125
+ try {
126
+ const outcome = await runSeed();
127
+ if (outcome.status === 'installed') {
128
+ const { result } = outcome;
129
+ log(`Seeded default playbook ${result.playbookId} ` +
130
+ `(${result.roles} roles, ${result.pipelines} pipelines).`);
131
+ }
132
+ else if (outcome.status === 'already-installed') {
133
+ log('Default playbook already installed — skipping seed.');
134
+ }
135
+ }
136
+ catch (err) {
137
+ log(`Default playbook seed failed (schema bootstrap still applied): ${String(err)}. ` +
138
+ 'Re-run `revo start` to retry the default-playbook seed.');
139
+ }
140
+ }
141
+ //# sourceMappingURL=seed-default-playbook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed-default-playbook.js","sourceRoot":"","sources":["../../src/control-plane/seed-default-playbook.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,14 @@
1
- import { randomUUID } from 'node:crypto';
2
- import { ControlPlaneError } from './errors.js';
3
- // ─── internal helpers ────────────────────────────────────────
4
- const CLAIM_CAP = 500;
5
- // Per-step attempt fetch limit during crash recovery; N+1 at startup is acceptable at this scale.
6
- const RECOVERY_ATTEMPT_CAP = 100;
1
+ /**
2
+ * Step types + deterministic id / format helpers for the control plane.
3
+ *
4
+ * NOTE: the legacy step-lifecycle verbs (`claimNextStep`/`startAttempt`/`writeResult`/`failStep`/
5
+ * `recoverInFlight`/`createSteps`) were the pre-pivot dumb-loop step queue. They are superseded by the
6
+ * DBOS-driven data-driven engine and were removed (audit §2.1). What remains here is the `Step` shape the
7
+ * runner machinery still consumes (synthesized in-memory by the engine — `RunService.loadPipelineContext` —
8
+ * not read from a `steps` row) plus a few pure id / format helpers reused across the run / inbox / pipeline
9
+ * layers.
10
+ */
11
+ // ─── id / format helpers ─────────────────────────────────────
7
12
  export function compactStamp(date) {
8
13
  const pad = (v, l = 2) => String(v).padStart(l, '0');
9
14
  return [
@@ -18,17 +23,10 @@ export function compactStamp(date) {
18
23
  'Z',
19
24
  ].join('');
20
25
  }
21
- function clockNow(opts) {
22
- return opts?.now ?? new Date();
23
- }
24
- function clockSuffix(opts) {
25
- return opts?.idSuffix ?? randomUUID().replaceAll('-', '').slice(0, 8);
26
- }
27
- // Non-cryptographic FNV-1a 64-bit hash → 16 hex chars. Used to derive a child step id that is
28
- // DETERMINISTIC (same parent + index → same id, so a crash-retry is idempotent) yet BOUNDED in
29
- // length. Revisium rowIds max out at 64 chars; concatenating the parent id per level
30
- // (`${parent}_ch_${i}`) overflowed on deep chains. Not crypto, so it does not trip the
31
- // weak-hash security hotspot.
26
+ // Non-cryptographic FNV-1a 64-bit hash → 16 hex chars. Used to derive DETERMINISTIC, BOUNDED row ids
27
+ // (same input same id, so a crash-retry is idempotent) that fit Revisium's 64-char rowId limit:
28
+ // `inbox_`/`event_`/`cost_`/`attempt_`/`out_`/`step_` + 16 hex stays well under the cap. Not crypto, so
29
+ // it does not trip the weak-hash security hotspot.
32
30
  export function fnv1a64Hex(input) {
33
31
  let hash = 0xcbf29ce484222325n;
34
32
  const prime = 0x100000001b3n;
@@ -46,336 +44,4 @@ export function toStr(v) {
46
44
  return String(v);
47
45
  return '';
48
46
  }
49
- function mapStep(row) {
50
- const d = row.data;
51
- return {
52
- id: row.rowId,
53
- taskId: toStr(d.task_id),
54
- runId: toStr(d.run_id),
55
- role: toStr(d.role),
56
- kind: toStr(d.kind),
57
- status: toStr(d.status),
58
- input: d.input ?? null,
59
- output: d.output ?? null,
60
- modelProfile: toStr(d.model_profile),
61
- runAfter: toStr(d.run_after),
62
- attemptCount: Number(d.attempt_count ?? 0),
63
- maxAttempts: Number(d.max_attempts ?? 3),
64
- priority: Number(d.priority ?? 0),
65
- leaseOwner: toStr(d.lease_owner),
66
- leaseExpiresAt: toStr(d.lease_expires_at),
67
- deadReason: toStr(d.dead_reason),
68
- };
69
- }
70
- function compareByPriorityThenAge(a, b) {
71
- const pa = Number(a.data.priority ?? 0);
72
- const pb = Number(b.data.priority ?? 0);
73
- if (pb !== pa)
74
- return pb - pa;
75
- const ca = toStr(a.data.created_at);
76
- const cb = toStr(b.data.created_at);
77
- if (ca < cb)
78
- return -1;
79
- if (ca > cb)
80
- return 1;
81
- return 0;
82
- }
83
- function backoffRunAfter(t, attemptCount) {
84
- const delayMs = 30_000 * Math.pow(2, attemptCount);
85
- return new Date(t.getTime() + delayMs).toISOString();
86
- }
87
- // ─── exported verbs ──────────────────────────────────────────
88
- // MVP: single-worker read-then-write is acceptable; atomic claim belongs only here later.
89
- export async function claimNextStep(da, workerId, roles, opts) {
90
- const t = clockNow(opts);
91
- const nowIso = t.toISOString();
92
- const leaseTtlMs = opts?.leaseTtlMs ?? 30_000;
93
- const leaseExpiresAt = new Date(t.getTime() + leaseTtlMs).toISOString();
94
- // Server-side: filter status=ready AND role∈roles, sort by priority desc then createdAt asc.
95
- // WORKAROUND: JsonFilterDto.equals is typed as { [key: string]: unknown } but accepts scalar
96
- // strings at runtime; the @revisium/client JSON-path scalar-equality type gap requires the cast.
97
- // run_after <= now CANNOT be pushed server-side: JsonFilterDto.lte is typed as number only and
98
- // has no string/date counterpart. The in-process filter below is the authoritative gate, bounded
99
- // by CLAIM_CAP so future-scheduled steps cannot exhaust the cap if they accumulate.
100
- // In-process: re-apply all predicates for correctness against fake/unconstrained transports.
101
- const rows = await da.listRows('steps', {
102
- first: CLAIM_CAP,
103
- where: {
104
- AND: [
105
- { data: { path: 'status', equals: 'ready' } },
106
- { OR: roles.map((r) => ({ data: { path: 'role', equals: r } })) },
107
- ],
108
- },
109
- orderBy: [
110
- { field: 'data', direction: 'desc', path: 'priority', type: 'int' },
111
- { field: 'createdAt', direction: 'asc' },
112
- ],
113
- });
114
- const candidateRow = rows
115
- .filter((row) => {
116
- const d = row.data;
117
- return (toStr(d.status) === 'ready' &&
118
- roles.includes(toStr(d.role)) &&
119
- (toStr(d.run_after) === '' || toStr(d.run_after) <= nowIso));
120
- })
121
- .sort(compareByPriorityThenAge)
122
- .at(0);
123
- if (!candidateRow)
124
- return null;
125
- const candidate = mapStep(candidateRow);
126
- await da.patchRow('steps', candidate.id, [
127
- { op: 'replace', path: 'status', value: 'claimed' },
128
- { op: 'replace', path: 'lease_owner', value: workerId },
129
- { op: 'replace', path: 'lease_expires_at', value: leaseExpiresAt },
130
- { op: 'replace', path: 'updated_at', value: nowIso },
131
- ]);
132
- return { ...candidate, status: 'claimed', leaseOwner: workerId, leaseExpiresAt };
133
- }
134
- export async function startAttempt(da, step, opts) {
135
- const t = clockNow(opts);
136
- const nowIso = t.toISOString();
137
- const sfx = clockSuffix(opts);
138
- const st = compactStamp(t);
139
- const attemptId = `attempt_${st}_${sfx}`;
140
- const idempotencyKey = `idem_${st}_${sfx}`;
141
- // Attempt row is written before step status flips to 'running'.
142
- await da.createRow('attempts', attemptId, {
143
- id: attemptId,
144
- step_id: step.id,
145
- run_id: step.runId,
146
- worker_id: opts.workerId,
147
- attempt_no: step.attemptCount + 1,
148
- status: 'running',
149
- idempotency_key: idempotencyKey,
150
- model_profile: opts.modelProfile ?? step.modelProfile,
151
- input_tokens: 0,
152
- output_tokens: 0,
153
- lesson: '',
154
- error: '',
155
- started_at: nowIso,
156
- finished_at: '',
157
- });
158
- // Increment attempt_count here so crash recovery (recoverInFlight) sees the correct value
159
- // even when failStep is never called. failStep reads the same derived value so no double-count.
160
- await da.patchRow('steps', step.id, [
161
- { op: 'replace', path: 'status', value: 'running' },
162
- { op: 'replace', path: 'attempt_count', value: step.attemptCount + 1 },
163
- { op: 'replace', path: 'updated_at', value: nowIso },
164
- ]);
165
- return { attemptId, idempotencyKey };
166
- }
167
- export async function writeResult(da, step, attemptId, output, costs, opts) {
168
- const t = clockNow(opts);
169
- const nowIso = t.toISOString();
170
- const sfx = clockSuffix(opts);
171
- const st = compactStamp(t);
172
- // 1. Close attempt
173
- await da.patchRow('attempts', attemptId, [
174
- { op: 'replace', path: 'status', value: 'succeeded' },
175
- { op: 'replace', path: 'finished_at', value: nowIso },
176
- ]);
177
- // 2. Append event
178
- await da.createRow('events', `event_${st}_step-succeeded_${sfx}`, {
179
- id: `event_${st}_step-succeeded_${sfx}`,
180
- run_id: step.runId,
181
- task_id: step.taskId,
182
- step_id: step.id,
183
- type: 'step_succeeded',
184
- payload: { attempt_id: attemptId },
185
- actor: 'orchestrator',
186
- created_at: nowIso,
187
- });
188
- // 3. Append cost rows
189
- for (let i = 0; i < costs.length; i++) {
190
- const cost = costs[i];
191
- if (!cost)
192
- continue;
193
- await da.createRow('cost_ledger', `cost_${st}_${sfx}_${i}`, {
194
- id: `cost_${st}_${sfx}_${i}`,
195
- run_id: step.runId,
196
- step_id: step.id,
197
- attempt_id: attemptId,
198
- model_profile: cost.modelProfile,
199
- input_tokens: cost.inputTokens,
200
- output_tokens: cost.outputTokens,
201
- cost_amount: cost.costAmount,
202
- currency: cost.currency ?? 'USD',
203
- recorded_at: nowIso,
204
- });
205
- }
206
- // 4. Last: flip step status to succeeded, clear lease so terminal state is not misleading
207
- await da.patchRow('steps', step.id, [
208
- { op: 'replace', path: 'status', value: 'succeeded' },
209
- { op: 'replace', path: 'output', value: output },
210
- { op: 'replace', path: 'lease_owner', value: '' },
211
- { op: 'replace', path: 'lease_expires_at', value: '' },
212
- { op: 'replace', path: 'updated_at', value: nowIso },
213
- ]);
214
- }
215
- export async function createSteps(da, steps, opts) {
216
- const t = clockNow(opts);
217
- const nowIso = t.toISOString();
218
- const sfx = clockSuffix(opts);
219
- const st = compactStamp(t);
220
- for (let i = 0; i < steps.length; i++) {
221
- const ns = steps[i];
222
- if (!ns)
223
- continue;
224
- // When parentStepId is supplied, derive a deterministic, BOUNDED-length ID from a hash of
225
- // (parent id + index) so that a crash-and-retry (new attemptId, same parent) regenerates the
226
- // exact same child IDs (idempotent: ROW_CONFLICT from createRow means it already exists → skip)
227
- // WITHOUT growing the id per chain level. Concatenating the full parent id per level
228
- // (`${parent}_ch_${i}`) overflowed Revisium's 64-char rowId limit on deep chains. The id
229
- // depends ONLY on (parent id, index) — NOT on role — so the retry contract holds even if a
230
- // re-run yields a different role for the same logical next step, and the length is fixed
231
- // ("step_" + 16 hex = 21 chars) regardless of role. The 64-bit hash keeps it collision-resistant.
232
- const childKey = `${opts?.parentStepId ?? ''}:${i}`;
233
- const stepId = opts?.parentStepId
234
- ? `step_${fnv1a64Hex(childKey)}`
235
- : `step_${st}_${ns.role}_${sfx}_${i}`;
236
- // Steps with unresolved dependencies start 'pending'; promoting them to 'ready' once their
237
- // depends_on complete is the dependency resolver's job, deferred to a later plan (not Plan 0006).
238
- const hasDeps = ns.dependsOn !== undefined && ns.dependsOn.length > 0;
239
- try {
240
- await da.createRow('steps', stepId, {
241
- id: stepId,
242
- task_id: ns.taskId,
243
- run_id: ns.runId,
244
- role: ns.role,
245
- kind: ns.kind,
246
- status: hasDeps ? 'pending' : 'ready',
247
- input: ns.input,
248
- output: null,
249
- model_profile: ns.modelProfile,
250
- run_after: ns.runAfter ?? '',
251
- attempt_count: 0,
252
- max_attempts: ns.maxAttempts ?? 3,
253
- priority: ns.priority ?? 0,
254
- depends_on: ns.dependsOn ?? [],
255
- lease_owner: '',
256
- lease_expires_at: '',
257
- dead_reason: '',
258
- created_at: nowIso,
259
- updated_at: nowIso,
260
- });
261
- }
262
- catch (e) {
263
- if (e instanceof ControlPlaneError && e.code === 'ROW_CONFLICT' && opts?.parentStepId)
264
- continue;
265
- throw e;
266
- }
267
- }
268
- }
269
- export async function failStep(da, step, attemptId, opts) {
270
- const t = clockNow(opts);
271
- const nowIso = t.toISOString();
272
- const sfx = clockSuffix(opts);
273
- const st = compactStamp(t);
274
- // 1. Close attempt
275
- await da.patchRow('attempts', attemptId, [
276
- { op: 'replace', path: 'status', value: 'failed' },
277
- { op: 'replace', path: 'lesson', value: opts.lesson ?? '' },
278
- { op: 'replace', path: 'error', value: opts.error ?? '' },
279
- { op: 'replace', path: 'finished_at', value: nowIso },
280
- ]);
281
- // 2. Append event
282
- await da.createRow('events', `event_${st}_step-failed_${sfx}`, {
283
- id: `event_${st}_step-failed_${sfx}`,
284
- run_id: step.runId,
285
- task_id: step.taskId,
286
- step_id: step.id,
287
- type: 'step_failed',
288
- payload: { attempt_id: attemptId, lesson: opts.lesson, error: opts.error },
289
- actor: 'orchestrator',
290
- created_at: nowIso,
291
- });
292
- // 3. Gate on the PERSISTED attempt_count, never the caller's snapshot. startAttempt owns the
293
- // increment and already wrote it, so re-deriving here (snapshot + 1) would double-count a step
294
- // that the worker refetched between startAttempt and failStep, killing it one attempt early.
295
- // failStep therefore reads the current row and does not write attempt_count itself.
296
- const current = await da.getRow('steps', step.id);
297
- const attemptCount = Number(current?.data.attempt_count ?? step.attemptCount);
298
- const maxAttempts = Number(current?.data.max_attempts ?? step.maxAttempts);
299
- if (attemptCount < maxAttempts) {
300
- // 4. Attempts remain: backoff to ready, clear lease (attempt_count left as startAttempt set it)
301
- await da.patchRow('steps', step.id, [
302
- { op: 'replace', path: 'status', value: 'ready' },
303
- { op: 'replace', path: 'run_after', value: backoffRunAfter(t, attemptCount) },
304
- { op: 'replace', path: 'lease_owner', value: '' },
305
- { op: 'replace', path: 'lease_expires_at', value: '' },
306
- { op: 'replace', path: 'updated_at', value: nowIso },
307
- ]);
308
- }
309
- else {
310
- // 5. Cap reached: dead, clear lease
311
- const deadReason = opts.lesson ?? opts.error ?? `exhausted ${maxAttempts} attempt(s)`;
312
- await da.patchRow('steps', step.id, [
313
- { op: 'replace', path: 'status', value: 'dead' },
314
- { op: 'replace', path: 'dead_reason', value: deadReason },
315
- { op: 'replace', path: 'lease_owner', value: '' },
316
- { op: 'replace', path: 'lease_expires_at', value: '' },
317
- { op: 'replace', path: 'updated_at', value: nowIso },
318
- ]);
319
- }
320
- }
321
- export async function recoverInFlight(da, workerId, opts) {
322
- const t = clockNow(opts);
323
- const nowIso = t.toISOString();
324
- const sfx = clockSuffix(opts);
325
- const st = compactStamp(t);
326
- // Server-side: filter by lease_owner + status to avoid a full-table scan.
327
- // MVP single-worker startup: first-page result (CLAIM_CAP rows) is acceptable; a multi-worker
328
- // deployment would need pagination here, but that belongs to a later plan.
329
- const allSteps = await da.listRows('steps', {
330
- first: CLAIM_CAP,
331
- where: {
332
- AND: [
333
- { data: { path: 'lease_owner', equals: workerId } },
334
- {
335
- OR: [
336
- { data: { path: 'status', equals: 'claimed' } },
337
- { data: { path: 'status', equals: 'running' } },
338
- ],
339
- },
340
- ],
341
- },
342
- });
343
- // In-process filter provides correctness against fake/unconstrained transports.
344
- const orphans = allSteps
345
- .map(mapStep)
346
- .filter((s) => s.leaseOwner === workerId && (s.status === 'claimed' || s.status === 'running'));
347
- for (let i = 0; i < orphans.length; i++) {
348
- const orphan = orphans[i];
349
- if (!orphan)
350
- continue;
351
- if (orphan.status === 'running') {
352
- const allAttempts = await da.listRows('attempts', { first: RECOVERY_ATTEMPT_CAP });
353
- const runningAttempts = allAttempts.filter((a) => String(a.data.step_id) === orphan.id && String(a.data.status) === 'running');
354
- for (const attempt of runningAttempts) {
355
- await da.patchRow('attempts', attempt.rowId, [
356
- { op: 'replace', path: 'status', value: 'failed' },
357
- { op: 'replace', path: 'lesson', value: 'worker crashed mid-step' },
358
- { op: 'replace', path: 'finished_at', value: nowIso },
359
- ]);
360
- }
361
- }
362
- await da.createRow('events', `event_${st}_step-recovered_${sfx}_${i}`, {
363
- id: `event_${st}_step-recovered_${sfx}_${i}`,
364
- run_id: orphan.runId,
365
- task_id: orphan.taskId,
366
- step_id: orphan.id,
367
- type: 'step_recovered',
368
- payload: { worker_id: workerId },
369
- actor: 'orchestrator',
370
- created_at: nowIso,
371
- });
372
- await da.patchRow('steps', orphan.id, [
373
- { op: 'replace', path: 'status', value: 'ready' },
374
- { op: 'replace', path: 'lease_owner', value: '' },
375
- { op: 'replace', path: 'lease_expires_at', value: '' },
376
- { op: 'replace', path: 'updated_at', value: nowIso },
377
- ]);
378
- }
379
- return orphans;
380
- }
381
47
  //# sourceMappingURL=steps.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"steps.js","sourceRoot":"","sources":["../../src/control-plane/steps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"steps.js","sourceRoot":"","sources":["../../src/control-plane/steps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA4CH,gEAAgE;AAEhE,MAAM,UAAU,YAAY,CAAC,IAAU;IACrC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7D,OAAO;QACL,IAAI,CAAC,cAAc,EAAE;QACrB,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACtB,GAAG;QACH,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACvB,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QACzB,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QACzB,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QACjC,GAAG;KACJ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACb,CAAC;AAED,qGAAqG;AACrG,kGAAkG;AAClG,wGAAwG;AACxG,mDAAmD;AACnD,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,IAAI,IAAI,GAAG,mBAAmB,CAAC;IAC/B,MAAM,KAAK,GAAG,cAAc,CAAC;IAC7B,MAAM,IAAI,GAAG,mBAAmB,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1C,IAAI,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC;IAC/B,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,CAAU;IAC9B,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5C,OAAO,EAAE,CAAC;AACZ,CAAC"}