@pellux/goodvibes-sdk 0.38.0 → 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 (474) 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/surfaces.d.ts +25 -3
  6. package/dist/events/surfaces.d.ts.map +1 -1
  7. package/dist/events/surfaces.js +22 -1
  8. package/dist/events/workflows.d.ts +7 -6
  9. package/dist/events/workflows.d.ts.map +1 -1
  10. package/dist/index.d.ts +1 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/platform/agents/archetypes.d.ts.map +1 -1
  13. package/dist/platform/agents/archetypes.js +7 -0
  14. package/dist/platform/agents/index.d.ts +1 -0
  15. package/dist/platform/agents/index.d.ts.map +1 -1
  16. package/dist/platform/agents/index.js +1 -0
  17. package/dist/platform/agents/orchestrator-runner.d.ts +13 -0
  18. package/dist/platform/agents/orchestrator-runner.d.ts.map +1 -1
  19. package/dist/platform/agents/orchestrator-runner.js +14 -0
  20. package/dist/platform/agents/orchestrator.d.ts +38 -6
  21. package/dist/platform/agents/orchestrator.d.ts.map +1 -1
  22. package/dist/platform/agents/orchestrator.js +66 -18
  23. package/dist/platform/agents/planner-decomposition-runner.d.ts +38 -0
  24. package/dist/platform/agents/planner-decomposition-runner.d.ts.map +1 -0
  25. package/dist/platform/agents/planner-decomposition-runner.js +113 -0
  26. package/dist/platform/agents/turn-knowledge-injection.d.ts +88 -3
  27. package/dist/platform/agents/turn-knowledge-injection.d.ts.map +1 -1
  28. package/dist/platform/agents/turn-knowledge-injection.js +147 -30
  29. package/dist/platform/agents/worktree.d.ts +126 -8
  30. package/dist/platform/agents/worktree.d.ts.map +1 -1
  31. package/dist/platform/agents/worktree.js +240 -19
  32. package/dist/platform/agents/wrfc-controller.d.ts +23 -0
  33. package/dist/platform/agents/wrfc-controller.d.ts.map +1 -1
  34. package/dist/platform/agents/wrfc-controller.js +158 -32
  35. package/dist/platform/agents/wrfc-gate-runtime.d.ts +9 -0
  36. package/dist/platform/agents/wrfc-gate-runtime.d.ts.map +1 -1
  37. package/dist/platform/agents/wrfc-gate-runtime.js +7 -3
  38. package/dist/platform/agents/wrfc-gates.d.ts +1 -1
  39. package/dist/platform/agents/wrfc-gates.d.ts.map +1 -1
  40. package/dist/platform/agents/wrfc-gates.js +7 -1
  41. package/dist/platform/agents/wrfc-types.d.ts +23 -3
  42. package/dist/platform/agents/wrfc-types.d.ts.map +1 -1
  43. package/dist/platform/automation/types.d.ts +9 -1
  44. package/dist/platform/automation/types.d.ts.map +1 -1
  45. package/dist/platform/calendar/calendar-api-shared.d.ts +25 -0
  46. package/dist/platform/calendar/calendar-api-shared.d.ts.map +1 -0
  47. package/dist/platform/calendar/calendar-api-shared.js +100 -0
  48. package/dist/platform/calendar/calendar-connector.d.ts +79 -0
  49. package/dist/platform/calendar/calendar-connector.d.ts.map +1 -0
  50. package/dist/platform/calendar/calendar-connector.js +155 -0
  51. package/dist/platform/calendar/google-calendar-api.d.ts +25 -0
  52. package/dist/platform/calendar/google-calendar-api.d.ts.map +1 -0
  53. package/dist/platform/calendar/google-calendar-api.js +89 -0
  54. package/dist/platform/calendar/http-fetch-adapter.d.ts +25 -0
  55. package/dist/platform/calendar/http-fetch-adapter.d.ts.map +1 -0
  56. package/dist/platform/calendar/http-fetch-adapter.js +25 -0
  57. package/dist/platform/calendar/ics-parser.d.ts +35 -0
  58. package/dist/platform/calendar/ics-parser.d.ts.map +1 -0
  59. package/dist/platform/calendar/ics-parser.js +236 -0
  60. package/dist/platform/calendar/index.d.ts +41 -0
  61. package/dist/platform/calendar/index.d.ts.map +1 -0
  62. package/dist/platform/calendar/index.js +49 -0
  63. package/dist/platform/calendar/merged-calendar-model.d.ts +67 -0
  64. package/dist/platform/calendar/merged-calendar-model.d.ts.map +1 -0
  65. package/dist/platform/calendar/merged-calendar-model.js +181 -0
  66. package/dist/platform/calendar/microsoft-graph-api.d.ts +25 -0
  67. package/dist/platform/calendar/microsoft-graph-api.d.ts.map +1 -0
  68. package/dist/platform/calendar/microsoft-graph-api.js +95 -0
  69. package/dist/platform/calendar/oauth-flow.d.ts +62 -0
  70. package/dist/platform/calendar/oauth-flow.d.ts.map +1 -0
  71. package/dist/platform/calendar/oauth-flow.js +305 -0
  72. package/dist/platform/calendar/oauth-providers.d.ts +43 -0
  73. package/dist/platform/calendar/oauth-providers.d.ts.map +1 -0
  74. package/dist/platform/calendar/oauth-providers.js +120 -0
  75. package/dist/platform/calendar/oauth-token-store.d.ts +72 -0
  76. package/dist/platform/calendar/oauth-token-store.d.ts.map +1 -0
  77. package/dist/platform/calendar/oauth-token-store.js +189 -0
  78. package/dist/platform/calendar/oauth-types.d.ts +274 -0
  79. package/dist/platform/calendar/oauth-types.d.ts.map +1 -0
  80. package/dist/platform/calendar/oauth-types.js +22 -0
  81. package/dist/platform/calendar/rrule.d.ts +39 -0
  82. package/dist/platform/calendar/rrule.d.ts.map +1 -0
  83. package/dist/platform/calendar/rrule.js +261 -0
  84. package/dist/platform/calendar/subscription-store.d.ts +118 -0
  85. package/dist/platform/calendar/subscription-store.d.ts.map +1 -0
  86. package/dist/platform/calendar/subscription-store.js +293 -0
  87. package/dist/platform/calendar/types.d.ts +170 -0
  88. package/dist/platform/calendar/types.d.ts.map +1 -0
  89. package/dist/platform/calendar/types.js +21 -0
  90. package/dist/platform/companion/companion-chat-attachments.d.ts +29 -0
  91. package/dist/platform/companion/companion-chat-attachments.d.ts.map +1 -0
  92. package/dist/platform/companion/companion-chat-attachments.js +121 -0
  93. package/dist/platform/companion/companion-chat-broker-bridge.d.ts +40 -0
  94. package/dist/platform/companion/companion-chat-broker-bridge.d.ts.map +1 -0
  95. package/dist/platform/companion/companion-chat-broker-bridge.js +14 -0
  96. package/dist/platform/companion/companion-chat-broker-sync.d.ts +38 -0
  97. package/dist/platform/companion/companion-chat-broker-sync.d.ts.map +1 -0
  98. package/dist/platform/companion/companion-chat-broker-sync.js +80 -0
  99. package/dist/platform/companion/companion-chat-gc.d.ts +63 -0
  100. package/dist/platform/companion/companion-chat-gc.d.ts.map +1 -0
  101. package/dist/platform/companion/companion-chat-gc.js +38 -0
  102. package/dist/platform/companion/companion-chat-manager.d.ts +67 -20
  103. package/dist/platform/companion/companion-chat-manager.d.ts.map +1 -1
  104. package/dist/platform/companion/companion-chat-manager.js +130 -144
  105. package/dist/platform/companion/companion-chat-persistence.d.ts +9 -1
  106. package/dist/platform/companion/companion-chat-persistence.d.ts.map +1 -1
  107. package/dist/platform/companion/companion-chat-persistence.js +10 -2
  108. package/dist/platform/companion/companion-chat-routes.d.ts +2 -1
  109. package/dist/platform/companion/companion-chat-routes.d.ts.map +1 -1
  110. package/dist/platform/companion/companion-chat-routes.js +37 -4
  111. package/dist/platform/config/credential-status.d.ts +28 -0
  112. package/dist/platform/config/credential-status.d.ts.map +1 -0
  113. package/dist/platform/config/credential-status.js +75 -0
  114. package/dist/platform/config/index.d.ts +25 -0
  115. package/dist/platform/config/index.d.ts.map +1 -1
  116. package/dist/platform/config/index.js +18 -0
  117. package/dist/platform/config/manager.d.ts +9 -0
  118. package/dist/platform/config/manager.d.ts.map +1 -1
  119. package/dist/platform/config/manager.js +21 -2
  120. package/dist/platform/config/migrations.d.ts +48 -0
  121. package/dist/platform/config/migrations.d.ts.map +1 -0
  122. package/dist/platform/config/migrations.js +54 -0
  123. package/dist/platform/config/schema-domain-core.d.ts +10 -1
  124. package/dist/platform/config/schema-domain-core.d.ts.map +1 -1
  125. package/dist/platform/config/schema-domain-core.js +46 -3
  126. package/dist/platform/config/schema-types.d.ts +13 -7
  127. package/dist/platform/config/schema-types.d.ts.map +1 -1
  128. package/dist/platform/config/schema.d.ts.map +1 -1
  129. package/dist/platform/config/schema.js +2 -0
  130. package/dist/platform/control-plane/approval-broker.d.ts +11 -0
  131. package/dist/platform/control-plane/approval-broker.d.ts.map +1 -1
  132. package/dist/platform/control-plane/approval-broker.js +17 -1
  133. package/dist/platform/control-plane/approval-hunk-apply.d.ts +77 -0
  134. package/dist/platform/control-plane/approval-hunk-apply.d.ts.map +1 -0
  135. package/dist/platform/control-plane/approval-hunk-apply.js +80 -0
  136. package/dist/platform/control-plane/gateway-disabled-response.d.ts +20 -0
  137. package/dist/platform/control-plane/gateway-disabled-response.d.ts.map +1 -0
  138. package/dist/platform/control-plane/gateway-disabled-response.js +24 -0
  139. package/dist/platform/control-plane/gateway-scope-enforcement.d.ts +68 -0
  140. package/dist/platform/control-plane/gateway-scope-enforcement.d.ts.map +1 -0
  141. package/dist/platform/control-plane/gateway-scope-enforcement.js +91 -0
  142. package/dist/platform/control-plane/gateway-utils.d.ts +17 -0
  143. package/dist/platform/control-plane/gateway-utils.d.ts.map +1 -1
  144. package/dist/platform/control-plane/gateway-utils.js +30 -0
  145. package/dist/platform/control-plane/gateway.d.ts +12 -2
  146. package/dist/platform/control-plane/gateway.d.ts.map +1 -1
  147. package/dist/platform/control-plane/gateway.js +27 -31
  148. package/dist/platform/control-plane/index.d.ts +6 -1
  149. package/dist/platform/control-plane/index.d.ts.map +1 -1
  150. package/dist/platform/control-plane/index.js +4 -0
  151. package/dist/platform/control-plane/invoke-input-validation.d.ts +56 -0
  152. package/dist/platform/control-plane/invoke-input-validation.d.ts.map +1 -0
  153. package/dist/platform/control-plane/invoke-input-validation.js +163 -0
  154. package/dist/platform/control-plane/method-catalog-admin.d.ts.map +1 -1
  155. package/dist/platform/control-plane/method-catalog-admin.js +12 -1
  156. package/dist/platform/control-plane/method-catalog-calendar.d.ts +16 -0
  157. package/dist/platform/control-plane/method-catalog-calendar.d.ts.map +1 -1
  158. package/dist/platform/control-plane/method-catalog-calendar.js +21 -0
  159. package/dist/platform/control-plane/method-catalog-channels.d.ts.map +1 -1
  160. package/dist/platform/control-plane/method-catalog-channels.js +32 -3
  161. package/dist/platform/control-plane/method-catalog-control-automation.d.ts.map +1 -1
  162. package/dist/platform/control-plane/method-catalog-control-automation.js +19 -34
  163. package/dist/platform/control-plane/method-catalog-control-companion.d.ts +15 -0
  164. package/dist/platform/control-plane/method-catalog-control-companion.d.ts.map +1 -0
  165. package/dist/platform/control-plane/method-catalog-control-companion.js +133 -0
  166. package/dist/platform/control-plane/method-catalog-control-core.d.ts.map +1 -1
  167. package/dist/platform/control-plane/method-catalog-control-core.js +104 -122
  168. package/dist/platform/control-plane/method-catalog-control.d.ts.map +1 -1
  169. package/dist/platform/control-plane/method-catalog-control.js +4 -0
  170. package/dist/platform/control-plane/method-catalog-email.d.ts +17 -0
  171. package/dist/platform/control-plane/method-catalog-email.d.ts.map +1 -1
  172. package/dist/platform/control-plane/method-catalog-email.js +21 -0
  173. package/dist/platform/control-plane/method-catalog-events.d.ts +28 -0
  174. package/dist/platform/control-plane/method-catalog-events.d.ts.map +1 -1
  175. package/dist/platform/control-plane/method-catalog-events.js +74 -1
  176. package/dist/platform/control-plane/method-catalog-fleet.d.ts +24 -0
  177. package/dist/platform/control-plane/method-catalog-fleet.d.ts.map +1 -0
  178. package/dist/platform/control-plane/method-catalog-fleet.js +65 -0
  179. package/dist/platform/control-plane/method-catalog-route-reconcile.d.ts +84 -0
  180. package/dist/platform/control-plane/method-catalog-route-reconcile.d.ts.map +1 -0
  181. package/dist/platform/control-plane/method-catalog-route-reconcile.js +103 -0
  182. package/dist/platform/control-plane/method-catalog-shared.d.ts +29 -0
  183. package/dist/platform/control-plane/method-catalog-shared.d.ts.map +1 -1
  184. package/dist/platform/control-plane/method-catalog.d.ts +9 -0
  185. package/dist/platform/control-plane/method-catalog.d.ts.map +1 -1
  186. package/dist/platform/control-plane/method-catalog.js +32 -3
  187. package/dist/platform/control-plane/operator-contract-schemas-admin.d.ts +8 -0
  188. package/dist/platform/control-plane/operator-contract-schemas-admin.d.ts.map +1 -1
  189. package/dist/platform/control-plane/operator-contract-schemas-admin.js +22 -1
  190. package/dist/platform/control-plane/operator-contract-schemas-fleet.d.ts +18 -0
  191. package/dist/platform/control-plane/operator-contract-schemas-fleet.d.ts.map +1 -0
  192. package/dist/platform/control-plane/operator-contract-schemas-fleet.js +182 -0
  193. package/dist/platform/control-plane/operator-contract-schemas-permissions.d.ts.map +1 -1
  194. package/dist/platform/control-plane/operator-contract-schemas-permissions.js +5 -0
  195. package/dist/platform/control-plane/operator-contract-schemas-runtime.d.ts +29 -0
  196. package/dist/platform/control-plane/operator-contract-schemas-runtime.d.ts.map +1 -1
  197. package/dist/platform/control-plane/operator-contract-schemas-runtime.js +57 -3
  198. package/dist/platform/control-plane/operator-contract-schemas.d.ts +1 -0
  199. package/dist/platform/control-plane/operator-contract-schemas.d.ts.map +1 -1
  200. package/dist/platform/control-plane/operator-contract-schemas.js +1 -0
  201. package/dist/platform/control-plane/operator-contract.d.ts.map +1 -1
  202. package/dist/platform/control-plane/operator-contract.js +8 -0
  203. package/dist/platform/control-plane/routes/checkpoints.d.ts +39 -0
  204. package/dist/platform/control-plane/routes/checkpoints.d.ts.map +1 -0
  205. package/dist/platform/control-plane/routes/checkpoints.js +166 -0
  206. package/dist/platform/control-plane/routes/fleet.d.ts +53 -0
  207. package/dist/platform/control-plane/routes/fleet.d.ts.map +1 -0
  208. package/dist/platform/control-plane/routes/fleet.js +153 -0
  209. package/dist/platform/control-plane/routes/gateway-verb-error.d.ts +30 -0
  210. package/dist/platform/control-plane/routes/gateway-verb-error.d.ts.map +1 -0
  211. package/dist/platform/control-plane/routes/gateway-verb-error.js +36 -0
  212. package/dist/platform/control-plane/routes/index.d.ts +0 -6
  213. package/dist/platform/control-plane/routes/index.d.ts.map +1 -1
  214. package/dist/platform/control-plane/routes/index.js +5 -5
  215. package/dist/platform/control-plane/routes/invocation-params.d.ts +23 -0
  216. package/dist/platform/control-plane/routes/invocation-params.d.ts.map +1 -0
  217. package/dist/platform/control-plane/routes/invocation-params.js +9 -0
  218. package/dist/platform/control-plane/routes/register-w3-s2.d.ts +26 -0
  219. package/dist/platform/control-plane/routes/register-w3-s2.d.ts.map +1 -0
  220. package/dist/platform/control-plane/routes/register-w3-s2.js +8 -0
  221. package/dist/platform/control-plane/routes/session-search.d.ts +37 -0
  222. package/dist/platform/control-plane/routes/session-search.d.ts.map +1 -0
  223. package/dist/platform/control-plane/routes/session-search.js +113 -0
  224. package/dist/platform/control-plane/session-broker-gc.d.ts +16 -0
  225. package/dist/platform/control-plane/session-broker-gc.d.ts.map +1 -1
  226. package/dist/platform/control-plane/session-broker-gc.js +23 -6
  227. package/dist/platform/control-plane/session-broker-helpers.d.ts +3 -3
  228. package/dist/platform/control-plane/session-broker-helpers.d.ts.map +1 -1
  229. package/dist/platform/control-plane/session-broker-inputs.d.ts +18 -0
  230. package/dist/platform/control-plane/session-broker-inputs.d.ts.map +1 -1
  231. package/dist/platform/control-plane/session-broker-inputs.js +34 -0
  232. package/dist/platform/control-plane/session-broker-sessions.d.ts +102 -3
  233. package/dist/platform/control-plane/session-broker-sessions.d.ts.map +1 -1
  234. package/dist/platform/control-plane/session-broker-sessions.js +179 -5
  235. package/dist/platform/control-plane/session-broker-state.d.ts +20 -1
  236. package/dist/platform/control-plane/session-broker-state.d.ts.map +1 -1
  237. package/dist/platform/control-plane/session-broker-state.js +67 -5
  238. package/dist/platform/control-plane/session-broker.d.ts +51 -38
  239. package/dist/platform/control-plane/session-broker.d.ts.map +1 -1
  240. package/dist/platform/control-plane/session-broker.js +183 -75
  241. package/dist/platform/control-plane/session-store-importer.d.ts +57 -0
  242. package/dist/platform/control-plane/session-store-importer.d.ts.map +1 -0
  243. package/dist/platform/control-plane/session-store-importer.js +227 -0
  244. package/dist/platform/control-plane/session-types.d.ts +142 -7
  245. package/dist/platform/control-plane/session-types.d.ts.map +1 -1
  246. package/dist/platform/core/execution-plan.d.ts +43 -1
  247. package/dist/platform/core/execution-plan.d.ts.map +1 -1
  248. package/dist/platform/core/execution-plan.js +46 -10
  249. package/dist/platform/core/index.d.ts +1 -0
  250. package/dist/platform/core/index.d.ts.map +1 -1
  251. package/dist/platform/core/index.js +1 -0
  252. package/dist/platform/core/orchestrator-runtime.d.ts +21 -1
  253. package/dist/platform/core/orchestrator-runtime.d.ts.map +1 -1
  254. package/dist/platform/core/orchestrator-tool-runtime.d.ts +7 -0
  255. package/dist/platform/core/orchestrator-tool-runtime.d.ts.map +1 -1
  256. package/dist/platform/core/orchestrator-tool-runtime.js +10 -0
  257. package/dist/platform/core/orchestrator-turn-loop.d.ts +8 -1
  258. package/dist/platform/core/orchestrator-turn-loop.d.ts.map +1 -1
  259. package/dist/platform/core/orchestrator-turn-loop.js +6 -0
  260. package/dist/platform/core/orchestrator.d.ts +6 -0
  261. package/dist/platform/core/orchestrator.d.ts.map +1 -1
  262. package/dist/platform/core/orchestrator.js +15 -0
  263. package/dist/platform/core/plan-decomposition.d.ts +196 -0
  264. package/dist/platform/core/plan-decomposition.d.ts.map +1 -0
  265. package/dist/platform/core/plan-decomposition.js +417 -0
  266. package/dist/platform/core/plan-proposal.d.ts +39 -0
  267. package/dist/platform/core/plan-proposal.d.ts.map +1 -1
  268. package/dist/platform/core/wrfc-routing.d.ts +1 -0
  269. package/dist/platform/core/wrfc-routing.d.ts.map +1 -1
  270. package/dist/platform/core/wrfc-routing.js +51 -1
  271. package/dist/platform/daemon/boot.d.ts +63 -0
  272. package/dist/platform/daemon/boot.d.ts.map +1 -0
  273. package/dist/platform/daemon/boot.js +60 -0
  274. package/dist/platform/daemon/cli.js +2 -1
  275. package/dist/platform/daemon/control-plane.d.ts.map +1 -1
  276. package/dist/platform/daemon/control-plane.js +50 -1
  277. package/dist/platform/daemon/facade-composition.d.ts.map +1 -1
  278. package/dist/platform/daemon/facade-composition.js +6 -0
  279. package/dist/platform/daemon/facade.d.ts +18 -6
  280. package/dist/platform/daemon/facade.d.ts.map +1 -1
  281. package/dist/platform/daemon/facade.js +50 -43
  282. package/dist/platform/daemon/http/router-route-contexts.d.ts +1 -0
  283. package/dist/platform/daemon/http/router-route-contexts.d.ts.map +1 -1
  284. package/dist/platform/daemon/http/router-route-contexts.js +1 -0
  285. package/dist/platform/daemon/http/router-session-broker-adapter.d.ts +13 -0
  286. package/dist/platform/daemon/http/router-session-broker-adapter.d.ts.map +1 -0
  287. package/dist/platform/daemon/http/router-session-broker-adapter.js +27 -0
  288. package/dist/platform/daemon/http/router.d.ts +1 -1
  289. package/dist/platform/daemon/http/router.d.ts.map +1 -1
  290. package/dist/platform/daemon/http/router.js +7 -22
  291. package/dist/platform/daemon/http/runtime-route-types.d.ts +42 -4
  292. package/dist/platform/daemon/http/runtime-route-types.d.ts.map +1 -1
  293. package/dist/platform/daemon/index.d.ts +2 -0
  294. package/dist/platform/daemon/index.d.ts.map +1 -1
  295. package/dist/platform/daemon/index.js +1 -0
  296. package/dist/platform/daemon/service-manager.d.ts +16 -0
  297. package/dist/platform/daemon/service-manager.d.ts.map +1 -1
  298. package/dist/platform/daemon/service-manager.js +79 -15
  299. package/dist/platform/intelligence/tree-sitter/service.d.ts.map +1 -1
  300. package/dist/platform/intelligence/tree-sitter/service.js +16 -2
  301. package/dist/platform/knowledge/browser-history/readers.d.ts.map +1 -1
  302. package/dist/platform/knowledge/browser-history/readers.js +15 -5
  303. package/dist/platform/knowledge/project-planning/service.d.ts +14 -1
  304. package/dist/platform/knowledge/project-planning/service.d.ts.map +1 -1
  305. package/dist/platform/knowledge/project-planning/service.js +77 -0
  306. package/dist/platform/knowledge/project-planning/types.d.ts +32 -0
  307. package/dist/platform/knowledge/project-planning/types.d.ts.map +1 -1
  308. package/dist/platform/orchestration/bookkeeping.d.ts +12 -0
  309. package/dist/platform/orchestration/bookkeeping.d.ts.map +1 -0
  310. package/dist/platform/orchestration/bookkeeping.js +91 -0
  311. package/dist/platform/orchestration/controller-compat.d.ts +14 -0
  312. package/dist/platform/orchestration/controller-compat.d.ts.map +1 -1
  313. package/dist/platform/orchestration/controller-compat.js +18 -4
  314. package/dist/platform/orchestration/engine.d.ts +26 -1
  315. package/dist/platform/orchestration/engine.d.ts.map +1 -1
  316. package/dist/platform/orchestration/engine.js +226 -21
  317. package/dist/platform/orchestration/index.d.ts +6 -4
  318. package/dist/platform/orchestration/index.d.ts.map +1 -1
  319. package/dist/platform/orchestration/index.js +3 -2
  320. package/dist/platform/orchestration/persistence.d.ts.map +1 -1
  321. package/dist/platform/orchestration/persistence.js +4 -1
  322. package/dist/platform/orchestration/phase-runner.d.ts +29 -2
  323. package/dist/platform/orchestration/phase-runner.d.ts.map +1 -1
  324. package/dist/platform/orchestration/phase-runner.js +98 -25
  325. package/dist/platform/orchestration/proposal-workstream.d.ts +56 -0
  326. package/dist/platform/orchestration/proposal-workstream.d.ts.map +1 -0
  327. package/dist/platform/orchestration/proposal-workstream.js +76 -0
  328. package/dist/platform/orchestration/scheduler.d.ts +19 -0
  329. package/dist/platform/orchestration/scheduler.d.ts.map +1 -1
  330. package/dist/platform/orchestration/scheduler.js +16 -0
  331. package/dist/platform/orchestration/types.d.ts +286 -1
  332. package/dist/platform/orchestration/types.d.ts.map +1 -1
  333. package/dist/platform/orchestration/types.js +32 -0
  334. package/dist/platform/orchestration/worktree-isolation.d.ts +33 -0
  335. package/dist/platform/orchestration/worktree-isolation.d.ts.map +1 -0
  336. package/dist/platform/orchestration/worktree-isolation.js +248 -0
  337. package/dist/platform/presentation/glyphs.d.ts +91 -0
  338. package/dist/platform/presentation/glyphs.d.ts.map +1 -0
  339. package/dist/platform/presentation/glyphs.js +93 -0
  340. package/dist/platform/presentation/index.d.ts +28 -0
  341. package/dist/platform/presentation/index.d.ts.map +1 -0
  342. package/dist/platform/presentation/index.js +27 -0
  343. package/dist/platform/presentation/thinking-phrases.d.ts +12 -0
  344. package/dist/platform/presentation/thinking-phrases.d.ts.map +1 -0
  345. package/dist/platform/presentation/thinking-phrases.js +32 -0
  346. package/dist/platform/presentation/tones.d.ts +121 -0
  347. package/dist/platform/presentation/tones.d.ts.map +1 -0
  348. package/dist/platform/presentation/tones.js +145 -0
  349. package/dist/platform/presentation/waiting-wording.d.ts +54 -0
  350. package/dist/platform/presentation/waiting-wording.d.ts.map +1 -0
  351. package/dist/platform/presentation/waiting-wording.js +51 -0
  352. package/dist/platform/providers/runtime-snapshot.d.ts.map +1 -1
  353. package/dist/platform/providers/runtime-snapshot.js +12 -2
  354. package/dist/platform/runtime/bootstrap-services.d.ts +62 -2
  355. package/dist/platform/runtime/bootstrap-services.d.ts.map +1 -1
  356. package/dist/platform/runtime/bootstrap-services.js +217 -50
  357. package/dist/platform/runtime/daemon-version-compat.d.ts +39 -0
  358. package/dist/platform/runtime/daemon-version-compat.d.ts.map +1 -0
  359. package/dist/platform/runtime/daemon-version-compat.js +75 -0
  360. package/dist/platform/runtime/detached-daemon-runtime.d.ts +26 -0
  361. package/dist/platform/runtime/detached-daemon-runtime.d.ts.map +1 -0
  362. package/dist/platform/runtime/detached-daemon-runtime.js +49 -0
  363. package/dist/platform/runtime/emitters/workflows.d.ts +1 -1
  364. package/dist/platform/runtime/emitters/workflows.d.ts.map +1 -1
  365. package/dist/platform/runtime/events/index.d.ts +13 -0
  366. package/dist/platform/runtime/events/index.d.ts.map +1 -1
  367. package/dist/platform/runtime/events/index.js +13 -0
  368. package/dist/platform/runtime/feature-flags/flags.d.ts.map +1 -1
  369. package/dist/platform/runtime/feature-flags/flags.js +39 -1
  370. package/dist/platform/runtime/fleet/adapters/orchestration.d.ts +40 -18
  371. package/dist/platform/runtime/fleet/adapters/orchestration.d.ts.map +1 -1
  372. package/dist/platform/runtime/fleet/adapters/orchestration.js +138 -34
  373. package/dist/platform/runtime/fleet/adapters/wrfc.d.ts +13 -0
  374. package/dist/platform/runtime/fleet/adapters/wrfc.d.ts.map +1 -1
  375. package/dist/platform/runtime/fleet/adapters/wrfc.js +48 -1
  376. package/dist/platform/runtime/fleet/registry.d.ts.map +1 -1
  377. package/dist/platform/runtime/fleet/registry.js +38 -4
  378. package/dist/platform/runtime/operator-client.d.ts +20 -2
  379. package/dist/platform/runtime/operator-client.d.ts.map +1 -1
  380. package/dist/platform/runtime/operator-client.js +11 -1
  381. package/dist/platform/runtime/provider-accounts/registry.d.ts.map +1 -1
  382. package/dist/platform/runtime/provider-accounts/registry.js +11 -1
  383. package/dist/platform/runtime/services.d.ts +9 -7
  384. package/dist/platform/runtime/services.d.ts.map +1 -1
  385. package/dist/platform/runtime/services.js +19 -4
  386. package/dist/platform/runtime/session-spine/client.d.ts +234 -0
  387. package/dist/platform/runtime/session-spine/client.d.ts.map +1 -0
  388. package/dist/platform/runtime/session-spine/client.js +449 -0
  389. package/dist/platform/runtime/session-spine/index.d.ts +12 -0
  390. package/dist/platform/runtime/session-spine/index.d.ts.map +1 -0
  391. package/dist/platform/runtime/session-spine/index.js +11 -0
  392. package/dist/platform/runtime/session-spine/union-cache.d.ts +225 -0
  393. package/dist/platform/runtime/session-spine/union-cache.d.ts.map +1 -0
  394. package/dist/platform/runtime/session-spine/union-cache.js +333 -0
  395. package/dist/platform/runtime/shell-command-ops.d.ts +3 -1
  396. package/dist/platform/runtime/shell-command-ops.d.ts.map +1 -1
  397. package/dist/platform/runtime/transports/daemon-http-client-validators.d.ts.map +1 -1
  398. package/dist/platform/runtime/transports/daemon-http-client-validators.js +22 -0
  399. package/dist/platform/runtime/transports/daemon-http-client.d.ts.map +1 -1
  400. package/dist/platform/runtime/transports/daemon-http-client.js +25 -2
  401. package/dist/platform/runtime/transports/http-types.d.ts +9 -2
  402. package/dist/platform/runtime/transports/http-types.d.ts.map +1 -1
  403. package/dist/platform/state/canonical-memory.d.ts +95 -0
  404. package/dist/platform/state/canonical-memory.d.ts.map +1 -0
  405. package/dist/platform/state/canonical-memory.js +155 -0
  406. package/dist/platform/state/code-index-reindex.d.ts +73 -0
  407. package/dist/platform/state/code-index-reindex.d.ts.map +1 -0
  408. package/dist/platform/state/code-index-reindex.js +156 -0
  409. package/dist/platform/state/code-index-store.d.ts.map +1 -1
  410. package/dist/platform/state/code-index-store.js +10 -2
  411. package/dist/platform/state/index.d.ts +8 -0
  412. package/dist/platform/state/index.d.ts.map +1 -1
  413. package/dist/platform/state/index.js +4 -0
  414. package/dist/platform/state/memory-recall-contract.d.ts +63 -0
  415. package/dist/platform/state/memory-recall-contract.d.ts.map +1 -0
  416. package/dist/platform/state/memory-recall-contract.js +94 -0
  417. package/dist/platform/state/memory-store.d.ts +2 -0
  418. package/dist/platform/state/memory-store.d.ts.map +1 -1
  419. package/dist/platform/state/memory-store.js +4 -0
  420. package/dist/platform/state/memory-vector-store.d.ts.map +1 -1
  421. package/dist/platform/state/memory-vector-store.js +13 -2
  422. package/dist/platform/state/sqlite-store.d.ts +2 -0
  423. package/dist/platform/state/sqlite-store.d.ts.map +1 -1
  424. package/dist/platform/state/sqlite-store.js +4 -0
  425. package/dist/platform/state/vibe-projection.d.ts +67 -0
  426. package/dist/platform/state/vibe-projection.d.ts.map +1 -0
  427. package/dist/platform/state/vibe-projection.js +115 -0
  428. package/dist/platform/tools/agent/index.d.ts.map +1 -1
  429. package/dist/platform/tools/agent/index.js +8 -0
  430. package/dist/platform/tools/agent/manager.d.ts +12 -0
  431. package/dist/platform/tools/agent/manager.d.ts.map +1 -1
  432. package/dist/platform/tools/agent/manager.js +6 -0
  433. package/dist/platform/tools/agent/schema.d.ts +26 -0
  434. package/dist/platform/tools/agent/schema.d.ts.map +1 -1
  435. package/dist/platform/tools/agent/schema.js +2 -2
  436. package/dist/platform/tools/agent/wrfc-batch-policy.d.ts +13 -0
  437. package/dist/platform/tools/agent/wrfc-batch-policy.d.ts.map +1 -1
  438. package/dist/platform/tools/agent/wrfc-batch-policy.js +60 -0
  439. package/dist/platform/tools/exec/runtime.d.ts +10 -0
  440. package/dist/platform/tools/exec/runtime.d.ts.map +1 -1
  441. package/dist/platform/tools/exec/runtime.js +22 -5
  442. package/dist/platform/tools/exec/schema.d.ts +1 -1
  443. package/dist/platform/tools/exec/schema.d.ts.map +1 -1
  444. package/dist/platform/tools/exec/schema.js +2 -1
  445. package/dist/platform/tools/index.d.ts +2 -0
  446. package/dist/platform/tools/index.d.ts.map +1 -1
  447. package/dist/platform/tools/index.js +2 -0
  448. package/dist/platform/tools/state/index.d.ts +9 -0
  449. package/dist/platform/tools/state/index.d.ts.map +1 -1
  450. package/dist/platform/tools/state/index.js +60 -3
  451. package/dist/platform/types/foundation-contract.d.ts +1 -1
  452. package/dist/platform/types/foundation-contract.d.ts.map +1 -1
  453. package/dist/platform/types/index.d.ts +1 -1
  454. package/dist/platform/types/index.d.ts.map +1 -1
  455. package/dist/platform/version.js +1 -1
  456. package/package.json +21 -9
  457. package/dist/platform/control-plane/routes/automation.d.ts +0 -3
  458. package/dist/platform/control-plane/routes/automation.d.ts.map +0 -1
  459. package/dist/platform/control-plane/routes/automation.js +0 -63
  460. package/dist/platform/control-plane/routes/context.d.ts +0 -2
  461. package/dist/platform/control-plane/routes/context.d.ts.map +0 -1
  462. package/dist/platform/control-plane/routes/context.js +0 -1
  463. package/dist/platform/control-plane/routes/operator.d.ts +0 -8
  464. package/dist/platform/control-plane/routes/operator.d.ts.map +0 -1
  465. package/dist/platform/control-plane/routes/operator.js +0 -415
  466. package/dist/platform/control-plane/routes/remote.d.ts +0 -3
  467. package/dist/platform/control-plane/routes/remote.d.ts.map +0 -1
  468. package/dist/platform/control-plane/routes/remote.js +0 -35
  469. package/dist/platform/control-plane/routes/sessions.d.ts +0 -3
  470. package/dist/platform/control-plane/routes/sessions.d.ts.map +0 -1
  471. package/dist/platform/control-plane/routes/sessions.js +0 -43
  472. package/dist/platform/control-plane/routes/tasks.d.ts +0 -3
  473. package/dist/platform/control-plane/routes/tasks.d.ts.map +0 -1
  474. package/dist/platform/control-plane/routes/tasks.js +0 -22
@@ -0,0 +1,417 @@
1
+ /**
2
+ * Agent-driven goal decomposition for the planner.
3
+ *
4
+ * This module is the model-decomposition counterpart to the deterministic
5
+ * heuristic path in `plan-proposal.ts`. Given a goal, it drives a bounded,
6
+ * READ-ONLY planning agent (through the injected `DecompositionRunner` seam —
7
+ * this module never imports the agent machinery, so it stays in `core` and is
8
+ * fully unit-testable with a stubbed runner), parses and STRICTLY validates
9
+ * the agent's structured output, and produces a `PlanProposal` tagged with
10
+ * honest provenance.
11
+ *
12
+ * Failure honesty is the whole point: a spawn error, a timeout/cancellation,
13
+ * or output that is still malformed after ONE repair attempt all fall back to
14
+ * the existing heuristic `singleItemProposal` path, tagged
15
+ * `decomposedBy: 'heuristic'` with a `fallbackReason`. The heuristic path is
16
+ * reused verbatim — `singleItemProposal`/`assemblePlanProposal` are never
17
+ * modified — so their existing byte-for-byte test expectations are preserved;
18
+ * provenance is layered on afterward.
19
+ *
20
+ * The module NEVER performs surgery on agent output to force it to validate:
21
+ * a proposal is accepted only when `assemblePlanProposal` reports ZERO issues
22
+ * (no dangling dependency, no dependency cycle, no unresolved phase). Anything
23
+ * short of that is one repair attempt and then an honest fallback — never a
24
+ * silent edit that drops or rewrites the agent's work items.
25
+ */
26
+ import { AdaptivePlanner } from './adaptive-planner.js';
27
+ import { assemblePlanProposal, singleItemProposal, } from './plan-proposal.js';
28
+ /** Pull the first balanced JSON object out of arbitrary agent text (fenced or not). */
29
+ function extractJsonObject(text) {
30
+ const fenced = text.match(/```(?:json)?\s*([\s\S]*?)```/i);
31
+ const haystack = fenced?.[1] ?? text;
32
+ const start = haystack.indexOf('{');
33
+ if (start === -1)
34
+ return null;
35
+ let depth = 0;
36
+ let inString = false;
37
+ let escaped = false;
38
+ for (let i = start; i < haystack.length; i++) {
39
+ const ch = haystack[i];
40
+ if (inString) {
41
+ if (escaped) {
42
+ escaped = false;
43
+ }
44
+ else if (ch === '\\') {
45
+ escaped = true;
46
+ }
47
+ else if (ch === '"') {
48
+ inString = false;
49
+ }
50
+ continue;
51
+ }
52
+ if (ch === '"') {
53
+ inString = true;
54
+ continue;
55
+ }
56
+ if (ch === '{')
57
+ depth++;
58
+ else if (ch === '}') {
59
+ depth--;
60
+ if (depth === 0)
61
+ return haystack.slice(start, i + 1);
62
+ }
63
+ }
64
+ return null;
65
+ }
66
+ function isNonEmptyString(value) {
67
+ return typeof value === 'string' && value.trim().length > 0;
68
+ }
69
+ /**
70
+ * Parse + strictly validate a planning agent's output text into a
71
+ * `RawDecomposition` the assembler can consume. Never throws; every problem is
72
+ * accumulated into `errors` so a single repair prompt can address them all at
73
+ * once. Structural rejects: unparseable JSON, empty/absent items array, empty
74
+ * item title/brief, non-finite ordinal, empty phase title.
75
+ */
76
+ export function parseDecomposition(text) {
77
+ const errors = [];
78
+ const json = extractJsonObject(text ?? '');
79
+ if (!json) {
80
+ return { ok: false, errors: ['Output did not contain a JSON object.'] };
81
+ }
82
+ let parsed;
83
+ try {
84
+ parsed = JSON.parse(json);
85
+ }
86
+ catch (err) {
87
+ return { ok: false, errors: [`Output was not valid JSON: ${err.message}`] };
88
+ }
89
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
90
+ return { ok: false, errors: ['Top-level value must be a JSON object.'] };
91
+ }
92
+ const obj = parsed;
93
+ const rawItems = obj.items;
94
+ if (!Array.isArray(rawItems) || rawItems.length === 0) {
95
+ return { ok: false, errors: ['"items" must be a non-empty array.'] };
96
+ }
97
+ // Validate phases (optional).
98
+ const rawPhases = Array.isArray(obj.phases) ? obj.phases : [];
99
+ rawPhases.forEach((p, i) => {
100
+ if (typeof p !== 'object' || p === null || !isNonEmptyString(p.title)) {
101
+ errors.push(`phases[${i}] must have a non-empty "title".`);
102
+ }
103
+ });
104
+ // Validate items.
105
+ const items = [];
106
+ rawItems.forEach((raw, i) => {
107
+ if (typeof raw !== 'object' || raw === null) {
108
+ errors.push(`items[${i}] must be an object.`);
109
+ return;
110
+ }
111
+ const item = raw;
112
+ if (!isNonEmptyString(item.title))
113
+ errors.push(`items[${i}].title must be a non-empty string.`);
114
+ if (!isNonEmptyString(item.brief))
115
+ errors.push(`items[${i}].brief must be a non-empty string.`);
116
+ if (typeof item.ordinal !== 'number' || !Number.isFinite(item.ordinal)) {
117
+ errors.push(`items[${i}].ordinal must be a finite number.`);
118
+ }
119
+ if (item.phase !== undefined && !isNonEmptyString(item.phase)) {
120
+ errors.push(`items[${i}].phase, when present, must be a non-empty string.`);
121
+ }
122
+ if (isNonEmptyString(item.title) && isNonEmptyString(item.brief) && typeof item.ordinal === 'number' && Number.isFinite(item.ordinal)) {
123
+ items.push({
124
+ title: item.title,
125
+ brief: item.brief,
126
+ ordinal: item.ordinal,
127
+ ...(isNonEmptyString(item.phase) ? { phase: item.phase } : {}),
128
+ ...(Array.isArray(item.dependsOn) ? { dependsOn: item.dependsOn.filter((d) => typeof d === 'string' || typeof d === 'number') } : {}),
129
+ ...(isNonEmptyString(item.suggestedArchetype) ? { suggestedArchetype: item.suggestedArchetype } : {}),
130
+ ...(Array.isArray(item.likelyFiles) ? { likelyFiles: item.likelyFiles.filter(isNonEmptyString) } : {}),
131
+ ...(Array.isArray(item.verification) ? { verification: item.verification.filter(isNonEmptyString) } : {}),
132
+ ...(typeof item.canRunConcurrently === 'boolean' ? { canRunConcurrently: item.canRunConcurrently } : {}),
133
+ ...(typeof item.needsReview === 'boolean' ? { needsReview: item.needsReview } : {}),
134
+ });
135
+ }
136
+ });
137
+ if (errors.length > 0) {
138
+ return { ok: false, errors };
139
+ }
140
+ const notes = [];
141
+ if (Array.isArray(obj.notes))
142
+ notes.push(...obj.notes.filter(isNonEmptyString));
143
+ if (Array.isArray(obj.risks))
144
+ notes.push(...obj.risks.filter(isNonEmptyString));
145
+ const output = {
146
+ items,
147
+ ...(rawPhases.length > 0 ? { phases: rawPhases } : {}),
148
+ ...(Array.isArray(obj.dependencies) ? { dependencies: obj.dependencies } : {}),
149
+ };
150
+ return { ok: true, raw: toRawDecomposition(output), ...(notes.length > 0 ? { notes } : {}), errors: [] };
151
+ }
152
+ const DEFAULT_PHASE_TITLE = 'Execute';
153
+ /**
154
+ * Map a validated `DecompositionAgentOutput` into the `RawDecomposition` shape
155
+ * `assemblePlanProposal` consumes. Items are ordered by `ordinal` (stable on
156
+ * ties). Every referenced phase is materialized so the assembler never has to
157
+ * synthesize an "Unphased" bucket — an unresolved phase from here would be a
158
+ * real bug, not agent sloppiness. Ordinal-based dependency references are
159
+ * resolved to titles so the assembler's title resolver handles them uniformly.
160
+ */
161
+ export function toRawDecomposition(output) {
162
+ const ordered = [...output.items].sort((a, b) => a.ordinal - b.ordinal);
163
+ const ordinalToTitle = new Map();
164
+ for (const item of ordered) {
165
+ if (!ordinalToTitle.has(item.ordinal))
166
+ ordinalToTitle.set(item.ordinal, item.title);
167
+ }
168
+ const resolveRef = (ref) => {
169
+ if (typeof ref === 'number')
170
+ return ordinalToTitle.get(ref) ?? String(ref);
171
+ const asNum = Number(ref);
172
+ if (ref.trim() !== '' && Number.isFinite(asNum) && ordinalToTitle.has(asNum))
173
+ return ordinalToTitle.get(asNum);
174
+ return ref;
175
+ };
176
+ // Phase set: explicit phases first, then any item phase titles not covered,
177
+ // then the default shared phase if any item lacks one.
178
+ const phaseTitles = [];
179
+ const seenPhase = new Set();
180
+ const addPhase = (title) => {
181
+ const key = title.toLowerCase().trim();
182
+ if (!seenPhase.has(key)) {
183
+ seenPhase.add(key);
184
+ phaseTitles.push(title);
185
+ }
186
+ };
187
+ const explicit = new Map();
188
+ for (const p of output.phases ?? []) {
189
+ explicit.set(p.title.toLowerCase().trim(), p);
190
+ addPhase(p.title);
191
+ }
192
+ let needsDefault = false;
193
+ for (const item of ordered) {
194
+ if (item.phase)
195
+ addPhase(item.phase);
196
+ else
197
+ needsDefault = true;
198
+ }
199
+ if (needsDefault)
200
+ addPhase(DEFAULT_PHASE_TITLE);
201
+ const phases = phaseTitles.map((title) => {
202
+ const meta = explicit.get(title.toLowerCase().trim());
203
+ return meta?.description ? { title, description: meta.description } : { title };
204
+ });
205
+ // Accumulate dependencies: inline dependsOn plus explicit edges.
206
+ const depsByTitle = new Map();
207
+ const addDep = (from, to) => {
208
+ const key = from.toLowerCase().trim();
209
+ if (!depsByTitle.has(key))
210
+ depsByTitle.set(key, new Set());
211
+ depsByTitle.get(key).add(to);
212
+ };
213
+ for (const item of ordered) {
214
+ for (const dep of item.dependsOn ?? [])
215
+ addDep(item.title, resolveRef(dep));
216
+ }
217
+ for (const edge of output.dependencies ?? [])
218
+ addDep(resolveRef(edge.from), resolveRef(edge.to));
219
+ const workItems = ordered.map((item) => {
220
+ const deps = depsByTitle.get(item.title.toLowerCase().trim());
221
+ return {
222
+ title: item.title,
223
+ brief: item.brief,
224
+ phase: item.phase ?? DEFAULT_PHASE_TITLE,
225
+ ...(deps && deps.size > 0 ? { dependsOn: [...deps] } : {}),
226
+ ...(item.suggestedArchetype ? { suggestedArchetype: item.suggestedArchetype } : {}),
227
+ ...(item.likelyFiles ? { likelyFiles: item.likelyFiles } : {}),
228
+ ...(item.verification ? { verification: item.verification } : {}),
229
+ ...(item.canRunConcurrently !== undefined ? { canRunConcurrently: item.canRunConcurrently } : {}),
230
+ ...(item.needsReview !== undefined ? { needsReview: item.needsReview } : {}),
231
+ };
232
+ });
233
+ return { phases, workItems };
234
+ }
235
+ // ---------------------------------------------------------------------------
236
+ // Planner agent prompt
237
+ // ---------------------------------------------------------------------------
238
+ /**
239
+ * Build the system prompt for the read-only planning agent. It is explicit
240
+ * about the exact JSON contract and about the read-only posture (the agent's
241
+ * tool set already excludes write/edit/exec; this reinforces intent).
242
+ */
243
+ export function buildPlannerSystemPrompt() {
244
+ return [
245
+ 'You are a READ-ONLY planning agent. You may read, search, and analyze the codebase',
246
+ 'to understand it, but you MUST NOT modify anything and you have no write/edit/exec tools.',
247
+ '',
248
+ 'Decompose the given goal into an ordered set of work items. Respond with a SINGLE JSON',
249
+ 'object and NOTHING else (no prose, no markdown outside a single optional ```json fence).',
250
+ '',
251
+ 'Schema:',
252
+ '{',
253
+ ' "phases": [{ "title": string, "description"?: string }], // optional; shared phase template',
254
+ ' "items": [{',
255
+ ' "title": string, // required, non-empty, unique',
256
+ ' "brief": string, // required, non-empty: what this item does',
257
+ ' "ordinal": number, // required: execution order (0-based or 1-based, ascending)',
258
+ ' "phase"?: string, // phase title this item belongs to',
259
+ ' "dependsOn"?: (string|number)[], // item titles or ordinals this item depends on',
260
+ ' "suggestedArchetype"?: "engineer"|"reviewer"|"tester"|"researcher"|"integrator",',
261
+ ' "likelyFiles"?: string[],',
262
+ ' "verification"?: string[],',
263
+ ' "canRunConcurrently"?: boolean,',
264
+ ' "needsReview"?: boolean',
265
+ ' }],',
266
+ ' "dependencies"?: [{ "from": string|number, "to": string|number }], // "from depends on to"',
267
+ ' "notes"?: string[],',
268
+ ' "risks"?: string[]',
269
+ '}',
270
+ '',
271
+ 'Rules: dependencies must reference real items and must be acyclic. Every brief must be',
272
+ 'non-empty. Keep the decomposition honest — if the goal is genuinely a single unit of work,',
273
+ 'return exactly one item.',
274
+ ].join('\n');
275
+ }
276
+ function buildUserPrompt(request, repairErrors) {
277
+ const lines = [`Goal: ${request.goal}`, `Working directory: ${request.workingDir}`];
278
+ if (request.constraints?.capacity !== undefined)
279
+ lines.push(`Concurrency capacity: ${request.constraints.capacity}`);
280
+ if (request.constraints?.budgetUsd !== undefined)
281
+ lines.push(`Budget (USD): ${request.constraints.budgetUsd}`);
282
+ if (request.userContext)
283
+ lines.push('', 'Additional context:', request.userContext);
284
+ if (repairErrors && repairErrors.length > 0) {
285
+ lines.push('', 'Your previous response was rejected for these reasons. Fix ALL of them and respond again', 'with a single corrected JSON object:', ...repairErrors.map((e) => ` - ${e}`));
286
+ }
287
+ return lines.join('\n');
288
+ }
289
+ // ---------------------------------------------------------------------------
290
+ // The service
291
+ // ---------------------------------------------------------------------------
292
+ /**
293
+ * Decompose a goal into a `PlanProposal`, honestly tagged with provenance.
294
+ *
295
+ * Control flow:
296
+ * 1. `config.mode === 'heuristic'` → the configured heuristic path (no agent).
297
+ * 2. The planner's decompose gate declines → honest single-item (no agent).
298
+ * 3. No runner available → heuristic fallback (reason: no runtime).
299
+ * 4. Agent path: run → parse → strict-validate → (assemble; issues===0 ?
300
+ * accept : ONE repair attempt) → accept-or-fallback. Spawn error,
301
+ * cancellation (kill / wall-timeout / token ceiling), or still-invalid
302
+ * output after repair all fall back to the heuristic path with a reason.
303
+ */
304
+ export async function decomposeGoal(request, planner, inputs, config, runner, deps = {}) {
305
+ const gate = planner.shouldDecompose(inputs);
306
+ const heuristicResult = (outcome) => {
307
+ const base = singleItemProposal(request.goal);
308
+ const fallbackReason = outcome.kind === 'fallback' ? outcome.reason : undefined;
309
+ const usage = outcome.kind === 'fallback' ? outcome.usage : undefined;
310
+ const elapsedMs = outcome.kind === 'fallback' ? outcome.elapsedMs : undefined;
311
+ const proposal = {
312
+ ...base,
313
+ decomposedBy: 'heuristic',
314
+ ...(fallbackReason ? { fallbackReason } : {}),
315
+ ...(usage ? { agentUsage: usage } : {}),
316
+ ...(elapsedMs !== undefined ? { elapsedMs } : {}),
317
+ };
318
+ deps.onOutcome?.(outcome);
319
+ return { proposal, gate, issues: [], outcome };
320
+ };
321
+ if (config.mode === 'heuristic') {
322
+ return heuristicResult({ kind: 'heuristic-configured' });
323
+ }
324
+ if (!gate.decompose) {
325
+ return heuristicResult({ kind: 'gate-declined', reasonCode: gate.reasonCode });
326
+ }
327
+ if (!runner) {
328
+ return heuristicResult({ kind: 'fallback', reason: 'no planning agent runtime available' });
329
+ }
330
+ const systemPrompt = buildPlannerSystemPrompt();
331
+ let lastUsage;
332
+ let totalElapsedMs = 0;
333
+ const runOnce = async (attempt, repairErrors) => {
334
+ const result = await runner.run({
335
+ goal: request.goal,
336
+ workingDir: request.workingDir,
337
+ systemPrompt,
338
+ userPrompt: buildUserPrompt(request, repairErrors),
339
+ bounds: config.bounds,
340
+ attempt,
341
+ });
342
+ lastUsage = result.usage ?? lastUsage;
343
+ totalElapsedMs += result.elapsedMs;
344
+ return result;
345
+ };
346
+ // --- initial attempt ---
347
+ let run;
348
+ try {
349
+ run = await runOnce('initial');
350
+ }
351
+ catch (err) {
352
+ return heuristicResult({ kind: 'fallback', reason: `spawn error: ${err.message}`, usage: lastUsage, elapsedMs: totalElapsedMs });
353
+ }
354
+ if (run.status === 'cancelled') {
355
+ return heuristicResult({ kind: 'fallback', reason: `cancelled${run.detail ? ` (${run.detail})` : ''}`, usage: lastUsage, elapsedMs: totalElapsedMs });
356
+ }
357
+ if (run.status === 'failed') {
358
+ return heuristicResult({ kind: 'fallback', reason: `agent error: ${run.detail ?? 'unknown'}`, usage: lastUsage, elapsedMs: totalElapsedMs });
359
+ }
360
+ const accept = (proposal, issues, repaired) => {
361
+ const costUsd = lastUsage ? deps.estimateCostUsd?.(lastUsage) : undefined;
362
+ const decorated = {
363
+ ...proposal,
364
+ decomposedBy: 'agent',
365
+ elapsedMs: totalElapsedMs,
366
+ ...(lastUsage ? { agentUsage: lastUsage } : {}),
367
+ ...(costUsd !== undefined ? { agentCostUsd: costUsd } : {}),
368
+ };
369
+ const outcome = {
370
+ kind: 'agent',
371
+ itemCount: decorated.workItems.length,
372
+ repaired,
373
+ ...(lastUsage ? { usage: lastUsage } : {}),
374
+ ...(costUsd !== undefined ? { costUsd } : {}),
375
+ elapsedMs: totalElapsedMs,
376
+ };
377
+ deps.onOutcome?.(outcome);
378
+ return { proposal: decorated, gate, issues, outcome };
379
+ };
380
+ // --- validate the initial output ---
381
+ const first = parseDecomposition(run.output);
382
+ if (first.ok && first.raw) {
383
+ const { proposal, issues } = assemblePlanProposal(request.goal, gate.strategy, first.raw);
384
+ if (issues.length === 0)
385
+ return accept(proposal, issues, false);
386
+ // Not clean — fall through to a single repair with the assembler's issues.
387
+ const repairErrors = issues.map((i) => i.message);
388
+ const repaired = await tryRepair(repairErrors);
389
+ if (repaired)
390
+ return repaired;
391
+ return heuristicResult({ kind: 'fallback', reason: `invalid agent decomposition after repair: ${issues.map((i) => i.kind).join(', ')}`, usage: lastUsage, elapsedMs: totalElapsedMs });
392
+ }
393
+ // Malformed structure — one repair attempt with the parser's errors.
394
+ const repaired = await tryRepair(first.errors);
395
+ if (repaired)
396
+ return repaired;
397
+ return heuristicResult({ kind: 'fallback', reason: `malformed agent output after repair: ${first.errors.slice(0, 3).join('; ')}`, usage: lastUsage, elapsedMs: totalElapsedMs });
398
+ // --- one repair attempt: returns an accepted result, or null to fall back ---
399
+ async function tryRepair(repairErrors) {
400
+ let repairRun;
401
+ try {
402
+ repairRun = await runOnce('repair', repairErrors);
403
+ }
404
+ catch {
405
+ return null;
406
+ }
407
+ if (repairRun.status !== 'completed')
408
+ return null;
409
+ const parsed = parseDecomposition(repairRun.output);
410
+ if (!parsed.ok || !parsed.raw)
411
+ return null;
412
+ const { proposal, issues } = assemblePlanProposal(request.goal, gate.strategy, parsed.raw);
413
+ if (issues.length !== 0)
414
+ return null;
415
+ return accept(proposal, issues, true);
416
+ }
417
+ }
@@ -50,6 +50,26 @@ export interface Phase {
50
50
  }
51
51
  /** Where a proposal's decomposition came from. */
52
52
  export type PlanProposalSource = 'planner-agent' | 'single-item-fallback' | 'caller-supplied';
53
+ /**
54
+ * Honest provenance for how a proposal's work items were produced.
55
+ *
56
+ * - `'agent'` — a read-only planning agent decomposed the goal, and its
57
+ * output validated cleanly (possibly after one repair attempt).
58
+ * - `'heuristic'` — the deterministic single-item path produced the proposal,
59
+ * either because `planner.decomposition` is configured to `'heuristic'`, the
60
+ * planner's gate declined to decompose, or the agent path failed and fell
61
+ * back. `fallbackReason` is set only in the failure case, never when the
62
+ * heuristic path was chosen deliberately by config or gate.
63
+ */
64
+ export type DecomposedBy = 'agent' | 'heuristic';
65
+ /** Token usage reported by a planning-decomposition agent run. */
66
+ export interface DecompositionAgentUsage {
67
+ readonly inputTokens: number;
68
+ readonly outputTokens: number;
69
+ readonly cacheReadTokens?: number | undefined;
70
+ readonly cacheWriteTokens?: number | undefined;
71
+ readonly totalTokens: number;
72
+ }
53
73
  export interface PlanProposal {
54
74
  id: string;
55
75
  task: string;
@@ -59,6 +79,25 @@ export interface PlanProposal {
59
79
  workItems: WorkItem[];
60
80
  createdAt: number;
61
81
  source: PlanProposalSource;
82
+ /**
83
+ * Provenance overlay set by the decomposition service (plan-decomposition.ts).
84
+ * Absent on proposals produced directly by `assemblePlanProposal` /
85
+ * `singleItemProposal`, which stay byte-compatible with pre-provenance tests.
86
+ */
87
+ decomposedBy?: DecomposedBy | undefined;
88
+ /** Token usage of the planning agent (present when the agent path ran, even on fallback). */
89
+ agentUsage?: DecompositionAgentUsage | undefined;
90
+ /** Estimated dollar cost of the planning agent run, when a pricing lookup was available. */
91
+ agentCostUsd?: number | undefined;
92
+ /** Wall-clock time the planning agent ran, in ms (present when the agent path ran). */
93
+ elapsedMs?: number | undefined;
94
+ /**
95
+ * Why the agent path fell back to the heuristic path. Set ONLY on honest
96
+ * failure fallbacks (spawn error, timeout, cancellation, or output that was
97
+ * still malformed after one repair attempt) — never when `'heuristic'` was
98
+ * chosen by config or by the planner's decompose gate.
99
+ */
100
+ fallbackReason?: string | undefined;
62
101
  }
63
102
  /** The loose JSON shape a planning agent (or a caller) emits, pre-validation. */
64
103
  export interface RawDecompositionPhase {
@@ -1 +1 @@
1
- {"version":3,"file":"plan-proposal.d.ts","sourceRoot":"","sources":["../../../src/platform/core/plan-proposal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plan-proposal.d.ts","sourceRoot":"","sources":["../../../src/platform/core/plan-proposal.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { ToolResult } from '../types/tools.js';
2
2
  export declare function isWrfcWorkflowRequest(text: string): boolean;
3
+ export declare function userProhibitsDelegation(text: string): boolean;
3
4
  export declare function buildWrfcWorkflowRoutingPrompt(text: string): string | null;
4
5
  export declare function toolResultIndicatesAuthoritativeWrfcChain(result: ToolResult): boolean;
5
6
  //# sourceMappingURL=wrfc-routing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wrfc-routing.d.ts","sourceRoot":"","sources":["../../../src/platform/core/wrfc-routing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAM3D;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG1E;AAsBD,wBAAgB,yCAAyC,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAQrF"}
1
+ {"version":3,"file":"wrfc-routing.d.ts","sourceRoot":"","sources":["../../../src/platform/core/wrfc-routing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAM3D;AAqCD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAI7D;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAa1E;AAsBD,wBAAgB,yCAAyC,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAQrF"}
@@ -8,10 +8,60 @@ export function isWrfcWorkflowRequest(text) {
8
8
  return /\bwrfc\b.{0,80}\b(review|agent|build|make|implement|fix|test|verify|for)\b/.test(normalized)
9
9
  || /\b(review|agent|build|make|implement|fix|test|verify)\b.{0,80}\bwrfc\b/.test(normalized);
10
10
  }
11
+ /**
12
+ * High-precision detector for an EXPLICIT user instruction not to delegate on this turn — do not
13
+ * spawn agents, do not start a WRFC/owner chain, or do the work directly/yourself. When true, the
14
+ * routing directive is suppressed entirely: the harness must never inject a "start a WRFC chain"
15
+ * nudge against a user who explicitly forbade it.
16
+ *
17
+ * Deliberately conservative. Every pattern pairs an explicit negation (do not / don't / never /
18
+ * no / without) with a delegation concept (spawn / agent(s) / delegate / wrfc / chain), or pairs a
19
+ * direct-action verb with "yourself"/"directly". A plain "build X with WRFC" request contains no
20
+ * such negation and is NOT treated as a prohibition. Precision over recall on purpose: a rare false
21
+ * positive only drops an advisory suggestion (the safe direction — never coerce), whereas a false
22
+ * negative would re-introduce the exact coercion this fixes.
23
+ *
24
+ * The documented pattern set:
25
+ * - "do not / don't / never spawn" → forbids spawning
26
+ * - "no agents" / "without agents" / "no sub-agents" → forbids agents
27
+ * - "no delegation" / "do not / don't / never delegate" → forbids delegation
28
+ * - "do not / don't / never start a wrfc|chain" / "no wrfc" → forbids starting a chain
29
+ * - "do not / don't / never use the agent tool|agents" → forbids the agent tool
30
+ * - "do|handle|implement|write|answer … yourself|directly" → asks for direct, non-delegated work
31
+ */
32
+ const DELEGATION_PROHIBITION_PATTERNS = [
33
+ /\b(?:do not|don't|never) spawn\b/,
34
+ /\bno (?:sub-?)?agents?\b/,
35
+ /\bwithout (?:spawning )?(?:sub-?)?agents?\b/,
36
+ /\bno delegation\b/,
37
+ /\b(?:do not|don't|never) delegate\b/,
38
+ /\b(?:do not|don't|never) start (?:a |an )?(?:new )?wrfc\b/,
39
+ /\bno wrfc (?:chain|owner)\b/,
40
+ /\b(?:do not|don't|never) start (?:a |an )?(?:new )?chain\b/,
41
+ /\b(?:do not|don't|never) use (?:the )?agents?\b/,
42
+ /\b(?:do not|don't|never) use the agent tool\b/,
43
+ /\b(?:do|handle|implement|write|answer)(?: it| this)?(?: the \w+)? (?:yourself|directly)\b/,
44
+ ];
45
+ export function userProhibitsDelegation(text) {
46
+ // Normalize curly apostrophes and whitespace so "don't"/"don’t"/"do not" all match one pattern.
47
+ const normalized = text.toLowerCase().replace(/[‘’]/g, "'").replace(/\s+/g, ' ');
48
+ return DELEGATION_PROHIBITION_PATTERNS.some((pattern) => pattern.test(normalized));
49
+ }
11
50
  export function buildWrfcWorkflowRoutingPrompt(text) {
12
51
  if (!isWrfcWorkflowRequest(text))
13
52
  return null;
14
- return '[WRFC routing] The user is asking for WRFC-owned work. Use the agent tool to start exactly one WRFC owner chain with mode=spawn, template=engineer, reviewMode=wrfc. Do not answer by describing WRFC, and do not spawn reviewer/tester/verifier roots.';
53
+ // The user's explicit intent for THIS turn wins over routing: if they forbade delegation, inject
54
+ // nothing at all rather than nudging them toward a chain they told us not to start.
55
+ if (userProhibitsDelegation(text))
56
+ return null;
57
+ // Advisory, not imperative: suggest the pipeline and, if chosen, how to enter it, while asserting
58
+ // that the user's explicit instructions always win. mode=spawn/template/reviewMode are retained
59
+ // as the how-to for when the model does choose the pipeline.
60
+ return '[WRFC routing] This looks like work the WRFC pipeline handles well. If you choose to use it, '
61
+ + 'start exactly one WRFC owner chain via the agent tool (mode=spawn, template=engineer, reviewMode=wrfc) '
62
+ + 'rather than spawning reviewer/tester/verifier roots directly. This is a suggestion, not a command — '
63
+ + "the user's explicit instructions always win; if they asked you to do the work yourself or not to "
64
+ + 'delegate, do that instead.';
15
65
  }
16
66
  function parseToolOutput(output) {
17
67
  if (!output)
@@ -0,0 +1,63 @@
1
+ /**
2
+ * boot.ts
3
+ *
4
+ * A thin public factory that wraps the daemon construction graph in ONE call.
5
+ *
6
+ * `DaemonServer` already self-composes its full runtime graph
7
+ * (ConfigManager → RuntimeEventBus → runtime store → createRuntimeServices →
8
+ * gateway/brokers/router) from a `DaemonConfig`, and installs the network
9
+ * transport + folds legacy session stores during `start()`. This factory just
10
+ * threads the caller's overrides in, enables the daemon with the given token,
11
+ * starts it, and hands back a stop handle — composition, not new behavior.
12
+ *
13
+ * It exists so embedders and tests do not have to hand-mirror cli.ts's graph to
14
+ * stand up a real daemon (isolated home, ephemeral port, auth round-trip).
15
+ */
16
+ import type { ApprovalBroker } from '../control-plane/index.js';
17
+ import { DaemonServer } from './facade.js';
18
+ export interface BootDaemonOptions {
19
+ /** Injected home directory — the daemon stays entirely inside it. */
20
+ readonly homeDirectory: string;
21
+ /** Working directory (project root) the daemon operates against. */
22
+ readonly workingDir: string;
23
+ /** TCP port to bind. Default 0 → an OS-assigned ephemeral port. */
24
+ readonly port?: number | undefined;
25
+ /** Host/interface to bind. Default resolved from config (127.0.0.1). */
26
+ readonly host?: string | undefined;
27
+ /** Bearer token required by every route. Omit for session-based auth. */
28
+ readonly token?: string | undefined;
29
+ /** Daemon home dir (identity state). Defaults to the runtime resolution. */
30
+ readonly daemonHomeDir?: string | undefined;
31
+ /** Optional preconfigured ConfigManager; otherwise one is built from the dirs. */
32
+ readonly configManager?: import('../config/manager.js').ConfigManager | undefined;
33
+ /** Optional custom serve factory (tests inject Bun.serve stand-ins). */
34
+ readonly serveFactory?: typeof Bun.serve | undefined;
35
+ }
36
+ export interface BootedDaemon {
37
+ /** The running daemon server. */
38
+ readonly server: DaemonServer;
39
+ /**
40
+ * The daemon's shared approval broker (same instance the HTTP approvals routes
41
+ * resolve through). Lets a proof test seed a pending approval and then exercise
42
+ * approve/deny — including per-hunk selection — over the live wire.
43
+ */
44
+ readonly approvals: ApprovalBroker;
45
+ /** The bound host. */
46
+ readonly host: string;
47
+ /** The bound TCP port (resolves an ephemeral 0 to the real port). */
48
+ readonly port: number;
49
+ /** Base URL for the daemon's HTTP surface. */
50
+ readonly url: string;
51
+ /** Stop the daemon and release the port. Idempotent. */
52
+ stop(): Promise<void>;
53
+ }
54
+ /**
55
+ * Boot a fully-composed daemon in one call and return a stop handle.
56
+ *
57
+ * @example
58
+ * const daemon = await bootDaemon({ homeDirectory, workingDir, port: 0, token });
59
+ * // ... hit `${daemon.url}/api/...` with `Authorization: Bearer ${token}`
60
+ * await daemon.stop();
61
+ */
62
+ export declare function bootDaemon(options: BootDaemonOptions): Promise<BootedDaemon>;
63
+ //# sourceMappingURL=boot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boot.d.ts","sourceRoot":"","sources":["../../../src/platform/daemon/boot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,iBAAiB;IAChC,qEAAqE;IACrE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,oEAAoE;IACpE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,mEAAmE;IACnE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,wEAAwE;IACxE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,yEAAyE;IACzE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,4EAA4E;IAC5E,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,kFAAkF;IAClF,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,sBAAsB,EAAE,aAAa,GAAG,SAAS,CAAC;IAClF,wEAAwE;IACxE,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC;CACtD;AAED,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,sBAAsB;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8CAA8C;IAC9C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAqClF"}