@xopcai/xopc 0.0.219 → 0.0.220

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 (140) 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-DeKZ36Jy.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DZ6ETNIk.js → agent-avatar-dicebear-D0hZfdkn.js} +1 -1
  5. package/dist/gateway/static/root/assets/{agents-DxaIH0Ep.js → agents-Bu0NfWuh.js} +1 -1
  6. package/dist/gateway/static/root/assets/{api-Tz57QxiN.js → api-yLnYUedB.js} +1 -1
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-DdR1L4LR.js → app-management-settings-panel-C2kZNEHz.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-wYbwqmee.js → appearance-settings-DQ7H35sN.js} +1 -1
  9. package/dist/gateway/static/root/assets/{apps-page-CyWr6KyO.js → apps-page-Tty2xaUG.js} +1 -1
  10. package/dist/gateway/static/root/assets/{archive-plugin-DKXa160O.js → archive-plugin-CBArbTPH.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-CzwA9g2y.js → attachment-load-oc6DRj4G.js} +1 -1
  12. package/dist/gateway/static/root/assets/{automations-page-DwAXyWAY.js → automations-page-CHPEUpz8.js} +1 -1
  13. package/dist/gateway/static/root/assets/{automations-workspace-CL7ieYIt.js → automations-workspace-9uYkHmdI.js} +1 -1
  14. package/dist/gateway/static/root/assets/{binary-plugins-DoQ_DnT7.js → binary-plugins-BRBd0X7_.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-Bj_Uxxng.js → block-editor-ZgM-Z4Qv.js} +1 -1
  16. package/dist/gateway/static/root/assets/{browser-settings-page-BYa_FNC1.js → browser-settings-page-BT3mEm00.js} +1 -1
  17. package/dist/gateway/static/root/assets/{browser-workflow-inputs-D4roXE6r.js → browser-workflow-inputs-DxD74a4c.js} +1 -1
  18. package/dist/gateway/static/root/assets/{browser-workflows-page-CleKTAKD.js → browser-workflows-page-Dpc7NqZf.js} +1 -1
  19. package/dist/gateway/static/root/assets/{capabilities-settings-panel-DYG37N0k.js → capabilities-settings-panel-DHlfRj4M.js} +1 -1
  20. package/dist/gateway/static/root/assets/{capability-presets-api-wtEN6Ss6.js → capability-presets-api-B9ID97j6.js} +1 -1
  21. package/dist/gateway/static/root/assets/{capability-presets-settings-panel-C0Q4dFq-.js → capability-presets-settings-panel-D2FkREUX.js} +1 -1
  22. package/dist/gateway/static/root/assets/{channel-recipient-api-DhuS2RJ3.js → channel-recipient-api-DCNn6MWL.js} +1 -1
  23. package/dist/gateway/static/root/assets/{channels-settings-CpO6Xg0n.js → channels-settings-D4YcKMtf.js} +1 -1
  24. package/dist/gateway/static/root/assets/channels-status-swr-B8XWrzKM.js +1 -0
  25. package/dist/gateway/static/root/assets/{chat-terminal-dock-ClQMDe2n.js → chat-terminal-dock-MvNpjcUs.js} +1 -1
  26. package/dist/gateway/static/root/assets/{connectors-page-BvyiPdKU.js → connectors-page-Bd6K9bDk.js} +1 -1
  27. package/dist/gateway/static/root/assets/{cron-expression-4DvCFs-v.js → cron-expression-BSXX9uY0.js} +1 -1
  28. package/dist/gateway/static/root/assets/{date-picker-B6FSjt4Z.js → date-picker-CiHNkkIS.js} +1 -1
  29. package/dist/gateway/static/root/assets/{dependency-picker-Za18eMp1.js → dependency-picker-DQyh2ZXE.js} +1 -1
  30. package/dist/gateway/static/root/assets/{desktop-pet-DUUf3yyJ.js → desktop-pet-DnAHU-zA.js} +1 -1
  31. package/dist/gateway/static/root/assets/{desktop-pet-settings-Dwx3GfB8.js → desktop-pet-settings-DUdhIBBB.js} +1 -1
  32. package/dist/gateway/static/root/assets/{directory-picker-path-field-C6dfTCsl.js → directory-picker-path-field-B3gFQt8x.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-debug-page-Cordpg4X.js → extension-debug-page-Lq-gRApw.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-page-Dw0dGyMl.js → extension-page-D0ROxJmY.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-settings-page-B2pUMaXm.js → extension-settings-page-B2tS6mFy.js} +1 -1
  36. package/dist/gateway/static/root/assets/{gateway-config-api-DAZUOEQh.js → gateway-config-api-DJqWfVi6.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-config-swr-BIqRg-zo.js → gateway-config-swr-CnwF9Vso.js} +1 -1
  38. package/dist/gateway/static/root/assets/{gateway-settings-ik2f-pmV.js → gateway-settings-B3thenPX.js} +1 -1
  39. package/dist/gateway/static/root/assets/{gateway-startup-retry-BFjWYOCS.js → gateway-startup-retry-DdJJZR8M.js} +1 -1
  40. package/dist/gateway/static/root/assets/{heartbeat-settings-BE81XJ8F.js → heartbeat-settings-C_g-ZGSE.js} +1 -1
  41. package/dist/gateway/static/root/assets/{home-page-BTWXJu_m.js → home-page-Cgwx66kc.js} +1 -1
  42. package/dist/gateway/static/root/assets/{image-generation-api-HXAWlgm6.js → image-generation-api-Dtt9M5qz.js} +1 -1
  43. package/dist/gateway/static/root/assets/index-Cf0qTkBK.css +2 -0
  44. package/dist/gateway/static/root/assets/{index-B6gWYy08.js → index-V9g9-SWT.js} +9 -9
  45. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-ROqQ_Xlo.js → keyboard-shortcuts-settings-cJqkmQdP.js} +1 -1
  46. package/dist/gateway/static/root/assets/{local-app-workbench-page-Dcaf190G.js → local-app-workbench-page-CmjLMdly.js} +1 -1
  47. package/dist/gateway/static/root/assets/{local-apps-page-Be79cyMG.js → local-apps-page-BiuP2pkl.js} +1 -1
  48. package/dist/gateway/static/root/assets/{locale-store-DfK-Hofd.js → locale-store-D3Q2yEAb.js} +1 -1
  49. package/dist/gateway/static/root/assets/{logs-page-C2pjbXno.js → logs-page-BTlxGPho.js} +1 -1
  50. package/dist/gateway/static/root/assets/{management-settings-CRspx0oY.js → management-settings-Z1gJUwP_.js} +1 -1
  51. package/dist/gateway/static/root/assets/{markdown-split-G3PTpGw3.js → markdown-split-DuOmpGgE.js} +1 -1
  52. package/dist/gateway/static/root/assets/{markdown-view-D4FPJZ91.js → markdown-view-WYArkdrc.js} +1 -1
  53. package/dist/gateway/static/root/assets/{media-plugins-DT0P7j7u.js → media-plugins-DKPh3Mud.js} +1 -1
  54. package/dist/gateway/static/root/assets/messages-BQHpB4VI.js +3 -0
  55. package/dist/gateway/static/root/assets/{notes-api-q7HjYO07.js → notes-api-DMEon7Zv.js} +1 -1
  56. package/dist/gateway/static/root/assets/{notes-page-Cgl2h7AR.js → notes-page-BG4gV8WG.js} +1 -1
  57. package/dist/gateway/static/root/assets/{notes-workbench-DFMQYyGJ.js → notes-workbench-D3LMBO2X.js} +2 -2
  58. package/dist/gateway/static/root/assets/{product-open-page-ComKLO4D.js → product-open-page-BjJf4QOB.js} +1 -1
  59. package/dist/gateway/static/root/assets/{project-detail-page-DUFmQscH.js → project-detail-page-C59tYJG-.js} +1 -1
  60. package/dist/gateway/static/root/assets/{projects-page-CTWxt3dv.js → projects-page-Di7W-Fg8.js} +1 -1
  61. package/dist/gateway/static/root/assets/{registry-api-BBoJ7khF.js → registry-api-DRyvynb5.js} +1 -1
  62. package/dist/gateway/static/root/assets/{remote-access-hub-qmG-3qjj.js → remote-access-hub-BYOKveWT.js} +1 -1
  63. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-CXHQc53b.js → runtime-tools-settings-panel-DC6t_-db.js} +1 -1
  64. package/dist/gateway/static/root/assets/{schema-form-3jTDF2lJ.js → schema-form-DSTWtpjp.js} +1 -1
  65. package/dist/gateway/static/root/assets/{sessions-page-D_We4_MV.js → sessions-page-CJMNQsxK.js} +1 -1
  66. package/dist/gateway/static/root/assets/settings-advanced-gate-FJxZw08y.js +1 -0
  67. package/dist/gateway/static/root/assets/{settings-form-section-CUDozALU.js → settings-form-section-ZzEMNLYS.js} +1 -1
  68. package/dist/gateway/static/root/assets/{settings-loading-skeleton-H3ZH6a6l.js → settings-loading-skeleton-D7-bkbcW.js} +1 -1
  69. package/dist/gateway/static/root/assets/{settings-page-tx29z21o.js → settings-page-PaTpLbmi.js} +1 -1
  70. package/dist/gateway/static/root/assets/{setup-status-panel-VunfXpTX.js → setup-status-panel-Bnpim6NY.js} +1 -1
  71. package/dist/gateway/static/root/assets/{share-preview-page-MyThymEx.js → share-preview-page-Cxcw0ksa.js} +1 -1
  72. package/dist/gateway/static/root/assets/{shares-settings-DkZvY1cr.js → shares-settings-DBqmV7ZY.js} +1 -1
  73. package/dist/gateway/static/root/assets/skill-reload-api-UgLQaWoz.js +1 -0
  74. package/dist/gateway/static/root/assets/{skills-page-BOOyMnno.js → skills-page-Dby4iAYe.js} +1 -1
  75. package/dist/gateway/static/root/assets/{skills-page.utils-Bl5Yv3Cx.js → skills-page.utils-nlzJ5Y1V.js} +1 -1
  76. package/dist/gateway/static/root/assets/{system-settings-panel-DwQ3O1ta.js → system-settings-panel-vOsgnzDl.js} +1 -1
  77. package/dist/gateway/static/root/assets/{task-detail-page-BwOyrADL.js → task-detail-page-CRy8Wl5g.js} +1 -1
  78. package/dist/gateway/static/root/assets/{theme-store-Br4BtK4x.js → theme-store-CvnEHGyP.js} +1 -1
  79. package/dist/gateway/static/root/assets/{use-autosave-DRS3RwS9.js → use-autosave-BTNZHulv.js} +1 -1
  80. package/dist/gateway/static/root/assets/{user-context-page-ClV2r3Cr.js → user-context-page-BT8F4mh5.js} +1 -1
  81. package/dist/gateway/static/root/assets/{voice-api-key-field-CGTE5156.js → voice-api-key-field-DDJ2-3Tx.js} +1 -1
  82. package/dist/gateway/static/root/assets/{work-discovery-overlay-CW-HKD7h.js → work-discovery-overlay-DV_qiKSD.js} +1 -1
  83. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-Dtr9fDC8.js → workflow-run-setup-panel--AcvRw1w.js} +1 -1
  84. package/dist/gateway/static/root/assets/{workflows-page-CDOyNgZf.js → workflows-page-CwvskVvU.js} +1 -1
  85. package/dist/gateway/static/root/index.html +12 -12
  86. package/dist/package.js +1 -1
  87. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  88. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  89. package/dist/src/cli/commands/extension.js +1 -1
  90. package/dist/src/connectors/connected-source-understanding.js +6 -5
  91. package/dist/src/connectors/learning-coordinator.js +11 -2
  92. package/dist/src/extensions/update.js +1 -1
  93. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  94. package/dist/src/gateway/hono/routes/understanding-sources.d.ts +9 -0
  95. package/dist/src/gateway/hono/routes/understanding-sources.js +47 -14
  96. package/dist/src/gateway/hono/routes/work-discovery.js +13 -3
  97. package/dist/src/gateway/service/agent-runner.d.ts +4 -0
  98. package/dist/src/gateway/service/agent-runner.js +6 -0
  99. package/dist/src/gateway/service/config-coordinator.js +1 -1
  100. package/dist/src/gateway/service/run-gateway-agent.js +13 -8
  101. package/dist/src/gateway/service/sessions-api.d.ts +9 -0
  102. package/dist/src/gateway/service/sessions-api.js +3 -0
  103. package/dist/src/gateway/service.js +2 -1
  104. package/dist/src/infra/update-runner.js +1 -1
  105. package/dist/src/knowledge/connected-knowledge-pipeline.d.ts +6 -0
  106. package/dist/src/knowledge/connected-knowledge-pipeline.js +35 -4
  107. package/dist/src/retrieval/queryProfile.d.ts +2 -0
  108. package/dist/src/retrieval/queryProfile.js +11 -1
  109. package/dist/src/storage/sqlite/index.d.ts +2 -2
  110. package/dist/src/storage/sqlite/index.js +3 -3
  111. package/dist/src/storage/sqlite/knowledge-repository.d.ts +5 -1
  112. package/dist/src/storage/sqlite/knowledge-repository.js +16 -1
  113. package/dist/src/storage/sqlite/memory-records-repository.d.ts +2 -0
  114. package/dist/src/storage/sqlite/memory-records-repository.js +21 -1
  115. package/dist/src/storage/sqlite/migrations/133_archive_legacy_work_discovery_profile_facts.sql +11 -0
  116. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  117. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  118. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  119. package/dist/src/storage/sqlite/schema.js +1 -1
  120. package/dist/src/storage/sqlite/session-repository.js +2 -2
  121. package/dist/src/tasks/home-query-service.d.ts +14 -0
  122. package/dist/src/tasks/home-query-service.js +19 -2
  123. package/dist/src/user-context/consolidation.d.ts +1 -0
  124. package/dist/src/user-context/consolidation.js +62 -2
  125. package/dist/src/user-context/focus-lifecycle.d.ts +2 -0
  126. package/dist/src/user-context/focus-lifecycle.js +26 -0
  127. package/dist/src/user-context/planner.js +46 -13
  128. package/dist/src/work-discovery/analyzer.js +6 -4
  129. package/dist/src/work-discovery/index.js +2 -2
  130. package/dist/src/work-discovery/service.d.ts +12 -3
  131. package/dist/src/work-discovery/service.js +164 -83
  132. package/dist/src/work-discovery/source-repository.d.ts +1 -0
  133. package/dist/src/work-discovery/source-repository.js +10 -4
  134. package/dist/src/work-discovery/types.d.ts +2 -1
  135. package/package.json +3 -3
  136. package/dist/gateway/static/root/assets/channels-status-swr-CXhPeiNj.js +0 -1
  137. package/dist/gateway/static/root/assets/index-CDkuz_YC.css +0 -2
  138. package/dist/gateway/static/root/assets/messages-B701TEZ5.js +0 -3
  139. package/dist/gateway/static/root/assets/settings-advanced-gate-B_QhPgU0.js +0 -1
  140. package/dist/gateway/static/root/assets/skill-reload-api-DVDOh1iY.js +0 -1
@@ -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;
@@ -423,6 +423,26 @@ function deleteMemoryRecord(recordId) {
423
423
  return db.prepare(`DELETE FROM memory_records WHERE record_id = ?`).run(recordId).changes > 0;
424
424
  });
425
425
  }
426
+ function countMemoryRecordsBySourceInstanceId(sourceInstanceId) {
427
+ const row = getSqliteDatabase().prepare(`SELECT COUNT(*) AS count FROM memory_records
428
+ WHERE json_extract(source_json, '$.sourceInstanceId') = ?`).get(sourceInstanceId);
429
+ return Number(row.count);
430
+ }
431
+ function deleteMemoryRecordsBySourceInstanceId(sourceInstanceId) {
432
+ return runSqliteWriteTransaction((db) => {
433
+ const recordIds = db.prepare(`SELECT record_id FROM memory_records
434
+ WHERE json_extract(source_json, '$.sourceInstanceId') = ?`).all(sourceInstanceId).map((row) => row.record_id);
435
+ if (!recordIds.length) return 0;
436
+ const removeFts = db.prepare("DELETE FROM memory_records_fts WHERE record_id = ?");
437
+ const removeRecord = db.prepare("DELETE FROM memory_records WHERE record_id = ?");
438
+ let deleted = 0;
439
+ for (const recordId of recordIds) {
440
+ removeFts.run(recordId);
441
+ deleted += Number(removeRecord.run(recordId).changes);
442
+ }
443
+ return deleted;
444
+ });
445
+ }
426
446
  /** Change lifecycle status without reconstructing or weakening the record's provenance. */
427
447
  function setMemoryRecordStatus(recordId, status, nowMs = Date.now()) {
428
448
  return runSqliteWriteTransaction((db) => {
@@ -658,4 +678,4 @@ function parseJsonValue(json, fallback) {
658
678
  }
659
679
  }
660
680
  //#endregion
661
- export { appendMemorySignal, appendMemoryTraceEvent, deleteMemoryRecord, getMemoryProviderState, getMemoryRecord, getMemoryTurnFeedback, hasUnresolvedMemoryConflict, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, markMemoryRecordsConflicted, searchMemoryRecords, setMemoryProviderState, setMemoryRecordStatus, setMemoryTurnFeedback, summarizeMemoryRecallFeedback, upsertMemoryRecord };
681
+ export { appendMemorySignal, appendMemoryTraceEvent, countMemoryRecordsBySourceInstanceId, deleteMemoryRecord, deleteMemoryRecordsBySourceInstanceId, getMemoryProviderState, getMemoryRecord, getMemoryTurnFeedback, hasUnresolvedMemoryConflict, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, markMemoryRecordsConflicted, searchMemoryRecords, setMemoryProviderState, setMemoryRecordStatus, setMemoryTurnFeedback, summarizeMemoryRecallFeedback, upsertMemoryRecord };
@@ -0,0 +1,11 @@
1
+ -- Project stack, repository workflow, and current focus now live in work discovery
2
+ -- summaries/threads/focuses instead of the user's durable profile.
3
+ UPDATE user_understandings
4
+ SET status = 'archived',
5
+ updated_at = CAST(strftime('%s', 'now') AS INTEGER) * 1000
6
+ WHERE status IN ('candidate', 'active', 'needs_review', 'stale')
7
+ AND (
8
+ canonical_key LIKE 'work-discovery:technology:%'
9
+ OR canonical_key LIKE 'work-discovery:workflow:%'
10
+ OR canonical_key LIKE 'work-discovery:focus:%'
11
+ );
@@ -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 = 132;
6
+ export declare const XOPC_DB_SCHEMA_VERSION = 133;
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 = 132;
15
+ const XOPC_DB_SCHEMA_VERSION = 133;
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 ?? 132;
60
+ const targetVersion = options.targetVersion ?? 133;
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 ?? 132;
97
+ const appVersion = options.targetVersion ?? 133;
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 = 132;
22
+ export const XOPC_DB_SCHEMA_VERSION = 133;
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: 132,
35
+ targetVersion: 133,
36
36
  databasePath: options.databasePath
37
37
  });
38
38
  }
@@ -1,5 +1,5 @@
1
1
  import { getSqliteDatabase, runSqliteWriteTransaction } from "./transaction.js";
2
- import { escapeFts5Query } from "./fts.js";
2
+ import { buildFts5SearchQuery } from "./fts.js";
3
3
  import { buildDefaultSessionMetadata } from "./session-metadata.js";
4
4
  import { buildGlobalSessionStats, metadataToSessionInsert, sessionRowToMetadata } from "./row-mappers.js";
5
5
  import { validateSessionId } from "../../session/session-id.js";
@@ -129,7 +129,7 @@ function listSessionMetadata(query = {}) {
129
129
  let searchKeys = null;
130
130
  if (query.search?.trim()) {
131
131
  const rawSearch = query.search.trim();
132
- const ftsQuery = escapeFts5Query(rawSearch);
132
+ const ftsQuery = buildFts5SearchQuery(rawSearch);
133
133
  const ftsRows = db.prepare(`SELECT DISTINCT session_key FROM transcript_fts WHERE transcript_fts MATCH ? LIMIT 500`).all(ftsQuery);
134
134
  const ftsKeys = new Set(ftsRows.map((r) => r.session_key));
135
135
  const like = `%${rawSearch.toLowerCase()}%`;
@@ -30,6 +30,20 @@ interface HomeGatewayPort {
30
30
  readonly automationServiceInstance: AutomationService;
31
31
  readonly projects: ProjectService;
32
32
  readonly proactiveInbox: ProactiveInboxService;
33
+ readonly sessions: {
34
+ listActiveRuns(): Array<{
35
+ sessionKey: string;
36
+ runId: string;
37
+ }>;
38
+ getSession(key: string): Promise<{
39
+ name?: string;
40
+ updatedAt: string;
41
+ lastInteractionAt?: string;
42
+ routing?: {
43
+ agentId?: string;
44
+ };
45
+ } | null>;
46
+ };
33
47
  createWorkflowRunService(): WorkflowRunService;
34
48
  }
35
49
  export declare function decisionFromTask(model: TaskReadModel, projectName?: string, locale?: string): HomeDecision | null;
@@ -294,7 +294,8 @@ var HomeQueryService = class {
294
294
  const workflowRunStore = this.service.createWorkflowRunService().createRunStore(defaultAgent?.id ?? agents.defaultId);
295
295
  const nowMs = Date.now();
296
296
  const tasks = this.#tasks.list({ limit: 60 });
297
- const [workflowRuns, automations, automationRuns, projects, connectorApprovals] = await Promise.all([
297
+ const activeRuns = this.service.sessions.listActiveRuns();
298
+ const [workflowRuns, automations, automationRuns, projects, connectorApprovals, activeRunSessions] = await Promise.all([
298
299
  workflowRunStore.listRunSummaries(20),
299
300
  this.service.automationServiceInstance.list(),
300
301
  this.service.automationServiceInstance.listRuns({ limit: 10 }),
@@ -303,8 +304,23 @@ var HomeQueryService = class {
303
304
  principalId: "local-owner",
304
305
  status: "pending",
305
306
  limit: 100
306
- }))
307
+ })),
308
+ Promise.all(activeRuns.map(async (run) => ({
309
+ ...run,
310
+ session: await this.service.sessions.getSession(run.sessionKey)
311
+ })))
307
312
  ]);
313
+ const runningConversations = activeRunSessions.filter((item) => Boolean(item.session)).map((item) => {
314
+ const session = item.session;
315
+ const updatedAt = Date.parse(session.lastInteractionAt ?? session.updatedAt);
316
+ return {
317
+ sessionKey: item.sessionKey,
318
+ runId: item.runId,
319
+ ...session.name?.trim() ? { title: session.name.trim() } : {},
320
+ ...session.routing?.agentId ? { agentId: session.routing.agentId } : {},
321
+ updatedAt: Number.isFinite(updatedAt) ? updatedAt : nowMs
322
+ };
323
+ }).sort((left, right) => right.updatedAt - left.updatedAt);
308
324
  const activeTasks = tasks.filter((task) => task.phase !== "closed");
309
325
  const projectsById = new Map(projects.items.map((project) => [project.id, project]));
310
326
  const activeWorkflowRuns = workflowRuns.filter((run) => run.status === "queued" || run.status === "running").map(toHomeWorkflowRun);
@@ -395,6 +411,7 @@ var HomeQueryService = class {
395
411
  scheduled: upcomingAutomations,
396
412
  nowMs
397
413
  }),
414
+ runningConversations,
398
415
  decisions,
399
416
  attentionPolicy: governed.policy
400
417
  };
@@ -6,6 +6,7 @@ type ConsolidationMetrics = {
6
6
  scanned: number;
7
7
  needsReview: number;
8
8
  stale: number;
9
+ globalCandidates: number;
9
10
  };
10
11
  export declare function resolveContextConsolidationConfig(config: Config): {
11
12
  enabled: boolean;
@@ -1,9 +1,67 @@
1
1
  import { finishContextConsolidationRun, recordContextConsolidationDecision, startContextConsolidationRun } from "../storage/sqlite/context-consolidation-repository.js";
2
- import { listUnderstandingEvidence, listUnderstandings, setUnderstandingStatus } from "../storage/sqlite/user-context-repository.js";
2
+ import { createUnderstanding, linkUnderstandingEvidence, listUnderstandingEvidence, listUnderstandings, setUnderstandingStatus } from "../storage/sqlite/user-context-repository.js";
3
3
  import "../storage/sqlite/index.js";
4
4
  //#region src/user-context/consolidation.ts
5
5
  const USER_CONTEXT_CONSOLIDATION_TOKEN = "__xopc_user_context_consolidation__";
6
6
  const USER_CONTEXT_CONSOLIDATION_AUTOMATION_ID = "system-user-context-consolidation";
7
+ const GLOBAL_CANDIDATE_KINDS = new Set(["preference", "routine"]);
8
+ function stricterSensitivity(items) {
9
+ const order = [
10
+ "normal",
11
+ "personal",
12
+ "secret",
13
+ "regulated"
14
+ ];
15
+ return order[Math.max(...items.map((item) => order.indexOf(item.sensitivity)))] ?? "personal";
16
+ }
17
+ function stricterDisclosurePolicy(items) {
18
+ if (items.some((item) => item.disclosurePolicy === "silent")) return "silent";
19
+ if (items.some((item) => item.disclosurePolicy === "ask_before_reference")) return "ask_before_reference";
20
+ return "referenceable";
21
+ }
22
+ function createCrossProjectGlobalCandidates(minProjects) {
23
+ const all = listUnderstandings();
24
+ const existingGlobalKeys = new Set(all.filter((item) => item.scope.type === "global" && item.status !== "archived" && item.status !== "rejected").map((item) => item.canonicalKey));
25
+ const groups = /* @__PURE__ */ new Map();
26
+ for (const item of all) {
27
+ if (item.status !== "active" || item.scope.type !== "project" || !item.scope.id || !GLOBAL_CANDIDATE_KINDS.has(item.kind)) continue;
28
+ const normalizedStatement = item.statement.normalize("NFKC").toLocaleLowerCase().replace(/\s+/g, " ").trim();
29
+ const groupKey = `${item.canonicalKey}\u0000${normalizedStatement}`;
30
+ const group = groups.get(groupKey) ?? [];
31
+ group.push(item);
32
+ groups.set(groupKey, group);
33
+ }
34
+ let created = 0;
35
+ for (const items of groups.values()) {
36
+ const canonicalKey = items[0].canonicalKey;
37
+ const projectCount = new Set(items.map((item) => item.scope.id)).size;
38
+ if (projectCount < Math.max(2, minProjects) || existingGlobalKeys.has(canonicalKey)) continue;
39
+ const exemplar = [...items].sort((left, right) => right.confidence - left.confidence)[0];
40
+ const global = createUnderstanding({
41
+ kind: exemplar.kind,
42
+ canonicalKey,
43
+ status: "candidate",
44
+ scope: { type: "global" },
45
+ explicitness: "inferred",
46
+ durability: exemplar.durability,
47
+ sensitivity: stricterSensitivity(items),
48
+ disclosurePolicy: stricterDisclosurePolicy(items),
49
+ confidence: items.reduce((sum, item) => sum + item.confidence, 0) / items.length,
50
+ statement: exemplar.statement,
51
+ createdBy: "consolidation",
52
+ changeReason: `Repeated across ${projectCount} projects`
53
+ });
54
+ const linked = /* @__PURE__ */ new Set();
55
+ for (const item of items) for (const evidence of listUnderstandingEvidence(item.id, "supports")) {
56
+ if (linked.has(evidence.id)) continue;
57
+ linkUnderstandingEvidence(global.versionId, evidence.id, "supports", item.confidence);
58
+ linked.add(evidence.id);
59
+ }
60
+ existingGlobalKeys.add(canonicalKey);
61
+ created += 1;
62
+ }
63
+ return created;
64
+ }
7
65
  function distinctEvidenceCount(understandingId, relation) {
8
66
  return new Set(listUnderstandingEvidence(understandingId, relation).map((evidence) => `${evidence.sourceType}:${evidence.sourceInstanceId ?? ""}:${evidence.sourceRef}`)).size;
9
67
  }
@@ -29,7 +87,8 @@ async function runContextConsolidation(input) {
29
87
  const metrics = {
30
88
  scanned: 0,
31
89
  needsReview: 0,
32
- stale: 0
90
+ stale: 0,
91
+ globalCandidates: 0
33
92
  };
34
93
  try {
35
94
  const understandings = listUnderstandings(["candidate", "active"]).slice(0, resolved.limit);
@@ -89,6 +148,7 @@ async function runContextConsolidation(input) {
89
148
  metrics.needsReview += 1;
90
149
  }
91
150
  }
151
+ metrics.globalCandidates = createCrossProjectGlobalCandidates(resolved.minEvidenceSources);
92
152
  return {
93
153
  run: finishContextConsolidationRun({
94
154
  runId: run.runId,
@@ -0,0 +1,2 @@
1
+ import type { UserFocus } from './sources/types.js';
2
+ export declare function focusLifecycle(horizon: UserFocus['horizon'], now?: number): Pick<UserFocus, 'validFrom' | 'validTo' | 'reviewAt'>;
@@ -0,0 +1,26 @@
1
+ //#region src/user-context/focus-lifecycle.ts
2
+ const DAY_MS = 1440 * 60 * 1e3;
3
+ const HORIZON_DAYS = {
4
+ current: {
5
+ review: 14,
6
+ valid: 30
7
+ },
8
+ ongoing: {
9
+ review: 30,
10
+ valid: 120
11
+ },
12
+ long_term: {
13
+ review: 90,
14
+ valid: 365
15
+ }
16
+ };
17
+ function focusLifecycle(horizon, now = Date.now()) {
18
+ const days = HORIZON_DAYS[horizon];
19
+ return {
20
+ validFrom: now,
21
+ reviewAt: now + days.review * DAY_MS,
22
+ validTo: now + days.valid * DAY_MS
23
+ };
24
+ }
25
+ //#endregion
26
+ export { focusLifecycle };
@@ -1,8 +1,9 @@
1
- import { consumeContextConsent, ensureContextConsent, getUserProfile, listCollaborationRules, listUnderstandingEvidence, recordContextRun } from "../storage/sqlite/user-context-repository.js";
1
+ import { consumeContextConsent, ensureContextConsent, getUserProfile, listCollaborationRules, listUnderstandingEvidence, listUnderstandings, recordContextRun } from "../storage/sqlite/user-context-repository.js";
2
2
  import { retrievalLexicalSimilarity } from "../retrieval/textFeatures.js";
3
3
  import { buildRetrievalQueryProfile } from "../retrieval/queryProfile.js";
4
4
  import "../storage/sqlite/index.js";
5
5
  import { init_session_key, parseSessionKey } from "../routing/session-key.js";
6
+ import { ProjectStore } from "../projects/project-store.js";
6
7
  import { readAgentMessageContent } from "../agent/memory/agent-message-access.js";
7
8
  import { buildUserContextBlock } from "../agent/memory/context-fence.js";
8
9
  import { getUnderstandingSourceGrant, getUnderstandingSourceRun, listUserFocuses } from "./sources/repository.js";
@@ -13,8 +14,21 @@ import { randomUUID } from "node:crypto";
13
14
  init_session_key();
14
15
  const DEFAULT_MAX_CONTEXT_CHARS = 6e3;
15
16
  const DEFAULT_MAX_RESULTS = 12;
17
+ const SELF_REVIEW_MAX_CONTEXT_CHARS = 16e3;
18
+ const SELF_REVIEW_MAX_RESULTS = 50;
16
19
  const MAX_FOCUS_RESULTS = 3;
17
20
  const MIN_RELEVANCE_SCORE = .25;
21
+ function selfReviewScore(item) {
22
+ const authority = item.explicitness === "explicit" ? .2 : item.explicitness === "observed" ? .1 : 0;
23
+ const durable = item.durability === "durable" ? .1 : item.durability === "recurring" ? .05 : 0;
24
+ return Math.min(1, item.confidence * .7 + authority + durable);
25
+ }
26
+ function scopeLabel(scope, projects) {
27
+ if (scope.type === "global") return "Global";
28
+ if (scope.type === "project") return `Project: ${scope.id ? projects.get(scope.id)?.name ?? scope.id : "unknown"}`;
29
+ if (scope.type === "workspace") return `Workspace: ${scope.id ?? "unknown"}`;
30
+ return "This conversation";
31
+ }
18
32
  function prependAgentContext(message, block) {
19
33
  if (!block) return message;
20
34
  const prefix = `${block}\n\n`;
@@ -121,8 +135,15 @@ function focusScore(focus, query, scopeInput) {
121
135
  function renderContextBlock(params) {
122
136
  const understandingItems = params.items.filter((item) => item.objectType === "understanding");
123
137
  return [
138
+ params.selfReview ? [
139
+ "<user-context-review>",
140
+ "The user explicitly asked what xopc understands about them. This is a review of active, non-sensitive structured understanding across scopes.",
141
+ "Scope labels describe where each item applies. Do not present project facts as global personality traits.",
142
+ "An empty memory_search result does not mean structured user understanding is empty.",
143
+ "</user-context-review>"
144
+ ].join("\n") : "",
124
145
  params.profileLines.length ? `<user-profile>\n${params.profileLines.join("\n")}\n</user-profile>` : "",
125
- params.focuses.length ? `<active-focuses>\n${params.focuses.map((focus) => `- ${focus.title}: ${focus.summary} (${focus.horizon})`).join("\n")}\n</active-focuses>` : "",
146
+ params.focuses.length ? `<active-focuses>\n${params.focuses.map((focus) => `- ${params.selfReview ? `[${scopeLabel(focus.scope, params.projects)}] ` : ""}${focus.title}: ${focus.summary} (${focus.horizon})`).join("\n")}\n</active-focuses>` : "",
126
147
  params.rules.length ? `<collaboration-contract>\n${params.rules.map((rule) => `- ${rule.statement}`).join("\n")}\n</collaboration-contract>` : "",
127
148
  understandingItems.length ? buildUserContextBlock(understandingItems.map((item) => `- ${item.content}\n Evidence: ${params.understandingSources.get(item.recordId) ?? "Unknown source"}`).join("\n")) : ""
128
149
  ].filter(Boolean).join("\n\n");
@@ -143,14 +164,18 @@ var UserContextPlanner = class {
143
164
  };
144
165
  const started = Date.now();
145
166
  const now = Date.now();
146
- const maxResults = params.allocation?.maxResults ?? DEFAULT_MAX_RESULTS;
147
- const maxChars = params.allocation?.maxChars ?? DEFAULT_MAX_CONTEXT_CHARS;
167
+ const requestedMaxResults = params.allocation?.maxResults;
168
+ const requestedMaxChars = params.allocation?.maxChars;
148
169
  const scopeInput = {
149
170
  sessionKey: params.sessionKey,
150
171
  workspaceId: params.workspaceId,
151
172
  ...params.projectId ? { projectId: params.projectId } : {}
152
173
  };
153
174
  const queryProfile = buildRetrievalQueryProfile(query, scopeInput);
175
+ const selfReview = queryProfile.selfReview;
176
+ 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);
178
+ const projects = new ProjectStore();
154
179
  const excluded = new Set(params.excludedRecordIds ?? []);
155
180
  const rejected = [];
156
181
  const consentRequests = [];
@@ -166,6 +191,8 @@ var UserContextPlanner = class {
166
191
  rules: selectedRules,
167
192
  items,
168
193
  understandingSources,
194
+ selfReview,
195
+ projects,
169
196
  ...overrides
170
197
  });
171
198
  const profile = getUserProfile();
@@ -211,14 +238,16 @@ var UserContextPlanner = class {
211
238
  const rankedFocuses = listUserFocuses(["active"]).map((focus) => ({
212
239
  focus,
213
240
  score: focusScore(focus, query, scopeInput)
214
- })).sort((left, right) => right.score - left.score || right.focus.updatedAt - left.focus.updatedAt);
241
+ })).sort((left, right) => selfReview ? right.focus.confidence - left.focus.confidence || right.focus.updatedAt - left.focus.updatedAt : right.score - left.score || right.focus.updatedAt - left.focus.updatedAt);
215
242
  for (const { focus, score } of rankedFocuses) {
216
243
  const source = focusSourceDescription(focus);
217
244
  let reason = focusRejectionReason(focus, scopeInput, now);
218
- if (!reason && score <= MIN_RELEVANCE_SCORE) reason = "low_score";
219
- if (!reason && selectedFocuses.length >= MAX_FOCUS_RESULTS) reason = "budget";
245
+ if (selfReview && reason === "scope_mismatch") reason = void 0;
246
+ if (!reason && !selfReview && score <= MIN_RELEVANCE_SCORE) reason = "low_score";
247
+ if (!reason && selectedFocuses.length >= (selfReview ? maxResults : MAX_FOCUS_RESULTS)) reason = "budget";
220
248
  if (!reason && items.length >= maxResults) reason = "budget";
221
- const content = `${focus.title}: ${focus.summary} (${focus.horizon})`;
249
+ const focusScope = scopeLabel(focus.scope, projects);
250
+ const content = `${selfReview ? `[${focusScope}] ` : ""}${focus.title}: ${focus.summary} (${focus.horizon})`;
222
251
  const nextChars = render({ focuses: [...selectedFocuses, focus] }).length;
223
252
  if (!reason && nextChars > maxChars) reason = "budget";
224
253
  if (reason) {
@@ -306,16 +335,19 @@ var UserContextPlanner = class {
306
335
  injectedChars: addedChars
307
336
  });
308
337
  }
309
- const ranked = this.retriever.retrieve({
338
+ const ranked = (selfReview ? listUnderstandings(["active"]).map((item) => ({
339
+ item,
340
+ score: selfReviewScore(item)
341
+ })).sort((left, right) => right.score - left.score || right.item.updatedAt - left.item.updatedAt) : this.retriever.retrieve({
310
342
  query,
311
343
  sessionKey: params.sessionKey,
312
344
  workspaceId: params.workspaceId,
313
345
  ...params.projectId ? { projectId: params.projectId } : {},
314
346
  maxCandidates: Math.max(maxResults * 5, 50)
315
- }).filter((result) => !excluded.has(result.understanding.id)).map((result) => ({
347
+ }).map((result) => ({
316
348
  item: result.understanding,
317
349
  score: result.score
318
- }));
350
+ }))).filter(({ item }) => !excluded.has(item.id));
319
351
  for (const { item, score } of ranked) {
320
352
  const source = sourceDescription(item);
321
353
  if (items.length >= maxResults) {
@@ -338,7 +370,8 @@ var UserContextPlanner = class {
338
370
  continue;
339
371
  }
340
372
  let reason = rejectionReason(item, scopeInput, now, queryProfile.timeHints);
341
- if (!reason && score <= MIN_RELEVANCE_SCORE) reason = "low_score";
373
+ if (selfReview && reason === "scope_mismatch") reason = void 0;
374
+ if (!reason && !selfReview && score <= MIN_RELEVANCE_SCORE) reason = "low_score";
342
375
  if (!reason && item.disclosurePolicy === "ask_before_reference") {
343
376
  const consentStatus = consumeContextConsent(item.id, params.sessionKey);
344
377
  if (consentStatus !== "granted") {
@@ -377,7 +410,7 @@ var UserContextPlanner = class {
377
410
  recordId: item.id,
378
411
  objectType: "understanding",
379
412
  versionId: item.versionId,
380
- content: item.statement,
413
+ content: selfReview ? `[${scopeLabel(item.scope, projects)}] ${item.statement}` : item.statement,
381
414
  score,
382
415
  section: sectionFor(item),
383
416
  citation: `user-context://${item.id}`,