@xopcai/xopc 0.0.223 → 0.0.225

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 (197) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/demo-memory/src/index.js +10 -1
  3. package/dist/extensions/telegram/xopc.extension.json +1 -1
  4. package/dist/gateway/static/root/assets/{activity-store--GBciH10.js → activity-store-CtTYnku4.js} +1 -1
  5. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-C93T3FLD.js → agent-avatar-dicebear-dizuqu_4.js} +1 -1
  6. package/dist/gateway/static/root/assets/agents-DeEEFZJ4.js +68 -0
  7. package/dist/gateway/static/root/assets/{api-HoIz_ija.js → api-CLRMz2BT.js} +1 -1
  8. package/dist/gateway/static/root/assets/{app-management-settings-panel-Bhl8Xluk.js → app-management-settings-panel-Cnk-DtQh.js} +1 -1
  9. package/dist/gateway/static/root/assets/{appearance-settings-CywEN-kG.js → appearance-settings-wP0rogVI.js} +1 -1
  10. package/dist/gateway/static/root/assets/{apps-page-BZY09nuJ.js → apps-page-Db5YNHVM.js} +1 -1
  11. package/dist/gateway/static/root/assets/{archive-plugin-CteCVsBP.js → archive-plugin-Cpzsm-DM.js} +1 -1
  12. package/dist/gateway/static/root/assets/{attachment-load-CbNE_EPd.js → attachment-load-Bd2OOoEK.js} +1 -1
  13. package/dist/gateway/static/root/assets/{automations-page-Bcqk6tOx.js → automations-page-DNqhguyk.js} +1 -1
  14. package/dist/gateway/static/root/assets/automations-workspace-CNT05YTb.js +6 -0
  15. package/dist/gateway/static/root/assets/{binary-plugins-M_i3WS5M.js → binary-plugins-Dcma5HdI.js} +1 -1
  16. package/dist/gateway/static/root/assets/{block-editor-eg9LEH2o.js → block-editor-D-B8ThwK.js} +3 -3
  17. package/dist/gateway/static/root/assets/{browser-settings-page-kKwbvzjj.js → browser-settings-page-UbDj3LIq.js} +3 -3
  18. package/dist/gateway/static/root/assets/{browser-workflow-inputs-1UZ0vnIy.js → browser-workflow-inputs-BAPZIXrs.js} +1 -1
  19. package/dist/gateway/static/root/assets/{browser-workflows-page-D8ATQqZ5.js → browser-workflows-page-DHtaSKEh.js} +1 -1
  20. package/dist/gateway/static/root/assets/capabilities-settings-panel-CiO152QS.js +7 -0
  21. package/dist/gateway/static/root/assets/{capability-presets-api-yNqTIuyd.js → capability-presets-api-zsZQ7im3.js} +1 -1
  22. package/dist/gateway/static/root/assets/{capability-presets-settings-panel-CgdRkwnk.js → capability-presets-settings-panel-Bc_hRwfL.js} +2 -2
  23. package/dist/gateway/static/root/assets/{channel-recipient-api-krezGsKc.js → channel-recipient-api-Cp8iaaXp.js} +1 -1
  24. package/dist/gateway/static/root/assets/channels-settings-CFW7zBoT.js +1 -0
  25. package/dist/gateway/static/root/assets/channels-status-swr-5rNVq7iI.js +1 -0
  26. package/dist/gateway/static/root/assets/{chat-terminal-dock-DQ5bB4Su.js → chat-terminal-dock-Dr6Rq2ln.js} +1 -1
  27. package/dist/gateway/static/root/assets/connectors-page-DLBr5nre.js +2 -0
  28. package/dist/gateway/static/root/assets/{cron-expression-CEwPkdhh.js → cron-expression-BiXrpzmo.js} +1 -1
  29. package/dist/gateway/static/root/assets/{date-picker-DDAxTir8.js → date-picker-BPuRtwKt.js} +1 -1
  30. package/dist/gateway/static/root/assets/{dependency-picker-CYVoSZwI.js → dependency-picker-BNC_W7wI.js} +1 -1
  31. package/dist/gateway/static/root/assets/{desktop-pet-CrNKfW_c.js → desktop-pet-DzOpt5nI.js} +1 -1
  32. package/dist/gateway/static/root/assets/{desktop-pet-settings-C06PaB46.js → desktop-pet-settings-BW0brCvH.js} +1 -1
  33. package/dist/gateway/static/root/assets/{directory-picker-path-field--D7laeLF.js → directory-picker-path-field-Baml0uTS.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-debug-page-Dn4Px9KQ.js → extension-debug-page-CBXyKmfS.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-page-DzLf3fMQ.js → extension-page-BBhcr_SZ.js} +1 -1
  36. package/dist/gateway/static/root/assets/{extension-settings-page-DIchwtvB.js → extension-settings-page-4rwWpN9_.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-config-api-SmTGLhqK.js → gateway-config-api-Dg-BlBe4.js} +1 -1
  38. package/dist/gateway/static/root/assets/{gateway-config-swr-yUxMMVjK.js → gateway-config-swr-Du0MvK9s.js} +1 -1
  39. package/dist/gateway/static/root/assets/{gateway-settings-yCDkOYzA.js → gateway-settings-BOuYZOYe.js} +1 -1
  40. package/dist/gateway/static/root/assets/{gateway-startup-retry-9mrsL84j.js → gateway-startup-retry-JbjcHCaN.js} +1 -1
  41. package/dist/gateway/static/root/assets/{heartbeat-settings-CquIULHX.js → heartbeat-settings-Dq4YAlSx.js} +1 -1
  42. package/dist/gateway/static/root/assets/home-page-BIXkO0Ck.js +1 -0
  43. package/dist/gateway/static/root/assets/{image-generation-api-CgFAGDi8.js → image-generation-api-G2tfPvKP.js} +1 -1
  44. package/dist/gateway/static/root/assets/index-Csccu8sa.js +74 -0
  45. package/dist/gateway/static/root/assets/index-D3_xSYKd.css +2 -0
  46. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DI2To7yl.js → keyboard-shortcuts-settings-L1Vtxgp9.js} +1 -1
  47. package/dist/gateway/static/root/assets/local-app-workbench-page-D-eacBcO.js +2 -0
  48. package/dist/gateway/static/root/assets/{local-apps-page-CSEJsQ1F.js → local-apps-page--thlkBLS.js} +1 -1
  49. package/dist/gateway/static/root/assets/{locale-store-CPylQjH9.js → locale-store-DqJz-cOR.js} +1 -1
  50. package/dist/gateway/static/root/assets/logs-page-BRCglHvd.js +2 -0
  51. package/dist/gateway/static/root/assets/{management-settings-CgyaIyuk.js → management-settings-p55fR4XO.js} +1 -1
  52. package/dist/gateway/static/root/assets/{markdown-split-paG9qap9.js → markdown-split-DwMcRlBR.js} +1 -1
  53. package/dist/gateway/static/root/assets/{markdown-view-CUsob4Pz.js → markdown-view-CTB9u15e.js} +1 -1
  54. package/dist/gateway/static/root/assets/{media-plugins-0Q-c_QIy.js → media-plugins-O6H3GZn7.js} +1 -1
  55. package/dist/gateway/static/root/assets/{messages-B82nsi9k.js → messages-CeydamsI.js} +3 -3
  56. package/dist/gateway/static/root/assets/{notes-api-CfKZYrBC.js → notes-api-CrjQbmk1.js} +1 -1
  57. package/dist/gateway/static/root/assets/{notes-page-Bvb-ycX_.js → notes-page-miO9ig9C.js} +1 -1
  58. package/dist/gateway/static/root/assets/notes-workbench-_13lmvmF.js +4 -0
  59. package/dist/gateway/static/root/assets/{product-open-page-DrvBwAns.js → product-open-page-BOu07nXf.js} +1 -1
  60. package/dist/gateway/static/root/assets/project-detail-page-BStRkOQr.js +1 -0
  61. package/dist/gateway/static/root/assets/projects-page-CY03RxVr.js +1 -0
  62. package/dist/gateway/static/root/assets/{registry-api-B_5D8epF.js → registry-api-Bf_HDLUJ.js} +1 -1
  63. package/dist/gateway/static/root/assets/remote-access-hub-B19llkld.js +1 -0
  64. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-DKjdN4Lr.js → runtime-tools-settings-panel-DthuRqUH.js} +1 -1
  65. package/dist/gateway/static/root/assets/{schema-form-DskqaNqC.js → schema-form-8W8PhXxa.js} +1 -1
  66. package/dist/gateway/static/root/assets/sessions-page-BDA2qbTd.js +1 -0
  67. package/dist/gateway/static/root/assets/settings-advanced-gate-BONIDX4v.js +1 -0
  68. package/dist/gateway/static/root/assets/{settings-form-section-CZlMvHA9.js → settings-form-section-CrsKGYiG.js} +1 -1
  69. package/dist/gateway/static/root/assets/{settings-loading-skeleton-DS6lcAg9.js → settings-loading-skeleton-WJtI0AAq.js} +1 -1
  70. package/dist/gateway/static/root/assets/{settings-page-oE5J9tsV.js → settings-page-PCjwRF47.js} +1 -1
  71. package/dist/gateway/static/root/assets/{setup-status-panel-C7oFCIqD.js → setup-status-panel-D65CwlNC.js} +1 -1
  72. package/dist/gateway/static/root/assets/{share-preview-page-CPFAj8NE.js → share-preview-page-BGtvLLeZ.js} +1 -1
  73. package/dist/gateway/static/root/assets/shares-settings-CdzVKrBl.js +1 -0
  74. package/dist/gateway/static/root/assets/skill-reload-api-CsRWid5h.js +1 -0
  75. package/dist/gateway/static/root/assets/{skills-page-Bh4gFi8e.js → skills-page-C_npyryI.js} +1 -1
  76. package/dist/gateway/static/root/assets/{skills-page.utils-BQaUWP9z.js → skills-page.utils-C46Sd78k.js} +1 -1
  77. package/dist/gateway/static/root/assets/{system-settings-panel-COAZoh_O.js → system-settings-panel-DomTLwki.js} +1 -1
  78. package/dist/gateway/static/root/assets/task-detail-page-B6YFX7kK.js +1 -0
  79. package/dist/gateway/static/root/assets/{theme-store-BN-32Fz5.js → theme-store-Ce7wq__X.js} +1 -1
  80. package/dist/gateway/static/root/assets/{use-autosave-BAkToU15.js → use-autosave-Do9mCRcY.js} +1 -1
  81. package/dist/gateway/static/root/assets/{user-context-page-Br5wgARM.js → user-context-page-CiCQA40E.js} +1 -1
  82. package/dist/gateway/static/root/assets/{voice-api-key-field-CC4z9-ux.js → voice-api-key-field-Bc5p-0tX.js} +1 -1
  83. package/dist/gateway/static/root/assets/{work-discovery-overlay-dLVUYSSE.js → work-discovery-overlay-BieqsmT1.js} +1 -1
  84. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-BYU5-0KF.js → workflow-run-setup-panel-DVj8iYvm.js} +2 -2
  85. package/dist/gateway/static/root/assets/workflows-page-AG04TTuH.js +5 -0
  86. package/dist/gateway/static/root/index.html +11 -11
  87. package/dist/package.js +1 -1
  88. package/dist/src/agent/embedded/run-turn.js +2 -0
  89. package/dist/src/agent/mcp/bundle-mcp-config.d.ts +9 -1
  90. package/dist/src/agent/mcp/bundle-mcp-config.js +11 -15
  91. package/dist/src/agent/mcp/embedded-mcp.d.ts +1 -1
  92. package/dist/src/agent/mcp/index.d.ts +1 -0
  93. package/dist/src/agent/mcp/index.js +7 -1
  94. package/dist/src/agent/mcp/mcp-http.d.ts +4 -0
  95. package/dist/src/agent/mcp/mcp-http.js +25 -1
  96. package/dist/src/agent/mcp/mcp-transport-config.d.ts +4 -0
  97. package/dist/src/agent/mcp/mcp-transport-config.js +1 -0
  98. package/dist/src/agent/mcp/mcp-transport.d.ts +7 -1
  99. package/dist/src/agent/mcp/mcp-transport.js +38 -11
  100. package/dist/src/agent/mcp/oauth/index.d.ts +6 -0
  101. package/dist/src/agent/mcp/oauth/index.js +6 -0
  102. package/dist/src/agent/mcp/oauth/mcp-oauth-errors.d.ts +5 -0
  103. package/dist/src/agent/mcp/oauth/mcp-oauth-errors.js +14 -0
  104. package/dist/src/agent/mcp/oauth/mcp-oauth-manager.d.ts +25 -0
  105. package/dist/src/agent/mcp/oauth/mcp-oauth-manager.js +219 -0
  106. package/dist/src/agent/mcp/oauth/mcp-oauth-provider.d.ts +33 -0
  107. package/dist/src/agent/mcp/oauth/mcp-oauth-provider.js +103 -0
  108. package/dist/src/agent/mcp/oauth/mcp-oauth-session.d.ts +29 -0
  109. package/dist/src/agent/mcp/oauth/mcp-oauth-session.js +169 -0
  110. package/dist/src/agent/mcp/oauth/mcp-oauth-store.d.ts +9 -0
  111. package/dist/src/agent/mcp/oauth/mcp-oauth-store.js +79 -0
  112. package/dist/src/agent/mcp/oauth/mcp-oauth-types.d.ts +22 -0
  113. package/dist/src/agent/mcp/oauth/mcp-oauth-types.js +1 -0
  114. package/dist/src/agent/memory/builtin-provider.js +23 -4
  115. package/dist/src/agent/memory/compaction-promotion.d.ts +18 -0
  116. package/dist/src/agent/memory/compaction-promotion.js +211 -0
  117. package/dist/src/agent/memory/context/types.d.ts +5 -0
  118. package/dist/src/agent/memory/manager.d.ts +3 -0
  119. package/dist/src/agent/memory/manager.js +12 -2
  120. package/dist/src/agent/memory/trusted-recall.d.ts +7 -0
  121. package/dist/src/agent/memory/trusted-recall.js +53 -0
  122. package/dist/src/agent/memory/turn-provenance.d.ts +14 -0
  123. package/dist/src/agent/memory/turn-provenance.js +60 -0
  124. package/dist/src/agent/memory/types.d.ts +18 -3
  125. package/dist/src/agent/memory/user-context-coordinator.js +57 -6
  126. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +2 -0
  127. package/dist/src/agent/tools/memory-tool.js +5 -1
  128. package/dist/src/capabilities/store-connector.js +99 -10
  129. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  130. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  131. package/dist/src/config/config-mutation.d.ts +14 -0
  132. package/dist/src/config/config-mutation.js +33 -0
  133. package/dist/src/config/index.js +3 -3
  134. package/dist/src/config/paths.d.ts +2 -0
  135. package/dist/src/config/paths.js +5 -1
  136. package/dist/src/config/schema.d.ts +17 -0
  137. package/dist/src/config/schema.js +26 -2
  138. package/dist/src/connectors/auth-provider-registry.d.ts +1 -1
  139. package/dist/src/connectors/auth-provider-registry.js +23 -2
  140. package/dist/src/connectors/install.js +3 -3
  141. package/dist/src/connectors/instances.d.ts +2 -1
  142. package/dist/src/connectors/instances.js +15 -5
  143. package/dist/src/connectors/materialize.d.ts +1 -0
  144. package/dist/src/connectors/materialize.js +9 -1
  145. package/dist/src/connectors/runtime-adapter-registry.js +1 -0
  146. package/dist/src/connectors/types.d.ts +4 -1
  147. package/dist/src/extensions/connector-dependencies.d.ts +10 -0
  148. package/dist/src/extensions/connector-dependencies.js +65 -0
  149. package/dist/src/extensions/install.js +27 -0
  150. package/dist/src/extensions/normalize-manifest.js +1 -0
  151. package/dist/src/extensions/types/manifest.d.ts +2 -0
  152. package/dist/src/gateway/heartbeat/service.js +1 -1
  153. package/dist/src/gateway/hono/routes/capabilities.js +8 -8
  154. package/dist/src/gateway/hono/routes/connectors.js +87 -55
  155. package/dist/src/gateway/hono/routes/mcp.js +77 -5
  156. package/dist/src/gateway/hono/routes/voice.js +1 -1
  157. package/dist/src/gateway/run-loop.js +3 -0
  158. package/dist/src/gateway/server.d.ts +3 -0
  159. package/dist/src/gateway/server.js +30 -5
  160. package/dist/src/heartbeat/index.js +1 -1
  161. package/dist/src/infra/update-restart.js +1 -1
  162. package/dist/src/knowledge/connected-knowledge-pipeline.js +26 -4
  163. package/dist/src/session/store.js +27 -0
  164. package/dist/src/storage/sqlite/memory-records-repository.d.ts +9 -1
  165. package/dist/src/storage/sqlite/memory-records-repository.js +40 -6
  166. package/dist/src/storage/sqlite/migrations/134_memory_provenance.sql +18 -0
  167. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  168. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  169. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  170. package/dist/src/storage/sqlite/schema.js +1 -1
  171. package/dist/src/user-context/planner.js +8 -3
  172. package/dist/src/voice/stt/transcribe-core.js +17 -1
  173. package/dist/src/voice/stt/types.d.ts +1 -1
  174. package/package.json +3 -3
  175. package/dist/gateway/static/root/assets/agents-Ba4XF0Im.js +0 -68
  176. package/dist/gateway/static/root/assets/automations-workspace-DtI6vsMf.js +0 -6
  177. package/dist/gateway/static/root/assets/capabilities-settings-panel-CZRcis8B.js +0 -7
  178. package/dist/gateway/static/root/assets/channels-settings-DETCY0Ku.js +0 -1
  179. package/dist/gateway/static/root/assets/channels-status-swr-DMxB7slL.js +0 -1
  180. package/dist/gateway/static/root/assets/connectors-page-D9D92u28.js +0 -2
  181. package/dist/gateway/static/root/assets/home-page-COSGBh4c.js +0 -1
  182. package/dist/gateway/static/root/assets/index-5XkDWH_Q.css +0 -2
  183. package/dist/gateway/static/root/assets/index-wnDPGRTi.js +0 -74
  184. package/dist/gateway/static/root/assets/local-app-workbench-page-CAF5SZXv.js +0 -2
  185. package/dist/gateway/static/root/assets/logs-page-D1KFPHL1.js +0 -2
  186. package/dist/gateway/static/root/assets/notes-workbench-DelxGBof.js +0 -4
  187. package/dist/gateway/static/root/assets/project-detail-page-C2EnYXEQ.js +0 -1
  188. package/dist/gateway/static/root/assets/projects-page-BiMPU6Oa.js +0 -1
  189. package/dist/gateway/static/root/assets/remote-access-hub-CpbNivVs.js +0 -1
  190. package/dist/gateway/static/root/assets/sessions-page-BxKtzsKI.js +0 -1
  191. package/dist/gateway/static/root/assets/settings-advanced-gate-BfBKMMUx.js +0 -1
  192. package/dist/gateway/static/root/assets/shares-settings-B46DWZK4.js +0 -1
  193. package/dist/gateway/static/root/assets/skill-reload-api-CyKolUZ-.js +0 -1
  194. package/dist/gateway/static/root/assets/task-detail-page-CXkhprf-.js +0 -1
  195. package/dist/gateway/static/root/assets/workflows-page-CJ24a1HM.js +0 -5
  196. package/dist/src/extensions/bundle-mcp.d.ts +0 -18
  197. package/dist/src/extensions/bundle-mcp.js +0 -69
@@ -13,8 +13,9 @@ import { listConnectorProviders } from "../../../connectors/providers.js";
13
13
  import { getConnectorDefinition, listConnectorCatalog } from "../../../connectors/catalog.js";
14
14
  import { listUnderstandingSourceGrants, revokeUnderstandingSourceGrant } from "../../../user-context/sources/repository.js";
15
15
  import { recordConnectorHealthUsage } from "../../../connectors/usage.js";
16
- import { getConnectorInstance, listConnectorInstances } from "../../../connectors/instances.js";
16
+ import { getConnectorInstance, getInstalledConnectorDefinition, listConnectorInstances } from "../../../connectors/instances.js";
17
17
  import { installConnector, installConnectorDefinition, uninstallConnector, updateConnectorConfig } from "../../../connectors/install.js";
18
+ import { getMcpOAuthManager } from "../../../agent/mcp/oauth/mcp-oauth-manager.js";
18
19
  import { startConnectorAuthorization } from "../../../connectors/auth-provider-registry.js";
19
20
  import { composioLogoResponse } from "../../../connectors/composio-logo.js";
20
21
  import { inspectManagedComposioStatus } from "../../../connectors/composio-managed-client.js";
@@ -25,6 +26,7 @@ import { ingestLocalFolderSource } from "../../../connectors/connected-source-in
25
26
  import { previewConnectorDefinition, testConnectorInstance } from "../../../connectors/health.js";
26
27
  import { setConnectorEnabled } from "../../../connectors/lifecycle.js";
27
28
  import { projectComposioConnectionStatus } from "../../../connectors/runtime-status.js";
29
+ import { ConfigPersistenceError, persistConfigMutation } from "../../../config/config-mutation.js";
28
30
  //#region src/gateway/hono/routes/connectors.ts
29
31
  init_agent_scope();
30
32
  function errorMessage(error) {
@@ -48,9 +50,39 @@ function registerConnectorRoutes(authenticated, deps) {
48
50
  }
49
51
  });
50
52
  });
51
- authenticated.get("/api/connectors/installed", (c) => {
53
+ authenticated.get("/api/connectors/installed", async (c) => {
52
54
  const config = service.currentConfig;
53
- const instances = listConnectorInstances(config);
55
+ const instances = await Promise.all(listConnectorInstances(config).map(async (instance) => {
56
+ if (!instance.enabled || instance.materialized.type !== "mcp") return instance;
57
+ const server = config.mcp?.servers?.[instance.materialized.serverId];
58
+ if (!server) return instance;
59
+ const oauth = await getMcpOAuthManager().status(instance.materialized.serverId, server);
60
+ if (!oauth.configured) return instance;
61
+ if (oauth.status === "connected") return {
62
+ ...instance,
63
+ authStatus: "connected",
64
+ connectionStatus: "connected"
65
+ };
66
+ if (oauth.status === "authorizing") return {
67
+ ...instance,
68
+ status: "connecting",
69
+ authStatus: "unknown",
70
+ connectionStatus: "connecting"
71
+ };
72
+ if (oauth.status === "error") return {
73
+ ...instance,
74
+ status: "failed",
75
+ authStatus: "unauthorized",
76
+ connectionStatus: "error",
77
+ lastError: oauth.session?.error ?? instance.lastError
78
+ };
79
+ return {
80
+ ...instance,
81
+ status: "unauthorized",
82
+ authStatus: "missing",
83
+ connectionStatus: "disconnected"
84
+ };
85
+ }));
54
86
  const connections = listConnectorConnections({ principalId: "local-owner" });
55
87
  return c.json({
56
88
  ok: true,
@@ -348,12 +380,11 @@ function registerConnectorRoutes(authenticated, deps) {
348
380
  }, 400);
349
381
  const config = service.currentConfig;
350
382
  try {
351
- setComposioToolkitScope(config, toolkit, scope);
352
- const saved = await service.saveConfig(config);
353
- if (!saved.saved) return c.json({
354
- ok: false,
355
- error: saved.error
356
- }, 500);
383
+ await persistConfigMutation({
384
+ config,
385
+ mutate: () => setComposioToolkitScope(config, toolkit, scope),
386
+ save: () => service.saveConfig(config)
387
+ });
357
388
  return c.json({
358
389
  ok: true,
359
390
  payload: {
@@ -365,7 +396,7 @@ function registerConnectorRoutes(authenticated, deps) {
365
396
  return c.json({
366
397
  ok: false,
367
398
  error: errorMessage(error)
368
- }, 400);
399
+ }, error instanceof ConfigPersistenceError ? 500 : 400);
369
400
  }
370
401
  });
371
402
  authenticated.post("/api/connectors/composio/tools/:slug/execute", strictRateLimitMiddleware, async (c) => {
@@ -573,14 +604,16 @@ function registerConnectorRoutes(authenticated, deps) {
573
604
  });
574
605
  });
575
606
  authenticated.post("/api/connectors/:id/auth/start", strictRateLimitMiddleware, async (c) => {
576
- const connectorId = c.req.param("id");
577
- const connector = getConnectorDefinition(connectorId);
607
+ const connectorOrInstanceId = c.req.param("id");
608
+ const config = service.currentConfig;
609
+ const instance = getConnectorInstance(config, connectorOrInstanceId);
610
+ const connector = instance ? getInstalledConnectorDefinition(config, instance.instanceId) : getConnectorDefinition(connectorOrInstanceId);
578
611
  if (!connector) return c.json({
579
612
  ok: false,
580
- error: `Unknown connector: ${connectorId}`
613
+ error: `Unknown connector: ${connectorOrInstanceId}`
581
614
  }, 404);
582
615
  try {
583
- const authorization = await startConnectorAuthorization(connector, service.currentConfig);
616
+ const authorization = await startConnectorAuthorization(connector, config, instance?.instanceId);
584
617
  return c.json({
585
618
  ok: true,
586
619
  payload: { authorization }
@@ -628,12 +661,11 @@ function registerConnectorRoutes(authenticated, deps) {
628
661
  const registryDefinition = body && typeof body === "object" && !Array.isArray(body) && body.definition && typeof body.definition === "object" && !Array.isArray(body.definition) ? body.definition : void 0;
629
662
  const config = service.currentConfig;
630
663
  try {
631
- const instance = registryDefinition?.id === connectorId ? await installConnectorDefinition(config, registryDefinition, input) : await installConnector(config, connectorId, input);
632
- const saved = await service.saveConfig(config);
633
- if (!saved.saved) return c.json({
634
- ok: false,
635
- error: saved.error
636
- }, 500);
664
+ const instance = await persistConfigMutation({
665
+ config,
666
+ mutate: () => registryDefinition?.id === connectorId ? installConnectorDefinition(config, registryDefinition, input) : installConnector(config, connectorId, input),
667
+ save: () => service.saveConfig(config)
668
+ });
637
669
  return c.json({
638
670
  ok: true,
639
671
  payload: { instance }
@@ -642,7 +674,7 @@ function registerConnectorRoutes(authenticated, deps) {
642
674
  return c.json({
643
675
  ok: false,
644
676
  error: errorMessage(error)
645
- }, 400);
677
+ }, error instanceof ConfigPersistenceError ? 500 : 400);
646
678
  }
647
679
  });
648
680
  authenticated.post("/api/connectors/:id/test", async (c) => {
@@ -659,12 +691,11 @@ function registerConnectorRoutes(authenticated, deps) {
659
691
  }, 400);
660
692
  try {
661
693
  const result = await testConnectorInstance(config, instance.materialized.serverId);
662
- recordConnectorHealthUsage(config, instance.instanceId, result);
663
- const saved = await service.saveConfig(config);
664
- if (!saved.saved) return c.json({
665
- ok: false,
666
- error: saved.error
667
- }, 500);
694
+ await persistConfigMutation({
695
+ config,
696
+ mutate: () => recordConnectorHealthUsage(config, instance.instanceId, result),
697
+ save: () => service.saveConfig(config)
698
+ });
668
699
  return c.json({
669
700
  ok: true,
670
701
  payload: result
@@ -701,12 +732,11 @@ function registerConnectorRoutes(authenticated, deps) {
701
732
  const input = body && typeof body === "object" && !Array.isArray(body) ? body : {};
702
733
  const config = service.currentConfig;
703
734
  try {
704
- const instance = updateConnectorConfig(config, instanceId, input);
705
- const saved = await service.saveConfig(config);
706
- if (!saved.saved) return c.json({
707
- ok: false,
708
- error: saved.error
709
- }, 500);
735
+ const instance = await persistConfigMutation({
736
+ config,
737
+ mutate: () => updateConnectorConfig(config, instanceId, input),
738
+ save: () => service.saveConfig(config)
739
+ });
710
740
  return c.json({
711
741
  ok: true,
712
742
  payload: { instance }
@@ -715,19 +745,18 @@ function registerConnectorRoutes(authenticated, deps) {
715
745
  return c.json({
716
746
  ok: false,
717
747
  error: errorMessage(error)
718
- }, 400);
748
+ }, error instanceof ConfigPersistenceError ? 500 : 400);
719
749
  }
720
750
  });
721
751
  authenticated.post("/api/connectors/:id/enable", strictRateLimitMiddleware, async (c) => {
722
752
  const instanceId = c.req.param("id");
723
753
  const config = service.currentConfig;
724
754
  try {
725
- const instance = setConnectorEnabled(config, instanceId, true);
726
- const saved = await service.saveConfig(config);
727
- if (!saved.saved) return c.json({
728
- ok: false,
729
- error: saved.error
730
- }, 500);
755
+ const instance = await persistConfigMutation({
756
+ config,
757
+ mutate: () => setConnectorEnabled(config, instanceId, true),
758
+ save: () => service.saveConfig(config)
759
+ });
731
760
  return c.json({
732
761
  ok: true,
733
762
  payload: { instance }
@@ -736,19 +765,18 @@ function registerConnectorRoutes(authenticated, deps) {
736
765
  return c.json({
737
766
  ok: false,
738
767
  error: errorMessage(error)
739
- }, 400);
768
+ }, error instanceof ConfigPersistenceError ? 500 : 400);
740
769
  }
741
770
  });
742
771
  authenticated.post("/api/connectors/:id/disable", strictRateLimitMiddleware, async (c) => {
743
772
  const instanceId = c.req.param("id");
744
773
  const config = service.currentConfig;
745
774
  try {
746
- const instance = setConnectorEnabled(config, instanceId, false);
747
- const saved = await service.saveConfig(config);
748
- if (!saved.saved) return c.json({
749
- ok: false,
750
- error: saved.error
751
- }, 500);
775
+ const instance = await persistConfigMutation({
776
+ config,
777
+ mutate: () => setConnectorEnabled(config, instanceId, false),
778
+ save: () => service.saveConfig(config)
779
+ });
752
780
  return c.json({
753
781
  ok: true,
754
782
  payload: { instance }
@@ -757,19 +785,23 @@ function registerConnectorRoutes(authenticated, deps) {
757
785
  return c.json({
758
786
  ok: false,
759
787
  error: errorMessage(error)
760
- }, 400);
788
+ }, error instanceof ConfigPersistenceError ? 500 : 400);
761
789
  }
762
790
  });
763
791
  authenticated.delete("/api/connectors/:id", strictRateLimitMiddleware, async (c) => {
764
792
  const instanceId = c.req.param("id");
765
793
  const config = service.currentConfig;
766
794
  try {
767
- const instance = uninstallConnector(config, instanceId);
768
- const saved = await service.saveConfig(config);
769
- if (!saved.saved) return c.json({
770
- ok: false,
771
- error: saved.error
772
- }, 500);
795
+ const definition = getInstalledConnectorDefinition(config, instanceId);
796
+ const installed = getConnectorInstance(config, instanceId);
797
+ const serverId = installed?.materialized.type === "mcp" ? installed.materialized.serverId : void 0;
798
+ const rawServer = serverId ? config.mcp?.servers?.[serverId] : void 0;
799
+ if (definition?.auth.mode === "oauth" && definition.runtime.type === "mcp" && rawServer) await getMcpOAuthManager().disconnect(serverId, rawServer);
800
+ const instance = await persistConfigMutation({
801
+ config,
802
+ mutate: () => uninstallConnector(config, instanceId),
803
+ save: () => service.saveConfig(config)
804
+ });
773
805
  return c.json({
774
806
  ok: true,
775
807
  payload: { instance }
@@ -778,7 +810,7 @@ function registerConnectorRoutes(authenticated, deps) {
778
810
  return c.json({
779
811
  ok: false,
780
812
  error: errorMessage(error)
781
- }, 400);
813
+ }, error instanceof ConfigPersistenceError ? 500 : 400);
782
814
  }
783
815
  });
784
816
  }
@@ -2,21 +2,31 @@ import { canonicalizeConfiguredMcpServer, normalizeConfiguredMcpServers } from "
2
2
  import { loadMergedBundleMcpConfig } from "../../../agent/mcp/bundle-mcp-config.js";
3
3
  import { isManagedConnectorServer } from "../../../connectors/materialize.js";
4
4
  import { getWorkspacePath } from "../../../config/workspace-path-helpers.js";
5
+ import { getMcpOAuthManager } from "../../../agent/mcp/oauth/mcp-oauth-manager.js";
5
6
  import { listBundleMcpServerCapabilitiesForGateway, listBundleMcpServerToolsForGateway } from "../../../agent/mcp/bundle-mcp-gateway.js";
6
7
  //#region src/gateway/hono/routes/mcp.ts
7
8
  function registerMcpRoutes(authenticated, deps) {
8
- authenticated.get("/api/mcp/servers", (c) => {
9
+ const resolveServer = (id) => {
10
+ const cfg = deps.service.currentConfig;
11
+ return loadMergedBundleMcpConfig({
12
+ workspaceDir: getWorkspacePath(cfg) || "./workspace",
13
+ cfg
14
+ }).config.mcpServers[id];
15
+ };
16
+ authenticated.get("/api/mcp/servers", async (c) => {
9
17
  const cfg = deps.service.currentConfig;
10
18
  const merged = loadMergedBundleMcpConfig({
11
19
  workspaceDir: getWorkspacePath(cfg) || "./workspace",
12
20
  cfg
13
21
  });
14
22
  const configured = normalizeConfiguredMcpServers(cfg.mcp?.servers);
15
- const servers = Object.entries(configured).map(([id, server]) => ({
23
+ const oauthManager = getMcpOAuthManager();
24
+ const servers = await Promise.all(Object.entries(configured).map(async ([id, server]) => ({
16
25
  id,
17
26
  managed: isManagedConnectorServer(server),
18
- connectorId: isManagedConnectorServer(server) ? server.xopcConnector.connectorId : void 0
19
- }));
27
+ connectorId: isManagedConnectorServer(server) ? server.xopcConnector.connectorId : void 0,
28
+ oauth: await oauthManager.status(id, server)
29
+ })));
20
30
  return c.json({
21
31
  ok: true,
22
32
  payload: {
@@ -26,6 +36,62 @@ function registerMcpRoutes(authenticated, deps) {
26
36
  }
27
37
  });
28
38
  });
39
+ authenticated.get("/api/mcp/servers/:id/oauth", async (c) => {
40
+ const id = c.req.param("id");
41
+ const server = resolveServer(id);
42
+ if (!server) return c.json({
43
+ ok: false,
44
+ error: `Unknown MCP server: ${id}`
45
+ }, 404);
46
+ return c.json({
47
+ ok: true,
48
+ payload: await getMcpOAuthManager().status(id, server)
49
+ });
50
+ });
51
+ authenticated.post("/api/mcp/servers/:id/oauth/start", deps.strictRateLimitMiddleware, async (c) => {
52
+ const id = c.req.param("id");
53
+ const server = resolveServer(id);
54
+ if (!server) return c.json({
55
+ ok: false,
56
+ error: `Unknown MCP server: ${id}`
57
+ }, 404);
58
+ try {
59
+ const payload = await getMcpOAuthManager().start({
60
+ serverId: id,
61
+ rawServer: server,
62
+ cfg: deps.service.currentConfig
63
+ });
64
+ return c.json({
65
+ ok: true,
66
+ payload
67
+ });
68
+ } catch (err) {
69
+ return c.json({
70
+ ok: false,
71
+ error: err instanceof Error ? err.message : String(err)
72
+ }, 400);
73
+ }
74
+ });
75
+ authenticated.delete("/api/mcp/servers/:id/oauth", deps.strictRateLimitMiddleware, async (c) => {
76
+ const id = c.req.param("id");
77
+ const server = resolveServer(id);
78
+ if (!server) return c.json({
79
+ ok: false,
80
+ error: `Unknown MCP server: ${id}`
81
+ }, 404);
82
+ try {
83
+ const payload = await getMcpOAuthManager().disconnect(id, server);
84
+ return c.json({
85
+ ok: true,
86
+ payload
87
+ });
88
+ } catch (err) {
89
+ return c.json({
90
+ ok: false,
91
+ error: err instanceof Error ? err.message : String(err)
92
+ }, 400);
93
+ }
94
+ });
29
95
  authenticated.get("/api/mcp/servers/:id/tools", async (c) => {
30
96
  const id = c.req.param("id");
31
97
  const cfg = deps.service.currentConfig;
@@ -79,11 +145,17 @@ function registerMcpRoutes(authenticated, deps) {
79
145
  workspaceDir,
80
146
  cfg
81
147
  }).config.mcpServers;
82
- if (!(inlineServer ?? servers[id] ?? mergedServers[id])) return c.json({
148
+ const knownServer = inlineServer ?? servers[id] ?? mergedServers[id];
149
+ if (!knownServer) return c.json({
83
150
  ok: false,
84
151
  error: `Unknown MCP server: ${id}`
85
152
  }, 404);
86
153
  try {
154
+ const oauth = await getMcpOAuthManager().status(id, knownServer);
155
+ if (oauth.configured && oauth.status !== "connected") return c.json({
156
+ ok: false,
157
+ error: oauth.session?.error ?? "MCP server authorization is required"
158
+ }, 409);
87
159
  const capabilities = await listBundleMcpServerCapabilitiesForGateway({
88
160
  workspaceDir,
89
161
  cfg: inlineServer ? {
@@ -14,8 +14,8 @@ import "../../../voice/stt/index.js";
14
14
  import { listSttProvidersForApi } from "../../../voice/stt/list-providers.js";
15
15
  import "../../../voice/tts/index.js";
16
16
  import { createGatewayRouteLogger } from "../lib/route-logger.js";
17
- import { listLocalVoiceModelStatuses, removeLocalVoiceModel, startLocalVoiceModelInstall } from "../../../voice/local/model-manager.js";
18
17
  import { listTtsProvidersForApi } from "../../../voice/tts/list-providers.js";
18
+ import { listLocalVoiceModelStatuses, removeLocalVoiceModel, startLocalVoiceModelInstall } from "../../../voice/local/model-manager.js";
19
19
  //#region src/gateway/hono/routes/voice.ts
20
20
  init_providers();
21
21
  const log = createGatewayRouteLogger("Voice");
@@ -67,6 +67,9 @@ async function runGatewayLoop(opts) {
67
67
  forceCloseRequested = true;
68
68
  console.warn(`[GatewayRunLoop] Received ${signal} again; force closing connections`);
69
69
  server?.forceCloseConnections();
70
+ } else if (signal === "SIGINT" || signal === "SIGTERM") {
71
+ console.warn(`[GatewayRunLoop] Received ${signal} again; force exiting`);
72
+ exitProcess(0);
70
73
  }
71
74
  return;
72
75
  }
@@ -14,6 +14,8 @@ export interface GatewayServerConfig {
14
14
  export declare class GatewayServer {
15
15
  private server?;
16
16
  private extraServers;
17
+ private readonly serverSockets;
18
+ private stopPromise;
17
19
  private config;
18
20
  private service;
19
21
  constructor(config: GatewayServerConfig);
@@ -23,6 +25,7 @@ export declare class GatewayServer {
23
25
  restartExpectedMs?: number | null;
24
26
  }): Promise<void>;
25
27
  stop(): Promise<void>;
28
+ private stopInternal;
26
29
  forceCloseConnections(): void;
27
30
  get isRunning(): boolean;
28
31
  get serviceInstance(): GatewayService;
@@ -10,6 +10,8 @@ ensureXopcCliOnPath();
10
10
  var GatewayServer = class {
11
11
  server;
12
12
  extraServers = [];
13
+ serverSockets = /* @__PURE__ */ new Map();
14
+ stopPromise = null;
13
15
  config;
14
16
  service;
15
17
  constructor(config) {
@@ -57,7 +59,14 @@ var GatewayServer = class {
57
59
  });
58
60
  const primaryHost = listenHosts[0] ?? bindHost;
59
61
  const attachUpgrade = (server) => {
60
- server.on("upgrade", (req, socket, head) => {
62
+ const inner = server;
63
+ const sockets = /* @__PURE__ */ new Set();
64
+ this.serverSockets.set(server, sockets);
65
+ inner.on("connection", (socket) => {
66
+ sockets.add(socket);
67
+ socket.once("close", () => sockets.delete(socket));
68
+ });
69
+ inner.on("upgrade", (req, socket, head) => {
61
70
  try {
62
71
  if (this.service.realtime.handleUpgrade(req, socket, head)) return;
63
72
  if (handleSiteShareUpgrade(this.service, req, socket, head)) return;
@@ -98,11 +107,20 @@ var GatewayServer = class {
98
107
  await this.stop();
99
108
  }
100
109
  async stop() {
110
+ if (this.stopPromise) return this.stopPromise;
111
+ this.stopPromise = this.stopInternal();
112
+ return this.stopPromise;
113
+ }
114
+ async stopInternal() {
101
115
  console.log("[GatewayServer] Stopping gateway server...");
116
+ const forceCloseServer = (server) => {
117
+ server.closeAllConnections?.();
118
+ for (const socket of this.serverSockets.get(server) ?? []) socket.destroy();
119
+ };
102
120
  const closeServer = async (server) => {
103
121
  if (!server) return;
104
122
  const forceClose = setTimeout(() => {
105
- server.closeAllConnections?.();
123
+ forceCloseServer(server);
106
124
  }, 2e3);
107
125
  await new Promise((resolve) => {
108
126
  server.close(() => {
@@ -111,16 +129,23 @@ var GatewayServer = class {
111
129
  });
112
130
  });
113
131
  };
114
- await closeServer(this.server);
132
+ const primaryServer = this.server;
133
+ const extraServers = this.extraServers;
134
+ const closePromises = [closeServer(primaryServer), ...extraServers.map(closeServer)];
135
+ const activeServers = [primaryServer, ...extraServers].filter((server) => server !== void 0);
136
+ await this.service.stop();
137
+ for (const server of activeServers) forceCloseServer(server);
138
+ await Promise.all(closePromises);
139
+ for (const server of activeServers) this.serverSockets.delete(server);
115
140
  this.server = void 0;
116
- for (const extra of this.extraServers) await closeServer(extra);
117
141
  this.extraServers = [];
118
- await this.service.stop();
119
142
  console.log("[GatewayServer] Gateway server stopped");
120
143
  }
121
144
  forceCloseConnections() {
122
145
  const close = (server) => {
146
+ if (!server) return;
123
147
  server?.closeAllConnections?.();
148
+ for (const socket of this.serverSockets.get(server) ?? []) socket.destroy();
124
149
  };
125
150
  close(this.server);
126
151
  for (const extra of this.extraServers) close(extra);
@@ -1,6 +1,6 @@
1
1
  import { DEFAULT_ACK_MAX_CHARS, HEARTBEAT_OK, NO_REPLY, shouldSilence, stripHeartbeatToken } from "./tokens.js";
2
+ import { appendCronEventLines } from "./event-prompt.js";
2
3
  import { isWithinActiveHours } from "./active-hours.js";
3
4
  import { isHeartbeatContentEmpty } from "./content-check.js";
4
- import { appendCronEventLines } from "./event-prompt.js";
5
5
  import { createHeartbeatWake } from "./wake.js";
6
6
  export { DEFAULT_ACK_MAX_CHARS, HEARTBEAT_OK, NO_REPLY, appendCronEventLines, createHeartbeatWake, isHeartbeatContentEmpty, isWithinActiveHours, shouldSilence, stripHeartbeatToken };
@@ -2,8 +2,8 @@ import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
3
  import { init_paths, resolveConfigPath } from "../config/paths.js";
4
4
  import { init_loader, loadConfig } from "../config/loader.js";
5
- import { isRestartEnabled } from "../config/commands.flags.js";
6
5
  import { resolveGatewayService } from "../daemon/service.js";
6
+ import { isRestartEnabled } from "../config/commands.flags.js";
7
7
  import { authorizeGatewaySigusr1Restart, writeGatewayRestartIntentSync } from "./restart.js";
8
8
  import { findVerifiedGatewayListenerPidsOnPortSync, signalVerifiedGatewayPidSync } from "./gateway-processes.js";
9
9
  import { refreshGatewayServiceAfterUpdate } from "./update-service-refresh.js";
@@ -87,7 +87,14 @@ var ConnectedKnowledgePipeline = class {
87
87
  expiresAt: existing.expiresAt,
88
88
  canonicalKey: existing.canonicalKey,
89
89
  supersedesRecordId: existing.supersedesRecordId,
90
- conflictGroupId: existing.conflictGroupId
90
+ conflictGroupId: existing.conflictGroupId,
91
+ originClass: existing.provenance.originClass,
92
+ sessionKind: existing.provenance.sessionKind,
93
+ observedAt: existing.provenance.observedAt,
94
+ sourceSessionId: existing.provenance.sourceSessionId,
95
+ sourceTurnId: existing.provenance.sourceTurnId,
96
+ supersedesKey: existing.provenance.supersedesKey,
97
+ derivedFromRecalledContext: existing.provenance.derivedFromRecalledContext
91
98
  });
92
99
  completeKnowledgeSourceItemSynthesis({
93
100
  itemId: item.id,
@@ -141,7 +148,11 @@ var ConnectedKnowledgePipeline = class {
141
148
  confidence: .78,
142
149
  observedAt: item.occurredAt ?? item.sourceUpdatedAt
143
150
  }],
144
- validFrom: item.occurredAt ?? item.sourceUpdatedAt
151
+ validFrom: item.occurredAt ?? item.sourceUpdatedAt,
152
+ originClass: "untrusted",
153
+ sessionKind: "background",
154
+ observedAt: item.occurredAt ?? item.sourceUpdatedAt ?? item.updatedAt,
155
+ derivedFromRecalledContext: false
145
156
  });
146
157
  attachMemoryEvidence({
147
158
  recordId: record.id,
@@ -238,7 +249,14 @@ var ConnectedKnowledgePipeline = class {
238
249
  validTo: (/* @__PURE__ */ new Date()).toISOString(),
239
250
  reviewAfter: existing.reviewAfter,
240
251
  expiresAt: existing.expiresAt,
241
- canonicalKey: existing.canonicalKey
252
+ canonicalKey: existing.canonicalKey,
253
+ originClass: existing.provenance.originClass,
254
+ sessionKind: existing.provenance.sessionKind,
255
+ observedAt: existing.provenance.observedAt,
256
+ sourceSessionId: existing.provenance.sourceSessionId,
257
+ sourceTurnId: existing.provenance.sourceTurnId,
258
+ supersedesKey: existing.provenance.supersedesKey,
259
+ derivedFromRecalledContext: existing.provenance.derivedFromRecalledContext
242
260
  });
243
261
  return false;
244
262
  }
@@ -282,7 +300,11 @@ var ConnectedKnowledgePipeline = class {
282
300
  confidence: .72,
283
301
  observedAt: item.occurredAt ?? item.sourceUpdatedAt
284
302
  })),
285
- validFrom: `${day}T00:00:00.000Z`
303
+ validFrom: `${day}T00:00:00.000Z`,
304
+ originClass: "untrusted",
305
+ sessionKind: "background",
306
+ observedAt: items.map((item) => item.occurredAt ?? item.sourceUpdatedAt ?? item.updatedAt).sort().at(-1),
307
+ derivedFromRecalledContext: false
286
308
  });
287
309
  deleteMemoryEvidenceForRecord(summary.id, "derived_from");
288
310
  for (const item of items) attachMemoryEvidence({
@@ -4,6 +4,7 @@ import { init_logger } from "../utils/logger.js";
4
4
  import { requireXopcDatabase } from "../storage/sqlite/connection.js";
5
5
  import { buildSessionContextForLlm, buildSessionDisplayMessages, isRuntimeOnlyTranscriptMessage, isTranscriptCompactionEntry, mergeLlmMessagesPreservingContextRows, transcriptRowsFromJsonArray } from "./session-context-for-llm.js";
6
6
  import "./types.js";
7
+ import { init_agent_session_key, resolveAgentIdFromSessionKey } from "../routing/agent-session-key.js";
7
8
  import { estimateTokensFromMessages } from "../storage/sqlite/row-mappers.js";
8
9
  import { deleteSessionRecord, ensureSessionRecord, findSessionKeyBySessionId, getGlobalSessionStats, getSessionMetadata, listSessionMetadata, listSessionsByAgent, patchSessionMetadata, resetSessionRecord } from "../storage/sqlite/session-repository.js";
9
10
  import { appendCompactionBoundaryIfUnchanged, appendTranscriptEntry, listCompactionBoundaries, loadCompactionSourceSnapshot, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRowsForSession, paginateTranscriptMessages, replaceTranscriptRows, restoreBeforeCompactionBoundary, searchSessionTranscript } from "../storage/sqlite/transcript-repository.js";
@@ -12,12 +13,14 @@ import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.
12
13
  import { readPostCompactionContext } from "../agent/reply/post-compaction-context.js";
13
14
  import { SessionCompactor } from "../agent/memory/compaction.js";
14
15
  import { resolveCompactionPolicy } from "../agent/memory/compaction-policy.js";
16
+ import { promoteCompactionLedger } from "../agent/memory/compaction-promotion.js";
15
17
  import { SlidingWindow } from "../agent/memory/window.js";
16
18
  import { isAppendOnlyLlmTranscriptMessage } from "./transcript-stats.js";
17
19
  import { transcriptRowsToClientHistory } from "./client-history.js";
18
20
  import { computeTranscriptUserRoundDeleteRange } from "./user-round-delete.js";
19
21
  //#region src/session/store.ts
20
22
  init_paths_state();
23
+ init_agent_session_key();
21
24
  init_logger();
22
25
  const log = createLogger("SessionStore");
23
26
  const INDEX_VERSION = "1.0";
@@ -455,6 +458,30 @@ var SessionStore = class {
455
458
  tokensBefore: result.tokensBefore,
456
459
  tokensAfter: result.tokensAfter
457
460
  })) throw new Error(`Session changed while compaction was running: ${key}`);
461
+ try {
462
+ const metadata = getSessionMetadata(key);
463
+ const promoted = promoteCompactionLedger({
464
+ sessionKey: key,
465
+ sessionId: expectedSnapshot.sessionId,
466
+ sourceAgentId: resolveAgentIdFromSessionKey(key),
467
+ workspaceId: this.resolveWorkspaceCwd(key),
468
+ projectId: metadata?.projectId,
469
+ handover: result.handover,
470
+ audit: result.audit,
471
+ sourceEntries: expectedSnapshot.entries
472
+ });
473
+ log.info({
474
+ sessionKey: key,
475
+ episodicCount: promoted.episodicRecordIds.length,
476
+ durableCount: promoted.durableRecordIds.length,
477
+ rejectedCount: promoted.rejectedRecordIds.length
478
+ }, "Compaction ledger memory promotion completed");
479
+ } catch (err) {
480
+ log.warn({
481
+ err,
482
+ sessionKey: key
483
+ }, "Compaction ledger memory promotion failed");
484
+ }
458
485
  log.info({
459
486
  key,
460
487
  tokensBefore: result.tokensBefore,
@@ -1,4 +1,4 @@
1
- import type { MemoryDisclosurePolicy, MemoryDurability, MemoryExplicitness, MemoryKind, MemoryRecord, MemorySensitivity, MemorySearchResult, MemorySignal, MemoryStatus } from '../../agent/memory/types.js';
1
+ import type { MemoryDisclosurePolicy, MemoryDurability, MemoryExplicitness, MemoryKind, MemoryOriginClass, MemoryRecord, MemorySessionKind, MemorySensitivity, MemorySearchResult, MemorySignal, MemoryStatus } from '../../agent/memory/types.js';
2
2
  export interface UpsertMemoryRecordInput {
3
3
  id?: string;
4
4
  providerId: string;
@@ -26,6 +26,13 @@ export interface UpsertMemoryRecordInput {
26
26
  expiresAt?: string;
27
27
  supersedesRecordId?: string;
28
28
  conflictGroupId?: string;
29
+ originClass?: MemoryOriginClass;
30
+ sessionKind?: MemorySessionKind;
31
+ observedAt?: string;
32
+ sourceSessionId?: string;
33
+ sourceTurnId?: string;
34
+ supersedesKey?: string;
35
+ derivedFromRecalledContext?: boolean;
29
36
  nowMs?: number;
30
37
  }
31
38
  export interface ListMemoryRecordsOptions {
@@ -73,6 +80,7 @@ export interface SearchMemoryRecordsOptions {
73
80
  statuses?: MemoryStatus[];
74
81
  maxResults?: number;
75
82
  minScore?: number;
83
+ trustedOnly?: boolean;
76
84
  }
77
85
  export interface AppendMemorySignalInput {
78
86
  signal: MemorySignal;