@xopcai/xopc 0.0.307 → 0.0.309
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/_locales/en/messages.json +8 -0
- package/dist/browser-ext/_locales/zh_CN/messages.json +8 -0
- package/dist/browser-ext/dist/assets/{sidepanel-BbSQr-6P.css → sidepanel-DD6GEMvc.css} +16 -0
- package/dist/browser-ext/dist/sidepanel.html +1 -1
- package/dist/browser-ext/dist/sidepanel.js +537 -96
- 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-wgSB2HYK.js → activity-store-XKNYlFUI.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CZeQo09T.js → agent-avatar-dicebear-1S2TFECE.js} +1 -1
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-f0-YFMUz.js +1 -0
- package/dist/gateway/static/root/assets/{agents-BlrHMbRx.js → agents-CPqUMtCL.js} +1 -1
- package/dist/gateway/static/root/assets/{api-BKHmTb0w.js → api-BEUEE4f2.js} +1 -1
- package/dist/gateway/static/root/assets/api-CN4id43t.js +1 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-Bzw4fQP8.js → app-management-settings-panel-CgVBSqzu.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-8GZpUXva.js → appearance-settings-CoWdCokb.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-BkQQtIxH.js → apps-page-CexHOcWg.js} +1 -1
- package/dist/gateway/static/root/assets/{archive-plugin-CQ2NaoHb.js → archive-plugin-C3ZA6LRS.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-BFi1H7yJ.js → attachment-load-CdgS6_zy.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-CDBXcii_.js → automations-page-BtHL2hpg.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-onJPfmO6.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-D07eWmOx.js → binary-plugins-CiDhtq_H.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-CtVnjyYU.js → block-editor-Br00T83w.js} +3 -3
- package/dist/gateway/static/root/assets/{browser-automation-inputs-BzkJog8e.js → browser-automation-inputs-D2tILykA.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automations-page-DyrSbDdG.js → browser-automations-page-BVuEmryB.js} +1 -1
- package/dist/gateway/static/root/assets/browser-settings-page-BgVTyPFY.js +3 -0
- package/dist/gateway/static/root/assets/capabilities-settings-panel-Dra8wj1S.js +8 -0
- package/dist/gateway/static/root/assets/{channels-settings-DAD9qE3J.js → channels-settings-CkxiMDJ4.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-status-swr-B2JwuTjG.js → channels-status-swr-Dtder4G_.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-terminal-dock-B62SZdAo.js → chat-terminal-dock-JsMtzDao.js} +1 -1
- package/dist/gateway/static/root/assets/{computer-settings-page-ClSresNq.js → computer-settings-page-DHerePwo.js} +1 -1
- package/dist/gateway/static/root/assets/connector-service-page-DZFNUTiN.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-cl9ZrV4D.js +2 -0
- package/dist/gateway/static/root/assets/{cron-expression-CTMi_tql.js → cron-expression-DAhdv_Xv.js} +1 -1
- package/dist/gateway/static/root/assets/{date-picker-B71AJK50.js → date-picker-PacO1m3a.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-DlyGK-kA.js → dependency-picker-B-BcuG1y.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-DGkbTE8_.js → desktop-pet-CdBBhhdY.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-BY8r9j66.js → desktop-pet-settings-Gy03NgMI.js} +1 -1
- package/dist/gateway/static/root/assets/{device-pairing-wizard-DzRrgd59.js → device-pairing-wizard-aV25nKag.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-L8Mm1n3A.js → extension-debug-page-BFp5eKtY.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CFc4vSNU.js → extension-page-DL3vyyH6.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-B5zWyHr3.js → extension-settings-page-BXtvdAsY.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-B6wHa6ZI.js → gateway-config-swr-xAOGtenO.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-realtime-B53R0CA4.js → gateway-realtime-BuaTsMSi.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-BG95uGVW.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-settings-D7qmTH4R.js → gateway-settings-Dcr2Ikeh.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-DRzGnEV-.js → gateway-startup-retry-BwDxKHd4.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-Glsl3X5b.js → heartbeat-settings-DOy3alvT.js} +1 -1
- package/dist/gateway/static/root/assets/home-page-CDm3dGVy.js +1 -0
- package/dist/gateway/static/root/assets/{image-generation-api-Ck_pyDom.js → image-generation-api-wGMeI_yW.js} +1 -1
- package/dist/gateway/static/root/assets/{imports-page-ByBX7ome.js → imports-page-zexFT5Rq.js} +1 -1
- package/dist/gateway/static/root/assets/index-D-vczw_0.css +1 -0
- package/dist/gateway/static/root/assets/index-DJo4DimT.js +79 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-C45RlO8a.js → keyboard-shortcuts-settings-CutG9zLh.js} +1 -1
- package/dist/gateway/static/root/assets/{local-app-workbench-page-DP0x2jpR.js → local-app-workbench-page-CwLvTwjn.js} +2 -2
- package/dist/gateway/static/root/assets/{local-apps-page-C_AQc2bI.js → local-apps-page-CJy6I7Dt.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-msTfRK8P.js → locale-store-DPZ79W1-.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-DvM8Pyok.js → logs-page-egGcPHNi.js} +1 -1
- package/dist/gateway/static/root/assets/{management-settings-D1uwSutV.js → management-settings-BQhIOELc.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-view-BInabSKf.js → markdown-view-p2P5hP1U.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-C4mhf13f.js → media-plugins-CsBylqlN.js} +1 -1
- package/dist/gateway/static/root/assets/messages-BiYTyLJr.js +3 -0
- package/dist/gateway/static/root/assets/note-detail-panel-c2k5Uz6X.js +5 -0
- package/dist/gateway/static/root/assets/notes-page-BLQWJMhf.js +8 -0
- package/dist/gateway/static/root/assets/{page-tabs-1go_BtX1.js → page-tabs-ChQ4jJFs.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-DmoSC0j1.js → preview-open-alternatives-9B5W7nVE.js} +1 -1
- package/dist/gateway/static/root/assets/{proactive-page-xAjKTIID.js → proactive-page-iOjI0d_e.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-gmi5LLwM.js → product-open-page-BADxWEdP.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-BcxbQn2M.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-BuSvld0O.js +1 -0
- package/dist/gateway/static/root/assets/{registry-api-BSWtko7U.js → registry-api-B_e_nZSN.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CFS8LQKW.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-ClkOoxDl.js → runtime-tools-settings-panel-D-pwiIyp.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-BuEmLiaU.js → schema-form-IWmb05DX.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-DZjc__ok.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-C1SM5B93.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-Dor39QON.js → settings-form-section-B0veRBZs.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-Xj-yvIc8.js → settings-page-CxRWyWYe.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-D9Rl7Tec.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-BFWZoXdm.js → share-preview-page-CirpgkfD.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-CwCThBs0.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-DG6VGbOX.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-BdRJ2vnL.js +2 -0
- package/dist/gateway/static/root/assets/{skills-page.utils-Ii8qeXhs.js → skills-page.utils-B42mpWKV.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-Di6OSO-0.js → system-settings-panel-DXIZpAvU.js} +1 -1
- package/dist/gateway/static/root/assets/task-detail-page-QXo9LJly.js +1 -0
- package/dist/gateway/static/root/assets/{theme-store-1SZ-HFHX.js → theme-store-BFbj_2Tu.js} +1 -1
- package/dist/gateway/static/root/assets/{tunnel-api-DDOlOYlj.js → tunnel-api-Db2guRdW.js} +1 -1
- package/dist/gateway/static/root/assets/{use-autosave-CQ8uWNnB.js → use-autosave-DDY9qoXZ.js} +1 -1
- package/dist/gateway/static/root/assets/user-model-page-CzPmMkaO.js +2 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-COTzshjL.js → voice-api-key-field-BZbKQ8HT.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-DgJML_uM.js → voice-config-api-SKCeQLrH.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-_URrXbi4.js → work-discovery-overlay-BRVTTXNG.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CALs-1nd.js → workflow-run-setup-panel-D2kuwv5e.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-CQXtiYtq.js +6 -0
- package/dist/gateway/static/root/index.html +12 -12
- package/dist/package.js +1 -1
- package/dist/packages/gateway-contract/src/notifications.js +1 -1
- package/dist/packages/gateway-contract/src/sessions.js +6 -1
- package/dist/src/agent/agent-manager.js +29 -4
- package/dist/src/agent/background-review/prompts.js +3 -1
- package/dist/src/agent/child-agent-factory.d.ts +1 -0
- package/dist/src/agent/child-agent-factory.js +18 -4
- package/dist/src/agent/coding/repository-instructions.d.ts +4 -0
- package/dist/src/agent/coding/repository-instructions.js +46 -2
- package/dist/src/agent/context/execution-context.js +4 -4
- package/dist/src/agent/data-acquisition/git.d.ts +17 -0
- package/dist/src/agent/data-acquisition/git.js +100 -0
- package/dist/src/agent/data-acquisition/render.d.ts +7 -0
- package/dist/src/agent/data-acquisition/render.js +79 -0
- package/dist/src/agent/data-acquisition/scheduler.d.ts +12 -0
- package/dist/src/agent/data-acquisition/scheduler.js +53 -0
- package/dist/src/agent/data-acquisition/schema.d.ts +75 -0
- package/dist/src/agent/data-acquisition/schema.js +206 -0
- package/dist/src/agent/data-acquisition/service.d.ts +10 -0
- package/dist/src/agent/data-acquisition/service.js +292 -0
- package/dist/src/agent/data-acquisition/types.d.ts +37 -0
- package/dist/src/agent/data-acquisition/types.js +5 -0
- package/dist/src/agent/embedded/run-turn.js +16 -4
- package/dist/src/agent/embedded/session-runner.d.ts +1 -0
- package/dist/src/agent/embedded/session-runner.js +3 -0
- package/dist/src/agent/embedded/tool-result-truncation.js +11 -0
- package/dist/src/agent/embedded/xopc-tools-bridge.js +2 -1
- package/dist/src/agent/external-tools/composio-provider.js +12 -1
- package/dist/src/agent/external-tools/gateway-tools.js +2 -1
- package/dist/src/agent/external-tools/index.js +8 -1
- package/dist/src/agent/external-tools/read-policy.d.ts +6 -0
- package/dist/src/agent/external-tools/read-policy.js +21 -0
- package/dist/src/agent/external-tools/service.d.ts +1 -0
- package/dist/src/agent/external-tools/service.js +4 -1
- package/dist/src/agent/external-tools/types.d.ts +2 -0
- package/dist/src/agent/memory/compaction-promotion.d.ts +1 -1
- package/dist/src/agent/memory/compaction-promotion.js +4 -3
- package/dist/src/agent/orchestration/agent-turn-policy.js +25 -10
- package/dist/src/agent/orchestration/delegation-scope.d.ts +9 -0
- package/dist/src/agent/orchestration/delegation-scope.js +11 -0
- package/dist/src/agent/prompt/sections/tooling.js +3 -1
- package/dist/src/agent/prompt/subagent-context.js +4 -2
- package/dist/src/agent/sandbox/fileAccess.d.ts +2 -0
- package/dist/src/agent/sandbox/fileAccess.js +31 -2
- package/dist/src/agent/tools/dataBatch.d.ts +4 -0
- package/dist/src/agent/tools/dataBatch.js +50 -0
- package/dist/src/agent/tools/delegate-tool.d.ts +6 -3
- package/dist/src/agent/tools/delegate-tool.js +65 -48
- package/dist/src/agent/tools/delegation-parent-policy.d.ts +7 -0
- package/dist/src/agent/tools/delegation-parent-policy.js +41 -0
- package/dist/src/agent/tools/delegation-policy.d.ts +16 -0
- package/dist/src/agent/tools/delegation-policy.js +93 -0
- package/dist/src/agent/tools/factory.d.ts +2 -0
- package/dist/src/agent/tools/factory.js +42 -3
- package/dist/src/agent/tools/fetch-text.d.ts +7 -0
- package/dist/src/agent/tools/fetch-text.js +86 -0
- package/dist/src/agent/tools/find.js +1 -1
- package/dist/src/agent/tools/grep.js +11 -23
- package/dist/src/agent/tools/index.d.ts +1 -0
- package/dist/src/agent/tools/index.js +2 -1
- package/dist/src/agent/tools/knowledge-memory-tool.d.ts +1 -1
- package/dist/src/agent/tools/knowledge-memory-tool.js +13 -5
- package/dist/src/agent/tools/read.js +7 -5
- package/dist/src/agent/tools/repository-search.d.ts +12 -2
- package/dist/src/agent/tools/repository-search.js +127 -74
- package/dist/src/agent/tools/user-context-tool.js +17 -7
- package/dist/src/agent/tools/web.js +19 -28
- package/dist/src/agent/workflow/subagent-runner.js +25 -3
- package/dist/src/agent/workflow/workflow-child-tools.js +13 -8
- package/dist/src/agent-config/schema.d.ts +7 -0
- package/dist/src/agent-config/schema.js +2 -0
- package/dist/src/chat-commands/builtins/understanding.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
- package/dist/src/config/schema.d.ts +6 -4
- package/dist/src/config/schema.js +2 -2
- package/dist/src/connectors/connected-source-understanding.d.ts +1 -0
- package/dist/src/connectors/connected-source-understanding.js +1 -0
- package/dist/src/connectors/learning-coordinator.js +31 -9
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/heartbeat/service.js +2 -2
- package/dist/src/gateway/hono/lib/config-payload.d.ts +4 -2
- package/dist/src/gateway/hono/routes/connectors.js +1 -1
- package/dist/src/gateway/hono/routes/context-sources.js +0 -23
- package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
- package/dist/src/gateway/hono/routes/projects.js +8 -0
- package/dist/src/gateway/hono/routes/sessions.js +141 -13
- package/dist/src/gateway/hono/routes/user-model-refresh.d.ts +5 -0
- package/dist/src/gateway/hono/routes/user-model-refresh.js +128 -0
- package/dist/src/gateway/hono/routes/user-model.js +12 -5
- package/dist/src/gateway/hono/routes/work-discovery.js +0 -30
- package/dist/src/gateway/service.js +6 -6
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/infra/update-restart.js +1 -1
- package/dist/src/knowledge/connected-knowledge-pipeline.js +1 -1
- package/dist/src/knowledge-memory/index.js +2 -2
- package/dist/src/knowledge-memory/repository.d.ts +7 -0
- package/dist/src/knowledge-memory/repository.js +58 -8
- package/dist/src/memory-maintenance/service.js +61 -31
- package/dist/src/migrations/memory-config.d.ts +2 -0
- package/dist/src/migrations/memory-config.js +77 -0
- package/dist/src/migrations/runner.js +2 -2
- package/dist/src/notifications/planner.js +5 -5
- package/dist/src/notifications/service.d.ts +2 -2
- package/dist/src/notifications/service.js +1 -1
- package/dist/src/storage/sqlite/index.d.ts +1 -0
- package/dist/src/storage/sqlite/index.js +2 -1
- package/dist/src/storage/sqlite/migrations/184_memory_suppressions.sql +12 -0
- package/dist/src/storage/sqlite/migrations/185_understanding_refresh_batches.sql +6 -0
- package/dist/src/storage/sqlite/migrations/186_sidebar_layout.sql +16 -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/schema.js +1 -1
- package/dist/src/storage/sqlite/sidebar-layout-repository.d.ts +12 -0
- package/dist/src/storage/sqlite/sidebar-layout-repository.js +53 -0
- package/dist/src/user-context/config.d.ts +4 -9
- package/dist/src/user-context/config.js +7 -27
- package/dist/src/user-context/memory-suppression.d.ts +7 -0
- package/dist/src/user-context/memory-suppression.js +23 -0
- package/dist/src/user-context/relationship-continuity.js +1 -1
- package/dist/src/user-context/sources/refresh-service.d.ts +48 -0
- package/dist/src/user-context/sources/refresh-service.js +221 -0
- package/dist/src/user-context/sources/repository.js +1 -1
- package/dist/src/user-model/bootstrap.js +27 -24
- package/dist/src/user-model/capture/executor.d.ts +1 -1
- package/dist/src/user-model/capture/executor.js +17 -11
- package/dist/src/user-model/capture/semantic.js +1 -1
- package/dist/src/user-model/domain.d.ts +6 -2
- package/dist/src/user-model/index.js +3 -3
- package/dist/src/user-model/profile.js +1 -1
- package/dist/src/user-model/repository.d.ts +4 -1
- package/dist/src/user-model/repository.js +96 -6
- package/dist/src/user-model/usage-policy.d.ts +2 -0
- package/dist/src/user-model/usage-policy.js +6 -2
- package/dist/src/work-discovery/project-understanding.js +2 -1
- package/dist/src/work-discovery/service.d.ts +8 -24
- package/dist/src/work-discovery/service.js +138 -180
- package/package.json +1 -1
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-BPsRb9Ck.js +0 -1
- package/dist/gateway/static/root/assets/api-DFOlahZv.js +0 -1
- package/dist/gateway/static/root/assets/automations-workspace-CUpiTTiY.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-CqTxLpil.js +0 -3
- package/dist/gateway/static/root/assets/capabilities-settings-panel-BZ_-pnS6.js +0 -8
- package/dist/gateway/static/root/assets/connector-service-page-CPqVmNvx.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-BUQyg3CW.js +0 -2
- package/dist/gateway/static/root/assets/gateway-realtime-store-BLDgrJ30.js +0 -1
- package/dist/gateway/static/root/assets/home-page-s9hDQ8Hc.js +0 -1
- package/dist/gateway/static/root/assets/index-RBCkv8a_.js +0 -79
- package/dist/gateway/static/root/assets/index-cFU4S35z.css +0 -1
- package/dist/gateway/static/root/assets/messages-F74LVAiU.js +0 -3
- package/dist/gateway/static/root/assets/note-detail-panel-D35sErp2.js +0 -5
- package/dist/gateway/static/root/assets/notes-page-8jCDklDn.js +0 -8
- package/dist/gateway/static/root/assets/project-detail-page-BUMQHy_N.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-DT-Mt7XR.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-Clz3byir.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-tQRwktKm.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-DqWg9XS5.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-BB_sMB7P.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-oDALm4b6.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DmwelnfK.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-BE9JXz4U.js +0 -2
- package/dist/gateway/static/root/assets/task-detail-page-D1AWszc7.js +0 -1
- package/dist/gateway/static/root/assets/user-model-page-C00i4ea0.js +0 -2
- package/dist/gateway/static/root/assets/workflows-page-BUiBjz6m.js +0 -6
- package/dist/src/migrations/knowledge-memory-read-policy-config.d.ts +0 -2
- package/dist/src/migrations/knowledge-memory-read-policy-config.js +0 -48
|
@@ -8,30 +8,33 @@ function statements(values, limit) {
|
|
|
8
8
|
}
|
|
9
9
|
function addExplicitAssertions(values, input, now) {
|
|
10
10
|
let created = 0;
|
|
11
|
-
for (const statement of values)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
11
|
+
for (const statement of values) {
|
|
12
|
+
const result = reconcileAssertion({
|
|
13
|
+
subject: {
|
|
14
|
+
type: "user",
|
|
15
|
+
id: "self"
|
|
16
|
+
},
|
|
17
|
+
predicate: input.predicate,
|
|
18
|
+
cardinality: "multiple",
|
|
19
|
+
scope: { type: "global" },
|
|
20
|
+
kind: input.kind,
|
|
21
|
+
value: statement,
|
|
22
|
+
normalizedValue: statement.toLocaleLowerCase(),
|
|
23
|
+
statement,
|
|
24
|
+
authority: "user_explicit",
|
|
25
|
+
confidence: 1,
|
|
26
|
+
declaredImportance: input.importance,
|
|
27
|
+
inferredImportance: input.importance,
|
|
28
|
+
consequence: "medium",
|
|
29
|
+
actionability: .8,
|
|
30
|
+
volatility: "slow",
|
|
31
|
+
sensitivity: input.kind === "relationship" ? "personal" : "normal",
|
|
32
|
+
disclosurePolicy: "referenceable",
|
|
33
|
+
observedAt: now,
|
|
34
|
+
createdBy: "user"
|
|
35
|
+
}, now, { restoreDeleted: true });
|
|
36
|
+
if (result.assertion && result.action !== "deduplicated") created += 1;
|
|
37
|
+
}
|
|
35
38
|
return created;
|
|
36
39
|
}
|
|
37
40
|
function addRules(category, values) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AssertionStatus } from '../domain.js';
|
|
2
2
|
import type { CaptureEvidence, UserModelInterpretation } from './semantic.js';
|
|
3
3
|
export interface UserModelCapturePolicy {
|
|
4
|
-
write: 'deny' | '
|
|
4
|
+
write: 'deny' | 'allow';
|
|
5
5
|
sensitiveWrite: 'deny' | 'confirm' | 'allow';
|
|
6
6
|
processing: 'local_only' | 'remote_allowed';
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createCollaborationRule, listCollaborationRules } from "../../storage/sqlite/collaboration-rule-repository.js";
|
|
2
2
|
import { createContextEvidence } from "../../storage/sqlite/context-evidence-repository.js";
|
|
3
3
|
import { createUserGoal, listUserGoals } from "../goals.js";
|
|
4
|
-
import { getUserAssertion, linkAssertionEvidence, reconcileAssertion, setAssertionStatus } from "../repository.js";
|
|
4
|
+
import { deleteUserAssertion, getUserAssertion, linkAssertionEvidence, reconcileAssertion, setAssertionStatus } from "../repository.js";
|
|
5
5
|
import { createHash } from "node:crypto";
|
|
6
6
|
//#region src/user-model/capture/executor.ts
|
|
7
7
|
function emptyUserModelCaptureResult() {
|
|
@@ -33,10 +33,7 @@ function executeUserModelInterpretation(input) {
|
|
|
33
33
|
const targets = input.interpretation.targetAssertionIds.flatMap((id) => getUserAssertion(id) ?? []);
|
|
34
34
|
if (input.interpretation.intent === "forget") {
|
|
35
35
|
for (const target of targets) {
|
|
36
|
-
|
|
37
|
-
actor: "user",
|
|
38
|
-
reason: "Explicit user forget request."
|
|
39
|
-
});
|
|
36
|
+
deleteUserAssertion(target.id);
|
|
40
37
|
result.outputs.push({
|
|
41
38
|
candidateKey: target.id,
|
|
42
39
|
assertionId: target.id,
|
|
@@ -100,12 +97,13 @@ function executeUserModelInterpretation(input) {
|
|
|
100
97
|
});
|
|
101
98
|
evidenceIds.set(ref, evidence.id);
|
|
102
99
|
}
|
|
100
|
+
const latestUserRef = input.evidence.filter((item) => item.role === "user").sort((a, b) => b.createdAt - a.createdAt)[0]?.ref;
|
|
103
101
|
const explicitCommand = input.interpretation.intent === "remember" || input.interpretation.intent === "correct";
|
|
104
102
|
for (const source of input.interpretation.candidates) {
|
|
105
103
|
result.proposed += 1;
|
|
106
104
|
const key = candidateKey(source.predicate, source.scope.type, source.scope.id);
|
|
107
|
-
const sensitive = source.sensitivity
|
|
108
|
-
if (input.policy.write === "deny" || sensitive && input.policy.sensitiveWrite === "deny" || !scopeAllowed(source.scope.type, source.scope.id, input.scopeContext)) {
|
|
105
|
+
const sensitive = source.sensitivity !== "normal";
|
|
106
|
+
if (input.policy.write === "deny" || sensitive && (source.authority !== "user_explicit" || input.policy.sensitiveWrite === "deny") || !scopeAllowed(source.scope.type, source.scope.id, input.scopeContext)) {
|
|
109
107
|
result.rejected += 1;
|
|
110
108
|
result.outputs.push({
|
|
111
109
|
candidateKey: key,
|
|
@@ -113,7 +111,7 @@ function executeUserModelInterpretation(input) {
|
|
|
113
111
|
});
|
|
114
112
|
continue;
|
|
115
113
|
}
|
|
116
|
-
const requiresConfirmation = !explicitCommand &&
|
|
114
|
+
const requiresConfirmation = !explicitCommand && sensitive && input.policy.sensitiveWrite === "confirm";
|
|
117
115
|
const refs = source.evidenceRefs.flatMap((ref) => evidenceIds.get(ref) ?? []);
|
|
118
116
|
const applied = reconcileAssertion({
|
|
119
117
|
...source,
|
|
@@ -123,7 +121,15 @@ function executeUserModelInterpretation(input) {
|
|
|
123
121
|
evidenceId: refs[0],
|
|
124
122
|
evidenceConfidence: source.confidence
|
|
125
123
|
} : {}
|
|
126
|
-
});
|
|
124
|
+
}, Date.now(), { restoreDeleted: explicitCommand && source.evidenceRefs.includes(latestUserRef) });
|
|
125
|
+
if (applied.action === "suppressed") {
|
|
126
|
+
result.rejected += 1;
|
|
127
|
+
result.outputs.push({
|
|
128
|
+
candidateKey: key,
|
|
129
|
+
outcome: "rejected"
|
|
130
|
+
});
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
127
133
|
for (const evidenceId of refs.slice(1)) linkAssertionEvidence(applied.assertion.id, evidenceId, "supports", source.confidence);
|
|
128
134
|
result.createdAssertions.push({
|
|
129
135
|
id: applied.assertion.id,
|
|
@@ -158,7 +164,7 @@ function executeUserModelInterpretation(input) {
|
|
|
158
164
|
});
|
|
159
165
|
continue;
|
|
160
166
|
}
|
|
161
|
-
const active = explicitCommand
|
|
167
|
+
const active = explicitCommand;
|
|
162
168
|
const goal = createUserGoal({
|
|
163
169
|
title: source.title,
|
|
164
170
|
desiredOutcome: source.desiredOutcome,
|
|
@@ -200,7 +206,7 @@ function executeUserModelInterpretation(input) {
|
|
|
200
206
|
});
|
|
201
207
|
continue;
|
|
202
208
|
}
|
|
203
|
-
const active = explicitCommand
|
|
209
|
+
const active = explicitCommand;
|
|
204
210
|
const rule = createCollaborationRule({
|
|
205
211
|
category: source.category,
|
|
206
212
|
priority: source.priority,
|
|
@@ -153,7 +153,7 @@ function comparable(value) {
|
|
|
153
153
|
return value.normalize("NFKC").toLocaleLowerCase().replace(/\s+/g, " ").trim();
|
|
154
154
|
}
|
|
155
155
|
function effectiveAuthority(intent, authority) {
|
|
156
|
-
if (intent === "remember" || intent === "correct" || intent === "confirm") return authority;
|
|
156
|
+
if (intent === "remember" || intent === "correct" || intent === "confirm" || intent === "user_assertion") return authority;
|
|
157
157
|
return authority === "user_explicit" ? "user_observed" : authority;
|
|
158
158
|
}
|
|
159
159
|
function parseTime(value) {
|
|
@@ -84,10 +84,14 @@ export interface AssertionCandidate {
|
|
|
84
84
|
correctionOfAssertionId?: string;
|
|
85
85
|
}
|
|
86
86
|
export type ReconciliationAction = 'created' | 'deduplicated' | 'superseded' | 'conflicted';
|
|
87
|
-
export
|
|
87
|
+
export type ReconciliationResult = {
|
|
88
88
|
action: ReconciliationAction;
|
|
89
89
|
assertion: UserAssertion;
|
|
90
90
|
previousAssertion?: UserAssertion;
|
|
91
|
-
}
|
|
91
|
+
} | {
|
|
92
|
+
action: 'suppressed';
|
|
93
|
+
assertion?: undefined;
|
|
94
|
+
previousAssertion?: undefined;
|
|
95
|
+
};
|
|
92
96
|
export declare function validateScope(scope: UserModelScope): void;
|
|
93
97
|
export declare function validateCandidate(candidate: AssertionCandidate): void;
|
|
@@ -2,8 +2,8 @@ import { USER_MODEL_PRINCIPAL_ID, validateCandidate, validateScope } from "./dom
|
|
|
2
2
|
import { calculateExecutionValue } from "./importance.js";
|
|
3
3
|
import { createPriorityWindow, createUserGoal, listPriorityWindows, listUserGoals, setUserGoalStatus } from "./goals.js";
|
|
4
4
|
import { defaultReviewAt, isAssertionValidAt, requiresBoundedValidity, resolveCurrentAssertion } from "./temporal.js";
|
|
5
|
-
import { getActiveAssertionByPredicate, getActiveAssertionForSlot, getAssertionSlot, getUserAssertion, getUserTimezone, linkAssertionEvidence, listSlotAssertions, listUserAssertionSources, listUserAssertions, reconcileAssertion, setAssertionStatus } from "./repository.js";
|
|
5
|
+
import { deleteUserAssertion, getActiveAssertionByPredicate, getActiveAssertionForSlot, getAssertionSlot, getUserAssertion, getUserTimezone, linkAssertionEvidence, listSlotAssertions, listUserAssertionSources, listUserAssertions, reconcileAssertion, setAssertionStatus } from "./repository.js";
|
|
6
6
|
import { applyUserProfilePatch, getUserProfileSnapshot } from "./profile.js";
|
|
7
7
|
import { bootstrapUserModel } from "./bootstrap.js";
|
|
8
|
-
import { isWorkingAssumption } from "./usage-policy.js";
|
|
9
|
-
export { USER_MODEL_PRINCIPAL_ID, applyUserProfilePatch, bootstrapUserModel, calculateExecutionValue, createPriorityWindow, createUserGoal, defaultReviewAt, getActiveAssertionByPredicate, getActiveAssertionForSlot, getAssertionSlot, getUserAssertion, getUserProfileSnapshot, getUserTimezone, isAssertionValidAt, isWorkingAssumption, linkAssertionEvidence, listPriorityWindows, listSlotAssertions, listUserAssertionSources, listUserAssertions, listUserGoals, reconcileAssertion, requiresBoundedValidity, resolveCurrentAssertion, setAssertionStatus, setUserGoalStatus, validateCandidate, validateScope };
|
|
8
|
+
import { canUseAssertion, isWorkingAssumption } from "./usage-policy.js";
|
|
9
|
+
export { USER_MODEL_PRINCIPAL_ID, applyUserProfilePatch, bootstrapUserModel, calculateExecutionValue, canUseAssertion, createPriorityWindow, createUserGoal, defaultReviewAt, deleteUserAssertion, getActiveAssertionByPredicate, getActiveAssertionForSlot, getAssertionSlot, getUserAssertion, getUserProfileSnapshot, getUserTimezone, isAssertionValidAt, isWorkingAssumption, linkAssertionEvidence, listPriorityWindows, listSlotAssertions, listUserAssertionSources, listUserAssertions, listUserGoals, reconcileAssertion, requiresBoundedValidity, resolveCurrentAssertion, setAssertionStatus, setUserGoalStatus, validateCandidate, validateScope };
|
|
@@ -6,7 +6,9 @@ export type UserAssertionSource = {
|
|
|
6
6
|
category?: 'files' | 'recent_documents' | 'calendar' | 'tasks' | 'notes' | 'mail' | 'messages' | 'code_activity';
|
|
7
7
|
observedAt: number;
|
|
8
8
|
};
|
|
9
|
-
export declare function reconcileAssertion(candidate: AssertionCandidate, now?: number
|
|
9
|
+
export declare function reconcileAssertion(candidate: AssertionCandidate, now?: number, options?: {
|
|
10
|
+
restoreDeleted?: boolean;
|
|
11
|
+
}): ReconciliationResult;
|
|
10
12
|
export declare function getUserAssertion(id: string): UserAssertion | undefined;
|
|
11
13
|
export declare function getAssertionSlot(id: string): AssertionSlot | undefined;
|
|
12
14
|
export declare function listSlotAssertions(slotId: string): UserAssertion[];
|
|
@@ -29,3 +31,4 @@ export declare function setAssertionStatus(assertionId: string, status: Assertio
|
|
|
29
31
|
reason: string;
|
|
30
32
|
now?: number;
|
|
31
33
|
}): UserAssertion;
|
|
34
|
+
export declare function deleteUserAssertion(id: string, now?: number): boolean;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
|
|
2
2
|
import { USER_MODEL_PRINCIPAL_ID, validateCandidate, validateScope } from "./domain.js";
|
|
3
|
+
import { clearMemoryAudit, isMemorySuppressed, memoryFingerprint, restoreMemory, suppressMemory } from "../user-context/memory-suppression.js";
|
|
3
4
|
import { defaultReviewAt, requiresBoundedValidity } from "./temporal.js";
|
|
4
5
|
import { basename } from "node:path";
|
|
5
6
|
import { randomUUID } from "node:crypto";
|
|
@@ -136,9 +137,13 @@ function authorityRank(authority) {
|
|
|
136
137
|
user_explicit: 3
|
|
137
138
|
}[authority];
|
|
138
139
|
}
|
|
139
|
-
function reconcileAssertion(candidate, now = Date.now()) {
|
|
140
|
+
function reconcileAssertion(candidate, now = Date.now(), options = {}) {
|
|
140
141
|
validateCandidate(candidate);
|
|
141
142
|
return runSqliteWriteTransaction((db) => {
|
|
143
|
+
if (candidate.authority !== "user_explicit" && candidate.sensitivity !== "normal") return { action: "suppressed" };
|
|
144
|
+
const keys = assertionFingerprints(candidate);
|
|
145
|
+
if (options.restoreDeleted && candidate.authority === "user_explicit") restoreMemory(db, keys);
|
|
146
|
+
if (isMemorySuppressed(db, keys)) return { action: "suppressed" };
|
|
142
147
|
const slot = findOrCreateSlot(db, candidate, now);
|
|
143
148
|
const existing = listReconcilableAssertions(db, slot.id);
|
|
144
149
|
if (candidate.correctionOfAssertionId) {
|
|
@@ -146,14 +151,21 @@ function reconcileAssertion(candidate, now = Date.now()) {
|
|
|
146
151
|
const target = existing.find((item) => item.id === candidate.correctionOfAssertionId);
|
|
147
152
|
if (!target) throw new Error("Correction target does not belong to the resolved assertion slot.");
|
|
148
153
|
if (target.normalizedValue === candidate.normalizedValue.trim()) {
|
|
154
|
+
db.prepare("UPDATE user_assertions SET statement = ?, authority = 'user_explicit', confidence = 1, status = 'active', observed_at = ?, review_at = ? WHERE assertion_id = ?").run(candidate.statement.trim(), candidate.observedAt, defaultReviewAt(candidate.volatility, candidate.observedAt) ?? null, target.id);
|
|
155
|
+
db.prepare("UPDATE user_assertions_fts SET statement = ? WHERE assertion_id = ?").run(candidate.statement.trim(), target.id);
|
|
149
156
|
attachEvidence(db, target.id, candidate, now);
|
|
150
157
|
return {
|
|
151
158
|
action: "deduplicated",
|
|
152
|
-
assertion: target
|
|
159
|
+
assertion: getUserAssertion(target.id)
|
|
153
160
|
};
|
|
154
161
|
}
|
|
162
|
+
if (slot.cardinality === "multiple") suppressMemory(db, assertionFingerprints({
|
|
163
|
+
...target,
|
|
164
|
+
...slot
|
|
165
|
+
}), now);
|
|
155
166
|
const assertion = insertAssertion(db, slot.id, candidate, "active", now, target.id);
|
|
156
|
-
closeValidity(db, target, candidate.
|
|
167
|
+
closeValidity(db, target, candidate.observedAt, now);
|
|
168
|
+
updateStatus(db, target, "archived", "Replaced by user correction.", now);
|
|
157
169
|
return {
|
|
158
170
|
action: "superseded",
|
|
159
171
|
assertion,
|
|
@@ -163,10 +175,12 @@ function reconcileAssertion(candidate, now = Date.now()) {
|
|
|
163
175
|
const overlapping = sortByAuthorityAndRecorded(existing.filter((item) => intervalsOverlap(item, candidate)));
|
|
164
176
|
const duplicate = overlapping.find((item) => item.normalizedValue === candidate.normalizedValue.trim());
|
|
165
177
|
if (duplicate) {
|
|
178
|
+
refreshSupportingObservation(db, duplicate, candidate, now);
|
|
179
|
+
if (candidate.authority === "user_explicit" && (duplicate.authority !== "user_explicit" || candidate.observedAt > duplicate.observedAt)) db.prepare("UPDATE user_assertions SET authority = 'user_explicit', confidence = ?, status = ?, observed_at = ?, review_at = ? WHERE assertion_id = ?").run(candidate.confidence, initialStatus(candidate), candidate.observedAt, candidate.reviewAt ?? defaultReviewAt(candidate.volatility, candidate.observedAt) ?? null, duplicate.id);
|
|
166
180
|
attachEvidence(db, duplicate.id, candidate, now);
|
|
167
181
|
return {
|
|
168
182
|
action: "deduplicated",
|
|
169
|
-
assertion: duplicate
|
|
183
|
+
assertion: getUserAssertion(duplicate.id)
|
|
170
184
|
};
|
|
171
185
|
}
|
|
172
186
|
const status = initialStatus(candidate);
|
|
@@ -345,13 +359,89 @@ function linkAssertionEvidence(assertionId, evidenceId, relation, confidence, no
|
|
|
345
359
|
function setAssertionStatus(assertionId, status, input) {
|
|
346
360
|
const current = getUserAssertion(assertionId);
|
|
347
361
|
if (!current) throw new Error(`User assertion not found: ${assertionId}`);
|
|
348
|
-
if (current.status === status) return current;
|
|
362
|
+
if (current.status === status && !(status === "active" && input.actor === "user" && current.authority !== "user_explicit")) return current;
|
|
349
363
|
const now = input.now ?? Date.now();
|
|
350
364
|
runSqliteWriteTransaction((db) => {
|
|
351
365
|
db.prepare("UPDATE user_assertions SET status = ? WHERE assertion_id = ?").run(status, assertionId);
|
|
366
|
+
if ((status === "rejected" || status === "archived") && input.actor === "user") {
|
|
367
|
+
const slot = getAssertionSlot(current.slotId);
|
|
368
|
+
suppressMemory(db, assertionFingerprints({
|
|
369
|
+
...current,
|
|
370
|
+
...slot
|
|
371
|
+
}), now);
|
|
372
|
+
}
|
|
373
|
+
if (status === "active" && input.actor === "user") db.prepare("UPDATE user_assertions SET authority = 'user_explicit', confidence = 1 WHERE assertion_id = ?").run(assertionId);
|
|
352
374
|
recordStatusEvent(db, assertionId, current.status, status, input.actor, input.reason, now);
|
|
353
375
|
});
|
|
354
376
|
return getUserAssertion(assertionId);
|
|
355
377
|
}
|
|
378
|
+
function assertionFingerprints(candidate) {
|
|
379
|
+
const scope = [
|
|
380
|
+
candidate.principalId ?? "local-owner",
|
|
381
|
+
candidate.scope.type,
|
|
382
|
+
candidate.scope.id ?? ""
|
|
383
|
+
];
|
|
384
|
+
return [memoryFingerprint([
|
|
385
|
+
"assertion-slot",
|
|
386
|
+
...scope,
|
|
387
|
+
candidate.subject.type,
|
|
388
|
+
candidate.subject.id,
|
|
389
|
+
candidate.predicate,
|
|
390
|
+
candidate.cardinality === "single" ? "" : candidate.normalizedValue
|
|
391
|
+
]), memoryFingerprint([
|
|
392
|
+
"assertion-content",
|
|
393
|
+
...scope,
|
|
394
|
+
candidate.statement
|
|
395
|
+
])];
|
|
396
|
+
}
|
|
397
|
+
function deleteUserAssertion(id, now = Date.now()) {
|
|
398
|
+
return runSqliteWriteTransaction((db) => {
|
|
399
|
+
const current = getUserAssertion(id);
|
|
400
|
+
if (!current) return false;
|
|
401
|
+
const slot = getAssertionSlot(current.slotId);
|
|
402
|
+
const rows = db.prepare(`WITH RECURSIVE versions(id) AS (
|
|
403
|
+
SELECT ? UNION SELECT a.assertion_id FROM user_assertions a JOIN versions v
|
|
404
|
+
ON a.supersedes_assertion_id = v.id OR a.assertion_id = (
|
|
405
|
+
SELECT supersedes_assertion_id FROM user_assertions WHERE assertion_id = v.id)
|
|
406
|
+
) SELECT * FROM user_assertions WHERE assertion_id IN (SELECT id FROM versions)
|
|
407
|
+
OR (? = 'single' AND slot_id = ?)`).all(id, slot.cardinality, slot.id);
|
|
408
|
+
const evidenceIds = new Set(rows.flatMap((row) => db.prepare("SELECT evidence_id FROM user_assertion_evidence WHERE assertion_id = ?").all(row.assertion_id).map((evidence) => evidence.evidence_id)));
|
|
409
|
+
for (const row of rows) {
|
|
410
|
+
const assertion = assertionFromRow(row);
|
|
411
|
+
suppressMemory(db, assertionFingerprints({
|
|
412
|
+
...assertion,
|
|
413
|
+
...slot,
|
|
414
|
+
principalId: slot.principalId
|
|
415
|
+
}), now);
|
|
416
|
+
clearMemoryAudit(db, "assertion", assertion.id);
|
|
417
|
+
db.prepare("DELETE FROM user_assertions_fts WHERE assertion_id = ?").run(assertion.id);
|
|
418
|
+
db.prepare(`UPDATE work_discovery_runs SET result_json = json_set(result_json, '$.profileCandidates',
|
|
419
|
+
json((SELECT COALESCE(json_group_array(json(value)), '[]')
|
|
420
|
+
FROM json_each(result_json, '$.profileCandidates')
|
|
421
|
+
WHERE COALESCE(json_extract(value, '$.assertionId'), '') != ?)))
|
|
422
|
+
WHERE EXISTS (SELECT 1 FROM json_each(result_json, '$.profileCandidates')
|
|
423
|
+
WHERE json_extract(value, '$.assertionId') = ?)`).run(assertion.id, assertion.id);
|
|
424
|
+
}
|
|
425
|
+
for (const row of rows) db.prepare("DELETE FROM user_assertions WHERE assertion_id = ?").run(row.assertion_id);
|
|
426
|
+
for (const evidenceId of evidenceIds) db.prepare(`UPDATE context_evidence SET redacted_excerpt = NULL WHERE evidence_id = ?
|
|
427
|
+
AND NOT EXISTS (SELECT 1 FROM user_assertion_evidence WHERE evidence_id = ?)`).run(evidenceId, evidenceId);
|
|
428
|
+
db.prepare(`DELETE FROM user_assertion_slots WHERE slot_id = ?
|
|
429
|
+
AND NOT EXISTS (SELECT 1 FROM user_assertions WHERE slot_id = ?)`).run(slot.id, slot.id);
|
|
430
|
+
return true;
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
function refreshSupportingObservation(db, current, candidate, now) {
|
|
434
|
+
if (!candidate.evidenceId || current.authority === "user_explicit" || ![
|
|
435
|
+
"active",
|
|
436
|
+
"candidate",
|
|
437
|
+
"stale"
|
|
438
|
+
].includes(current.status)) return;
|
|
439
|
+
const evidence = db.prepare(`SELECT observed_at FROM context_evidence WHERE evidence_id = ?
|
|
440
|
+
AND trust_level = 'owner' AND source_type IN ('conversation', 'user', 'connector')`).get(candidate.evidenceId);
|
|
441
|
+
if (!evidence || evidence.observed_at <= current.observedAt || evidence.observed_at > now || candidate.confidence < .7) return;
|
|
442
|
+
const reviewAt = defaultReviewAt(current.volatility, evidence.observed_at);
|
|
443
|
+
db.prepare(`UPDATE user_assertions SET observed_at = ?, review_at = ? WHERE assertion_id = ?`).run(evidence.observed_at, reviewAt ?? null, current.id);
|
|
444
|
+
if (current.status === "stale" && (current.validTo === void 0 || current.validTo >= now)) updateStatus(db, current, "candidate", "Fresh source evidence supports this understanding.", now);
|
|
445
|
+
}
|
|
356
446
|
//#endregion
|
|
357
|
-
export { getActiveAssertionByPredicate, getActiveAssertionForSlot, getAssertionSlot, getUserAssertion, getUserTimezone, linkAssertionEvidence, listSlotAssertions, listUserAssertionSources, listUserAssertions, reconcileAssertion, setAssertionStatus };
|
|
447
|
+
export { deleteUserAssertion, getActiveAssertionByPredicate, getActiveAssertionForSlot, getAssertionSlot, getUserAssertion, getUserTimezone, linkAssertionEvidence, listSlotAssertions, listUserAssertionSources, listUserAssertions, reconcileAssertion, setAssertionStatus };
|
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
import type { UserAssertion } from './domain.js';
|
|
2
|
+
/** Automatic personalization never grants execution authority. */
|
|
2
3
|
export declare function isWorkingAssumption(assertion: UserAssertion): boolean;
|
|
4
|
+
export declare function canUseAssertion(assertion: UserAssertion, asOf?: number): boolean;
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
//#region src/user-model/usage-policy.ts
|
|
2
|
+
/** Automatic personalization never grants execution authority. */
|
|
2
3
|
function isWorkingAssumption(assertion) {
|
|
3
|
-
return assertion.status === "candidate" && (assertion.authority === "user_observed" || assertion.authority === "system_inferred") && assertion.confidence >= .7 && assertion.consequence
|
|
4
|
+
return (assertion.status === "candidate" || assertion.status === "active") && (assertion.authority === "user_observed" || assertion.authority === "system_inferred") && assertion.confidence >= .7 && (assertion.consequence === "low" || assertion.consequence === "medium") && assertion.sensitivity === "normal" && assertion.disclosurePolicy !== "ask_before_reference";
|
|
5
|
+
}
|
|
6
|
+
function canUseAssertion(assertion, asOf = Date.now()) {
|
|
7
|
+
return (assertion.validFrom === void 0 || assertion.validFrom <= asOf) && (assertion.validTo === void 0 || assertion.validTo >= asOf) && (assertion.reviewAt === void 0 || assertion.reviewAt > asOf) && assertion.sensitivity !== "secret" && assertion.sensitivity !== "regulated" && assertion.disclosurePolicy !== "ask_before_reference" && (assertion.status === "active" && assertion.authority === "user_explicit" || isWorkingAssumption(assertion));
|
|
4
8
|
}
|
|
5
9
|
//#endregion
|
|
6
|
-
export { isWorkingAssumption };
|
|
10
|
+
export { canUseAssertion, isWorkingAssumption };
|
|
@@ -31,7 +31,8 @@ function saveProjectUnderstandingOverview(input) {
|
|
|
31
31
|
provider: "project-understanding",
|
|
32
32
|
evidenceRefs: input.evidenceRefs ?? []
|
|
33
33
|
},
|
|
34
|
-
replaceExisting: true
|
|
34
|
+
replaceExisting: true,
|
|
35
|
+
restoreDeleted: input.correctedByUser
|
|
35
36
|
}).item;
|
|
36
37
|
}
|
|
37
38
|
//#endregion
|
|
@@ -62,7 +62,14 @@ export declare class WorkDiscoveryService {
|
|
|
62
62
|
reused?: undefined;
|
|
63
63
|
}>;
|
|
64
64
|
revokeDirectorySource(id: string): import("./types.js").WorkDiscoveryDirectorySource;
|
|
65
|
-
importUnderstandingSources(rawItems: unknown[], processingPolicy: ModelProcessingPolicy, signal?: AbortSignal, runId?: string, rawCheckpoints?: Record<string, unknown
|
|
65
|
+
importUnderstandingSources(rawItems: unknown[], processingPolicy: ModelProcessingPolicy, signal?: AbortSignal, runId?: string, rawCheckpoints?: Record<string, unknown>, refresh?: {
|
|
66
|
+
grantId: string;
|
|
67
|
+
}): Promise<{
|
|
68
|
+
profileCandidates: any[];
|
|
69
|
+
workThreads: import("./types.js").WorkUnderstandingThread[];
|
|
70
|
+
knowledgeCandidates: import("../knowledge-memory/domain.js").KnowledgeItem[];
|
|
71
|
+
sourceStatuses: import("./analyzer.js").UnderstandingSourceAnalysisStatus[];
|
|
72
|
+
} | {
|
|
66
73
|
profileCandidates: any[];
|
|
67
74
|
workThreads: any[];
|
|
68
75
|
knowledgeCandidates: any[];
|
|
@@ -70,21 +77,6 @@ export declare class WorkDiscoveryService {
|
|
|
70
77
|
sourceId: string;
|
|
71
78
|
status: "completed";
|
|
72
79
|
}[];
|
|
73
|
-
} | {
|
|
74
|
-
profileCandidates: {
|
|
75
|
-
status: "pending" | "rejected";
|
|
76
|
-
assertionId: string;
|
|
77
|
-
id: string;
|
|
78
|
-
category: "role" | "responsibility" | "preference" | "routine" | "communication" | "boundary" | "relationship";
|
|
79
|
-
factKey: string;
|
|
80
|
-
statement: string;
|
|
81
|
-
confidence: "high" | "medium" | "low";
|
|
82
|
-
evidence: string[];
|
|
83
|
-
evidenceRefs?: string[];
|
|
84
|
-
}[];
|
|
85
|
-
workThreads: import("./types.js").WorkUnderstandingThread[];
|
|
86
|
-
knowledgeCandidates: import("../knowledge-memory/domain.js").KnowledgeItem[];
|
|
87
|
-
sourceStatuses: import("./analyzer.js").UnderstandingSourceAnalysisStatus[];
|
|
88
80
|
}>;
|
|
89
81
|
rescanDirectorySource(input: {
|
|
90
82
|
id: string;
|
|
@@ -103,14 +95,6 @@ export declare class WorkDiscoveryService {
|
|
|
103
95
|
private publish;
|
|
104
96
|
private execute;
|
|
105
97
|
private persistProfileCandidates;
|
|
106
|
-
updateProfileCandidates(input: {
|
|
107
|
-
runId: string;
|
|
108
|
-
decisions: Array<{
|
|
109
|
-
id: string;
|
|
110
|
-
status: 'accepted' | 'edited' | 'rejected';
|
|
111
|
-
statement?: string;
|
|
112
|
-
}>;
|
|
113
|
-
}): WorkDiscoveryRun | null;
|
|
114
98
|
cancelRun(id: string): WorkDiscoveryRun | null;
|
|
115
99
|
retryRun(id: string): WorkDiscoveryRun | null;
|
|
116
100
|
submitRecognitionFeedback(input: {
|