@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,53 @@
1
+ /**
2
+ * routes/fleet.ts
3
+ *
4
+ * W3-S2 — `fleet.snapshot` / `fleet.list` gateway-method handlers 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 (risk #1, W3-S2 brief): 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 (risk #1, W3-S2 brief): 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
+ * W3-S2 (fleet.*, checkpoints.*, sessions.search): 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
+ * W3-S2 (fleet.*, checkpoints.*, sessions.search): 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 Wave-1 spine integration cleanup (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
+ * W3-S2 (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/register-w3-s2.ts
3
+ *
4
+ * Single composite entry point for W3-S2's three verb-registration calls
5
+ * (fleet.*, checkpoints.*, sessions.search), so ../../runtime/services.ts —
6
+ * already at its line-cap ceiling — only needs one import and one call
7
+ * instead of three of each. See routes/fleet.ts, routes/checkpoints.ts, and
8
+ * routes/session-search.ts for what each registration actually does and why
9
+ * it's a catalog.register(descriptor, handler) call rather than a daemon-sdk
10
+ * REST route or a router.ts change.
11
+ *
12
+ * Call once, at RuntimeServices construction time, after processRegistry,
13
+ * workspaceCheckpointManager, and sessionBroker all exist (processRegistry
14
+ * is constructed last of the three, so the call site is right after it).
15
+ */
16
+ import type { GatewayMethodCatalog } from '../method-catalog.js';
17
+ import { type FleetQueryOnlyRegistry } from './fleet.js';
18
+ import { type CheckpointsGatewayManager } from './checkpoints.js';
19
+ import { type SessionSearchBroker } from './session-search.js';
20
+ export interface W3S2GatewayDeps {
21
+ readonly processRegistry: FleetQueryOnlyRegistry;
22
+ readonly workspaceCheckpointManager: CheckpointsGatewayManager;
23
+ readonly sessionBroker: SessionSearchBroker;
24
+ }
25
+ export declare function registerW3S2GatewayMethods(catalog: GatewayMethodCatalog, deps: W3S2GatewayDeps): void;
26
+ //# sourceMappingURL=register-w3-s2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-w3-s2.d.ts","sourceRoot":"","sources":["../../../../src/platform/control-plane/routes/register-w3-s2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAA+B,KAAK,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACtF,OAAO,EAAoC,KAAK,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AACpG,OAAO,EAAsC,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEnG,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,eAAe,EAAE,sBAAsB,CAAC;IACjD,QAAQ,CAAC,0BAA0B,EAAE,yBAAyB,CAAC;IAC/D,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAC;CAC7C;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI,CAIrG"}
@@ -0,0 +1,8 @@
1
+ import { registerFleetGatewayMethods } from './fleet.js';
2
+ import { registerCheckpointGatewayMethods } from './checkpoints.js';
3
+ import { registerSessionSearchGatewayMethod } from './session-search.js';
4
+ export function registerW3S2GatewayMethods(catalog, deps) {
5
+ registerFleetGatewayMethods(catalog, deps.processRegistry);
6
+ registerCheckpointGatewayMethods(catalog, deps.workspaceCheckpointManager);
7
+ registerSessionSearchGatewayMethod(catalog, deps.sessionBroker);
8
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * routes/session-search.ts
3
+ *
4
+ * W3-S2 — `sessions.search`: a paginated/filtered query over the
5
+ * ALREADY-daemon-resident `SharedSessionBroker`'s home-scoped store,
6
+ * extending the Wave-1 list-filter shape (`ListSharedSessionsOptions`:
7
+ * project/kind/includeClosed) with a free-text `query`, `surfaceKind`,
8
+ * `status`, and opaque cursor pagination (mirrors the
9
+ * daemon-sdk `paginateItems` convention already used by
10
+ * automation-jobs/runs and knowledge listings).
11
+ *
12
+ * DELIBERATELY a standalone read-only helper, NOT a `SharedSessionBroker`
13
+ * method: the brief's file_ownership marks session-broker.ts read-only for
14
+ * S2 ("add a search method only if unavoidable — prefer a read-only query
15
+ * helper; coordinate with S3 which also reads the broker"). Everything here
16
+ * is built from the broker's existing public `listSessions()` — no new
17
+ * broker state, no new broker method.
18
+ *
19
+ * Bounded in-memory filter+sort (risk #3, W3-S2 brief): the store is
20
+ * single-user scale, so a full unbounded scan per call is intentional (no
21
+ * index) — see the brief's decision record for the documented ceiling.
22
+ */
23
+ import type { GatewayMethodCatalog } from '../method-catalog.js';
24
+ import type { GatewayMethodHandler } from '../method-catalog-shared.js';
25
+ import type { SharedSessionBroker } from '../session-broker.js';
26
+ /** Structural dep — only the read surface `sessions.search` needs. */
27
+ export type SessionSearchBroker = Pick<SharedSessionBroker, 'listSessions'>;
28
+ export declare function createSessionsSearchHandler(broker: SessionSearchBroker): GatewayMethodHandler;
29
+ /**
30
+ * Attach the `sessions.search` handler to the descriptor already registered
31
+ * (without a handler) from ../method-catalog-control-core.ts's static
32
+ * builtin array. Call once, at RuntimeServices construction time. A missing
33
+ * descriptor is a silent no-op — see routes/fleet.ts's
34
+ * `registerFleetGatewayMethods` for the same rationale.
35
+ */
36
+ export declare function registerSessionSearchGatewayMethod(catalog: GatewayMethodCatalog, broker: SessionSearchBroker): void;
37
+ //# sourceMappingURL=session-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-search.d.ts","sourceRoot":"","sources":["../../../../src/platform/control-plane/routes/session-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAkEhE,sEAAsE;AACtE,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;AAE5E,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,mBAAmB,GAAG,oBAAoB,CAuD7F;AAED;;;;;;GAMG;AACH,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAKnH"}
@@ -0,0 +1,113 @@
1
+ import { SURFACE_KINDS } from '../../../events/surfaces.js';
2
+ import { paginateItems } from '@pellux/goodvibes-daemon-sdk';
3
+ import { GatewayVerbError } from './gateway-verb-error.js';
4
+ import { readInvocationParams } from './invocation-params.js';
5
+ const SHARED_SESSION_KINDS = [
6
+ 'tui',
7
+ 'agent',
8
+ 'webui',
9
+ 'companion-task',
10
+ 'companion-chat',
11
+ 'automation',
12
+ ];
13
+ const SHARED_SESSION_STATUSES = ['active', 'closed'];
14
+ const SESSIONS_SEARCH_DEFAULT_LIMIT = 50;
15
+ const SESSIONS_SEARCH_MAX_LIMIT = 200;
16
+ function optionalString(value) {
17
+ return typeof value === 'string' && value.length > 0 ? value : undefined;
18
+ }
19
+ function validateKind(value) {
20
+ if (value === undefined || value === null)
21
+ return undefined;
22
+ if (typeof value !== 'string' || !SHARED_SESSION_KINDS.includes(value)) {
23
+ throw new GatewayVerbError(`Invalid kind: ${String(value)} (expected one of ${SHARED_SESSION_KINDS.join(', ')})`, 'INVALID_ARGUMENT', 400);
24
+ }
25
+ return value;
26
+ }
27
+ function validateStatus(value) {
28
+ if (value === undefined || value === null)
29
+ return undefined;
30
+ if (typeof value !== 'string' || !SHARED_SESSION_STATUSES.includes(value)) {
31
+ throw new GatewayVerbError(`Invalid status: ${String(value)} (expected one of ${SHARED_SESSION_STATUSES.join(', ')})`, 'INVALID_ARGUMENT', 400);
32
+ }
33
+ return value;
34
+ }
35
+ function validateSurfaceKind(value) {
36
+ if (value === undefined || value === null)
37
+ return undefined;
38
+ if (typeof value !== 'string' || !SURFACE_KINDS.includes(value)) {
39
+ throw new GatewayVerbError(`Invalid surfaceKind: ${String(value)}`, 'INVALID_ARGUMENT', 400);
40
+ }
41
+ return value;
42
+ }
43
+ function clampLimit(raw) {
44
+ if (raw === undefined || raw === null)
45
+ return SESSIONS_SEARCH_DEFAULT_LIMIT;
46
+ const n = typeof raw === 'number' ? raw : Number(raw);
47
+ if (!Number.isFinite(n) || n <= 0) {
48
+ throw new GatewayVerbError(`Invalid limit: ${String(raw)}`, 'INVALID_ARGUMENT', 400);
49
+ }
50
+ return Math.min(Math.floor(n), SESSIONS_SEARCH_MAX_LIMIT);
51
+ }
52
+ export function createSessionsSearchHandler(broker) {
53
+ return (invocation) => {
54
+ const params = readInvocationParams(invocation);
55
+ const textQuery = optionalString(params.query)?.toLowerCase();
56
+ const project = optionalString(params.project);
57
+ const kind = validateKind(params.kind);
58
+ const surfaceKind = validateSurfaceKind(params.surfaceKind);
59
+ const status = validateStatus(params.status);
60
+ const includeClosed = params.includeClosed === true || params.includeClosed === 'true';
61
+ const limit = clampLimit(params.limit);
62
+ const rawCursor = typeof params.cursor === 'string' ? params.cursor : null;
63
+ // Always fetch WITH closed sessions from the broker (its own default),
64
+ // then apply the wire-level closed policy ourselves below: sessions.search
65
+ // deliberately defaults to EXCLUDING closed sessions unless
66
+ // includeClosed:true is explicit — the opposite of
67
+ // SharedSessionBroker.listSessions' own default — because a "search"
68
+ // surface should not surface dead sessions by default.
69
+ const all = broker.listSessions(Number.MAX_SAFE_INTEGER, {
70
+ project,
71
+ kind,
72
+ includeClosed: true,
73
+ });
74
+ const filtered = all.filter((session) => {
75
+ if (!includeClosed && session.status === 'closed')
76
+ return false;
77
+ if (status !== undefined && session.status !== status)
78
+ return false;
79
+ if (surfaceKind !== undefined && !session.surfaceKinds.includes(surfaceKind))
80
+ return false;
81
+ if (textQuery !== undefined) {
82
+ const haystack = `${session.id} ${session.title}`.toLowerCase();
83
+ if (!haystack.includes(textQuery))
84
+ return false;
85
+ }
86
+ return true;
87
+ });
88
+ // Mirrors sortSessions (session-broker-state.ts): updatedAt desc, id asc tiebreak.
89
+ const sorted = [...filtered].sort((a, b) => b.updatedAt - a.updatedAt || a.id.localeCompare(b.id));
90
+ const page = paginateItems(sorted, limit, rawCursor, (session) => session.id, (session) => session.updatedAt, { descending: true });
91
+ if ('error' in page) {
92
+ throw new GatewayVerbError(page.error, 'INVALID_CURSOR', 400);
93
+ }
94
+ return {
95
+ sessions: page.items,
96
+ nextCursor: page.nextCursor,
97
+ hasMore: page.hasMore,
98
+ };
99
+ };
100
+ }
101
+ /**
102
+ * Attach the `sessions.search` handler to the descriptor already registered
103
+ * (without a handler) from ../method-catalog-control-core.ts's static
104
+ * builtin array. Call once, at RuntimeServices construction time. A missing
105
+ * descriptor is a silent no-op — see routes/fleet.ts's
106
+ * `registerFleetGatewayMethods` for the same rationale.
107
+ */
108
+ export function registerSessionSearchGatewayMethod(catalog, broker) {
109
+ const descriptor = catalog.get('sessions.search');
110
+ if (descriptor) {
111
+ catalog.register(descriptor, createSessionsSearchHandler(broker), { replace: true });
112
+ }
113
+ }
@@ -8,6 +8,22 @@ export interface SharedSessionGcStore {
8
8
  export interface SharedSessionGcOptions {
9
9
  readonly idleEmptyMs: number;
10
10
  readonly idleLongMs: number;
11
+ /**
12
+ * Age (ms since closedAt) at which a CLOSED session's record + bodies are
13
+ * PERMANENTLY deleted from the store. Closed sessions are HISTORY: by default
14
+ * this is `Number.POSITIVE_INFINITY` (retain indefinitely — a closed session
15
+ * is never swept off disk), and deletion happens only when a caller opts into
16
+ * a finite retention window or invokes an explicit delete verb.
17
+ *
18
+ * NOTE ON MEMORY vs PERSISTENCE (divergence from the companion manager):
19
+ * the broker's durable store is a FULL SNAPSHOT of these in-memory maps
20
+ * (createSessionBrokerSnapshot), so there is no separate "memory handle" to
21
+ * evict independently of disk — dropping a closed session's bodies from these
22
+ * maps would also drop them from the next persisted snapshot. Retention is
23
+ * therefore all-or-nothing here: retained closed sessions stay both listable
24
+ * and on disk; memory stays bounded by the per-session message cap
25
+ * (MAX_PERSISTED_MESSAGES_PER_SESSION) rather than by body eviction.
26
+ */
11
27
  readonly deletionRetentionMs: number;
12
28
  readonly publishUpdate: (event: string, payload: unknown) => void;
13
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session-broker-gc.d.ts","sourceRoot":"","sources":["../../../src/platform/control-plane/session-broker-gc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEpF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACpD,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;IACvD,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,wBAAwB,EAAE,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACnE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CA8BzG"}
1
+ {"version":3,"file":"session-broker-gc.d.ts","sourceRoot":"","sources":["../../../src/platform/control-plane/session-broker-gc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAGpF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACpD,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;IACvD,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,wBAAwB,EAAE,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACnE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAmCzG"}
@@ -1,10 +1,14 @@
1
+ import { withSessionCloseReason } from './session-broker-sessions.js';
1
2
  export function sweepSharedSessions(store, options) {
2
3
  const now = Date.now();
3
4
  let anyChanged = false;
4
5
  for (const [sessionId, session] of store.sessions.entries()) {
5
6
  if (session.status === 'closed') {
7
+ // History by default. Only an explicit FINITE retention window authorizes
8
+ // permanent deletion; the default POSITIVE_INFINITY never trips this and
9
+ // the closed record stays listable (includeClosed) and on disk forever.
6
10
  const closedAt = session.closedAt ?? session.updatedAt;
7
- if (now - closedAt >= options.deletionRetentionMs) {
11
+ if (Number.isFinite(options.deletionRetentionMs) && now - closedAt >= options.deletionRetentionMs) {
8
12
  store.sessions.delete(sessionId);
9
13
  store.messages.delete(sessionId);
10
14
  store.inputs.delete(sessionId);
@@ -12,8 +16,6 @@ export function sweepSharedSessions(store, options) {
12
16
  }
13
17
  continue;
14
18
  }
15
- if (!shouldCloseIdleSession(session, now, options))
16
- continue;
17
19
  const reason = idleCloseReason(session, now, options);
18
20
  if (!reason)
19
21
  continue;
@@ -23,6 +25,9 @@ export function sweepSharedSessions(store, options) {
23
25
  activeAgentId: undefined,
24
26
  updatedAt: now,
25
27
  closedAt: now,
28
+ // Record that the SYSTEM reaper closed this (not a user/surface action) so a
29
+ // subsequent register heartbeat auto-reopens it (honest reopen semantics).
30
+ metadata: withSessionCloseReason(session.metadata, 'idle-reaped'),
26
31
  };
27
32
  store.sessions.set(sessionId, closed);
28
33
  options.publishUpdate('session-closed', { ...closed, reason });
@@ -30,8 +35,15 @@ export function sweepSharedSessions(store, options) {
30
35
  }
31
36
  return anyChanged;
32
37
  }
33
- function shouldCloseIdleSession(session, now, options) {
34
- return idleCloseReason(session, now, options) !== null;
38
+ /**
39
+ * True when any participant was seen within the idle-empty window — i.e. a
40
+ * surface is actively holding this session open. A live participant IS activity,
41
+ * so an empty session with a fresh heartbeat must NOT be idle-empty reaped even
42
+ * if `lastActivityAt` has drifted (defense-in-depth alongside the register path
43
+ * advancing lastActivityAt).
44
+ */
45
+ function hasFreshParticipant(session, now, idleEmptyMs) {
46
+ return session.participants.some((participant) => now - participant.lastSeenAt < idleEmptyMs);
35
47
  }
36
48
  function idleCloseReason(session, now, options) {
37
49
  if (session.status !== 'active')
@@ -41,8 +53,13 @@ function idleCloseReason(session, now, options) {
41
53
  if (session.pendingInputCount > 0)
42
54
  return null;
43
55
  const idle = now - session.lastActivityAt;
44
- if (session.messageCount === 0 && idle >= options.idleEmptyMs)
56
+ if (session.messageCount === 0 && idle >= options.idleEmptyMs) {
57
+ // A surface holding the session open (fresh participant heartbeat) exempts it
58
+ // from idle-empty reaping — closing it would kill a LIVE, message-less session.
59
+ if (hasFreshParticipant(session, now, options.idleEmptyMs))
60
+ return null;
45
61
  return 'idle-empty';
62
+ }
46
63
  if (session.messageCount > 0 && idle >= options.idleLongMs)
47
64
  return 'idle-long';
48
65
  return null;