@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.
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-slG02hSm.js → activity-store-DeKZ36Jy.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DZ6ETNIk.js → agent-avatar-dicebear-D0hZfdkn.js} +1 -1
- package/dist/gateway/static/root/assets/{agents-DxaIH0Ep.js → agents-Bu0NfWuh.js} +1 -1
- package/dist/gateway/static/root/assets/{api-Tz57QxiN.js → api-yLnYUedB.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-DdR1L4LR.js → app-management-settings-panel-C2kZNEHz.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-wYbwqmee.js → appearance-settings-DQ7H35sN.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-CyWr6KyO.js → apps-page-Tty2xaUG.js} +1 -1
- package/dist/gateway/static/root/assets/{archive-plugin-DKXa160O.js → archive-plugin-CBArbTPH.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-CzwA9g2y.js → attachment-load-oc6DRj4G.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-DwAXyWAY.js → automations-page-CHPEUpz8.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-workspace-CL7ieYIt.js → automations-workspace-9uYkHmdI.js} +1 -1
- package/dist/gateway/static/root/assets/{binary-plugins-DoQ_DnT7.js → binary-plugins-BRBd0X7_.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-Bj_Uxxng.js → block-editor-ZgM-Z4Qv.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-settings-page-BYa_FNC1.js → browser-settings-page-BT3mEm00.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-workflow-inputs-D4roXE6r.js → browser-workflow-inputs-DxD74a4c.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-workflows-page-CleKTAKD.js → browser-workflows-page-Dpc7NqZf.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-settings-panel-DYG37N0k.js → capabilities-settings-panel-DHlfRj4M.js} +1 -1
- package/dist/gateway/static/root/assets/{capability-presets-api-wtEN6Ss6.js → capability-presets-api-B9ID97j6.js} +1 -1
- package/dist/gateway/static/root/assets/{capability-presets-settings-panel-C0Q4dFq-.js → capability-presets-settings-panel-D2FkREUX.js} +1 -1
- package/dist/gateway/static/root/assets/{channel-recipient-api-DhuS2RJ3.js → channel-recipient-api-DCNn6MWL.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-settings-CpO6Xg0n.js → channels-settings-D4YcKMtf.js} +1 -1
- package/dist/gateway/static/root/assets/channels-status-swr-B8XWrzKM.js +1 -0
- package/dist/gateway/static/root/assets/{chat-terminal-dock-ClQMDe2n.js → chat-terminal-dock-MvNpjcUs.js} +1 -1
- package/dist/gateway/static/root/assets/{connectors-page-BvyiPdKU.js → connectors-page-Bd6K9bDk.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-expression-4DvCFs-v.js → cron-expression-BSXX9uY0.js} +1 -1
- package/dist/gateway/static/root/assets/{date-picker-B6FSjt4Z.js → date-picker-CiHNkkIS.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-Za18eMp1.js → dependency-picker-DQyh2ZXE.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-DUUf3yyJ.js → desktop-pet-DnAHU-zA.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-Dwx3GfB8.js → desktop-pet-settings-DUdhIBBB.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-C6dfTCsl.js → directory-picker-path-field-B3gFQt8x.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-Cordpg4X.js → extension-debug-page-Lq-gRApw.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-Dw0dGyMl.js → extension-page-D0ROxJmY.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-B2pUMaXm.js → extension-settings-page-B2tS6mFy.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-DAZUOEQh.js → gateway-config-api-DJqWfVi6.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-BIqRg-zo.js → gateway-config-swr-CnwF9Vso.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-ik2f-pmV.js → gateway-settings-B3thenPX.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-BFjWYOCS.js → gateway-startup-retry-DdJJZR8M.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-BE81XJ8F.js → heartbeat-settings-C_g-ZGSE.js} +1 -1
- package/dist/gateway/static/root/assets/{home-page-BTWXJu_m.js → home-page-Cgwx66kc.js} +1 -1
- package/dist/gateway/static/root/assets/{image-generation-api-HXAWlgm6.js → image-generation-api-Dtt9M5qz.js} +1 -1
- package/dist/gateway/static/root/assets/index-Cf0qTkBK.css +2 -0
- package/dist/gateway/static/root/assets/{index-B6gWYy08.js → index-V9g9-SWT.js} +9 -9
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-ROqQ_Xlo.js → keyboard-shortcuts-settings-cJqkmQdP.js} +1 -1
- package/dist/gateway/static/root/assets/{local-app-workbench-page-Dcaf190G.js → local-app-workbench-page-CmjLMdly.js} +1 -1
- package/dist/gateway/static/root/assets/{local-apps-page-Be79cyMG.js → local-apps-page-BiuP2pkl.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-DfK-Hofd.js → locale-store-D3Q2yEAb.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-C2pjbXno.js → logs-page-BTlxGPho.js} +1 -1
- package/dist/gateway/static/root/assets/{management-settings-CRspx0oY.js → management-settings-Z1gJUwP_.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-split-G3PTpGw3.js → markdown-split-DuOmpGgE.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-view-D4FPJZ91.js → markdown-view-WYArkdrc.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-DT0P7j7u.js → media-plugins-DKPh3Mud.js} +1 -1
- package/dist/gateway/static/root/assets/messages-BQHpB4VI.js +3 -0
- package/dist/gateway/static/root/assets/{notes-api-q7HjYO07.js → notes-api-DMEon7Zv.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-page-Cgl2h7AR.js → notes-page-BG4gV8WG.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-workbench-DFMQYyGJ.js → notes-workbench-D3LMBO2X.js} +2 -2
- package/dist/gateway/static/root/assets/{product-open-page-ComKLO4D.js → product-open-page-BjJf4QOB.js} +1 -1
- package/dist/gateway/static/root/assets/{project-detail-page-DUFmQscH.js → project-detail-page-C59tYJG-.js} +1 -1
- package/dist/gateway/static/root/assets/{projects-page-CTWxt3dv.js → projects-page-Di7W-Fg8.js} +1 -1
- package/dist/gateway/static/root/assets/{registry-api-BBoJ7khF.js → registry-api-DRyvynb5.js} +1 -1
- package/dist/gateway/static/root/assets/{remote-access-hub-qmG-3qjj.js → remote-access-hub-BYOKveWT.js} +1 -1
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-CXHQc53b.js → runtime-tools-settings-panel-DC6t_-db.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-3jTDF2lJ.js → schema-form-DSTWtpjp.js} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-D_We4_MV.js → sessions-page-CJMNQsxK.js} +1 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-FJxZw08y.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-CUDozALU.js → settings-form-section-ZzEMNLYS.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-H3ZH6a6l.js → settings-loading-skeleton-D7-bkbcW.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-tx29z21o.js → settings-page-PaTpLbmi.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-status-panel-VunfXpTX.js → setup-status-panel-Bnpim6NY.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-MyThymEx.js → share-preview-page-Cxcw0ksa.js} +1 -1
- package/dist/gateway/static/root/assets/{shares-settings-DkZvY1cr.js → shares-settings-DBqmV7ZY.js} +1 -1
- package/dist/gateway/static/root/assets/skill-reload-api-UgLQaWoz.js +1 -0
- package/dist/gateway/static/root/assets/{skills-page-BOOyMnno.js → skills-page-Dby4iAYe.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page.utils-Bl5Yv3Cx.js → skills-page.utils-nlzJ5Y1V.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-DwQ3O1ta.js → system-settings-panel-vOsgnzDl.js} +1 -1
- package/dist/gateway/static/root/assets/{task-detail-page-BwOyrADL.js → task-detail-page-CRy8Wl5g.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-Br4BtK4x.js → theme-store-CvnEHGyP.js} +1 -1
- package/dist/gateway/static/root/assets/{use-autosave-DRS3RwS9.js → use-autosave-BTNZHulv.js} +1 -1
- package/dist/gateway/static/root/assets/{user-context-page-ClV2r3Cr.js → user-context-page-BT8F4mh5.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-CGTE5156.js → voice-api-key-field-DDJ2-3Tx.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-CW-HKD7h.js → work-discovery-overlay-DV_qiKSD.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-Dtr9fDC8.js → workflow-run-setup-panel--AcvRw1w.js} +1 -1
- package/dist/gateway/static/root/assets/{workflows-page-CDOyNgZf.js → workflows-page-CwvskVvU.js} +1 -1
- package/dist/gateway/static/root/index.html +12 -12
- package/dist/package.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +1 -1
- package/dist/src/cli/commands/extension.js +1 -1
- package/dist/src/connectors/connected-source-understanding.js +6 -5
- package/dist/src/connectors/learning-coordinator.js +11 -2
- package/dist/src/extensions/update.js +1 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
- package/dist/src/gateway/hono/routes/understanding-sources.d.ts +9 -0
- package/dist/src/gateway/hono/routes/understanding-sources.js +47 -14
- package/dist/src/gateway/hono/routes/work-discovery.js +13 -3
- package/dist/src/gateway/service/agent-runner.d.ts +4 -0
- package/dist/src/gateway/service/agent-runner.js +6 -0
- package/dist/src/gateway/service/config-coordinator.js +1 -1
- package/dist/src/gateway/service/run-gateway-agent.js +13 -8
- package/dist/src/gateway/service/sessions-api.d.ts +9 -0
- package/dist/src/gateway/service/sessions-api.js +3 -0
- package/dist/src/gateway/service.js +2 -1
- package/dist/src/infra/update-runner.js +1 -1
- package/dist/src/knowledge/connected-knowledge-pipeline.d.ts +6 -0
- package/dist/src/knowledge/connected-knowledge-pipeline.js +35 -4
- package/dist/src/retrieval/queryProfile.d.ts +2 -0
- package/dist/src/retrieval/queryProfile.js +11 -1
- package/dist/src/storage/sqlite/index.d.ts +2 -2
- package/dist/src/storage/sqlite/index.js +3 -3
- package/dist/src/storage/sqlite/knowledge-repository.d.ts +5 -1
- package/dist/src/storage/sqlite/knowledge-repository.js +16 -1
- package/dist/src/storage/sqlite/memory-records-repository.d.ts +2 -0
- package/dist/src/storage/sqlite/memory-records-repository.js +21 -1
- package/dist/src/storage/sqlite/migrations/133_archive_legacy_work_discovery_profile_facts.sql +11 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/session-repository.js +2 -2
- package/dist/src/tasks/home-query-service.d.ts +14 -0
- package/dist/src/tasks/home-query-service.js +19 -2
- package/dist/src/user-context/consolidation.d.ts +1 -0
- package/dist/src/user-context/consolidation.js +62 -2
- package/dist/src/user-context/focus-lifecycle.d.ts +2 -0
- package/dist/src/user-context/focus-lifecycle.js +26 -0
- package/dist/src/user-context/planner.js +46 -13
- package/dist/src/work-discovery/analyzer.js +6 -4
- package/dist/src/work-discovery/index.js +2 -2
- package/dist/src/work-discovery/service.d.ts +12 -3
- package/dist/src/work-discovery/service.js +164 -83
- package/dist/src/work-discovery/source-repository.d.ts +1 -0
- package/dist/src/work-discovery/source-repository.js +10 -4
- package/dist/src/work-discovery/types.d.ts +2 -1
- package/package.json +3 -3
- package/dist/gateway/static/root/assets/channels-status-swr-CXhPeiNj.js +0 -1
- package/dist/gateway/static/root/assets/index-CDkuz_YC.css +0 -2
- package/dist/gateway/static/root/assets/messages-B701TEZ5.js +0 -3
- package/dist/gateway/static/root/assets/settings-advanced-gate-B_QhPgU0.js +0 -1
- 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 };
|
package/dist/src/storage/sqlite/migrations/133_archive_legacy_work_discovery_profile_facts.sql
ADDED
|
@@ -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 =
|
|
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 =
|
|
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 ??
|
|
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 ??
|
|
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 =
|
|
22
|
+
export const XOPC_DB_SCHEMA_VERSION = 133;
|
|
23
23
|
|
|
24
24
|
const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
|
|
25
25
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getSqliteDatabase, runSqliteWriteTransaction } from "./transaction.js";
|
|
2
|
-
import {
|
|
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 =
|
|
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
|
|
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
|
};
|
|
@@ -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,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
|
|
147
|
-
const
|
|
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 (
|
|
219
|
-
if (!reason &&
|
|
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
|
|
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 =
|
|
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
|
-
}).
|
|
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 (
|
|
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}`,
|