@xopcai/xopc 0.0.248 → 0.0.249

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 (452) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{activity-store-etpmyV7S.js → activity-store-B759R_qf.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BmKxSM1k.js → agent-avatar-dicebear-BUu7EnwM.js} +1 -1
  5. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-C1rXNUAG.js +1 -0
  6. package/dist/gateway/static/root/assets/agents-DK9HjHO0.js +1 -0
  7. package/dist/gateway/static/root/assets/{api-B0-hLuZ1.js → api-Cg0v7Lpn.js} +1 -1
  8. package/dist/gateway/static/root/assets/app-management-settings-panel-C9DkCW_d.js +1 -0
  9. package/dist/gateway/static/root/assets/appearance-settings-CFggS95Y.js +1 -0
  10. package/dist/gateway/static/root/assets/apps-page-jOvT-fzU.js +1 -0
  11. package/dist/gateway/static/root/assets/{archive-plugin-BnMSgZvR.js → archive-plugin-BQrilVVv.js} +1 -1
  12. package/dist/gateway/static/root/assets/{attachment-load-CejsQMev.js → attachment-load-BG0BliqV.js} +1 -1
  13. package/dist/gateway/static/root/assets/{automations-page-RC8EyoAf.js → automations-page-Bo4RiTkh.js} +1 -1
  14. package/dist/gateway/static/root/assets/automations-workspace-BKjKTlW8.js +6 -0
  15. package/dist/gateway/static/root/assets/{binary-plugins-DGjppLSG.js → binary-plugins-BCnyNU0C.js} +1 -1
  16. package/dist/gateway/static/root/assets/{block-editor-CWdP4bUc.js → block-editor-Db8DlVvg.js} +50 -50
  17. package/dist/gateway/static/root/assets/browser-settings-page-Dzq18pO1.js +8 -0
  18. package/dist/gateway/static/root/assets/{browser-workflow-inputs-BQ1Ilw_o.js → browser-workflow-inputs-C71vfl0b.js} +1 -1
  19. package/dist/gateway/static/root/assets/{browser-workflows-page-CJh4NyxT.js → browser-workflows-page-vvmSYKsO.js} +2 -2
  20. package/dist/gateway/static/root/assets/capabilities-settings-panel-DW4SBQf4.js +7 -0
  21. package/dist/gateway/static/root/assets/channels-settings-57OGuewD.js +1 -0
  22. package/dist/gateway/static/root/assets/{channels-status-swr-Ohhee4vm.js → channels-status-swr-CKyV3jY5.js} +1 -1
  23. package/dist/gateway/static/root/assets/{chat-terminal-dock-BOtoKTK3.js → chat-terminal-dock-B1Xd6OFB.js} +2 -2
  24. package/dist/gateway/static/root/assets/connectors-page-CT_I3kbR.js +2 -0
  25. package/dist/gateway/static/root/assets/{cron-expression-DTj1V3Sw.js → cron-expression-D-F9vjtE.js} +1 -1
  26. package/dist/gateway/static/root/assets/{date-picker-Yr6OCvGL.js → date-picker-B2OoYvic.js} +1 -1
  27. package/dist/gateway/static/root/assets/dependency-picker-BiGx9Sbj.js +1 -0
  28. package/dist/gateway/static/root/assets/{desktop-pet-DbGzggPF.js → desktop-pet-BNMRqipe.js} +1 -1
  29. package/dist/gateway/static/root/assets/desktop-pet-settings-DeYbIV7A.js +1 -0
  30. package/dist/gateway/static/root/assets/{extension-debug-page-DgTtk4KC.js → extension-debug-page-COyn05ub.js} +1 -1
  31. package/dist/gateway/static/root/assets/{extension-page-DtQeiP6f.js → extension-page-oH43chS2.js} +1 -1
  32. package/dist/gateway/static/root/assets/extension-settings-page-BMO59994.js +1 -0
  33. package/dist/gateway/static/root/assets/gateway-config-api-cimpViGk.js +1 -0
  34. package/dist/gateway/static/root/assets/{gateway-config-swr-DXuXtU1w.js → gateway-config-swr-BGdHwT4e.js} +1 -1
  35. package/dist/gateway/static/root/assets/gateway-settings-BHJtnSic.js +1 -0
  36. package/dist/gateway/static/root/assets/{gateway-startup-retry-CzBzglzQ.js → gateway-startup-retry-CuaM3b4c.js} +1 -1
  37. package/dist/gateway/static/root/assets/heartbeat-settings-DNhrZHqx.js +1 -0
  38. package/dist/gateway/static/root/assets/home-page-BiHwiBnQ.js +1 -0
  39. package/dist/gateway/static/root/assets/{image-generation-api-TIgsn04n.js → image-generation-api-D7duj7Uj.js} +1 -1
  40. package/dist/gateway/static/root/assets/index-DGeGmj4k.css +2 -0
  41. package/dist/gateway/static/root/assets/index-aBs0EfQB.js +72 -0
  42. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-wsWuoa8p.js → keyboard-shortcuts-settings-D8Zw_lYd.js} +1 -1
  43. package/dist/gateway/static/root/assets/{local-app-workbench-page-CpyvYyrb.js → local-app-workbench-page-eBFVWmtH.js} +2 -2
  44. package/dist/gateway/static/root/assets/{local-apps-page-CXrbrGo8.js → local-apps-page-CvPDPRwb.js} +1 -1
  45. package/dist/gateway/static/root/assets/{locale-store-BJFLQY8O.js → locale-store-zEL8bkwx.js} +1 -1
  46. package/dist/gateway/static/root/assets/logs-page-ClvcWlL6.js +2 -0
  47. package/dist/gateway/static/root/assets/{management-settings-BdJZFR7U.js → management-settings-D8moh99U.js} +1 -1
  48. package/dist/gateway/static/root/assets/{markdown-split-NK3ACVG2.js → markdown-split-D7V3j0vE.js} +1 -1
  49. package/dist/gateway/static/root/assets/{markdown-view-DTF9v1gg.js → markdown-view-DGRN-8wP.js} +1 -1
  50. package/dist/gateway/static/root/assets/{media-plugins-F0jcUxyl.js → media-plugins-BLaE5b1Y.js} +1 -1
  51. package/dist/gateway/static/root/assets/messages-W5P19VTF.js +11 -0
  52. package/dist/gateway/static/root/assets/mobile-pairing-wizard-DiVDuCxl.js +1 -0
  53. package/dist/gateway/static/root/assets/note-detail-panel-CEEvR-fV.js +5 -0
  54. package/dist/gateway/static/root/assets/notes-page-BLqgXNCx.js +8 -0
  55. package/dist/gateway/static/root/assets/page-tabs-BFMGjA60.js +1 -0
  56. package/dist/gateway/static/root/assets/preview-open-alternatives-DNEWZN7H.js +1 -0
  57. package/dist/gateway/static/root/assets/{product-open-page-CxGGlWA8.js → product-open-page-Co5u7asH.js} +1 -1
  58. package/dist/gateway/static/root/assets/project-detail-page-CIiFJ5tk.js +1 -0
  59. package/dist/gateway/static/root/assets/projects-page-B3UF-Pfm.js +1 -0
  60. package/dist/gateway/static/root/assets/{registry-api-CIsNlSBi.js → registry-api-Cg92zSod.js} +1 -1
  61. package/dist/gateway/static/root/assets/remote-access-hub-BUtpkJPG.js +1 -0
  62. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-YkjhiQfA.js → runtime-tools-settings-panel-C0ByNmlV.js} +2 -2
  63. package/dist/gateway/static/root/assets/{schema-form-oFGf3G3s.js → schema-form-Dq_VQpuY.js} +1 -1
  64. package/dist/gateway/static/root/assets/sessions-page-UgJmG-V4.js +1 -0
  65. package/dist/gateway/static/root/assets/settings-advanced-gate-DDCzpdkl.js +1 -0
  66. package/dist/gateway/static/root/assets/settings-form-section-CZu6FX4k.js +1 -0
  67. package/dist/gateway/static/root/assets/{settings-page-C7VWs0IT.js → settings-page-S8ekeUZd.js} +1 -1
  68. package/dist/gateway/static/root/assets/setup-status-panel-BdVmwXMv.js +1 -0
  69. package/dist/gateway/static/root/assets/{share-preview-page-t5oz18rh.js → share-preview-page-D2fEidbn.js} +1 -1
  70. package/dist/gateway/static/root/assets/shares-settings-BdsqnCYj.js +1 -0
  71. package/dist/gateway/static/root/assets/skill-reload-api-ghzAQKna.js +1 -0
  72. package/dist/gateway/static/root/assets/skills-page-AYiPlgZE.js +2 -0
  73. package/dist/gateway/static/root/assets/{skills-page.utils-DEDTYs2W.js → skills-page.utils-DGzl-ib-.js} +1 -1
  74. package/dist/gateway/static/root/assets/system-settings-panel-5Xd5mIiR.js +1 -0
  75. package/dist/gateway/static/root/assets/task-detail-page-BQAUaCDD.js +1 -0
  76. package/dist/gateway/static/root/assets/{theme-store-O597U8q_.js → theme-store-ZVClZKQ0.js} +1 -1
  77. package/dist/gateway/static/root/assets/tunnel-api-CdZN1Jin.js +1 -0
  78. package/dist/gateway/static/root/assets/{use-autosave-B5eUJ6Zq.js → use-autosave-czRI0NBc.js} +1 -1
  79. package/dist/gateway/static/root/assets/user-model-page-W3GTm6nA.js +2 -0
  80. package/dist/gateway/static/root/assets/{voice-api-key-field-CMKSwz4C.js → voice-api-key-field-8YEvA3cU.js} +1 -1
  81. package/dist/gateway/static/root/assets/{voice-config-api-q7B6fOFB.js → voice-config-api-CopF64lY.js} +1 -1
  82. package/dist/gateway/static/root/assets/work-discovery-overlay-keLtqYYJ.js +1 -0
  83. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-DZmvLZjb.js → workflow-run-setup-panel-Dy5WgYMO.js} +2 -2
  84. package/dist/gateway/static/root/assets/workflows-page-BbAV3h7n.js +5 -0
  85. package/dist/gateway/static/root/index.html +10 -26
  86. package/dist/package.js +1 -1
  87. package/dist/src/agent/agent-instance-gateway.d.ts +2 -2
  88. package/dist/src/agent/agent-manager.d.ts +4 -4
  89. package/dist/src/agent/agent-manager.js +31 -15
  90. package/dist/src/agent/background-review/coordinator.d.ts +2 -4
  91. package/dist/src/agent/background-review/coordinator.js +5 -30
  92. package/dist/src/agent/background-review/prompts.d.ts +4 -2
  93. package/dist/src/agent/background-review/prompts.js +24 -19
  94. package/dist/src/agent/background-review/run-background-review.d.ts +6 -7
  95. package/dist/src/agent/background-review/run-background-review.js +47 -41
  96. package/dist/src/agent/background-review/settings.d.ts +0 -1
  97. package/dist/src/agent/background-review/settings.js +6 -7
  98. package/dist/src/agent/context/audit.d.ts +36 -0
  99. package/dist/src/agent/context/audit.js +97 -0
  100. package/dist/src/agent/context/coordinator.d.ts +26 -0
  101. package/dist/src/agent/context/coordinator.js +72 -0
  102. package/dist/src/agent/context/execution-context.d.ts +54 -0
  103. package/dist/src/agent/context/execution-context.js +147 -0
  104. package/dist/src/agent/context/execution-scope.js +1 -1
  105. package/dist/src/agent/context/prepend.d.ts +2 -0
  106. package/dist/src/agent/context/prepend.js +28 -0
  107. package/dist/src/agent/context/project-context.d.ts +3 -3
  108. package/dist/src/agent/context/project-context.js +26 -23
  109. package/dist/src/agent/embedded/index.js +1 -1
  110. package/dist/src/agent/embedded/run-for-session.js +1 -0
  111. package/dist/src/agent/embedded/run-turn.js +22 -2
  112. package/dist/src/agent/embedded/types.d.ts +1 -25
  113. package/dist/src/agent/external-tools/composio-provider.js +87 -92
  114. package/dist/src/agent/external-tools/gateway-tools.d.ts +4 -1
  115. package/dist/src/agent/external-tools/gateway-tools.js +153 -41
  116. package/dist/src/agent/external-tools/index.js +1 -1
  117. package/dist/src/agent/external-tools/search-error.d.ts +12 -0
  118. package/dist/src/agent/external-tools/search-error.js +29 -0
  119. package/dist/src/agent/external-tools/service.d.ts +4 -0
  120. package/dist/src/agent/external-tools/service.js +22 -2
  121. package/dist/src/agent/memory/compaction-policy.js +1 -1
  122. package/dist/src/agent/memory/compaction-promotion.js +45 -77
  123. package/dist/src/agent/memory/create-memory-manager.js +1 -3
  124. package/dist/src/agent/memory/index.d.ts +0 -5
  125. package/dist/src/agent/memory/index.js +2 -5
  126. package/dist/src/agent/memory/manager.d.ts +0 -16
  127. package/dist/src/agent/memory/manager.js +11 -40
  128. package/dist/src/agent/memory/memory-config.js +1 -1
  129. package/dist/src/agent/memory/runtime.d.ts +2 -2
  130. package/dist/src/agent/memory/runtime.js +9 -19
  131. package/dist/src/agent/memory/types.d.ts +1 -1
  132. package/dist/src/agent/orchestration/agent-orchestrator.js +13 -21
  133. package/dist/src/agent/prompt/sections/memory-skills.js +25 -36
  134. package/dist/src/agent/prompt/sections/tooling.js +10 -4
  135. package/dist/src/agent/prompt/service-prompt-builder.js +4 -3
  136. package/dist/src/agent/service/direct-turn-helpers.js +6 -23
  137. package/dist/src/agent/service/process-direct-streaming.js +5 -3
  138. package/dist/src/agent/service.js +4 -3
  139. package/dist/src/agent/tasks/task-judge-service.js +1 -1
  140. package/dist/src/agent/tools/clarify-tool.d.ts +1 -0
  141. package/dist/src/agent/tools/delegate-tool.js +5 -2
  142. package/dist/src/agent/tools/factory.js +36 -19
  143. package/dist/src/agent/tools/index.d.ts +3 -2
  144. package/dist/src/agent/tools/index.js +4 -3
  145. package/dist/src/agent/tools/knowledge-memory-tool.d.ts +9 -0
  146. package/dist/src/agent/tools/knowledge-memory-tool.js +129 -0
  147. package/dist/src/agent/tools/{dreaming-tool.d.ts → memory-maintenance-tool.d.ts} +2 -2
  148. package/dist/src/agent/tools/memory-maintenance-tool.js +31 -0
  149. package/dist/src/agent/tools/user-context-tool.d.ts +8 -0
  150. package/dist/src/agent/tools/user-context-tool.js +81 -0
  151. package/dist/src/agent/tools/xopc-use-tool.js +2 -2
  152. package/dist/src/chat-commands/builtins/understanding.js +24 -6
  153. package/dist/src/cli/commands/connectors.js +1 -1
  154. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  155. package/dist/src/config/schema.d.ts +68 -75
  156. package/dist/src/config/schema.js +29 -18
  157. package/dist/src/config/web-patch.d.ts +1 -1
  158. package/dist/src/connectors/auth-provider-registry.js +1 -1
  159. package/dist/src/connectors/composio-managed-client.js +6 -2
  160. package/dist/src/connectors/connected-source-ingestion.js +1 -1
  161. package/dist/src/connectors/connected-source-understanding.d.ts +1 -3
  162. package/dist/src/connectors/connected-source-understanding.js +86 -99
  163. package/dist/src/connectors/connection-candidates.d.ts +11 -0
  164. package/dist/src/connectors/connection-candidates.js +58 -0
  165. package/dist/src/connectors/connection-capabilities.d.ts +4 -0
  166. package/dist/src/connectors/connection-capabilities.js +37 -0
  167. package/dist/src/connectors/connection-recovery-service.d.ts +42 -0
  168. package/dist/src/connectors/connection-recovery-service.js +396 -0
  169. package/dist/src/connectors/health.js +1 -1
  170. package/dist/src/connectors/learning-coordinator.d.ts +0 -2
  171. package/dist/src/connectors/learning-coordinator.js +6 -7
  172. package/dist/src/connectors/principal.d.ts +5 -0
  173. package/dist/src/connectors/principal.js +18 -0
  174. package/dist/src/gateway/agent-builtin-tools.d.ts +28 -10
  175. package/dist/src/gateway/agent-builtin-tools.js +30 -9
  176. package/dist/src/gateway/chat-stream/mapper.js +1 -28
  177. package/dist/src/gateway/chat-stream/protocol.d.ts +2 -24
  178. package/dist/src/gateway/clarify-bridge.d.ts +4 -0
  179. package/dist/src/gateway/clarify-bridge.js +9 -4
  180. package/dist/src/gateway/heartbeat/service.js +1 -1
  181. package/dist/src/gateway/hono/lib/config-payload.d.ts +52 -30
  182. package/dist/src/gateway/hono/lib/config-payload.js +4 -4
  183. package/dist/src/gateway/hono/middleware/auth.js +1 -2
  184. package/dist/src/gateway/hono/routes/capabilities.js +1 -1
  185. package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +1 -1
  186. package/dist/src/gateway/hono/routes/config-patch/misc.js +72 -28
  187. package/dist/src/gateway/hono/routes/connection-waits.d.ts +3 -0
  188. package/dist/src/gateway/hono/routes/connection-waits.js +58 -0
  189. package/dist/src/gateway/hono/routes/connectors.js +7 -15
  190. package/dist/src/gateway/hono/routes/context-sources.d.ts +4 -0
  191. package/dist/src/gateway/hono/routes/context-sources.js +159 -0
  192. package/dist/src/gateway/hono/routes/index.js +4 -2
  193. package/dist/src/gateway/hono/routes/lazy-bundles.js +9 -4
  194. package/dist/src/gateway/hono/routes/mcp.js +1 -1
  195. package/dist/src/gateway/hono/routes/notes.js +22 -7
  196. package/dist/src/gateway/hono/routes/projects.js +36 -44
  197. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +15 -1
  198. package/dist/src/gateway/hono/routes/side-chats.js +13 -2
  199. package/dist/src/gateway/hono/routes/tasks.js +2 -2
  200. package/dist/src/gateway/hono/routes/user-model.d.ts +3 -0
  201. package/dist/src/gateway/hono/routes/user-model.js +480 -0
  202. package/dist/src/gateway/memory-maintenance-automation-reconciler.d.ts +11 -0
  203. package/dist/src/gateway/memory-maintenance-automation-reconciler.js +72 -0
  204. package/dist/src/gateway/service/agent-runner.d.ts +9 -1
  205. package/dist/src/gateway/service/agent-runner.js +25 -1
  206. package/dist/src/gateway/service/config-coordinator.d.ts +2 -2
  207. package/dist/src/gateway/service/config-coordinator.js +4 -4
  208. package/dist/src/gateway/service/run-gateway-agent.d.ts +1 -0
  209. package/dist/src/gateway/service/run-gateway-agent.js +18 -14
  210. package/dist/src/gateway/service/session-input-coordinator.d.ts +3 -0
  211. package/dist/src/gateway/service/session-input-coordinator.js +12 -2
  212. package/dist/src/gateway/service.d.ts +3 -1
  213. package/dist/src/gateway/service.js +45 -14
  214. package/dist/src/gateway/side-chat/manager.d.ts +16 -3
  215. package/dist/src/gateway/side-chat/manager.js +117 -28
  216. package/dist/src/gateway/side-chat/run-service.d.ts +2 -0
  217. package/dist/src/gateway/side-chat/run-service.js +28 -5
  218. package/dist/src/gateway/side-chat/types.d.ts +9 -1
  219. package/dist/src/heartbeat/index.js +1 -1
  220. package/dist/src/knowledge/connected-knowledge-pipeline.d.ts +0 -2
  221. package/dist/src/knowledge/connected-knowledge-pipeline.js +46 -217
  222. package/dist/src/knowledge-memory/domain.d.ts +35 -0
  223. package/dist/src/knowledge-memory/index.d.ts +2 -0
  224. package/dist/src/knowledge-memory/index.js +2 -0
  225. package/dist/src/knowledge-memory/repository.d.ts +45 -0
  226. package/dist/src/knowledge-memory/repository.js +154 -0
  227. package/dist/src/memory-maintenance/index.d.ts +2 -0
  228. package/dist/src/memory-maintenance/index.js +3 -0
  229. package/dist/src/memory-maintenance/schedule.d.ts +13 -0
  230. package/dist/src/memory-maintenance/schedule.js +51 -0
  231. package/dist/src/memory-maintenance/service.d.ts +28 -0
  232. package/dist/src/memory-maintenance/service.js +216 -0
  233. package/dist/src/notes/service.d.ts +1 -0
  234. package/dist/src/notes/service.js +7 -1
  235. package/dist/src/notes/types.d.ts +16 -0
  236. package/dist/src/proactive/execution/context.d.ts +2 -2
  237. package/dist/src/proactive/execution/context.js +16 -11
  238. package/dist/src/proactive/index.d.ts +1 -1
  239. package/dist/src/proactive/index.js +2 -2
  240. package/dist/src/projects/index.d.ts +1 -1
  241. package/dist/src/projects/index.js +2 -2
  242. package/dist/src/projects/knowledge-bind.d.ts +1 -0
  243. package/dist/src/projects/knowledge-bind.js +15 -0
  244. package/dist/src/projects/project-loop.d.ts +3 -3
  245. package/dist/src/projects/project-loop.js +4 -4
  246. package/dist/src/projects/project-store.js +2 -1
  247. package/dist/src/realtime/runtime.js +1 -0
  248. package/dist/src/runtime-tools/manager.js +1 -1
  249. package/dist/src/storage/sqlite/collaboration-rule-repository.d.ts +17 -0
  250. package/dist/src/storage/sqlite/collaboration-rule-repository.js +54 -0
  251. package/dist/src/storage/sqlite/connection-wait-repository.d.ts +30 -0
  252. package/dist/src/storage/sqlite/connection-wait-repository.js +338 -0
  253. package/dist/src/storage/sqlite/connector-account-repository.js +1 -1
  254. package/dist/src/storage/sqlite/context-evidence-repository.d.ts +24 -0
  255. package/dist/src/storage/sqlite/context-evidence-repository.js +52 -0
  256. package/dist/src/storage/sqlite/index.d.ts +3 -5
  257. package/dist/src/storage/sqlite/index.js +4 -6
  258. package/dist/src/storage/sqlite/knowledge-repository.d.ts +0 -19
  259. package/dist/src/storage/sqlite/knowledge-repository.js +1 -90
  260. package/dist/src/storage/sqlite/migrations/148_user_model_foundation.sql +554 -0
  261. package/dist/src/storage/sqlite/migrations/149_separate_source_index_from_memory.sql +18 -0
  262. package/dist/src/storage/sqlite/migrations/150_session_connection_waits.sql +47 -0
  263. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  264. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  265. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  266. package/dist/src/storage/sqlite/notes-repository.d.ts +2 -1
  267. package/dist/src/storage/sqlite/notes-repository.js +37 -3
  268. package/dist/src/storage/sqlite/schema.js +1 -1
  269. package/dist/src/storage/sqlite/session-input-repository.d.ts +14 -2
  270. package/dist/src/storage/sqlite/session-input-repository.js +16 -13
  271. package/dist/src/storage/sqlite/session-repository.js +4 -1
  272. package/dist/src/storage/sqlite/transcript-repository.js +1 -1
  273. package/dist/src/tasks/index.js +2 -2
  274. package/dist/src/tasks/project-operating-view-service.js +1 -1
  275. package/dist/src/tasks/task-application-service.js +6 -1
  276. package/dist/src/tasks/task-context-assembler.js +1 -1
  277. package/dist/src/tasks/task-context-repository.d.ts +0 -1
  278. package/dist/src/tasks/task-context-repository.js +1 -1
  279. package/dist/src/tasks/task-deletion-service.js +1 -1
  280. package/dist/src/tasks/task-handoff-service.js +1 -1
  281. package/dist/src/tasks/task-read-model-projector.js +1 -1
  282. package/dist/src/tasks/task-run-coordinator.js +1 -1
  283. package/dist/src/tasks/task-run-dispatcher.js +1 -1
  284. package/dist/src/tasks/task-run-repository.js +1 -0
  285. package/dist/src/tasks/task-signal-service.js +1 -1
  286. package/dist/src/tui/tool-summary.js +2 -1
  287. package/dist/src/tui/tui-startup-resources.js +1 -1
  288. package/dist/src/user-context/changes.d.ts +1 -1
  289. package/dist/src/user-context/config.d.ts +135 -153
  290. package/dist/src/user-context/config.js +94 -99
  291. package/dist/src/user-context/relationship-continuity.d.ts +2 -2
  292. package/dist/src/user-context/relationship-continuity.js +34 -24
  293. package/dist/src/user-context/sources/activity-clustering.d.ts +9 -3
  294. package/dist/src/user-context/sources/index.js +2 -2
  295. package/dist/src/user-context/sources/repository.d.ts +1 -21
  296. package/dist/src/user-context/sources/repository.js +1 -183
  297. package/dist/src/user-context/sources/types.d.ts +0 -23
  298. package/dist/src/user-model/capture/executor.d.ts +40 -0
  299. package/dist/src/user-model/capture/executor.js +134 -0
  300. package/dist/src/user-model/capture/index.d.ts +2 -0
  301. package/dist/src/user-model/capture/index.js +3 -0
  302. package/dist/src/user-model/capture/semantic.d.ts +21 -0
  303. package/dist/src/user-model/capture/semantic.js +197 -0
  304. package/dist/src/user-model/domain.d.ts +93 -0
  305. package/dist/src/user-model/domain.js +33 -0
  306. package/dist/src/user-model/goals.d.ts +58 -0
  307. package/dist/src/user-model/goals.js +89 -0
  308. package/dist/src/user-model/importance.d.ts +11 -0
  309. package/dist/src/user-model/importance.js +17 -0
  310. package/dist/src/user-model/index.d.ts +5 -0
  311. package/dist/src/user-model/index.js +6 -0
  312. package/dist/src/user-model/repository.d.ts +23 -0
  313. package/dist/src/user-model/repository.js +268 -0
  314. package/dist/src/user-model/temporal.d.ts +10 -0
  315. package/dist/src/user-model/temporal.js +44 -0
  316. package/dist/src/voice/realtime/memory-context.d.ts +7 -2
  317. package/dist/src/voice/realtime/memory-context.js +39 -51
  318. package/dist/src/work-discovery/service.d.ts +3 -14
  319. package/dist/src/work-discovery/service.js +138 -99
  320. package/dist/src/work-discovery/types.d.ts +3 -3
  321. package/dist/src/workflows/service/workflow-run-service.js +1 -1
  322. package/dist/src/workflows/service/workflow-session-bridge.js +12 -20
  323. package/package.json +1 -1
  324. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-CUXApfcE.js +0 -1
  325. package/dist/gateway/static/root/assets/agents-DNq_GKuc.js +0 -1
  326. package/dist/gateway/static/root/assets/app-management-settings-panel-qfwAgyhQ.js +0 -1
  327. package/dist/gateway/static/root/assets/appearance-settings-DqQVUpCC.js +0 -1
  328. package/dist/gateway/static/root/assets/apps-page-dwIqYmXk.js +0 -1
  329. package/dist/gateway/static/root/assets/automations-workspace-SkdcSZ0i.js +0 -6
  330. package/dist/gateway/static/root/assets/browser-settings-page-CKCa6TvG.js +0 -8
  331. package/dist/gateway/static/root/assets/capabilities-settings-panel-DSp--zIZ.js +0 -7
  332. package/dist/gateway/static/root/assets/channels-settings-CMd2dDrI.js +0 -1
  333. package/dist/gateway/static/root/assets/cloud-C4-yfnnk.js +0 -1
  334. package/dist/gateway/static/root/assets/connectors-page-udWs5Kdm.js +0 -2
  335. package/dist/gateway/static/root/assets/dependency-picker-DpN3XZg9.js +0 -1
  336. package/dist/gateway/static/root/assets/desktop-pet-settings-DinCToZh.js +0 -1
  337. package/dist/gateway/static/root/assets/ellipsis-0k4rZLoy.js +0 -1
  338. package/dist/gateway/static/root/assets/extension-settings-page-DcguCgsH.js +0 -1
  339. package/dist/gateway/static/root/assets/eye-CABVeTq0.js +0 -1
  340. package/dist/gateway/static/root/assets/eye-off-DEAzt3g1.js +0 -1
  341. package/dist/gateway/static/root/assets/folder-open-CyzJ19I9.js +0 -1
  342. package/dist/gateway/static/root/assets/form-field-width-DJw_jULe.js +0 -1
  343. package/dist/gateway/static/root/assets/gateway-config-api-Br7lSf6H.js +0 -1
  344. package/dist/gateway/static/root/assets/gateway-settings-CdPoDMuj.js +0 -1
  345. package/dist/gateway/static/root/assets/heartbeat-settings-DHk1hawP.js +0 -1
  346. package/dist/gateway/static/root/assets/home-page-YGipe_W6.js +0 -1
  347. package/dist/gateway/static/root/assets/index-D5TQQpeb.js +0 -71
  348. package/dist/gateway/static/root/assets/index-DReBaaTX.css +0 -2
  349. package/dist/gateway/static/root/assets/interaction-BmQogeqz.js +0 -1
  350. package/dist/gateway/static/root/assets/is-masked-secret-DOkL5b_X.js +0 -1
  351. package/dist/gateway/static/root/assets/link-2-D_ZKYUW7.js +0 -1
  352. package/dist/gateway/static/root/assets/local-context-graph-BjUf7fQ9.js +0 -1
  353. package/dist/gateway/static/root/assets/logs-page-CXKy6E_l.js +0 -2
  354. package/dist/gateway/static/root/assets/message-square-plus-XP0tGdlV.js +0 -1
  355. package/dist/gateway/static/root/assets/messages-CHNYp8EQ.js +0 -3
  356. package/dist/gateway/static/root/assets/minimize-2-DtOGrlpo.js +0 -1
  357. package/dist/gateway/static/root/assets/mobile-pairing-wizard-3NKCniSp.js +0 -1
  358. package/dist/gateway/static/root/assets/models-hub-cache-nCfkBN8M.js +0 -1
  359. package/dist/gateway/static/root/assets/notes-page-DuqLahi6.js +0 -1
  360. package/dist/gateway/static/root/assets/notes-workbench-C7j9EdQk.js +0 -5
  361. package/dist/gateway/static/root/assets/oauth-api-8lP_qJpq.js +0 -1
  362. package/dist/gateway/static/root/assets/oauth-authorization-window-Cdolr2wE.js +0 -1
  363. package/dist/gateway/static/root/assets/page-tabs-BaEQMYm_.js +0 -1
  364. package/dist/gateway/static/root/assets/pencil-DmIY3Oa-.js +0 -1
  365. package/dist/gateway/static/root/assets/preview-open-alternatives-CsNVTKC0.js +0 -1
  366. package/dist/gateway/static/root/assets/project-detail-page-CfebYVX0.js +0 -1
  367. package/dist/gateway/static/root/assets/projects-page-48GvzSVa.js +0 -1
  368. package/dist/gateway/static/root/assets/remote-access-hub-64xj_s2m.js +0 -1
  369. package/dist/gateway/static/root/assets/rotate-cw-LIg3Am9S.js +0 -1
  370. package/dist/gateway/static/root/assets/search-DA7gz22f.js +0 -1
  371. package/dist/gateway/static/root/assets/sessions-page-CcwcdRN8.js +0 -1
  372. package/dist/gateway/static/root/assets/settings-advanced-gate-BaN84CyW.js +0 -1
  373. package/dist/gateway/static/root/assets/settings-form-section-DjWzRk4z.js +0 -1
  374. package/dist/gateway/static/root/assets/setup-status-panel-DVVOCNbr.js +0 -1
  375. package/dist/gateway/static/root/assets/shares-settings-DUYbYLi7.js +0 -1
  376. package/dist/gateway/static/root/assets/skill-reload-api-BGyD0gB9.js +0 -1
  377. package/dist/gateway/static/root/assets/skills-page-CjF8DTsN.js +0 -2
  378. package/dist/gateway/static/root/assets/system-settings-panel-BSYuRgFI.js +0 -1
  379. package/dist/gateway/static/root/assets/task-detail-page-YZYSTJH7.js +0 -1
  380. package/dist/gateway/static/root/assets/tunnel-api-FKUi9wDL.js +0 -1
  381. package/dist/gateway/static/root/assets/user-context-page-BCyiduKd.js +0 -2
  382. package/dist/gateway/static/root/assets/work-discovery-overlay-jhT2EzeH.js +0 -1
  383. package/dist/gateway/static/root/assets/workflows-page-DQC0TpMa.js +0 -5
  384. package/dist/src/agent/memory/builtin-provider.d.ts +0 -37
  385. package/dist/src/agent/memory/builtin-provider.js +0 -225
  386. package/dist/src/agent/memory/context/types.d.ts +0 -40
  387. package/dist/src/agent/memory/understanding/quality.d.ts +0 -8
  388. package/dist/src/agent/memory/understanding/quality.js +0 -18
  389. package/dist/src/agent/memory/understanding/service.d.ts +0 -19
  390. package/dist/src/agent/memory/understanding/service.js +0 -209
  391. package/dist/src/agent/memory/understanding/types.d.ts +0 -34
  392. package/dist/src/agent/memory/understanding/types.js +0 -1
  393. package/dist/src/agent/memory/user-context-coordinator.d.ts +0 -23
  394. package/dist/src/agent/memory/user-context-coordinator.js +0 -113
  395. package/dist/src/agent/tools/dreaming-tool.js +0 -37
  396. package/dist/src/agent/tools/memory-tool.d.ts +0 -9
  397. package/dist/src/agent/tools/memory-tool.js +0 -119
  398. package/dist/src/gateway/dreaming-automation-reconciler.d.ts +0 -11
  399. package/dist/src/gateway/dreaming-automation-reconciler.js +0 -63
  400. package/dist/src/gateway/hono/routes/understanding-sources.d.ts +0 -21
  401. package/dist/src/gateway/hono/routes/understanding-sources.js +0 -387
  402. package/dist/src/gateway/hono/routes/you.d.ts +0 -3
  403. package/dist/src/gateway/hono/routes/you.js +0 -457
  404. package/dist/src/projects/memory-bind.d.ts +0 -1
  405. package/dist/src/projects/memory-bind.js +0 -14
  406. package/dist/src/storage/sqlite/context-consolidation-repository.d.ts +0 -37
  407. package/dist/src/storage/sqlite/context-consolidation-repository.js +0 -64
  408. package/dist/src/storage/sqlite/memory-records-repository.d.ts +0 -217
  409. package/dist/src/storage/sqlite/memory-records-repository.js +0 -715
  410. package/dist/src/storage/sqlite/remote-context-repository.d.ts +0 -3
  411. package/dist/src/storage/sqlite/remote-context-repository.js +0 -40
  412. package/dist/src/storage/sqlite/understanding-focus-exclusions.d.ts +0 -2
  413. package/dist/src/storage/sqlite/understanding-focus-exclusions.js +0 -24
  414. package/dist/src/storage/sqlite/user-context-quality-repository.d.ts +0 -49
  415. package/dist/src/storage/sqlite/user-context-quality-repository.js +0 -118
  416. package/dist/src/storage/sqlite/user-context-repository.d.ts +0 -85
  417. package/dist/src/storage/sqlite/user-context-repository.js +0 -535
  418. package/dist/src/user-context/automatic-context.d.ts +0 -17
  419. package/dist/src/user-context/automatic-context.js +0 -85
  420. package/dist/src/user-context/consolidation.d.ts +0 -27
  421. package/dist/src/user-context/consolidation.js +0 -187
  422. package/dist/src/user-context/context-objects.d.ts +0 -17
  423. package/dist/src/user-context/context-objects.js +0 -99
  424. package/dist/src/user-context/evaluation/harness.d.ts +0 -13
  425. package/dist/src/user-context/evaluation/harness.js +0 -31
  426. package/dist/src/user-context/extraction/executor.d.ts +0 -22
  427. package/dist/src/user-context/extraction/executor.js +0 -142
  428. package/dist/src/user-context/extraction/repair.d.ts +0 -19
  429. package/dist/src/user-context/extraction/repair.js +0 -71
  430. package/dist/src/user-context/extraction/semantic.d.ts +0 -18
  431. package/dist/src/user-context/extraction/semantic.js +0 -148
  432. package/dist/src/user-context/focus-lifecycle.d.ts +0 -2
  433. package/dist/src/user-context/focus-lifecycle.js +0 -26
  434. package/dist/src/user-context/manual-understanding.d.ts +0 -12
  435. package/dist/src/user-context/manual-understanding.js +0 -37
  436. package/dist/src/user-context/planner.d.ts +0 -17
  437. package/dist/src/user-context/planner.js +0 -465
  438. package/dist/src/user-context/relationships/indexer.d.ts +0 -13
  439. package/dist/src/user-context/relationships/indexer.js +0 -185
  440. package/dist/src/user-context/relationships/service.d.ts +0 -22
  441. package/dist/src/user-context/relationships/service.js +0 -50
  442. package/dist/src/user-context/retriever.d.ts +0 -15
  443. package/dist/src/user-context/retriever.js +0 -124
  444. package/dist/src/user-context/scope.d.ts +0 -7
  445. package/dist/src/user-context/scope.js +0 -9
  446. package/dist/src/user-context/selection-policy.d.ts +0 -20
  447. package/dist/src/user-context/selection-policy.js +0 -33
  448. package/dist/src/user-context/understanding.d.ts +0 -15
  449. package/dist/src/user-context/understanding.js +0 -24
  450. package/dist/src/user-context/understandingQuality.d.ts +0 -5
  451. package/dist/src/user-context/understandingQuality.js +0 -48
  452. /package/dist/src/{agent/memory/context/types.js → knowledge-memory/domain.js} +0 -0
@@ -0,0 +1,28 @@
1
+ export type MemoryMaintenanceJob = 'temporal_sweep' | 'daily_reconciliation' | 'weekly_knowledge' | 'manual_repair';
2
+ export interface MemoryMaintenanceMetrics {
3
+ scanned: number;
4
+ stale: number;
5
+ needsReview: number;
6
+ activated: number;
7
+ expiredPriorities: number;
8
+ archived: number;
9
+ repairedIndexes: number;
10
+ }
11
+ export interface MemoryMaintenanceResult {
12
+ runId: string;
13
+ jobType: MemoryMaintenanceJob;
14
+ status: 'running' | 'completed' | 'failed';
15
+ skipped: boolean;
16
+ metrics: MemoryMaintenanceMetrics;
17
+ }
18
+ export interface RunMemoryMaintenanceInput {
19
+ jobType: MemoryMaintenanceJob;
20
+ principalId?: string;
21
+ now?: number;
22
+ idempotencyKey?: string;
23
+ limit?: number;
24
+ staleRetentionDays?: number;
25
+ evidenceThreshold?: number;
26
+ }
27
+ export declare function runMemoryMaintenance(input: RunMemoryMaintenanceInput): MemoryMaintenanceResult;
28
+ export declare function listMemoryMaintenanceRuns(limit?: number): Array<Record<string, unknown>>;
@@ -0,0 +1,216 @@
1
+ import { getSqliteDatabase, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
2
+ import "../user-model/domain.js";
3
+ import { randomUUID } from "node:crypto";
4
+ //#region src/memory-maintenance/service.ts
5
+ const ALGORITHM_VERSION = "user-model-maintenance-v1";
6
+ function emptyMetrics() {
7
+ return {
8
+ scanned: 0,
9
+ stale: 0,
10
+ needsReview: 0,
11
+ activated: 0,
12
+ expiredPriorities: 0,
13
+ archived: 0,
14
+ repairedIndexes: 0
15
+ };
16
+ }
17
+ function periodKey(job, now) {
18
+ const date = new Date(now);
19
+ if (job === "temporal_sweep") return date.toISOString().slice(0, 13);
20
+ if (job === "daily_reconciliation") return date.toISOString().slice(0, 10);
21
+ if (job === "weekly_knowledge") {
22
+ const monday = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));
23
+ const day = monday.getUTCDay() || 7;
24
+ monday.setUTCDate(monday.getUTCDate() - day + 1);
25
+ return monday.toISOString().slice(0, 10);
26
+ }
27
+ return String(now);
28
+ }
29
+ function addDecision(db, runId, objectType, objectId, action, reason, before, after, now) {
30
+ db.prepare(`INSERT INTO memory_maintenance_decisions (
31
+ decision_id, run_id, object_type, object_id, action, reason, before_json, after_json, created_at
32
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(randomUUID(), runId, objectType, objectId, action, reason, before === void 0 ? null : JSON.stringify(before), after === void 0 ? null : JSON.stringify(after), now);
33
+ }
34
+ function transitionAssertions(db, runId, now, limit, metrics) {
35
+ const expired = db.prepare(`SELECT assertion_id, status, valid_to FROM user_assertions
36
+ WHERE status = 'active' AND valid_to IS NOT NULL AND valid_to < ? LIMIT ?`).all(now, limit);
37
+ metrics.scanned += expired.length;
38
+ for (const row of expired) {
39
+ db.prepare("UPDATE user_assertions SET status = 'stale' WHERE assertion_id = ? AND status = 'active'").run(row.assertion_id);
40
+ db.prepare(`INSERT INTO user_assertion_status_events (
41
+ event_id, assertion_id, from_status, to_status, actor_type, reason, source_run_id, created_at
42
+ ) VALUES (?, ?, 'active', 'stale', 'maintenance', 'Validity interval ended.', ?, ?)`).run(randomUUID(), row.assertion_id, runId, now);
43
+ addDecision(db, runId, "assertion", row.assertion_id, "stale", "validity_ended", row, { status: "stale" }, now);
44
+ metrics.stale += 1;
45
+ }
46
+ const reviewDue = db.prepare(`SELECT assertion_id, status, review_at FROM user_assertions
47
+ WHERE status = 'active' AND review_at IS NOT NULL AND review_at <= ? LIMIT ?`).all(now, Math.max(0, limit - expired.length));
48
+ metrics.scanned += reviewDue.length;
49
+ for (const row of reviewDue) {
50
+ db.prepare("UPDATE user_assertions SET status = 'needs_review' WHERE assertion_id = ? AND status = 'active'").run(row.assertion_id);
51
+ db.prepare(`INSERT INTO user_assertion_status_events (
52
+ event_id, assertion_id, from_status, to_status, actor_type, reason, source_run_id, created_at
53
+ ) VALUES (?, ?, 'active', 'needs_review', 'maintenance', 'Scheduled review became due.', ?, ?)`).run(randomUUID(), row.assertion_id, runId, now);
54
+ addDecision(db, runId, "assertion", row.assertion_id, "needs_review", "review_due", row, { status: "needs_review" }, now);
55
+ metrics.needsReview += 1;
56
+ }
57
+ }
58
+ function transitionPriorities(db, runId, principalId, now, limit, metrics) {
59
+ const rows = db.prepare(`SELECT priority_id, status, valid_to FROM user_priority_windows
60
+ WHERE principal_id = ? AND status = 'active' AND valid_to < ? LIMIT ?`).all(principalId, now, limit);
61
+ metrics.scanned += rows.length;
62
+ for (const row of rows) {
63
+ db.prepare("UPDATE user_priority_windows SET status = 'expired', updated_at = ? WHERE priority_id = ?").run(now, row.priority_id);
64
+ addDecision(db, runId, "priority", row.priority_id, "expired", "priority_window_ended", row, { status: "expired" }, now);
65
+ metrics.expiredPriorities += 1;
66
+ }
67
+ }
68
+ function transitionKnowledge(db, runId, principalId, now, limit, metrics) {
69
+ const expired = db.prepare(`SELECT knowledge_id, status, expires_at FROM knowledge_items
70
+ WHERE principal_id = ? AND status = 'active' AND expires_at IS NOT NULL AND expires_at < ? LIMIT ?`).all(principalId, now, limit);
71
+ metrics.scanned += expired.length;
72
+ for (const row of expired) {
73
+ db.prepare("UPDATE knowledge_items SET status = 'stale', updated_at = ? WHERE knowledge_id = ?").run(now, row.knowledge_id);
74
+ addDecision(db, runId, "knowledge", row.knowledge_id, "stale", "retention_expired", row, { status: "stale" }, now);
75
+ metrics.stale += 1;
76
+ }
77
+ const reviewDue = db.prepare(`SELECT knowledge_id, status, review_at FROM knowledge_items
78
+ WHERE principal_id = ? AND status = 'active' AND review_at IS NOT NULL AND review_at <= ? LIMIT ?`).all(principalId, now, Math.max(0, limit - expired.length));
79
+ metrics.scanned += reviewDue.length;
80
+ for (const row of reviewDue) {
81
+ db.prepare("UPDATE knowledge_items SET status = 'needs_review', updated_at = ? WHERE knowledge_id = ?").run(now, row.knowledge_id);
82
+ addDecision(db, runId, "knowledge", row.knowledge_id, "needs_review", "review_due", row, { status: "needs_review" }, now);
83
+ metrics.needsReview += 1;
84
+ }
85
+ }
86
+ function reconcileEvidence(db, runId, principalId, now, limit, evidenceThreshold, metrics) {
87
+ const contradicted = db.prepare(`SELECT DISTINCT a.assertion_id, a.status
88
+ FROM user_assertions a
89
+ JOIN user_assertion_slots s ON s.slot_id = a.slot_id
90
+ JOIN user_assertion_evidence ae ON ae.assertion_id = a.assertion_id AND ae.relation = 'contradicts'
91
+ WHERE s.principal_id = ? AND a.status = 'active' LIMIT ?`).all(principalId, limit);
92
+ metrics.scanned += contradicted.length;
93
+ for (const row of contradicted) {
94
+ db.prepare("UPDATE user_assertions SET status = 'needs_review' WHERE assertion_id = ?").run(row.assertion_id);
95
+ db.prepare(`INSERT INTO user_assertion_status_events (
96
+ event_id, assertion_id, from_status, to_status, actor_type, reason, source_run_id, created_at
97
+ ) VALUES (?, ?, 'active', 'needs_review', 'maintenance', 'Contradictory evidence exists.', ?, ?)`).run(randomUUID(), row.assertion_id, runId, now);
98
+ addDecision(db, runId, "assertion", row.assertion_id, "needs_review", "contradictory_evidence", row, { status: "needs_review" }, now);
99
+ metrics.needsReview += 1;
100
+ }
101
+ const candidates = db.prepare(`SELECT a.assertion_id, a.status, COUNT(DISTINCT
102
+ e.source_type || ':' || COALESCE(e.source_instance_id, '') || ':' || e.source_ref
103
+ ) AS evidence_count
104
+ FROM user_assertions a
105
+ JOIN user_assertion_slots s ON s.slot_id = a.slot_id
106
+ JOIN user_assertion_evidence ae ON ae.assertion_id = a.assertion_id AND ae.relation = 'supports'
107
+ JOIN context_evidence e ON e.evidence_id = ae.evidence_id AND e.trust_level = 'owner'
108
+ WHERE s.principal_id = ? AND a.status = 'candidate'
109
+ AND a.authority IN ('user_observed', 'system_inferred')
110
+ GROUP BY a.assertion_id HAVING evidence_count >= ? LIMIT ?`).all(principalId, evidenceThreshold, limit);
111
+ metrics.scanned += candidates.length;
112
+ for (const row of candidates) {
113
+ db.prepare("UPDATE user_assertions SET status = 'active' WHERE assertion_id = ? AND status = 'candidate'").run(row.assertion_id);
114
+ db.prepare(`INSERT INTO user_assertion_status_events (
115
+ event_id, assertion_id, from_status, to_status, actor_type, reason, source_run_id, created_at
116
+ ) VALUES (?, ?, 'candidate', 'active', 'maintenance', 'Independent owner evidence threshold met.', ?, ?)`).run(randomUUID(), row.assertion_id, runId, now);
117
+ addDecision(db, runId, "assertion", row.assertion_id, "activated", "owner_evidence_threshold", row, { status: "active" }, now);
118
+ metrics.activated += 1;
119
+ }
120
+ }
121
+ function repairIndexes(db, runId, now, metrics) {
122
+ const assertionMissing = db.prepare(`SELECT COUNT(*) AS count FROM user_assertions a
123
+ LEFT JOIN user_assertions_fts f ON f.assertion_id = a.assertion_id
124
+ WHERE f.assertion_id IS NULL`).get();
125
+ const knowledgeMissing = db.prepare(`SELECT COUNT(*) AS count FROM knowledge_items k
126
+ LEFT JOIN knowledge_items_fts f ON f.knowledge_id = k.knowledge_id
127
+ WHERE f.knowledge_id IS NULL`).get();
128
+ if (assertionMissing.count) db.prepare(`INSERT INTO user_assertions_fts(statement, assertion_id, slot_id)
129
+ SELECT a.statement, a.assertion_id, a.slot_id FROM user_assertions a
130
+ LEFT JOIN user_assertions_fts f ON f.assertion_id = a.assertion_id WHERE f.assertion_id IS NULL`).run();
131
+ if (knowledgeMissing.count) db.prepare(`INSERT INTO knowledge_items_fts(content, knowledge_id)
132
+ SELECT k.content, k.knowledge_id FROM knowledge_items k
133
+ LEFT JOIN knowledge_items_fts f ON f.knowledge_id = k.knowledge_id WHERE f.knowledge_id IS NULL`).run();
134
+ metrics.repairedIndexes = assertionMissing.count + knowledgeMissing.count;
135
+ if (metrics.repairedIndexes) addDecision(db, runId, "index", "fts", "repair", "missing_index_rows", { missing: metrics.repairedIndexes }, { missing: 0 }, now);
136
+ }
137
+ function archiveOldKnowledge(db, runId, principalId, cutoff, now, limit, metrics) {
138
+ const rows = db.prepare(`SELECT knowledge_id, status, updated_at FROM knowledge_items
139
+ WHERE principal_id = ? AND status = 'stale' AND updated_at < ? LIMIT ?`).all(principalId, cutoff, limit);
140
+ metrics.scanned += rows.length;
141
+ for (const row of rows) {
142
+ db.prepare("UPDATE knowledge_items SET status = 'archived', updated_at = ? WHERE knowledge_id = ?").run(now, row.knowledge_id);
143
+ addDecision(db, runId, "knowledge", row.knowledge_id, "archived", "stale_retention_elapsed", row, { status: "archived" }, now);
144
+ metrics.archived += 1;
145
+ }
146
+ }
147
+ function runMemoryMaintenance(input) {
148
+ const now = input.now ?? Date.now();
149
+ const principalId = input.principalId ?? "local-owner";
150
+ const limit = Math.max(1, Math.min(1e4, input.limit ?? 1e3));
151
+ const evidenceThreshold = Math.max(2, Math.min(10, input.evidenceThreshold ?? 2));
152
+ const idempotencyKey = input.idempotencyKey ?? `${principalId}:${input.jobType}:${periodKey(input.jobType, now)}`;
153
+ const existing = getSqliteDatabase().prepare(`SELECT run_id, status, metrics_json
154
+ FROM memory_maintenance_runs WHERE idempotency_key = ?`).get(idempotencyKey);
155
+ if (existing && existing.status !== "failed") return {
156
+ runId: existing.run_id,
157
+ jobType: input.jobType,
158
+ status: existing.status,
159
+ skipped: true,
160
+ metrics: JSON.parse(existing.metrics_json)
161
+ };
162
+ const runId = existing?.run_id ?? randomUUID();
163
+ const metrics = emptyMetrics();
164
+ const snapshot = JSON.stringify({
165
+ limit,
166
+ staleRetentionDays: input.staleRetentionDays ?? 30,
167
+ evidenceThreshold
168
+ });
169
+ runSqliteWriteTransaction((db) => {
170
+ if (existing) db.prepare(`UPDATE memory_maintenance_runs SET status = 'running', config_snapshot_json = ?,
171
+ cursor_json = '{}', metrics_json = '{}', error_message = NULL, started_at = ?, finished_at = NULL
172
+ WHERE run_id = ?`).run(snapshot, now, runId);
173
+ else db.prepare(`INSERT INTO memory_maintenance_runs (
174
+ run_id, principal_id, job_type, idempotency_key, algorithm_version,
175
+ config_snapshot_json, status, started_at
176
+ ) VALUES (?, ?, ?, ?, ?, ?, 'running', ?)`).run(runId, principalId, input.jobType, idempotencyKey, ALGORITHM_VERSION, snapshot, now);
177
+ });
178
+ try {
179
+ runSqliteWriteTransaction((db) => {
180
+ transitionAssertions(db, runId, now, limit, metrics);
181
+ transitionPriorities(db, runId, principalId, now, limit, metrics);
182
+ transitionKnowledge(db, runId, principalId, now, limit, metrics);
183
+ if (input.jobType === "daily_reconciliation" || input.jobType === "manual_repair") {
184
+ reconcileEvidence(db, runId, principalId, now, limit, evidenceThreshold, metrics);
185
+ repairIndexes(db, runId, now, metrics);
186
+ }
187
+ if (input.jobType === "weekly_knowledge" || input.jobType === "manual_repair") archiveOldKnowledge(db, runId, principalId, now - (input.staleRetentionDays ?? 30) * 24 * 60 * 60 * 1e3, now, limit, metrics);
188
+ db.prepare(`UPDATE memory_maintenance_runs SET status = 'completed', metrics_json = ?, finished_at = ?
189
+ WHERE run_id = ?`).run(JSON.stringify(metrics), now, runId);
190
+ });
191
+ return {
192
+ runId,
193
+ jobType: input.jobType,
194
+ status: "completed",
195
+ skipped: false,
196
+ metrics
197
+ };
198
+ } catch (error) {
199
+ const message = error instanceof Error ? error.message : String(error);
200
+ getSqliteDatabase().prepare(`UPDATE memory_maintenance_runs SET status = 'failed',
201
+ metrics_json = ?, error_message = ?, finished_at = ? WHERE run_id = ?`).run(JSON.stringify(metrics), message, now, runId);
202
+ throw error;
203
+ }
204
+ }
205
+ function listMemoryMaintenanceRuns(limit = 20) {
206
+ return getSqliteDatabase().prepare(`SELECT run_id AS runId, principal_id AS principalId,
207
+ job_type AS jobType, idempotency_key AS idempotencyKey, algorithm_version AS algorithmVersion,
208
+ status, metrics_json AS metricsJson, error_message AS errorMessage,
209
+ started_at AS startedAt, finished_at AS finishedAt
210
+ FROM memory_maintenance_runs ORDER BY started_at DESC LIMIT ?`).all(Math.max(1, Math.min(100, limit))).map(({ metricsJson, ...row }) => ({
211
+ ...row,
212
+ metrics: typeof metricsJson === "string" ? JSON.parse(metricsJson) : {}
213
+ }));
214
+ }
215
+ //#endregion
216
+ export { listMemoryMaintenanceRuns, runMemoryMaintenance };
@@ -46,6 +46,7 @@ export declare class NotesService {
46
46
  offset: number;
47
47
  hasMore: boolean;
48
48
  }>;
49
+ listProjectSummaries(): import("./types.js").NoteProjectSummary[];
49
50
  addAttachment(noteId: string, file: {
50
51
  name: string;
51
52
  buffer: Buffer;
@@ -2,6 +2,7 @@ import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
3
  import { buildNoteAttachmentRef } from "./attachment-ref.js";
4
4
  import { parseNoteMarkdown } from "./note-markdown.js";
5
+ import { listNoteProjectSummaries } from "../storage/sqlite/notes-repository.js";
5
6
  import { changedFieldsFromPatch, emitActivity, previewText, systemActivityActor, systemActivitySource } from "../activity/emitter.js";
6
7
  import { getDefaultModelSync, init_providers, resolveModel } from "../providers/index.js";
7
8
  import { completeWithResolvedCredentials } from "../providers/model-call.js";
@@ -280,6 +281,7 @@ var NotesService = class {
280
281
  const contentTouched = patch.markdown !== void 0 || patch.title !== void 0;
281
282
  if (contentTouched) await this.maybeSaveSnapshot(existing, trigger);
282
283
  const normalizedPatch = { ...patch };
284
+ if (contentTouched) normalizedPatch.lastEditTrigger = trigger;
283
285
  if (patch.markdown !== void 0) normalizedPatch.kind = patch.kind ?? inferKind(patch.markdown, Boolean(existing.attachments?.length), existing.attachments);
284
286
  if (contentTouched || patch.attachments) {
285
287
  normalizedPatch.remoteVersion = (existing.remoteVersion ?? 1) + 1;
@@ -483,6 +485,9 @@ var NotesService = class {
483
485
  async listNotes(query = {}) {
484
486
  return this.store.listNotes(query);
485
487
  }
488
+ listProjectSummaries() {
489
+ return listNoteProjectSummaries();
490
+ }
486
491
  async addAttachment(noteId, file, idempotencyKey) {
487
492
  if (!idempotencyKey) return this.addAttachmentWithId(noteId, file, randomUUID());
488
493
  const attachmentId = noteAttachmentId(noteId, idempotencyKey);
@@ -555,7 +560,8 @@ var NotesService = class {
555
560
  markdown: snapshot.markdown,
556
561
  tags: snapshot.tags,
557
562
  kind: snapshot.kind,
558
- status: snapshot.status
563
+ status: snapshot.status,
564
+ lastEditTrigger: "restore"
559
565
  });
560
566
  }
561
567
  async moveToGroup(noteId, groupId) {
@@ -113,6 +113,8 @@ export interface Note {
113
113
  status: NoteStatus;
114
114
  /** Canonical note body. Markdown is the only content truth. */
115
115
  markdown: string;
116
+ /** Provenance of the latest content edit, independent of snapshot throttling. */
117
+ lastEditTrigger?: SnapshotTrigger;
116
118
  attachments?: NoteAttachment[];
117
119
  createdAt: number;
118
120
  updatedAt: number;
@@ -149,6 +151,18 @@ export interface NoteIndexEntry {
149
151
  taskCount?: number;
150
152
  uncheckedTaskCount?: number;
151
153
  linkCount?: number;
154
+ projects?: Array<{
155
+ id: string;
156
+ name: string;
157
+ }>;
158
+ lastEditTrigger?: SnapshotTrigger;
159
+ }
160
+ export interface NoteProjectSummary {
161
+ id: string;
162
+ name: string;
163
+ description?: string;
164
+ noteCount: number;
165
+ updatedAt?: number;
152
166
  }
153
167
  export interface NotesIndexFile {
154
168
  version: number;
@@ -175,6 +189,8 @@ export interface NotesListQuery {
175
189
  kind?: NoteKind;
176
190
  tag?: string;
177
191
  projectId?: string;
192
+ unassigned?: boolean;
193
+ agentEdited?: boolean;
178
194
  pinned?: boolean;
179
195
  search?: string;
180
196
  limit?: number;
@@ -15,8 +15,8 @@ export declare class InternalObjectContextProvider implements ContextProvider {
15
15
  supports(): boolean;
16
16
  collect(input: ContextInput): Promise<ResolvedContext>;
17
17
  }
18
- export declare class UserUnderstandingContextProvider implements ContextProvider {
19
- readonly id = "user_understanding";
18
+ export declare class UserModelContextProvider implements ContextProvider {
19
+ readonly id = "user_model";
20
20
  supports(): boolean;
21
21
  collect(input: ContextInput): Promise<ResolvedContext>;
22
22
  }
@@ -1,7 +1,8 @@
1
1
  import { getSqliteDatabase } from "../../storage/sqlite/transaction.js";
2
- import { listUnderstandings } from "../../storage/sqlite/user-context-repository.js";
3
2
  import { getKnowledgeSourceItem } from "../../storage/sqlite/knowledge-repository.js";
4
3
  import { getConnectorSyncPolicyForConnection } from "../../storage/sqlite/connector-sync-policy-repository.js";
4
+ import { getAssertionSlot, listUserAssertions } from "../../user-model/repository.js";
5
+ import "../../user-model/index.js";
5
6
  import { wrapExternalContent } from "../../gateway/security/external-content.js";
6
7
  //#region src/proactive/execution/context.ts
7
8
  const MAX_EVENT_COUNT = 50;
@@ -154,28 +155,32 @@ var InternalObjectContextProvider = class {
154
155
  };
155
156
  }
156
157
  };
157
- var UserUnderstandingContextProvider = class {
158
- id = "user_understanding";
158
+ var UserModelContextProvider = class {
159
+ id = "user_model";
159
160
  supports() {
160
161
  return true;
161
162
  }
162
163
  async collect(input) {
163
164
  const scope = eventRows(input.eventIds).at(-1);
164
165
  if (!scope) return emptyContext();
165
- const records = listUnderstandings(["active"]).filter((record) => {
166
+ const records = listUserAssertions({
167
+ statuses: ["active"],
168
+ limit: 500
169
+ }).filter((record) => {
166
170
  const now = Date.now();
167
- const scopeMatches = record.scope.type === "global" || record.scope.type === "workspace" && record.scope.id === scope.workspace_id || record.scope.type === "project" && record.scope.id === scope.project_id;
168
- return record.disclosurePolicy === "referenceable" && record.sensitivity !== "secret" && record.sensitivity !== "regulated" && scopeMatches && (!record.validFrom || record.validFrom <= now) && (!record.validTo || record.validTo >= now) && (!record.expiresAt || record.expiresAt >= now) && !record.conflictGroupId && (record.explicitness === "explicit" || record.confidence >= .7);
171
+ const assertionScope = getAssertionSlot(record.slotId)?.scope;
172
+ const scopeMatches = assertionScope?.type === "global" || assertionScope?.type === "workspace" && assertionScope.id === scope.workspace_id || assertionScope?.type === "project" && assertionScope.id === scope.project_id || assertionScope?.type === "agent" && assertionScope.id === scope.agent_id;
173
+ return record.disclosurePolicy === "referenceable" && record.sensitivity !== "secret" && record.sensitivity !== "regulated" && scopeMatches && (!record.validFrom || record.validFrom <= now) && (!record.validTo || record.validTo >= now) && (record.authority === "user_explicit" || record.confidence >= .7);
169
174
  }).slice(0, 20);
170
175
  return {
171
176
  content: { records: records.map((record) => ({
172
- evidenceId: `understanding:${record.id}`,
177
+ evidenceId: `assertion:${record.id}`,
173
178
  kind: record.kind,
174
179
  content: boundedText(record.statement, 1e3),
175
180
  confidence: record.confidence,
176
- updatedAt: record.updatedAt
181
+ recordedAt: record.recordedAt
177
182
  })) },
178
- evidenceIds: records.map((record) => `understanding:${record.id}`)
183
+ evidenceIds: records.map((record) => `assertion:${record.id}`)
179
184
  };
180
185
  }
181
186
  };
@@ -295,7 +300,7 @@ var ContextProviderRegistry = class {
295
300
  new EventBatchContextProvider(),
296
301
  new ConnectedSourceContextProvider(),
297
302
  new InternalObjectContextProvider(),
298
- new UserUnderstandingContextProvider(),
303
+ new UserModelContextProvider(),
299
304
  new MeetingWorkspaceContextProvider(),
300
305
  new ProjectStateContextProvider(),
301
306
  new AutomationStateContextProvider()
@@ -315,4 +320,4 @@ var ContextProviderRegistry = class {
315
320
  }
316
321
  };
317
322
  //#endregion
318
- export { AutomationStateContextProvider, ConnectedSourceContextProvider, ContextProviderRegistry, EventBatchContextProvider, InternalObjectContextProvider, MeetingWorkspaceContextProvider, ProjectStateContextProvider, UserUnderstandingContextProvider };
323
+ export { AutomationStateContextProvider, ConnectedSourceContextProvider, ContextProviderRegistry, EventBatchContextProvider, InternalObjectContextProvider, MeetingWorkspaceContextProvider, ProjectStateContextProvider, UserModelContextProvider };
@@ -8,7 +8,7 @@ export type { SignalBatch } from './routing/batch-repository.js';
8
8
  export { ProactiveEventService } from './service.js';
9
9
  export { ProactiveScenarioService } from './scenarios/service.js';
10
10
  export type { PromptRevision, ScenarioDefinition, ScenarioSubscription } from './scenarios/types.js';
11
- export { AutomationStateContextProvider, ConnectedSourceContextProvider, ContextProviderRegistry, EventBatchContextProvider, InternalObjectContextProvider, MeetingWorkspaceContextProvider, ProjectStateContextProvider, UserUnderstandingContextProvider, } from './execution/context.js';
11
+ export { AutomationStateContextProvider, ConnectedSourceContextProvider, ContextProviderRegistry, EventBatchContextProvider, InternalObjectContextProvider, MeetingWorkspaceContextProvider, ProjectStateContextProvider, UserModelContextProvider, } from './execution/context.js';
12
12
  export { ReadonlyProactiveAgentExecutor } from './execution/agent-executor.js';
13
13
  export { listInsights } from './execution/repository.js';
14
14
  export { ProactiveWorker } from './execution/worker.js';
@@ -3,11 +3,11 @@ import { normalizeEventEnvelope } from "./events/envelope.js";
3
3
  import { mapProductEventToProactive } from "./events/product-event-bridge.js";
4
4
  import { matchScenario, matchesCondition } from "./routing/matcher.js";
5
5
  import { ProactiveEventService } from "./service.js";
6
- import { AutomationStateContextProvider, ConnectedSourceContextProvider, ContextProviderRegistry, EventBatchContextProvider, InternalObjectContextProvider, MeetingWorkspaceContextProvider, ProjectStateContextProvider, UserUnderstandingContextProvider } from "./execution/context.js";
6
+ import { AutomationStateContextProvider, ConnectedSourceContextProvider, ContextProviderRegistry, EventBatchContextProvider, InternalObjectContextProvider, MeetingWorkspaceContextProvider, ProjectStateContextProvider, UserModelContextProvider } from "./execution/context.js";
7
7
  import { ReadonlyProactiveAgentExecutor } from "./execution/agent-executor.js";
8
8
  import { listInsights } from "./execution/repository.js";
9
9
  import { ProactiveWorker } from "./execution/worker.js";
10
10
  import { ProactiveTemporalWorker } from "./temporal/worker.js";
11
11
  import { ProactiveInboxService } from "./inbox/service.js";
12
12
  import { ProactiveInboxWorker } from "./inbox/worker.js";
13
- export { AutomationStateContextProvider, ConnectedSourceContextProvider, ContextProviderRegistry, EventBatchContextProvider, InternalObjectContextProvider, MeetingWorkspaceContextProvider, ProactiveEventService, ProactiveInboxService, ProactiveInboxWorker, ProactiveScenarioService, ProactiveTemporalWorker, ProactiveWorker, ProjectStateContextProvider, ReadonlyProactiveAgentExecutor, UserUnderstandingContextProvider, listInsights, mapProductEventToProactive, matchScenario, matchesCondition, normalizeEventEnvelope };
13
+ export { AutomationStateContextProvider, ConnectedSourceContextProvider, ContextProviderRegistry, EventBatchContextProvider, InternalObjectContextProvider, MeetingWorkspaceContextProvider, ProactiveEventService, ProactiveInboxService, ProactiveInboxWorker, ProactiveScenarioService, ProactiveTemporalWorker, ProactiveWorker, ProjectStateContextProvider, ReadonlyProactiveAgentExecutor, UserModelContextProvider, listInsights, mapProductEventToProactive, matchScenario, matchesCondition, normalizeEventEnvelope };
@@ -9,6 +9,6 @@ export * from './project-loop.js';
9
9
  export * from './session-bind.js';
10
10
  export * from './workflow-bind.js';
11
11
  export * from './automation-bind.js';
12
- export * from './memory-bind.js';
12
+ export * from './knowledge-bind.js';
13
13
  export * from './workspace.js';
14
14
  export * from './workspace-project.js';
@@ -10,5 +10,5 @@ import { CODING_PROJECT_AGENT_ID, inferSuggestedProjectDefaultAgentId, suggestPr
10
10
  import { buildProjectLoopOverview } from "./project-loop.js";
11
11
  import { bindWorkflowRunToProject } from "./workflow-bind.js";
12
12
  import { bindAutomationToProject } from "./automation-bind.js";
13
- import { bindMemoryRecordToProject } from "./memory-bind.js";
14
- export { CODING_PROJECT_AGENT_ID, ProjectService, ProjectSkillError, ProjectSkillService, ProjectStore, ProjectWorkspaceConflictError, ProjectWorkspaceMissingError, bindAutomationToProject, bindMemoryRecordToProject, bindSessionToProject, bindSessionsToProject, bindWorkflowRunToProject, buildProjectLoopOverview, canonicalWorkspacePath, ensureWorkspaceDirectory, getProjectForSession, getProjectWorkspacePathForSession, inferProjectExecutionMode, inferProjectKind, inferProjectNameFromWorkspaceRoot, inferSuggestedProjectDefaultAgentId, isPathSameOrInsideWorkspace, isSafeAutoCreateWorkspaceRoot, isValidProjectAgentId, listProjectSessionKeys, moveSessionToProject, normalizeProjectAgentId, resolveProjectAgentId, resolveProjectWorkspacePath, resolveWorkspaceProjectRoot, slugifyProjectName, suggestProjectDefaultAgentId, unbindSessionFromProject, workspaceDirectoryExists };
13
+ import { bindKnowledgeItemToProject } from "./knowledge-bind.js";
14
+ export { CODING_PROJECT_AGENT_ID, ProjectService, ProjectSkillError, ProjectSkillService, ProjectStore, ProjectWorkspaceConflictError, ProjectWorkspaceMissingError, bindAutomationToProject, bindKnowledgeItemToProject, bindSessionToProject, bindSessionsToProject, bindWorkflowRunToProject, buildProjectLoopOverview, canonicalWorkspacePath, ensureWorkspaceDirectory, getProjectForSession, getProjectWorkspacePathForSession, inferProjectExecutionMode, inferProjectKind, inferProjectNameFromWorkspaceRoot, inferSuggestedProjectDefaultAgentId, isPathSameOrInsideWorkspace, isSafeAutoCreateWorkspaceRoot, isValidProjectAgentId, listProjectSessionKeys, moveSessionToProject, normalizeProjectAgentId, resolveProjectAgentId, resolveProjectWorkspacePath, resolveWorkspaceProjectRoot, slugifyProjectName, suggestProjectDefaultAgentId, unbindSessionFromProject, workspaceDirectoryExists };
@@ -0,0 +1 @@
1
+ export declare function bindKnowledgeItemToProject(knowledgeId: string, projectId: string): void;
@@ -0,0 +1,15 @@
1
+ import { getSqliteDatabase, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
2
+ //#region src/projects/knowledge-bind.ts
3
+ function bindKnowledgeItemToProject(knowledgeId, projectId) {
4
+ const db = getSqliteDatabase();
5
+ if (!db.prepare("SELECT 1 FROM projects WHERE project_id = ?").get(projectId)) throw new Error(`Project not found: ${projectId}`);
6
+ if (!db.prepare("SELECT 1 FROM knowledge_items WHERE knowledge_id = ?").get(knowledgeId)) throw new Error(`Knowledge item not found: ${knowledgeId}`);
7
+ runSqliteWriteTransaction((tx) => {
8
+ const now = Date.now();
9
+ tx.prepare(`UPDATE knowledge_items SET scope_type = 'project', scope_id = ?, updated_at = ?
10
+ WHERE knowledge_id = ?`).run(projectId, now, knowledgeId);
11
+ tx.prepare("UPDATE projects SET last_active_at = ?, updated_at = ? WHERE project_id = ?").run(now, now, projectId);
12
+ });
13
+ }
14
+ //#endregion
15
+ export { bindKnowledgeItemToProject };
@@ -1,4 +1,4 @@
1
- import type { MemoryRecord } from '../agent/memory/types.js';
1
+ import type { KnowledgeItem } from '../knowledge-memory/index.js';
2
2
  import type { ProjectWithDetails } from './types.js';
3
3
  export type ProjectWorkflowRunBrief = {
4
4
  runId: string;
@@ -18,7 +18,7 @@ export type ProjectAttentionItem = {
18
18
  };
19
19
  export type ProjectTimelineItem = {
20
20
  id: string;
21
- kind: 'session' | 'task' | 'workflow' | 'memory';
21
+ kind: 'session' | 'task' | 'workflow' | 'knowledge';
22
22
  title: string;
23
23
  detail?: string;
24
24
  timestamp: number;
@@ -60,7 +60,7 @@ export declare function buildProjectLoopOverview(input: {
60
60
  tasks: ProjectTask[];
61
61
  recentWorkflowRuns: ProjectWorkflowRunBrief[];
62
62
  failedWorkflowRuns?: ProjectWorkflowRunBrief[];
63
- memoryRecords?: MemoryRecord[];
63
+ knowledgeItems?: KnowledgeItem[];
64
64
  nowMs?: number;
65
65
  staleAfterMs?: number;
66
66
  }): ProjectLoopOverview;
@@ -78,12 +78,12 @@ function buildProjectLoopOverview(input) {
78
78
  status: run.status,
79
79
  href: `/workflows?run=${encodeURIComponent(run.runId)}`
80
80
  })),
81
- ...(input.memoryRecords ?? []).slice(0, 5).map((record) => ({
82
- id: `memory:${record.id}`,
83
- kind: "memory",
81
+ ...(input.knowledgeItems ?? []).slice(0, 5).map((record) => ({
82
+ id: `knowledge:${record.id}`,
83
+ kind: "knowledge",
84
84
  title: record.kind,
85
85
  detail: compactText(record.content),
86
- timestamp: Date.parse(record.updatedAt),
86
+ timestamp: record.updatedAt,
87
87
  status: record.status
88
88
  }))
89
89
  ].filter((item) => Number.isFinite(item.timestamp)).sort((left, right) => right.timestamp - left.timestamp).slice(0, 12);
@@ -308,7 +308,8 @@ var ProjectStore = class {
308
308
  db.prepare(`UPDATE tasks SET project_id = NULL WHERE project_id = ?`).run(id);
309
309
  db.prepare(`UPDATE workflow_runs SET project_id = NULL WHERE project_id = ?`).run(id);
310
310
  db.prepare(`UPDATE automations SET project_id = NULL WHERE project_id = ?`).run(id);
311
- db.prepare(`UPDATE memory_records SET project_id = NULL WHERE project_id = ?`).run(id);
311
+ db.prepare(`UPDATE knowledge_items SET status = 'archived', updated_at = ?
312
+ WHERE scope_type = 'project' AND scope_id = ?`).run(Date.now(), id);
312
313
  db.prepare(`DELETE FROM projects_fts WHERE project_id = ?`).run(id);
313
314
  db.prepare(`DELETE FROM projects WHERE project_id = ?`).run(id);
314
315
  });
@@ -30,6 +30,7 @@ function isAuthorizedTopic(topic, scopes) {
30
30
  if (topic === "logs") return hasGatewayScope(scopes, "gateway.admin");
31
31
  if (topic === "sessions" || topic.startsWith("session:")) return hasGatewayScope(scopes, "sessions.read");
32
32
  if (topic.startsWith("run:")) return hasGatewayScope(scopes, "agents.run");
33
+ if (topic.startsWith("side-chat:")) return hasGatewayScope(scopes, "agents.run");
33
34
  if (topic.startsWith("workflow:")) return hasGatewayScope(scopes, "automations.read");
34
35
  return false;
35
36
  }
@@ -14,8 +14,8 @@ import { bundledPythonArchiveName, resolveOfflineBundleArtifact } from "./offlin
14
14
  import { normalizeRuntimeVersionRequest, parseRuntimeVersion, probeSystemRuntime, resolveInstallVersion, versionSatisfies } from "./probe.js";
15
15
  import { dirname, join } from "node:path";
16
16
  import { randomUUID } from "node:crypto";
17
- import { access, mkdir, realpath, rename, rm } from "node:fs/promises";
18
17
  import { EventEmitter } from "node:events";
18
+ import { access, mkdir, realpath, rename, rm } from "node:fs/promises";
19
19
  //#region src/runtime-tools/manager.ts
20
20
  init_logger();
21
21
  const log = createLogger("RuntimeManager");
@@ -0,0 +1,17 @@
1
+ import { type UserModelScope } from '../../user-model/domain.js';
2
+ export interface CollaborationRule {
3
+ id: string;
4
+ category: 'communication' | 'execution' | 'boundary' | 'routine' | 'proactive';
5
+ status: 'active' | 'disabled' | 'archived';
6
+ priority: number;
7
+ scope: UserModelScope;
8
+ conditions: Record<string, unknown>;
9
+ statement: string;
10
+ revisionId: string;
11
+ createdAt: number;
12
+ updatedAt: number;
13
+ }
14
+ export declare function getCollaborationRule(id: string): CollaborationRule | undefined;
15
+ export declare function listCollaborationRules(principalId?: string): CollaborationRule[];
16
+ export declare function createCollaborationRule(input: Pick<CollaborationRule, 'category' | 'priority' | 'scope' | 'conditions' | 'statement'>): CollaborationRule;
17
+ export declare function setCollaborationRuleStatus(id: string, status: CollaborationRule['status']): CollaborationRule | undefined;
@@ -0,0 +1,54 @@
1
+ import { getSqliteDatabase, runSqliteWriteTransaction } from "./transaction.js";
2
+ import { USER_MODEL_PRINCIPAL_ID } from "../../user-model/domain.js";
3
+ import { randomUUID } from "node:crypto";
4
+ //#region src/storage/sqlite/collaboration-rule-repository.ts
5
+ function fromRow(row) {
6
+ return {
7
+ id: row.rule_id,
8
+ category: row.category,
9
+ status: row.status,
10
+ priority: row.priority,
11
+ scope: {
12
+ type: row.scope_type,
13
+ ...row.scope_id ? { id: row.scope_id } : {}
14
+ },
15
+ conditions: JSON.parse(row.conditions_json),
16
+ statement: row.statement,
17
+ revisionId: row.current_revision_id,
18
+ createdAt: row.created_at,
19
+ updatedAt: row.updated_at
20
+ };
21
+ }
22
+ function getCollaborationRule(id) {
23
+ const row = getSqliteDatabase().prepare(`SELECT r.*, v.statement FROM collaboration_rules r
24
+ JOIN collaboration_rule_revisions v ON v.revision_id = r.current_revision_id
25
+ WHERE r.rule_id = ?`).get(id);
26
+ return row ? fromRow(row) : void 0;
27
+ }
28
+ function listCollaborationRules(principalId = USER_MODEL_PRINCIPAL_ID) {
29
+ return getSqliteDatabase().prepare(`SELECT r.*, v.statement FROM collaboration_rules r
30
+ JOIN collaboration_rule_revisions v ON v.revision_id = r.current_revision_id
31
+ WHERE r.principal_id = ? ORDER BY r.priority, r.updated_at DESC`).all(principalId).map(fromRow);
32
+ }
33
+ function createCollaborationRule(input) {
34
+ if (!input.statement.trim()) throw new Error("Collaboration rule statement is required.");
35
+ if (input.scope.type === "agent") throw new Error("Agent-scoped collaboration rules are not supported.");
36
+ const id = randomUUID();
37
+ const revisionId = randomUUID();
38
+ const now = Date.now();
39
+ runSqliteWriteTransaction((db) => {
40
+ db.prepare(`INSERT INTO collaboration_rules (
41
+ rule_id, principal_id, category, status, priority, scope_type, scope_id,
42
+ conditions_json, current_revision_id, created_at, updated_at
43
+ ) VALUES (?, ?, ?, 'active', ?, ?, ?, ?, ?, ?, ?)`).run(id, USER_MODEL_PRINCIPAL_ID, input.category, input.priority, input.scope.type, input.scope.id ?? null, JSON.stringify(input.conditions), revisionId, now, now);
44
+ db.prepare(`INSERT INTO collaboration_rule_revisions (
45
+ revision_id, rule_id, statement, created_by, created_at
46
+ ) VALUES (?, ?, ?, 'user', ?)`).run(revisionId, id, input.statement.trim(), now);
47
+ });
48
+ return getCollaborationRule(id);
49
+ }
50
+ function setCollaborationRuleStatus(id, status) {
51
+ return getSqliteDatabase().prepare(`UPDATE collaboration_rules SET status = ?, updated_at = ? WHERE rule_id = ?`).run(status, Date.now(), id).changes ? getCollaborationRule(id) : void 0;
52
+ }
53
+ //#endregion
54
+ export { createCollaborationRule, getCollaborationRule, listCollaborationRules, setCollaborationRuleStatus };