@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.
Files changed (261) hide show
  1. package/dist/browser-ext/_locales/en/messages.json +8 -0
  2. package/dist/browser-ext/_locales/zh_CN/messages.json +8 -0
  3. package/dist/browser-ext/dist/assets/{sidepanel-BbSQr-6P.css → sidepanel-DD6GEMvc.css} +16 -0
  4. package/dist/browser-ext/dist/sidepanel.html +1 -1
  5. package/dist/browser-ext/dist/sidepanel.js +537 -96
  6. package/dist/browser-ext/manifest.json +1 -1
  7. package/dist/extensions/telegram/xopc.extension.json +1 -1
  8. package/dist/gateway/static/root/assets/{activity-store-wgSB2HYK.js → activity-store-XKNYlFUI.js} +1 -1
  9. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CZeQo09T.js → agent-avatar-dicebear-1S2TFECE.js} +1 -1
  10. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-f0-YFMUz.js +1 -0
  11. package/dist/gateway/static/root/assets/{agents-BlrHMbRx.js → agents-CPqUMtCL.js} +1 -1
  12. package/dist/gateway/static/root/assets/{api-BKHmTb0w.js → api-BEUEE4f2.js} +1 -1
  13. package/dist/gateway/static/root/assets/api-CN4id43t.js +1 -0
  14. package/dist/gateway/static/root/assets/{app-management-settings-panel-Bzw4fQP8.js → app-management-settings-panel-CgVBSqzu.js} +1 -1
  15. package/dist/gateway/static/root/assets/{appearance-settings-8GZpUXva.js → appearance-settings-CoWdCokb.js} +1 -1
  16. package/dist/gateway/static/root/assets/{apps-page-BkQQtIxH.js → apps-page-CexHOcWg.js} +1 -1
  17. package/dist/gateway/static/root/assets/{archive-plugin-CQ2NaoHb.js → archive-plugin-C3ZA6LRS.js} +1 -1
  18. package/dist/gateway/static/root/assets/{attachment-load-BFi1H7yJ.js → attachment-load-CdgS6_zy.js} +1 -1
  19. package/dist/gateway/static/root/assets/{automations-page-CDBXcii_.js → automations-page-BtHL2hpg.js} +1 -1
  20. package/dist/gateway/static/root/assets/automations-workspace-onJPfmO6.js +6 -0
  21. package/dist/gateway/static/root/assets/{binary-plugins-D07eWmOx.js → binary-plugins-CiDhtq_H.js} +1 -1
  22. package/dist/gateway/static/root/assets/{block-editor-CtVnjyYU.js → block-editor-Br00T83w.js} +3 -3
  23. package/dist/gateway/static/root/assets/{browser-automation-inputs-BzkJog8e.js → browser-automation-inputs-D2tILykA.js} +1 -1
  24. package/dist/gateway/static/root/assets/{browser-automations-page-DyrSbDdG.js → browser-automations-page-BVuEmryB.js} +1 -1
  25. package/dist/gateway/static/root/assets/browser-settings-page-BgVTyPFY.js +3 -0
  26. package/dist/gateway/static/root/assets/capabilities-settings-panel-Dra8wj1S.js +8 -0
  27. package/dist/gateway/static/root/assets/{channels-settings-DAD9qE3J.js → channels-settings-CkxiMDJ4.js} +1 -1
  28. package/dist/gateway/static/root/assets/{channels-status-swr-B2JwuTjG.js → channels-status-swr-Dtder4G_.js} +1 -1
  29. package/dist/gateway/static/root/assets/{chat-terminal-dock-B62SZdAo.js → chat-terminal-dock-JsMtzDao.js} +1 -1
  30. package/dist/gateway/static/root/assets/{computer-settings-page-ClSresNq.js → computer-settings-page-DHerePwo.js} +1 -1
  31. package/dist/gateway/static/root/assets/connector-service-page-DZFNUTiN.js +1 -0
  32. package/dist/gateway/static/root/assets/connectors-page-cl9ZrV4D.js +2 -0
  33. package/dist/gateway/static/root/assets/{cron-expression-CTMi_tql.js → cron-expression-DAhdv_Xv.js} +1 -1
  34. package/dist/gateway/static/root/assets/{date-picker-B71AJK50.js → date-picker-PacO1m3a.js} +1 -1
  35. package/dist/gateway/static/root/assets/{dependency-picker-DlyGK-kA.js → dependency-picker-B-BcuG1y.js} +1 -1
  36. package/dist/gateway/static/root/assets/{desktop-pet-DGkbTE8_.js → desktop-pet-CdBBhhdY.js} +1 -1
  37. package/dist/gateway/static/root/assets/{desktop-pet-settings-BY8r9j66.js → desktop-pet-settings-Gy03NgMI.js} +1 -1
  38. package/dist/gateway/static/root/assets/{device-pairing-wizard-DzRrgd59.js → device-pairing-wizard-aV25nKag.js} +1 -1
  39. package/dist/gateway/static/root/assets/{extension-debug-page-L8Mm1n3A.js → extension-debug-page-BFp5eKtY.js} +1 -1
  40. package/dist/gateway/static/root/assets/{extension-page-CFc4vSNU.js → extension-page-DL3vyyH6.js} +1 -1
  41. package/dist/gateway/static/root/assets/{extension-settings-page-B5zWyHr3.js → extension-settings-page-BXtvdAsY.js} +1 -1
  42. package/dist/gateway/static/root/assets/{gateway-config-swr-B6wHa6ZI.js → gateway-config-swr-xAOGtenO.js} +1 -1
  43. package/dist/gateway/static/root/assets/{gateway-realtime-B53R0CA4.js → gateway-realtime-BuaTsMSi.js} +1 -1
  44. package/dist/gateway/static/root/assets/gateway-realtime-store-BG95uGVW.js +1 -0
  45. package/dist/gateway/static/root/assets/{gateway-settings-D7qmTH4R.js → gateway-settings-Dcr2Ikeh.js} +1 -1
  46. package/dist/gateway/static/root/assets/{gateway-startup-retry-DRzGnEV-.js → gateway-startup-retry-BwDxKHd4.js} +1 -1
  47. package/dist/gateway/static/root/assets/{heartbeat-settings-Glsl3X5b.js → heartbeat-settings-DOy3alvT.js} +1 -1
  48. package/dist/gateway/static/root/assets/home-page-CDm3dGVy.js +1 -0
  49. package/dist/gateway/static/root/assets/{image-generation-api-Ck_pyDom.js → image-generation-api-wGMeI_yW.js} +1 -1
  50. package/dist/gateway/static/root/assets/{imports-page-ByBX7ome.js → imports-page-zexFT5Rq.js} +1 -1
  51. package/dist/gateway/static/root/assets/index-D-vczw_0.css +1 -0
  52. package/dist/gateway/static/root/assets/index-DJo4DimT.js +79 -0
  53. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-C45RlO8a.js → keyboard-shortcuts-settings-CutG9zLh.js} +1 -1
  54. package/dist/gateway/static/root/assets/{local-app-workbench-page-DP0x2jpR.js → local-app-workbench-page-CwLvTwjn.js} +2 -2
  55. package/dist/gateway/static/root/assets/{local-apps-page-C_AQc2bI.js → local-apps-page-CJy6I7Dt.js} +1 -1
  56. package/dist/gateway/static/root/assets/{locale-store-msTfRK8P.js → locale-store-DPZ79W1-.js} +1 -1
  57. package/dist/gateway/static/root/assets/{logs-page-DvM8Pyok.js → logs-page-egGcPHNi.js} +1 -1
  58. package/dist/gateway/static/root/assets/{management-settings-D1uwSutV.js → management-settings-BQhIOELc.js} +1 -1
  59. package/dist/gateway/static/root/assets/{markdown-view-BInabSKf.js → markdown-view-p2P5hP1U.js} +1 -1
  60. package/dist/gateway/static/root/assets/{media-plugins-C4mhf13f.js → media-plugins-CsBylqlN.js} +1 -1
  61. package/dist/gateway/static/root/assets/messages-BiYTyLJr.js +3 -0
  62. package/dist/gateway/static/root/assets/note-detail-panel-c2k5Uz6X.js +5 -0
  63. package/dist/gateway/static/root/assets/notes-page-BLQWJMhf.js +8 -0
  64. package/dist/gateway/static/root/assets/{page-tabs-1go_BtX1.js → page-tabs-ChQ4jJFs.js} +1 -1
  65. package/dist/gateway/static/root/assets/{preview-open-alternatives-DmoSC0j1.js → preview-open-alternatives-9B5W7nVE.js} +1 -1
  66. package/dist/gateway/static/root/assets/{proactive-page-xAjKTIID.js → proactive-page-iOjI0d_e.js} +1 -1
  67. package/dist/gateway/static/root/assets/{product-open-page-gmi5LLwM.js → product-open-page-BADxWEdP.js} +1 -1
  68. package/dist/gateway/static/root/assets/project-detail-page-BcxbQn2M.js +1 -0
  69. package/dist/gateway/static/root/assets/projects-page-BuSvld0O.js +1 -0
  70. package/dist/gateway/static/root/assets/{registry-api-BSWtko7U.js → registry-api-B_e_nZSN.js} +1 -1
  71. package/dist/gateway/static/root/assets/remote-access-hub-CFS8LQKW.js +1 -0
  72. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-ClkOoxDl.js → runtime-tools-settings-panel-D-pwiIyp.js} +1 -1
  73. package/dist/gateway/static/root/assets/{schema-form-BuEmLiaU.js → schema-form-IWmb05DX.js} +1 -1
  74. package/dist/gateway/static/root/assets/sessions-page-DZjc__ok.js +1 -0
  75. package/dist/gateway/static/root/assets/settings-advanced-gate-C1SM5B93.js +1 -0
  76. package/dist/gateway/static/root/assets/{settings-form-section-Dor39QON.js → settings-form-section-B0veRBZs.js} +1 -1
  77. package/dist/gateway/static/root/assets/{settings-page-Xj-yvIc8.js → settings-page-CxRWyWYe.js} +1 -1
  78. package/dist/gateway/static/root/assets/setup-status-panel-D9Rl7Tec.js +1 -0
  79. package/dist/gateway/static/root/assets/{share-preview-page-BFWZoXdm.js → share-preview-page-CirpgkfD.js} +1 -1
  80. package/dist/gateway/static/root/assets/shares-settings-CwCThBs0.js +1 -0
  81. package/dist/gateway/static/root/assets/skill-reload-api-DG6VGbOX.js +1 -0
  82. package/dist/gateway/static/root/assets/skills-page-BdRJ2vnL.js +2 -0
  83. package/dist/gateway/static/root/assets/{skills-page.utils-Ii8qeXhs.js → skills-page.utils-B42mpWKV.js} +1 -1
  84. package/dist/gateway/static/root/assets/{system-settings-panel-Di6OSO-0.js → system-settings-panel-DXIZpAvU.js} +1 -1
  85. package/dist/gateway/static/root/assets/task-detail-page-QXo9LJly.js +1 -0
  86. package/dist/gateway/static/root/assets/{theme-store-1SZ-HFHX.js → theme-store-BFbj_2Tu.js} +1 -1
  87. package/dist/gateway/static/root/assets/{tunnel-api-DDOlOYlj.js → tunnel-api-Db2guRdW.js} +1 -1
  88. package/dist/gateway/static/root/assets/{use-autosave-CQ8uWNnB.js → use-autosave-DDY9qoXZ.js} +1 -1
  89. package/dist/gateway/static/root/assets/user-model-page-CzPmMkaO.js +2 -0
  90. package/dist/gateway/static/root/assets/{voice-api-key-field-COTzshjL.js → voice-api-key-field-BZbKQ8HT.js} +1 -1
  91. package/dist/gateway/static/root/assets/{voice-config-api-DgJML_uM.js → voice-config-api-SKCeQLrH.js} +1 -1
  92. package/dist/gateway/static/root/assets/{work-discovery-overlay-_URrXbi4.js → work-discovery-overlay-BRVTTXNG.js} +1 -1
  93. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CALs-1nd.js → workflow-run-setup-panel-D2kuwv5e.js} +2 -2
  94. package/dist/gateway/static/root/assets/workflows-page-CQXtiYtq.js +6 -0
  95. package/dist/gateway/static/root/index.html +12 -12
  96. package/dist/package.js +1 -1
  97. package/dist/packages/gateway-contract/src/notifications.js +1 -1
  98. package/dist/packages/gateway-contract/src/sessions.js +6 -1
  99. package/dist/src/agent/agent-manager.js +29 -4
  100. package/dist/src/agent/background-review/prompts.js +3 -1
  101. package/dist/src/agent/child-agent-factory.d.ts +1 -0
  102. package/dist/src/agent/child-agent-factory.js +18 -4
  103. package/dist/src/agent/coding/repository-instructions.d.ts +4 -0
  104. package/dist/src/agent/coding/repository-instructions.js +46 -2
  105. package/dist/src/agent/context/execution-context.js +4 -4
  106. package/dist/src/agent/data-acquisition/git.d.ts +17 -0
  107. package/dist/src/agent/data-acquisition/git.js +100 -0
  108. package/dist/src/agent/data-acquisition/render.d.ts +7 -0
  109. package/dist/src/agent/data-acquisition/render.js +79 -0
  110. package/dist/src/agent/data-acquisition/scheduler.d.ts +12 -0
  111. package/dist/src/agent/data-acquisition/scheduler.js +53 -0
  112. package/dist/src/agent/data-acquisition/schema.d.ts +75 -0
  113. package/dist/src/agent/data-acquisition/schema.js +206 -0
  114. package/dist/src/agent/data-acquisition/service.d.ts +10 -0
  115. package/dist/src/agent/data-acquisition/service.js +292 -0
  116. package/dist/src/agent/data-acquisition/types.d.ts +37 -0
  117. package/dist/src/agent/data-acquisition/types.js +5 -0
  118. package/dist/src/agent/embedded/run-turn.js +16 -4
  119. package/dist/src/agent/embedded/session-runner.d.ts +1 -0
  120. package/dist/src/agent/embedded/session-runner.js +3 -0
  121. package/dist/src/agent/embedded/tool-result-truncation.js +11 -0
  122. package/dist/src/agent/embedded/xopc-tools-bridge.js +2 -1
  123. package/dist/src/agent/external-tools/composio-provider.js +12 -1
  124. package/dist/src/agent/external-tools/gateway-tools.js +2 -1
  125. package/dist/src/agent/external-tools/index.js +8 -1
  126. package/dist/src/agent/external-tools/read-policy.d.ts +6 -0
  127. package/dist/src/agent/external-tools/read-policy.js +21 -0
  128. package/dist/src/agent/external-tools/service.d.ts +1 -0
  129. package/dist/src/agent/external-tools/service.js +4 -1
  130. package/dist/src/agent/external-tools/types.d.ts +2 -0
  131. package/dist/src/agent/memory/compaction-promotion.d.ts +1 -1
  132. package/dist/src/agent/memory/compaction-promotion.js +4 -3
  133. package/dist/src/agent/orchestration/agent-turn-policy.js +25 -10
  134. package/dist/src/agent/orchestration/delegation-scope.d.ts +9 -0
  135. package/dist/src/agent/orchestration/delegation-scope.js +11 -0
  136. package/dist/src/agent/prompt/sections/tooling.js +3 -1
  137. package/dist/src/agent/prompt/subagent-context.js +4 -2
  138. package/dist/src/agent/sandbox/fileAccess.d.ts +2 -0
  139. package/dist/src/agent/sandbox/fileAccess.js +31 -2
  140. package/dist/src/agent/tools/dataBatch.d.ts +4 -0
  141. package/dist/src/agent/tools/dataBatch.js +50 -0
  142. package/dist/src/agent/tools/delegate-tool.d.ts +6 -3
  143. package/dist/src/agent/tools/delegate-tool.js +65 -48
  144. package/dist/src/agent/tools/delegation-parent-policy.d.ts +7 -0
  145. package/dist/src/agent/tools/delegation-parent-policy.js +41 -0
  146. package/dist/src/agent/tools/delegation-policy.d.ts +16 -0
  147. package/dist/src/agent/tools/delegation-policy.js +93 -0
  148. package/dist/src/agent/tools/factory.d.ts +2 -0
  149. package/dist/src/agent/tools/factory.js +42 -3
  150. package/dist/src/agent/tools/fetch-text.d.ts +7 -0
  151. package/dist/src/agent/tools/fetch-text.js +86 -0
  152. package/dist/src/agent/tools/find.js +1 -1
  153. package/dist/src/agent/tools/grep.js +11 -23
  154. package/dist/src/agent/tools/index.d.ts +1 -0
  155. package/dist/src/agent/tools/index.js +2 -1
  156. package/dist/src/agent/tools/knowledge-memory-tool.d.ts +1 -1
  157. package/dist/src/agent/tools/knowledge-memory-tool.js +13 -5
  158. package/dist/src/agent/tools/read.js +7 -5
  159. package/dist/src/agent/tools/repository-search.d.ts +12 -2
  160. package/dist/src/agent/tools/repository-search.js +127 -74
  161. package/dist/src/agent/tools/user-context-tool.js +17 -7
  162. package/dist/src/agent/tools/web.js +19 -28
  163. package/dist/src/agent/workflow/subagent-runner.js +25 -3
  164. package/dist/src/agent/workflow/workflow-child-tools.js +13 -8
  165. package/dist/src/agent-config/schema.d.ts +7 -0
  166. package/dist/src/agent-config/schema.js +2 -0
  167. package/dist/src/chat-commands/builtins/understanding.js +1 -1
  168. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  169. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  170. package/dist/src/config/schema.d.ts +6 -4
  171. package/dist/src/config/schema.js +2 -2
  172. package/dist/src/connectors/connected-source-understanding.d.ts +1 -0
  173. package/dist/src/connectors/connected-source-understanding.js +1 -0
  174. package/dist/src/connectors/learning-coordinator.js +31 -9
  175. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  176. package/dist/src/gateway/heartbeat/service.js +2 -2
  177. package/dist/src/gateway/hono/lib/config-payload.d.ts +4 -2
  178. package/dist/src/gateway/hono/routes/connectors.js +1 -1
  179. package/dist/src/gateway/hono/routes/context-sources.js +0 -23
  180. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  181. package/dist/src/gateway/hono/routes/projects.js +8 -0
  182. package/dist/src/gateway/hono/routes/sessions.js +141 -13
  183. package/dist/src/gateway/hono/routes/user-model-refresh.d.ts +5 -0
  184. package/dist/src/gateway/hono/routes/user-model-refresh.js +128 -0
  185. package/dist/src/gateway/hono/routes/user-model.js +12 -5
  186. package/dist/src/gateway/hono/routes/work-discovery.js +0 -30
  187. package/dist/src/gateway/service.js +6 -6
  188. package/dist/src/heartbeat/index.js +1 -1
  189. package/dist/src/infra/update-restart.js +1 -1
  190. package/dist/src/knowledge/connected-knowledge-pipeline.js +1 -1
  191. package/dist/src/knowledge-memory/index.js +2 -2
  192. package/dist/src/knowledge-memory/repository.d.ts +7 -0
  193. package/dist/src/knowledge-memory/repository.js +58 -8
  194. package/dist/src/memory-maintenance/service.js +61 -31
  195. package/dist/src/migrations/memory-config.d.ts +2 -0
  196. package/dist/src/migrations/memory-config.js +77 -0
  197. package/dist/src/migrations/runner.js +2 -2
  198. package/dist/src/notifications/planner.js +5 -5
  199. package/dist/src/notifications/service.d.ts +2 -2
  200. package/dist/src/notifications/service.js +1 -1
  201. package/dist/src/storage/sqlite/index.d.ts +1 -0
  202. package/dist/src/storage/sqlite/index.js +2 -1
  203. package/dist/src/storage/sqlite/migrations/184_memory_suppressions.sql +12 -0
  204. package/dist/src/storage/sqlite/migrations/185_understanding_refresh_batches.sql +6 -0
  205. package/dist/src/storage/sqlite/migrations/186_sidebar_layout.sql +16 -0
  206. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  207. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  208. package/dist/src/storage/sqlite/schema.js +1 -1
  209. package/dist/src/storage/sqlite/sidebar-layout-repository.d.ts +12 -0
  210. package/dist/src/storage/sqlite/sidebar-layout-repository.js +53 -0
  211. package/dist/src/user-context/config.d.ts +4 -9
  212. package/dist/src/user-context/config.js +7 -27
  213. package/dist/src/user-context/memory-suppression.d.ts +7 -0
  214. package/dist/src/user-context/memory-suppression.js +23 -0
  215. package/dist/src/user-context/relationship-continuity.js +1 -1
  216. package/dist/src/user-context/sources/refresh-service.d.ts +48 -0
  217. package/dist/src/user-context/sources/refresh-service.js +221 -0
  218. package/dist/src/user-context/sources/repository.js +1 -1
  219. package/dist/src/user-model/bootstrap.js +27 -24
  220. package/dist/src/user-model/capture/executor.d.ts +1 -1
  221. package/dist/src/user-model/capture/executor.js +17 -11
  222. package/dist/src/user-model/capture/semantic.js +1 -1
  223. package/dist/src/user-model/domain.d.ts +6 -2
  224. package/dist/src/user-model/index.js +3 -3
  225. package/dist/src/user-model/profile.js +1 -1
  226. package/dist/src/user-model/repository.d.ts +4 -1
  227. package/dist/src/user-model/repository.js +96 -6
  228. package/dist/src/user-model/usage-policy.d.ts +2 -0
  229. package/dist/src/user-model/usage-policy.js +6 -2
  230. package/dist/src/work-discovery/project-understanding.js +2 -1
  231. package/dist/src/work-discovery/service.d.ts +8 -24
  232. package/dist/src/work-discovery/service.js +138 -180
  233. package/package.json +1 -1
  234. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-BPsRb9Ck.js +0 -1
  235. package/dist/gateway/static/root/assets/api-DFOlahZv.js +0 -1
  236. package/dist/gateway/static/root/assets/automations-workspace-CUpiTTiY.js +0 -6
  237. package/dist/gateway/static/root/assets/browser-settings-page-CqTxLpil.js +0 -3
  238. package/dist/gateway/static/root/assets/capabilities-settings-panel-BZ_-pnS6.js +0 -8
  239. package/dist/gateway/static/root/assets/connector-service-page-CPqVmNvx.js +0 -1
  240. package/dist/gateway/static/root/assets/connectors-page-BUQyg3CW.js +0 -2
  241. package/dist/gateway/static/root/assets/gateway-realtime-store-BLDgrJ30.js +0 -1
  242. package/dist/gateway/static/root/assets/home-page-s9hDQ8Hc.js +0 -1
  243. package/dist/gateway/static/root/assets/index-RBCkv8a_.js +0 -79
  244. package/dist/gateway/static/root/assets/index-cFU4S35z.css +0 -1
  245. package/dist/gateway/static/root/assets/messages-F74LVAiU.js +0 -3
  246. package/dist/gateway/static/root/assets/note-detail-panel-D35sErp2.js +0 -5
  247. package/dist/gateway/static/root/assets/notes-page-8jCDklDn.js +0 -8
  248. package/dist/gateway/static/root/assets/project-detail-page-BUMQHy_N.js +0 -1
  249. package/dist/gateway/static/root/assets/projects-page-DT-Mt7XR.js +0 -1
  250. package/dist/gateway/static/root/assets/remote-access-hub-Clz3byir.js +0 -1
  251. package/dist/gateway/static/root/assets/sessions-page-tQRwktKm.js +0 -1
  252. package/dist/gateway/static/root/assets/settings-advanced-gate-DqWg9XS5.js +0 -1
  253. package/dist/gateway/static/root/assets/setup-status-panel-BB_sMB7P.js +0 -1
  254. package/dist/gateway/static/root/assets/shares-settings-oDALm4b6.js +0 -1
  255. package/dist/gateway/static/root/assets/skill-reload-api-DmwelnfK.js +0 -1
  256. package/dist/gateway/static/root/assets/skills-page-BE9JXz4U.js +0 -2
  257. package/dist/gateway/static/root/assets/task-detail-page-D1AWszc7.js +0 -1
  258. package/dist/gateway/static/root/assets/user-model-page-C00i4ea0.js +0 -2
  259. package/dist/gateway/static/root/assets/workflows-page-BUiBjz6m.js +0 -6
  260. package/dist/src/migrations/knowledge-memory-read-policy-config.d.ts +0 -2
  261. 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) if (reconcileAssertion({
12
- subject: {
13
- type: "user",
14
- id: "self"
15
- },
16
- predicate: input.predicate,
17
- cardinality: "multiple",
18
- scope: { type: "global" },
19
- kind: input.kind,
20
- value: statement,
21
- normalizedValue: statement.toLocaleLowerCase(),
22
- statement,
23
- authority: "user_explicit",
24
- confidence: 1,
25
- declaredImportance: input.importance,
26
- inferredImportance: input.importance,
27
- consequence: "medium",
28
- actionability: .8,
29
- volatility: "slow",
30
- sensitivity: input.kind === "relationship" ? "personal" : "normal",
31
- disclosurePolicy: "referenceable",
32
- observedAt: now,
33
- createdBy: "user"
34
- }, now).action !== "deduplicated") created += 1;
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' | 'confirm' | 'allow';
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
- setAssertionStatus(target.id, "rejected", {
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 === "secret" || source.sensitivity === "regulated";
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 && (input.policy.write === "confirm" || sensitive && input.policy.sensitiveWrite === "confirm");
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 || input.policy.write === "allow";
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 || input.policy.write === "allow";
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 interface ReconciliationResult {
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 };
@@ -90,7 +90,7 @@ function applyUserProfilePatch(input, now = Date.now()) {
90
90
  observedAt: now,
91
91
  createdBy: "user",
92
92
  ...current ? { correctionOfAssertionId: current.id } : {}
93
- }, now);
93
+ }, now, { restoreDeleted: true });
94
94
  }
95
95
  return getUserProfileSnapshot();
96
96
  }
@@ -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): ReconciliationResult;
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.validFrom ?? candidate.observedAt, now);
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 !== "critical" && assertion.sensitivity === "normal" && assertion.disclosurePolicy !== "ask_before_reference";
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>): Promise<{
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: {