@xopcai/xopc 0.0.219 → 0.0.221

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 (172) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{activity-store-slG02hSm.js → activity-store-NItGQmvR.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DZ6ETNIk.js → agent-avatar-dicebear-B8SBTGg3.js} +1 -1
  5. package/dist/gateway/static/root/assets/{agents-DxaIH0Ep.js → agents-Brs2-m6t.js} +1 -1
  6. package/dist/gateway/static/root/assets/{api-Tz57QxiN.js → api-53ZXsuyr.js} +1 -1
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-DdR1L4LR.js → app-management-settings-panel-BtmPXaqu.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-wYbwqmee.js → appearance-settings-t7HoJyNN.js} +1 -1
  9. package/dist/gateway/static/root/assets/{apps-page-CyWr6KyO.js → apps-page-DJ_Dsb1j.js} +1 -1
  10. package/dist/gateway/static/root/assets/{archive-plugin-DKXa160O.js → archive-plugin-D8o8CP9Y.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-CzwA9g2y.js → attachment-load-CsLXzas8.js} +1 -1
  12. package/dist/gateway/static/root/assets/{automations-page-DwAXyWAY.js → automations-page-D-zgoAKz.js} +1 -1
  13. package/dist/gateway/static/root/assets/{automations-workspace-CL7ieYIt.js → automations-workspace-DehLRXfd.js} +1 -1
  14. package/dist/gateway/static/root/assets/{binary-plugins-DoQ_DnT7.js → binary-plugins-B-MjP_22.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-Bj_Uxxng.js → block-editor-i4CfDqLG.js} +1 -1
  16. package/dist/gateway/static/root/assets/{browser-settings-page-BYa_FNC1.js → browser-settings-page-C3QIO4Ti.js} +1 -1
  17. package/dist/gateway/static/root/assets/{browser-workflow-inputs-D4roXE6r.js → browser-workflow-inputs-Bi6RSSpD.js} +1 -1
  18. package/dist/gateway/static/root/assets/{browser-workflows-page-CleKTAKD.js → browser-workflows-page-EEFHUm1i.js} +1 -1
  19. package/dist/gateway/static/root/assets/{capabilities-settings-panel-DYG37N0k.js → capabilities-settings-panel-BHhUp7FW.js} +1 -1
  20. package/dist/gateway/static/root/assets/{capability-presets-api-wtEN6Ss6.js → capability-presets-api-pC2fno7r.js} +1 -1
  21. package/dist/gateway/static/root/assets/{capability-presets-settings-panel-C0Q4dFq-.js → capability-presets-settings-panel-DoClNVLz.js} +1 -1
  22. package/dist/gateway/static/root/assets/{channel-recipient-api-DhuS2RJ3.js → channel-recipient-api-B5Szgu_z.js} +1 -1
  23. package/dist/gateway/static/root/assets/{channels-settings-CpO6Xg0n.js → channels-settings-Je-9a5ZC.js} +1 -1
  24. package/dist/gateway/static/root/assets/channels-status-swr-ByRbxC6z.js +1 -0
  25. package/dist/gateway/static/root/assets/{chat-terminal-dock-ClQMDe2n.js → chat-terminal-dock-DT-OFl4r.js} +1 -1
  26. package/dist/gateway/static/root/assets/{connectors-page-BvyiPdKU.js → connectors-page-D8z9Trw4.js} +1 -1
  27. package/dist/gateway/static/root/assets/{cron-expression-4DvCFs-v.js → cron-expression-MZ_AJqrm.js} +1 -1
  28. package/dist/gateway/static/root/assets/{date-picker-B6FSjt4Z.js → date-picker-Bv9hZLuD.js} +1 -1
  29. package/dist/gateway/static/root/assets/{dependency-picker-Za18eMp1.js → dependency-picker-D-6oO_Vk.js} +1 -1
  30. package/dist/gateway/static/root/assets/{desktop-pet-DUUf3yyJ.js → desktop-pet-CiI5caKj.js} +1 -1
  31. package/dist/gateway/static/root/assets/{desktop-pet-settings-Dwx3GfB8.js → desktop-pet-settings-DhkSOy4K.js} +1 -1
  32. package/dist/gateway/static/root/assets/{directory-picker-path-field-C6dfTCsl.js → directory-picker-path-field-C4s4Pz8I.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-debug-page-Cordpg4X.js → extension-debug-page-DE7J1-6W.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-page-Dw0dGyMl.js → extension-page-DSnACD7E.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-settings-page-B2pUMaXm.js → extension-settings-page-Dk7k2Pok.js} +1 -1
  36. package/dist/gateway/static/root/assets/{gateway-config-api-DAZUOEQh.js → gateway-config-api-IOA1OlHx.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-config-swr-BIqRg-zo.js → gateway-config-swr-BzTbnu4O.js} +1 -1
  38. package/dist/gateway/static/root/assets/{gateway-settings-ik2f-pmV.js → gateway-settings-FX7QsgSQ.js} +1 -1
  39. package/dist/gateway/static/root/assets/{gateway-startup-retry-BFjWYOCS.js → gateway-startup-retry-B2zpkNvi.js} +1 -1
  40. package/dist/gateway/static/root/assets/{heartbeat-settings-BE81XJ8F.js → heartbeat-settings-D5CGVyci.js} +1 -1
  41. package/dist/gateway/static/root/assets/{home-page-BTWXJu_m.js → home-page-DzfZFZx5.js} +1 -1
  42. package/dist/gateway/static/root/assets/{image-generation-api-HXAWlgm6.js → image-generation-api-BXRjz-iY.js} +1 -1
  43. package/dist/gateway/static/root/assets/index-Dcj5KJRg.css +2 -0
  44. package/dist/gateway/static/root/assets/{index-B6gWYy08.js → index-EvA8c7fo.js} +11 -45
  45. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-ROqQ_Xlo.js → keyboard-shortcuts-settings-BjYiM4xq.js} +1 -1
  46. package/dist/gateway/static/root/assets/{local-app-workbench-page-Dcaf190G.js → local-app-workbench-page-hPyTaVYU.js} +1 -1
  47. package/dist/gateway/static/root/assets/{local-apps-page-Be79cyMG.js → local-apps-page-7DHvwSgA.js} +1 -1
  48. package/dist/gateway/static/root/assets/{locale-store-DfK-Hofd.js → locale-store-iKjqemWG.js} +1 -1
  49. package/dist/gateway/static/root/assets/{logs-page-C2pjbXno.js → logs-page-DW0xMKWP.js} +1 -1
  50. package/dist/gateway/static/root/assets/{management-settings-CRspx0oY.js → management-settings-BSxppo9Z.js} +1 -1
  51. package/dist/gateway/static/root/assets/{markdown-split-G3PTpGw3.js → markdown-split-D4oDjZtl.js} +1 -1
  52. package/dist/gateway/static/root/assets/{markdown-view-D4FPJZ91.js → markdown-view-DYkxMtJA.js} +1 -1
  53. package/dist/gateway/static/root/assets/{media-plugins-DT0P7j7u.js → media-plugins-BPNTGROA.js} +1 -1
  54. package/dist/gateway/static/root/assets/messages-kx5W39dO.js +3 -0
  55. package/dist/gateway/static/root/assets/{notes-api-q7HjYO07.js → notes-api-DJizatxh.js} +1 -1
  56. package/dist/gateway/static/root/assets/{notes-page-Cgl2h7AR.js → notes-page-DU5tKPTq.js} +1 -1
  57. package/dist/gateway/static/root/assets/{notes-workbench-DFMQYyGJ.js → notes-workbench-D669d98r.js} +2 -2
  58. package/dist/gateway/static/root/assets/pcm-capture-worklet-uW_SEACy.js +1 -0
  59. package/dist/gateway/static/root/assets/{product-open-page-ComKLO4D.js → product-open-page-CPoQvD6P.js} +1 -1
  60. package/dist/gateway/static/root/assets/{project-detail-page-DUFmQscH.js → project-detail-page-CpsQ9PTA.js} +1 -1
  61. package/dist/gateway/static/root/assets/{projects-page-CTWxt3dv.js → projects-page-CitO1LMc.js} +1 -1
  62. package/dist/gateway/static/root/assets/{registry-api-BBoJ7khF.js → registry-api-Cx3JxXSL.js} +1 -1
  63. package/dist/gateway/static/root/assets/{remote-access-hub-qmG-3qjj.js → remote-access-hub-C9-bL4V6.js} +1 -1
  64. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-CXHQc53b.js → runtime-tools-settings-panel-xqnWcvIv.js} +1 -1
  65. package/dist/gateway/static/root/assets/{schema-form-3jTDF2lJ.js → schema-form-CuIDPYu6.js} +1 -1
  66. package/dist/gateway/static/root/assets/{sessions-page-D_We4_MV.js → sessions-page-CPSARi4y.js} +1 -1
  67. package/dist/gateway/static/root/assets/settings-advanced-gate-BxT80Fmr.js +1 -0
  68. package/dist/gateway/static/root/assets/{settings-form-section-CUDozALU.js → settings-form-section-DkAv9ncE.js} +1 -1
  69. package/dist/gateway/static/root/assets/{settings-loading-skeleton-H3ZH6a6l.js → settings-loading-skeleton-BJUQiEKb.js} +1 -1
  70. package/dist/gateway/static/root/assets/{settings-page-tx29z21o.js → settings-page-KHRbLwmw.js} +1 -1
  71. package/dist/gateway/static/root/assets/{setup-status-panel-VunfXpTX.js → setup-status-panel-C8jd20Db.js} +1 -1
  72. package/dist/gateway/static/root/assets/{share-preview-page-MyThymEx.js → share-preview-page-WCVtJ3sX.js} +1 -1
  73. package/dist/gateway/static/root/assets/{shares-settings-DkZvY1cr.js → shares-settings-DrQ_cOXh.js} +1 -1
  74. package/dist/gateway/static/root/assets/skill-reload-api-C_4cG30x.js +1 -0
  75. package/dist/gateway/static/root/assets/{skills-page-BOOyMnno.js → skills-page-CKhR9J81.js} +1 -1
  76. package/dist/gateway/static/root/assets/{skills-page.utils-Bl5Yv3Cx.js → skills-page.utils-AYX-e5sD.js} +1 -1
  77. package/dist/gateway/static/root/assets/{system-settings-panel-DwQ3O1ta.js → system-settings-panel-IIF-K9ML.js} +1 -1
  78. package/dist/gateway/static/root/assets/{task-detail-page-BwOyrADL.js → task-detail-page-CYjsecEr.js} +1 -1
  79. package/dist/gateway/static/root/assets/{theme-store-Br4BtK4x.js → theme-store-BOD2D0dJ.js} +1 -1
  80. package/dist/gateway/static/root/assets/{use-autosave-DRS3RwS9.js → use-autosave-DcktF1j1.js} +1 -1
  81. package/dist/gateway/static/root/assets/{user-context-page-ClV2r3Cr.js → user-context-page-Cy1D2hkt.js} +1 -1
  82. package/dist/gateway/static/root/assets/{voice-api-key-field-CGTE5156.js → voice-api-key-field-BMkNTHHE.js} +1 -1
  83. package/dist/gateway/static/root/assets/{work-discovery-overlay-CW-HKD7h.js → work-discovery-overlay-DVoiXekA.js} +1 -1
  84. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-Dtr9fDC8.js → workflow-run-setup-panel-Cw4LQjuM.js} +1 -1
  85. package/dist/gateway/static/root/assets/{workflows-page-CDOyNgZf.js → workflows-page-DKKH1_Yt.js} +1 -1
  86. package/dist/gateway/static/root/index.html +12 -12
  87. package/dist/package.js +1 -1
  88. package/dist/src/agent/agent-manager.js +3 -3
  89. package/dist/src/agent/embedded/model-runtime.js +1 -1
  90. package/dist/src/agent/embedded/run-for-session.js +1 -1
  91. package/dist/src/agent/image/tool-model-config.js +1 -1
  92. package/dist/src/agent/ipc/inbox.js +1 -1
  93. package/dist/src/agent/service.js +2 -2
  94. package/dist/src/agent/session/session-inspector.js +1 -1
  95. package/dist/src/agent/skills/hub-lock.js +1 -1
  96. package/dist/src/agent/tasks/task-judge-service.js +3 -3
  97. package/dist/src/ai-assist/text-assist.js +1 -1
  98. package/dist/src/auth/credentials.js +2 -2
  99. package/dist/src/auth/profiles/store.js +1 -1
  100. package/dist/src/auth/sync-provider-auth.js +2 -2
  101. package/dist/src/browser/providers/browser-ext-install.js +1 -1
  102. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  103. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  104. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  105. package/dist/src/cli/commands/extension.js +1 -1
  106. package/dist/src/cli/commands/models.js +1 -1
  107. package/dist/src/config/index.js +4 -4
  108. package/dist/src/config/loader.js +1 -1
  109. package/dist/src/config/models-json.js +1 -1
  110. package/dist/src/connectors/connected-source-understanding.js +6 -5
  111. package/dist/src/connectors/learning-coordinator.js +11 -2
  112. package/dist/src/extensions/lockfile.js +1 -1
  113. package/dist/src/extensions/update.js +1 -1
  114. package/dist/src/gateway/agents-admin.js +1 -1
  115. package/dist/src/gateway/file-path-classifier.js +1 -1
  116. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  117. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  118. package/dist/src/gateway/hono/routes/models.js +1 -1
  119. package/dist/src/gateway/hono/routes/understanding-sources.d.ts +9 -0
  120. package/dist/src/gateway/hono/routes/understanding-sources.js +47 -14
  121. package/dist/src/gateway/hono/routes/work-discovery.js +13 -3
  122. package/dist/src/gateway/service/agent-runner.d.ts +4 -0
  123. package/dist/src/gateway/service/agent-runner.js +6 -0
  124. package/dist/src/gateway/service/config-coordinator.js +2 -2
  125. package/dist/src/gateway/service/run-gateway-agent.js +13 -8
  126. package/dist/src/gateway/service/sessions-api.d.ts +9 -0
  127. package/dist/src/gateway/service/sessions-api.js +3 -0
  128. package/dist/src/gateway/service.js +5 -4
  129. package/dist/src/infra/update-runner.js +1 -1
  130. package/dist/src/knowledge/connected-knowledge-pipeline.d.ts +6 -0
  131. package/dist/src/knowledge/connected-knowledge-pipeline.js +35 -4
  132. package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
  133. package/dist/src/providers/index.js +2 -2
  134. package/dist/src/providers/model-registry.js +1 -1
  135. package/dist/src/providers/register-runtime-providers.js +1 -1
  136. package/dist/src/retrieval/queryProfile.d.ts +2 -0
  137. package/dist/src/retrieval/queryProfile.js +11 -1
  138. package/dist/src/storage/sqlite/index.d.ts +2 -2
  139. package/dist/src/storage/sqlite/index.js +3 -3
  140. package/dist/src/storage/sqlite/knowledge-repository.d.ts +5 -1
  141. package/dist/src/storage/sqlite/knowledge-repository.js +16 -1
  142. package/dist/src/storage/sqlite/memory-records-repository.d.ts +2 -0
  143. package/dist/src/storage/sqlite/memory-records-repository.js +21 -1
  144. package/dist/src/storage/sqlite/migrations/133_archive_legacy_work_discovery_profile_facts.sql +11 -0
  145. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  146. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  147. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  148. package/dist/src/storage/sqlite/schema.js +1 -1
  149. package/dist/src/storage/sqlite/session-repository.js +2 -2
  150. package/dist/src/tasks/home-query-service.d.ts +14 -0
  151. package/dist/src/tasks/home-query-service.js +19 -2
  152. package/dist/src/tui/tui-startup-resources.js +1 -1
  153. package/dist/src/tui/tui.js +1 -1
  154. package/dist/src/user-context/consolidation.d.ts +1 -0
  155. package/dist/src/user-context/consolidation.js +62 -2
  156. package/dist/src/user-context/focus-lifecycle.d.ts +2 -0
  157. package/dist/src/user-context/focus-lifecycle.js +26 -0
  158. package/dist/src/user-context/planner.js +46 -13
  159. package/dist/src/work-discovery/analyzer.js +6 -4
  160. package/dist/src/work-discovery/index.js +2 -2
  161. package/dist/src/work-discovery/service.d.ts +12 -3
  162. package/dist/src/work-discovery/service.js +164 -83
  163. package/dist/src/work-discovery/source-repository.d.ts +1 -0
  164. package/dist/src/work-discovery/source-repository.js +10 -4
  165. package/dist/src/work-discovery/types.d.ts +2 -1
  166. package/dist/src/workflows/service/workflow-run-service.js +1 -1
  167. package/package.json +3 -3
  168. package/dist/gateway/static/root/assets/channels-status-swr-CXhPeiNj.js +0 -1
  169. package/dist/gateway/static/root/assets/index-CDkuz_YC.css +0 -2
  170. package/dist/gateway/static/root/assets/messages-B701TEZ5.js +0 -3
  171. package/dist/gateway/static/root/assets/settings-advanced-gate-B_QhPgU0.js +0 -1
  172. package/dist/gateway/static/root/assets/skill-reload-api-DVDOh1iY.js +0 -1
@@ -1,4 +1,6 @@
1
1
  import { deleteUnderstanding, listUnderstandingEvidence, listUnderstandings, setUnderstandingStatus } from "../../../storage/sqlite/user-context-repository.js";
2
+ import { countKnowledgeSourceItems, deleteKnowledgeSourceItems } from "../../../storage/sqlite/knowledge-repository.js";
3
+ import { countMemoryRecordsBySourceInstanceId, deleteMemoryRecordsBySourceInstanceId } from "../../../storage/sqlite/memory-records-repository.js";
2
4
  import { getConnectorAccount } from "../../../storage/sqlite/connector-account-repository.js";
3
5
  import "../../../storage/sqlite/index.js";
4
6
  import { init_agent_scope, resolveDefaultAgentId } from "../../../agent/agent-scope.js";
@@ -44,14 +46,33 @@ function sourceRevocationImpact(grantId) {
44
46
  if ((focus.sourceRunId ? getUnderstandingSourceRun(focus.sourceRunId) : null)?.grantId !== grantId) return [];
45
47
  return listUserFocusEvidence(focus.id).some((entry) => !belongs(entry)) ? [] : [focus];
46
48
  });
49
+ const memoryRecordCount = sourceInstanceId ? countMemoryRecordsBySourceInstanceId(sourceInstanceId) : 0;
50
+ const boundedRawCount = sourceInstanceId ? countKnowledgeSourceItems(sourceInstanceId) : 0;
47
51
  return {
48
52
  grant,
53
+ sourceInstanceId,
49
54
  understandingIds: understandings.map((item) => item.id),
50
55
  focusIds: focuses.map((item) => item.id),
51
- derivedCount: understandings.length + focuses.length,
56
+ derivedCount: understandings.length + focuses.length + memoryRecordCount,
52
57
  understandingCount: understandings.length,
53
58
  focusCount: focuses.length,
54
- boundedRawCount: 0
59
+ memoryRecordCount,
60
+ boundedRawCount
61
+ };
62
+ }
63
+ function applySourceRevocationChoices(impact, options) {
64
+ let derivedDeleted = 0;
65
+ for (const id of impact.focusIds) if (options.derived === "delete") {
66
+ if (deleteUserFocus(id)) derivedDeleted += 1;
67
+ } else updateUserFocus(id, { status: "paused" });
68
+ for (const id of impact.understandingIds) if (options.derived === "delete") {
69
+ if (deleteUnderstanding(id)) derivedDeleted += 1;
70
+ } else setUnderstandingStatus(id, "needs_review");
71
+ if (options.derived === "delete" && impact.sourceInstanceId) derivedDeleted += deleteMemoryRecordsBySourceInstanceId(impact.sourceInstanceId);
72
+ const rawDeleted = options.raw === "delete" && impact.sourceInstanceId ? deleteKnowledgeSourceItems(impact.sourceInstanceId) : 0;
73
+ return {
74
+ derivedDeleted,
75
+ rawDeleted
55
76
  };
56
77
  }
57
78
  function registerUnderstandingSourceRoutes(authenticated, deps) {
@@ -168,17 +189,18 @@ function registerUnderstandingSourceRoutes(authenticated, deps) {
168
189
  const connectionId = accountId ? getConnectorAccount(accountId)?.currentConnectionId : void 0;
169
190
  if (connectionId) deps.service.setConnectorLearningPaused(connectionId, true);
170
191
  const grant = revokeUnderstandingSourceGrant(grantId);
171
- if (grant && impact) {
172
- for (const id of impact.focusIds) if (derived === "delete") deleteUserFocus(id);
173
- else updateUserFocus(id, { status: "paused" });
174
- for (const id of impact.understandingIds) if (derived === "delete") deleteUnderstanding(id);
175
- else setUnderstandingStatus(id, "needs_review");
176
- }
192
+ const deleted = grant && impact ? applySourceRevocationChoices(impact, {
193
+ derived,
194
+ raw
195
+ }) : {
196
+ derivedDeleted: 0,
197
+ rawDeleted: 0
198
+ };
177
199
  return grant ? c.json({
178
200
  ok: true,
179
201
  grant,
180
202
  impact,
181
- rawDeleted: 0
203
+ ...deleted
182
204
  }) : c.json({
183
205
  ok: false,
184
206
  error: "Source grant not found"
@@ -232,15 +254,21 @@ function registerUnderstandingSourceRoutes(authenticated, deps) {
232
254
  sources: service.listDirectorySources()
233
255
  }));
234
256
  authenticated.post("/api/understanding/sources/work-folders", limited, async (c) => {
235
- const rootPath = stringField(await c.req.json().catch(() => null), "rootPath");
257
+ const body = await c.req.json().catch(() => null);
258
+ const rootPath = stringField(body, "rootPath");
259
+ const processingPolicy = stringField(body, "processingPolicy");
236
260
  if (!rootPath) return c.json({
237
261
  ok: false,
238
262
  error: "Missing rootPath"
239
263
  }, 400);
264
+ if (processingPolicy !== "local_only" && processingPolicy !== "remote_allowed") return c.json({
265
+ ok: false,
266
+ error: "Explicit processingPolicy is required"
267
+ }, 400);
240
268
  try {
241
269
  return c.json({
242
270
  ok: true,
243
- source: await service.grantDirectorySource(rootPath)
271
+ source: await service.grantDirectorySource(rootPath, processingPolicy)
244
272
  }, 201);
245
273
  } catch (error) {
246
274
  return c.json({
@@ -268,14 +296,19 @@ function registerUnderstandingSourceRoutes(authenticated, deps) {
268
296
  });
269
297
  authenticated.post("/api/understanding/bootstrap", limited, async (c) => {
270
298
  const body = await c.req.json().catch(() => null);
271
- const items = body && typeof body === "object" && Array.isArray(body.items) ? body.items.slice(0, 150) : [];
299
+ const items = body && typeof body === "object" && Array.isArray(body.items) ? body.items.slice(0, 1200) : [];
300
+ const processingPolicy = stringField(body, "processingPolicy");
272
301
  if (!items.length) return c.json({
273
302
  ok: false,
274
303
  error: "No understanding source items were provided"
275
304
  }, 400);
305
+ if (processingPolicy !== "local_only" && processingPolicy !== "remote_allowed") return c.json({
306
+ ok: false,
307
+ error: "Explicit processingPolicy is required"
308
+ }, 400);
276
309
  try {
277
310
  const checkpoints = body && typeof body === "object" && body.sourceCheckpoints && typeof body.sourceCheckpoints === "object" ? body.sourceCheckpoints : void 0;
278
- const result = await service.importUnderstandingSources(items, c.req.raw.signal, stringField(body, "workDiscoveryRunId") || void 0, checkpoints);
311
+ const result = await service.importUnderstandingSources(items, processingPolicy, c.req.raw.signal, stringField(body, "workDiscoveryRunId") || void 0, checkpoints);
279
312
  return c.json({
280
313
  ok: true,
281
314
  ...result
@@ -348,4 +381,4 @@ function registerUnderstandingSourceRoutes(authenticated, deps) {
348
381
  });
349
382
  }
350
383
  //#endregion
351
- export { registerUnderstandingSourceRoutes, sourceRevocationImpact };
384
+ export { applySourceRevocationChoices, registerUnderstandingSourceRoutes, sourceRevocationImpact };
@@ -86,7 +86,8 @@ function registerWorkDiscoveryRoutes(authenticated, deps) {
86
86
  const candidates = await service.discoverCandidates(c.req.raw.signal);
87
87
  return c.json({
88
88
  ok: true,
89
- candidates
89
+ candidates,
90
+ processingTarget: service.getModelProcessingTarget()
90
91
  });
91
92
  } catch (error) {
92
93
  return c.json({
@@ -100,13 +101,22 @@ function registerWorkDiscoveryRoutes(authenticated, deps) {
100
101
  ok: false,
101
102
  error: "Work discovery is disabled"
102
103
  }, 404);
103
- const idempotencyKey = stringField(await c.req.json().catch(() => null), "idempotencyKey");
104
+ const body = await c.req.json().catch(() => null);
105
+ const idempotencyKey = stringField(body, "idempotencyKey");
106
+ const processingPolicy = stringField(body, "processingPolicy");
104
107
  if (!idempotencyKey) return c.json({
105
108
  ok: false,
106
109
  error: "Missing idempotencyKey"
107
110
  }, 400);
111
+ if (processingPolicy !== "local_only" && processingPolicy !== "remote_allowed") return c.json({
112
+ ok: false,
113
+ error: "Explicit processingPolicy is required"
114
+ }, 400);
108
115
  try {
109
- const run = await service.startQuickRun({ idempotencyKey });
116
+ const run = await service.startQuickRun({
117
+ idempotencyKey,
118
+ processingPolicy
119
+ });
110
120
  return c.json({
111
121
  ok: true,
112
122
  run
@@ -57,6 +57,10 @@ export declare class GatewayAgentRunner {
57
57
  /** True when a webchat agent run is currently in-flight for `sessionKey`. */
58
58
  hasActiveRun(sessionKey: string): boolean;
59
59
  getActiveRunId(sessionKey: string): string | undefined;
60
+ listActiveRuns(): Array<{
61
+ sessionKey: string;
62
+ runId: string;
63
+ }>;
60
64
  getClarifyBridge(): ClarifyBridge;
61
65
  /** Called from `GatewayService.stop()` so the bridge gets cleaned up. */
62
66
  disposeClarifyBridge(): void;
@@ -77,6 +77,12 @@ var GatewayAgentRunner = class {
77
77
  getActiveRunId(sessionKey) {
78
78
  return this.activeWebchatRunBySession.get(sessionKey);
79
79
  }
80
+ listActiveRuns() {
81
+ return [...this.activeWebchatRunBySession.entries()].map(([sessionKey, runId]) => ({
82
+ sessionKey,
83
+ runId
84
+ }));
85
+ }
80
86
  getClarifyBridge() {
81
87
  return this.clarifyBridge;
82
88
  }
@@ -1,15 +1,15 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { loadConfig, saveConfig } from "../../config/loader.js";
4
3
  import { getModelRegistry } from "../../providers/model-registry.js";
4
+ import { loadConfig, saveConfig } from "../../config/loader.js";
5
5
  import { init_providers } from "../../providers/index.js";
6
6
  import { disposeAllSessionMcpRuntimes } from "../../agent/mcp/bundle-mcp-runtime.js";
7
7
  import { reloadImageGenerationProviders } from "../../agent/image/generation/provider-registry.js";
8
8
  import "../../agent/mcp/bundle-mcp-tools.js";
9
9
  import { ConfigHotReloader } from "../../config/reload.js";
10
10
  import "../../config/index.js";
11
- import { sanitizeTunnelConfig } from "../../tunnel/tunnel-config.js";
12
11
  import { computeBundledExtensionExtensionsPatch } from "../../extensions/bundled-extension-activation.js";
12
+ import { sanitizeTunnelConfig } from "../../tunnel/tunnel-config.js";
13
13
  //#region src/gateway/service/config-coordinator.ts
14
14
  init_providers();
15
15
  init_logger();
@@ -98,13 +98,7 @@ async function* runGatewayAgent(deps, message, channel, chatId, origin, attachme
98
98
  const emitAndYield = function* (events) {
99
99
  for (const event of events) {
100
100
  if (taskRun) captureTaskEvent(event);
101
- if (channel === "webchat") {
102
- publishRealtime(`run:${runId}`, event.type, event);
103
- if (event.type === "run_start") publishRealtime("sessions", "run.started", {
104
- sessionKey: streamSessionKey,
105
- runId
106
- });
107
- }
101
+ if (channel === "webchat") publishRealtime(`run:${runId}`, event.type, event);
108
102
  yield event;
109
103
  }
110
104
  };
@@ -126,6 +120,10 @@ async function* runGatewayAgent(deps, message, channel, chatId, origin, attachme
126
120
  if (!activeWebchatRunBySession.has(sessionKey)) {
127
121
  activeWebchatRunBySession.set(sessionKey, runId);
128
122
  registeredActiveWebchatRun = true;
123
+ publishRealtime("sessions", "run.started", {
124
+ sessionKey,
125
+ runId
126
+ });
129
127
  }
130
128
  let streamError;
131
129
  try {
@@ -172,7 +170,14 @@ async function* runGatewayAgent(deps, message, channel, chatId, origin, attachme
172
170
  summary: streamError
173
171
  };
174
172
  } finally {
175
- if (registeredActiveWebchatRun && activeWebchatRunBySession.get(sessionKey) === runId) activeWebchatRunBySession.delete(sessionKey);
173
+ if (registeredActiveWebchatRun && activeWebchatRunBySession.get(sessionKey) === runId) {
174
+ activeWebchatRunBySession.delete(sessionKey);
175
+ publishRealtime("sessions", "run.completed", {
176
+ sessionKey,
177
+ runId,
178
+ status: terminalStatus
179
+ });
180
+ }
176
181
  runAbortControllers.delete(runId);
177
182
  const assistantPlainText = agentService.getLastAssistantPlainText(sessionKey);
178
183
  const reviewHint = agentService.takeTaskReviewStreamHint(sessionKey);
@@ -22,6 +22,11 @@ export interface GatewaySessionsApiOptions {
22
22
  getAgentService: () => AgentService;
23
23
  /** Read-only view of in-flight webchat runs (per session key → run id). */
24
24
  getActiveWebchatRunId: (sessionKey: string) => string | undefined;
25
+ /** Snapshot of all in-flight webchat runs for workspace briefing surfaces. */
26
+ listActiveWebchatRuns: () => Array<{
27
+ sessionKey: string;
28
+ runId: string;
29
+ }>;
25
30
  }
26
31
  export declare class GatewaySessionsApi {
27
32
  private readonly opts;
@@ -47,6 +52,10 @@ export declare class GatewaySessionsApi {
47
52
  active: boolean;
48
53
  runId?: string;
49
54
  };
55
+ listActiveRuns(): Array<{
56
+ sessionKey: string;
57
+ runId: string;
58
+ }>;
50
59
  getMessagePage(key: string, options?: {
51
60
  offset?: number;
52
61
  limit?: number;
@@ -48,6 +48,9 @@ var GatewaySessionsApi = class {
48
48
  runId
49
49
  };
50
50
  }
51
+ listActiveRuns() {
52
+ return this.opts.listActiveWebchatRuns();
53
+ }
51
54
  getMessagePage(key, options) {
52
55
  return this.opts.sessionIndex.getSessionMessagePage(key, options);
53
56
  }
@@ -9,14 +9,14 @@ import { closeXopcDatabase, openXopcDatabase } from "../storage/sqlite/connectio
9
9
  import "../storage/sqlite/index.js";
10
10
  import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
11
11
  import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveDefaultAgentId } from "../agent/agent-scope.js";
12
- import { buildSessionKey, init_session_key, sanitizeSegment } from "../routing/session-key.js";
13
- import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
14
12
  import { init_paths, resolveAgentDir, resolveConfigPath, resolveExtensionsDir } from "../config/paths.js";
13
+ import { prewarmModelRegistry } from "../providers/model-registry.js";
15
14
  import { areExtensionsGloballyDisabled } from "../extensions/discover-extensions.js";
16
15
  import { buildExtensionMetadataSnapshot } from "../extensions/extension-metadata-snapshot.js";
17
16
  import { buildChannelCatalogForConfig, buildChannelCatalogFromSnapshot, init_channel_catalog_service } from "../channels/catalog/channel-catalog-service.js";
18
17
  import { loadConfig, saveConfig } from "../config/loader.js";
19
- import { prewarmModelRegistry } from "../providers/model-registry.js";
18
+ import { buildSessionKey, init_session_key, sanitizeSegment } from "../routing/session-key.js";
19
+ import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
20
20
  import { init_providers, providers_exports } from "../providers/index.js";
21
21
  import { TaskRepository } from "../tasks/task-repository.js";
22
22
  import { TaskConversationRepository } from "../tasks/task-conversation-repository.js";
@@ -405,7 +405,8 @@ var GatewayService = class {
405
405
  this.sessions = new GatewaySessionsApi({
406
406
  sessionIndex: this.sessionIndex,
407
407
  getAgentService: () => this.ensureAgentService(),
408
- getActiveWebchatRunId: (sk) => this.agentRunner.getActiveRunId(sk)
408
+ getActiveWebchatRunId: (sk) => this.agentRunner.getActiveRunId(sk),
409
+ listActiveWebchatRuns: () => this.agentRunner.listActiveRuns()
409
410
  });
410
411
  this.marketplace = new GatewayMarketplaceService({
411
412
  getConfig: () => this.config,
@@ -1,3 +1,4 @@
1
+ import { runPostUpdateExtensionSync } from "../extensions/update.js";
1
2
  import "./update-channels.js";
2
3
  import { compareSemver, resolveNpmChannelTag } from "./update-check.js";
3
4
  import { readPackageName, readPackageVersion } from "./package-json.js";
@@ -7,7 +8,6 @@ import { runGlobalPackageUpdateSteps } from "./package-update-steps.js";
7
8
  import { resolveStableNodePath } from "./stable-node-path.js";
8
9
  import { trimLogTail } from "./update-log.js";
9
10
  import { maybeRestartGatewayAfterUpdate } from "./update-restart.js";
10
- import { runPostUpdateExtensionSync } from "../extensions/update.js";
11
11
  import path from "node:path";
12
12
  import fs from "node:fs/promises";
13
13
  //#region src/infra/update-runner.ts
@@ -11,11 +11,17 @@ export type KnowledgeSynthesisBatchResult = {
11
11
  failed: number;
12
12
  recordIds: string[];
13
13
  };
14
+ export type ConnectedKnowledgePruneResult = {
15
+ rawDeleted: number;
16
+ derivedDeleted: number;
17
+ };
14
18
  export declare class ConnectedKnowledgePipeline {
15
19
  private readonly options;
16
20
  private readonly workerId;
17
21
  private readonly batchSize;
18
22
  constructor(options: ConnectedKnowledgePipelineOptions);
19
23
  processPending(sourceInstanceId?: string): Promise<KnowledgeSynthesisBatchResult>;
24
+ /** Remove bounded raw items and every content-bearing memory derived only from them. */
25
+ pruneBoundedRetention(sourceInstanceId: string, olderThanMs: number): ConnectedKnowledgePruneResult;
20
26
  private rebuildDailySummary;
21
27
  }
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
- import { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, deleteMemoryEvidenceForRecord, listKnowledgeSourceItems } from "../storage/sqlite/knowledge-repository.js";
4
- import { getMemoryRecord, upsertMemoryRecord } from "../storage/sqlite/memory-records-repository.js";
3
+ import { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, deleteMemoryEvidenceForRecord, listKnowledgeSourceItems, pruneBoundedKnowledgeSourceItems } from "../storage/sqlite/knowledge-repository.js";
4
+ import { deleteMemoryRecord, getMemoryRecord, upsertMemoryRecord } from "../storage/sqlite/memory-records-repository.js";
5
5
  import "../storage/sqlite/index.js";
6
6
  import { createHash, randomUUID } from "node:crypto";
7
7
  //#region src/knowledge/connected-knowledge-pipeline.ts
@@ -180,13 +180,43 @@ var ConnectedKnowledgePipeline = class {
180
180
  }
181
181
  return result;
182
182
  }
183
- rebuildDailySummary(sourceInstanceId, day) {
183
+ /** Remove bounded raw items and every content-bearing memory derived only from them. */
184
+ pruneBoundedRetention(sourceInstanceId, olderThanMs) {
185
+ const expired = [];
186
+ for (let offset = 0;; offset += 500) {
187
+ const page = listKnowledgeSourceItems({
188
+ sourceInstanceId,
189
+ retentionClass: "bounded",
190
+ retentionBeforeMs: olderThanMs,
191
+ includeDeleted: true,
192
+ limit: 500,
193
+ offset
194
+ });
195
+ expired.push(...page);
196
+ if (page.length < 500) break;
197
+ }
198
+ if (!expired.length) return {
199
+ rawDeleted: 0,
200
+ derivedDeleted: 0
201
+ };
202
+ const affectedDays = new Set(expired.map(dayFor));
203
+ let derivedDeleted = 0;
204
+ for (const item of expired) if (deleteMemoryRecord(knowledgeRecordId(item.id))) derivedDeleted += 1;
205
+ const rawDeleted = pruneBoundedKnowledgeSourceItems(sourceInstanceId, olderThanMs);
206
+ for (const day of affectedDays) if (this.rebuildDailySummary(sourceInstanceId, day, true)) derivedDeleted += 1;
207
+ return {
208
+ rawDeleted,
209
+ derivedDeleted
210
+ };
211
+ }
212
+ rebuildDailySummary(sourceInstanceId, day, deleteWhenEmpty = false) {
184
213
  const items = listKnowledgeSourceItems({
185
214
  sourceInstanceId,
186
215
  limit: 500
187
216
  }).filter((item) => dayFor(item) === day && item.synthesisStatus === "completed").slice(0, MAX_SUMMARY_ITEMS);
188
217
  if (items.length === 0) {
189
218
  const existing = getMemoryRecord(summaryRecordId(sourceInstanceId, day));
219
+ if (existing && deleteWhenEmpty) return deleteMemoryRecord(existing.id);
190
220
  if (existing) upsertMemoryRecord({
191
221
  id: existing.id,
192
222
  providerId: "connected-knowledge",
@@ -210,7 +240,7 @@ var ConnectedKnowledgePipeline = class {
210
240
  expiresAt: existing.expiresAt,
211
241
  canonicalKey: existing.canonicalKey
212
242
  });
213
- return;
243
+ return false;
214
244
  }
215
245
  const sourceProvider = providerId(items[0]);
216
246
  const lines = [`# ${sourceProvider} updates for ${day}`, ""];
@@ -263,6 +293,7 @@ var ConnectedKnowledgePipeline = class {
263
293
  confidence: .72,
264
294
  observedAt: item.occurredAt ?? item.sourceUpdatedAt
265
295
  });
296
+ return false;
266
297
  }
267
298
  };
268
299
  //#endregion
@@ -1,5 +1,5 @@
1
- import { init_sync_provider_auth, resolveProviderApiKeyForAgentSync } from "../../auth/sync-provider-auth.js";
2
1
  import { getApiKeyFromEnv, init_env_keys } from "../env-keys.js";
2
+ import { init_sync_provider_auth, resolveProviderApiKeyForAgentSync } from "../../auth/sync-provider-auth.js";
3
3
  import { getDefaultAuthProfileStore } from "./auth-profile-store.js";
4
4
  //#region src/providers/auth-runtime/resolve-auth.ts
5
5
  init_env_keys();
@@ -1,11 +1,11 @@
1
1
  import { __esmMin, __exportAll } from "../../_virtual/_rolldown/runtime.js";
2
2
  import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
3
- import { getOAuthProviderIds, init_registry } from "../auth/oauth/registry.js";
4
- import { hasProviderAuthOnDiskSync, init_sync_provider_auth } from "../auth/sync-provider-auth.js";
5
3
  import { PROVIDER_ENV_MAP, getApiKeyFromEnv, init_env_keys } from "./env-keys.js";
6
4
  import { init_model_ref, splitProviderModelRef } from "./model-ref.js";
7
5
  import { ModelRegistry, getModelRegistry, init_model_registry, prewarmModelRegistry, resetModelRegistry } from "./model-registry.js";
6
+ import { getOAuthProviderIds, init_registry } from "../auth/oauth/registry.js";
8
7
  import { CredentialResolver, hasCredentials, init_credentials } from "../auth/credentials.js";
8
+ import { hasProviderAuthOnDiskSync, init_sync_provider_auth } from "../auth/sync-provider-auth.js";
9
9
  import { EXTENSION_PROVIDER_BASE_URL, init_constants } from "./constants.js";
10
10
  import { applyOfficialModelMetadataCorrections, getSupplementalModels, init_model_supplements } from "./model-supplements.js";
11
11
  import { getProviderRegistry, init_plugin_registry } from "./plugin-registry.js";
@@ -1,8 +1,8 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
2
  import { createLogger } from "../utils/logger/index.js";
3
3
  import { init_logger } from "../utils/logger.js";
4
- import { resolveModelsJsonPath } from "../config/paths.js";
5
4
  import { init_resolve_config_value, resolveConfigValue, resolveHeaders } from "../config/resolve-config-value.js";
5
+ import { resolveModelsJsonPath } from "../config/paths.js";
6
6
  import { getDefaultModelValues, init_models_json, validateModelsConfig } from "../config/models-json.js";
7
7
  import { getApiKeyFromEnv, init_env_keys } from "./env-keys.js";
8
8
  import { getModelCatalogStore, init_model_catalog_store } from "./model-catalog-store.js";
@@ -1,6 +1,6 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
- import { getOAuthProviderDefinition, init_registry } from "../auth/oauth/registry.js";
3
2
  import { getModelCatalogStore, init_model_catalog_store } from "./model-catalog-store.js";
3
+ import { getOAuthProviderDefinition, init_registry } from "../auth/oauth/registry.js";
4
4
  import { XOPC_CLOUD_PROVIDER_ID, init_xopc_cloud_config, resolveXopcModelRouterUrl } from "./xopc-cloud-config.js";
5
5
  //#region src/providers/register-runtime-providers.ts
6
6
  function registerRuntimeProvider(modelRuntime, source) {
@@ -12,6 +12,8 @@ export interface RetrievalQueryProfile {
12
12
  identifiers: string[];
13
13
  intentKinds: string[];
14
14
  timeHints: RetrievalTimeHint[];
15
+ selfReview: boolean;
15
16
  scope: RetrievalScope;
16
17
  }
18
+ export declare function isSelfReviewQuery(query: string): boolean;
17
19
  export declare function buildRetrievalQueryProfile(query: string, scope?: RetrievalScope): RetrievalQueryProfile;
@@ -1,5 +1,14 @@
1
1
  import { extractCjkBigrams, extractLexicalTerms, extractRetrievalIdentifiers, normalizeRetrievalText } from "./textFeatures.js";
2
2
  //#region src/retrieval/queryProfile.ts
3
+ const SELF_REVIEW_PATTERNS = [
4
+ /(?:你|xopc).{0,10}(?:了解|知道|认识|记得).{0,8}(?:我|用户)/i,
5
+ /介绍.{0,8}(?:你.{0,6})?(?:了解|知道|认识|记得).{0,4}的?我/i,
6
+ /\bwhat\s+(?:do\s+)?you\s+(?:know|remember)\s+about\s+me\b/i,
7
+ /\b(?:describe|introduce)\s+me\s+(?:from|based on)\s+(?:what|everything)\s+you\s+(?:know|remember)\b/i
8
+ ];
9
+ function isSelfReviewQuery(query) {
10
+ return SELF_REVIEW_PATTERNS.some((pattern) => pattern.test(query.normalize("NFKC")));
11
+ }
3
12
  const INTENT_RULES = [
4
13
  {
5
14
  kinds: ["boundary"],
@@ -67,8 +76,9 @@ function buildRetrievalQueryProfile(query, scope = {}) {
67
76
  identifiers: extractRetrievalIdentifiers(normalized),
68
77
  intentKinds: [...new Set(intentKinds)],
69
78
  timeHints: uniqueTimeHints,
79
+ selfReview: isSelfReviewQuery(normalized),
70
80
  scope: { ...scope }
71
81
  };
72
82
  }
73
83
  //#endregion
74
- export { buildRetrievalQueryProfile };
84
+ export { buildRetrievalQueryProfile, isSelfReviewQuery };
@@ -26,8 +26,8 @@ export { deleteSessionRecord, ensureSessionRecord, getCurrentSessionId, getGloba
26
26
  export { appendCompactionBoundaryIfUnchanged, appendTranscriptEntry, listCompactionBoundaries, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, loadCompactionSourceSnapshot, paginateTranscriptMessages, replaceTranscriptRows, restoreBeforeCompactionBoundary, searchSessionTranscript, type CompactionSourceSnapshot, type SessionTranscriptRecallMatch, type TranscriptSourceEntry, } from './transcript-repository.js';
27
27
  export { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord, } from './notes-repository.js';
28
28
  export { deleteNoteAgentContextRecord, getNoteAgentContextRecord, upsertNoteAgentContextRecord, type NoteAgentContextRecord, } from './note-agent-context-repository.js';
29
- export { appendMemorySignal, appendMemoryTraceEvent, deleteMemoryRecord, getMemoryProviderState, getMemoryTurnFeedback, getMemoryRecord, hasUnresolvedMemoryConflict, listMemorySignals, listMemoryTraceEvents, listMemoryRecords, markMemoryRecordsConflicted, searchMemoryRecords, setMemoryRecordStatus, setMemoryProviderState, setMemoryTurnFeedback, summarizeMemoryRecallFeedback, upsertMemoryRecord, type AppendMemorySignalInput, type AppendMemoryTraceEventInput, type ListMemoryRecordsOptions, type MemoryRecallFeedbackSummary, type MemorySignalRowPayload, type MemoryFeedback, type MemoryFeedbackRating, type MemoryTraceEventPayload, type SearchMemoryRecordsOptions, type SetMemoryTurnFeedbackInput, type UpsertMemoryRecordInput, } from './memory-records-repository.js';
30
- export { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, deleteMemoryEvidenceForRecord, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceItems, listKnowledgeSourceChanges, listKnowledgeSyncRuns, listMemoryEvidence, pruneBoundedKnowledgeSourceItems, setKnowledgeSourceItemSynthesisStatus, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, startKnowledgeSyncRun, upsertKnowledgeSourceItems, } from './knowledge-repository.js';
29
+ export { appendMemorySignal, appendMemoryTraceEvent, countMemoryRecordsBySourceInstanceId, deleteMemoryRecordsBySourceInstanceId, deleteMemoryRecord, getMemoryProviderState, getMemoryTurnFeedback, getMemoryRecord, hasUnresolvedMemoryConflict, listMemorySignals, listMemoryTraceEvents, listMemoryRecords, markMemoryRecordsConflicted, searchMemoryRecords, setMemoryRecordStatus, setMemoryProviderState, setMemoryTurnFeedback, summarizeMemoryRecallFeedback, upsertMemoryRecord, type AppendMemorySignalInput, type AppendMemoryTraceEventInput, type ListMemoryRecordsOptions, type MemoryRecallFeedbackSummary, type MemorySignalRowPayload, type MemoryFeedback, type MemoryFeedbackRating, type MemoryTraceEventPayload, type SearchMemoryRecordsOptions, type SetMemoryTurnFeedbackInput, type UpsertMemoryRecordInput, } from './memory-records-repository.js';
30
+ export { attachMemoryEvidence, claimKnowledgeSourceItems, countKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, deleteMemoryEvidenceForRecord, deleteKnowledgeSourceItems, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceItems, listKnowledgeSourceChanges, listKnowledgeSyncRuns, listMemoryEvidence, pruneBoundedKnowledgeSourceItems, setKnowledgeSourceItemSynthesisStatus, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, startKnowledgeSyncRun, upsertKnowledgeSourceItems, } from './knowledge-repository.js';
31
31
  export { deleteSessionConfig, getSessionConfig, hasSessionConfig, setSessionConfig, updateSessionConfig, } from './config-repository.js';
32
32
  export { createObjectLinkRecord, deleteObjectLinkRecord, getActivityEventRecord, listActivityRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, recordActivityEvent, } from './activity-repository.js';
33
33
  export { appendConnectorExecutionAudit, claimConnectorWebhookDelivery, completeConnectorWebhookDelivery, consumeConnectorApproval, createConnectorApproval, decideConnectorApproval, deleteConnectorConnection, deleteConnectorInstallation, getConnectorConnection, getConnectorApproval, getConnectorInstallation, getCachedConnectorCatalogEntry, listCachedConnectorCatalogEntries, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, type CachedConnectorCatalogEntry, } from './connector-repository.js';
@@ -27,12 +27,12 @@ import { buildRelationshipPrompt, getRelationshipSettings, isProactiveSupportAll
27
27
  import { appendCompactionBoundaryIfUnchanged, appendTranscriptEntry, listCompactionBoundaries, loadCompactionSourceSnapshot, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, paginateTranscriptMessages, replaceTranscriptRows, restoreBeforeCompactionBoundary, searchSessionTranscript } from "./transcript-repository.js";
28
28
  import { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord } from "./notes-repository.js";
29
29
  import { deleteNoteAgentContextRecord, getNoteAgentContextRecord, upsertNoteAgentContextRecord } from "./note-agent-context-repository.js";
30
- import { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, deleteMemoryEvidenceForRecord, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, pruneBoundedKnowledgeSourceItems, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, startKnowledgeSyncRun, upsertKnowledgeSourceItems } from "./knowledge-repository.js";
31
- import { appendMemorySignal, appendMemoryTraceEvent, deleteMemoryRecord, getMemoryProviderState, getMemoryRecord, getMemoryTurnFeedback, hasUnresolvedMemoryConflict, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, markMemoryRecordsConflicted, searchMemoryRecords, setMemoryProviderState, setMemoryRecordStatus, setMemoryTurnFeedback, summarizeMemoryRecallFeedback, upsertMemoryRecord } from "./memory-records-repository.js";
30
+ import { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, countKnowledgeSourceItems, deleteKnowledgeSourceItems, deleteMemoryEvidenceForRecord, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, pruneBoundedKnowledgeSourceItems, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, startKnowledgeSyncRun, upsertKnowledgeSourceItems } from "./knowledge-repository.js";
31
+ import { appendMemorySignal, appendMemoryTraceEvent, countMemoryRecordsBySourceInstanceId, deleteMemoryRecord, deleteMemoryRecordsBySourceInstanceId, getMemoryProviderState, getMemoryRecord, getMemoryTurnFeedback, hasUnresolvedMemoryConflict, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, markMemoryRecordsConflicted, searchMemoryRecords, setMemoryProviderState, setMemoryRecordStatus, setMemoryTurnFeedback, summarizeMemoryRecallFeedback, upsertMemoryRecord } from "./memory-records-repository.js";
32
32
  import { deleteSessionConfig, getSessionConfig, hasSessionConfig, setSessionConfig, updateSessionConfig } from "./config-repository.js";
33
33
  import { createObjectLinkRecord, deleteObjectLinkRecord, getActivityEventRecord, listActivityRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, recordActivityEvent } from "./activity-repository.js";
34
34
  import { appendConnectorExecutionAudit, claimConnectorWebhookDelivery, completeConnectorWebhookDelivery, consumeConnectorApproval, createConnectorApproval, decideConnectorApproval, deleteConnectorConnection, deleteConnectorInstallation, getCachedConnectorCatalogEntry, getConnectorApproval, getConnectorConnection, getConnectorInstallation, listCachedConnectorCatalogEntries, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation } from "./connector-repository.js";
35
35
  import { getConnectorAccount, listConnectorAccounts, reconcileConnectorAccount, refreshConnectorAccountCurrent } from "./connector-account-repository.js";
36
36
  import { getConnectorSyncPolicy, getConnectorSyncPolicyForConnection, listConnectorSyncPolicies, upsertConnectorSyncPolicy } from "./connector-sync-policy-repository.js";
37
37
  import { getUserTrustPolicy, setUserTrustPolicy } from "./user-trust-repository.js";
38
- export { COMPOSER_INPUT_HISTORY_LIMIT, DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, SCHEMA_META_SCHEMA_VERSION_KEY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, acknowledgeHomeAttention, appendCompactionBoundaryIfUnchanged, appendComposerInputHistory, appendConnectorExecutionAudit, appendMemorySignal, appendMemoryTraceEvent, appendTranscriptEntry, applyPendingMigrations, attachMemoryEvidence, bindEndpointPrincipal, buildDefaultSessionMetadata, buildGlobalSessionStats, buildRelationshipPrompt, cancelQueuedSessionInput, claimConnectorWebhookDelivery, claimContextExtractionRun, claimKnowledgeSourceItems, claimNextConnectorLearningJob, claimNextSessionInput, classifyStoredRow, clearComposerInputHistory, closeTemporalAssertions, closeUnderstandingValidity, closeXopcDatabase, completeConnectorWebhookDelivery, completeKnowledgeSourceItemSynthesis, consumeConnectorApproval, consumeContextConsent, createCollaborationRule, createConnectorApproval, createContextEvidence, createEndpointPrincipal, createObjectLinkRecord, createTemporalAssertion, createUnderstanding, decideConnectorApproval, decideContextConsent, deleteCollaborationRule, deleteConnectorConnection, deleteConnectorInstallation, deleteMemoryEvidenceForRecord, deleteMemoryRecord, deleteNoteAgentContextRecord, deleteNoteRecord, deleteObjectLinkRecord, deleteSessionConfig, deleteSessionRecord, deleteUnderstanding, discoverSqlMigrations, enqueueConnectorLearningJob, ensureContextConsent, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findSessionInput, findSessionKeyBySessionId, finishContextConsolidationRun, finishContextExtractionRun, finishEndpointToolInvocationAudit, finishKnowledgeSyncRun, finishSessionInputRun, getActivityEventRecord, getCachedConnectorCatalogEntry, getCollaborationRule, getConnectorAccount, getConnectorApproval, getConnectorConnection, getConnectorInstallation, getConnectorSyncPolicy, getConnectorSyncPolicyForConnection, getContextConsolidationRun, getContextExtractionRun, getCurrentSessionId, getEndpointPrincipal, getGlobalSessionStats, getInteractionState, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, getMemoryProviderState, getMemoryRecord, getMemoryTurnFeedback, getNoteAgentContextRecord, getNoteRecord, getRelationshipSettings, getSessionConfig, getSessionInputById, getSessionInputState, getSessionMetadata, getSessionPersistedLevels, getSessionTaskPlan, getSqliteDatabase, getTurnPersonalization, getUnderstanding, getUserProfile, getUserTrustPolicy, getXopcDatabase, hasContextConsent, hasIndependentExtractionOutput, hasSessionConfig, hasUnresolvedMemoryConflict, incrementSessionStatsOnAppend, insertSessionInput, inspectSchemaMigrationStatus, isHomeAttentionAcknowledged, isProactiveSupportAllowed, isUnderstandingSuppressed, isXopcDatabaseOpen, linkContextObjects, linkUnderstandingEvidence, listActivityRecords, listCachedConnectorCatalogEntries, listCollaborationRules, listCompactionBoundaries, listComposerInputHistory, listConnectorAccounts, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, listConnectorLearningJobs, listConnectorSyncPolicies, listContextConsolidationDecisions, listContextConsolidationRuns, listContextExtractionOutputs, listContextExtractionRuns, listContextObjectRelations, listEndpointPrincipals, listEndpointToolInvocationAudits, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, listTemporalAssertions, listUnderstandingEvidence, listUnderstandings, loadCompactionSourceSnapshot, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, markMemoryRecordsConflicted, metadataToSessionInsert, mutateQueuedSessionInput, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, pruneBoundedKnowledgeSourceItems, readSchemaVersion, readSchemaVersionForTest, reconcileConnectorAccount, recordActivityEvent, recordContextConsolidationDecision, recordContextFeedback, recordContextRun, recoverSessionInputState, recoverStaleConnectorLearningJobs, refreshConnectorAccountCurrent, rejectUnderstanding, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, replaceLatestSessionTurnAndQueueInput, replaceTranscriptRows, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreBeforeCompactionBoundary, reviseCollaborationRule, reviseUnderstanding, revokeEndpointPrincipal, runSqliteWriteTransaction, searchActiveUnderstandings, searchMemoryRecords, searchSessionTranscript, sessionConfigRowToConfig, sessionRowToMetadata, setCollaborationRuleStatus, setConnectorLearningPaused, setInteractionState, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, setMemoryProviderState, setMemoryRecordStatus, setMemoryTurnFeedback, setSessionConfig, setSessionInputStatus, setSessionTaskPlan, setUnderstandingStatus, setUserTrustPolicy, startContextConsolidationRun, startEndpointToolInvocationAudit, startKnowledgeSyncRun, summarizeMemoryRecallFeedback, summarizeUnderstandingFeedback, summarizeUserUnderstandingQuality, touchEndpointPrincipal, transcriptEntryRowToStoredRow, updateConnectorLearningJob, updateInteractionStateFromMessage, updateRelationshipSettings, updateSessionConfig, updateSessionStats, updateUserProfile, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, upsertConnectorSyncPolicy, upsertKnowledgeSourceItems, upsertMemoryRecord, upsertNoteAgentContextRecord, upsertNoteRecord, validateLatestSessionTurnTarget };
38
+ export { COMPOSER_INPUT_HISTORY_LIMIT, DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, SCHEMA_META_SCHEMA_VERSION_KEY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, acknowledgeHomeAttention, appendCompactionBoundaryIfUnchanged, appendComposerInputHistory, appendConnectorExecutionAudit, appendMemorySignal, appendMemoryTraceEvent, appendTranscriptEntry, applyPendingMigrations, attachMemoryEvidence, bindEndpointPrincipal, buildDefaultSessionMetadata, buildGlobalSessionStats, buildRelationshipPrompt, cancelQueuedSessionInput, claimConnectorWebhookDelivery, claimContextExtractionRun, claimKnowledgeSourceItems, claimNextConnectorLearningJob, claimNextSessionInput, classifyStoredRow, clearComposerInputHistory, closeTemporalAssertions, closeUnderstandingValidity, closeXopcDatabase, completeConnectorWebhookDelivery, completeKnowledgeSourceItemSynthesis, consumeConnectorApproval, consumeContextConsent, countKnowledgeSourceItems, countMemoryRecordsBySourceInstanceId, createCollaborationRule, createConnectorApproval, createContextEvidence, createEndpointPrincipal, createObjectLinkRecord, createTemporalAssertion, createUnderstanding, decideConnectorApproval, decideContextConsent, deleteCollaborationRule, deleteConnectorConnection, deleteConnectorInstallation, deleteKnowledgeSourceItems, deleteMemoryEvidenceForRecord, deleteMemoryRecord, deleteMemoryRecordsBySourceInstanceId, deleteNoteAgentContextRecord, deleteNoteRecord, deleteObjectLinkRecord, deleteSessionConfig, deleteSessionRecord, deleteUnderstanding, discoverSqlMigrations, enqueueConnectorLearningJob, ensureContextConsent, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findSessionInput, findSessionKeyBySessionId, finishContextConsolidationRun, finishContextExtractionRun, finishEndpointToolInvocationAudit, finishKnowledgeSyncRun, finishSessionInputRun, getActivityEventRecord, getCachedConnectorCatalogEntry, getCollaborationRule, getConnectorAccount, getConnectorApproval, getConnectorConnection, getConnectorInstallation, getConnectorSyncPolicy, getConnectorSyncPolicyForConnection, getContextConsolidationRun, getContextExtractionRun, getCurrentSessionId, getEndpointPrincipal, getGlobalSessionStats, getInteractionState, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, getMemoryProviderState, getMemoryRecord, getMemoryTurnFeedback, getNoteAgentContextRecord, getNoteRecord, getRelationshipSettings, getSessionConfig, getSessionInputById, getSessionInputState, getSessionMetadata, getSessionPersistedLevels, getSessionTaskPlan, getSqliteDatabase, getTurnPersonalization, getUnderstanding, getUserProfile, getUserTrustPolicy, getXopcDatabase, hasContextConsent, hasIndependentExtractionOutput, hasSessionConfig, hasUnresolvedMemoryConflict, incrementSessionStatsOnAppend, insertSessionInput, inspectSchemaMigrationStatus, isHomeAttentionAcknowledged, isProactiveSupportAllowed, isUnderstandingSuppressed, isXopcDatabaseOpen, linkContextObjects, linkUnderstandingEvidence, listActivityRecords, listCachedConnectorCatalogEntries, listCollaborationRules, listCompactionBoundaries, listComposerInputHistory, listConnectorAccounts, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, listConnectorLearningJobs, listConnectorSyncPolicies, listContextConsolidationDecisions, listContextConsolidationRuns, listContextExtractionOutputs, listContextExtractionRuns, listContextObjectRelations, listEndpointPrincipals, listEndpointToolInvocationAudits, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, listTemporalAssertions, listUnderstandingEvidence, listUnderstandings, loadCompactionSourceSnapshot, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, markMemoryRecordsConflicted, metadataToSessionInsert, mutateQueuedSessionInput, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, pruneBoundedKnowledgeSourceItems, readSchemaVersion, readSchemaVersionForTest, reconcileConnectorAccount, recordActivityEvent, recordContextConsolidationDecision, recordContextFeedback, recordContextRun, recoverSessionInputState, recoverStaleConnectorLearningJobs, refreshConnectorAccountCurrent, rejectUnderstanding, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, replaceLatestSessionTurnAndQueueInput, replaceTranscriptRows, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreBeforeCompactionBoundary, reviseCollaborationRule, reviseUnderstanding, revokeEndpointPrincipal, runSqliteWriteTransaction, searchActiveUnderstandings, searchMemoryRecords, searchSessionTranscript, sessionConfigRowToConfig, sessionRowToMetadata, setCollaborationRuleStatus, setConnectorLearningPaused, setInteractionState, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, setMemoryProviderState, setMemoryRecordStatus, setMemoryTurnFeedback, setSessionConfig, setSessionInputStatus, setSessionTaskPlan, setUnderstandingStatus, setUserTrustPolicy, startContextConsolidationRun, startEndpointToolInvocationAudit, startKnowledgeSyncRun, summarizeMemoryRecallFeedback, summarizeUnderstandingFeedback, summarizeUserUnderstandingQuality, touchEndpointPrincipal, transcriptEntryRowToStoredRow, updateConnectorLearningJob, updateInteractionStateFromMessage, updateRelationshipSettings, updateSessionConfig, updateSessionStats, updateUserProfile, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, upsertConnectorSyncPolicy, upsertKnowledgeSourceItems, upsertMemoryRecord, upsertNoteAgentContextRecord, upsertNoteRecord, validateLatestSessionTurnTarget };
@@ -1,5 +1,5 @@
1
1
  import type { DatabaseSync } from 'node:sqlite';
2
- import type { KnowledgeSourceChange, KnowledgeSourceItem, KnowledgeSourceItemInput, KnowledgeSyncRun, KnowledgeSyncRunStatus, KnowledgeSynthesisPipeline, KnowledgeSynthesisStatus } from '../../knowledge/types.js';
2
+ import type { KnowledgeSourceChange, KnowledgeSourceItem, KnowledgeSourceItemInput, KnowledgeSyncRun, KnowledgeSyncRunStatus, KnowledgeSynthesisPipeline, KnowledgeSynthesisStatus, KnowledgeRetentionClass } from '../../knowledge/types.js';
3
3
  import type { MemoryEvidence, MemoryEvidenceRelation } from '../../agent/memory/types.js';
4
4
  export declare function startKnowledgeSyncRun(input: {
5
5
  sourceInstanceId: string;
@@ -44,6 +44,8 @@ export declare function listKnowledgeSourceItems(options?: {
44
44
  collectionScope?: string;
45
45
  itemType?: string;
46
46
  synthesisStatus?: KnowledgeSynthesisStatus;
47
+ retentionClass?: KnowledgeRetentionClass;
48
+ retentionBeforeMs?: number;
47
49
  occurredAfterMs?: number;
48
50
  occurredBeforeMs?: number;
49
51
  orderBy?: 'recency_desc' | 'occurred_asc';
@@ -51,6 +53,8 @@ export declare function listKnowledgeSourceItems(options?: {
51
53
  limit?: number;
52
54
  offset?: number;
53
55
  }): KnowledgeSourceItem[];
56
+ export declare function countKnowledgeSourceItems(sourceInstanceId: string): number;
57
+ export declare function deleteKnowledgeSourceItems(sourceInstanceId: string): number;
54
58
  export declare function pruneBoundedKnowledgeSourceItems(sourceInstanceId: string, olderThanMs: number): number;
55
59
  export declare function setKnowledgeSourceItemSynthesisStatus(itemIds: string[], status: KnowledgeSynthesisStatus, nowMs?: number): number;
56
60
  export declare function claimKnowledgeSourceItems(options: {
@@ -256,6 +256,14 @@ function listKnowledgeSourceItems(options = {}) {
256
256
  where.push("synthesis_status = ?");
257
257
  params.push(options.synthesisStatus);
258
258
  }
259
+ if (options.retentionClass) {
260
+ where.push("retention_class = ?");
261
+ params.push(options.retentionClass);
262
+ }
263
+ if (options.retentionBeforeMs !== void 0) {
264
+ where.push("COALESCE(source_updated_at, occurred_at, updated_at) < ?");
265
+ params.push(options.retentionBeforeMs);
266
+ }
259
267
  if (options.occurredAfterMs !== void 0) {
260
268
  where.push("occurred_at > ?");
261
269
  params.push(options.occurredAfterMs);
@@ -272,6 +280,13 @@ function listKnowledgeSourceItems(options = {}) {
272
280
  ORDER BY ${options.orderBy === "occurred_asc" ? "occurred_at ASC, item_id ASC" : "COALESCE(source_updated_at, occurred_at, updated_at) DESC"}
273
281
  LIMIT ? OFFSET ?`).all(...params, limit, offset).map(sourceItemFromRow);
274
282
  }
283
+ function countKnowledgeSourceItems(sourceInstanceId) {
284
+ const row = getSqliteDatabase().prepare("SELECT COUNT(*) AS count FROM knowledge_source_items WHERE source_instance_id = ?").get(sourceInstanceId);
285
+ return Number(row.count);
286
+ }
287
+ function deleteKnowledgeSourceItems(sourceInstanceId) {
288
+ return runSqliteWriteTransaction((db) => Number(db.prepare("DELETE FROM knowledge_source_items WHERE source_instance_id = ?").run(sourceInstanceId).changes));
289
+ }
275
290
  function pruneBoundedKnowledgeSourceItems(sourceInstanceId, olderThanMs) {
276
291
  return runSqliteWriteTransaction((db) => Number(db.prepare(`DELETE FROM knowledge_source_items
277
292
  WHERE source_instance_id = ? AND retention_class = 'bounded'
@@ -421,4 +436,4 @@ function listMemoryEvidenceForRecords(recordIds) {
421
436
  return output;
422
437
  }
423
438
  //#endregion
424
- export { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, deleteMemoryEvidenceForRecord, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, listMemoryEvidenceForRecords, pruneBoundedKnowledgeSourceItems, replaceMemoryEvidenceForRecord, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, startKnowledgeSyncRun, upsertKnowledgeSourceItems };
439
+ export { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, countKnowledgeSourceItems, deleteKnowledgeSourceItems, deleteMemoryEvidenceForRecord, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, listMemoryEvidenceForRecords, pruneBoundedKnowledgeSourceItems, replaceMemoryEvidenceForRecord, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, startKnowledgeSyncRun, upsertKnowledgeSourceItems };
@@ -173,6 +173,8 @@ export declare function hasUnresolvedMemoryConflict(conflictGroupId: string): bo
173
173
  export declare function listMemoryRecords(options?: ListMemoryRecordsOptions): MemoryRecord[];
174
174
  export declare function searchMemoryRecords(options: SearchMemoryRecordsOptions): MemorySearchResult[];
175
175
  export declare function deleteMemoryRecord(recordId: string): boolean;
176
+ export declare function countMemoryRecordsBySourceInstanceId(sourceInstanceId: string): number;
177
+ export declare function deleteMemoryRecordsBySourceInstanceId(sourceInstanceId: string): number;
176
178
  /** Change lifecycle status without reconstructing or weakening the record's provenance. */
177
179
  export declare function setMemoryRecordStatus(recordId: string, status: MemoryStatus, nowMs?: number): boolean;
178
180
  export declare function markMemoryRecordsConflicted(recordIds: string[], conflictGroupId: string): number;