@pellux/goodvibes-sdk 0.37.2 → 1.0.0

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 (555) hide show
  1. package/dist/contracts/artifacts/operator-contract.json +3171 -929
  2. package/dist/daemon.d.ts +2 -0
  3. package/dist/daemon.d.ts.map +1 -1
  4. package/dist/daemon.js +4 -0
  5. package/dist/events/communication.d.ts +21 -1
  6. package/dist/events/communication.d.ts.map +1 -1
  7. package/dist/events/surfaces.d.ts +25 -3
  8. package/dist/events/surfaces.d.ts.map +1 -1
  9. package/dist/events/surfaces.js +22 -1
  10. package/dist/events/workflows.d.ts +7 -6
  11. package/dist/events/workflows.d.ts.map +1 -1
  12. package/dist/index.d.ts +1 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/platform/agents/archetypes.d.ts.map +1 -1
  15. package/dist/platform/agents/archetypes.js +7 -0
  16. package/dist/platform/agents/index.d.ts +1 -0
  17. package/dist/platform/agents/index.d.ts.map +1 -1
  18. package/dist/platform/agents/index.js +1 -0
  19. package/dist/platform/agents/message-bus-core.d.ts +7 -0
  20. package/dist/platform/agents/message-bus-core.d.ts.map +1 -1
  21. package/dist/platform/agents/message-bus-core.js +2 -1
  22. package/dist/platform/agents/orchestrator-runner.d.ts +50 -1
  23. package/dist/platform/agents/orchestrator-runner.d.ts.map +1 -1
  24. package/dist/platform/agents/orchestrator-runner.js +172 -7
  25. package/dist/platform/agents/orchestrator.d.ts +78 -6
  26. package/dist/platform/agents/orchestrator.d.ts.map +1 -1
  27. package/dist/platform/agents/orchestrator.js +95 -18
  28. package/dist/platform/agents/planner-decomposition-runner.d.ts +38 -0
  29. package/dist/platform/agents/planner-decomposition-runner.d.ts.map +1 -0
  30. package/dist/platform/agents/planner-decomposition-runner.js +113 -0
  31. package/dist/platform/agents/turn-knowledge-injection.d.ts +192 -0
  32. package/dist/platform/agents/turn-knowledge-injection.d.ts.map +1 -0
  33. package/dist/platform/agents/turn-knowledge-injection.js +269 -0
  34. package/dist/platform/agents/worktree.d.ts +126 -8
  35. package/dist/platform/agents/worktree.d.ts.map +1 -1
  36. package/dist/platform/agents/worktree.js +240 -19
  37. package/dist/platform/agents/wrfc-controller.d.ts +46 -0
  38. package/dist/platform/agents/wrfc-controller.d.ts.map +1 -1
  39. package/dist/platform/agents/wrfc-controller.js +213 -32
  40. package/dist/platform/agents/wrfc-gate-runtime.d.ts +9 -0
  41. package/dist/platform/agents/wrfc-gate-runtime.d.ts.map +1 -1
  42. package/dist/platform/agents/wrfc-gate-runtime.js +7 -3
  43. package/dist/platform/agents/wrfc-gates.d.ts +1 -1
  44. package/dist/platform/agents/wrfc-gates.d.ts.map +1 -1
  45. package/dist/platform/agents/wrfc-gates.js +7 -1
  46. package/dist/platform/agents/wrfc-types.d.ts +23 -3
  47. package/dist/platform/agents/wrfc-types.d.ts.map +1 -1
  48. package/dist/platform/automation/types.d.ts +9 -1
  49. package/dist/platform/automation/types.d.ts.map +1 -1
  50. package/dist/platform/calendar/calendar-api-shared.d.ts +25 -0
  51. package/dist/platform/calendar/calendar-api-shared.d.ts.map +1 -0
  52. package/dist/platform/calendar/calendar-api-shared.js +100 -0
  53. package/dist/platform/calendar/calendar-connector.d.ts +79 -0
  54. package/dist/platform/calendar/calendar-connector.d.ts.map +1 -0
  55. package/dist/platform/calendar/calendar-connector.js +155 -0
  56. package/dist/platform/calendar/google-calendar-api.d.ts +25 -0
  57. package/dist/platform/calendar/google-calendar-api.d.ts.map +1 -0
  58. package/dist/platform/calendar/google-calendar-api.js +89 -0
  59. package/dist/platform/calendar/http-fetch-adapter.d.ts +25 -0
  60. package/dist/platform/calendar/http-fetch-adapter.d.ts.map +1 -0
  61. package/dist/platform/calendar/http-fetch-adapter.js +25 -0
  62. package/dist/platform/calendar/ics-parser.d.ts +35 -0
  63. package/dist/platform/calendar/ics-parser.d.ts.map +1 -0
  64. package/dist/platform/calendar/ics-parser.js +236 -0
  65. package/dist/platform/calendar/index.d.ts +41 -0
  66. package/dist/platform/calendar/index.d.ts.map +1 -0
  67. package/dist/platform/calendar/index.js +49 -0
  68. package/dist/platform/calendar/merged-calendar-model.d.ts +67 -0
  69. package/dist/platform/calendar/merged-calendar-model.d.ts.map +1 -0
  70. package/dist/platform/calendar/merged-calendar-model.js +181 -0
  71. package/dist/platform/calendar/microsoft-graph-api.d.ts +25 -0
  72. package/dist/platform/calendar/microsoft-graph-api.d.ts.map +1 -0
  73. package/dist/platform/calendar/microsoft-graph-api.js +95 -0
  74. package/dist/platform/calendar/oauth-flow.d.ts +62 -0
  75. package/dist/platform/calendar/oauth-flow.d.ts.map +1 -0
  76. package/dist/platform/calendar/oauth-flow.js +305 -0
  77. package/dist/platform/calendar/oauth-providers.d.ts +43 -0
  78. package/dist/platform/calendar/oauth-providers.d.ts.map +1 -0
  79. package/dist/platform/calendar/oauth-providers.js +120 -0
  80. package/dist/platform/calendar/oauth-token-store.d.ts +72 -0
  81. package/dist/platform/calendar/oauth-token-store.d.ts.map +1 -0
  82. package/dist/platform/calendar/oauth-token-store.js +189 -0
  83. package/dist/platform/calendar/oauth-types.d.ts +274 -0
  84. package/dist/platform/calendar/oauth-types.d.ts.map +1 -0
  85. package/dist/platform/calendar/oauth-types.js +22 -0
  86. package/dist/platform/calendar/rrule.d.ts +39 -0
  87. package/dist/platform/calendar/rrule.d.ts.map +1 -0
  88. package/dist/platform/calendar/rrule.js +261 -0
  89. package/dist/platform/calendar/subscription-store.d.ts +118 -0
  90. package/dist/platform/calendar/subscription-store.d.ts.map +1 -0
  91. package/dist/platform/calendar/subscription-store.js +293 -0
  92. package/dist/platform/calendar/types.d.ts +170 -0
  93. package/dist/platform/calendar/types.d.ts.map +1 -0
  94. package/dist/platform/calendar/types.js +21 -0
  95. package/dist/platform/companion/companion-chat-attachments.d.ts +29 -0
  96. package/dist/platform/companion/companion-chat-attachments.d.ts.map +1 -0
  97. package/dist/platform/companion/companion-chat-attachments.js +121 -0
  98. package/dist/platform/companion/companion-chat-broker-bridge.d.ts +40 -0
  99. package/dist/platform/companion/companion-chat-broker-bridge.d.ts.map +1 -0
  100. package/dist/platform/companion/companion-chat-broker-bridge.js +14 -0
  101. package/dist/platform/companion/companion-chat-broker-sync.d.ts +38 -0
  102. package/dist/platform/companion/companion-chat-broker-sync.d.ts.map +1 -0
  103. package/dist/platform/companion/companion-chat-broker-sync.js +80 -0
  104. package/dist/platform/companion/companion-chat-gc.d.ts +63 -0
  105. package/dist/platform/companion/companion-chat-gc.d.ts.map +1 -0
  106. package/dist/platform/companion/companion-chat-gc.js +38 -0
  107. package/dist/platform/companion/companion-chat-manager.d.ts +67 -20
  108. package/dist/platform/companion/companion-chat-manager.d.ts.map +1 -1
  109. package/dist/platform/companion/companion-chat-manager.js +130 -144
  110. package/dist/platform/companion/companion-chat-persistence.d.ts +9 -1
  111. package/dist/platform/companion/companion-chat-persistence.d.ts.map +1 -1
  112. package/dist/platform/companion/companion-chat-persistence.js +10 -2
  113. package/dist/platform/companion/companion-chat-routes.d.ts +2 -1
  114. package/dist/platform/companion/companion-chat-routes.d.ts.map +1 -1
  115. package/dist/platform/companion/companion-chat-routes.js +37 -4
  116. package/dist/platform/config/credential-status.d.ts +28 -0
  117. package/dist/platform/config/credential-status.d.ts.map +1 -0
  118. package/dist/platform/config/credential-status.js +75 -0
  119. package/dist/platform/config/index.d.ts +25 -0
  120. package/dist/platform/config/index.d.ts.map +1 -1
  121. package/dist/platform/config/index.js +18 -0
  122. package/dist/platform/config/manager.d.ts +18 -0
  123. package/dist/platform/config/manager.d.ts.map +1 -1
  124. package/dist/platform/config/manager.js +36 -2
  125. package/dist/platform/config/migrations.d.ts +48 -0
  126. package/dist/platform/config/migrations.d.ts.map +1 -0
  127. package/dist/platform/config/migrations.js +54 -0
  128. package/dist/platform/config/schema-domain-core.d.ts +10 -1
  129. package/dist/platform/config/schema-domain-core.d.ts.map +1 -1
  130. package/dist/platform/config/schema-domain-core.js +46 -3
  131. package/dist/platform/config/schema-types.d.ts +13 -7
  132. package/dist/platform/config/schema-types.d.ts.map +1 -1
  133. package/dist/platform/config/schema.d.ts.map +1 -1
  134. package/dist/platform/config/schema.js +2 -0
  135. package/dist/platform/control-plane/approval-broker.d.ts +11 -0
  136. package/dist/platform/control-plane/approval-broker.d.ts.map +1 -1
  137. package/dist/platform/control-plane/approval-broker.js +17 -1
  138. package/dist/platform/control-plane/approval-hunk-apply.d.ts +77 -0
  139. package/dist/platform/control-plane/approval-hunk-apply.d.ts.map +1 -0
  140. package/dist/platform/control-plane/approval-hunk-apply.js +80 -0
  141. package/dist/platform/control-plane/gateway-disabled-response.d.ts +20 -0
  142. package/dist/platform/control-plane/gateway-disabled-response.d.ts.map +1 -0
  143. package/dist/platform/control-plane/gateway-disabled-response.js +24 -0
  144. package/dist/platform/control-plane/gateway-scope-enforcement.d.ts +68 -0
  145. package/dist/platform/control-plane/gateway-scope-enforcement.d.ts.map +1 -0
  146. package/dist/platform/control-plane/gateway-scope-enforcement.js +91 -0
  147. package/dist/platform/control-plane/gateway-utils.d.ts +17 -0
  148. package/dist/platform/control-plane/gateway-utils.d.ts.map +1 -1
  149. package/dist/platform/control-plane/gateway-utils.js +30 -0
  150. package/dist/platform/control-plane/gateway.d.ts +12 -2
  151. package/dist/platform/control-plane/gateway.d.ts.map +1 -1
  152. package/dist/platform/control-plane/gateway.js +27 -31
  153. package/dist/platform/control-plane/index.d.ts +6 -1
  154. package/dist/platform/control-plane/index.d.ts.map +1 -1
  155. package/dist/platform/control-plane/index.js +4 -0
  156. package/dist/platform/control-plane/invoke-input-validation.d.ts +56 -0
  157. package/dist/platform/control-plane/invoke-input-validation.d.ts.map +1 -0
  158. package/dist/platform/control-plane/invoke-input-validation.js +163 -0
  159. package/dist/platform/control-plane/method-catalog-admin.d.ts.map +1 -1
  160. package/dist/platform/control-plane/method-catalog-admin.js +12 -1
  161. package/dist/platform/control-plane/method-catalog-calendar.d.ts +16 -0
  162. package/dist/platform/control-plane/method-catalog-calendar.d.ts.map +1 -1
  163. package/dist/platform/control-plane/method-catalog-calendar.js +21 -0
  164. package/dist/platform/control-plane/method-catalog-channels.d.ts.map +1 -1
  165. package/dist/platform/control-plane/method-catalog-channels.js +32 -3
  166. package/dist/platform/control-plane/method-catalog-control-automation.d.ts.map +1 -1
  167. package/dist/platform/control-plane/method-catalog-control-automation.js +19 -34
  168. package/dist/platform/control-plane/method-catalog-control-companion.d.ts +15 -0
  169. package/dist/platform/control-plane/method-catalog-control-companion.d.ts.map +1 -0
  170. package/dist/platform/control-plane/method-catalog-control-companion.js +133 -0
  171. package/dist/platform/control-plane/method-catalog-control-core.d.ts.map +1 -1
  172. package/dist/platform/control-plane/method-catalog-control-core.js +104 -122
  173. package/dist/platform/control-plane/method-catalog-control.d.ts.map +1 -1
  174. package/dist/platform/control-plane/method-catalog-control.js +4 -0
  175. package/dist/platform/control-plane/method-catalog-email.d.ts +17 -0
  176. package/dist/platform/control-plane/method-catalog-email.d.ts.map +1 -1
  177. package/dist/platform/control-plane/method-catalog-email.js +21 -0
  178. package/dist/platform/control-plane/method-catalog-events.d.ts +28 -0
  179. package/dist/platform/control-plane/method-catalog-events.d.ts.map +1 -1
  180. package/dist/platform/control-plane/method-catalog-events.js +74 -1
  181. package/dist/platform/control-plane/method-catalog-fleet.d.ts +24 -0
  182. package/dist/platform/control-plane/method-catalog-fleet.d.ts.map +1 -0
  183. package/dist/platform/control-plane/method-catalog-fleet.js +65 -0
  184. package/dist/platform/control-plane/method-catalog-route-reconcile.d.ts +84 -0
  185. package/dist/platform/control-plane/method-catalog-route-reconcile.d.ts.map +1 -0
  186. package/dist/platform/control-plane/method-catalog-route-reconcile.js +103 -0
  187. package/dist/platform/control-plane/method-catalog-shared.d.ts +29 -0
  188. package/dist/platform/control-plane/method-catalog-shared.d.ts.map +1 -1
  189. package/dist/platform/control-plane/method-catalog.d.ts +9 -0
  190. package/dist/platform/control-plane/method-catalog.d.ts.map +1 -1
  191. package/dist/platform/control-plane/method-catalog.js +32 -3
  192. package/dist/platform/control-plane/operator-contract-schemas-admin.d.ts +8 -0
  193. package/dist/platform/control-plane/operator-contract-schemas-admin.d.ts.map +1 -1
  194. package/dist/platform/control-plane/operator-contract-schemas-admin.js +22 -1
  195. package/dist/platform/control-plane/operator-contract-schemas-fleet.d.ts +18 -0
  196. package/dist/platform/control-plane/operator-contract-schemas-fleet.d.ts.map +1 -0
  197. package/dist/platform/control-plane/operator-contract-schemas-fleet.js +182 -0
  198. package/dist/platform/control-plane/operator-contract-schemas-permissions.d.ts.map +1 -1
  199. package/dist/platform/control-plane/operator-contract-schemas-permissions.js +5 -0
  200. package/dist/platform/control-plane/operator-contract-schemas-runtime.d.ts +29 -0
  201. package/dist/platform/control-plane/operator-contract-schemas-runtime.d.ts.map +1 -1
  202. package/dist/platform/control-plane/operator-contract-schemas-runtime.js +57 -3
  203. package/dist/platform/control-plane/operator-contract-schemas.d.ts +1 -0
  204. package/dist/platform/control-plane/operator-contract-schemas.d.ts.map +1 -1
  205. package/dist/platform/control-plane/operator-contract-schemas.js +1 -0
  206. package/dist/platform/control-plane/operator-contract.d.ts.map +1 -1
  207. package/dist/platform/control-plane/operator-contract.js +8 -0
  208. package/dist/platform/control-plane/routes/checkpoints.d.ts +39 -0
  209. package/dist/platform/control-plane/routes/checkpoints.d.ts.map +1 -0
  210. package/dist/platform/control-plane/routes/checkpoints.js +166 -0
  211. package/dist/platform/control-plane/routes/fleet.d.ts +53 -0
  212. package/dist/platform/control-plane/routes/fleet.d.ts.map +1 -0
  213. package/dist/platform/control-plane/routes/fleet.js +153 -0
  214. package/dist/platform/control-plane/routes/gateway-verb-error.d.ts +30 -0
  215. package/dist/platform/control-plane/routes/gateway-verb-error.d.ts.map +1 -0
  216. package/dist/platform/control-plane/routes/gateway-verb-error.js +36 -0
  217. package/dist/platform/control-plane/routes/index.d.ts +0 -6
  218. package/dist/platform/control-plane/routes/index.d.ts.map +1 -1
  219. package/dist/platform/control-plane/routes/index.js +5 -5
  220. package/dist/platform/control-plane/routes/invocation-params.d.ts +23 -0
  221. package/dist/platform/control-plane/routes/invocation-params.d.ts.map +1 -0
  222. package/dist/platform/control-plane/routes/invocation-params.js +9 -0
  223. package/dist/platform/control-plane/routes/register-w3-s2.d.ts +26 -0
  224. package/dist/platform/control-plane/routes/register-w3-s2.d.ts.map +1 -0
  225. package/dist/platform/control-plane/routes/register-w3-s2.js +8 -0
  226. package/dist/platform/control-plane/routes/session-search.d.ts +37 -0
  227. package/dist/platform/control-plane/routes/session-search.d.ts.map +1 -0
  228. package/dist/platform/control-plane/routes/session-search.js +113 -0
  229. package/dist/platform/control-plane/session-broker-gc.d.ts +16 -0
  230. package/dist/platform/control-plane/session-broker-gc.d.ts.map +1 -1
  231. package/dist/platform/control-plane/session-broker-gc.js +23 -6
  232. package/dist/platform/control-plane/session-broker-helpers.d.ts +3 -3
  233. package/dist/platform/control-plane/session-broker-helpers.d.ts.map +1 -1
  234. package/dist/platform/control-plane/session-broker-inputs.d.ts +18 -0
  235. package/dist/platform/control-plane/session-broker-inputs.d.ts.map +1 -1
  236. package/dist/platform/control-plane/session-broker-inputs.js +34 -0
  237. package/dist/platform/control-plane/session-broker-sessions.d.ts +102 -3
  238. package/dist/platform/control-plane/session-broker-sessions.d.ts.map +1 -1
  239. package/dist/platform/control-plane/session-broker-sessions.js +179 -5
  240. package/dist/platform/control-plane/session-broker-state.d.ts +20 -1
  241. package/dist/platform/control-plane/session-broker-state.d.ts.map +1 -1
  242. package/dist/platform/control-plane/session-broker-state.js +67 -5
  243. package/dist/platform/control-plane/session-broker.d.ts +51 -38
  244. package/dist/platform/control-plane/session-broker.d.ts.map +1 -1
  245. package/dist/platform/control-plane/session-broker.js +183 -75
  246. package/dist/platform/control-plane/session-store-importer.d.ts +57 -0
  247. package/dist/platform/control-plane/session-store-importer.d.ts.map +1 -0
  248. package/dist/platform/control-plane/session-store-importer.js +227 -0
  249. package/dist/platform/control-plane/session-types.d.ts +142 -7
  250. package/dist/platform/control-plane/session-types.d.ts.map +1 -1
  251. package/dist/platform/core/adaptive-planner.d.ts +50 -0
  252. package/dist/platform/core/adaptive-planner.d.ts.map +1 -1
  253. package/dist/platform/core/adaptive-planner.js +49 -0
  254. package/dist/platform/core/execution-plan.d.ts +43 -1
  255. package/dist/platform/core/execution-plan.d.ts.map +1 -1
  256. package/dist/platform/core/execution-plan.js +46 -10
  257. package/dist/platform/core/index.d.ts +2 -0
  258. package/dist/platform/core/index.d.ts.map +1 -1
  259. package/dist/platform/core/index.js +2 -0
  260. package/dist/platform/core/orchestrator-runtime.d.ts +31 -0
  261. package/dist/platform/core/orchestrator-runtime.d.ts.map +1 -1
  262. package/dist/platform/core/orchestrator-tool-runtime.d.ts +7 -0
  263. package/dist/platform/core/orchestrator-tool-runtime.d.ts.map +1 -1
  264. package/dist/platform/core/orchestrator-tool-runtime.js +10 -0
  265. package/dist/platform/core/orchestrator-turn-loop.d.ts +35 -1
  266. package/dist/platform/core/orchestrator-turn-loop.d.ts.map +1 -1
  267. package/dist/platform/core/orchestrator-turn-loop.js +121 -3
  268. package/dist/platform/core/orchestrator.d.ts +67 -0
  269. package/dist/platform/core/orchestrator.d.ts.map +1 -1
  270. package/dist/platform/core/orchestrator.js +89 -1
  271. package/dist/platform/core/plan-decomposition.d.ts +196 -0
  272. package/dist/platform/core/plan-decomposition.d.ts.map +1 -0
  273. package/dist/platform/core/plan-decomposition.js +417 -0
  274. package/dist/platform/core/plan-proposal.d.ts +204 -0
  275. package/dist/platform/core/plan-proposal.d.ts.map +1 -0
  276. package/dist/platform/core/plan-proposal.js +296 -0
  277. package/dist/platform/core/wrfc-routing.d.ts +1 -0
  278. package/dist/platform/core/wrfc-routing.d.ts.map +1 -1
  279. package/dist/platform/core/wrfc-routing.js +51 -1
  280. package/dist/platform/daemon/boot.d.ts +63 -0
  281. package/dist/platform/daemon/boot.d.ts.map +1 -0
  282. package/dist/platform/daemon/boot.js +60 -0
  283. package/dist/platform/daemon/cli.js +2 -1
  284. package/dist/platform/daemon/control-plane.d.ts.map +1 -1
  285. package/dist/platform/daemon/control-plane.js +50 -1
  286. package/dist/platform/daemon/facade-composition.d.ts.map +1 -1
  287. package/dist/platform/daemon/facade-composition.js +6 -0
  288. package/dist/platform/daemon/facade.d.ts +18 -6
  289. package/dist/platform/daemon/facade.d.ts.map +1 -1
  290. package/dist/platform/daemon/facade.js +50 -43
  291. package/dist/platform/daemon/http/router-route-contexts.d.ts +1 -0
  292. package/dist/platform/daemon/http/router-route-contexts.d.ts.map +1 -1
  293. package/dist/platform/daemon/http/router-route-contexts.js +1 -0
  294. package/dist/platform/daemon/http/router-session-broker-adapter.d.ts +13 -0
  295. package/dist/platform/daemon/http/router-session-broker-adapter.d.ts.map +1 -0
  296. package/dist/platform/daemon/http/router-session-broker-adapter.js +27 -0
  297. package/dist/platform/daemon/http/router.d.ts +1 -1
  298. package/dist/platform/daemon/http/router.d.ts.map +1 -1
  299. package/dist/platform/daemon/http/router.js +7 -22
  300. package/dist/platform/daemon/http/runtime-route-types.d.ts +42 -4
  301. package/dist/platform/daemon/http/runtime-route-types.d.ts.map +1 -1
  302. package/dist/platform/daemon/index.d.ts +2 -0
  303. package/dist/platform/daemon/index.d.ts.map +1 -1
  304. package/dist/platform/daemon/index.js +1 -0
  305. package/dist/platform/daemon/service-manager.d.ts +16 -0
  306. package/dist/platform/daemon/service-manager.d.ts.map +1 -1
  307. package/dist/platform/daemon/service-manager.js +79 -15
  308. package/dist/platform/intelligence/tree-sitter/service.d.ts.map +1 -1
  309. package/dist/platform/intelligence/tree-sitter/service.js +16 -2
  310. package/dist/platform/knowledge/browser-history/readers.d.ts.map +1 -1
  311. package/dist/platform/knowledge/browser-history/readers.js +15 -5
  312. package/dist/platform/knowledge/knowledge-api.d.ts +26 -0
  313. package/dist/platform/knowledge/knowledge-api.d.ts.map +1 -1
  314. package/dist/platform/knowledge/knowledge-api.js +11 -0
  315. package/dist/platform/knowledge/project-planning/service.d.ts +14 -1
  316. package/dist/platform/knowledge/project-planning/service.d.ts.map +1 -1
  317. package/dist/platform/knowledge/project-planning/service.js +77 -0
  318. package/dist/platform/knowledge/project-planning/types.d.ts +32 -0
  319. package/dist/platform/knowledge/project-planning/types.d.ts.map +1 -1
  320. package/dist/platform/orchestration/bookkeeping.d.ts +12 -0
  321. package/dist/platform/orchestration/bookkeeping.d.ts.map +1 -0
  322. package/dist/platform/orchestration/bookkeeping.js +91 -0
  323. package/dist/platform/orchestration/budget.d.ts +22 -0
  324. package/dist/platform/orchestration/budget.d.ts.map +1 -0
  325. package/dist/platform/orchestration/budget.js +35 -0
  326. package/dist/platform/orchestration/cancellation.d.ts +31 -0
  327. package/dist/platform/orchestration/cancellation.d.ts.map +1 -0
  328. package/dist/platform/orchestration/cancellation.js +25 -0
  329. package/dist/platform/orchestration/controller-compat.d.ts +46 -0
  330. package/dist/platform/orchestration/controller-compat.d.ts.map +1 -0
  331. package/dist/platform/orchestration/controller-compat.js +27 -0
  332. package/dist/platform/orchestration/dirty-guard.d.ts +32 -0
  333. package/dist/platform/orchestration/dirty-guard.d.ts.map +1 -0
  334. package/dist/platform/orchestration/dirty-guard.js +147 -0
  335. package/dist/platform/orchestration/engine.d.ts +82 -0
  336. package/dist/platform/orchestration/engine.d.ts.map +1 -0
  337. package/dist/platform/orchestration/engine.js +623 -0
  338. package/dist/platform/orchestration/index.d.ts +20 -0
  339. package/dist/platform/orchestration/index.d.ts.map +1 -0
  340. package/dist/platform/orchestration/index.js +11 -0
  341. package/dist/platform/orchestration/persistence.d.ts +24 -0
  342. package/dist/platform/orchestration/persistence.d.ts.map +1 -0
  343. package/dist/platform/orchestration/persistence.js +179 -0
  344. package/dist/platform/orchestration/phase-runner.d.ts +114 -0
  345. package/dist/platform/orchestration/phase-runner.d.ts.map +1 -0
  346. package/dist/platform/orchestration/phase-runner.js +347 -0
  347. package/dist/platform/orchestration/proposal-workstream.d.ts +56 -0
  348. package/dist/platform/orchestration/proposal-workstream.d.ts.map +1 -0
  349. package/dist/platform/orchestration/proposal-workstream.js +76 -0
  350. package/dist/platform/orchestration/scheduler.d.ts +64 -0
  351. package/dist/platform/orchestration/scheduler.d.ts.map +1 -0
  352. package/dist/platform/orchestration/scheduler.js +73 -0
  353. package/dist/platform/orchestration/types.d.ts +535 -0
  354. package/dist/platform/orchestration/types.d.ts.map +1 -0
  355. package/dist/platform/orchestration/types.js +47 -0
  356. package/dist/platform/orchestration/worktree-isolation.d.ts +33 -0
  357. package/dist/platform/orchestration/worktree-isolation.d.ts.map +1 -0
  358. package/dist/platform/orchestration/worktree-isolation.js +248 -0
  359. package/dist/platform/presentation/glyphs.d.ts +91 -0
  360. package/dist/platform/presentation/glyphs.d.ts.map +1 -0
  361. package/dist/platform/presentation/glyphs.js +93 -0
  362. package/dist/platform/presentation/index.d.ts +28 -0
  363. package/dist/platform/presentation/index.d.ts.map +1 -0
  364. package/dist/platform/presentation/index.js +27 -0
  365. package/dist/platform/presentation/thinking-phrases.d.ts +12 -0
  366. package/dist/platform/presentation/thinking-phrases.d.ts.map +1 -0
  367. package/dist/platform/presentation/thinking-phrases.js +32 -0
  368. package/dist/platform/presentation/tones.d.ts +121 -0
  369. package/dist/platform/presentation/tones.d.ts.map +1 -0
  370. package/dist/platform/presentation/tones.js +145 -0
  371. package/dist/platform/presentation/waiting-wording.d.ts +54 -0
  372. package/dist/platform/presentation/waiting-wording.d.ts.map +1 -0
  373. package/dist/platform/presentation/waiting-wording.js +51 -0
  374. package/dist/platform/providers/runtime-snapshot.d.ts.map +1 -1
  375. package/dist/platform/providers/runtime-snapshot.js +12 -2
  376. package/dist/platform/runtime/bootstrap-services.d.ts +62 -2
  377. package/dist/platform/runtime/bootstrap-services.d.ts.map +1 -1
  378. package/dist/platform/runtime/bootstrap-services.js +217 -50
  379. package/dist/platform/runtime/daemon-version-compat.d.ts +39 -0
  380. package/dist/platform/runtime/daemon-version-compat.d.ts.map +1 -0
  381. package/dist/platform/runtime/daemon-version-compat.js +75 -0
  382. package/dist/platform/runtime/detached-daemon-runtime.d.ts +26 -0
  383. package/dist/platform/runtime/detached-daemon-runtime.d.ts.map +1 -0
  384. package/dist/platform/runtime/detached-daemon-runtime.js +49 -0
  385. package/dist/platform/runtime/emitters/communication.d.ts +11 -0
  386. package/dist/platform/runtime/emitters/communication.d.ts.map +1 -1
  387. package/dist/platform/runtime/emitters/communication.js +9 -0
  388. package/dist/platform/runtime/emitters/workflows.d.ts +1 -1
  389. package/dist/platform/runtime/emitters/workflows.d.ts.map +1 -1
  390. package/dist/platform/runtime/events/index.d.ts +13 -0
  391. package/dist/platform/runtime/events/index.d.ts.map +1 -1
  392. package/dist/platform/runtime/events/index.js +13 -0
  393. package/dist/platform/runtime/feature-flags/flags.d.ts.map +1 -1
  394. package/dist/platform/runtime/feature-flags/flags.js +56 -1
  395. package/dist/platform/runtime/fleet/adapters/agent.d.ts +56 -0
  396. package/dist/platform/runtime/fleet/adapters/agent.d.ts.map +1 -0
  397. package/dist/platform/runtime/fleet/adapters/agent.js +143 -0
  398. package/dist/platform/runtime/fleet/adapters/automation.d.ts +30 -0
  399. package/dist/platform/runtime/fleet/adapters/automation.d.ts.map +1 -0
  400. package/dist/platform/runtime/fleet/adapters/automation.js +41 -0
  401. package/dist/platform/runtime/fleet/adapters/background-process.d.ts +12 -0
  402. package/dist/platform/runtime/fleet/adapters/background-process.d.ts.map +1 -0
  403. package/dist/platform/runtime/fleet/adapters/background-process.js +46 -0
  404. package/dist/platform/runtime/fleet/adapters/code-index.d.ts +21 -0
  405. package/dist/platform/runtime/fleet/adapters/code-index.d.ts.map +1 -0
  406. package/dist/platform/runtime/fleet/adapters/code-index.js +44 -0
  407. package/dist/platform/runtime/fleet/adapters/orchestration.d.ts +69 -0
  408. package/dist/platform/runtime/fleet/adapters/orchestration.d.ts.map +1 -0
  409. package/dist/platform/runtime/fleet/adapters/orchestration.js +329 -0
  410. package/dist/platform/runtime/fleet/adapters/schedule.d.ts +14 -0
  411. package/dist/platform/runtime/fleet/adapters/schedule.d.ts.map +1 -0
  412. package/dist/platform/runtime/fleet/adapters/schedule.js +28 -0
  413. package/dist/platform/runtime/fleet/adapters/trigger.d.ts +12 -0
  414. package/dist/platform/runtime/fleet/adapters/trigger.d.ts.map +1 -0
  415. package/dist/platform/runtime/fleet/adapters/trigger.js +22 -0
  416. package/dist/platform/runtime/fleet/adapters/watcher.d.ts +13 -0
  417. package/dist/platform/runtime/fleet/adapters/watcher.d.ts.map +1 -0
  418. package/dist/platform/runtime/fleet/adapters/watcher.js +47 -0
  419. package/dist/platform/runtime/fleet/adapters/workflow.d.ts +11 -0
  420. package/dist/platform/runtime/fleet/adapters/workflow.d.ts.map +1 -0
  421. package/dist/platform/runtime/fleet/adapters/workflow.js +34 -0
  422. package/dist/platform/runtime/fleet/adapters/wrfc.d.ts +35 -0
  423. package/dist/platform/runtime/fleet/adapters/wrfc.d.ts.map +1 -0
  424. package/dist/platform/runtime/fleet/adapters/wrfc.js +275 -0
  425. package/dist/platform/runtime/fleet/index.d.ts +10 -0
  426. package/dist/platform/runtime/fleet/index.d.ts.map +1 -0
  427. package/dist/platform/runtime/fleet/index.js +6 -0
  428. package/dist/platform/runtime/fleet/registry.d.ts +113 -0
  429. package/dist/platform/runtime/fleet/registry.d.ts.map +1 -0
  430. package/dist/platform/runtime/fleet/registry.js +664 -0
  431. package/dist/platform/runtime/fleet/types.d.ts +199 -0
  432. package/dist/platform/runtime/fleet/types.d.ts.map +1 -0
  433. package/dist/platform/runtime/fleet/types.js +2 -0
  434. package/dist/platform/runtime/operator-client.d.ts +20 -2
  435. package/dist/platform/runtime/operator-client.d.ts.map +1 -1
  436. package/dist/platform/runtime/operator-client.js +11 -1
  437. package/dist/platform/runtime/provider-accounts/registry.d.ts.map +1 -1
  438. package/dist/platform/runtime/provider-accounts/registry.js +11 -1
  439. package/dist/platform/runtime/runtime-knowledge-api.d.ts +1 -1
  440. package/dist/platform/runtime/runtime-knowledge-api.d.ts.map +1 -1
  441. package/dist/platform/runtime/runtime-knowledge-api.js +1 -0
  442. package/dist/platform/runtime/services.d.ts +48 -0
  443. package/dist/platform/runtime/services.d.ts.map +1 -1
  444. package/dist/platform/runtime/services.js +95 -2
  445. package/dist/platform/runtime/session-spine/client.d.ts +234 -0
  446. package/dist/platform/runtime/session-spine/client.d.ts.map +1 -0
  447. package/dist/platform/runtime/session-spine/client.js +449 -0
  448. package/dist/platform/runtime/session-spine/index.d.ts +12 -0
  449. package/dist/platform/runtime/session-spine/index.d.ts.map +1 -0
  450. package/dist/platform/runtime/session-spine/index.js +11 -0
  451. package/dist/platform/runtime/session-spine/union-cache.d.ts +225 -0
  452. package/dist/platform/runtime/session-spine/union-cache.d.ts.map +1 -0
  453. package/dist/platform/runtime/session-spine/union-cache.js +333 -0
  454. package/dist/platform/runtime/shell-command-ops.d.ts +3 -1
  455. package/dist/platform/runtime/shell-command-ops.d.ts.map +1 -1
  456. package/dist/platform/runtime/transports/daemon-http-client-validators.d.ts.map +1 -1
  457. package/dist/platform/runtime/transports/daemon-http-client-validators.js +22 -0
  458. package/dist/platform/runtime/transports/daemon-http-client.d.ts.map +1 -1
  459. package/dist/platform/runtime/transports/daemon-http-client.js +25 -2
  460. package/dist/platform/runtime/transports/http-types.d.ts +9 -2
  461. package/dist/platform/runtime/transports/http-types.d.ts.map +1 -1
  462. package/dist/platform/state/canonical-memory.d.ts +95 -0
  463. package/dist/platform/state/canonical-memory.d.ts.map +1 -0
  464. package/dist/platform/state/canonical-memory.js +155 -0
  465. package/dist/platform/state/code-index-chunking.d.ts +49 -0
  466. package/dist/platform/state/code-index-chunking.d.ts.map +1 -0
  467. package/dist/platform/state/code-index-chunking.js +111 -0
  468. package/dist/platform/state/code-index-db.d.ts +53 -0
  469. package/dist/platform/state/code-index-db.d.ts.map +1 -0
  470. package/dist/platform/state/code-index-db.js +101 -0
  471. package/dist/platform/state/code-index-reindex.d.ts +73 -0
  472. package/dist/platform/state/code-index-reindex.d.ts.map +1 -0
  473. package/dist/platform/state/code-index-reindex.js +156 -0
  474. package/dist/platform/state/code-index-store.d.ts +175 -0
  475. package/dist/platform/state/code-index-store.d.ts.map +1 -0
  476. package/dist/platform/state/code-index-store.js +620 -0
  477. package/dist/platform/state/index.d.ts +12 -2
  478. package/dist/platform/state/index.d.ts.map +1 -1
  479. package/dist/platform/state/index.js +6 -1
  480. package/dist/platform/state/knowledge-injection.d.ts +23 -0
  481. package/dist/platform/state/knowledge-injection.d.ts.map +1 -1
  482. package/dist/platform/state/knowledge-injection.js +34 -19
  483. package/dist/platform/state/memory-recall-contract.d.ts +63 -0
  484. package/dist/platform/state/memory-recall-contract.d.ts.map +1 -0
  485. package/dist/platform/state/memory-recall-contract.js +94 -0
  486. package/dist/platform/state/memory-store.d.ts +2 -0
  487. package/dist/platform/state/memory-store.d.ts.map +1 -1
  488. package/dist/platform/state/memory-store.js +4 -0
  489. package/dist/platform/state/memory-vector-store.d.ts +1 -13
  490. package/dist/platform/state/memory-vector-store.d.ts.map +1 -1
  491. package/dist/platform/state/memory-vector-store.js +18 -39
  492. package/dist/platform/state/sqlite-store.d.ts +2 -0
  493. package/dist/platform/state/sqlite-store.d.ts.map +1 -1
  494. package/dist/platform/state/sqlite-store.js +4 -0
  495. package/dist/platform/state/sqlite-vec-loader.d.ts +25 -0
  496. package/dist/platform/state/sqlite-vec-loader.d.ts.map +1 -0
  497. package/dist/platform/state/sqlite-vec-loader.js +43 -0
  498. package/dist/platform/state/vibe-projection.d.ts +67 -0
  499. package/dist/platform/state/vibe-projection.d.ts.map +1 -0
  500. package/dist/platform/state/vibe-projection.js +115 -0
  501. package/dist/platform/tools/agent/index.d.ts.map +1 -1
  502. package/dist/platform/tools/agent/index.js +8 -0
  503. package/dist/platform/tools/agent/manager.d.ts +140 -1
  504. package/dist/platform/tools/agent/manager.d.ts.map +1 -1
  505. package/dist/platform/tools/agent/manager.js +143 -1
  506. package/dist/platform/tools/agent/schema.d.ts +26 -0
  507. package/dist/platform/tools/agent/schema.d.ts.map +1 -1
  508. package/dist/platform/tools/agent/schema.js +2 -2
  509. package/dist/platform/tools/agent/wrfc-batch-policy.d.ts +13 -0
  510. package/dist/platform/tools/agent/wrfc-batch-policy.d.ts.map +1 -1
  511. package/dist/platform/tools/agent/wrfc-batch-policy.js +60 -0
  512. package/dist/platform/tools/exec/runtime.d.ts +10 -0
  513. package/dist/platform/tools/exec/runtime.d.ts.map +1 -1
  514. package/dist/platform/tools/exec/runtime.js +161 -49
  515. package/dist/platform/tools/exec/schema.d.ts +3 -1
  516. package/dist/platform/tools/exec/schema.d.ts.map +1 -1
  517. package/dist/platform/tools/exec/schema.js +2 -1
  518. package/dist/platform/tools/fetch/runtime.d.ts +7 -0
  519. package/dist/platform/tools/fetch/runtime.d.ts.map +1 -1
  520. package/dist/platform/tools/fetch/runtime.js +8 -6
  521. package/dist/platform/tools/index.d.ts +2 -0
  522. package/dist/platform/tools/index.d.ts.map +1 -1
  523. package/dist/platform/tools/index.js +2 -0
  524. package/dist/platform/tools/registry.d.ts +9 -3
  525. package/dist/platform/tools/registry.d.ts.map +1 -1
  526. package/dist/platform/tools/registry.js +9 -3
  527. package/dist/platform/tools/state/index.d.ts +9 -0
  528. package/dist/platform/tools/state/index.d.ts.map +1 -1
  529. package/dist/platform/tools/state/index.js +60 -3
  530. package/dist/platform/types/foundation-contract.d.ts +1 -1
  531. package/dist/platform/types/foundation-contract.d.ts.map +1 -1
  532. package/dist/platform/types/index.d.ts +1 -1
  533. package/dist/platform/types/index.d.ts.map +1 -1
  534. package/dist/platform/types/tools.d.ts +14 -1
  535. package/dist/platform/types/tools.d.ts.map +1 -1
  536. package/dist/platform/version.js +1 -1
  537. package/package.json +29 -9
  538. package/dist/platform/control-plane/routes/automation.d.ts +0 -3
  539. package/dist/platform/control-plane/routes/automation.d.ts.map +0 -1
  540. package/dist/platform/control-plane/routes/automation.js +0 -63
  541. package/dist/platform/control-plane/routes/context.d.ts +0 -2
  542. package/dist/platform/control-plane/routes/context.d.ts.map +0 -1
  543. package/dist/platform/control-plane/routes/context.js +0 -1
  544. package/dist/platform/control-plane/routes/operator.d.ts +0 -8
  545. package/dist/platform/control-plane/routes/operator.d.ts.map +0 -1
  546. package/dist/platform/control-plane/routes/operator.js +0 -415
  547. package/dist/platform/control-plane/routes/remote.d.ts +0 -3
  548. package/dist/platform/control-plane/routes/remote.d.ts.map +0 -1
  549. package/dist/platform/control-plane/routes/remote.js +0 -35
  550. package/dist/platform/control-plane/routes/sessions.d.ts +0 -3
  551. package/dist/platform/control-plane/routes/sessions.d.ts.map +0 -1
  552. package/dist/platform/control-plane/routes/sessions.js +0 -43
  553. package/dist/platform/control-plane/routes/tasks.d.ts +0 -3
  554. package/dist/platform/control-plane/routes/tasks.d.ts.map +0 -1
  555. package/dist/platform/control-plane/routes/tasks.js +0 -22
@@ -0,0 +1,347 @@
1
+ /** SDK-owned platform module. This implementation is maintained in goodvibes-sdk. */
2
+ import { AgentWorktree } from '../agents/worktree.js';
3
+ import { parseCompletionReport, } from '../agents/completion-report.js';
4
+ import { verifyEngineerClaims } from '../agents/wrfc-reporting.js';
5
+ import { runWrfcGateChecks } from '../agents/wrfc-gate-runtime.js';
6
+ import { getWrfcTransportRetryDelayMs, getWrfcTransportRetryLimit } from '../agents/wrfc-config.js';
7
+ import { isTransportFailureMessage } from '../types/errors.js';
8
+ import { logger } from '../utils/logger.js';
9
+ import { summarizeError } from '../utils/error-display.js';
10
+ import { excludeUntouchedLaunchResidue } from './dirty-guard.js';
11
+ import { classifyBookkeepingFailure } from './bookkeeping.js';
12
+ import { mergeWorkItemUsage } from './types.js';
13
+ function templateForPhase(phase) {
14
+ return phase.kind === 'review' || phase.kind === 'gate' ? 'general' : 'engineer';
15
+ }
16
+ function buildPhaseTask(item, phase, priorReports) {
17
+ const priorContext = priorReports.length > 0
18
+ ? `\n\nPrior phase reports for this work item:\n${priorReports.map((r) => `- ${r.phaseId}: ${r.report.summary}`).join('\n')}`
19
+ : '';
20
+ if (phase.kind === 'review' || phase.kind === 'gate') {
21
+ return `Assess the following work item's changes against its constraints and report findings. Do not modify files.\n\nWork item: ${item.title}\n${item.task}${priorContext}`;
22
+ }
23
+ if (phase.kind === 'fix') {
24
+ return `Address the following findings for this work item.\n\nWork item: ${item.title}\n${item.task}${priorContext}`;
25
+ }
26
+ return `${item.task}${priorContext}`;
27
+ }
28
+ function genericReport(summary) {
29
+ return { version: 1, archetype: 'generic', summary, result: summary };
30
+ }
31
+ function sleep(ms) {
32
+ return new Promise((resolve) => {
33
+ const timer = setTimeout(resolve, ms);
34
+ timer.unref?.();
35
+ });
36
+ }
37
+ function awaitAgentTermination(runtimeBus, agentManager, agentId) {
38
+ return new Promise((resolve) => {
39
+ const unsubscribe = runtimeBus.onDomain('agents', (envelope) => {
40
+ const event = envelope.payload;
41
+ if (event.agentId !== agentId)
42
+ return;
43
+ if (event.type !== 'AGENT_COMPLETED' && event.type !== 'AGENT_FAILED' && event.type !== 'AGENT_CANCELLED')
44
+ return;
45
+ unsubscribe();
46
+ const status = event.type === 'AGENT_COMPLETED' ? 'completed' : event.type === 'AGENT_CANCELLED' ? 'cancelled' : 'failed';
47
+ resolve({ status, record: agentManager.getStatus(agentId) });
48
+ });
49
+ });
50
+ }
51
+ function usageFromRecord(record, priceUsage) {
52
+ const u = record?.usage;
53
+ const base = {
54
+ inputTokens: u?.inputTokens ?? 0,
55
+ outputTokens: u?.outputTokens ?? 0,
56
+ cacheReadTokens: u?.cacheReadTokens ?? 0,
57
+ cacheWriteTokens: u?.cacheWriteTokens ?? 0,
58
+ reasoningTokens: u?.reasoningTokens,
59
+ llmCallCount: u?.llmCallCount ?? 0,
60
+ turnCount: u?.turnCount ?? 0,
61
+ toolCallCount: record?.toolCallCount ?? 0,
62
+ };
63
+ let costUsd = null;
64
+ let costState = 'unpriced';
65
+ if (u && priceUsage) {
66
+ try {
67
+ const priced = priceUsage(record?.model, { ...base, costUsd: null, costState: 'unpriced' });
68
+ if (priced !== null) {
69
+ costUsd = priced;
70
+ costState = 'priced';
71
+ }
72
+ }
73
+ catch {
74
+ // stays unpriced — never fabricate a cost from a throwing pricer.
75
+ }
76
+ }
77
+ return { ...base, costUsd, costState };
78
+ }
79
+ /**
80
+ * Combines a new phase's usage into a work item's running total. Single-source
81
+ * cost (never independently re-priced here). Thin alias over the canonical
82
+ * {@link mergeWorkItemUsage} (types.ts) so the phase-runner, the engine, and
83
+ * the fleet rollup adapters all fold usage through exactly one implementation.
84
+ */
85
+ export function mergeUsage(a, b) {
86
+ return mergeWorkItemUsage(a, b);
87
+ }
88
+ /** Quality gates (global-config-driven, reused VERBATIM) + phase-required-gate assertion + phantom guard + reviewer constraint findings. */
89
+ async function evaluateGate(workstream, phase, report, deps) {
90
+ const results = [...await runWrfcGateChecks({
91
+ configManager: deps.configManager,
92
+ projectRoot: deps.projectRoot,
93
+ runtimeBus: deps.runtimeBus,
94
+ sessionId: deps.sessionId,
95
+ chainId: workstream.id,
96
+ // Worktree mode (BIG-3 item 5): run the configured quality gates INSIDE the
97
+ // item's isolated worktree, the same way the phantom-work guard above
98
+ // verifies claims against that worktree path. BIG-1 fixed only the phantom
99
+ // check; without this, gates (typecheck/lint/test) would run against the
100
+ // shared projectRoot and never see the item's isolated changes. Absent
101
+ // (shared mode) ⇒ runWrfcGateChecks defaults cwd to projectRoot — unchanged.
102
+ ...(deps.itemWorktree ? { cwd: deps.itemWorktree.path } : {}),
103
+ })];
104
+ const ranNames = new Set(results.map((r) => r.gate));
105
+ const missingRequired = phase.gate.gates.filter((name) => !ranNames.has(name));
106
+ for (const name of missingRequired) {
107
+ results.push({ gate: name, passed: false, output: 'required gate is not configured/enabled', durationMs: 0 });
108
+ }
109
+ if (report.archetype === 'engineer' && !deps.skipClaimVerification) {
110
+ // Worktree mode: the agent's files landed in the item's OWN worktree, not
111
+ // the shared projectRoot — verify claims (existence + `git diff`) against
112
+ // that worktree path, or every real change would be falsely flagged as
113
+ // phantom work (nothing to find at projectRoot).
114
+ const verification = verifyEngineerClaims(report, deps.itemWorktree?.path ?? deps.projectRoot);
115
+ if (verification.kind === 'unverified' || verification.kind === 'unverifiable_no_claims') {
116
+ results.push({ gate: 'phantom-work-guard', passed: false, output: verification.summary, durationMs: 0 });
117
+ }
118
+ }
119
+ let constraintFindings;
120
+ let unsatisfiedConstraintIds;
121
+ if (report.archetype === 'reviewer') {
122
+ const reviewer = report;
123
+ constraintFindings = reviewer.constraintFindings ?? [];
124
+ const unsatisfied = constraintFindings.filter((f) => !f.satisfied);
125
+ unsatisfiedConstraintIds = unsatisfied.map((f) => f.constraintId);
126
+ if (!reviewer.passed || unsatisfied.length > 0) {
127
+ results.push({
128
+ gate: 'reviewer-verdict',
129
+ passed: false,
130
+ output: unsatisfied.length > 0
131
+ ? `${unsatisfied.length} unsatisfied constraint(s): ${unsatisfied.map((f) => f.constraintId).join(', ')}`
132
+ : 'reviewer did not pass',
133
+ durationMs: 0,
134
+ });
135
+ }
136
+ }
137
+ return {
138
+ passed: results.every((r) => r.passed),
139
+ results,
140
+ constraintFindings,
141
+ unsatisfiedConstraintIds,
142
+ };
143
+ }
144
+ /**
145
+ * Runs the POST-gate scoped-commit + merge for a passed phase and reports its
146
+ * outcome HONESTLY rather than swallowing failures. The gate has already
147
+ * decided the phase passed; this step only records the changes, so its result
148
+ * is bookkeeping: a failure surfaces to the engine as a warning on a passed
149
+ * item (or, for the narrow negating set — workspace corruption, see
150
+ * bookkeeping.ts — as an item failure), never as a silent no-op that lets the
151
+ * fleet imply a commit happened when it did not (DEBT-4 item 1).
152
+ */
153
+ async function commitPhaseWork(item, phase, agentId, worktree, deps) {
154
+ if (phase.gate.scope === 'off') {
155
+ return { commit: { status: 'skipped', reason: 'commit disabled for this phase (gate scope: off)' } };
156
+ }
157
+ let paths = phase.gate.scope === 'scoped' ? item.touchedPaths : undefined;
158
+ let exclusion;
159
+ // Worktree mode: the item commits onto its own branch INSIDE its dedicated
160
+ // worktree, which the engine created fresh (and therefore clean) at claim.
161
+ // The launch-dirty snapshot is taken against the SHARED projectRoot, so it
162
+ // has nothing to say about a just-created worktree — a fresh worktree starts
163
+ // clean, so its launch-dirty residue is trivially empty. Skip the residue
164
+ // exclusion entirely and commit straight onto the item branch; NO merge to
165
+ // base (the sequential integration lane owns that at item termination).
166
+ if (deps.itemWorktree) {
167
+ try {
168
+ const result = await deps.itemWorktree.commit(`orchestration: ${item.title} — ${phase.kind} phase`, paths);
169
+ const ignoredNote = result.skippedIgnored.length > 0
170
+ ? `${result.skippedIgnored.length} ignored path${result.skippedIgnored.length === 1 ? '' : 's'} skipped`
171
+ : undefined;
172
+ if (result.hash === null) {
173
+ return { commit: { status: 'skipped', reason: ignoredNote ? `nothing to stage (${ignoredNote})` : 'nothing to stage' } };
174
+ }
175
+ return { commit: { status: 'committed', hash: result.hash, ...(ignoredNote ? { reason: ignoredNote } : {}) } };
176
+ }
177
+ catch (error) {
178
+ const reason = summarizeError(error);
179
+ const negating = classifyBookkeepingFailure(error) === 'negating';
180
+ logger.warn('orchestration phase-runner: worktree scoped commit did not complete', {
181
+ itemId: item.id, phaseId: phase.id, worktreePath: deps.itemWorktree.path, error: reason, negating,
182
+ });
183
+ return { commit: { status: 'failed', reason, negating } };
184
+ }
185
+ }
186
+ if (paths && paths.length > 0 && deps.launchDirtySnapshot) {
187
+ const launchSnapshot = deps.launchDirtySnapshot;
188
+ if (launchSnapshot.size > 0) {
189
+ const { included, excluded } = excludeUntouchedLaunchResidue(deps.projectRoot, paths, launchSnapshot);
190
+ if (excluded.length > 0) {
191
+ exclusion = { excludedPaths: excluded, skipped: included.length === 0 };
192
+ if (included.length === 0) {
193
+ // Every candidate path is untouched launch-dirty residue — an
194
+ // honest "nothing this phase did needs committing", not a silent
195
+ // no-op AND not a fallback to sweeping the whole working tree.
196
+ logger.info('orchestration phase-runner: scoped commit skipped — every candidate path is untouched launch-dirty residue', {
197
+ itemId: item.id,
198
+ phaseId: phase.id,
199
+ excludedPaths: excluded,
200
+ });
201
+ return { exclusion, commit: { status: 'skipped', reason: 'every candidate path was untouched launch-dirty residue' } };
202
+ }
203
+ logger.info('orchestration phase-runner: excluded untouched launch-dirty residue from scoped commit', {
204
+ itemId: item.id,
205
+ phaseId: phase.id,
206
+ excludedPaths: excluded,
207
+ });
208
+ paths = [...included];
209
+ }
210
+ }
211
+ }
212
+ try {
213
+ const result = await worktree.commitWorkingTree(`orchestration: ${item.title} — ${phase.kind} phase`, paths);
214
+ await worktree.merge(agentId);
215
+ const ignoredNote = result.skippedIgnored.length > 0
216
+ ? `${result.skippedIgnored.length} ignored path${result.skippedIgnored.length === 1 ? '' : 's'} skipped`
217
+ : undefined;
218
+ if (result.hash === null) {
219
+ // A null hash is "nothing was staged" — an honest skip, not a landed commit.
220
+ return { exclusion, commit: { status: 'skipped', reason: ignoredNote ? `nothing to stage (${ignoredNote})` : 'nothing to stage' } };
221
+ }
222
+ return {
223
+ exclusion,
224
+ commit: { status: 'committed', hash: result.hash, ...(ignoredNote ? { reason: ignoredNote } : {}) },
225
+ };
226
+ }
227
+ catch (error) {
228
+ const reason = summarizeError(error);
229
+ const negating = classifyBookkeepingFailure(error) === 'negating';
230
+ // Non-fatal by default: the gate already passed, so the engine treats this
231
+ // as a warning on a passed item. Only a NEGATING failure (workspace
232
+ // corruption — bookkeeping.ts) flips the item to failed.
233
+ logger.warn('orchestration phase-runner: scoped commit/merge did not complete', {
234
+ itemId: item.id, phaseId: phase.id, error: reason, negating,
235
+ });
236
+ return { exclusion, commit: { status: 'failed', reason, negating } };
237
+ }
238
+ }
239
+ /** Runs one WorkItem through one Phase to completion (or cancellation/failure). Recurses (bounded by transportRetryLimit) on a transport-classified spawn failure. */
240
+ export async function runPhase(workstream, item, phase, priorReports, deps) {
241
+ const startedAt = Date.now();
242
+ const createWorktree = deps.createWorktree ?? (() => new AgentWorktree(deps.projectRoot));
243
+ const worktree = createWorktree();
244
+ const record = deps.agentManager.spawn({
245
+ mode: 'spawn',
246
+ task: buildPhaseTask(item, phase, priorReports),
247
+ template: templateForPhase(phase),
248
+ dangerously_disable_wrfc: true,
249
+ // Worktree mode: run the agent's tools with their working directory set to
250
+ // the item's isolated worktree, so its file edits land there instead of the
251
+ // shared projectRoot. Omitted (undefined) in shared mode ⇒ agent uses the
252
+ // orchestrator's default working directory exactly as before.
253
+ ...(deps.itemWorktree ? { workingDirectory: deps.itemWorktree.path } : {}),
254
+ });
255
+ record.workItemId = item.id;
256
+ item.agentId = record.id;
257
+ item.allAgentIds.push(record.id);
258
+ item.branch ??= `agent/${item.id}`;
259
+ const signal = deps.cancellation.start(item.id);
260
+ deps.agentManager.registerCancellationSignal(record.id, signal);
261
+ let outcome;
262
+ try {
263
+ outcome = await awaitAgentTermination(deps.runtimeBus, deps.agentManager, record.id);
264
+ }
265
+ finally {
266
+ deps.agentManager.releaseCancellationSignal(record.id);
267
+ deps.cancellation.release(item.id);
268
+ }
269
+ const usage = usageFromRecord(outcome.record, deps.priceUsage);
270
+ if (outcome.status === 'cancelled') {
271
+ await worktree.cleanup(record.id).catch(() => undefined);
272
+ return {
273
+ agentStatus: 'cancelled',
274
+ result: {
275
+ itemId: item.id,
276
+ phaseId: phase.id,
277
+ agentId: record.id,
278
+ report: genericReport('cancelled by operator'),
279
+ gate: { passed: false, results: [] },
280
+ startedAt,
281
+ completedAt: Date.now(),
282
+ usage,
283
+ },
284
+ };
285
+ }
286
+ if (outcome.status === 'failed') {
287
+ const transportFailure = isTransportFailureMessage(outcome.record?.error ?? '');
288
+ const retryLimit = getWrfcTransportRetryLimit(deps.configManager);
289
+ if (transportFailure && item.transportRetryCount < retryLimit) {
290
+ item.transportRetryCount += 1;
291
+ await worktree.cleanup(record.id).catch(() => undefined);
292
+ await sleep(getWrfcTransportRetryDelayMs(deps.configManager));
293
+ return runPhase(workstream, item, phase, priorReports, deps);
294
+ }
295
+ await worktree.cleanup(record.id).catch(() => undefined);
296
+ return {
297
+ agentStatus: 'failed',
298
+ result: {
299
+ itemId: item.id,
300
+ phaseId: phase.id,
301
+ agentId: record.id,
302
+ report: genericReport(outcome.record?.error ?? 'agent failed'),
303
+ gate: { passed: false, results: [] },
304
+ startedAt,
305
+ completedAt: Date.now(),
306
+ usage,
307
+ },
308
+ };
309
+ }
310
+ const report = parseCompletionReport(outcome.record?.fullOutput ?? '') ?? genericReport(outcome.record?.fullOutput ?? '');
311
+ if (report.archetype === 'engineer') {
312
+ const engineerReport = report;
313
+ for (const path of [...engineerReport.filesCreated, ...engineerReport.filesModified, ...engineerReport.filesDeleted]) {
314
+ if (!item.touchedPaths.includes(path))
315
+ item.touchedPaths.push(path);
316
+ }
317
+ }
318
+ const gate = await evaluateGate(workstream, phase, report, deps);
319
+ let commitExclusion;
320
+ let commit;
321
+ if (gate.passed) {
322
+ const committed = await commitPhaseWork(item, phase, record.id, worktree, deps);
323
+ commitExclusion = committed.exclusion;
324
+ commit = committed.commit;
325
+ }
326
+ // In worktree mode the item worktree persists across phases (the engine's
327
+ // integration lane owns its teardown), so only the shared-mode transient
328
+ // worktree gets cleaned up here.
329
+ if (!deps.itemWorktree) {
330
+ await worktree.cleanup(record.id).catch(() => undefined);
331
+ }
332
+ return {
333
+ agentStatus: 'completed',
334
+ result: {
335
+ itemId: item.id,
336
+ phaseId: phase.id,
337
+ agentId: record.id,
338
+ report,
339
+ gate,
340
+ startedAt,
341
+ completedAt: Date.now(),
342
+ usage,
343
+ ...(commitExclusion ? { commitExclusion } : {}),
344
+ ...(commit ? { commit } : {}),
345
+ },
346
+ };
347
+ }
@@ -0,0 +1,56 @@
1
+ /** SDK-owned platform module. This implementation is maintained in goodvibes-sdk. */
2
+ /**
3
+ * Proposal → workstream assembly (BIG-3 item 1) — the final stage of the
4
+ * WRFC→orchestration migration. `fromPlanProposal()` maps an APPROVED
5
+ * PlanProposal (platform/core/plan-proposal.ts, produced by the BIG-2 planner
6
+ * decomposition pipeline) into a `CreateWorkstreamInput` the engine can run
7
+ * directly, so `/workstream launch` executes the REAL multi-item plan instead
8
+ * of flattening it through the `fromChainSpec` compat path.
9
+ *
10
+ * The mapping, one honest step at a time:
11
+ * - ONE work item per proposal work item. The proposal item's `title` becomes
12
+ * the work item's title and its `brief` becomes the work item's `task` — the
13
+ * prompt/context the phase agents actually run against (the phase-runner
14
+ * prepends "Work item: <title>" to review/fix prompts, so both survive into
15
+ * the agent's context). The proposal item's id is preserved so provenance,
16
+ * dependencies, and fleet nodes all line up 1:1.
17
+ * - Every item runs the SAME standard role-phase pipeline — engineer→review,
18
+ * the exact `engineerReviewPhases` template `fromChainSpec` uses
19
+ * (controller-compat.ts). The only per-assembly parameter is phase
20
+ * `capacity`: it defaults to the item count so independent items run
21
+ * concurrently (bounded only by their dependencies), where a single compat
22
+ * chain stays at capacity 1. Callers may cap concurrency via `opts.capacity`.
23
+ * - Inter-item dependencies carry over verbatim: `workItem.dependsOn` (already
24
+ * resolved to item ids by assemblePlanProposal) becomes the engine work
25
+ * item's `dependsOn`, which the scheduler gates the claim path on (an item
26
+ * is not claimable until every dependency reaches 'passed'; see the
27
+ * 'blocked-dependency' state and applyDependencyGates).
28
+ * - Workstream-level provenance records where the plan came from
29
+ * (decomposedBy, proposalId, strategy, agent cost/elapsed).
30
+ *
31
+ * ASSERT-AT-ASSEMBLY (BIG-3 item 2): even though `assemblePlanProposal` already
32
+ * rejects dangling dependencies and cycles, this function re-checks both and
33
+ * THROWS on violation rather than quietly building a broken workstream — a
34
+ * dangling dependency would gate an item on nothing, and a cycle would deadlock
35
+ * every item in it forever in 'blocked-dependency'. Belt-and-braces, because a
36
+ * caller could hand us a hand-built or mutated proposal that never went through
37
+ * the assembler.
38
+ */
39
+ import type { ConfigManager } from '../config/manager.js';
40
+ import type { PlanProposal } from '../core/plan-proposal.js';
41
+ import type { CreateWorkstreamInput } from './engine.js';
42
+ export interface FromPlanProposalOptions {
43
+ /**
44
+ * Per-phase capacity for the engineer/review phases. Defaults to the number
45
+ * of work items, so all independent items can run concurrently (dependencies
46
+ * still gate the rest). Set a lower value to cap concurrency; clamped to at
47
+ * least 1.
48
+ */
49
+ readonly capacity?: number | undefined;
50
+ }
51
+ /**
52
+ * Assemble a `CreateWorkstreamInput` from an approved multi-item PlanProposal.
53
+ * See the module doc for the full mapping and the assembly-time assertions.
54
+ */
55
+ export declare function fromPlanProposal(proposal: PlanProposal, configManager: Pick<ConfigManager, 'get' | 'getCategory'>, opts?: FromPlanProposalOptions): CreateWorkstreamInput;
56
+ //# sourceMappingURL=proposal-workstream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposal-workstream.d.ts","sourceRoot":"","sources":["../../../src/platform/orchestration/proposal-workstream.ts"],"names":[],"mappings":"AAAA,qFAAqF;AAErF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGzD,MAAM,WAAW,uBAAuB;IACtC;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AA8CD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,YAAY,EACtB,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,aAAa,CAAC,EACzD,IAAI,GAAE,uBAA4B,GACjC,qBAAqB,CA8BvB"}
@@ -0,0 +1,76 @@
1
+ /** SDK-owned platform module. This implementation is maintained in goodvibes-sdk. */
2
+ import { getWrfcCommitScope } from '../agents/wrfc-config.js';
3
+ import { engineerReviewPhases } from './controller-compat.js';
4
+ /** Throws if any item's `dependsOn` references an unknown item, or if the dependency graph contains a cycle. */
5
+ function assertAcyclicAndResolved(proposal) {
6
+ const ids = new Set(proposal.workItems.map((wi) => wi.id));
7
+ const byId = new Map(proposal.workItems.map((wi) => [wi.id, wi]));
8
+ for (const wi of proposal.workItems) {
9
+ for (const dep of wi.dependsOn) {
10
+ if (!ids.has(dep)) {
11
+ throw new Error(`fromPlanProposal: work item "${wi.title}" (${wi.id}) depends on unknown item id "${dep}" — the proposal is not internally consistent`);
12
+ }
13
+ }
14
+ }
15
+ // Iterative DFS cycle detection over ids (white/grey/black).
16
+ const state = new Map();
17
+ const onCycle = (id) => {
18
+ const title = byId.get(id)?.title ?? id;
19
+ throw new Error(`fromPlanProposal: dependency cycle detected involving work item "${title}" (${id}) — cannot assemble a workstream that would deadlock`);
20
+ };
21
+ const visit = (start) => {
22
+ const stack = [{ id: start, deps: byId.get(start)?.dependsOn ?? [], i: 0 }];
23
+ state.set(start, 'visiting');
24
+ while (stack.length > 0) {
25
+ const frame = stack[stack.length - 1];
26
+ if (frame.i >= frame.deps.length) {
27
+ state.set(frame.id, 'done');
28
+ stack.pop();
29
+ continue;
30
+ }
31
+ const next = frame.deps[frame.i++];
32
+ const seen = state.get(next);
33
+ if (seen === 'visiting')
34
+ onCycle(next);
35
+ if (seen === 'done')
36
+ continue;
37
+ state.set(next, 'visiting');
38
+ stack.push({ id: next, deps: byId.get(next)?.dependsOn ?? [], i: 0 });
39
+ }
40
+ };
41
+ for (const wi of proposal.workItems) {
42
+ if (!state.has(wi.id))
43
+ visit(wi.id);
44
+ }
45
+ }
46
+ /**
47
+ * Assemble a `CreateWorkstreamInput` from an approved multi-item PlanProposal.
48
+ * See the module doc for the full mapping and the assembly-time assertions.
49
+ */
50
+ export function fromPlanProposal(proposal, configManager, opts = {}) {
51
+ assertAcyclicAndResolved(proposal);
52
+ const commitScope = getWrfcCommitScope(configManager);
53
+ const capacity = Math.max(1, opts.capacity ?? proposal.workItems.length);
54
+ const items = proposal.workItems.map((wi) => ({
55
+ id: wi.id,
56
+ title: wi.title,
57
+ // The brief IS the actionable prompt context; the engineer phase runs it
58
+ // verbatim as the item's task, and review/fix phases see it alongside the
59
+ // title (buildPhaseTask, phase-runner.ts).
60
+ task: wi.brief,
61
+ ...(wi.dependsOn.length > 0 ? { dependsOn: [...wi.dependsOn] } : {}),
62
+ }));
63
+ const provenance = {
64
+ ...(proposal.decomposedBy ? { decomposedBy: proposal.decomposedBy } : {}),
65
+ proposalId: proposal.id,
66
+ strategy: proposal.strategy,
67
+ ...(proposal.agentCostUsd !== undefined ? { agentCostUsd: proposal.agentCostUsd } : {}),
68
+ ...(proposal.elapsedMs !== undefined ? { elapsedMs: proposal.elapsedMs } : {}),
69
+ };
70
+ return {
71
+ title: proposal.task,
72
+ phases: engineerReviewPhases(commitScope, capacity),
73
+ items,
74
+ provenance,
75
+ };
76
+ }
@@ -0,0 +1,64 @@
1
+ /** SDK-owned platform module. This implementation is maintained in goodvibes-sdk. */
2
+ /**
3
+ * Scheduler (Wave 4, wo701) — pure capacity-matching helpers, no side
4
+ * effects. The hard departure from WrfcController's pairwise
5
+ * engineer<->reviewer binding (startReview:883/startFix:1042): each tick,
6
+ * for every phase in ordinal order, free capacity slots (capacity minus
7
+ * in-flight) are filled from whichever waiting items are queued for that
8
+ * phase — an item advances the instant ITS gate passes, claimed by
9
+ * whatever slot happens to be free, never bound to a specific sibling item.
10
+ */
11
+ import type { Phase, WorkItem, Workstream } from './types.js';
12
+ export declare function sortedPhases(workstream: Workstream): Phase[];
13
+ export declare function firstPhase(workstream: Workstream): Phase | undefined;
14
+ /**
15
+ * The next phase in ORDINARY forward progression. Deliberately skips
16
+ * 'fix'-kind phases: a dynamically-inserted fix phase sits at an ordinal
17
+ * after its review (see engine.ts findOrInsertFixPhase) but is reachable
18
+ * ONLY via the explicit review-failure re-route, never as "what comes next"
19
+ * for an item whose review already passed — otherwise a later item that
20
+ * never needed fixing would wrongly detour through it.
21
+ */
22
+ export declare function nextPhaseAfter(workstream: Workstream, ordinal: number): Phase | undefined;
23
+ export declare function phaseById(workstream: Workstream, phaseId: string): Phase | undefined;
24
+ /** The nearest preceding review-kind phase — the return target after a dynamically-inserted fix phase's gate passes. Purely structural (survives serialization with zero extra bookkeeping). */
25
+ export declare function reviewPhaseBefore(workstream: Workstream, phase: Phase): Phase | undefined;
26
+ export interface PhaseClaim {
27
+ readonly item: WorkItem;
28
+ readonly phase: Phase;
29
+ }
30
+ /**
31
+ * Whether an item's inter-item dependencies (BIG-3 item 2) are all satisfied,
32
+ * and — when not — WHY, split into dependencies still in flight vs. ones that
33
+ * have terminally failed. Pure (no side effects): the engine's per-tick
34
+ * dependency pre-pass (applyDependencyGates, engine.ts) calls this and applies
35
+ * the state/blockedReason transition. Missing dependency ids (no item in the
36
+ * workstream matches) are ignored here — assembly (fromPlanProposal) already
37
+ * asserts referential integrity, so a dangling id at runtime is treated as
38
+ * "not blocking" rather than an eternal block.
39
+ */
40
+ export interface DependencyStatus {
41
+ /** True when every dependency has reached 'passed' (or there are none). */
42
+ readonly ready: boolean;
43
+ /** Titles of dependencies still pending/in flight (neither passed nor failed). */
44
+ readonly waiting: string[];
45
+ /** Titles of dependencies that have terminally FAILED — a recoverable block, not a terminal one for the dependent. */
46
+ readonly failed: string[];
47
+ }
48
+ export declare function dependencyStatus(workstream: Workstream, item: WorkItem): DependencyStatus;
49
+ /**
50
+ * Which (item, phase) pairs have free capacity to claim RIGHT NOW. Pure —
51
+ * no side effects, no budget check (the caller applies budget.checkBudget
52
+ * before actually claiming, since budget is a *decision*, not a capacity
53
+ * fact this function should own).
54
+ *
55
+ * 'blocked-budget' items are deliberately included in the waiting set, not
56
+ * just 'pending'/'awaiting-capacity': a budget block is a recoverable
57
+ * decision (see BudgetCeiling/WorkItemState docs, types.ts), never a
58
+ * capacity fact, so a previously-blocked item must be reconsidered on every
59
+ * tick the instant a slot is free — the caller's budget.checkBudget call
60
+ * re-decides it fresh each time, honestly re-blocking it if the ceiling
61
+ * still refuses.
62
+ */
63
+ export declare function computeClaims(workstream: Workstream): PhaseClaim[];
64
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../../src/platform/orchestration/scheduler.ts"],"names":[],"mappings":"AAAA,qFAAqF;AAErF;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE9D,wBAAgB,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,KAAK,EAAE,CAE5D;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,UAAU,GAAG,KAAK,GAAG,SAAS,CAEpE;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAEzF;AAED,wBAAgB,SAAS,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAEpF;AAED,gMAAgM;AAChM,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,SAAS,CAEzF;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,kFAAkF;IAClF,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAC3B,sHAAsH;IACtH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,gBAAgB,CAWzF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,EAAE,CAiBlE"}
@@ -0,0 +1,73 @@
1
+ /** SDK-owned platform module. This implementation is maintained in goodvibes-sdk. */
2
+ export function sortedPhases(workstream) {
3
+ return [...workstream.phases].sort((a, b) => a.ordinal - b.ordinal);
4
+ }
5
+ export function firstPhase(workstream) {
6
+ return sortedPhases(workstream)[0];
7
+ }
8
+ /**
9
+ * The next phase in ORDINARY forward progression. Deliberately skips
10
+ * 'fix'-kind phases: a dynamically-inserted fix phase sits at an ordinal
11
+ * after its review (see engine.ts findOrInsertFixPhase) but is reachable
12
+ * ONLY via the explicit review-failure re-route, never as "what comes next"
13
+ * for an item whose review already passed — otherwise a later item that
14
+ * never needed fixing would wrongly detour through it.
15
+ */
16
+ export function nextPhaseAfter(workstream, ordinal) {
17
+ return sortedPhases(workstream).find((p) => p.ordinal > ordinal && p.kind !== 'fix');
18
+ }
19
+ export function phaseById(workstream, phaseId) {
20
+ return workstream.phases.find((p) => p.id === phaseId);
21
+ }
22
+ /** The nearest preceding review-kind phase — the return target after a dynamically-inserted fix phase's gate passes. Purely structural (survives serialization with zero extra bookkeeping). */
23
+ export function reviewPhaseBefore(workstream, phase) {
24
+ return sortedPhases(workstream).filter((p) => p.ordinal < phase.ordinal && p.kind === 'review').pop();
25
+ }
26
+ export function dependencyStatus(workstream, item) {
27
+ const waiting = [];
28
+ const failed = [];
29
+ for (const depId of item.dependsOn) {
30
+ const dep = workstream.items.find((i) => i.id === depId);
31
+ if (!dep)
32
+ continue; // dangling id — assembly guarantees this can't happen; ignore rather than block forever
33
+ if (dep.state === 'passed')
34
+ continue;
35
+ if (dep.state === 'failed')
36
+ failed.push(dep.title);
37
+ else
38
+ waiting.push(dep.title);
39
+ }
40
+ return { ready: waiting.length === 0 && failed.length === 0, waiting, failed };
41
+ }
42
+ /**
43
+ * Which (item, phase) pairs have free capacity to claim RIGHT NOW. Pure —
44
+ * no side effects, no budget check (the caller applies budget.checkBudget
45
+ * before actually claiming, since budget is a *decision*, not a capacity
46
+ * fact this function should own).
47
+ *
48
+ * 'blocked-budget' items are deliberately included in the waiting set, not
49
+ * just 'pending'/'awaiting-capacity': a budget block is a recoverable
50
+ * decision (see BudgetCeiling/WorkItemState docs, types.ts), never a
51
+ * capacity fact, so a previously-blocked item must be reconsidered on every
52
+ * tick the instant a slot is free — the caller's budget.checkBudget call
53
+ * re-decides it fresh each time, honestly re-blocking it if the ceiling
54
+ * still refuses.
55
+ */
56
+ export function computeClaims(workstream) {
57
+ const claims = [];
58
+ for (const phase of sortedPhases(workstream)) {
59
+ const inFlight = workstream.items.filter((item) => item.currentPhaseId === phase.id && item.state === 'in-phase').length;
60
+ let free = phase.capacity - inFlight;
61
+ if (free <= 0)
62
+ continue;
63
+ const waiting = workstream.items.filter((item) => item.currentPhaseId === phase.id
64
+ && (item.state === 'pending' || item.state === 'awaiting-capacity' || item.state === 'blocked-budget'));
65
+ for (const item of waiting) {
66
+ if (free <= 0)
67
+ break;
68
+ claims.push({ item, phase });
69
+ free -= 1;
70
+ }
71
+ }
72
+ return claims;
73
+ }