@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
@@ -19,12 +19,16 @@
19
19
  * for that specific session — never the global TUI event feed.
20
20
  * - A GC sweep closes sessions that have been idle beyond the TTL.
21
21
  */
22
- import { Buffer } from 'node:buffer';
23
22
  import { randomUUID } from 'node:crypto';
23
+ import { SDKErrorCodes } from '@pellux/goodvibes-errors';
24
24
  import { ConversationManager } from '../core/conversation.js';
25
25
  import { CompanionChatPersistence, defaultSessionsDir, } from './companion-chat-persistence.js';
26
+ import { buildProviderUserContent, buildReplayUserContent, resolveAttachments, } from './companion-chat-attachments.js';
27
+ import { activeMessages, applyEditBranch, planRegenerate, } from './companion-chat-branching.js';
28
+ import { executeCompanionToolCalls, runToolExhaustionFinalizer, } from './companion-chat-turn-execution.js';
29
+ import { planCompanionSweep } from './companion-chat-gc.js';
30
+ import { CompanionBrokerSync } from './companion-chat-broker-sync.js';
26
31
  import { CompanionChatRateLimiter } from './companion-chat-rate-limiter.js';
27
- import { executeToolCalls as executeOrchestratorToolCalls } from '../core/orchestrator-tool-runtime.js';
28
32
  import { appendGoodVibesRuntimeAwarenessPrompt } from '../tools/goodvibes-runtime/index.js';
29
33
  import { summarizeError } from '../utils/error-display.js';
30
34
  import { logger } from '../utils/logger.js';
@@ -33,6 +37,7 @@ import { logger } from '../utils/logger.js';
33
37
  // ---------------------------------------------------------------------------
34
38
  const DEFAULT_IDLE_ACTIVE_MS = 30 * 60 * 1_000; // 30 minutes with messages
35
39
  const DEFAULT_IDLE_EMPTY_MS = 5 * 60 * 1_000; // 5 minutes empty session
40
+ const DEFAULT_CLOSED_MEMORY_GRACE_MS = 5 * 60 * 1_000; // evict closed bodies from RAM after 5 min
36
41
  const GC_INTERVAL_MS = 60 * 1_000; // sweep every minute
37
42
  const MAX_TOOL_ROUNDS_PER_TURN = 8;
38
43
  const TOOL_EXHAUSTION_FINALIZER_PROMPT = [
@@ -42,16 +47,6 @@ const TOOL_EXHAUSTION_FINALIZER_PROMPT = [
42
47
  'If the available tool results are insufficient, say what is missing and ask one short follow-up '
43
48
  + 'question.',
44
49
  ].join(' ');
45
- const MAX_ATTACHMENTS_PER_MESSAGE = 8;
46
- const MAX_INLINE_IMAGE_ATTACHMENT_BYTES = 20 * 1024 * 1024;
47
- const MAX_INLINE_TEXT_ATTACHMENT_BYTES = 200 * 1024;
48
- function toNodeBuffer(buffer) {
49
- if (Buffer.isBuffer(buffer))
50
- return buffer;
51
- if (buffer instanceof ArrayBuffer)
52
- return Buffer.from(new Uint8Array(buffer));
53
- return Buffer.from(buffer.buffer, buffer.byteOffset, buffer.byteLength);
54
- }
55
50
  function assertCompleteProviderModelRoute(input) {
56
51
  if ((input.model !== undefined) === (input.provider !== undefined))
57
52
  return;
@@ -73,6 +68,10 @@ export class CompanionChatManager {
73
68
  rateLimiter;
74
69
  idleActiveMs;
75
70
  idleEmptyMs;
71
+ closedMemoryGraceMs;
72
+ closedRetentionMs;
73
+ /** Live mirror of sessions into the shared broker store (S1 item D). */
74
+ _brokerSync;
76
75
  gcTimer = null;
77
76
  /** Tracks whether the async init() has completed. */
78
77
  initCompleted = false;
@@ -93,13 +92,17 @@ export class CompanionChatManager {
93
92
  this.artifactStore = config.artifactStore ?? null;
94
93
  this.idleActiveMs = config.idleActiveMs ?? DEFAULT_IDLE_ACTIVE_MS;
95
94
  this.idleEmptyMs = config.idleEmptyMs ?? DEFAULT_IDLE_EMPTY_MS;
95
+ this.closedMemoryGraceMs = config.closedSessionMemoryGraceMs ?? DEFAULT_CLOSED_MEMORY_GRACE_MS;
96
+ this.closedRetentionMs = config.closedSessionRetentionMs;
97
+ this._brokerSync = new CompanionBrokerSync(config.sessionBroker ?? null);
96
98
  // Persistence
97
99
  // Default is false — most callers (tests, downstream consumers) get the
98
100
  // safe no-write default. The daemon opts into persistence explicitly via
99
- // persist: true in facade-composition.
101
+ // persist: true in facade-composition. When sessionsDir is omitted, derive
102
+ // the root from the INJECTED home so an isolated-home daemon stays inside it.
100
103
  const persist = config.persist === true;
101
104
  this.persistence = persist
102
- ? new CompanionChatPersistence(config.sessionsDir ?? defaultSessionsDir())
105
+ ? new CompanionChatPersistence(config.sessionsDir ?? defaultSessionsDir(config.homeDirectory))
103
106
  : null;
104
107
  // Rate limiter
105
108
  this.rateLimiter =
@@ -130,18 +133,18 @@ export class CompanionChatManager {
130
133
  const stored = await this.persistence.loadAll();
131
134
  for (const { meta, messages } of stored) {
132
135
  const normalizedMessages = messages.map((message) => this.normalizeMessage(message));
133
- // Skip sessions that were already closed before the restart — they are
134
- // in a terminal state and don't need to be in memory.
135
- if (meta.status === 'closed')
136
- continue;
137
136
  const conversation = new ConversationManager();
138
- // Replay messages into the conversation to restore LLM context
139
- for (const msg of normalizedMessages) {
140
- if (msg.role === 'user') {
141
- conversation.addUserMessage(this.buildReplayUserContent(msg));
142
- }
143
- else {
144
- conversation.addAssistantMessage(msg.content);
137
+ // Closed-skip fix: closed sessions load in a lightweight terminal state
138
+ // (meta + messages retained, listable/importable; no history replay). GC
139
+ // (_gcSweep) remains the sole deletion authority.
140
+ if (meta.status !== 'closed') {
141
+ for (const msg of normalizedMessages) {
142
+ if (msg.role === 'user') {
143
+ conversation.addUserMessage(buildReplayUserContent(msg));
144
+ }
145
+ else {
146
+ conversation.addAssistantMessage(msg.content);
147
+ }
145
148
  }
146
149
  }
147
150
  this.sessions.set(meta.id, {
@@ -185,6 +188,9 @@ export class CompanionChatManager {
185
188
  subscriberClientId: null,
186
189
  });
187
190
  this._persist(id);
191
+ // Live spine: mirror the new session into the shared broker at write time so
192
+ // /api/sessions reflects it same-process (no restart). Best-effort.
193
+ this._brokerSync.track(meta.id, () => this._brokerSync.registerSession(meta));
188
194
  return meta;
189
195
  }
190
196
  getSession(sessionId) {
@@ -226,7 +232,7 @@ export class CompanionChatManager {
226
232
  throw Object.assign(new Error(`Session not found: ${sessionId}`), { code: 'SESSION_NOT_FOUND', status: 404 });
227
233
  }
228
234
  if (session.meta.status === 'closed') {
229
- throw Object.assign(new Error(`Session is closed: ${sessionId}`), { code: 'SESSION_CLOSED', status: 409 });
235
+ throw Object.assign(new Error('Session is closed'), { code: SDKErrorCodes.SESSION_CLOSED, status: 409 });
230
236
  }
231
237
  const patch = { updatedAt: Date.now() };
232
238
  if (input.title !== undefined)
@@ -239,6 +245,9 @@ export class CompanionChatManager {
239
245
  patch.systemPrompt = input.systemPrompt;
240
246
  const updated = this._updateMeta(session, patch);
241
247
  this._persist(sessionId);
248
+ // Heartbeat the broker record (advances participant.lastSeenAt). Title is
249
+ // never overwritten by this path (broker treats register as a heartbeat).
250
+ this._brokerSync.track(updated.id, () => this._brokerSync.registerSession(updated));
242
251
  return updated;
243
252
  }
244
253
  /**
@@ -267,8 +276,37 @@ export class CompanionChatManager {
267
276
  const now = Date.now();
268
277
  const updated = this._updateMeta(session, { status: 'closed', closedAt: now, updatedAt: now });
269
278
  this._persist(sessionId);
279
+ // Live spine: flip the shared broker record to closed at write time.
280
+ this._brokerSync.track(sessionId, () => this._brokerSync.closeSession(sessionId));
270
281
  return updated;
271
282
  }
283
+ /**
284
+ * Permanently delete a session (see CHANGELOG 1.0.0: `delete` is now a genuine removal,
285
+ * distinct from `closeSession` above). Aborts any in-flight turn, removes
286
+ * the on-disk record file, and drops the in-memory entry — reusing
287
+ * {@link _hardRemove}, the SAME primitive the GC 'delete-persistent' sweep
288
+ * action uses, so there is exactly one removal code path.
289
+ *
290
+ * Requires the session to already be closed: deleting a still-active
291
+ * session throws `{ code: 'SESSION_ACTIVE', status: 409 }` (the caller must
292
+ * close it first, mirroring the SESSION_CLOSED-throw convention elsewhere
293
+ * in this file). An unknown OR already-deleted id throws
294
+ * `{ code: 'SESSION_NOT_FOUND', status: 404 }` — delete is not a 200-noop.
295
+ */
296
+ async deleteSession(sessionId) {
297
+ const session = this.sessions.get(sessionId);
298
+ if (!session) {
299
+ throw Object.assign(new Error(`Session not found: ${sessionId}`), { code: 'SESSION_NOT_FOUND', status: 404 });
300
+ }
301
+ if (session.meta.status !== 'closed') {
302
+ throw Object.assign(new Error('Session is active — close it, then delete.'), { code: 'SESSION_ACTIVE', status: 409 });
303
+ }
304
+ session.abortController.abort();
305
+ await this._hardRemove(sessionId);
306
+ // Live spine: drop the mirrored shared broker record entirely (not just closed).
307
+ this._brokerSync.track(sessionId, () => this._brokerSync.deleteSession(sessionId));
308
+ return { sessionId, deleted: true };
309
+ }
272
310
  /**
273
311
  * Post a user message and start an async LLM turn. Returns the messageId.
274
312
  *
@@ -318,11 +356,11 @@ export class CompanionChatManager {
318
356
  throw Object.assign(new Error(`Session not found: ${sessionId}`), { code: 'SESSION_NOT_FOUND', status: 404 });
319
357
  }
320
358
  if (session.meta.status === 'closed') {
321
- throw Object.assign(new Error(`Session is closed: ${sessionId}`), { code: 'SESSION_CLOSED', status: 409 });
359
+ throw Object.assign(new Error('Session is closed'), { code: SDKErrorCodes.SESSION_CLOSED, status: 409 });
322
360
  }
323
361
  // Rate-limit check (throws GoodVibesSdkError on violation)
324
362
  this.rateLimiter?.check(sessionId, clientId);
325
- const attachments = this.resolveAttachments(options.attachments ?? []);
363
+ const attachments = resolveAttachments(options.attachments ?? [], this.artifactStore);
326
364
  if (!content.trim() && attachments.length === 0) {
327
365
  throw Object.assign(new Error('content or attachments are required'), { code: 'INVALID_INPUT', status: 400 });
328
366
  }
@@ -338,7 +376,7 @@ export class CompanionChatManager {
338
376
  createdAt: now,
339
377
  };
340
378
  session.messages.push(userMsg);
341
- session.conversation.addUserMessage(await this.buildProviderUserContent(content, attachments));
379
+ session.conversation.addUserMessage(await buildProviderUserContent(content, attachments, this.artifactStore));
342
380
  session.lastActivityAt = now;
343
381
  this._updateMeta(session, {
344
382
  messageCount: session.messages.length,
@@ -357,106 +395,6 @@ export class CompanionChatManager {
357
395
  });
358
396
  return messageId;
359
397
  }
360
- resolveAttachments(inputs) {
361
- if (inputs.length === 0)
362
- return [];
363
- if (inputs.length > MAX_ATTACHMENTS_PER_MESSAGE) {
364
- throw Object.assign(new Error(`A companion chat message can include at most ${MAX_ATTACHMENTS_PER_MESSAGE} attachments.`), { code: 'TOO_MANY_ATTACHMENTS', status: 400 });
365
- }
366
- if (!this.artifactStore) {
367
- throw Object.assign(new Error('Companion chat attachments require an artifact store.'), { code: 'ATTACHMENTS_UNAVAILABLE', status: 501 });
368
- }
369
- return inputs.map((input) => {
370
- const artifactId = input.artifactId.trim();
371
- if (!artifactId) {
372
- throw Object.assign(new Error('Attachment artifactId is required.'), {
373
- code: 'INVALID_ATTACHMENT',
374
- status: 400,
375
- });
376
- }
377
- const artifact = this.artifactStore.get(artifactId);
378
- if (!artifact) {
379
- throw Object.assign(new Error(`Unknown attachment artifact: ${artifactId}`), {
380
- code: 'UNKNOWN_ARTIFACT',
381
- status: 404,
382
- });
383
- }
384
- return {
385
- ...artifact,
386
- artifactId: artifact.id,
387
- ...(input.label?.trim() ? { label: input.label.trim() } : {}),
388
- metadata: {
389
- ...artifact.metadata,
390
- ...(input.metadata ?? {}),
391
- },
392
- };
393
- });
394
- }
395
- formatAttachmentSummary(attachments) {
396
- if (attachments.length === 0)
397
- return '';
398
- const lines = attachments.map((attachment, index) => {
399
- const name = attachment.label ?? attachment.filename ?? attachment.artifactId;
400
- return `${index + 1}. ${name} (${attachment.mimeType}, ${attachment.sizeBytes} bytes, artifact ${attachment.artifactId})`;
401
- });
402
- return `\n\nAttached file${attachments.length === 1 ? '' : 's'}:\n${lines.join('\n')}`;
403
- }
404
- buildReplayUserContent(message) {
405
- return `${message.content}${this.formatAttachmentSummary(message.attachments ?? [])}`;
406
- }
407
- isInlineTextAttachment(attachment) {
408
- const lower = attachment.mimeType.toLowerCase();
409
- return attachment.sizeBytes <= MAX_INLINE_TEXT_ATTACHMENT_BYTES
410
- && (lower.startsWith('text/')
411
- || lower === 'application/json'
412
- || lower === 'application/xml'
413
- || lower === 'application/yaml'
414
- || lower === 'text/csv');
415
- }
416
- isInlineImageAttachment(attachment) {
417
- const lower = attachment.mimeType.toLowerCase();
418
- return attachment.sizeBytes <= MAX_INLINE_IMAGE_ATTACHMENT_BYTES
419
- && (lower === 'image/png'
420
- || lower === 'image/jpeg'
421
- || lower === 'image/gif'
422
- || lower === 'image/webp');
423
- }
424
- async buildProviderUserContent(content, attachments) {
425
- if (attachments.length === 0)
426
- return content;
427
- const textSections = [content.trim() ? content : 'Please review the attached file(s).'];
428
- const imageParts = [];
429
- for (const attachment of attachments) {
430
- if (!this.artifactStore)
431
- continue;
432
- try {
433
- if (this.isInlineTextAttachment(attachment)) {
434
- const { buffer } = await this.artifactStore.readContent(attachment.artifactId);
435
- const text = toNodeBuffer(buffer).toString('utf-8');
436
- textSections.push(`\n\n--- Attachment: ${attachment.label ?? attachment.filename ?? attachment.artifactId} ---\n${text}`);
437
- continue;
438
- }
439
- if (this.isInlineImageAttachment(attachment)) {
440
- const { buffer } = await this.artifactStore.readContent(attachment.artifactId);
441
- imageParts.push({
442
- type: 'image',
443
- mediaType: attachment.mimeType,
444
- data: toNodeBuffer(buffer).toString('base64'),
445
- });
446
- }
447
- }
448
- catch (error) {
449
- logger.warn('[companion-chat] failed to inline attachment for provider prompt', {
450
- artifactId: attachment.artifactId,
451
- error: summarizeError(error),
452
- });
453
- }
454
- }
455
- textSections.push(this.formatAttachmentSummary(attachments));
456
- if (imageParts.length === 0)
457
- return textSections.join('');
458
- return [{ type: 'text', text: textSections.join('') }, ...imageParts];
459
- }
460
398
  dispose() {
461
399
  if (this.gcTimer) {
462
400
  clearInterval(this.gcTimer);
@@ -563,11 +501,11 @@ export class CompanionChatManager {
563
501
  completed = true;
564
502
  break;
565
503
  }
566
- const toolResults = await this._executeToolCalls(toolCalls, publish, sessionId, turnId);
504
+ const toolResults = await executeCompanionToolCalls({ toolRegistry: this.toolRegistry, permissionManager: this.permissionManager, hookDispatcher: this.hookDispatcher, runtimeBus: this.runtimeBus }, toolCalls, publish, sessionId, turnId);
567
505
  session.conversation.addToolResults(toolResults);
568
506
  }
569
507
  if (!completed && !abortSignal.aborted) {
570
- const finalResponse = await this._finalizeAfterToolExhaustion(session, abortSignal, turnId, publish);
508
+ const finalResponse = await runToolExhaustionFinalizer({ provider: this.provider, finalizerPrompt: TOOL_EXHAUSTION_FINALIZER_PROMPT }, session, abortSignal, turnId, publish);
571
509
  if (finalResponse.trim()) {
572
510
  assistantContent += finalResponse;
573
511
  session.conversation.addAssistantMessage(finalResponse);
@@ -623,113 +561,120 @@ export class CompanionChatManager {
623
561
  }
624
562
  }
625
563
  }
626
- async _finalizeAfterToolExhaustion(session, abortSignal, turnId, publish) {
627
- const sessionId = session.meta.id;
628
- let finalContent = '';
629
- const stream = this.provider.chatStream([...session.conversation.getMessagesForLLM()], {
630
- systemPrompt: appendGoodVibesRuntimeAwarenessPrompt([session.meta.systemPrompt, TOOL_EXHAUSTION_FINALIZER_PROMPT].filter(Boolean).join('\n\n')),
631
- model: session.meta.model,
632
- provider: session.meta.provider,
633
- abortSignal,
634
- });
635
- for await (const chunk of stream) {
636
- if (abortSignal.aborted)
637
- break;
638
- switch (chunk.type) {
639
- case 'text_delta': {
640
- const delta = chunk.delta ?? '';
641
- finalContent += delta;
642
- publish({ type: 'turn.delta', sessionId, turnId, delta });
643
- break;
644
- }
645
- case 'error':
646
- throw new Error(chunk.error ?? 'Provider streaming error');
647
- case 'tool_call':
648
- case 'tool_result':
649
- case 'done':
650
- break;
651
- }
652
- }
653
- return finalContent;
564
+ // ---------------------------------------------------------------------------
565
+ // Regenerate + edit-and-branch (honest lineage — see companion-chat-branching.ts)
566
+ // ---------------------------------------------------------------------------
567
+ /**
568
+ * Regenerate an assistant response: supersede the target assistant message (an
569
+ * explicit id, or the latest response) and everything after it — retained as
570
+ * history, never deleted — then re-run a fresh turn from the preceding user
571
+ * message. Refuses a closed (409 SESSION_CLOSED) or unknown (404
572
+ * SESSION_NOT_FOUND) session; honest code when there is nothing to regenerate.
573
+ */
574
+ regenerateMessage(sessionId, input = {}) {
575
+ const session = this._requireOpenSession(sessionId);
576
+ this.rateLimiter?.check(sessionId, '');
577
+ const now = Date.now();
578
+ const plan = planRegenerate(session, input.messageId, now);
579
+ this._commitBranchAndRun(session, sessionId, plan.anchorUserMessageId, now);
580
+ const { regeneratedFrom, supersededMessageIds } = plan;
581
+ return { sessionId, regeneratedFrom, supersededMessageIds, turnStarted: true };
654
582
  }
655
- async _executeToolCalls(toolCalls, publish, sessionId, turnId) {
656
- const toolRegistry = this.toolRegistry;
657
- if (!toolRegistry)
658
- return [];
659
- if (!this.permissionManager) {
660
- return toolCalls.map((call) => {
661
- const toolResult = {
662
- callId: call.id,
663
- success: false,
664
- error: 'Tool execution denied: permission manager unavailable for companion chat',
665
- };
666
- publish({
667
- type: 'turn.tool_result',
668
- sessionId,
669
- turnId,
670
- toolCallId: call.id,
671
- toolName: call.name,
672
- result: toolResult.error,
673
- isError: true,
674
- });
675
- return toolResult;
676
- });
583
+ /**
584
+ * Edit a user message and branch from it: supersede the target user message and
585
+ * everything after it (retained history), append a new user message carrying
586
+ * `revisionOf` back to the original, and run a fresh turn. Same closed/unknown
587
+ * refusals as {@link regenerateMessage}.
588
+ */
589
+ editMessage(sessionId, input) {
590
+ const session = this._requireOpenSession(sessionId);
591
+ this.rateLimiter?.check(sessionId, '');
592
+ const now = Date.now();
593
+ const plan = applyEditBranch(session, sessionId, input, this.artifactStore, now);
594
+ this._commitBranchAndRun(session, sessionId, plan.newMessageId, now);
595
+ const { editedFrom, newMessageId, supersededMessageIds } = plan;
596
+ return { sessionId, editedFrom, messageId: newMessageId, supersededMessageIds, turnStarted: true };
597
+ }
598
+ /** Look up an active (open) session or throw the closed/not-found machine codes. */
599
+ _requireOpenSession(sessionId) {
600
+ const session = this.sessions.get(sessionId);
601
+ if (!session) {
602
+ throw Object.assign(new Error(`Session not found: ${sessionId}`), { code: 'SESSION_NOT_FOUND', status: 404 });
677
603
  }
678
- const results = await executeOrchestratorToolCalls({
679
- toolRegistry,
680
- permissionManager: this.permissionManager,
681
- hookDispatcher: this.hookDispatcher,
682
- runtimeBus: this.runtimeBus,
683
- sessionId,
684
- emitterContext: (id) => ({
685
- sessionId,
686
- traceId: `${sessionId}:${id}`,
687
- source: 'companion-chat',
688
- }),
689
- }, turnId, toolCalls);
690
- for (const [index, toolResult] of results.entries()) {
691
- const call = toolCalls[index];
692
- if (!call)
693
- continue;
694
- publish({
695
- type: 'turn.tool_result',
696
- sessionId,
697
- turnId,
698
- toolCallId: call.id,
699
- toolName: call.name,
700
- result: toolResult.output ?? toolResult.error ?? null,
701
- isError: !toolResult.success,
702
- });
604
+ if (session.meta.status === 'closed') {
605
+ throw Object.assign(new Error('Session is closed'), { code: SDKErrorCodes.SESSION_CLOSED, status: 409 });
703
606
  }
704
- return results;
607
+ return session;
608
+ }
609
+ /**
610
+ * Shared tail of regenerate/edit: rebuild the LLM-facing conversation from the
611
+ * ACTIVE (non-superseded) chain (mirroring init()'s replay so the next turn
612
+ * sees only the live branch), persist, and fire the new turn.
613
+ */
614
+ _commitBranchAndRun(session, sessionId, anchorUserMessageId, now) {
615
+ const conversation = new ConversationManager();
616
+ for (const msg of activeMessages(session.messages)) {
617
+ if (msg.role === 'user')
618
+ conversation.addUserMessage(buildReplayUserContent(msg));
619
+ else
620
+ conversation.addAssistantMessage(msg.content);
621
+ }
622
+ session.conversation = conversation;
623
+ this._updateMeta(session, { messageCount: session.messages.length, updatedAt: now });
624
+ this._persist(sessionId);
625
+ void this._runTurn(session, anchorUserMessageId).catch((error) => {
626
+ logger.warn('[companion-chat] branch turn execution failed', { sessionId, error: summarizeError(error) });
627
+ });
705
628
  }
706
629
  // ---------------------------------------------------------------------------
707
630
  // GC sweep
708
631
  // ---------------------------------------------------------------------------
632
+ /**
633
+ * Periodic GC sweep. Deletion authority is SPLIT (charter: closed sessions are
634
+ * HISTORY): close-idle closes an idle active session; evict-memory drops a
635
+ * long-closed session's in-memory handles (meta + on-disk copy kept);
636
+ * delete-persistent removes the file ONLY under an explicit finite retention
637
+ * window (default retains indefinitely — see {@link planCompanionSweep}).
638
+ */
709
639
  _gcSweep() {
710
640
  const now = Date.now();
711
641
  for (const [id, session] of this.sessions) {
712
- if (session.meta.status === 'closed') {
713
- // Remove already-closed sessions after a short grace period (5 min)
714
- if (now - (session.meta.closedAt ?? now) > 5 * 60_000) {
715
- void this.persistence?.delete(id).catch((error) => {
642
+ const action = planCompanionSweep({
643
+ status: session.meta.status,
644
+ closedAt: session.meta.closedAt,
645
+ lastActivityAt: session.lastActivityAt,
646
+ hasMessagesInMemory: !session.messagesEvicted && session.messages.length > 0,
647
+ isEmpty: session.messages.length === 0,
648
+ }, {
649
+ now,
650
+ idleActiveMs: this.idleActiveMs,
651
+ idleEmptyMs: this.idleEmptyMs,
652
+ closedMemoryGraceMs: this.closedMemoryGraceMs,
653
+ closedRetentionMs: this.closedRetentionMs,
654
+ });
655
+ switch (action.kind) {
656
+ case 'close-idle':
657
+ session.abortController.abort();
658
+ this._updateMeta(session, { status: 'closed', closedAt: now, updatedAt: now });
659
+ this._persist(id);
660
+ this._brokerSync.track(id, () => this._brokerSync.closeSession(id));
661
+ break;
662
+ case 'evict-memory':
663
+ // Free heavy handles; keep meta (listable) and the persisted file.
664
+ session.messages = [];
665
+ session.conversation = new ConversationManager();
666
+ session.messagesEvicted = true;
667
+ break;
668
+ case 'delete-persistent':
669
+ void this._hardRemove(id).catch((error) => {
716
670
  logger.warn('[companion-chat] session delete failed', {
717
671
  sessionId: id,
718
672
  error: summarizeError(error),
719
673
  });
720
674
  });
721
- this.sessions.delete(id);
722
- }
723
- continue;
724
- }
725
- const idleMs = now - session.lastActivityAt;
726
- const isEmpty = session.messages.length === 0;
727
- const ttl = isEmpty ? this.idleEmptyMs : this.idleActiveMs;
728
- if (idleMs >= ttl) {
729
- // Close via GC
730
- session.abortController.abort();
731
- this._updateMeta(session, { status: 'closed', closedAt: now, updatedAt: now });
732
- this._persist(id);
675
+ break;
676
+ case 'retain':
677
+ break;
733
678
  }
734
679
  }
735
680
  }
@@ -738,6 +683,33 @@ export class CompanionChatManager {
738
683
  session.meta = updated;
739
684
  return updated;
740
685
  }
686
+ // ---------------------------------------------------------------------------
687
+ // Live shared-broker registration (S1 item D) — see companion-chat-broker-sync.ts
688
+ // ---------------------------------------------------------------------------
689
+ /**
690
+ * Await all in-flight best-effort broker-sync operations. The daemon's
691
+ * companion HTTP routes call this before responding so `/api/sessions`
692
+ * reflects the change synchronously; tests use it to make the mirror
693
+ * deterministic. A no-op when no broker bridge is configured.
694
+ */
695
+ async flushBrokerSync() {
696
+ await this._brokerSync.flush();
697
+ }
698
+ /**
699
+ * Hard-remove a session's persisted file and in-memory record. The ONE
700
+ * removal code path — shared by {@link deleteSession} and the GC
701
+ * 'delete-persistent' action. Never fork this. Order matters:
702
+ * drop the map entry, drain any in-flight {@link _persist} save for this
703
+ * id, THEN unlink — else a save mid-write from {@link closeSession} can
704
+ * resurrect the file post-unlink.
705
+ */
706
+ async _hardRemove(sessionId) {
707
+ this.sessions.delete(sessionId);
708
+ const pendingSave = this._pendingSaves.get(sessionId);
709
+ if (pendingSave)
710
+ await pendingSave.catch(() => { });
711
+ await this.persistence?.delete(sessionId);
712
+ }
741
713
  /**
742
714
  * Schedule a persistence save for the given session.
743
715
  * Saves are serialized per-session: each new save waits for the prior one to
@@ -16,7 +16,15 @@ export interface PersistedChatSession {
16
16
  readonly meta: CompanionChatSession;
17
17
  readonly messages: CompanionChatMessage[];
18
18
  }
19
- export declare function defaultSessionsDir(): string;
19
+ /**
20
+ * Resolve the companion-chat sessions directory.
21
+ *
22
+ * Pass the runtime's INJECTED home directory so an isolated-home daemon never
23
+ * reads or writes the real `~/.goodvibes/companion-chat` — the rest of the
24
+ * runtime resolves paths from the injected home, and this must agree. The
25
+ * OS `homedir()` is used only as a last resort when nothing is injected.
26
+ */
27
+ export declare function defaultSessionsDir(homeDirectory?: string): string;
20
28
  export declare class CompanionChatPersistence {
21
29
  private readonly sessionsDir;
22
30
  constructor(sessionsDir?: string);
@@ -1 +1 @@
1
- {"version":3,"file":"companion-chat-persistence.d.ts","sourceRoot":"","sources":["../../../src/platform/companion/companion-chat-persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAQ5F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,EAAE,CAAC;CAC3C;AAMD,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAMD,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,WAAW,CAAC,EAAE,MAAM;IAIhC,4CAA4C;IAC5C,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,QAAQ;IAIhB,0FAA0F;IACpF,OAAO,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAoChD,iFAAiF;IAC3E,IAAI,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BxD,yGAAyG;IACnG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAU/C"}
1
+ {"version":3,"file":"companion-chat-persistence.d.ts","sourceRoot":"","sources":["../../../src/platform/companion/companion-chat-persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAQ5F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,EAAE,CAAC;CAC3C;AAMD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjE;AAMD,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,WAAW,CAAC,EAAE,MAAM;IAIhC,4CAA4C;IAC5C,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,QAAQ;IAIhB,0FAA0F;IACpF,OAAO,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAoChD,iFAAiF;IAC3E,IAAI,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BxD,yGAAyG;IACnG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAU/C"}
@@ -20,8 +20,16 @@ import { summarizeError } from '../utils/error-display.js';
20
20
  // ---------------------------------------------------------------------------
21
21
  // Default path
22
22
  // ---------------------------------------------------------------------------
23
- export function defaultSessionsDir() {
24
- return join(homedir(), '.goodvibes', 'companion-chat', 'sessions');
23
+ /**
24
+ * Resolve the companion-chat sessions directory.
25
+ *
26
+ * Pass the runtime's INJECTED home directory so an isolated-home daemon never
27
+ * reads or writes the real `~/.goodvibes/companion-chat` — the rest of the
28
+ * runtime resolves paths from the injected home, and this must agree. The
29
+ * OS `homedir()` is used only as a last resort when nothing is injected.
30
+ */
31
+ export function defaultSessionsDir(homeDirectory) {
32
+ return join(homeDirectory ?? homedir(), '.goodvibes', 'companion-chat', 'sessions');
25
33
  }
26
34
  // ---------------------------------------------------------------------------
27
35
  // CompanionChatPersistence
@@ -7,7 +7,8 @@
7
7
  * POST /api/companion/chat/sessions
8
8
  * GET /api/companion/chat/sessions/:sessionId
9
9
  * PATCH /api/companion/chat/sessions/:sessionId
10
- * DELETE /api/companion/chat/sessions/:sessionId
10
+ * POST /api/companion/chat/sessions/:sessionId/close (soft close — history preserved)
11
+ * DELETE /api/companion/chat/sessions/:sessionId (hard delete — record permanently removed)
11
12
  * POST /api/companion/chat/sessions/:sessionId/messages
12
13
  * GET /api/companion/chat/sessions/:sessionId/messages
13
14
  * GET /api/companion/chat/sessions/:sessionId/events (SSE)
@@ -1 +1 @@
1
- {"version":3,"file":"companion-chat-routes.d.ts","sourceRoot":"","sources":["../../../src/platform/companion/companion-chat-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AASH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAMjF;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAoD1B;AA8MD;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAMlF"}
1
+ {"version":3,"file":"companion-chat-routes.d.ts","sourceRoot":"","sources":["../../../src/platform/companion/companion-chat-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAYH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAMjF;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAmE1B;AAgPD;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAMlF"}