@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
|
@@ -33,6 +33,7 @@ import { appendConnectorExecutionAudit, claimConnectorWebhookDelivery, completeC
|
|
|
33
33
|
import { deleteSessionRecord, ensureSessionRecord, findConversationIdByTranscriptId, getCurrentTranscriptId, getGlobalSessionStats, getSessionMetadata, getSessionPersistedLevels, incrementSessionStatsOnAppend, init_session_repository, listSessionMetadata, listSessionsByAgent, patchSessionMetadata, resetSessionRecord, resolveSessionAgentId, updateSessionStats } from "./session-repository.js";
|
|
34
34
|
import { getSessionTaskPlan, setSessionTaskPlan } from "./session-task-plan-repository.js";
|
|
35
35
|
import { buildRelationshipPrompt, getRelationshipSettings, isProactiveSupportAllowed, updateRelationshipSettings } from "./relationship-settings-repository.js";
|
|
36
|
+
import { SidebarLayoutConflictError, getSidebarLayout, replaceSidebarLayout, sortBySidebarLayout } from "./sidebar-layout-repository.js";
|
|
36
37
|
import { appendCompactionBoundaryIfUnchanged, appendMediaToAssistantTranscriptEntry, appendTranscriptEntry, findLatestAssistantTranscriptEntryId, listCompactionBoundaries, loadCompactionSourceSnapshot, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, paginateTranscriptMessages, replaceTranscriptRows, restoreBeforeCompactionBoundary, searchSessionTranscript } from "./transcript-repository.js";
|
|
37
38
|
import { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord } from "./notes-repository.js";
|
|
38
39
|
import { deleteNoteAgentContextRecord, getNoteAgentContextRecord, upsertNoteAgentContextRecord } from "./note-agent-context-repository.js";
|
|
@@ -56,4 +57,4 @@ init_session_repository();
|
|
|
56
57
|
init_connector_repository();
|
|
57
58
|
init_connector_account_repository();
|
|
58
59
|
//#endregion
|
|
59
|
-
export { COMPOSER_INPUT_HISTORY_LIMIT, DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, DatabaseSchemaTooOldError, SCHEMA_META_SCHEMA_VERSION_KEY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, acknowledgeHomeAttention, appendCompactionBoundaryIfUnchanged, appendComposerInputHistory, appendConnectorExecutionAudit, appendMediaToAssistantTranscriptEntry, appendTranscriptEntry, applyPendingMigrations, authenticateDeviceAccessToken, bindEndpointPrincipal, buildDefaultSessionMetadata, buildGlobalSessionStats, buildRefreshProofMessage, buildRelationshipPrompt, cancelQueuedSessionInput, claimConnectorWebhookDelivery, claimContextExtractionRun, claimKnowledgeSourceItems, claimNextConnectorLearningJob, claimNextSessionInput, classifyStoredRow, clearComposerInputHistory, clearGatewayIdentityForTest, closeTemporalAssertions, closeXopcDatabase, completeConnectorWebhookDelivery, completeKnowledgeSourceItemSynthesis, consumeClarificationApproval, consumeClarificationResume, consumeConnectorApproval, countKnowledgeSourceItems, createClarificationWait, createCollaborationRule, createConnectorApproval, createContextEvidence, createDevice, createDevicePairingSetup, createEndpointPrincipal, createObjectLinkRecord, createTemporalAssertion, decideConnectorApproval, deleteBrowserTabBinding, deleteBrowserTabBindingsByEndpoint, deleteBrowserTabBindingsByPrincipal, deleteConnectorConnection, deleteConnectorInstallation, deleteEndpointSessionBinding, deleteEndpointSessionBindingsByPrincipal, deleteKnowledgeSourceItems, deleteNoteAgentContextRecord, deleteNoteRecord, deleteObjectLinkRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, enqueueConnectorLearningJob, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findConversationIdByTranscriptId, findLatestAssistantTranscriptEntryId, findSessionInput, finishContextExtractionRun, finishEndpointToolInvocationAudit, finishKnowledgeSyncRun, finishSessionInputRun, getActiveClarification, getActivityEventRecord, getBrowserTabBinding, getBrowserTabBindingById, getCachedConnectorCatalogEntry, getClarification, getClarificationResumeInput, getClarificationSnapshot, getCollaborationRule, getConnectorAccount, getConnectorApproval, getConnectorConnection, getConnectorInstallation, getConnectorSyncPolicy, getConnectorSyncPolicyForConnection, getContextExtractionRun, getCurrentTranscriptId, getDevice, getEndpointPrincipal, getEndpointSessionBinding, getGlobalSessionStats, getInteractionState, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, getNoteAgentContextRecord, getNoteRecord, getOrCreateGatewayIdentity, getRelationshipSettings, getSessionConfig, getSessionInputById, getSessionInputState, getSessionMetadata, getSessionPersistedLevels, getSessionTaskPlan, getSqliteDatabase, getUserPeopleIndexState, getUserPerson, getUserTrustPolicy, getXopcDatabase, hasIndependentExtractionOutput, hasSessionConfig, incrementSessionStatsOnAppend, insertSessionInput, inspectSchemaMigrationStatus, isClarificationSuspended, isDevicePairingSetupActive, isHomeAttentionAcknowledged, isProactiveSupportAllowed, isXopcDatabaseOpen, issueDeviceTokenPair, linkContextObjects, listActiveSessionInputRuns, listActivityRecords, listCachedConnectorCatalogEntries, listCollaborationRules, listCompactionBoundaries, listComposerInputHistory, listConnectorAccounts, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, listConnectorLearningJobs, listConnectorSyncPolicies, listContextExtractionOutputs, listContextExtractionRuns, listContextObjectRelations, listDevices, listEndpointPrincipals, listEndpointToolInvocationAudits, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, listTemporalAssertions, listUserPeople, loadCompactionSourceSnapshot, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, mergeUserPeople, metadataToSessionInsert, mutateQueuedSessionInput, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, pruneBoundedKnowledgeSourceItems, readSchemaVersion, readSchemaVersionForTest, reconcileConnectorAccount, recordActivityEvent, recoverSessionInputState, recoverStaleConnectorLearningJobs, refreshConnectorAccountCurrent, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, replaceLatestSessionTurnAndQueueInput, replaceTranscriptRows, replaceUserPeopleIndex, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveClarification, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreBeforeCompactionBoundary, revokeDevice, revokeEndpointPrincipal, rotateDeviceRefreshToken, runSqliteWriteTransaction, searchSessionTranscript, sessionConfigRowToConfig, sessionRowToMetadata, setBrowserTabBinding, setCollaborationRuleStatus, setConnectorLearningPaused, setEndpointSessionBinding, setInteractionState, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, setSessionConfig, setSessionInputStatus, setSessionTaskPlan, setUserTrustPolicy, signGatewayPayload, startEndpointToolInvocationAudit, startKnowledgeSyncRun, summarizeUserPeople, supersedeActiveClarification, touchEndpointPrincipal, transcriptEntryRowToStoredRow, updateConnectorLearningJob, updateInteractionStateFromMessage, updateRelationshipSettings, updateSessionConfig, updateSessionStats, updateUserPerson, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, upsertConnectorSyncPolicy, upsertKnowledgeSourceItems, upsertNoteAgentContextRecord, upsertNoteRecord, validateLatestSessionTurnTarget };
|
|
60
|
+
export { COMPOSER_INPUT_HISTORY_LIMIT, DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, DatabaseSchemaTooOldError, SCHEMA_META_SCHEMA_VERSION_KEY, SidebarLayoutConflictError, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, acknowledgeHomeAttention, appendCompactionBoundaryIfUnchanged, appendComposerInputHistory, appendConnectorExecutionAudit, appendMediaToAssistantTranscriptEntry, appendTranscriptEntry, applyPendingMigrations, authenticateDeviceAccessToken, bindEndpointPrincipal, buildDefaultSessionMetadata, buildGlobalSessionStats, buildRefreshProofMessage, buildRelationshipPrompt, cancelQueuedSessionInput, claimConnectorWebhookDelivery, claimContextExtractionRun, claimKnowledgeSourceItems, claimNextConnectorLearningJob, claimNextSessionInput, classifyStoredRow, clearComposerInputHistory, clearGatewayIdentityForTest, closeTemporalAssertions, closeXopcDatabase, completeConnectorWebhookDelivery, completeKnowledgeSourceItemSynthesis, consumeClarificationApproval, consumeClarificationResume, consumeConnectorApproval, countKnowledgeSourceItems, createClarificationWait, createCollaborationRule, createConnectorApproval, createContextEvidence, createDevice, createDevicePairingSetup, createEndpointPrincipal, createObjectLinkRecord, createTemporalAssertion, decideConnectorApproval, deleteBrowserTabBinding, deleteBrowserTabBindingsByEndpoint, deleteBrowserTabBindingsByPrincipal, deleteConnectorConnection, deleteConnectorInstallation, deleteEndpointSessionBinding, deleteEndpointSessionBindingsByPrincipal, deleteKnowledgeSourceItems, deleteNoteAgentContextRecord, deleteNoteRecord, deleteObjectLinkRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, enqueueConnectorLearningJob, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findConversationIdByTranscriptId, findLatestAssistantTranscriptEntryId, findSessionInput, finishContextExtractionRun, finishEndpointToolInvocationAudit, finishKnowledgeSyncRun, finishSessionInputRun, getActiveClarification, getActivityEventRecord, getBrowserTabBinding, getBrowserTabBindingById, getCachedConnectorCatalogEntry, getClarification, getClarificationResumeInput, getClarificationSnapshot, getCollaborationRule, getConnectorAccount, getConnectorApproval, getConnectorConnection, getConnectorInstallation, getConnectorSyncPolicy, getConnectorSyncPolicyForConnection, getContextExtractionRun, getCurrentTranscriptId, getDevice, getEndpointPrincipal, getEndpointSessionBinding, getGlobalSessionStats, getInteractionState, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, getNoteAgentContextRecord, getNoteRecord, getOrCreateGatewayIdentity, getRelationshipSettings, getSessionConfig, getSessionInputById, getSessionInputState, getSessionMetadata, getSessionPersistedLevels, getSessionTaskPlan, getSidebarLayout, getSqliteDatabase, getUserPeopleIndexState, getUserPerson, getUserTrustPolicy, getXopcDatabase, hasIndependentExtractionOutput, hasSessionConfig, incrementSessionStatsOnAppend, insertSessionInput, inspectSchemaMigrationStatus, isClarificationSuspended, isDevicePairingSetupActive, isHomeAttentionAcknowledged, isProactiveSupportAllowed, isXopcDatabaseOpen, issueDeviceTokenPair, linkContextObjects, listActiveSessionInputRuns, listActivityRecords, listCachedConnectorCatalogEntries, listCollaborationRules, listCompactionBoundaries, listComposerInputHistory, listConnectorAccounts, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, listConnectorLearningJobs, listConnectorSyncPolicies, listContextExtractionOutputs, listContextExtractionRuns, listContextObjectRelations, listDevices, listEndpointPrincipals, listEndpointToolInvocationAudits, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, listTemporalAssertions, listUserPeople, loadCompactionSourceSnapshot, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, mergeUserPeople, metadataToSessionInsert, mutateQueuedSessionInput, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, pruneBoundedKnowledgeSourceItems, readSchemaVersion, readSchemaVersionForTest, reconcileConnectorAccount, recordActivityEvent, recoverSessionInputState, recoverStaleConnectorLearningJobs, refreshConnectorAccountCurrent, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, replaceLatestSessionTurnAndQueueInput, replaceSidebarLayout, replaceTranscriptRows, replaceUserPeopleIndex, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveClarification, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreBeforeCompactionBoundary, revokeDevice, revokeEndpointPrincipal, rotateDeviceRefreshToken, runSqliteWriteTransaction, searchSessionTranscript, sessionConfigRowToConfig, sessionRowToMetadata, setBrowserTabBinding, setCollaborationRuleStatus, setConnectorLearningPaused, setEndpointSessionBinding, setInteractionState, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, setSessionConfig, setSessionInputStatus, setSessionTaskPlan, setUserTrustPolicy, signGatewayPayload, sortBySidebarLayout, startEndpointToolInvocationAudit, startKnowledgeSyncRun, summarizeUserPeople, supersedeActiveClarification, touchEndpointPrincipal, transcriptEntryRowToStoredRow, updateConnectorLearningJob, updateInteractionStateFromMessage, updateRelationshipSettings, updateSessionConfig, updateSessionStats, updateUserPerson, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, upsertConnectorSyncPolicy, upsertKnowledgeSourceItems, upsertNoteAgentContextRecord, upsertNoteRecord, validateLatestSessionTurnTarget };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
CREATE TABLE memory_suppressions (
|
|
2
|
+
fingerprint TEXT PRIMARY KEY,
|
|
3
|
+
created_at INTEGER NOT NULL
|
|
4
|
+
);
|
|
5
|
+
|
|
6
|
+
UPDATE notification_events SET
|
|
7
|
+
event_type = 'work_discovery.completed',
|
|
8
|
+
dedupe_key = replace(dedupe_key, 'work_discovery.review_ready:', 'work_discovery.completed:'),
|
|
9
|
+
title_en = 'Understanding updated', title_zh = '用户理解已更新',
|
|
10
|
+
body_en = 'See what xopc learned. You can edit or delete it anytime.',
|
|
11
|
+
body_zh = '理解已自动整理,可随时查看、修改或删除。'
|
|
12
|
+
WHERE event_type = 'work_discovery.review_ready';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
CREATE TABLE sidebar_layouts (
|
|
2
|
+
container_id TEXT PRIMARY KEY,
|
|
3
|
+
revision INTEGER NOT NULL DEFAULT 0,
|
|
4
|
+
updated_at INTEGER NOT NULL
|
|
5
|
+
);
|
|
6
|
+
|
|
7
|
+
CREATE TABLE sidebar_positions (
|
|
8
|
+
container_id TEXT NOT NULL REFERENCES sidebar_layouts(container_id) ON DELETE CASCADE,
|
|
9
|
+
item_id TEXT NOT NULL,
|
|
10
|
+
position INTEGER NOT NULL,
|
|
11
|
+
PRIMARY KEY (container_id, item_id),
|
|
12
|
+
UNIQUE (container_id, position)
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
CREATE INDEX idx_sidebar_positions_order
|
|
16
|
+
ON sidebar_positions(container_id, position);
|
|
@@ -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 = 165;
|
|
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 = 186;
|
|
7
7
|
export declare function resolveMigrationsDir(override?: string): string;
|
|
8
8
|
/**
|
|
9
9
|
* Apply sequential SQL migrations from (currentVersion + 1) through targetVersion.
|
|
@@ -63,7 +63,7 @@ function applySingleMigration(db, migration) {
|
|
|
63
63
|
* Each step runs in its own transaction and updates schema_meta on success.
|
|
64
64
|
*/
|
|
65
65
|
function applyPendingMigrations(db, options = {}) {
|
|
66
|
-
const targetVersion = options.targetVersion ??
|
|
66
|
+
const targetVersion = options.targetVersion ?? 186;
|
|
67
67
|
let currentVersion = readSchemaVersion(db);
|
|
68
68
|
if (currentVersion > targetVersion) throw new DatabaseSchemaTooNewError(currentVersion, targetVersion);
|
|
69
69
|
if (!options.migrationsDir && currentVersion < 165) throw new DatabaseSchemaTooOldError(currentVersion, 165);
|
|
@@ -118,7 +118,7 @@ function applyPendingMigrations(db, options = {}) {
|
|
|
118
118
|
}
|
|
119
119
|
/** Inspect schema version without mutating the database. */
|
|
120
120
|
function inspectSchemaMigrationStatus(db, options = {}) {
|
|
121
|
-
const appVersion = options.targetVersion ??
|
|
121
|
+
const appVersion = options.targetVersion ?? 186;
|
|
122
122
|
const dbVersion = readSchemaVersion(db);
|
|
123
123
|
if (dbVersion > appVersion) return {
|
|
124
124
|
dbVersion,
|
|
@@ -157,7 +157,7 @@ var init_runner = __esmMin((() => {
|
|
|
157
157
|
init_errors();
|
|
158
158
|
log = createLogger("Sqlite:Migrations");
|
|
159
159
|
XOPC_DB_BASELINE_SCHEMA_VERSION = 165;
|
|
160
|
-
XOPC_DB_SCHEMA_VERSION =
|
|
160
|
+
XOPC_DB_SCHEMA_VERSION = 186;
|
|
161
161
|
MODULE_DIR = dirname(fileURLToPath(import.meta.url));
|
|
162
162
|
}));
|
|
163
163
|
//#endregion
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type SidebarLayout = {
|
|
2
|
+
containerId: string;
|
|
3
|
+
itemIds: string[];
|
|
4
|
+
revision: number;
|
|
5
|
+
};
|
|
6
|
+
export declare class SidebarLayoutConflictError extends Error {
|
|
7
|
+
readonly current: SidebarLayout;
|
|
8
|
+
constructor(current: SidebarLayout);
|
|
9
|
+
}
|
|
10
|
+
export declare function getSidebarLayout(containerId: string): SidebarLayout;
|
|
11
|
+
export declare function replaceSidebarLayout(containerId: string, itemIds: string[], expectedRevision: number): SidebarLayout;
|
|
12
|
+
export declare function sortBySidebarLayout<T>(items: T[], layout: SidebarLayout, idOf: (item: T) => string): T[];
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "./transaction.js";
|
|
2
|
+
//#region src/storage/sqlite/sidebar-layout-repository.ts
|
|
3
|
+
init_transaction();
|
|
4
|
+
var SidebarLayoutConflictError = class extends Error {
|
|
5
|
+
constructor(current) {
|
|
6
|
+
super("Sidebar layout changed in another window");
|
|
7
|
+
this.current = current;
|
|
8
|
+
this.name = "SidebarLayoutConflictError";
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
function getSidebarLayout(containerId) {
|
|
12
|
+
const db = getSqliteDatabase();
|
|
13
|
+
const row = db.prepare("SELECT revision FROM sidebar_layouts WHERE container_id = ?").get(containerId);
|
|
14
|
+
return {
|
|
15
|
+
containerId,
|
|
16
|
+
itemIds: db.prepare("SELECT item_id FROM sidebar_positions WHERE container_id = ? ORDER BY position ASC").all(containerId).map((position) => position.item_id),
|
|
17
|
+
revision: row?.revision ?? 0
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function replaceSidebarLayout(containerId, itemIds, expectedRevision) {
|
|
21
|
+
return runSqliteWriteTransaction((db) => {
|
|
22
|
+
const current = getSidebarLayout(containerId);
|
|
23
|
+
if (current.revision !== expectedRevision) throw new SidebarLayoutConflictError(current);
|
|
24
|
+
const uniqueItemIds = [...new Set(itemIds)];
|
|
25
|
+
const nextRevision = current.revision + 1;
|
|
26
|
+
db.prepare(`INSERT INTO sidebar_layouts (container_id, revision, updated_at) VALUES (?, ?, ?)
|
|
27
|
+
ON CONFLICT(container_id) DO UPDATE SET revision = excluded.revision, updated_at = excluded.updated_at`).run(containerId, nextRevision, Date.now());
|
|
28
|
+
db.prepare("DELETE FROM sidebar_positions WHERE container_id = ?").run(containerId);
|
|
29
|
+
const insert = db.prepare("INSERT INTO sidebar_positions (container_id, item_id, position) VALUES (?, ?, ?)");
|
|
30
|
+
uniqueItemIds.forEach((itemId, position) => insert.run(containerId, itemId, position));
|
|
31
|
+
return {
|
|
32
|
+
containerId,
|
|
33
|
+
itemIds: uniqueItemIds,
|
|
34
|
+
revision: nextRevision
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function sortBySidebarLayout(items, layout, idOf) {
|
|
39
|
+
if (layout.itemIds.length === 0) return items;
|
|
40
|
+
const ranks = new Map(layout.itemIds.map((id, index) => [id, index]));
|
|
41
|
+
return items.map((item, index) => ({
|
|
42
|
+
item,
|
|
43
|
+
index,
|
|
44
|
+
rank: ranks.get(idOf(item))
|
|
45
|
+
})).sort((a, b) => {
|
|
46
|
+
if (a.rank !== void 0 && b.rank !== void 0) return a.rank - b.rank;
|
|
47
|
+
if (a.rank !== void 0) return 1;
|
|
48
|
+
if (b.rank !== void 0) return -1;
|
|
49
|
+
return a.index - b.index;
|
|
50
|
+
}).map(({ item }) => item);
|
|
51
|
+
}
|
|
52
|
+
//#endregion
|
|
53
|
+
export { SidebarLayoutConflictError, getSidebarLayout, replaceSidebarLayout, sortBySidebarLayout };
|
|
@@ -39,7 +39,6 @@ export declare const UserModelConfigSchema: z.ZodDefault<z.ZodObject<{
|
|
|
39
39
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
40
40
|
writePolicy: z.ZodDefault<z.ZodEnum<{
|
|
41
41
|
allow: "allow";
|
|
42
|
-
confirm: "confirm";
|
|
43
42
|
deny: "deny";
|
|
44
43
|
}>>;
|
|
45
44
|
sensitiveWritePolicy: z.ZodDefault<z.ZodEnum<{
|
|
@@ -76,12 +75,10 @@ export declare const UserModelConfigSchema: z.ZodDefault<z.ZodObject<{
|
|
|
76
75
|
staleRetentionDays: z.ZodDefault<z.ZodNumber>;
|
|
77
76
|
}, z.core.$strict>>;
|
|
78
77
|
}, z.core.$strict>>;
|
|
79
|
-
export declare
|
|
80
|
-
export declare const KnowledgeMemoryConfigSchema: z.ZodDefault<z.ZodPreprocess<z.ZodObject<{
|
|
78
|
+
export declare const KnowledgeMemoryConfigSchema: z.ZodDefault<z.ZodObject<{
|
|
81
79
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
82
80
|
writePolicy: z.ZodDefault<z.ZodEnum<{
|
|
83
81
|
allow: "allow";
|
|
84
|
-
confirm: "confirm";
|
|
85
82
|
deny: "deny";
|
|
86
83
|
}>>;
|
|
87
84
|
readScopes: z.ZodDefault<z.ZodArray<z.ZodEnum<{
|
|
@@ -114,7 +111,7 @@ export declare const KnowledgeMemoryConfigSchema: z.ZodDefault<z.ZodPreprocess<z
|
|
|
114
111
|
allowExternalWrites: z.ZodDefault<z.ZodBoolean>;
|
|
115
112
|
allowedProviderIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
116
113
|
autoWriteKinds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
117
|
-
}, z.core.$strict
|
|
114
|
+
}, z.core.$strict>>;
|
|
118
115
|
export declare const ContextPlanningConfigSchema: z.ZodDefault<z.ZodObject<{
|
|
119
116
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
120
117
|
maxAssertions: z.ZodDefault<z.ZodNumber>;
|
|
@@ -152,7 +149,6 @@ export declare const UserContextConfigSchema: z.ZodDefault<z.ZodObject<{
|
|
|
152
149
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
153
150
|
writePolicy: z.ZodDefault<z.ZodEnum<{
|
|
154
151
|
allow: "allow";
|
|
155
|
-
confirm: "confirm";
|
|
156
152
|
deny: "deny";
|
|
157
153
|
}>>;
|
|
158
154
|
sensitiveWritePolicy: z.ZodDefault<z.ZodEnum<{
|
|
@@ -189,11 +185,10 @@ export declare const UserContextConfigSchema: z.ZodDefault<z.ZodObject<{
|
|
|
189
185
|
staleRetentionDays: z.ZodDefault<z.ZodNumber>;
|
|
190
186
|
}, z.core.$strict>>;
|
|
191
187
|
}, z.core.$strict>>;
|
|
192
|
-
knowledgeMemory: z.ZodDefault<z.
|
|
188
|
+
knowledgeMemory: z.ZodDefault<z.ZodObject<{
|
|
193
189
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
194
190
|
writePolicy: z.ZodDefault<z.ZodEnum<{
|
|
195
191
|
allow: "allow";
|
|
196
|
-
confirm: "confirm";
|
|
197
192
|
deny: "deny";
|
|
198
193
|
}>>;
|
|
199
194
|
readScopes: z.ZodDefault<z.ZodArray<z.ZodEnum<{
|
|
@@ -226,7 +221,7 @@ export declare const UserContextConfigSchema: z.ZodDefault<z.ZodObject<{
|
|
|
226
221
|
allowExternalWrites: z.ZodDefault<z.ZodBoolean>;
|
|
227
222
|
allowedProviderIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
228
223
|
autoWriteKinds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
229
|
-
}, z.core.$strict
|
|
224
|
+
}, z.core.$strict>>;
|
|
230
225
|
contextPlanning: z.ZodDefault<z.ZodObject<{
|
|
231
226
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
232
227
|
maxAssertions: z.ZodDefault<z.ZodNumber>;
|
|
@@ -10,26 +10,6 @@ function isValidTimeZone(value) {
|
|
|
10
10
|
return false;
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
|
-
function normalizeKnowledgeMemoryConfigInput(input) {
|
|
14
|
-
if (!input || typeof input !== "object" || Array.isArray(input)) return input;
|
|
15
|
-
const memory = input;
|
|
16
|
-
if (!Array.isArray(memory.sources)) return input;
|
|
17
|
-
const oldSources = memory.sources.filter((source) => typeof source === "string");
|
|
18
|
-
const visibilityScopes = new Set([
|
|
19
|
-
"session",
|
|
20
|
-
"workspace",
|
|
21
|
-
"project"
|
|
22
|
-
]);
|
|
23
|
-
const normalized = { ...memory };
|
|
24
|
-
if (!Array.isArray(normalized.readScopes)) normalized.readScopes = oldSources.filter((source) => visibilityScopes.has(source));
|
|
25
|
-
if (!Array.isArray(normalized.contentSources)) normalized.contentSources = [
|
|
26
|
-
...oldSources.some((source) => visibilityScopes.has(source)) ? ["memory"] : [],
|
|
27
|
-
...oldSources.includes("workspace") ? ["local_import"] : [],
|
|
28
|
-
...oldSources.includes("connector") ? ["connector"] : []
|
|
29
|
-
];
|
|
30
|
-
delete normalized.sources;
|
|
31
|
-
return normalized;
|
|
32
|
-
}
|
|
33
13
|
function resolveKnowledgeReadPolicy(config) {
|
|
34
14
|
return {
|
|
35
15
|
scopes: config.readScopes,
|
|
@@ -82,7 +62,7 @@ var init_config = __esmMin((() => {
|
|
|
82
62
|
MaintenanceTimeSchema = z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/, "Expected time in HH:mm format");
|
|
83
63
|
UserModelConfigSchema = z.object({
|
|
84
64
|
enabled: z.boolean().default(true),
|
|
85
|
-
writePolicy:
|
|
65
|
+
writePolicy: z.enum(["deny", "allow"]).default("allow"),
|
|
86
66
|
sensitiveWritePolicy: WritePolicySchema.default("confirm"),
|
|
87
67
|
processingPolicy: z.enum(["local_only", "remote_allowed"]).default("remote_allowed"),
|
|
88
68
|
extraction: z.object({
|
|
@@ -124,7 +104,7 @@ var init_config = __esmMin((() => {
|
|
|
124
104
|
})
|
|
125
105
|
}).strict().default({
|
|
126
106
|
enabled: true,
|
|
127
|
-
writePolicy: "
|
|
107
|
+
writePolicy: "allow",
|
|
128
108
|
sensitiveWritePolicy: "confirm",
|
|
129
109
|
processingPolicy: "remote_allowed",
|
|
130
110
|
extraction: {
|
|
@@ -143,9 +123,9 @@ var init_config = __esmMin((() => {
|
|
|
143
123
|
staleRetentionDays: 30
|
|
144
124
|
}
|
|
145
125
|
});
|
|
146
|
-
KnowledgeMemoryConfigSchema = z.
|
|
126
|
+
KnowledgeMemoryConfigSchema = z.object({
|
|
147
127
|
enabled: z.boolean().default(true),
|
|
148
|
-
writePolicy:
|
|
128
|
+
writePolicy: z.enum(["deny", "allow"]).default("allow"),
|
|
149
129
|
readScopes: z.array(z.enum([
|
|
150
130
|
"global",
|
|
151
131
|
"agent",
|
|
@@ -182,9 +162,9 @@ var init_config = __esmMin((() => {
|
|
|
182
162
|
allowExternalWrites: z.boolean().default(false),
|
|
183
163
|
allowedProviderIds: z.array(z.string().min(1)).optional(),
|
|
184
164
|
autoWriteKinds: z.array(z.string().min(1)).optional()
|
|
185
|
-
}).strict()
|
|
165
|
+
}).strict().default({
|
|
186
166
|
enabled: true,
|
|
187
|
-
writePolicy: "
|
|
167
|
+
writePolicy: "allow",
|
|
188
168
|
readScopes: [
|
|
189
169
|
"global",
|
|
190
170
|
"agent",
|
|
@@ -227,4 +207,4 @@ var init_config = __esmMin((() => {
|
|
|
227
207
|
}));
|
|
228
208
|
//#endregion
|
|
229
209
|
init_config();
|
|
230
|
-
export { ContextCompactionPolicySchema, ContextPlanningConfigSchema, DEFAULT_CONTEXT_COMPACTION_POLICY, KnowledgeMemoryConfigSchema, UserContextConfigSchema, UserModelConfigSchema, init_config,
|
|
210
|
+
export { ContextCompactionPolicySchema, ContextPlanningConfigSchema, DEFAULT_CONTEXT_COMPACTION_POLICY, KnowledgeMemoryConfigSchema, UserContextConfigSchema, UserModelConfigSchema, init_config, resolveKnowledgeReadPolicy };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { DatabaseSync } from 'node:sqlite';
|
|
2
|
+
export declare function memoryFingerprint(parts: unknown[]): string;
|
|
3
|
+
export declare function isMemorySuppressed(db: DatabaseSync, fingerprints: string[]): boolean;
|
|
4
|
+
export declare function suppressMemory(db: DatabaseSync, fingerprints: string[], now: number): void;
|
|
5
|
+
export declare function restoreMemory(db: DatabaseSync, fingerprints: string[]): void;
|
|
6
|
+
/** Remove cached decisions containing deleted content; retain only unrelated audit rows. */
|
|
7
|
+
export declare function clearMemoryAudit(db: DatabaseSync, type: 'assertion' | 'knowledge', id: string): void;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
//#region src/user-context/memory-suppression.ts
|
|
3
|
+
function memoryFingerprint(parts) {
|
|
4
|
+
const normalized = parts.map((part) => typeof part === "string" ? part.normalize("NFKC").toLowerCase().replace(/\s+/g, " ").trim() : part);
|
|
5
|
+
return createHash("sha256").update(JSON.stringify(normalized)).digest("hex");
|
|
6
|
+
}
|
|
7
|
+
function isMemorySuppressed(db, fingerprints) {
|
|
8
|
+
return fingerprints.some((key) => db.prepare("SELECT 1 FROM memory_suppressions WHERE fingerprint = ?").get(key));
|
|
9
|
+
}
|
|
10
|
+
function suppressMemory(db, fingerprints, now) {
|
|
11
|
+
const insert = db.prepare("INSERT OR IGNORE INTO memory_suppressions (fingerprint, created_at) VALUES (?, ?)");
|
|
12
|
+
for (const key of fingerprints) insert.run(key, now);
|
|
13
|
+
}
|
|
14
|
+
function restoreMemory(db, fingerprints) {
|
|
15
|
+
for (const key of fingerprints) db.prepare("DELETE FROM memory_suppressions WHERE fingerprint = ?").run(key);
|
|
16
|
+
}
|
|
17
|
+
/** Remove cached decisions containing deleted content; retain only unrelated audit rows. */
|
|
18
|
+
function clearMemoryAudit(db, type, id) {
|
|
19
|
+
db.prepare("DELETE FROM memory_maintenance_decisions WHERE object_type = ? AND object_id = ?").run(type, id);
|
|
20
|
+
db.prepare("DELETE FROM execution_context_items WHERE object_type = ? AND object_id = ?").run(type, id);
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
export { clearMemoryAudit, isMemorySuppressed, memoryFingerprint, restoreMemory, suppressMemory };
|
|
@@ -62,7 +62,7 @@ function recordExplicitRelationshipFollowUp(input) {
|
|
|
62
62
|
createdBy: "user",
|
|
63
63
|
evidenceId: evidence.id,
|
|
64
64
|
evidenceConfidence: 1
|
|
65
|
-
}, now).assertion;
|
|
65
|
+
}, now, { restoreDeleted: true }).assertion ?? null;
|
|
66
66
|
}
|
|
67
67
|
//#endregion
|
|
68
68
|
export { extractExplicitRelationshipFollowUp, recordExplicitRelationshipFollowUp };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { UnderstandingSourceGrant, UnderstandingSourceItem, UnderstandingSourceRun } from './types.js';
|
|
2
|
+
export type RefreshProgress = {
|
|
3
|
+
status: UnderstandingSourceRun['status'];
|
|
4
|
+
phase: 'queued' | 'waiting_desktop' | 'reading' | 'analyzing' | 'completed';
|
|
5
|
+
added?: number;
|
|
6
|
+
updated?: number;
|
|
7
|
+
itemsSeen?: number;
|
|
8
|
+
error?: string;
|
|
9
|
+
};
|
|
10
|
+
export type RefreshSourceRun = UnderstandingSourceRun & {
|
|
11
|
+
adapterId: string;
|
|
12
|
+
displayName: string;
|
|
13
|
+
};
|
|
14
|
+
export type RefreshBatch = {
|
|
15
|
+
id: string;
|
|
16
|
+
status: 'running' | 'completed' | 'partial' | 'failed';
|
|
17
|
+
sources: RefreshSourceRun[];
|
|
18
|
+
createdAt: number;
|
|
19
|
+
};
|
|
20
|
+
export interface UnderstandingRefreshDeps {
|
|
21
|
+
enabled(): boolean;
|
|
22
|
+
start(grant: UnderstandingSourceGrant, runId: string): Promise<Record<string, unknown>>;
|
|
23
|
+
progress(run: UnderstandingSourceRun): RefreshProgress | undefined;
|
|
24
|
+
analyzeDesktop(grant: UnderstandingSourceGrant, items: UnderstandingSourceItem[], signal: AbortSignal): Promise<{
|
|
25
|
+
added?: number;
|
|
26
|
+
updated?: number;
|
|
27
|
+
}>;
|
|
28
|
+
emit?(type: string, payload: unknown): void;
|
|
29
|
+
}
|
|
30
|
+
/** Coordinates existing source executors; the source run remains the authority for progress. */
|
|
31
|
+
export declare class UnderstandingRefreshService {
|
|
32
|
+
private readonly deps;
|
|
33
|
+
private readonly owner;
|
|
34
|
+
private readonly starting;
|
|
35
|
+
private readonly analyzing;
|
|
36
|
+
constructor(deps: UnderstandingRefreshDeps);
|
|
37
|
+
start(sourceIds?: string[]): RefreshBatch;
|
|
38
|
+
sources(): RefreshSourceRun[];
|
|
39
|
+
latest(): RefreshBatch | null;
|
|
40
|
+
get(id: string): RefreshBatch | null;
|
|
41
|
+
private update;
|
|
42
|
+
private reconcile;
|
|
43
|
+
private dispatch;
|
|
44
|
+
submitDesktop(runId: string, input: {
|
|
45
|
+
items: UnderstandingSourceItem[];
|
|
46
|
+
error?: string;
|
|
47
|
+
}): void;
|
|
48
|
+
}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { createLogger } from "../../utils/logger/index.js";
|
|
2
|
+
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "../../storage/sqlite/transaction.js";
|
|
4
|
+
import { createUnderstandingSourceRun, getUnderstandingSourceGrant, getUnderstandingSourceRun, listUnderstandingSourceGrants, listUnderstandingSourceRuns, updateUnderstandingSourceRun } from "./repository.js";
|
|
5
|
+
import { randomUUID } from "node:crypto";
|
|
6
|
+
//#region src/user-context/sources/refresh-service.ts
|
|
7
|
+
init_transaction();
|
|
8
|
+
init_logger();
|
|
9
|
+
const log = createLogger("UnderstandingRefresh");
|
|
10
|
+
const ACTIVE = new Set(["queued", "running"]);
|
|
11
|
+
const DESKTOP_WAIT_MS = 12e4;
|
|
12
|
+
const ANALYSIS_TIMEOUT_MS = 18e4;
|
|
13
|
+
/** Coordinates existing source executors; the source run remains the authority for progress. */
|
|
14
|
+
var UnderstandingRefreshService = class {
|
|
15
|
+
owner = randomUUID();
|
|
16
|
+
starting = /* @__PURE__ */ new Set();
|
|
17
|
+
analyzing = /* @__PURE__ */ new Set();
|
|
18
|
+
constructor(deps) {
|
|
19
|
+
this.deps = deps;
|
|
20
|
+
}
|
|
21
|
+
start(sourceIds) {
|
|
22
|
+
if (!this.deps.enabled()) throw new Error("User understanding is disabled.");
|
|
23
|
+
const grants = listUnderstandingSourceGrants();
|
|
24
|
+
const selected = sourceIds === void 0 ? grants : [...new Set(sourceIds)].map((id) => {
|
|
25
|
+
const grant = grants.find((item) => item.id === id);
|
|
26
|
+
if (!grant) throw new Error("An authorized source was not found.");
|
|
27
|
+
return grant;
|
|
28
|
+
});
|
|
29
|
+
if (!selected.length || selected.length > 100) throw new Error("Select between 1 and 100 authorized sources.");
|
|
30
|
+
const id = randomUUID();
|
|
31
|
+
const createdAt = Date.now();
|
|
32
|
+
const runs = runSqliteWriteTransaction((db) => {
|
|
33
|
+
const runs = selected.map((grant) => {
|
|
34
|
+
return listUnderstandingSourceRuns(grant.id, 100).find((run) => run.metadata.refresh === true && ACTIVE.has(this.reconcile(run).status)) ?? createUnderstandingSourceRun({
|
|
35
|
+
grantId: grant.id,
|
|
36
|
+
kind: "incremental",
|
|
37
|
+
status: "queued",
|
|
38
|
+
metadata: {
|
|
39
|
+
refresh: true,
|
|
40
|
+
owner: this.owner,
|
|
41
|
+
phase: "queued",
|
|
42
|
+
adapterId: grant.adapterId,
|
|
43
|
+
displayName: grant.displayName,
|
|
44
|
+
processingPolicy: grant.processingPolicy
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
db.prepare("INSERT INTO understanding_refresh_batches (batch_id, source_run_ids_json, created_at) VALUES (?, ?, ?)").run(id, JSON.stringify(runs.map((run) => run.id)), createdAt);
|
|
49
|
+
return runs;
|
|
50
|
+
});
|
|
51
|
+
for (const run of runs) if (run.status === "queued" && !this.starting.has(run.id)) this.dispatch(run);
|
|
52
|
+
return this.get(id);
|
|
53
|
+
}
|
|
54
|
+
sources() {
|
|
55
|
+
return listUnderstandingSourceGrants().flatMap((grant) => {
|
|
56
|
+
const saved = listUnderstandingSourceRuns(grant.id, 100).find((run) => run.metadata.refresh === true);
|
|
57
|
+
if (!saved) return [];
|
|
58
|
+
return [{
|
|
59
|
+
...this.reconcile(saved),
|
|
60
|
+
adapterId: grant.adapterId,
|
|
61
|
+
displayName: grant.displayName
|
|
62
|
+
}];
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
latest() {
|
|
66
|
+
const row = getSqliteDatabase().prepare("SELECT batch_id FROM understanding_refresh_batches ORDER BY created_at DESC, rowid DESC LIMIT 1").get();
|
|
67
|
+
return row ? this.get(row.batch_id) : null;
|
|
68
|
+
}
|
|
69
|
+
get(id) {
|
|
70
|
+
const row = getSqliteDatabase().prepare("SELECT * FROM understanding_refresh_batches WHERE batch_id = ?").get(id);
|
|
71
|
+
if (!row) return null;
|
|
72
|
+
const sources = JSON.parse(row.source_run_ids_json).flatMap((runId) => {
|
|
73
|
+
const saved = getUnderstandingSourceRun(runId);
|
|
74
|
+
if (!saved) return [];
|
|
75
|
+
const run = this.reconcile(saved);
|
|
76
|
+
return [{
|
|
77
|
+
...run,
|
|
78
|
+
adapterId: String(run.metadata.adapterId),
|
|
79
|
+
displayName: String(run.metadata.displayName)
|
|
80
|
+
}];
|
|
81
|
+
});
|
|
82
|
+
const completed = sources.filter((run) => run.status === "completed").length;
|
|
83
|
+
return {
|
|
84
|
+
id,
|
|
85
|
+
status: sources.some((run) => ACTIVE.has(run.status)) ? "running" : completed === sources.length && completed > 0 ? "completed" : completed || sources.some((run) => run.status === "partial") ? "partial" : "failed",
|
|
86
|
+
sources,
|
|
87
|
+
createdAt: row.created_at
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
update(run, progress) {
|
|
91
|
+
const next = updateUnderstandingSourceRun(run.id, {
|
|
92
|
+
status: progress.status,
|
|
93
|
+
itemsSeen: progress.itemsSeen,
|
|
94
|
+
...progress.error ? { errorMessage: progress.error } : {},
|
|
95
|
+
completed: !ACTIVE.has(progress.status),
|
|
96
|
+
metadata: {
|
|
97
|
+
...run.metadata,
|
|
98
|
+
phase: progress.phase,
|
|
99
|
+
...progress.added === void 0 ? {} : { added: progress.added },
|
|
100
|
+
...progress.updated === void 0 ? {} : { updated: progress.updated }
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
this.deps.emit?.("understanding.refresh.updated", {
|
|
104
|
+
runId: run.id,
|
|
105
|
+
grantId: run.grantId
|
|
106
|
+
});
|
|
107
|
+
return next;
|
|
108
|
+
}
|
|
109
|
+
reconcile(run) {
|
|
110
|
+
if (!ACTIVE.has(run.status)) return run;
|
|
111
|
+
const grant = getUnderstandingSourceGrant(run.grantId);
|
|
112
|
+
if (!grant || grant.status !== "active" || grant.processingPolicy !== run.metadata.processingPolicy || !this.deps.enabled()) return this.update(run, {
|
|
113
|
+
status: "canceled",
|
|
114
|
+
phase: "completed",
|
|
115
|
+
error: "Source authorization changed. Retry after reviewing its settings."
|
|
116
|
+
});
|
|
117
|
+
const progress = this.deps.progress(run);
|
|
118
|
+
if (progress) {
|
|
119
|
+
if (progress.status !== run.status || progress.phase !== run.metadata.phase || progress.added !== run.metadata.added || progress.updated !== run.metadata.updated || progress.itemsSeen !== void 0 && progress.itemsSeen !== run.itemsSeen) return this.update(run, progress);
|
|
120
|
+
return run;
|
|
121
|
+
}
|
|
122
|
+
if (run.metadata.owner !== this.owner) return this.update(run, {
|
|
123
|
+
status: "failed",
|
|
124
|
+
phase: "completed",
|
|
125
|
+
error: "Update was interrupted. Please retry."
|
|
126
|
+
});
|
|
127
|
+
if (run.metadata.phase === "waiting_desktop" && Date.now() - run.startedAt > DESKTOP_WAIT_MS) return this.update(run, {
|
|
128
|
+
status: "failed",
|
|
129
|
+
phase: "completed",
|
|
130
|
+
error: "Desktop collection did not finish. Open the desktop app and retry."
|
|
131
|
+
});
|
|
132
|
+
return run;
|
|
133
|
+
}
|
|
134
|
+
async dispatch(run) {
|
|
135
|
+
this.starting.add(run.id);
|
|
136
|
+
try {
|
|
137
|
+
const grant = getUnderstandingSourceGrant(run.grantId);
|
|
138
|
+
this.update(run, {
|
|
139
|
+
status: "running",
|
|
140
|
+
phase: "reading"
|
|
141
|
+
});
|
|
142
|
+
const metadata = await this.deps.start(grant, run.id);
|
|
143
|
+
const latest = getUnderstandingSourceRun(run.id);
|
|
144
|
+
updateUnderstandingSourceRun(run.id, { metadata: {
|
|
145
|
+
...latest.metadata,
|
|
146
|
+
...metadata
|
|
147
|
+
} });
|
|
148
|
+
this.reconcile(getUnderstandingSourceRun(run.id));
|
|
149
|
+
} catch (err) {
|
|
150
|
+
log.warn({
|
|
151
|
+
err,
|
|
152
|
+
runId: run.id,
|
|
153
|
+
grantId: run.grantId
|
|
154
|
+
}, "Understanding refresh could not start");
|
|
155
|
+
this.update(getUnderstandingSourceRun(run.id), {
|
|
156
|
+
status: "failed",
|
|
157
|
+
phase: "completed",
|
|
158
|
+
error: err instanceof Error ? err.message : String(err)
|
|
159
|
+
});
|
|
160
|
+
} finally {
|
|
161
|
+
this.starting.delete(run.id);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
submitDesktop(runId, input) {
|
|
165
|
+
const saved = getUnderstandingSourceRun(runId);
|
|
166
|
+
const run = saved ? this.reconcile(saved) : null;
|
|
167
|
+
if (!run || run.metadata.refresh !== true) throw new Error("Refresh run not found.");
|
|
168
|
+
if (this.analyzing.has(runId) || !ACTIVE.has(run.status)) return;
|
|
169
|
+
if (run.metadata.phase !== "waiting_desktop") throw new Error("This run is not waiting for desktop collection.");
|
|
170
|
+
const grant = getUnderstandingSourceGrant(run.grantId);
|
|
171
|
+
if (input.items.length > 1200 || input.items.some((item) => item.sourceId !== grant.adapterId)) throw new Error("Collected items must belong to the requested source.");
|
|
172
|
+
if (input.error) {
|
|
173
|
+
this.update(run, {
|
|
174
|
+
status: "failed",
|
|
175
|
+
phase: "completed",
|
|
176
|
+
error: input.error.slice(0, 500)
|
|
177
|
+
});
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
if (!input.items.length) {
|
|
181
|
+
this.update(run, {
|
|
182
|
+
status: "completed",
|
|
183
|
+
phase: "completed",
|
|
184
|
+
added: 0,
|
|
185
|
+
updated: 0,
|
|
186
|
+
itemsSeen: 0
|
|
187
|
+
});
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
this.analyzing.add(runId);
|
|
191
|
+
this.update(run, {
|
|
192
|
+
status: "running",
|
|
193
|
+
phase: "analyzing",
|
|
194
|
+
itemsSeen: input.items.length
|
|
195
|
+
});
|
|
196
|
+
const signal = AbortSignal.timeout(ANALYSIS_TIMEOUT_MS);
|
|
197
|
+
this.deps.analyzeDesktop(grant, input.items, signal).then((result) => {
|
|
198
|
+
signal.throwIfAborted();
|
|
199
|
+
const current = this.reconcile(getUnderstandingSourceRun(runId));
|
|
200
|
+
if (ACTIVE.has(current.status)) this.update(current, {
|
|
201
|
+
status: "completed",
|
|
202
|
+
phase: "completed",
|
|
203
|
+
...result
|
|
204
|
+
});
|
|
205
|
+
}).catch((err) => {
|
|
206
|
+
log.warn({
|
|
207
|
+
err,
|
|
208
|
+
runId,
|
|
209
|
+
grantId: grant.id
|
|
210
|
+
}, "Understanding refresh analysis failed");
|
|
211
|
+
const current = getUnderstandingSourceRun(runId);
|
|
212
|
+
if (ACTIVE.has(current.status)) this.update(current, {
|
|
213
|
+
status: "failed",
|
|
214
|
+
phase: "completed",
|
|
215
|
+
error: "Analysis failed. Please retry."
|
|
216
|
+
});
|
|
217
|
+
}).finally(() => this.analyzing.delete(runId));
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
//#endregion
|
|
221
|
+
export { UnderstandingRefreshService };
|
|
@@ -114,7 +114,7 @@ function getUnderstandingSourceRun(id) {
|
|
|
114
114
|
return row ? runFromRow(row) : null;
|
|
115
115
|
}
|
|
116
116
|
function listUnderstandingSourceRuns(grantId, limit = 20) {
|
|
117
|
-
return getSqliteDatabase().prepare("SELECT * FROM understanding_source_runs WHERE grant_id = ? ORDER BY started_at DESC LIMIT ?").all(grantId, Math.max(1, Math.min(100, limit))).map(runFromRow);
|
|
117
|
+
return getSqliteDatabase().prepare("SELECT * FROM understanding_source_runs WHERE grant_id = ? ORDER BY started_at DESC, rowid DESC LIMIT ?").all(grantId, Math.max(1, Math.min(100, limit))).map(runFromRow);
|
|
118
118
|
}
|
|
119
119
|
function updateUnderstandingSourceRun(id, patch) {
|
|
120
120
|
const current = getUnderstandingSourceRun(id);
|