@pellux/goodvibes-sdk 0.38.0 → 1.1.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 (559) hide show
  1. package/dist/contracts/artifacts/operator-contract.json +4468 -916
  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 +1 -1
  6. package/dist/events/surfaces.d.ts +25 -3
  7. package/dist/events/surfaces.d.ts.map +1 -1
  8. package/dist/events/surfaces.js +22 -1
  9. package/dist/events/workflows.d.ts +7 -6
  10. package/dist/events/workflows.d.ts.map +1 -1
  11. package/dist/index.d.ts +1 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/platform/agents/archetypes.d.ts.map +1 -1
  14. package/dist/platform/agents/archetypes.js +7 -0
  15. package/dist/platform/agents/index.d.ts +1 -0
  16. package/dist/platform/agents/index.d.ts.map +1 -1
  17. package/dist/platform/agents/index.js +1 -0
  18. package/dist/platform/agents/orchestrator-runner.d.ts +16 -3
  19. package/dist/platform/agents/orchestrator-runner.d.ts.map +1 -1
  20. package/dist/platform/agents/orchestrator-runner.js +20 -6
  21. package/dist/platform/agents/orchestrator.d.ts +42 -10
  22. package/dist/platform/agents/orchestrator.d.ts.map +1 -1
  23. package/dist/platform/agents/orchestrator.js +68 -20
  24. package/dist/platform/agents/planner-decomposition-runner.d.ts +38 -0
  25. package/dist/platform/agents/planner-decomposition-runner.d.ts.map +1 -0
  26. package/dist/platform/agents/planner-decomposition-runner.js +113 -0
  27. package/dist/platform/agents/turn-knowledge-injection.d.ts +88 -3
  28. package/dist/platform/agents/turn-knowledge-injection.d.ts.map +1 -1
  29. package/dist/platform/agents/turn-knowledge-injection.js +147 -30
  30. package/dist/platform/agents/worktree.d.ts +126 -8
  31. package/dist/platform/agents/worktree.d.ts.map +1 -1
  32. package/dist/platform/agents/worktree.js +240 -19
  33. package/dist/platform/agents/wrfc-controller.d.ts +24 -1
  34. package/dist/platform/agents/wrfc-controller.d.ts.map +1 -1
  35. package/dist/platform/agents/wrfc-controller.js +161 -35
  36. package/dist/platform/agents/wrfc-gate-runtime.d.ts +9 -0
  37. package/dist/platform/agents/wrfc-gate-runtime.d.ts.map +1 -1
  38. package/dist/platform/agents/wrfc-gate-runtime.js +7 -3
  39. package/dist/platform/agents/wrfc-gates.d.ts +1 -1
  40. package/dist/platform/agents/wrfc-gates.d.ts.map +1 -1
  41. package/dist/platform/agents/wrfc-gates.js +7 -1
  42. package/dist/platform/agents/wrfc-types.d.ts +23 -3
  43. package/dist/platform/agents/wrfc-types.d.ts.map +1 -1
  44. package/dist/platform/automation/types.d.ts +9 -1
  45. package/dist/platform/automation/types.d.ts.map +1 -1
  46. package/dist/platform/calendar/calendar-api-shared.d.ts +25 -0
  47. package/dist/platform/calendar/calendar-api-shared.d.ts.map +1 -0
  48. package/dist/platform/calendar/calendar-api-shared.js +100 -0
  49. package/dist/platform/calendar/calendar-connector.d.ts +79 -0
  50. package/dist/platform/calendar/calendar-connector.d.ts.map +1 -0
  51. package/dist/platform/calendar/calendar-connector.js +155 -0
  52. package/dist/platform/calendar/google-calendar-api.d.ts +25 -0
  53. package/dist/platform/calendar/google-calendar-api.d.ts.map +1 -0
  54. package/dist/platform/calendar/google-calendar-api.js +89 -0
  55. package/dist/platform/calendar/http-fetch-adapter.d.ts +25 -0
  56. package/dist/platform/calendar/http-fetch-adapter.d.ts.map +1 -0
  57. package/dist/platform/calendar/http-fetch-adapter.js +25 -0
  58. package/dist/platform/calendar/ics-parser.d.ts +35 -0
  59. package/dist/platform/calendar/ics-parser.d.ts.map +1 -0
  60. package/dist/platform/calendar/ics-parser.js +236 -0
  61. package/dist/platform/calendar/index.d.ts +41 -0
  62. package/dist/platform/calendar/index.d.ts.map +1 -0
  63. package/dist/platform/calendar/index.js +49 -0
  64. package/dist/platform/calendar/merged-calendar-model.d.ts +67 -0
  65. package/dist/platform/calendar/merged-calendar-model.d.ts.map +1 -0
  66. package/dist/platform/calendar/merged-calendar-model.js +181 -0
  67. package/dist/platform/calendar/microsoft-graph-api.d.ts +25 -0
  68. package/dist/platform/calendar/microsoft-graph-api.d.ts.map +1 -0
  69. package/dist/platform/calendar/microsoft-graph-api.js +95 -0
  70. package/dist/platform/calendar/oauth-flow.d.ts +62 -0
  71. package/dist/platform/calendar/oauth-flow.d.ts.map +1 -0
  72. package/dist/platform/calendar/oauth-flow.js +305 -0
  73. package/dist/platform/calendar/oauth-providers.d.ts +43 -0
  74. package/dist/platform/calendar/oauth-providers.d.ts.map +1 -0
  75. package/dist/platform/calendar/oauth-providers.js +120 -0
  76. package/dist/platform/calendar/oauth-token-store.d.ts +72 -0
  77. package/dist/platform/calendar/oauth-token-store.d.ts.map +1 -0
  78. package/dist/platform/calendar/oauth-token-store.js +189 -0
  79. package/dist/platform/calendar/oauth-types.d.ts +274 -0
  80. package/dist/platform/calendar/oauth-types.d.ts.map +1 -0
  81. package/dist/platform/calendar/oauth-types.js +22 -0
  82. package/dist/platform/calendar/rrule.d.ts +39 -0
  83. package/dist/platform/calendar/rrule.d.ts.map +1 -0
  84. package/dist/platform/calendar/rrule.js +261 -0
  85. package/dist/platform/calendar/subscription-store.d.ts +118 -0
  86. package/dist/platform/calendar/subscription-store.d.ts.map +1 -0
  87. package/dist/platform/calendar/subscription-store.js +293 -0
  88. package/dist/platform/calendar/types.d.ts +170 -0
  89. package/dist/platform/calendar/types.d.ts.map +1 -0
  90. package/dist/platform/calendar/types.js +21 -0
  91. package/dist/platform/companion/companion-chat-attachments.d.ts +29 -0
  92. package/dist/platform/companion/companion-chat-attachments.d.ts.map +1 -0
  93. package/dist/platform/companion/companion-chat-attachments.js +121 -0
  94. package/dist/platform/companion/companion-chat-branching.d.ts +66 -0
  95. package/dist/platform/companion/companion-chat-branching.d.ts.map +1 -0
  96. package/dist/platform/companion/companion-chat-branching.js +142 -0
  97. package/dist/platform/companion/companion-chat-broker-bridge.d.ts +40 -0
  98. package/dist/platform/companion/companion-chat-broker-bridge.d.ts.map +1 -0
  99. package/dist/platform/companion/companion-chat-broker-bridge.js +14 -0
  100. package/dist/platform/companion/companion-chat-broker-sync.d.ts +38 -0
  101. package/dist/platform/companion/companion-chat-broker-sync.d.ts.map +1 -0
  102. package/dist/platform/companion/companion-chat-broker-sync.js +80 -0
  103. package/dist/platform/companion/companion-chat-gc.d.ts +63 -0
  104. package/dist/platform/companion/companion-chat-gc.d.ts.map +1 -0
  105. package/dist/platform/companion/companion-chat-gc.js +38 -0
  106. package/dist/platform/companion/companion-chat-manager.d.ts +91 -23
  107. package/dist/platform/companion/companion-chat-manager.d.ts.map +1 -1
  108. package/dist/platform/companion/companion-chat-manager.js +195 -223
  109. package/dist/platform/companion/companion-chat-persistence.d.ts +9 -1
  110. package/dist/platform/companion/companion-chat-persistence.d.ts.map +1 -1
  111. package/dist/platform/companion/companion-chat-persistence.js +10 -2
  112. package/dist/platform/companion/companion-chat-routes.d.ts +2 -1
  113. package/dist/platform/companion/companion-chat-routes.d.ts.map +1 -1
  114. package/dist/platform/companion/companion-chat-routes.js +113 -4
  115. package/dist/platform/companion/companion-chat-turn-execution.d.ts +61 -0
  116. package/dist/platform/companion/companion-chat-turn-execution.d.ts.map +1 -0
  117. package/dist/platform/companion/companion-chat-turn-execution.js +107 -0
  118. package/dist/platform/companion/companion-chat-types.d.ts +67 -0
  119. package/dist/platform/companion/companion-chat-types.d.ts.map +1 -1
  120. package/dist/platform/config/credential-status.d.ts +28 -0
  121. package/dist/platform/config/credential-status.d.ts.map +1 -0
  122. package/dist/platform/config/credential-status.js +75 -0
  123. package/dist/platform/config/index.d.ts +25 -0
  124. package/dist/platform/config/index.d.ts.map +1 -1
  125. package/dist/platform/config/index.js +18 -0
  126. package/dist/platform/config/manager.d.ts +9 -0
  127. package/dist/platform/config/manager.d.ts.map +1 -1
  128. package/dist/platform/config/manager.js +21 -2
  129. package/dist/platform/config/migrations.d.ts +48 -0
  130. package/dist/platform/config/migrations.d.ts.map +1 -0
  131. package/dist/platform/config/migrations.js +54 -0
  132. package/dist/platform/config/schema-domain-core.d.ts +10 -1
  133. package/dist/platform/config/schema-domain-core.d.ts.map +1 -1
  134. package/dist/platform/config/schema-domain-core.js +46 -3
  135. package/dist/platform/config/schema-domain-runtime.d.ts +8 -0
  136. package/dist/platform/config/schema-domain-runtime.d.ts.map +1 -1
  137. package/dist/platform/config/schema-domain-runtime.js +32 -0
  138. package/dist/platform/config/schema-types.d.ts +21 -7
  139. package/dist/platform/config/schema-types.d.ts.map +1 -1
  140. package/dist/platform/config/schema.d.ts.map +1 -1
  141. package/dist/platform/config/schema.js +2 -0
  142. package/dist/platform/control-plane/approval-broker.d.ts +11 -0
  143. package/dist/platform/control-plane/approval-broker.d.ts.map +1 -1
  144. package/dist/platform/control-plane/approval-broker.js +17 -1
  145. package/dist/platform/control-plane/approval-hunk-apply.d.ts +77 -0
  146. package/dist/platform/control-plane/approval-hunk-apply.d.ts.map +1 -0
  147. package/dist/platform/control-plane/approval-hunk-apply.js +80 -0
  148. package/dist/platform/control-plane/gateway-disabled-response.d.ts +20 -0
  149. package/dist/platform/control-plane/gateway-disabled-response.d.ts.map +1 -0
  150. package/dist/platform/control-plane/gateway-disabled-response.js +24 -0
  151. package/dist/platform/control-plane/gateway-scope-enforcement.d.ts +68 -0
  152. package/dist/platform/control-plane/gateway-scope-enforcement.d.ts.map +1 -0
  153. package/dist/platform/control-plane/gateway-scope-enforcement.js +91 -0
  154. package/dist/platform/control-plane/gateway-utils.d.ts +17 -0
  155. package/dist/platform/control-plane/gateway-utils.d.ts.map +1 -1
  156. package/dist/platform/control-plane/gateway-utils.js +30 -0
  157. package/dist/platform/control-plane/gateway.d.ts +12 -2
  158. package/dist/platform/control-plane/gateway.d.ts.map +1 -1
  159. package/dist/platform/control-plane/gateway.js +27 -31
  160. package/dist/platform/control-plane/index.d.ts +8 -1
  161. package/dist/platform/control-plane/index.d.ts.map +1 -1
  162. package/dist/platform/control-plane/index.js +8 -0
  163. package/dist/platform/control-plane/invoke-input-validation.d.ts +56 -0
  164. package/dist/platform/control-plane/invoke-input-validation.d.ts.map +1 -0
  165. package/dist/platform/control-plane/invoke-input-validation.js +163 -0
  166. package/dist/platform/control-plane/method-catalog-admin.d.ts.map +1 -1
  167. package/dist/platform/control-plane/method-catalog-admin.js +12 -1
  168. package/dist/platform/control-plane/method-catalog-calendar.d.ts +16 -0
  169. package/dist/platform/control-plane/method-catalog-calendar.d.ts.map +1 -1
  170. package/dist/platform/control-plane/method-catalog-calendar.js +21 -0
  171. package/dist/platform/control-plane/method-catalog-channels.d.ts.map +1 -1
  172. package/dist/platform/control-plane/method-catalog-channels.js +32 -3
  173. package/dist/platform/control-plane/method-catalog-control-automation.d.ts.map +1 -1
  174. package/dist/platform/control-plane/method-catalog-control-automation.js +19 -34
  175. package/dist/platform/control-plane/method-catalog-control-companion.d.ts +15 -0
  176. package/dist/platform/control-plane/method-catalog-control-companion.d.ts.map +1 -0
  177. package/dist/platform/control-plane/method-catalog-control-companion.js +176 -0
  178. package/dist/platform/control-plane/method-catalog-control-core.d.ts.map +1 -1
  179. package/dist/platform/control-plane/method-catalog-control-core.js +104 -122
  180. package/dist/platform/control-plane/method-catalog-control.d.ts.map +1 -1
  181. package/dist/platform/control-plane/method-catalog-control.js +4 -0
  182. package/dist/platform/control-plane/method-catalog-email.d.ts +17 -0
  183. package/dist/platform/control-plane/method-catalog-email.d.ts.map +1 -1
  184. package/dist/platform/control-plane/method-catalog-email.js +21 -0
  185. package/dist/platform/control-plane/method-catalog-events.d.ts +28 -0
  186. package/dist/platform/control-plane/method-catalog-events.d.ts.map +1 -1
  187. package/dist/platform/control-plane/method-catalog-events.js +74 -1
  188. package/dist/platform/control-plane/method-catalog-fleet.d.ts +24 -0
  189. package/dist/platform/control-plane/method-catalog-fleet.d.ts.map +1 -0
  190. package/dist/platform/control-plane/method-catalog-fleet.js +65 -0
  191. package/dist/platform/control-plane/method-catalog-push.d.ts +30 -0
  192. package/dist/platform/control-plane/method-catalog-push.d.ts.map +1 -0
  193. package/dist/platform/control-plane/method-catalog-push.js +80 -0
  194. package/dist/platform/control-plane/method-catalog-route-reconcile.d.ts +84 -0
  195. package/dist/platform/control-plane/method-catalog-route-reconcile.d.ts.map +1 -0
  196. package/dist/platform/control-plane/method-catalog-route-reconcile.js +103 -0
  197. package/dist/platform/control-plane/method-catalog-runtime.d.ts.map +1 -1
  198. package/dist/platform/control-plane/method-catalog-runtime.js +83 -1
  199. package/dist/platform/control-plane/method-catalog-shared.d.ts +29 -0
  200. package/dist/platform/control-plane/method-catalog-shared.d.ts.map +1 -1
  201. package/dist/platform/control-plane/method-catalog.d.ts +9 -0
  202. package/dist/platform/control-plane/method-catalog.d.ts.map +1 -1
  203. package/dist/platform/control-plane/method-catalog.js +34 -3
  204. package/dist/platform/control-plane/operator-contract-schemas-admin.d.ts +8 -0
  205. package/dist/platform/control-plane/operator-contract-schemas-admin.d.ts.map +1 -1
  206. package/dist/platform/control-plane/operator-contract-schemas-admin.js +22 -1
  207. package/dist/platform/control-plane/operator-contract-schemas-fleet.d.ts +18 -0
  208. package/dist/platform/control-plane/operator-contract-schemas-fleet.d.ts.map +1 -0
  209. package/dist/platform/control-plane/operator-contract-schemas-fleet.js +182 -0
  210. package/dist/platform/control-plane/operator-contract-schemas-permissions.d.ts.map +1 -1
  211. package/dist/platform/control-plane/operator-contract-schemas-permissions.js +5 -0
  212. package/dist/platform/control-plane/operator-contract-schemas-runtime.d.ts +37 -0
  213. package/dist/platform/control-plane/operator-contract-schemas-runtime.d.ts.map +1 -1
  214. package/dist/platform/control-plane/operator-contract-schemas-runtime.js +100 -3
  215. package/dist/platform/control-plane/operator-contract-schemas.d.ts +1 -0
  216. package/dist/platform/control-plane/operator-contract-schemas.d.ts.map +1 -1
  217. package/dist/platform/control-plane/operator-contract-schemas.js +1 -0
  218. package/dist/platform/control-plane/operator-contract.d.ts.map +1 -1
  219. package/dist/platform/control-plane/operator-contract.js +8 -0
  220. package/dist/platform/control-plane/routes/checkpoints.d.ts +39 -0
  221. package/dist/platform/control-plane/routes/checkpoints.d.ts.map +1 -0
  222. package/dist/platform/control-plane/routes/checkpoints.js +166 -0
  223. package/dist/platform/control-plane/routes/fleet.d.ts +53 -0
  224. package/dist/platform/control-plane/routes/fleet.d.ts.map +1 -0
  225. package/dist/platform/control-plane/routes/fleet.js +153 -0
  226. package/dist/platform/control-plane/routes/gateway-verb-error.d.ts +30 -0
  227. package/dist/platform/control-plane/routes/gateway-verb-error.d.ts.map +1 -0
  228. package/dist/platform/control-plane/routes/gateway-verb-error.js +36 -0
  229. package/dist/platform/control-plane/routes/index.d.ts +0 -6
  230. package/dist/platform/control-plane/routes/index.d.ts.map +1 -1
  231. package/dist/platform/control-plane/routes/index.js +5 -5
  232. package/dist/platform/control-plane/routes/invocation-params.d.ts +23 -0
  233. package/dist/platform/control-plane/routes/invocation-params.d.ts.map +1 -0
  234. package/dist/platform/control-plane/routes/invocation-params.js +9 -0
  235. package/dist/platform/control-plane/routes/push.d.ts +26 -0
  236. package/dist/platform/control-plane/routes/push.d.ts.map +1 -0
  237. package/dist/platform/control-plane/routes/push.js +104 -0
  238. package/dist/platform/control-plane/routes/register-gateway-verb-groups.d.ts +31 -0
  239. package/dist/platform/control-plane/routes/register-gateway-verb-groups.d.ts.map +1 -0
  240. package/dist/platform/control-plane/routes/register-gateway-verb-groups.js +16 -0
  241. package/dist/platform/control-plane/routes/register-w3-s2.d.ts +26 -0
  242. package/dist/platform/control-plane/routes/register-w3-s2.d.ts.map +1 -0
  243. package/dist/platform/control-plane/routes/register-w3-s2.js +8 -0
  244. package/dist/platform/control-plane/routes/session-search.d.ts +37 -0
  245. package/dist/platform/control-plane/routes/session-search.d.ts.map +1 -0
  246. package/dist/platform/control-plane/routes/session-search.js +113 -0
  247. package/dist/platform/control-plane/session-broker-gc.d.ts +16 -0
  248. package/dist/platform/control-plane/session-broker-gc.d.ts.map +1 -1
  249. package/dist/platform/control-plane/session-broker-gc.js +23 -6
  250. package/dist/platform/control-plane/session-broker-helpers.d.ts +3 -3
  251. package/dist/platform/control-plane/session-broker-helpers.d.ts.map +1 -1
  252. package/dist/platform/control-plane/session-broker-inputs.d.ts +18 -0
  253. package/dist/platform/control-plane/session-broker-inputs.d.ts.map +1 -1
  254. package/dist/platform/control-plane/session-broker-inputs.js +34 -0
  255. package/dist/platform/control-plane/session-broker-sessions.d.ts +102 -3
  256. package/dist/platform/control-plane/session-broker-sessions.d.ts.map +1 -1
  257. package/dist/platform/control-plane/session-broker-sessions.js +179 -5
  258. package/dist/platform/control-plane/session-broker-state.d.ts +20 -1
  259. package/dist/platform/control-plane/session-broker-state.d.ts.map +1 -1
  260. package/dist/platform/control-plane/session-broker-state.js +67 -5
  261. package/dist/platform/control-plane/session-broker.d.ts +51 -38
  262. package/dist/platform/control-plane/session-broker.d.ts.map +1 -1
  263. package/dist/platform/control-plane/session-broker.js +183 -75
  264. package/dist/platform/control-plane/session-store-importer.d.ts +57 -0
  265. package/dist/platform/control-plane/session-store-importer.d.ts.map +1 -0
  266. package/dist/platform/control-plane/session-store-importer.js +227 -0
  267. package/dist/platform/control-plane/session-types.d.ts +142 -7
  268. package/dist/platform/control-plane/session-types.d.ts.map +1 -1
  269. package/dist/platform/core/execution-plan.d.ts +43 -1
  270. package/dist/platform/core/execution-plan.d.ts.map +1 -1
  271. package/dist/platform/core/execution-plan.js +46 -10
  272. package/dist/platform/core/index.d.ts +1 -0
  273. package/dist/platform/core/index.d.ts.map +1 -1
  274. package/dist/platform/core/index.js +1 -0
  275. package/dist/platform/core/orchestrator-runtime.d.ts +23 -3
  276. package/dist/platform/core/orchestrator-runtime.d.ts.map +1 -1
  277. package/dist/platform/core/orchestrator-tool-runtime.d.ts +7 -0
  278. package/dist/platform/core/orchestrator-tool-runtime.d.ts.map +1 -1
  279. package/dist/platform/core/orchestrator-tool-runtime.js +10 -0
  280. package/dist/platform/core/orchestrator-turn-loop.d.ts +13 -6
  281. package/dist/platform/core/orchestrator-turn-loop.d.ts.map +1 -1
  282. package/dist/platform/core/orchestrator-turn-loop.js +29 -22
  283. package/dist/platform/core/orchestrator.d.ts +16 -10
  284. package/dist/platform/core/orchestrator.d.ts.map +1 -1
  285. package/dist/platform/core/orchestrator.js +23 -8
  286. package/dist/platform/core/plan-decomposition.d.ts +196 -0
  287. package/dist/platform/core/plan-decomposition.d.ts.map +1 -0
  288. package/dist/platform/core/plan-decomposition.js +417 -0
  289. package/dist/platform/core/plan-proposal.d.ts +39 -0
  290. package/dist/platform/core/plan-proposal.d.ts.map +1 -1
  291. package/dist/platform/core/wrfc-routing.d.ts +1 -0
  292. package/dist/platform/core/wrfc-routing.d.ts.map +1 -1
  293. package/dist/platform/core/wrfc-routing.js +51 -1
  294. package/dist/platform/daemon/boot.d.ts +69 -0
  295. package/dist/platform/daemon/boot.d.ts.map +1 -0
  296. package/dist/platform/daemon/boot.js +61 -0
  297. package/dist/platform/daemon/cli.js +2 -1
  298. package/dist/platform/daemon/control-plane.d.ts.map +1 -1
  299. package/dist/platform/daemon/control-plane.js +50 -1
  300. package/dist/platform/daemon/facade-composition.d.ts.map +1 -1
  301. package/dist/platform/daemon/facade-composition.js +6 -0
  302. package/dist/platform/daemon/facade.d.ts +15 -6
  303. package/dist/platform/daemon/facade.d.ts.map +1 -1
  304. package/dist/platform/daemon/facade.js +48 -43
  305. package/dist/platform/daemon/http/router-route-contexts.d.ts +1 -0
  306. package/dist/platform/daemon/http/router-route-contexts.d.ts.map +1 -1
  307. package/dist/platform/daemon/http/router-route-contexts.js +1 -0
  308. package/dist/platform/daemon/http/router-session-broker-adapter.d.ts +13 -0
  309. package/dist/platform/daemon/http/router-session-broker-adapter.d.ts.map +1 -0
  310. package/dist/platform/daemon/http/router-session-broker-adapter.js +27 -0
  311. package/dist/platform/daemon/http/router.d.ts +2 -1
  312. package/dist/platform/daemon/http/router.d.ts.map +1 -1
  313. package/dist/platform/daemon/http/router.js +42 -40
  314. package/dist/platform/daemon/http/runtime-route-types.d.ts +42 -4
  315. package/dist/platform/daemon/http/runtime-route-types.d.ts.map +1 -1
  316. package/dist/platform/daemon/http/webui-serving.d.ts +68 -0
  317. package/dist/platform/daemon/http/webui-serving.d.ts.map +1 -0
  318. package/dist/platform/daemon/http/webui-serving.js +230 -0
  319. package/dist/platform/daemon/index.d.ts +2 -0
  320. package/dist/platform/daemon/index.d.ts.map +1 -1
  321. package/dist/platform/daemon/index.js +1 -0
  322. package/dist/platform/daemon/service-manager.d.ts +16 -0
  323. package/dist/platform/daemon/service-manager.d.ts.map +1 -1
  324. package/dist/platform/daemon/service-manager.js +79 -15
  325. package/dist/platform/intelligence/tree-sitter/service.d.ts.map +1 -1
  326. package/dist/platform/intelligence/tree-sitter/service.js +16 -2
  327. package/dist/platform/knowledge/browser-history/readers.d.ts.map +1 -1
  328. package/dist/platform/knowledge/browser-history/readers.js +15 -5
  329. package/dist/platform/knowledge/knowledge-api.d.ts +1 -1
  330. package/dist/platform/knowledge/project-planning/service.d.ts +14 -1
  331. package/dist/platform/knowledge/project-planning/service.d.ts.map +1 -1
  332. package/dist/platform/knowledge/project-planning/service.js +77 -0
  333. package/dist/platform/knowledge/project-planning/types.d.ts +32 -0
  334. package/dist/platform/knowledge/project-planning/types.d.ts.map +1 -1
  335. package/dist/platform/orchestration/bookkeeping.d.ts +12 -0
  336. package/dist/platform/orchestration/bookkeeping.d.ts.map +1 -0
  337. package/dist/platform/orchestration/bookkeeping.js +91 -0
  338. package/dist/platform/orchestration/budget.d.ts +2 -2
  339. package/dist/platform/orchestration/cancellation.d.ts +2 -2
  340. package/dist/platform/orchestration/controller-compat.d.ts +16 -3
  341. package/dist/platform/orchestration/controller-compat.d.ts.map +1 -1
  342. package/dist/platform/orchestration/controller-compat.js +18 -4
  343. package/dist/platform/orchestration/dirty-guard.js +1 -1
  344. package/dist/platform/orchestration/engine.d.ts +26 -1
  345. package/dist/platform/orchestration/engine.d.ts.map +1 -1
  346. package/dist/platform/orchestration/engine.js +229 -25
  347. package/dist/platform/orchestration/index.d.ts +6 -4
  348. package/dist/platform/orchestration/index.d.ts.map +1 -1
  349. package/dist/platform/orchestration/index.js +3 -2
  350. package/dist/platform/orchestration/persistence.d.ts.map +1 -1
  351. package/dist/platform/orchestration/persistence.js +6 -3
  352. package/dist/platform/orchestration/phase-runner.d.ts +33 -6
  353. package/dist/platform/orchestration/phase-runner.d.ts.map +1 -1
  354. package/dist/platform/orchestration/phase-runner.js +98 -25
  355. package/dist/platform/orchestration/proposal-workstream.d.ts +56 -0
  356. package/dist/platform/orchestration/proposal-workstream.d.ts.map +1 -0
  357. package/dist/platform/orchestration/proposal-workstream.js +76 -0
  358. package/dist/platform/orchestration/scheduler.d.ts +20 -1
  359. package/dist/platform/orchestration/scheduler.d.ts.map +1 -1
  360. package/dist/platform/orchestration/scheduler.js +16 -0
  361. package/dist/platform/orchestration/types.d.ts +289 -4
  362. package/dist/platform/orchestration/types.d.ts.map +1 -1
  363. package/dist/platform/orchestration/types.js +32 -0
  364. package/dist/platform/orchestration/worktree-isolation.d.ts +33 -0
  365. package/dist/platform/orchestration/worktree-isolation.d.ts.map +1 -0
  366. package/dist/platform/orchestration/worktree-isolation.js +248 -0
  367. package/dist/platform/presentation/glyphs.d.ts +91 -0
  368. package/dist/platform/presentation/glyphs.d.ts.map +1 -0
  369. package/dist/platform/presentation/glyphs.js +93 -0
  370. package/dist/platform/presentation/index.d.ts +28 -0
  371. package/dist/platform/presentation/index.d.ts.map +1 -0
  372. package/dist/platform/presentation/index.js +27 -0
  373. package/dist/platform/presentation/thinking-phrases.d.ts +12 -0
  374. package/dist/platform/presentation/thinking-phrases.d.ts.map +1 -0
  375. package/dist/platform/presentation/thinking-phrases.js +32 -0
  376. package/dist/platform/presentation/tones.d.ts +121 -0
  377. package/dist/platform/presentation/tones.d.ts.map +1 -0
  378. package/dist/platform/presentation/tones.js +145 -0
  379. package/dist/platform/presentation/waiting-wording.d.ts +54 -0
  380. package/dist/platform/presentation/waiting-wording.d.ts.map +1 -0
  381. package/dist/platform/presentation/waiting-wording.js +51 -0
  382. package/dist/platform/providers/runtime-snapshot.d.ts.map +1 -1
  383. package/dist/platform/providers/runtime-snapshot.js +12 -2
  384. package/dist/platform/push/delivery.d.ts +48 -0
  385. package/dist/platform/push/delivery.d.ts.map +1 -0
  386. package/dist/platform/push/delivery.js +117 -0
  387. package/dist/platform/push/encryption.d.ts +41 -0
  388. package/dist/platform/push/encryption.d.ts.map +1 -0
  389. package/dist/platform/push/encryption.js +82 -0
  390. package/dist/platform/push/index.d.ts +17 -0
  391. package/dist/platform/push/index.d.ts.map +1 -0
  392. package/dist/platform/push/index.js +10 -0
  393. package/dist/platform/push/service.d.ts +75 -0
  394. package/dist/platform/push/service.d.ts.map +1 -0
  395. package/dist/platform/push/service.js +95 -0
  396. package/dist/platform/push/subscription-store.d.ts +50 -0
  397. package/dist/platform/push/subscription-store.d.ts.map +1 -0
  398. package/dist/platform/push/subscription-store.js +123 -0
  399. package/dist/platform/push/types.d.ts +68 -0
  400. package/dist/platform/push/types.d.ts.map +1 -0
  401. package/dist/platform/push/types.js +13 -0
  402. package/dist/platform/push/vapid.d.ts +54 -0
  403. package/dist/platform/push/vapid.d.ts.map +1 -0
  404. package/dist/platform/push/vapid.js +113 -0
  405. package/dist/platform/runtime/bootstrap-services.d.ts +62 -2
  406. package/dist/platform/runtime/bootstrap-services.d.ts.map +1 -1
  407. package/dist/platform/runtime/bootstrap-services.js +217 -50
  408. package/dist/platform/runtime/daemon-version-compat.d.ts +39 -0
  409. package/dist/platform/runtime/daemon-version-compat.d.ts.map +1 -0
  410. package/dist/platform/runtime/daemon-version-compat.js +75 -0
  411. package/dist/platform/runtime/detached-daemon-runtime.d.ts +26 -0
  412. package/dist/platform/runtime/detached-daemon-runtime.d.ts.map +1 -0
  413. package/dist/platform/runtime/detached-daemon-runtime.js +49 -0
  414. package/dist/platform/runtime/emitters/workflows.d.ts +1 -1
  415. package/dist/platform/runtime/emitters/workflows.d.ts.map +1 -1
  416. package/dist/platform/runtime/events/index.d.ts +13 -0
  417. package/dist/platform/runtime/events/index.d.ts.map +1 -1
  418. package/dist/platform/runtime/events/index.js +13 -0
  419. package/dist/platform/runtime/feature-flags/flags.d.ts.map +1 -1
  420. package/dist/platform/runtime/feature-flags/flags.js +39 -1
  421. package/dist/platform/runtime/fleet/adapters/agent.d.ts +2 -2
  422. package/dist/platform/runtime/fleet/adapters/agent.d.ts.map +1 -1
  423. package/dist/platform/runtime/fleet/adapters/agent.js +4 -4
  424. package/dist/platform/runtime/fleet/adapters/automation.d.ts +1 -1
  425. package/dist/platform/runtime/fleet/adapters/automation.js +1 -1
  426. package/dist/platform/runtime/fleet/adapters/code-index.d.ts +1 -1
  427. package/dist/platform/runtime/fleet/adapters/code-index.js +1 -1
  428. package/dist/platform/runtime/fleet/adapters/orchestration.d.ts +40 -18
  429. package/dist/platform/runtime/fleet/adapters/orchestration.d.ts.map +1 -1
  430. package/dist/platform/runtime/fleet/adapters/orchestration.js +138 -34
  431. package/dist/platform/runtime/fleet/adapters/schedule.d.ts +4 -4
  432. package/dist/platform/runtime/fleet/adapters/schedule.js +4 -4
  433. package/dist/platform/runtime/fleet/adapters/trigger.d.ts +3 -4
  434. package/dist/platform/runtime/fleet/adapters/trigger.d.ts.map +1 -1
  435. package/dist/platform/runtime/fleet/adapters/trigger.js +3 -4
  436. package/dist/platform/runtime/fleet/adapters/wrfc.d.ts +13 -0
  437. package/dist/platform/runtime/fleet/adapters/wrfc.d.ts.map +1 -1
  438. package/dist/platform/runtime/fleet/adapters/wrfc.js +49 -2
  439. package/dist/platform/runtime/fleet/registry.d.ts +7 -7
  440. package/dist/platform/runtime/fleet/registry.d.ts.map +1 -1
  441. package/dist/platform/runtime/fleet/registry.js +41 -7
  442. package/dist/platform/runtime/fleet/types.d.ts +9 -9
  443. package/dist/platform/runtime/fleet/types.d.ts.map +1 -1
  444. package/dist/platform/runtime/memory-spine/client.d.ts +127 -0
  445. package/dist/platform/runtime/memory-spine/client.d.ts.map +1 -0
  446. package/dist/platform/runtime/memory-spine/client.js +113 -0
  447. package/dist/platform/runtime/memory-spine/index.d.ts +11 -0
  448. package/dist/platform/runtime/memory-spine/index.d.ts.map +1 -0
  449. package/dist/platform/runtime/memory-spine/index.js +10 -0
  450. package/dist/platform/runtime/operator-client.d.ts +20 -2
  451. package/dist/platform/runtime/operator-client.d.ts.map +1 -1
  452. package/dist/platform/runtime/operator-client.js +11 -1
  453. package/dist/platform/runtime/provider-accounts/registry.d.ts.map +1 -1
  454. package/dist/platform/runtime/provider-accounts/registry.js +11 -1
  455. package/dist/platform/runtime/services.d.ts +11 -9
  456. package/dist/platform/runtime/services.d.ts.map +1 -1
  457. package/dist/platform/runtime/services.js +24 -9
  458. package/dist/platform/runtime/session-spine/client.d.ts +234 -0
  459. package/dist/platform/runtime/session-spine/client.d.ts.map +1 -0
  460. package/dist/platform/runtime/session-spine/client.js +449 -0
  461. package/dist/platform/runtime/session-spine/index.d.ts +12 -0
  462. package/dist/platform/runtime/session-spine/index.d.ts.map +1 -0
  463. package/dist/platform/runtime/session-spine/index.js +11 -0
  464. package/dist/platform/runtime/session-spine/union-cache.d.ts +225 -0
  465. package/dist/platform/runtime/session-spine/union-cache.d.ts.map +1 -0
  466. package/dist/platform/runtime/session-spine/union-cache.js +333 -0
  467. package/dist/platform/runtime/shell-command-ops.d.ts +3 -1
  468. package/dist/platform/runtime/shell-command-ops.d.ts.map +1 -1
  469. package/dist/platform/runtime/transports/daemon-http-client-validators.d.ts.map +1 -1
  470. package/dist/platform/runtime/transports/daemon-http-client-validators.js +22 -0
  471. package/dist/platform/runtime/transports/daemon-http-client.d.ts.map +1 -1
  472. package/dist/platform/runtime/transports/daemon-http-client.js +25 -2
  473. package/dist/platform/runtime/transports/http-types.d.ts +9 -2
  474. package/dist/platform/runtime/transports/http-types.d.ts.map +1 -1
  475. package/dist/platform/state/canonical-memory.d.ts +95 -0
  476. package/dist/platform/state/canonical-memory.d.ts.map +1 -0
  477. package/dist/platform/state/canonical-memory.js +155 -0
  478. package/dist/platform/state/code-index-chunking.js +1 -1
  479. package/dist/platform/state/code-index-db.d.ts +1 -1
  480. package/dist/platform/state/code-index-reindex.d.ts +73 -0
  481. package/dist/platform/state/code-index-reindex.d.ts.map +1 -0
  482. package/dist/platform/state/code-index-reindex.js +156 -0
  483. package/dist/platform/state/code-index-store.d.ts.map +1 -1
  484. package/dist/platform/state/code-index-store.js +11 -3
  485. package/dist/platform/state/index.d.ts +8 -0
  486. package/dist/platform/state/index.d.ts.map +1 -1
  487. package/dist/platform/state/index.js +4 -0
  488. package/dist/platform/state/memory-recall-contract.d.ts +118 -0
  489. package/dist/platform/state/memory-recall-contract.d.ts.map +1 -0
  490. package/dist/platform/state/memory-recall-contract.js +170 -0
  491. package/dist/platform/state/memory-registry.d.ts +8 -0
  492. package/dist/platform/state/memory-registry.d.ts.map +1 -1
  493. package/dist/platform/state/memory-registry.js +10 -0
  494. package/dist/platform/state/memory-store.d.ts +2 -0
  495. package/dist/platform/state/memory-store.d.ts.map +1 -1
  496. package/dist/platform/state/memory-store.js +4 -0
  497. package/dist/platform/state/memory-vector-store.d.ts.map +1 -1
  498. package/dist/platform/state/memory-vector-store.js +14 -3
  499. package/dist/platform/state/sqlite-store.d.ts +2 -0
  500. package/dist/platform/state/sqlite-store.d.ts.map +1 -1
  501. package/dist/platform/state/sqlite-store.js +4 -0
  502. package/dist/platform/state/sqlite-vec-loader.d.ts +1 -1
  503. package/dist/platform/state/sqlite-vec-loader.js +1 -1
  504. package/dist/platform/state/vibe-projection.d.ts +67 -0
  505. package/dist/platform/state/vibe-projection.d.ts.map +1 -0
  506. package/dist/platform/state/vibe-projection.js +115 -0
  507. package/dist/platform/tools/agent/index.d.ts.map +1 -1
  508. package/dist/platform/tools/agent/index.js +8 -0
  509. package/dist/platform/tools/agent/manager.d.ts +22 -10
  510. package/dist/platform/tools/agent/manager.d.ts.map +1 -1
  511. package/dist/platform/tools/agent/manager.js +13 -7
  512. package/dist/platform/tools/agent/schema.d.ts +26 -0
  513. package/dist/platform/tools/agent/schema.d.ts.map +1 -1
  514. package/dist/platform/tools/agent/schema.js +2 -2
  515. package/dist/platform/tools/agent/wrfc-batch-policy.d.ts +13 -0
  516. package/dist/platform/tools/agent/wrfc-batch-policy.d.ts.map +1 -1
  517. package/dist/platform/tools/agent/wrfc-batch-policy.js +60 -0
  518. package/dist/platform/tools/exec/runtime.d.ts +10 -0
  519. package/dist/platform/tools/exec/runtime.d.ts.map +1 -1
  520. package/dist/platform/tools/exec/runtime.js +27 -10
  521. package/dist/platform/tools/exec/schema.d.ts +2 -2
  522. package/dist/platform/tools/exec/schema.d.ts.map +1 -1
  523. package/dist/platform/tools/exec/schema.js +2 -1
  524. package/dist/platform/tools/fetch/runtime.d.ts +1 -1
  525. package/dist/platform/tools/index.d.ts +2 -0
  526. package/dist/platform/tools/index.d.ts.map +1 -1
  527. package/dist/platform/tools/index.js +2 -0
  528. package/dist/platform/tools/registry.d.ts +1 -1
  529. package/dist/platform/tools/registry.js +1 -1
  530. package/dist/platform/tools/state/index.d.ts +9 -0
  531. package/dist/platform/tools/state/index.d.ts.map +1 -1
  532. package/dist/platform/tools/state/index.js +60 -3
  533. package/dist/platform/types/foundation-contract.d.ts +1 -1
  534. package/dist/platform/types/foundation-contract.d.ts.map +1 -1
  535. package/dist/platform/types/index.d.ts +1 -1
  536. package/dist/platform/types/index.d.ts.map +1 -1
  537. package/dist/platform/types/tools.d.ts +1 -1
  538. package/dist/platform/utils/request-body.d.ts.map +1 -1
  539. package/dist/platform/utils/request-body.js +50 -5
  540. package/dist/platform/version.js +1 -1
  541. package/package.json +25 -9
  542. package/dist/platform/control-plane/routes/automation.d.ts +0 -3
  543. package/dist/platform/control-plane/routes/automation.d.ts.map +0 -1
  544. package/dist/platform/control-plane/routes/automation.js +0 -63
  545. package/dist/platform/control-plane/routes/context.d.ts +0 -2
  546. package/dist/platform/control-plane/routes/context.d.ts.map +0 -1
  547. package/dist/platform/control-plane/routes/context.js +0 -1
  548. package/dist/platform/control-plane/routes/operator.d.ts +0 -8
  549. package/dist/platform/control-plane/routes/operator.d.ts.map +0 -1
  550. package/dist/platform/control-plane/routes/operator.js +0 -415
  551. package/dist/platform/control-plane/routes/remote.d.ts +0 -3
  552. package/dist/platform/control-plane/routes/remote.d.ts.map +0 -1
  553. package/dist/platform/control-plane/routes/remote.js +0 -35
  554. package/dist/platform/control-plane/routes/sessions.d.ts +0 -3
  555. package/dist/platform/control-plane/routes/sessions.d.ts.map +0 -1
  556. package/dist/platform/control-plane/routes/sessions.js +0 -43
  557. package/dist/platform/control-plane/routes/tasks.d.ts +0 -3
  558. package/dist/platform/control-plane/routes/tasks.d.ts.map +0 -1
  559. package/dist/platform/control-plane/routes/tasks.js +0 -22
@@ -0,0 +1,166 @@
1
+ import { GatewayVerbError } from './gateway-verb-error.js';
2
+ import { readInvocationParams } from './invocation-params.js';
3
+ const CHECKPOINT_KINDS = ['turn', 'agent-run', 'manual'];
4
+ const RETENTION_CLASSES = ['short', 'standard', 'forensic'];
5
+ const CHECKPOINTS_LIST_DEFAULT_LIMIT = 100;
6
+ const CHECKPOINTS_LIST_MAX_LIMIT = 500;
7
+ /**
8
+ * `WorkspaceCheckpointManager.requireCheckpoint` (../../workspace/checkpoint/manager.ts:599-604,
9
+ * private) throws a plain `Error` with this exact message shape for an
10
+ * unknown/gc'd id. `diff`/`restore` both route through it. There is no
11
+ * public `get(id)` to pre-check existence without a second full manager
12
+ * call, so this handler matches the message text the manager already
13
+ * commits to (any manager.ts rewrite of that string is covered by the
14
+ * bootDaemon proof test — see test/w3-s2-*.test.ts — as a regression net,
15
+ * not by this string match alone).
16
+ */
17
+ const NO_CHECKPOINT_FOUND_MARKER = 'no checkpoint found with id';
18
+ async function callOrHonestNotFound(fn) {
19
+ try {
20
+ return await fn();
21
+ }
22
+ catch (err) {
23
+ const message = err instanceof Error ? err.message : String(err);
24
+ if (message.includes(NO_CHECKPOINT_FOUND_MARKER)) {
25
+ // Preserve the manager's own message (it already names the specific
26
+ // missing id) — only the status/code are being upgraded from the
27
+ // blanket 500 a plain throw would collapse to.
28
+ throw new GatewayVerbError(message, 'NOT_FOUND', 404);
29
+ }
30
+ throw err;
31
+ }
32
+ }
33
+ function optionalString(value) {
34
+ return typeof value === 'string' && value.length > 0 ? value : undefined;
35
+ }
36
+ function requiredString(value, field) {
37
+ if (typeof value !== 'string' || value.length === 0) {
38
+ throw new GatewayVerbError(`Missing required field: ${field}`, 'INVALID_ARGUMENT', 400);
39
+ }
40
+ return value;
41
+ }
42
+ function optionalNumber(value, field) {
43
+ if (value === undefined || value === null)
44
+ return undefined;
45
+ const n = typeof value === 'number' ? value : Number(value);
46
+ if (!Number.isFinite(n)) {
47
+ throw new GatewayVerbError(`Invalid number for field: ${field}`, 'INVALID_ARGUMENT', 400);
48
+ }
49
+ return n;
50
+ }
51
+ function optionalStringArray(value) {
52
+ if (value === undefined || value === null)
53
+ return undefined;
54
+ if (!Array.isArray(value) || !value.every((v) => typeof v === 'string')) {
55
+ throw new GatewayVerbError('Invalid field: paths must be a string array', 'INVALID_ARGUMENT', 400);
56
+ }
57
+ return value;
58
+ }
59
+ function optionalBoolean(value, field) {
60
+ if (value === undefined || value === null)
61
+ return undefined;
62
+ if (typeof value !== 'boolean') {
63
+ throw new GatewayVerbError(`Invalid boolean for field: ${field}`, 'INVALID_ARGUMENT', 400);
64
+ }
65
+ return value;
66
+ }
67
+ function validateCheckpointKind(value, required) {
68
+ if (value === undefined || value === null) {
69
+ if (required)
70
+ throw new GatewayVerbError('Missing required field: kind', 'INVALID_ARGUMENT', 400);
71
+ return undefined;
72
+ }
73
+ if (typeof value !== 'string' || !CHECKPOINT_KINDS.includes(value)) {
74
+ throw new GatewayVerbError(`Invalid kind: ${String(value)} (expected one of ${CHECKPOINT_KINDS.join(', ')})`, 'INVALID_ARGUMENT', 400);
75
+ }
76
+ return value;
77
+ }
78
+ function validateRetentionClass(value) {
79
+ if (value === undefined || value === null)
80
+ return undefined;
81
+ if (typeof value !== 'string' || !RETENTION_CLASSES.includes(value)) {
82
+ throw new GatewayVerbError(`Invalid retentionClass: ${String(value)} (expected one of ${RETENTION_CLASSES.join(', ')})`, 'INVALID_ARGUMENT', 400);
83
+ }
84
+ return value;
85
+ }
86
+ function clampLimit(raw) {
87
+ if (raw === undefined || raw === null)
88
+ return CHECKPOINTS_LIST_DEFAULT_LIMIT;
89
+ const n = typeof raw === 'number' ? raw : Number(raw);
90
+ if (!Number.isFinite(n) || n <= 0) {
91
+ throw new GatewayVerbError(`Invalid limit: ${String(raw)}`, 'INVALID_ARGUMENT', 400);
92
+ }
93
+ return Math.min(Math.floor(n), CHECKPOINTS_LIST_MAX_LIMIT);
94
+ }
95
+ export function createCheckpointsListHandler(manager) {
96
+ return async (invocation) => {
97
+ const params = readInvocationParams(invocation);
98
+ const kind = validateCheckpointKind(params.kind, false);
99
+ const since = optionalNumber(params.since, 'since');
100
+ const limit = clampLimit(params.limit);
101
+ const checkpoints = await manager.list({ kind, since, limit });
102
+ return { checkpoints };
103
+ };
104
+ }
105
+ export function createCheckpointsCreateHandler(manager) {
106
+ return async (invocation) => {
107
+ const body = readInvocationParams(invocation);
108
+ const kind = validateCheckpointKind(body.kind, true);
109
+ if (!kind)
110
+ throw new GatewayVerbError('Missing required field: kind', 'INVALID_ARGUMENT', 400);
111
+ const checkpoint = await manager.create({
112
+ kind,
113
+ label: optionalString(body.label),
114
+ retentionClass: validateRetentionClass(body.retentionClass),
115
+ turnId: optionalString(body.turnId),
116
+ agentId: optionalString(body.agentId),
117
+ paths: optionalStringArray(body.paths),
118
+ });
119
+ // `create` returns null when the workspace tree is unchanged since the
120
+ // parent checkpoint (manager.ts:349-357) — an honest no-op, not an
121
+ // error and not a fabricated checkpoint record.
122
+ return { checkpoint, noop: checkpoint === null };
123
+ };
124
+ }
125
+ export function createCheckpointsDiffHandler(manager) {
126
+ return async (invocation) => {
127
+ const params = readInvocationParams(invocation);
128
+ const a = requiredString(params.a, 'a');
129
+ const b = optionalString(params.b);
130
+ const diff = await callOrHonestNotFound(() => manager.diff(a, b));
131
+ return { diff };
132
+ };
133
+ }
134
+ export function createCheckpointsRestoreHandler(manager) {
135
+ return async (invocation) => {
136
+ const body = readInvocationParams(invocation);
137
+ const id = requiredString(body.id, 'id');
138
+ const result = await callOrHonestNotFound(() => manager.restore(id, {
139
+ paths: optionalStringArray(body.paths),
140
+ safetyCheckpoint: optionalBoolean(body.safetyCheckpoint, 'safetyCheckpoint'),
141
+ }));
142
+ return { result };
143
+ };
144
+ }
145
+ /**
146
+ * Attach the `checkpoints.*` handlers to the descriptors already registered
147
+ * (without a handler) from ../method-catalog-control-core.ts's static
148
+ * builtin array. Call once, at RuntimeServices construction time, after
149
+ * `workspaceCheckpointManager` exists. A missing descriptor is a silent
150
+ * no-op — see routes/fleet.ts's `registerFleetGatewayMethods` for the same
151
+ * rationale.
152
+ */
153
+ export function registerCheckpointGatewayMethods(catalog, manager) {
154
+ const listDescriptor = catalog.get('checkpoints.list');
155
+ if (listDescriptor)
156
+ catalog.register(listDescriptor, createCheckpointsListHandler(manager), { replace: true });
157
+ const createDescriptor = catalog.get('checkpoints.create');
158
+ if (createDescriptor)
159
+ catalog.register(createDescriptor, createCheckpointsCreateHandler(manager), { replace: true });
160
+ const diffDescriptor = catalog.get('checkpoints.diff');
161
+ if (diffDescriptor)
162
+ catalog.register(diffDescriptor, createCheckpointsDiffHandler(manager), { replace: true });
163
+ const restoreDescriptor = catalog.get('checkpoints.restore');
164
+ if (restoreDescriptor)
165
+ catalog.register(restoreDescriptor, createCheckpointsRestoreHandler(manager), { replace: true });
166
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * routes/fleet.ts
3
+ *
4
+ * `fleet.snapshot` / `fleet.list` gateway-method handlers (see CHANGELOG 1.0.0) over the
5
+ * ALREADY daemon-resident `ProcessRegistry` (createProcessRegistry(),
6
+ * ../../runtime/fleet/registry.ts:204, constructed + exposed on
7
+ * RuntimeServices at ../../runtime/services.ts:712/:242). This is thin verb
8
+ * registration, not new machinery: every call is a direct pass-through to
9
+ * `registry.query()`, the registry's own cheap aggregate-on-read scan.
10
+ *
11
+ * Wired via `GatewayMethodCatalog.register(descriptor, handler)` — the SAME
12
+ * mechanism the plugin API already uses (../../plugins/api.ts
13
+ * `registerGatewayMethod`) — rather than a new REST path in the external
14
+ * `@pellux/goodvibes-daemon-sdk` package or a change to
15
+ * ../../daemon/http/router.ts (both out of this brief's file ownership).
16
+ * The registered handler is reached over real HTTP today via the existing
17
+ * generic invoke endpoint `POST /api/control-plane/methods/{methodId}/invoke`
18
+ * (daemon-sdk/src/control-routes.ts `invokeGatewayMethod`).
19
+ *
20
+ * Descriptors live in ../method-catalog-control-core.ts (so
21
+ * `buildOperatorContract` / api.md / contract-artifact generation see them
22
+ * whether or not a handler has been attached yet); `registerFleetGatewayMethods`
23
+ * below attaches the handler at RuntimeServices construction time
24
+ * (../../runtime/services.ts, right after `processRegistry` exists).
25
+ */
26
+ import type { GatewayMethodCatalog } from '../method-catalog.js';
27
+ import type { GatewayMethodHandler } from '../method-catalog-shared.js';
28
+ import type { ProcessRegistry } from '../../runtime/fleet/types.js';
29
+ /**
30
+ * `fleet.snapshot` payload cap: the registry's
31
+ * `query()` is a cheap O(n) in-memory scan, but the wire response must not
32
+ * grow unbounded with fleet size. Nodes beyond this cap are dropped (newest
33
+ * activity first is NOT guaranteed here — see `truncated`/`totalCount` so a
34
+ * caller that needs the full set knows to page via `fleet.list` instead).
35
+ */
36
+ export declare const FLEET_SNAPSHOT_NODE_CAP = 2000;
37
+ export declare const FLEET_LIST_DEFAULT_LIMIT = 100;
38
+ export declare const FLEET_LIST_MAX_LIMIT = 500;
39
+ /** Structural dep — only the read surface `fleet.*` needs. */
40
+ export type FleetQueryOnlyRegistry = Pick<ProcessRegistry, 'query'>;
41
+ export declare function createFleetSnapshotHandler(registry: FleetQueryOnlyRegistry): GatewayMethodHandler;
42
+ export declare function createFleetListHandler(registry: FleetQueryOnlyRegistry): GatewayMethodHandler;
43
+ /**
44
+ * Attach the `fleet.snapshot` / `fleet.list` handlers to the descriptors
45
+ * already registered (without a handler) from
46
+ * ../method-catalog-control-core.ts's static builtin array. Call once, at
47
+ * RuntimeServices construction time, after `processRegistry` exists.
48
+ * A missing descriptor (contract/registration drift) is a silent no-op
49
+ * rather than a throw — construction must never fail because a wire verb
50
+ * failed to register; the operator-contract gates catch a real drift.
51
+ */
52
+ export declare function registerFleetGatewayMethods(catalog: GatewayMethodCatalog, registry: FleetQueryOnlyRegistry): void;
53
+ //# sourceMappingURL=fleet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet.d.ts","sourceRoot":"","sources":["../../../../src/platform/control-plane/routes/fleet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAIV,eAAe,EAEhB,MAAM,8BAA8B,CAAC;AAKtC;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAE5C,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAyExC,8DAA8D;AAC9D,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;AAEpE,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,sBAAsB,GAAG,oBAAoB,CAejG;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,oBAAoB,CAuC7F;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,sBAAsB,GAAG,IAAI,CASjH"}
@@ -0,0 +1,153 @@
1
+ import { paginateItems } from '@pellux/goodvibes-daemon-sdk';
2
+ import { GatewayVerbError } from './gateway-verb-error.js';
3
+ import { readInvocationParams } from './invocation-params.js';
4
+ /**
5
+ * `fleet.snapshot` payload cap: the registry's
6
+ * `query()` is a cheap O(n) in-memory scan, but the wire response must not
7
+ * grow unbounded with fleet size. Nodes beyond this cap are dropped (newest
8
+ * activity first is NOT guaranteed here — see `truncated`/`totalCount` so a
9
+ * caller that needs the full set knows to page via `fleet.list` instead).
10
+ */
11
+ export const FLEET_SNAPSHOT_NODE_CAP = 2000;
12
+ export const FLEET_LIST_DEFAULT_LIMIT = 100;
13
+ export const FLEET_LIST_MAX_LIMIT = 500;
14
+ const PROCESS_KINDS = [
15
+ 'agent',
16
+ 'wrfc-chain',
17
+ 'wrfc-subtask',
18
+ 'workflow',
19
+ 'trigger',
20
+ 'schedule',
21
+ 'watcher',
22
+ 'background-process',
23
+ 'workstream',
24
+ 'phase',
25
+ 'work-item',
26
+ 'code-index',
27
+ ];
28
+ const PROCESS_STATES = [
29
+ 'thinking',
30
+ 'executing-tool',
31
+ 'awaiting-approval',
32
+ 'streaming',
33
+ 'stalled',
34
+ 'retrying',
35
+ 'done',
36
+ 'failed',
37
+ 'killed',
38
+ 'interrupted',
39
+ 'idle',
40
+ 'queued',
41
+ 'paused',
42
+ ];
43
+ function asStringArray(value) {
44
+ if (value === undefined || value === null)
45
+ return undefined;
46
+ if (Array.isArray(value))
47
+ return value.filter((v) => typeof v === 'string');
48
+ if (typeof value === 'string')
49
+ return value.split(',').map((v) => v.trim()).filter(Boolean);
50
+ return undefined;
51
+ }
52
+ function readFleetQueryFilter(query) {
53
+ if (!query)
54
+ return undefined;
55
+ const rawKinds = asStringArray(query.kinds);
56
+ const rawStates = asStringArray(query.states);
57
+ let kinds;
58
+ if (rawKinds) {
59
+ const invalid = rawKinds.filter((k) => !PROCESS_KINDS.includes(k));
60
+ if (invalid.length > 0) {
61
+ throw new GatewayVerbError(`Unknown fleet kind(s): ${invalid.join(', ')}`, 'INVALID_ARGUMENT', 400);
62
+ }
63
+ kinds = rawKinds;
64
+ }
65
+ let states;
66
+ if (rawStates) {
67
+ const invalid = rawStates.filter((s) => !PROCESS_STATES.includes(s));
68
+ if (invalid.length > 0) {
69
+ throw new GatewayVerbError(`Unknown fleet state(s): ${invalid.join(', ')}`, 'INVALID_ARGUMENT', 400);
70
+ }
71
+ states = rawStates;
72
+ }
73
+ if (!kinds && !states)
74
+ return undefined;
75
+ return { ...(kinds ? { kinds } : {}), ...(states ? { states } : {}) };
76
+ }
77
+ function clampLimit(raw, fallback, max) {
78
+ if (raw === undefined || raw === null)
79
+ return fallback;
80
+ const n = typeof raw === 'number' ? raw : Number(raw);
81
+ if (!Number.isFinite(n) || n <= 0) {
82
+ throw new GatewayVerbError(`Invalid limit: ${String(raw)}`, 'INVALID_ARGUMENT', 400);
83
+ }
84
+ return Math.min(Math.floor(n), max);
85
+ }
86
+ export function createFleetSnapshotHandler(registry) {
87
+ return (invocation) => {
88
+ const filter = readFleetQueryFilter(readInvocationParams(invocation));
89
+ const snapshot = registry.query(filter);
90
+ const truncated = snapshot.nodes.length > FLEET_SNAPSHOT_NODE_CAP;
91
+ const nodes = truncated
92
+ ? snapshot.nodes.slice(0, FLEET_SNAPSHOT_NODE_CAP)
93
+ : snapshot.nodes;
94
+ return {
95
+ capturedAt: snapshot.capturedAt,
96
+ nodes,
97
+ truncated,
98
+ totalCount: snapshot.nodes.length,
99
+ };
100
+ };
101
+ }
102
+ export function createFleetListHandler(registry) {
103
+ return (invocation) => {
104
+ const params = readInvocationParams(invocation);
105
+ const filter = readFleetQueryFilter(params);
106
+ const limit = clampLimit(params.limit, FLEET_LIST_DEFAULT_LIMIT, FLEET_LIST_MAX_LIMIT);
107
+ const rawCursor = typeof params.cursor === 'string' ? params.cursor : null;
108
+ const snapshot = registry.query(filter);
109
+ // Sort key and recovery key MUST agree (mirrors sessions.search's
110
+ // sortSessions-then-paginateItems pattern in session-search.ts): the array
111
+ // is sorted newest-first by startedAt (id tiebreak for determinism when
112
+ // two nodes share a timestamp, or neither has started), and paginateItems
113
+ // is handed that SAME startedAt extractor with { descending: true }. A
114
+ // node's `startedAt` is optional (not-yet-started processes), so absent
115
+ // values are normalized to 0 for both the sort and the recovery key —
116
+ // otherwise `paginateItems`' deleted-cursor recovery (which does a
117
+ // findIndex assuming the array is actually ordered by the field it is
118
+ // given) would search a startedAt-ordered predicate over an array that
119
+ // was really sorted by id, silently skipping or repeating nodes once a
120
+ // process is gc'd between pages.
121
+ const startedAtOf = (node) => node.startedAt ?? 0;
122
+ const sorted = [...snapshot.nodes].sort((a, b) => startedAtOf(b) - startedAtOf(a) || a.id.localeCompare(b.id));
123
+ const page = paginateItems(sorted, limit, rawCursor, (node) => node.id, startedAtOf, { descending: true });
124
+ if ('error' in page) {
125
+ throw new GatewayVerbError(page.error, 'INVALID_CURSOR', 400);
126
+ }
127
+ return {
128
+ items: page.items,
129
+ nextCursor: page.nextCursor,
130
+ hasMore: page.hasMore,
131
+ capturedAt: snapshot.capturedAt,
132
+ };
133
+ };
134
+ }
135
+ /**
136
+ * Attach the `fleet.snapshot` / `fleet.list` handlers to the descriptors
137
+ * already registered (without a handler) from
138
+ * ../method-catalog-control-core.ts's static builtin array. Call once, at
139
+ * RuntimeServices construction time, after `processRegistry` exists.
140
+ * A missing descriptor (contract/registration drift) is a silent no-op
141
+ * rather than a throw — construction must never fail because a wire verb
142
+ * failed to register; the operator-contract gates catch a real drift.
143
+ */
144
+ export function registerFleetGatewayMethods(catalog, registry) {
145
+ const snapshotDescriptor = catalog.get('fleet.snapshot');
146
+ if (snapshotDescriptor) {
147
+ catalog.register(snapshotDescriptor, createFleetSnapshotHandler(registry), { replace: true });
148
+ }
149
+ const listDescriptor = catalog.get('fleet.list');
150
+ if (listDescriptor) {
151
+ catalog.register(listDescriptor, createFleetListHandler(registry), { replace: true });
152
+ }
153
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * gateway-verb-error.ts
3
+ *
4
+ * (fleet.*, checkpoints.*, sessions.search — see CHANGELOG 1.0.0): a structured error for
5
+ * gateway methods registered with a direct handler via
6
+ * `GatewayMethodCatalog.register(descriptor, handler)`.
7
+ *
8
+ * WHY THIS EXISTS: `invokeGatewayMethodCall` (../../daemon/control-plane.ts)
9
+ * dispatches a handler-bearing method via `catalog.invoke()` and, on ANY
10
+ * thrown error, collapses it to a blanket `{ status: 500 }` — there was no
11
+ * prior handler-registered verb that needed an honest non-500 status (the
12
+ * only prior consumer of `register(descriptor, handler)` is the plugin API,
13
+ * whose tool-call errors are swallowed into a `{success:false}` payload, not
14
+ * an HTTP status). checkpoints.diff/restore need an honest 404 for an
15
+ * unknown/gc'd checkpoint id (see routes/checkpoints.ts), and invalid
16
+ * pagination cursors need an honest 400 (fleet.list, sessions.search) — a
17
+ * blanket 500 would misreport caller error as server error.
18
+ *
19
+ * This mirrors the existing `SDKErrorCodes.SESSION_CLOSED` convention used by
20
+ * the plain-REST session routes (`callOrSessionClosed`,
21
+ * ../../../daemon-sdk/src/runtime-session-routes.ts), generalized to any
22
+ * status/code pair instead of one hardcoded to 409/SESSION_CLOSED.
23
+ */
24
+ export declare class GatewayVerbError extends Error {
25
+ readonly code: string;
26
+ readonly status: number;
27
+ constructor(message: string, code: string, status: number);
28
+ }
29
+ export declare function isGatewayVerbError(error: unknown): error is GatewayVerbError;
30
+ //# sourceMappingURL=gateway-verb-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-verb-error.d.ts","sourceRoot":"","sources":["../../../../src/platform/control-plane/routes/gateway-verb-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAM1D;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAE5E"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * gateway-verb-error.ts
3
+ *
4
+ * (fleet.*, checkpoints.*, sessions.search — see CHANGELOG 1.0.0): a structured error for
5
+ * gateway methods registered with a direct handler via
6
+ * `GatewayMethodCatalog.register(descriptor, handler)`.
7
+ *
8
+ * WHY THIS EXISTS: `invokeGatewayMethodCall` (../../daemon/control-plane.ts)
9
+ * dispatches a handler-bearing method via `catalog.invoke()` and, on ANY
10
+ * thrown error, collapses it to a blanket `{ status: 500 }` — there was no
11
+ * prior handler-registered verb that needed an honest non-500 status (the
12
+ * only prior consumer of `register(descriptor, handler)` is the plugin API,
13
+ * whose tool-call errors are swallowed into a `{success:false}` payload, not
14
+ * an HTTP status). checkpoints.diff/restore need an honest 404 for an
15
+ * unknown/gc'd checkpoint id (see routes/checkpoints.ts), and invalid
16
+ * pagination cursors need an honest 400 (fleet.list, sessions.search) — a
17
+ * blanket 500 would misreport caller error as server error.
18
+ *
19
+ * This mirrors the existing `SDKErrorCodes.SESSION_CLOSED` convention used by
20
+ * the plain-REST session routes (`callOrSessionClosed`,
21
+ * ../../../daemon-sdk/src/runtime-session-routes.ts), generalized to any
22
+ * status/code pair instead of one hardcoded to 409/SESSION_CLOSED.
23
+ */
24
+ export class GatewayVerbError extends Error {
25
+ code;
26
+ status;
27
+ constructor(message, code, status) {
28
+ super(message);
29
+ this.name = 'GatewayVerbError';
30
+ this.code = code;
31
+ this.status = status;
32
+ }
33
+ }
34
+ export function isGatewayVerbError(error) {
35
+ return error instanceof GatewayVerbError;
36
+ }
@@ -1,8 +1,2 @@
1
- export { dispatchAutomationRoutes } from './automation.js';
2
- export { dispatchSessionRoutes } from './sessions.js';
3
- export { dispatchTaskRoutes } from './tasks.js';
4
- export { dispatchOperatorRoutes } from './operator.js';
5
- export { dispatchRemoteRoutes } from './remote.js';
6
1
  export { dispatchDaemonApiRoutes } from './api-router.js';
7
- export type { DaemonApiRouteHandlers } from './context.js';
8
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/platform/control-plane/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,YAAY,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/platform/control-plane/routes/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,6 +1,6 @@
1
- export { dispatchAutomationRoutes } from './automation.js';
2
- export { dispatchSessionRoutes } from './sessions.js';
3
- export { dispatchTaskRoutes } from './tasks.js';
4
- export { dispatchOperatorRoutes } from './operator.js';
5
- export { dispatchRemoteRoutes } from './remote.js';
1
+ // The live daemon route dispatch is daemon-sdk's; this barrel re-exports it.
2
+ // The former sdk-local dispatcher copies (automation/tasks/operator/remote/
3
+ // sessions + their context types) were a superseded, unreachable parallel —
4
+ // deleted in the session-spine integration cleanup (see CHANGELOG 1.0.0; 0 callers, 0 api.md
5
+ // presence; every test imports the daemon-sdk originals). Pay-its-way rule.
6
6
  export { dispatchDaemonApiRoutes } from './api-router.js';
@@ -0,0 +1,23 @@
1
+ /**
2
+ * routes/invocation-params.ts
3
+ *
4
+ * (see CHANGELOG 1.0.0, post-S1 alignment) — one params view for the handler-registered
5
+ * verbs (fleet.*, checkpoints.*, sessions.search).
6
+ *
7
+ * S1's invoke-layer input gate (invoke-input-validation.ts, wired in
8
+ * daemon/control-plane.ts invokeGatewayMethodCall) validates the invoke BODY
9
+ * against a handler verb's typed inputSchema — a method with no http binding
10
+ * is body-carrying by that gate's definition. So the BODY is the canonical,
11
+ * schema-validated params channel for these verbs, and callers should put
12
+ * params there.
13
+ *
14
+ * The generic invoke envelope ({ query?, body }) still carries a `query`
15
+ * record, so this helper folds it in as a FALLBACK (body keys win). Query-
16
+ * supplied values bypass S1's schema gate, but every one of these handlers
17
+ * performs its own full validation with honest 400s (GatewayVerbError), so
18
+ * nothing unchecked reaches a manager either way.
19
+ */
20
+ import type { GatewayMethodInvocation } from '../method-catalog-shared.js';
21
+ /** Merged params for a handler-registered verb: query as fallback, body wins. */
22
+ export declare function readInvocationParams(invocation: GatewayMethodInvocation): Record<string, unknown>;
23
+ //# sourceMappingURL=invocation-params.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invocation-params.d.ts","sourceRoot":"","sources":["../../../../src/platform/control-plane/routes/invocation-params.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAQ3E,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,uBAAuB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEjG"}
@@ -0,0 +1,9 @@
1
+ function asRecord(value) {
2
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
3
+ ? value
4
+ : {};
5
+ }
6
+ /** Merged params for a handler-registered verb: query as fallback, body wins. */
7
+ export function readInvocationParams(invocation) {
8
+ return { ...asRecord(invocation.query), ...asRecord(invocation.body) };
9
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * routes/push.ts
3
+ *
4
+ * Attaches the `push.*` gateway-method handlers to the descriptors declared in
5
+ * ../method-catalog-push.ts. Same mechanism fleet.* uses:
6
+ * `catalog.register(descriptor, handler)`, reached over real HTTP through the
7
+ * generic `/api/control-plane/methods/{id}/invoke` endpoint — no new REST route
8
+ * in the external daemon-sdk package, no router change.
9
+ *
10
+ * Every write is scoped to the authenticated principal (the operator identity
11
+ * the invoke layer resolved), so one operator can neither read, delete, nor
12
+ * test another operator's registered devices.
13
+ */
14
+ import type { GatewayMethodCatalog } from '../method-catalog.js';
15
+ import type { PushService } from '../../push/index.js';
16
+ /** The narrow slice of PushService these verbs need. */
17
+ export type PushGatewayService = Pick<PushService, 'getPublicKey' | 'subscribe' | 'listSubscriptions' | 'unsubscribe' | 'verify'>;
18
+ /**
19
+ * Attach the `push.*` handlers to their already-cataloged descriptors. Call
20
+ * once, at RuntimeServices construction time, after the PushService exists. A
21
+ * missing descriptor (contract/registration drift) is a silent no-op rather
22
+ * than a throw — construction must never fail because one wire verb failed to
23
+ * register; the operator-contract gates catch a real drift.
24
+ */
25
+ export declare function registerPushGatewayMethods(catalog: GatewayMethodCatalog, service: PushGatewayService): void;
26
+ //# sourceMappingURL=push.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../../src/platform/control-plane/routes/push.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAKvD,wDAAwD;AACxD,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,WAAW,EACX,cAAc,GAAG,WAAW,GAAG,mBAAmB,GAAG,aAAa,GAAG,QAAQ,CAC9E,CAAC;AAkGF;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAO3G"}
@@ -0,0 +1,104 @@
1
+ import { GatewayVerbError } from './gateway-verb-error.js';
2
+ import { readInvocationParams } from './invocation-params.js';
3
+ function requirePrincipal(invocation) {
4
+ const principalId = invocation.context.principalId;
5
+ if (!principalId) {
6
+ throw new GatewayVerbError('Push verbs require an authenticated principal', 'UNAUTHENTICATED', 401);
7
+ }
8
+ return principalId;
9
+ }
10
+ function requireString(value, field) {
11
+ if (typeof value !== 'string' || value.trim().length === 0) {
12
+ throw new GatewayVerbError(`Missing or invalid ${field}`, 'INVALID_ARGUMENT', 400);
13
+ }
14
+ return value;
15
+ }
16
+ function requireHttpsEndpoint(value) {
17
+ const endpoint = requireString(value, 'endpoint');
18
+ let parsed;
19
+ try {
20
+ parsed = new URL(endpoint);
21
+ }
22
+ catch {
23
+ throw new GatewayVerbError('endpoint is not a valid URL', 'INVALID_ARGUMENT', 400);
24
+ }
25
+ if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {
26
+ throw new GatewayVerbError('endpoint must be an http(s) URL', 'INVALID_ARGUMENT', 400);
27
+ }
28
+ return endpoint;
29
+ }
30
+ function requireKeys(value) {
31
+ if (value === null || typeof value !== 'object') {
32
+ throw new GatewayVerbError('Missing subscription keys', 'INVALID_ARGUMENT', 400);
33
+ }
34
+ const keys = value;
35
+ return {
36
+ p256dh: requireString(keys.p256dh, 'keys.p256dh'),
37
+ auth: requireString(keys.auth, 'keys.auth'),
38
+ };
39
+ }
40
+ function createVapidGetHandler(service) {
41
+ return async () => ({ publicKey: await service.getPublicKey() });
42
+ }
43
+ function createSubscribeHandler(service) {
44
+ return async (invocation) => {
45
+ const principalId = requirePrincipal(invocation);
46
+ const params = readInvocationParams(invocation);
47
+ const endpoint = requireHttpsEndpoint(params.endpoint);
48
+ const keys = requireKeys(params.keys);
49
+ const subscription = await service.subscribe({ principalId, endpoint, keys });
50
+ return { subscription };
51
+ };
52
+ }
53
+ function createListHandler(service) {
54
+ return async (invocation) => {
55
+ const principalId = requirePrincipal(invocation);
56
+ return { subscriptions: await service.listSubscriptions(principalId) };
57
+ };
58
+ }
59
+ function createDeleteHandler(service) {
60
+ return async (invocation) => {
61
+ const principalId = requirePrincipal(invocation);
62
+ const params = readInvocationParams(invocation);
63
+ const subscriptionId = requireString(params.subscriptionId, 'subscriptionId');
64
+ const deleted = await service.unsubscribe(subscriptionId, principalId);
65
+ if (!deleted) {
66
+ throw new GatewayVerbError('Unknown push subscription', 'SUBSCRIPTION_NOT_FOUND', 404);
67
+ }
68
+ return { subscriptionId, deleted: true };
69
+ };
70
+ }
71
+ function createVerifyHandler(service) {
72
+ return async (invocation) => {
73
+ const principalId = requirePrincipal(invocation);
74
+ const params = readInvocationParams(invocation);
75
+ const subscriptionId = requireString(params.subscriptionId, 'subscriptionId');
76
+ const receipt = await service.verify(subscriptionId, principalId);
77
+ if (!receipt) {
78
+ throw new GatewayVerbError('Unknown push subscription', 'SUBSCRIPTION_NOT_FOUND', 404);
79
+ }
80
+ return { receipt };
81
+ };
82
+ }
83
+ const PUSH_HANDLER_FACTORIES = {
84
+ 'push.vapid.get': createVapidGetHandler,
85
+ 'push.subscriptions.create': createSubscribeHandler,
86
+ 'push.subscriptions.list': createListHandler,
87
+ 'push.subscriptions.delete': createDeleteHandler,
88
+ 'push.subscriptions.verify': createVerifyHandler,
89
+ };
90
+ /**
91
+ * Attach the `push.*` handlers to their already-cataloged descriptors. Call
92
+ * once, at RuntimeServices construction time, after the PushService exists. A
93
+ * missing descriptor (contract/registration drift) is a silent no-op rather
94
+ * than a throw — construction must never fail because one wire verb failed to
95
+ * register; the operator-contract gates catch a real drift.
96
+ */
97
+ export function registerPushGatewayMethods(catalog, service) {
98
+ for (const [methodId, factory] of Object.entries(PUSH_HANDLER_FACTORIES)) {
99
+ const descriptor = catalog.get(methodId);
100
+ if (descriptor) {
101
+ catalog.register(descriptor, factory(service), { replace: true });
102
+ }
103
+ }
104
+ }