@xopcai/xopc 0.0.224 → 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 (183) 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/feishu/src/outbound/media-load.js +1 -1
  4. package/dist/extensions/telegram/xopc.extension.json +1 -1
  5. package/dist/gateway/static/root/assets/{activity-store--GBciH10.js → activity-store-CtTYnku4.js} +1 -1
  6. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-K7V4XXt7.js → agent-avatar-dicebear-dizuqu_4.js} +1 -1
  7. package/dist/gateway/static/root/assets/{agents-BsxTpXyq.js → agents-DeEEFZJ4.js} +1 -1
  8. package/dist/gateway/static/root/assets/{api-HoIz_ija.js → api-CLRMz2BT.js} +1 -1
  9. package/dist/gateway/static/root/assets/{app-management-settings-panel-xQCmkAHh.js → app-management-settings-panel-Cnk-DtQh.js} +1 -1
  10. package/dist/gateway/static/root/assets/{appearance-settings-BRoeA4kU.js → appearance-settings-wP0rogVI.js} +1 -1
  11. package/dist/gateway/static/root/assets/{apps-page-BXgpBA8w.js → apps-page-Db5YNHVM.js} +1 -1
  12. package/dist/gateway/static/root/assets/{archive-plugin-CteCVsBP.js → archive-plugin-Cpzsm-DM.js} +1 -1
  13. package/dist/gateway/static/root/assets/{attachment-load-D7xNA2jB.js → attachment-load-Bd2OOoEK.js} +1 -1
  14. package/dist/gateway/static/root/assets/{automations-page-BD1vK7r5.js → automations-page-DNqhguyk.js} +1 -1
  15. package/dist/gateway/static/root/assets/{automations-workspace-wrgf-z7D.js → automations-workspace-CNT05YTb.js} +1 -1
  16. package/dist/gateway/static/root/assets/{binary-plugins-C3DaJa0W.js → binary-plugins-Dcma5HdI.js} +1 -1
  17. package/dist/gateway/static/root/assets/{block-editor-lTkcHTve.js → block-editor-D-B8ThwK.js} +1 -1
  18. package/dist/gateway/static/root/assets/{browser-settings-page-zhzNkeVG.js → browser-settings-page-UbDj3LIq.js} +1 -1
  19. package/dist/gateway/static/root/assets/{browser-workflow-inputs-1UZ0vnIy.js → browser-workflow-inputs-BAPZIXrs.js} +1 -1
  20. package/dist/gateway/static/root/assets/{browser-workflows-page-BHuJOF4M.js → browser-workflows-page-DHtaSKEh.js} +1 -1
  21. package/dist/gateway/static/root/assets/{capabilities-settings-panel-DuCmg2Ej.js → capabilities-settings-panel-CiO152QS.js} +1 -1
  22. package/dist/gateway/static/root/assets/{capability-presets-api-yNqTIuyd.js → capability-presets-api-zsZQ7im3.js} +1 -1
  23. package/dist/gateway/static/root/assets/{capability-presets-settings-panel-DjiP3mQQ.js → capability-presets-settings-panel-Bc_hRwfL.js} +1 -1
  24. package/dist/gateway/static/root/assets/{channel-recipient-api-krezGsKc.js → channel-recipient-api-Cp8iaaXp.js} +1 -1
  25. package/dist/gateway/static/root/assets/{channels-settings-B4AtvQHk.js → channels-settings-CFW7zBoT.js} +1 -1
  26. package/dist/gateway/static/root/assets/channels-status-swr-5rNVq7iI.js +1 -0
  27. package/dist/gateway/static/root/assets/{chat-terminal-dock-BRrL2iHA.js → chat-terminal-dock-Dr6Rq2ln.js} +1 -1
  28. package/dist/gateway/static/root/assets/connectors-page-DLBr5nre.js +2 -0
  29. package/dist/gateway/static/root/assets/{cron-expression-Bl-2DzBQ.js → cron-expression-BiXrpzmo.js} +1 -1
  30. package/dist/gateway/static/root/assets/{date-picker-CxTl6Wlz.js → date-picker-BPuRtwKt.js} +1 -1
  31. package/dist/gateway/static/root/assets/{dependency-picker-DSl0mOPa.js → dependency-picker-BNC_W7wI.js} +1 -1
  32. package/dist/gateway/static/root/assets/{desktop-pet-DTeCmCdb.js → desktop-pet-DzOpt5nI.js} +1 -1
  33. package/dist/gateway/static/root/assets/{desktop-pet-settings-BNebxg0V.js → desktop-pet-settings-BW0brCvH.js} +1 -1
  34. package/dist/gateway/static/root/assets/{directory-picker-path-field-Dn9XpmXY.js → directory-picker-path-field-Baml0uTS.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-debug-page-D-J-eOTb.js → extension-debug-page-CBXyKmfS.js} +1 -1
  36. package/dist/gateway/static/root/assets/{extension-page-CpST24nU.js → extension-page-BBhcr_SZ.js} +1 -1
  37. package/dist/gateway/static/root/assets/{extension-settings-page-4nQXFnFq.js → extension-settings-page-4rwWpN9_.js} +1 -1
  38. package/dist/gateway/static/root/assets/{gateway-config-api-BHWHduDi.js → gateway-config-api-Dg-BlBe4.js} +1 -1
  39. package/dist/gateway/static/root/assets/{gateway-config-swr-yUxMMVjK.js → gateway-config-swr-Du0MvK9s.js} +1 -1
  40. package/dist/gateway/static/root/assets/{gateway-settings-BimMKmkM.js → gateway-settings-BOuYZOYe.js} +1 -1
  41. package/dist/gateway/static/root/assets/{gateway-startup-retry-9mrsL84j.js → gateway-startup-retry-JbjcHCaN.js} +1 -1
  42. package/dist/gateway/static/root/assets/{heartbeat-settings-MUJ3mEC9.js → heartbeat-settings-Dq4YAlSx.js} +1 -1
  43. package/dist/gateway/static/root/assets/{home-page-DSM6aPHF.js → home-page-BIXkO0Ck.js} +1 -1
  44. package/dist/gateway/static/root/assets/{image-generation-api-CgFAGDi8.js → image-generation-api-G2tfPvKP.js} +1 -1
  45. package/dist/gateway/static/root/assets/{index-B3zYJBhK.js → index-Csccu8sa.js} +11 -11
  46. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-6Ar5rfX4.js → keyboard-shortcuts-settings-L1Vtxgp9.js} +1 -1
  47. package/dist/gateway/static/root/assets/{local-app-workbench-page-tzM0wTL8.js → local-app-workbench-page-D-eacBcO.js} +1 -1
  48. package/dist/gateway/static/root/assets/{local-apps-page-B5n-x544.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-CgoQlera.js → logs-page-BRCglHvd.js} +1 -1
  51. package/dist/gateway/static/root/assets/{management-settings-CXBLyU-0.js → management-settings-p55fR4XO.js} +1 -1
  52. package/dist/gateway/static/root/assets/{markdown-split-CtmQemJi.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-Dsd-IEOW.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-BKbOTE2n.js → notes-page-miO9ig9C.js} +1 -1
  58. package/dist/gateway/static/root/assets/{notes-workbench-BScELo01.js → notes-workbench-_13lmvmF.js} +2 -2
  59. package/dist/gateway/static/root/assets/{product-open-page-DqB9bsDB.js → product-open-page-BOu07nXf.js} +1 -1
  60. package/dist/gateway/static/root/assets/{project-detail-page-DUoyty8X.js → project-detail-page-BStRkOQr.js} +1 -1
  61. package/dist/gateway/static/root/assets/{projects-page-PeXUdGdO.js → projects-page-CY03RxVr.js} +1 -1
  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-sHho-uXP.js → remote-access-hub-B19llkld.js} +1 -1
  64. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-DBTH_t0O.js → runtime-tools-settings-panel-DthuRqUH.js} +1 -1
  65. package/dist/gateway/static/root/assets/{schema-form-CqMKAwV0.js → schema-form-8W8PhXxa.js} +1 -1
  66. package/dist/gateway/static/root/assets/{sessions-page-DyvNgaP9.js → sessions-page-BDA2qbTd.js} +1 -1
  67. package/dist/gateway/static/root/assets/settings-advanced-gate-BONIDX4v.js +1 -0
  68. package/dist/gateway/static/root/assets/{settings-form-section-dPriuuYq.js → settings-form-section-CrsKGYiG.js} +1 -1
  69. package/dist/gateway/static/root/assets/{settings-loading-skeleton-B-Mbm8Va.js → settings-loading-skeleton-WJtI0AAq.js} +1 -1
  70. package/dist/gateway/static/root/assets/{settings-page-Dyj3w-Ml.js → settings-page-PCjwRF47.js} +1 -1
  71. package/dist/gateway/static/root/assets/{setup-status-panel-C4FxY5J3.js → setup-status-panel-D65CwlNC.js} +1 -1
  72. package/dist/gateway/static/root/assets/{share-preview-page-emEdx7YL.js → share-preview-page-BGtvLLeZ.js} +1 -1
  73. package/dist/gateway/static/root/assets/{shares-settings-BQBVq-sN.js → shares-settings-CdzVKrBl.js} +1 -1
  74. package/dist/gateway/static/root/assets/skill-reload-api-CsRWid5h.js +1 -0
  75. package/dist/gateway/static/root/assets/{skills-page-BNtYnrRT.js → skills-page-C_npyryI.js} +1 -1
  76. package/dist/gateway/static/root/assets/{skills-page.utils-DjnbNFs5.js → skills-page.utils-C46Sd78k.js} +1 -1
  77. package/dist/gateway/static/root/assets/{system-settings-panel-DDStf-jZ.js → system-settings-panel-DomTLwki.js} +1 -1
  78. package/dist/gateway/static/root/assets/{task-detail-page-ZVwr8KbS.js → task-detail-page-B6YFX7kK.js} +1 -1
  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-C2mKZ-ua.js → use-autosave-Do9mCRcY.js} +1 -1
  81. package/dist/gateway/static/root/assets/{user-context-page-CHjIinCW.js → user-context-page-CiCQA40E.js} +1 -1
  82. package/dist/gateway/static/root/assets/{voice-api-key-field-D7OHeQby.js → voice-api-key-field-Bc5p-0tX.js} +1 -1
  83. package/dist/gateway/static/root/assets/{work-discovery-overlay-CIiXie7F.js → work-discovery-overlay-BieqsmT1.js} +1 -1
  84. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-9_dAGW3_.js → workflow-run-setup-panel-DVj8iYvm.js} +1 -1
  85. package/dist/gateway/static/root/assets/{workflows-page-DXpYJxao.js → workflows-page-AG04TTuH.js} +1 -1
  86. package/dist/gateway/static/root/index.html +10 -10
  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/channels.js +1 -1
  130. package/dist/src/cli/commands/connectors.js +1 -1
  131. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  132. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  133. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  134. package/dist/src/cli/commands/models.js +1 -1
  135. package/dist/src/cli/commands/onboard.js +1 -1
  136. package/dist/src/config/config-mutation.d.ts +14 -0
  137. package/dist/src/config/config-mutation.js +33 -0
  138. package/dist/src/config/index.js +3 -3
  139. package/dist/src/config/paths.d.ts +2 -0
  140. package/dist/src/config/paths.js +5 -1
  141. package/dist/src/config/schema.d.ts +17 -0
  142. package/dist/src/config/schema.js +26 -2
  143. package/dist/src/connectors/auth-provider-registry.d.ts +1 -1
  144. package/dist/src/connectors/auth-provider-registry.js +23 -2
  145. package/dist/src/connectors/install.js +3 -3
  146. package/dist/src/connectors/instances.d.ts +2 -1
  147. package/dist/src/connectors/instances.js +15 -5
  148. package/dist/src/connectors/materialize.d.ts +1 -0
  149. package/dist/src/connectors/materialize.js +9 -1
  150. package/dist/src/connectors/runtime-adapter-registry.js +1 -0
  151. package/dist/src/connectors/types.d.ts +4 -1
  152. package/dist/src/extensions/connector-dependencies.d.ts +10 -0
  153. package/dist/src/extensions/connector-dependencies.js +65 -0
  154. package/dist/src/extensions/install.js +27 -0
  155. package/dist/src/extensions/normalize-manifest.js +1 -0
  156. package/dist/src/extensions/sdk/index.js +1 -1
  157. package/dist/src/extensions/types/manifest.d.ts +2 -0
  158. package/dist/src/gateway/heartbeat/service.js +1 -1
  159. package/dist/src/gateway/hono/routes/capabilities.js +8 -8
  160. package/dist/src/gateway/hono/routes/connectors.js +87 -55
  161. package/dist/src/gateway/hono/routes/mcp.js +77 -5
  162. package/dist/src/gateway/hono/routes/voice.js +1 -1
  163. package/dist/src/gateway/service.js +8 -8
  164. package/dist/src/heartbeat/index.js +1 -1
  165. package/dist/src/infra/update-restart.js +1 -1
  166. package/dist/src/knowledge/connected-knowledge-pipeline.js +26 -4
  167. package/dist/src/session/store.js +27 -0
  168. package/dist/src/storage/sqlite/memory-records-repository.d.ts +9 -1
  169. package/dist/src/storage/sqlite/memory-records-repository.js +40 -6
  170. package/dist/src/storage/sqlite/migrations/134_memory_provenance.sql +18 -0
  171. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  172. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  173. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  174. package/dist/src/storage/sqlite/schema.js +1 -1
  175. package/dist/src/tui/backends/embedded-backend.js +1 -1
  176. package/dist/src/user-context/planner.js +8 -3
  177. package/package.json +2 -2
  178. package/dist/gateway/static/root/assets/channels-status-swr-DMxB7slL.js +0 -1
  179. package/dist/gateway/static/root/assets/connectors-page-fmda2NEP.js +0 -2
  180. package/dist/gateway/static/root/assets/settings-advanced-gate-CnYf1R7z.js +0 -1
  181. package/dist/gateway/static/root/assets/skill-reload-api-BFoEpQ4I.js +0 -1
  182. package/dist/src/extensions/bundle-mcp.d.ts +0 -18
  183. package/dist/src/extensions/bundle-mcp.js +0 -69
@@ -45,11 +45,17 @@ import { MessageBus, MessageBusShutdownError } from "../infra/bus/queue.js";
45
45
  import "../infra/bus/index.js";
46
46
  import { AgentService } from "../agent/service.js";
47
47
  import { ensureStarterAgentsInitialized } from "../agent/starter-agents.js";
48
- import { getWorkspacePath } from "../config/workspace-path-helpers.js";
49
- import "../config/index.js";
50
48
  import { setPairingBroadcastSink } from "../channels/pairing/pairing-events.js";
51
49
  import { registerClarifyBridge } from "./clarify-runtime.js";
52
50
  import { ChannelManager } from "../channels/manager.js";
51
+ import { getWorkspacePath } from "../config/workspace-path-helpers.js";
52
+ import "../config/index.js";
53
+ import { ManagedComposioEventPoller } from "../connectors/composio-managed-events.js";
54
+ import { startConnectedKnowledgeCoordinator } from "../knowledge/coordinator.js";
55
+ import "../knowledge/index.js";
56
+ import { startConnectorLearningCoordinator } from "../connectors/learning-coordinator.js";
57
+ import { ConnectedSourceChangePublisher } from "../connectors/source-change-publisher.js";
58
+ import { startConnectorSupervisor } from "../connectors/supervisor.js";
53
59
  import { DiscussionService } from "../discussions/service.js";
54
60
  import { DiscussionOrganizer } from "../discussions/organizer.js";
55
61
  import { DiscussionLiveWorker } from "../discussions/live-worker.js";
@@ -58,12 +64,6 @@ import { DiscussionSealer } from "../discussions/sealer.js";
58
64
  import "../discussions/index.js";
59
65
  import { EndpointToolRuntime } from "../endpoint-tools/runtime.js";
60
66
  import "../endpoint-tools/index.js";
61
- import { ManagedComposioEventPoller } from "../connectors/composio-managed-events.js";
62
- import { startConnectedKnowledgeCoordinator } from "../knowledge/coordinator.js";
63
- import "../knowledge/index.js";
64
- import { startConnectorLearningCoordinator } from "../connectors/learning-coordinator.js";
65
- import { ConnectedSourceChangePublisher } from "../connectors/source-change-publisher.js";
66
- import { startConnectorSupervisor } from "../connectors/supervisor.js";
67
67
  import { assertGatewayAuthConfigured, extractToken, resolveGatewayAuth, validateToken } from "./auth.js";
68
68
  import { prepareAutomationAgentSession } from "./automation-agent-session.js";
69
69
  import { reconcileDreamingAutomations } from "./dreaming-automation-reconciler.js";
@@ -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;
@@ -86,7 +86,16 @@ function rowToRecord(row, evidence = []) {
86
86
  ...row.session_key ? { sessionKey: row.session_key } : {},
87
87
  ...row.project_id ? { projectId: row.project_id } : {}
88
88
  },
89
- provenance: { sourceAgentId: row.source_agent_id },
89
+ provenance: {
90
+ sourceAgentId: row.source_agent_id,
91
+ originClass: row.origin_class,
92
+ sessionKind: row.session_kind,
93
+ observedAt: new Date(row.observed_at).toISOString(),
94
+ ...row.source_session_id ? { sourceSessionId: row.source_session_id } : {},
95
+ ...row.source_turn_id ? { sourceTurnId: row.source_turn_id } : {},
96
+ ...row.supersedes_key ? { supersedesKey: row.supersedes_key } : {},
97
+ derivedFromRecalledContext: row.derived_from_recalled_context === 1
98
+ },
90
99
  content: row.content,
91
100
  source: parseSource(row.source_json),
92
101
  ...row.confidence != null ? { confidence: row.confidence } : {},
@@ -131,6 +140,9 @@ function upsertMemoryRecord(input) {
131
140
  const validTo = parseOptionalTimestamp(input.validTo);
132
141
  const reviewAfter = parseOptionalTimestamp(input.reviewAfter);
133
142
  const expiresAt = parseOptionalTimestamp(input.expiresAt);
143
+ const observedAt = parseOptionalTimestamp(input.observedAt) ?? now;
144
+ const originClass = input.originClass ?? "untrusted";
145
+ const sessionKind = input.sessionKind ?? "unknown";
134
146
  const source = {
135
147
  ...input.source ?? {},
136
148
  provider: input.source?.provider ?? input.providerId
@@ -141,8 +153,10 @@ function upsertMemoryRecord(input) {
141
153
  content, source_json, confidence, tags_json, status, sensitivity,
142
154
  canonical_key, explicitness, durability, importance,
143
155
  disclosure_policy, valid_from, valid_to, review_after, expires_at,
144
- supersedes_record_id, conflict_group_id, created_at, updated_at
145
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
156
+ supersedes_record_id, conflict_group_id,
157
+ origin_class, session_kind, observed_at, source_session_id, source_turn_id,
158
+ supersedes_key, derived_from_recalled_context, created_at, updated_at
159
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
146
160
  ON CONFLICT(record_id) DO UPDATE SET
147
161
  provider_id = excluded.provider_id,
148
162
  kind = excluded.kind,
@@ -168,7 +182,14 @@ function upsertMemoryRecord(input) {
168
182
  expires_at = excluded.expires_at,
169
183
  supersedes_record_id = excluded.supersedes_record_id,
170
184
  conflict_group_id = excluded.conflict_group_id,
171
- updated_at = excluded.updated_at`).run(id, input.providerId, input.kind, input.userId ?? "local-owner", input.sourceAgentId, input.workspaceId ?? null, input.sessionKey ?? null, input.projectId ?? null, input.content, JSON.stringify(source), input.confidence ?? null, JSON.stringify(input.tags ?? []), status, sensitivity, input.canonicalKey ?? null, explicitness, durability, importance, disclosurePolicy, validFrom, validTo, reviewAfter, expiresAt, input.supersedesRecordId ?? null, input.conflictGroupId ?? null, now, now);
185
+ origin_class = excluded.origin_class,
186
+ session_kind = excluded.session_kind,
187
+ observed_at = excluded.observed_at,
188
+ source_session_id = excluded.source_session_id,
189
+ source_turn_id = excluded.source_turn_id,
190
+ supersedes_key = excluded.supersedes_key,
191
+ derived_from_recalled_context = excluded.derived_from_recalled_context,
192
+ updated_at = excluded.updated_at`).run(id, input.providerId, input.kind, input.userId ?? "local-owner", input.sourceAgentId, input.workspaceId ?? null, input.sessionKey ?? null, input.projectId ?? null, input.content, JSON.stringify(source), input.confidence ?? null, JSON.stringify(input.tags ?? []), status, sensitivity, input.canonicalKey ?? null, explicitness, durability, importance, disclosurePolicy, validFrom, validTo, reviewAfter, expiresAt, input.supersedesRecordId ?? null, input.conflictGroupId ?? null, originClass, sessionKind, observedAt, input.sourceSessionId ?? null, input.sourceTurnId ?? null, input.supersedesKey ?? null, input.derivedFromRecalledContext ? 1 : 0, now, now);
172
193
  upsertMemoryRecordFts(db, {
173
194
  ...input,
174
195
  id
@@ -204,7 +225,16 @@ function upsertMemoryRecord(input) {
204
225
  ...input.sessionKey ? { sessionKey: input.sessionKey } : {},
205
226
  ...input.projectId ? { projectId: input.projectId } : {}
206
227
  },
207
- provenance: { sourceAgentId: input.sourceAgentId },
228
+ provenance: {
229
+ sourceAgentId: input.sourceAgentId,
230
+ originClass,
231
+ sessionKind,
232
+ observedAt: new Date(observedAt).toISOString(),
233
+ ...input.sourceSessionId ? { sourceSessionId: input.sourceSessionId } : {},
234
+ ...input.sourceTurnId ? { sourceTurnId: input.sourceTurnId } : {},
235
+ ...input.supersedesKey ? { supersedesKey: input.supersedesKey } : {},
236
+ derivedFromRecalledContext: input.derivedFromRecalledContext ?? false
237
+ },
208
238
  content: input.content,
209
239
  source,
210
240
  ...input.confidence != null ? { confidence: input.confidence } : {},
@@ -339,6 +369,10 @@ function searchMemoryRecords(options) {
339
369
  filters.push(`f.kind IN (${options.kinds.map(() => "?").join(", ")})`);
340
370
  params.push(...options.kinds);
341
371
  }
372
+ if (options.trustedOnly) {
373
+ filters.push(`r.origin_class IN ('owner', 'agent')`);
374
+ filters.push("r.derived_from_recalled_context = 0");
375
+ }
342
376
  const statuses = options.statuses && options.statuses.length > 0 ? options.statuses : ["active"];
343
377
  filters.push(`r.status IN (${statuses.map(() => "?").join(", ")})`);
344
378
  params.push(...statuses);
@@ -366,7 +400,7 @@ function searchMemoryRecords(options) {
366
400
  visibleToWorkspaceId: options.visibleToWorkspaceId,
367
401
  unscopedWorkspaceOnly: options.unscopedWorkspaceOnly,
368
402
  limit: 500
369
- }).filter((record) => statuses.includes(record.status ?? "active") && (!options.kinds?.length || options.kinds.includes(record.kind)));
403
+ }).filter((record) => statuses.includes(record.status ?? "active") && (!options.kinds?.length || options.kinds.includes(record.kind))).filter((record) => !options.trustedOnly || (record.provenance.originClass === "owner" || record.provenance.originClass === "agent") && !record.provenance.derivedFromRecalledContext);
370
404
  const candidateById = new Map(candidateRecords.map((record) => [record.id, record]));
371
405
  const missingRows = rows.filter((row) => !candidateById.has(row.record_id));
372
406
  const missingEvidence = listMemoryEvidenceForRecords(missingRows.map((row) => row.record_id));
@@ -0,0 +1,18 @@
1
+ ALTER TABLE memory_records ADD COLUMN origin_class TEXT NOT NULL DEFAULT 'untrusted'
2
+ CHECK (origin_class IN ('owner', 'agent', 'untrusted', 'system'));
3
+ ALTER TABLE memory_records ADD COLUMN session_kind TEXT NOT NULL DEFAULT 'unknown'
4
+ CHECK (session_kind IN ('interactive', 'group', 'automation', 'workflow', 'subagent', 'background', 'unknown'));
5
+ ALTER TABLE memory_records ADD COLUMN observed_at INTEGER NOT NULL DEFAULT 0;
6
+ ALTER TABLE memory_records ADD COLUMN source_session_id TEXT;
7
+ ALTER TABLE memory_records ADD COLUMN source_turn_id TEXT;
8
+ ALTER TABLE memory_records ADD COLUMN supersedes_key TEXT;
9
+ ALTER TABLE memory_records ADD COLUMN derived_from_recalled_context INTEGER NOT NULL DEFAULT 0
10
+ CHECK (derived_from_recalled_context IN (0, 1));
11
+
12
+ UPDATE memory_records
13
+ SET observed_at = CASE WHEN observed_at = 0 THEN created_at ELSE observed_at END;
14
+
15
+ CREATE INDEX idx_memory_records_trusted_scope_updated
16
+ ON memory_records(origin_class, derived_from_recalled_context, status, workspace_id, updated_at DESC);
17
+ CREATE INDEX idx_memory_records_source_turn
18
+ ON memory_records(source_session_id, source_turn_id);
@@ -3,7 +3,7 @@ import type { ApplyMigrationsOptions } from './types.js';
3
3
  /** Baseline schema version applied from schema.sql on first open. */
4
4
  export declare const XOPC_DB_BASELINE_SCHEMA_VERSION = 11;
5
5
  /** Latest schema version this release supports (increment when adding migrations). */
6
- export declare const XOPC_DB_SCHEMA_VERSION = 133;
6
+ export declare const XOPC_DB_SCHEMA_VERSION = 134;
7
7
  export declare function resolveMigrationsDir(override?: string): string;
8
8
  /**
9
9
  * Apply sequential SQL migrations from (currentVersion + 1) through targetVersion.
@@ -12,7 +12,7 @@ const log = createLogger("Sqlite:Migrations");
12
12
  /** Baseline schema version applied from schema.sql on first open. */
13
13
  const XOPC_DB_BASELINE_SCHEMA_VERSION = 11;
14
14
  /** Latest schema version this release supports (increment when adding migrations). */
15
- const XOPC_DB_SCHEMA_VERSION = 133;
15
+ const XOPC_DB_SCHEMA_VERSION = 134;
16
16
  const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
17
17
  function backupBeforeTaskCutover(db, databasePath) {
18
18
  db.exec("PRAGMA wal_checkpoint(FULL)");
@@ -57,7 +57,7 @@ function applySingleMigration(db, migration) {
57
57
  * Each step runs in its own transaction and updates schema_meta on success.
58
58
  */
59
59
  function applyPendingMigrations(db, options = {}) {
60
- const targetVersion = options.targetVersion ?? 133;
60
+ const targetVersion = options.targetVersion ?? 134;
61
61
  let currentVersion = readSchemaVersion(db);
62
62
  if (currentVersion > targetVersion) throw new DatabaseSchemaTooNewError(currentVersion, targetVersion);
63
63
  if (currentVersion >= targetVersion) return currentVersion;
@@ -94,7 +94,7 @@ function applyPendingMigrations(db, options = {}) {
94
94
  }
95
95
  /** Inspect schema version without mutating the database. */
96
96
  function inspectSchemaMigrationStatus(db, options = {}) {
97
- const appVersion = options.targetVersion ?? 133;
97
+ const appVersion = options.targetVersion ?? 134;
98
98
  const dbVersion = readSchemaVersion(db);
99
99
  if (dbVersion > appVersion) return {
100
100
  dbVersion,
@@ -19,7 +19,7 @@ const log = createLogger('Sqlite:Migrations');
19
19
  export const XOPC_DB_BASELINE_SCHEMA_VERSION = 11;
20
20
 
21
21
  /** Latest schema version this release supports (increment when adding migrations). */
22
- export const XOPC_DB_SCHEMA_VERSION = 133;
22
+ export const XOPC_DB_SCHEMA_VERSION = 134;
23
23
 
24
24
  const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
25
25
 
@@ -32,7 +32,7 @@ function ensureXopcDatabaseSchema(db, options = {}) {
32
32
  currentVersion = 11;
33
33
  }
34
34
  applyPendingMigrations(db, {
35
- targetVersion: 133,
35
+ targetVersion: 134,
36
36
  databasePath: options.databasePath
37
37
  });
38
38
  }
@@ -23,9 +23,9 @@ import { parseModelRef } from "../../agent/models/selection.js";
23
23
  import { buildReviewContext, resolveGitRoot } from "../../review/review-git.js";
24
24
  import { MessageBus, MessageBusShutdownError } from "../../infra/bus/queue.js";
25
25
  import "../../infra/bus/index.js";
26
+ import { prependEnvelopeTimestamp } from "../../channels/envelope-timestamp.js";
26
27
  import { getWorkspacePath } from "../../config/workspace-path-helpers.js";
27
28
  import "../../config/index.js";
28
- import { prependEnvelopeTimestamp } from "../../channels/envelope-timestamp.js";
29
29
  import { buildWorkflowChildTools } from "../../agent/workflow/workflow-child-tools.js";
30
30
  import { WorkflowRunService } from "../../workflows/service/workflow-run-service.js";
31
31
  import { WorkflowSessionBridge } from "../../workflows/service/workflow-session-bridge.js";
@@ -160,6 +160,8 @@ var UserContextPlanner = class {
160
160
  rejected: [],
161
161
  consentRequests: [],
162
162
  estimatedTokens: 0,
163
+ contextChars: 0,
164
+ contextItemCount: 0,
163
165
  allocation: params.allocation
164
166
  };
165
167
  const started = Date.now();
@@ -174,7 +176,8 @@ var UserContextPlanner = class {
174
176
  const queryProfile = buildRetrievalQueryProfile(query, scopeInput);
175
177
  const selfReview = queryProfile.selfReview;
176
178
  const maxResults = requestedMaxResults ?? (selfReview ? SELF_REVIEW_MAX_RESULTS : DEFAULT_MAX_RESULTS);
177
- const maxChars = requestedMaxChars ?? (selfReview ? SELF_REVIEW_MAX_CONTEXT_CHARS : DEFAULT_MAX_CONTEXT_CHARS);
179
+ const budgetChars = requestedMaxChars ?? (selfReview ? SELF_REVIEW_MAX_CONTEXT_CHARS : DEFAULT_MAX_CONTEXT_CHARS);
180
+ const maxChars = Math.max(0, budgetChars - 2);
178
181
  const projects = new ProjectStore();
179
182
  const excluded = new Set(params.excludedRecordIds ?? []);
180
183
  const rejected = [];
@@ -464,7 +467,7 @@ var UserContextPlanner = class {
464
467
  turnId: params.turnId,
465
468
  sessionKey: params.sessionKey,
466
469
  query,
467
- budget: maxChars,
470
+ budget: budgetChars,
468
471
  durationMs: Date.now() - started,
469
472
  items: traceItems
470
473
  });
@@ -474,7 +477,9 @@ var UserContextPlanner = class {
474
477
  items,
475
478
  rejected,
476
479
  consentRequests,
477
- estimatedTokens: Math.ceil(block.length / 4),
480
+ estimatedTokens: Math.ceil((block.length + (block ? 2 : 0)) / 4),
481
+ contextChars: block.length + (block ? 2 : 0),
482
+ contextItemCount: traceItems.filter((item) => item.decision === "selected").length,
478
483
  allocation: params.allocation
479
484
  };
480
485
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xopcai/xopc",
3
- "version": "0.0.224",
3
+ "version": "0.0.225",
4
4
  "description": "Local-first personal AI assistant with reviewable user understanding, durable tasks, workflows, automations, and local or cloud models.",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -157,8 +157,8 @@
157
157
  "vitepress": "^1.6.4",
158
158
  "vitest": "4.1.5",
159
159
  "vue": "^3.5.35",
160
- "@xopcai/gateway-contract": "0.0.0",
161
160
  "@xopcai/endpoint-tools-protocol": "0.0.0",
161
+ "@xopcai/gateway-contract": "0.0.0",
162
162
  "@xopcai/realtime-protocol": "0.0.0",
163
163
  "@xopcai/realtime-client": "0.0.0"
164
164
  },
@@ -1 +0,0 @@
1
- import{r as e}from"./locale-store-CPylQjH9.js";import{n as t}from"./channel-recipient-api-krezGsKc.js";function n(){return e(`/api/channels/status`)}var r=t;export{r as n,n as t};