@xopcai/xopc 0.0.136 → 0.0.138

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 (271) hide show
  1. package/README.md +4 -0
  2. package/README.zh-CN.md +4 -0
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/demo-memory/src/index.js +4 -0
  5. package/dist/extensions/demo-memory/src/index.js.map +1 -1
  6. package/dist/extensions/telegram/xopc.extension.json +1 -1
  7. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CER17NHM.js → agent-avatar-dicebear-CIsGDJzd.js} +1 -1
  8. package/dist/gateway/static/root/assets/agents-fX97A6iN.js +2 -0
  9. package/dist/gateway/static/root/assets/{app-management-settings-panel-B3Ap_wpX.js → app-management-settings-panel-ByM4Bzwm.js} +1 -1
  10. package/dist/gateway/static/root/assets/{appearance-settings-3kBO22Xd.js → appearance-settings-BF_poRd3.js} +1 -1
  11. package/dist/gateway/static/root/assets/{apps-page-BHYbGQcZ.js → apps-page-BssdA5Qc.js} +1 -1
  12. package/dist/gateway/static/root/assets/{archive-plugin-D_vGeNB8.js → archive-plugin-DJaYoyGn.js} +1 -1
  13. package/dist/gateway/static/root/assets/{attachment-load-hWV_8pHL.js → attachment-load-xx6dBaZU.js} +1 -1
  14. package/dist/gateway/static/root/assets/{automation-suggestion-card-DVKmVTIo.js → automation-suggestion-card-BMvGqYob.js} +1 -1
  15. package/dist/gateway/static/root/assets/{automations-page-BCTXpOBp.js → automations-page-Dip8ZFmx.js} +1 -1
  16. package/dist/gateway/static/root/assets/{binary-plugins-BuXIeSPc.js → binary-plugins-CuPLWibr.js} +1 -1
  17. package/dist/gateway/static/root/assets/{block-editor-C1m0u-UU.js → block-editor-bzfvlJnh.js} +58 -54
  18. package/dist/gateway/static/root/assets/{browser-settings-page-ChUF08V5.js → browser-settings-page-lbx_8Dku.js} +4 -4
  19. package/dist/gateway/static/root/assets/{capability-presets-api-B7WWYaEh.js → capability-presets-api-X4Imbf8n.js} +1 -1
  20. package/dist/gateway/static/root/assets/{capability-presets-settings-panel-D_Bh1PnA.js → capability-presets-settings-panel-v9JgKjJu.js} +1 -1
  21. package/dist/gateway/static/root/assets/{channel-recipient-api-sV06LCht.js → channel-recipient-api-DllrPmp-.js} +1 -1
  22. package/dist/gateway/static/root/assets/{channels-settings-BI2ChQc7.js → channels-settings-CED7Oy5Y.js} +1 -1
  23. package/dist/gateway/static/root/assets/channels-status-swr-EUwWYx8l.js +1 -0
  24. package/dist/gateway/static/root/assets/{connectors-page-qgvEp09M.js → connectors-page-BMfp0jWL.js} +1 -1
  25. package/dist/gateway/static/root/assets/{desktop-pet-BxMJlvb-.js → desktop-pet-oTig6qFO.js} +1 -1
  26. package/dist/gateway/static/root/assets/{desktop-pet-settings-DCvpDImn.js → desktop-pet-settings-DXJiPL_H.js} +1 -1
  27. package/dist/gateway/static/root/assets/{directory-picker-path-field-D1nxs9PA.js → directory-picker-path-field-CltkXSR2.js} +1 -1
  28. package/dist/gateway/static/root/assets/{dreaming-settings-EAWkpOgw.js → dreaming-settings-CYrZQxoL.js} +1 -1
  29. package/dist/gateway/static/root/assets/{extension-debug-page-LUQ8dE8z.js → extension-debug-page-C-4BOy1R.js} +1 -1
  30. package/dist/gateway/static/root/assets/{extension-page-B_mnhoRd.js → extension-page-C8nMpXqh.js} +1 -1
  31. package/dist/gateway/static/root/assets/{extension-settings-page-BWQsGmvW.js → extension-settings-page-CXWYOwka.js} +1 -1
  32. package/dist/gateway/static/root/assets/{fetch-BWXmBizE.js → fetch-BID89uCH.js} +1 -1
  33. package/dist/gateway/static/root/assets/{gateway-config-api-M9bzPASf.js → gateway-config-api-B3TGdim5.js} +1 -1
  34. package/dist/gateway/static/root/assets/{gateway-settings-CbgtpprN.js → gateway-settings-D7tOnGAJ.js} +1 -1
  35. package/dist/gateway/static/root/assets/{gateway-startup-retry-BALL91S7.js → gateway-startup-retry-BkrLLlpE.js} +1 -1
  36. package/dist/gateway/static/root/assets/{goal-create-dialog-CbP4t9aM.js → goal-create-dialog-BL_cRshf.js} +1 -1
  37. package/dist/gateway/static/root/assets/{goal-detail-page-DlwI-MZZ.js → goal-detail-page-T1vg6Ng_.js} +1 -1
  38. package/dist/gateway/static/root/assets/{goals-config-api-BBhFVzBS.js → goals-config-api-D-WZWhP2.js} +1 -1
  39. package/dist/gateway/static/root/assets/{goals-page-D26r7knp.js → goals-page-1vzWXl5W.js} +1 -1
  40. package/dist/gateway/static/root/assets/{goals-settings-DdmVG_TR.js → goals-settings-DgGwvLVC.js} +1 -1
  41. package/dist/gateway/static/root/assets/{heartbeat-settings-DZW2Xq-U.js → heartbeat-settings-yh0bEIwQ.js} +1 -1
  42. package/dist/gateway/static/root/assets/index-B8s8Pq5U.css +1 -0
  43. package/dist/gateway/static/root/assets/index-NwiCnzI-.js +262 -0
  44. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-1IWd88-T.js → keyboard-shortcuts-settings-CnxRFbgA.js} +1 -1
  45. package/dist/gateway/static/root/assets/{logs-page-DxoKJO7-.js → logs-page-DebnvTpD.js} +1 -1
  46. package/dist/gateway/static/root/assets/{markdown-split-BtdBj32h.js → markdown-split-BU69Nof8.js} +1 -1
  47. package/dist/gateway/static/root/assets/{media-plugins-CpoPj3s8.js → media-plugins-CDs7OvWt.js} +1 -1
  48. package/dist/gateway/static/root/assets/messages-DbNQuFdA.js +3 -0
  49. package/dist/gateway/static/root/assets/{models-hub-panel-D1Rp__dV.js → models-hub-panel-Ca_jy26S.js} +1 -1
  50. package/dist/gateway/static/root/assets/{notes-page-CgR1bO2W.js → notes-page-DTpeaI65.js} +1 -1
  51. package/dist/gateway/static/root/assets/{notes-workbench-ozsnmDTV.js → notes-workbench-uKMYsjUU.js} +2 -2
  52. package/dist/gateway/static/root/assets/{page-tabs-CVLqCfQB.js → page-tabs-CROo8Vgz.js} +1 -1
  53. package/dist/gateway/static/root/assets/{preview-open-alternatives-CKUXJk2t.js → preview-open-alternatives-BxsS9i1G.js} +1 -1
  54. package/dist/gateway/static/root/assets/{project-detail-page-B4dqFAQF.js → project-detail-page-BWKOhshy.js} +1 -1
  55. package/dist/gateway/static/root/assets/{projects-page-DlRGXv4a.js → projects-page-CoowiCLe.js} +1 -1
  56. package/dist/gateway/static/root/assets/{remote-access-hub-rZEYQMZV.js → remote-access-hub-CiOaX1wd.js} +1 -1
  57. package/dist/gateway/static/root/assets/{save-bar-controls-BtGni268.js → save-bar-controls-B4N17dMG.js} +1 -1
  58. package/dist/gateway/static/root/assets/{schedule-field-BDGzKVWn.js → schedule-field-ClJzQ2vz.js} +1 -1
  59. package/dist/gateway/static/root/assets/{schema-form-DQJsKMCE.js → schema-form-oZvQUfDg.js} +1 -1
  60. package/dist/gateway/static/root/assets/{sessions-page-DxGoCGU8.js → sessions-page-Sx9Gc0cv.js} +1 -1
  61. package/dist/gateway/static/root/assets/settings-advanced-gate-CnbVdze4.js +1 -0
  62. package/dist/gateway/static/root/assets/{settings-collapsible-section-c8XGd4-8.js → settings-collapsible-section-B0kOLXUf.js} +1 -1
  63. package/dist/gateway/static/root/assets/{settings-form-section-By0YiDWo.js → settings-form-section-DoVPlVFd.js} +1 -1
  64. package/dist/gateway/static/root/assets/{settings-loading-skeleton-SYCPY-WM.js → settings-loading-skeleton-C7J96bLc.js} +1 -1
  65. package/dist/gateway/static/root/assets/{settings-page-D9NwvnBt.js → settings-page-CXiAByF0.js} +1 -1
  66. package/dist/gateway/static/root/assets/{settings-page-layout-CrICyGob.js → settings-page-layout-R-6ArlMI.js} +1 -1
  67. package/dist/gateway/static/root/assets/{setup-status-panel-IjK-hDxf.js → setup-status-panel-Drz23n9l.js} +1 -1
  68. package/dist/gateway/static/root/assets/{share-preview-page-Dfnk9M_m.js → share-preview-page-Bn1umseg.js} +1 -1
  69. package/dist/gateway/static/root/assets/{shares-settings-vQiRBra7.js → shares-settings-Bb-pcMWg.js} +1 -1
  70. package/dist/gateway/static/root/assets/skill-reload-api-DE9HCHct.js +1 -0
  71. package/dist/gateway/static/root/assets/{skills-page-CruV215G.js → skills-page-B6cDPqkk.js} +1 -1
  72. package/dist/gateway/static/root/assets/{system-settings-panel-BBVbSDFD.js → system-settings-panel-CtEddAy-.js} +1 -1
  73. package/dist/gateway/static/root/assets/{typed-models-lib-CwFayhxu.js → typed-models-lib-BkhSnYq7.js} +1 -1
  74. package/dist/gateway/static/root/assets/{use-channel-catalog-BKtHOM50.js → use-channel-catalog-EA4hfbsP.js} +1 -1
  75. package/dist/gateway/static/root/assets/{user-profile-settings-panel-_KDWzagh.js → user-profile-settings-panel-BssTVOBS.js} +1 -1
  76. package/dist/gateway/static/root/assets/{utils-BiUjIHb4.js → utils-CI3ywKLT.js} +1 -1
  77. package/dist/gateway/static/root/assets/{voice-api-key-field-agJqlm4o.js → voice-api-key-field-DXMEGw9O.js} +1 -1
  78. package/dist/gateway/static/root/assets/{work-item-detail-page-Bdw4ATCb.js → work-item-detail-page-DsFqU0tK.js} +1 -1
  79. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-D-Dy6mTy.js → workflow-run-setup-panel-DImBi-m6.js} +1 -1
  80. package/dist/gateway/static/root/assets/{workflow-start-dialog-GammZ2GK.js → workflow-start-dialog-DuPpKAAc.js} +1 -1
  81. package/dist/gateway/static/root/assets/{workflows-page-Cw5zrqti.js → workflows-page-DfTVzTNY.js} +1 -1
  82. package/dist/gateway/static/root/index.html +5 -5
  83. package/dist/package.js +1 -1
  84. package/dist/src/agent/agent-instance-gateway.d.ts +3 -3
  85. package/dist/src/agent/agent-manager.d.ts +7 -8
  86. package/dist/src/agent/agent-manager.js +24 -25
  87. package/dist/src/agent/agent-manager.js.map +1 -1
  88. package/dist/src/agent/background-review/coordinator.d.ts +9 -23
  89. package/dist/src/agent/background-review/coordinator.js +45 -54
  90. package/dist/src/agent/background-review/coordinator.js.map +1 -1
  91. package/dist/src/agent/background-review/prompts.d.ts +2 -4
  92. package/dist/src/agent/background-review/prompts.js +7 -19
  93. package/dist/src/agent/background-review/prompts.js.map +1 -1
  94. package/dist/src/agent/background-review/run-background-review.d.ts +0 -8
  95. package/dist/src/agent/background-review/run-background-review.js +87 -72
  96. package/dist/src/agent/background-review/run-background-review.js.map +1 -1
  97. package/dist/src/agent/background-review/settings.d.ts +4 -4
  98. package/dist/src/agent/background-review/settings.js +25 -10
  99. package/dist/src/agent/background-review/settings.js.map +1 -1
  100. package/dist/src/agent/code-intelligence/binary.d.ts +1 -0
  101. package/dist/src/agent/code-intelligence/binary.js +42 -0
  102. package/dist/src/agent/code-intelligence/binary.js.map +1 -0
  103. package/dist/src/agent/code-intelligence/index.d.ts +4 -0
  104. package/dist/src/agent/code-intelligence/index.js +4 -0
  105. package/dist/src/agent/code-intelligence/runtime.d.ts +34 -0
  106. package/dist/src/agent/code-intelligence/runtime.js +282 -0
  107. package/dist/src/agent/code-intelligence/runtime.js.map +1 -0
  108. package/dist/src/agent/code-intelligence/tools.d.ts +6 -0
  109. package/dist/src/agent/code-intelligence/tools.js +268 -0
  110. package/dist/src/agent/code-intelligence/tools.js.map +1 -0
  111. package/dist/src/agent/code-intelligence/types.d.ts +22 -0
  112. package/dist/src/agent/code-intelligence/types.js +1 -0
  113. package/dist/src/agent/memory/builtin-provider.d.ts +1 -2
  114. package/dist/src/agent/memory/builtin-provider.js +31 -12
  115. package/dist/src/agent/memory/builtin-provider.js.map +1 -1
  116. package/dist/src/agent/memory/context/planner.d.ts +11 -0
  117. package/dist/src/agent/memory/context/planner.js +163 -0
  118. package/dist/src/agent/memory/context/planner.js.map +1 -0
  119. package/dist/src/agent/memory/context/types.d.ts +19 -0
  120. package/dist/src/agent/memory/context/types.js +1 -0
  121. package/dist/src/agent/memory/context-fence.d.ts +3 -3
  122. package/dist/src/agent/memory/context-fence.js +9 -9
  123. package/dist/src/agent/memory/context-fence.js.map +1 -1
  124. package/dist/src/agent/memory/index.d.ts +6 -4
  125. package/dist/src/agent/memory/index.js +5 -5
  126. package/dist/src/agent/memory/manager.d.ts +16 -4
  127. package/dist/src/agent/memory/manager.js +32 -34
  128. package/dist/src/agent/memory/manager.js.map +1 -1
  129. package/dist/src/agent/memory/memory-config.d.ts +1 -1
  130. package/dist/src/agent/memory/memory-config.js +2 -2
  131. package/dist/src/agent/memory/memory-config.js.map +1 -1
  132. package/dist/src/agent/memory/provider.d.ts +1 -3
  133. package/dist/src/agent/memory/stub-memory-provider.d.ts +0 -1
  134. package/dist/src/agent/memory/stub-memory-provider.js +0 -5
  135. package/dist/src/agent/memory/stub-memory-provider.js.map +1 -1
  136. package/dist/src/agent/memory/types.d.ts +31 -2
  137. package/dist/src/agent/memory/understanding/correction.d.ts +3 -0
  138. package/dist/src/agent/memory/understanding/correction.js +41 -0
  139. package/dist/src/agent/memory/understanding/correction.js.map +1 -0
  140. package/dist/src/agent/memory/understanding/quality.d.ts +8 -0
  141. package/dist/src/agent/memory/understanding/quality.js +20 -0
  142. package/dist/src/agent/memory/understanding/quality.js.map +1 -0
  143. package/dist/src/agent/memory/understanding/service.d.ts +26 -0
  144. package/dist/src/agent/memory/understanding/service.js +233 -0
  145. package/dist/src/agent/memory/understanding/service.js.map +1 -0
  146. package/dist/src/agent/memory/understanding/types.d.ts +22 -0
  147. package/dist/src/agent/memory/understanding/types.js +1 -0
  148. package/dist/src/agent/memory/user-context-coordinator.d.ts +21 -0
  149. package/dist/src/agent/memory/user-context-coordinator.js +90 -0
  150. package/dist/src/agent/memory/user-context-coordinator.js.map +1 -0
  151. package/dist/src/agent/orchestration/agent-event-handler.d.ts +1 -0
  152. package/dist/src/agent/orchestration/agent-event-handler.js +1 -1
  153. package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
  154. package/dist/src/agent/orchestration/agent-orchestrator.js +2 -2
  155. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  156. package/dist/src/agent/orchestration/index.d.ts +1 -1
  157. package/dist/src/agent/orchestration/index.js +2 -2
  158. package/dist/src/agent/prompt/sections/tooling.js +10 -0
  159. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  160. package/dist/src/agent/prompt/system-prompt.js +2 -0
  161. package/dist/src/agent/prompt/system-prompt.js.map +1 -1
  162. package/dist/src/agent/service/direct-turn-helpers.js +2 -2
  163. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  164. package/dist/src/agent/service.js +7 -1
  165. package/dist/src/agent/service.js.map +1 -1
  166. package/dist/src/agent/session/session-inspector.d.ts +1 -0
  167. package/dist/src/agent/session/session-inspector.js +8 -2
  168. package/dist/src/agent/session/session-inspector.js.map +1 -1
  169. package/dist/src/agent/tools/factory.d.ts +3 -0
  170. package/dist/src/agent/tools/factory.js +17 -10
  171. package/dist/src/agent/tools/factory.js.map +1 -1
  172. package/dist/src/agent/tools/index.d.ts +1 -0
  173. package/dist/src/agent/tools/index.js +2 -1
  174. package/dist/src/agent/workspace-runtime/registry.d.ts +2 -0
  175. package/dist/src/agent/workspace-runtime/registry.js +11 -3
  176. package/dist/src/agent/workspace-runtime/registry.js.map +1 -1
  177. package/dist/src/agent-manifest/index.js +2 -2
  178. package/dist/src/agent-manifest/schema.d.ts +91 -0
  179. package/dist/src/agent-manifest/schema.js +27 -5
  180. package/dist/src/agent-manifest/schema.js.map +1 -1
  181. package/dist/src/agent-runtime/memory-runtime.d.ts +1 -1
  182. package/dist/src/agent-runtime/memory-runtime.js.map +1 -1
  183. package/dist/src/automations/domain/validation.d.ts +22 -22
  184. package/dist/src/automations/draft/automation-draft-validator.d.ts +4 -4
  185. package/dist/src/cli/command-loaders.js +1 -0
  186. package/dist/src/cli/command-loaders.js.map +1 -1
  187. package/dist/src/cli/command-manifest.js +4 -0
  188. package/dist/src/cli/command-manifest.js.map +1 -1
  189. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  190. package/dist/src/cli/commands/resume.d.ts +1 -0
  191. package/dist/src/cli/commands/resume.js +31 -0
  192. package/dist/src/cli/commands/resume.js.map +1 -0
  193. package/dist/src/cli/commands/tui-runner.d.ts +9 -0
  194. package/dist/src/cli/commands/tui-runner.js +40 -0
  195. package/dist/src/cli/commands/tui-runner.js.map +1 -0
  196. package/dist/src/cli/commands/tui.js +4 -28
  197. package/dist/src/cli/commands/tui.js.map +1 -1
  198. package/dist/src/config/agent-profile.js +1 -1
  199. package/dist/src/config/index.js +2 -2
  200. package/dist/src/config/schema.d.ts +115 -0
  201. package/dist/src/config/schema.js +53 -4
  202. package/dist/src/config/schema.js.map +1 -1
  203. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  204. package/dist/src/gateway/agent-builtin-tools.js +5 -0
  205. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  206. package/dist/src/gateway/agents-admin.js +1 -1
  207. package/dist/src/gateway/hono/lib/config-payload.d.ts +18 -4
  208. package/dist/src/gateway/hono/routes/home.js +37 -2
  209. package/dist/src/gateway/hono/routes/home.js.map +1 -1
  210. package/dist/src/gateway/hono/routes/memory.js +129 -4
  211. package/dist/src/gateway/hono/routes/memory.js.map +1 -1
  212. package/dist/src/gateway/hono/routes/projects.js +16 -0
  213. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  214. package/dist/src/knowledge/index.d.ts +2 -0
  215. package/dist/src/knowledge/index.js +2 -0
  216. package/dist/src/knowledge/ingestion-service.d.ts +20 -0
  217. package/dist/src/knowledge/ingestion-service.js +75 -0
  218. package/dist/src/knowledge/ingestion-service.js.map +1 -0
  219. package/dist/src/knowledge/types.d.ts +70 -0
  220. package/dist/src/knowledge/types.js +1 -0
  221. package/dist/src/projects/project-kind.js +0 -1
  222. package/dist/src/projects/project-kind.js.map +1 -1
  223. package/dist/src/providers/presentation.js +1 -1
  224. package/dist/src/providers/presentation.js.map +1 -1
  225. package/dist/src/storage/sqlite/index.d.ts +2 -1
  226. package/dist/src/storage/sqlite/index.js +3 -2
  227. package/dist/src/storage/sqlite/knowledge-repository.d.ts +50 -0
  228. package/dist/src/storage/sqlite/knowledge-repository.js +237 -0
  229. package/dist/src/storage/sqlite/knowledge-repository.js.map +1 -0
  230. package/dist/src/storage/sqlite/memory-records-repository.d.ts +80 -2
  231. package/dist/src/storage/sqlite/memory-records-repository.js +271 -9
  232. package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -1
  233. package/dist/src/storage/sqlite/migrations/029_user_understanding.sql +133 -0
  234. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  235. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  236. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  237. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  238. package/dist/src/storage/sqlite/schema.js +1 -1
  239. package/dist/src/tui/tui-picker-overlay.d.ts +6 -1
  240. package/dist/src/tui/tui-picker-overlay.js +4 -1
  241. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  242. package/dist/src/tui/tui-types.d.ts +2 -0
  243. package/dist/src/tui/tui-types.js.map +1 -1
  244. package/dist/src/tui/tui.js +17 -2
  245. package/dist/src/tui/tui.js.map +1 -1
  246. package/dist/src/work-items/work-item-service.d.ts +1 -0
  247. package/dist/src/work-items/work-item-service.js +3 -0
  248. package/dist/src/work-items/work-item-service.js.map +1 -1
  249. package/dist/src/work-items/work-item-store.d.ts +1 -0
  250. package/dist/src/work-items/work-item-store.js +13 -0
  251. package/dist/src/work-items/work-item-store.js.map +1 -1
  252. package/package.json +2 -1
  253. package/dist/gateway/static/root/assets/agents-Bv5R-N8Q.js +0 -2
  254. package/dist/gateway/static/root/assets/channels-status-swr-MY4Xh4fM.js +0 -1
  255. package/dist/gateway/static/root/assets/index-CPwVzi9x.css +0 -1
  256. package/dist/gateway/static/root/assets/index-DZOm5_ex.js +0 -262
  257. package/dist/gateway/static/root/assets/messages-CQ_k8RHj.js +0 -3
  258. package/dist/gateway/static/root/assets/settings-advanced-gate-4e8ZQwxr.js +0 -1
  259. package/dist/gateway/static/root/assets/skill-reload-api-BIWv778A.js +0 -1
  260. package/dist/src/agent/memory/candidate-extractor.d.ts +0 -6
  261. package/dist/src/agent/memory/candidate-extractor.js +0 -60
  262. package/dist/src/agent/memory/candidate-extractor.js.map +0 -1
  263. package/dist/src/agent/memory/context-assembler.d.ts +0 -10
  264. package/dist/src/agent/memory/context-assembler.js +0 -26
  265. package/dist/src/agent/memory/context-assembler.js.map +0 -1
  266. package/dist/src/agent/memory/inject-prefetch.d.ts +0 -6
  267. package/dist/src/agent/memory/inject-prefetch.js +0 -48
  268. package/dist/src/agent/memory/inject-prefetch.js.map +0 -1
  269. package/dist/src/agent/memory/prefetch-coordinator.d.ts +0 -37
  270. package/dist/src/agent/memory/prefetch-coordinator.js +0 -45
  271. package/dist/src/agent/memory/prefetch-coordinator.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingestion-service.js","names":[],"sources":["../../../src/knowledge/ingestion-service.ts"],"sourcesContent":["import { createLogger } from '../utils/logger.js';\nimport {\n finishKnowledgeSyncRun,\n getKnowledgeSourceCursor,\n setKnowledgeSourceCursor,\n startKnowledgeSyncRun,\n upsertKnowledgeSourceItems,\n} from '../storage/sqlite/knowledge-repository.js';\nimport type { KnowledgeSourceAdapter, KnowledgeSyncRun } from './types.js';\n\nconst log = createLogger('KnowledgeIngestion');\n\nexport interface KnowledgeSourceStateStore {\n getCursor(instanceId: string): string | undefined;\n setCursor(instanceId: string, cursor: string | undefined): void;\n}\n\nexport class SqliteKnowledgeSourceStateStore implements KnowledgeSourceStateStore {\n getCursor(instanceId: string): string | undefined {\n return getKnowledgeSourceCursor(instanceId);\n }\n\n setCursor(instanceId: string, cursor: string | undefined): void {\n setKnowledgeSourceCursor(instanceId, cursor);\n }\n}\n\nexport class KnowledgeIngestionService {\n constructor(\n private readonly adapters: ReadonlyMap<string, KnowledgeSourceAdapter>,\n private readonly state: KnowledgeSourceStateStore = new SqliteKnowledgeSourceStateStore(),\n ) {}\n\n async sync(params: {\n adapterKind: string;\n instanceId: string;\n windowStart?: string;\n signal?: AbortSignal;\n }): Promise<KnowledgeSyncRun> {\n const adapter = this.adapters.get(params.adapterKind);\n if (!adapter) {\n throw new Error(`Knowledge source adapter not found: ${params.adapterKind}`);\n }\n const cursorBefore = this.state.getCursor(params.instanceId);\n const run = startKnowledgeSyncRun({\n sourceInstanceId: params.instanceId,\n cursorBefore,\n });\n const controller = params.signal ? null : new AbortController();\n const signal = params.signal ?? controller!.signal;\n\n try {\n const pulled = await adapter.pull({\n instanceId: params.instanceId,\n cursor: cursorBefore,\n windowStart: params.windowStart,\n signal,\n });\n const stored = upsertKnowledgeSourceItems(pulled.items);\n this.state.setCursor(params.instanceId, pulled.nextCursor);\n const completed = finishKnowledgeSyncRun({\n runId: run.id,\n status: pulled.warnings.length > 0 ? 'partial' : 'succeeded',\n cursorAfter: pulled.nextCursor,\n itemsSeen: pulled.items.length,\n itemsCreated: stored.created,\n itemsUpdated: stored.updated,\n warnings: pulled.warnings,\n });\n log.info(\n {\n runId: run.id,\n sourceInstanceId: params.instanceId,\n itemsSeen: pulled.items.length,\n itemsCreated: stored.created,\n itemsUpdated: stored.updated,\n },\n 'Knowledge source sync completed',\n );\n return completed;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n const status = signal.aborted ? 'cancelled' : 'failed';\n log.warn(\n { err, runId: run.id, sourceInstanceId: params.instanceId },\n `Knowledge source sync ${status}: ${errorMessage}`,\n );\n return finishKnowledgeSyncRun({\n runId: run.id,\n status,\n error: errorMessage,\n });\n }\n }\n}\n"],"mappings":";;;;aAAkD;AAUlD,MAAM,MAAM,aAAa,qBAAqB;AAO9C,IAAa,kCAAb,MAAkF;CAChF,UAAU,YAAwC;AAChD,SAAO,yBAAyB,WAAW;;CAG7C,UAAU,YAAoB,QAAkC;AAC9D,2BAAyB,YAAY,OAAO;;;AAIhD,IAAa,4BAAb,MAAuC;CACrC,YACE,UACA,QAAoD,IAAI,iCAAiC,EACzF;AAFiB,OAAA,WAAA;AACA,OAAA,QAAA;;CAGnB,MAAM,KAAK,QAKmB;EAC5B,MAAM,UAAU,KAAK,SAAS,IAAI,OAAO,YAAY;AACrD,MAAI,CAAC,QACH,OAAM,IAAI,MAAM,uCAAuC,OAAO,cAAc;EAE9E,MAAM,eAAe,KAAK,MAAM,UAAU,OAAO,WAAW;EAC5D,MAAM,MAAM,sBAAsB;GAChC,kBAAkB,OAAO;GACzB;GACD,CAAC;EACF,MAAM,aAAa,OAAO,SAAS,OAAO,IAAI,iBAAiB;EAC/D,MAAM,SAAS,OAAO,UAAU,WAAY;AAE5C,MAAI;GACF,MAAM,SAAS,MAAM,QAAQ,KAAK;IAChC,YAAY,OAAO;IACnB,QAAQ;IACR,aAAa,OAAO;IACpB;IACD,CAAC;GACF,MAAM,SAAS,2BAA2B,OAAO,MAAM;AACvD,QAAK,MAAM,UAAU,OAAO,YAAY,OAAO,WAAW;GAC1D,MAAM,YAAY,uBAAuB;IACvC,OAAO,IAAI;IACX,QAAQ,OAAO,SAAS,SAAS,IAAI,YAAY;IACjD,aAAa,OAAO;IACpB,WAAW,OAAO,MAAM;IACxB,cAAc,OAAO;IACrB,cAAc,OAAO;IACrB,UAAU,OAAO;IAClB,CAAC;AACF,OAAI,KACF;IACE,OAAO,IAAI;IACX,kBAAkB,OAAO;IACzB,WAAW,OAAO,MAAM;IACxB,cAAc,OAAO;IACrB,cAAc,OAAO;IACtB,EACD,kCACD;AACD,UAAO;WACA,KAAK;GACZ,MAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;GACrE,MAAM,SAAS,OAAO,UAAU,cAAc;AAC9C,OAAI,KACF;IAAE;IAAK,OAAO,IAAI;IAAI,kBAAkB,OAAO;IAAY,EAC3D,yBAAyB,OAAO,IAAI,eACrC;AACD,UAAO,uBAAuB;IAC5B,OAAO,IAAI;IACX;IACA,OAAO;IACR,CAAC"}
@@ -0,0 +1,70 @@
1
+ import type { MemorySensitivity } from '../agent/memory/types.js';
2
+ export type KnowledgeSyncRunStatus = 'running' | 'succeeded' | 'partial' | 'failed' | 'cancelled';
3
+ export type KnowledgeSynthesisStatus = 'pending' | 'processing' | 'completed' | 'failed' | 'ignored';
4
+ export type KnowledgeRetentionClass = 'ephemeral' | 'bounded' | 'durable';
5
+ export type KnowledgeAuthorRole = 'user' | 'assistant' | 'third_party' | 'system' | 'unknown';
6
+ export interface KnowledgeSourceItem {
7
+ id: string;
8
+ sourceInstanceId: string;
9
+ externalId: string;
10
+ itemType: string;
11
+ authorRole?: KnowledgeAuthorRole;
12
+ occurredAt?: string;
13
+ sourceUpdatedAt?: string;
14
+ contentHash: string;
15
+ normalizedText?: string;
16
+ payloadRef?: string;
17
+ metadata: Record<string, unknown>;
18
+ sensitivity: MemorySensitivity;
19
+ retentionClass: KnowledgeRetentionClass;
20
+ synthesisStatus: KnowledgeSynthesisStatus;
21
+ deletedAt?: string;
22
+ createdAt: string;
23
+ updatedAt: string;
24
+ }
25
+ export interface KnowledgeSourceItemInput {
26
+ id?: string;
27
+ sourceInstanceId: string;
28
+ externalId: string;
29
+ itemType: string;
30
+ authorRole?: KnowledgeAuthorRole;
31
+ occurredAt?: string;
32
+ sourceUpdatedAt?: string;
33
+ contentHash: string;
34
+ normalizedText?: string;
35
+ payloadRef?: string;
36
+ metadata?: Record<string, unknown>;
37
+ sensitivity?: MemorySensitivity;
38
+ retentionClass?: KnowledgeRetentionClass;
39
+ synthesisStatus?: KnowledgeSynthesisStatus;
40
+ deletedAt?: string;
41
+ }
42
+ export interface KnowledgeSyncRun {
43
+ id: string;
44
+ sourceInstanceId: string;
45
+ status: KnowledgeSyncRunStatus;
46
+ cursorBefore?: string;
47
+ cursorAfter?: string;
48
+ itemsSeen: number;
49
+ itemsCreated: number;
50
+ itemsUpdated: number;
51
+ warnings: string[];
52
+ error?: string;
53
+ startedAt: string;
54
+ finishedAt?: string;
55
+ }
56
+ export interface KnowledgePullInput {
57
+ instanceId: string;
58
+ cursor?: string;
59
+ windowStart?: string;
60
+ signal: AbortSignal;
61
+ }
62
+ export interface KnowledgePullResult {
63
+ items: KnowledgeSourceItemInput[];
64
+ nextCursor?: string;
65
+ warnings: string[];
66
+ }
67
+ export interface KnowledgeSourceAdapter {
68
+ readonly kind: string;
69
+ pull(input: KnowledgePullInput): Promise<KnowledgePullResult>;
70
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -3,7 +3,6 @@ import { join } from "node:path";
3
3
  import { existsSync, readdirSync, statSync } from "node:fs";
4
4
  //#region src/projects/project-kind.ts
5
5
  const STRONG_CODE_MARKERS = [
6
- ".git",
7
6
  "package.json",
8
7
  "pnpm-lock.yaml",
9
8
  "yarn.lock",
@@ -1 +1 @@
1
- {"version":3,"file":"project-kind.js","names":[],"sources":["../../../src/projects/project-kind.ts"],"sourcesContent":["import { existsSync, readdirSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { canonicalWorkspacePath } from './workspace-project.js';\n\nexport type ProjectKind = 'coding' | 'general' | 'unknown';\nexport type ProjectKindOverride = 'auto' | 'coding' | 'general';\n\nexport type ProjectKindInference = {\n kind: ProjectKind;\n confidence: number;\n reasons: string[];\n};\n\nconst STRONG_CODE_MARKERS = [\n '.git',\n 'package.json',\n 'pnpm-lock.yaml',\n 'yarn.lock',\n 'package-lock.json',\n 'tsconfig.json',\n 'go.mod',\n 'Cargo.toml',\n 'pyproject.toml',\n 'requirements.txt',\n 'pom.xml',\n 'build.gradle',\n 'Makefile',\n 'Dockerfile',\n 'deno.json',\n 'deno.jsonc',\n 'composer.json',\n 'Gemfile',\n] as const;\n\nconst WEAK_CODE_DIRECTORIES = ['src', 'app', 'lib', 'tests', 'test', '__tests__', '.github'] as const;\nconst CODE_EXTENSIONS = new Set([\n '.c',\n '.cc',\n '.cpp',\n '.cs',\n '.css',\n '.go',\n '.h',\n '.hpp',\n '.html',\n '.java',\n '.js',\n '.jsx',\n '.kt',\n '.mjs',\n '.php',\n '.py',\n '.rb',\n '.rs',\n '.sh',\n '.swift',\n '.ts',\n '.tsx',\n]);\n\nfunction normalizeOverride(value: string | null | undefined): ProjectKindOverride {\n const normalized = value?.trim().toLowerCase();\n return normalized === 'coding' || normalized === 'general' ? normalized : 'auto';\n}\n\nfunction hasSourceExtension(name: string): boolean {\n const lower = name.toLowerCase();\n for (const extension of CODE_EXTENSIONS) {\n if (lower.endsWith(extension)) return true;\n }\n return false;\n}\n\nfunction readDirectoryNames(pathValue: string): string[] {\n try {\n return readdirSync(pathValue).slice(0, 200);\n } catch {\n return [];\n }\n}\n\nfunction directoryExists(pathValue: string): boolean {\n try {\n return statSync(pathValue).isDirectory();\n } catch {\n return false;\n }\n}\n\nexport function inferProjectKind(input: {\n name?: string | null;\n description?: string | null;\n workspaceRoot?: string | null;\n projectKind?: string | null;\n}): ProjectKindInference {\n const override = normalizeOverride(input.projectKind);\n if (override === 'coding') return { kind: 'coding', confidence: 1, reasons: ['selected coding project type'] };\n if (override === 'general') return { kind: 'general', confidence: 1, reasons: ['selected general project type'] };\n\n const workspaceRoot = canonicalWorkspacePath(input.workspaceRoot);\n const reasons: string[] = [];\n let score = 0;\n\n if (workspaceRoot && directoryExists(workspaceRoot)) {\n for (const marker of STRONG_CODE_MARKERS) {\n if (existsSync(join(workspaceRoot, marker))) {\n score += 4;\n reasons.push(`found ${marker}`);\n break;\n }\n }\n\n for (const dir of WEAK_CODE_DIRECTORIES) {\n if (directoryExists(join(workspaceRoot, dir))) {\n score += 1;\n reasons.push(`found ${dir}/`);\n break;\n }\n }\n\n if (readDirectoryNames(workspaceRoot).some(hasSourceExtension)) {\n score += 2;\n reasons.push('found source files');\n } else {\n for (const dir of ['src', 'app', 'lib']) {\n const childDir = join(workspaceRoot, dir);\n if (directoryExists(childDir) && readDirectoryNames(childDir).some(hasSourceExtension)) {\n score += 2;\n reasons.push(`found source files in ${dir}/`);\n break;\n }\n }\n }\n }\n\n if (score >= 4) return { kind: 'coding', confidence: 0.9, reasons };\n if (score >= 3) return { kind: 'coding', confidence: 0.75, reasons };\n if (workspaceRoot) return { kind: 'general', confidence: 0.55, reasons };\n return { kind: 'unknown', confidence: 0.25, reasons };\n}\n"],"mappings":";;;;AAcA,MAAM,sBAAsB;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,wBAAwB;CAAC;CAAO;CAAO;CAAO;CAAS;CAAQ;CAAa;CAAU;AAC5F,MAAM,kBAAkB,IAAI,IAAI;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAS,kBAAkB,OAAuD;CAChF,MAAM,aAAa,OAAO,MAAM,CAAC,aAAa;AAC9C,QAAO,eAAe,YAAY,eAAe,YAAY,aAAa;;AAG5E,SAAS,mBAAmB,MAAuB;CACjD,MAAM,QAAQ,KAAK,aAAa;AAChC,MAAK,MAAM,aAAa,gBACtB,KAAI,MAAM,SAAS,UAAU,CAAE,QAAO;AAExC,QAAO;;AAGT,SAAS,mBAAmB,WAA6B;AACvD,KAAI;AACF,SAAO,YAAY,UAAU,CAAC,MAAM,GAAG,IAAI;SACrC;AACN,SAAO,EAAE;;;AAIb,SAAS,gBAAgB,WAA4B;AACnD,KAAI;AACF,SAAO,SAAS,UAAU,CAAC,aAAa;SAClC;AACN,SAAO;;;AAIX,SAAgB,iBAAiB,OAKR;CACvB,MAAM,WAAW,kBAAkB,MAAM,YAAY;AACrD,KAAI,aAAa,SAAU,QAAO;EAAE,MAAM;EAAU,YAAY;EAAG,SAAS,CAAC,+BAA+B;EAAE;AAC9G,KAAI,aAAa,UAAW,QAAO;EAAE,MAAM;EAAW,YAAY;EAAG,SAAS,CAAC,gCAAgC;EAAE;CAEjH,MAAM,gBAAgB,uBAAuB,MAAM,cAAc;CACjE,MAAM,UAAoB,EAAE;CAC5B,IAAI,QAAQ;AAEZ,KAAI,iBAAiB,gBAAgB,cAAc,EAAE;AACnD,OAAK,MAAM,UAAU,oBACnB,KAAI,WAAW,KAAK,eAAe,OAAO,CAAC,EAAE;AAC3C,YAAS;AACT,WAAQ,KAAK,SAAS,SAAS;AAC/B;;AAIJ,OAAK,MAAM,OAAO,sBAChB,KAAI,gBAAgB,KAAK,eAAe,IAAI,CAAC,EAAE;AAC7C,YAAS;AACT,WAAQ,KAAK,SAAS,IAAI,GAAG;AAC7B;;AAIJ,MAAI,mBAAmB,cAAc,CAAC,KAAK,mBAAmB,EAAE;AAC9D,YAAS;AACT,WAAQ,KAAK,qBAAqB;QAElC,MAAK,MAAM,OAAO;GAAC;GAAO;GAAO;GAAM,EAAE;GACvC,MAAM,WAAW,KAAK,eAAe,IAAI;AACzC,OAAI,gBAAgB,SAAS,IAAI,mBAAmB,SAAS,CAAC,KAAK,mBAAmB,EAAE;AACtF,aAAS;AACT,YAAQ,KAAK,yBAAyB,IAAI,GAAG;AAC7C;;;;AAMR,KAAI,SAAS,EAAG,QAAO;EAAE,MAAM;EAAU,YAAY;EAAK;EAAS;AACnE,KAAI,SAAS,EAAG,QAAO;EAAE,MAAM;EAAU,YAAY;EAAM;EAAS;AACpE,KAAI,cAAe,QAAO;EAAE,MAAM;EAAW,YAAY;EAAM;EAAS;AACxE,QAAO;EAAE,MAAM;EAAW,YAAY;EAAM;EAAS"}
1
+ {"version":3,"file":"project-kind.js","names":[],"sources":["../../../src/projects/project-kind.ts"],"sourcesContent":["import { existsSync, readdirSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { canonicalWorkspacePath } from './workspace-project.js';\n\nexport type ProjectKind = 'coding' | 'general' | 'unknown';\nexport type ProjectKindOverride = 'auto' | 'coding' | 'general';\n\nexport type ProjectKindInference = {\n kind: ProjectKind;\n confidence: number;\n reasons: string[];\n};\n\nconst STRONG_CODE_MARKERS = [\n 'package.json',\n 'pnpm-lock.yaml',\n 'yarn.lock',\n 'package-lock.json',\n 'tsconfig.json',\n 'go.mod',\n 'Cargo.toml',\n 'pyproject.toml',\n 'requirements.txt',\n 'pom.xml',\n 'build.gradle',\n 'Makefile',\n 'Dockerfile',\n 'deno.json',\n 'deno.jsonc',\n 'composer.json',\n 'Gemfile',\n] as const;\n\nconst WEAK_CODE_DIRECTORIES = ['src', 'app', 'lib', 'tests', 'test', '__tests__', '.github'] as const;\nconst CODE_EXTENSIONS = new Set([\n '.c',\n '.cc',\n '.cpp',\n '.cs',\n '.css',\n '.go',\n '.h',\n '.hpp',\n '.html',\n '.java',\n '.js',\n '.jsx',\n '.kt',\n '.mjs',\n '.php',\n '.py',\n '.rb',\n '.rs',\n '.sh',\n '.swift',\n '.ts',\n '.tsx',\n]);\n\nfunction normalizeOverride(value: string | null | undefined): ProjectKindOverride {\n const normalized = value?.trim().toLowerCase();\n return normalized === 'coding' || normalized === 'general' ? normalized : 'auto';\n}\n\nfunction hasSourceExtension(name: string): boolean {\n const lower = name.toLowerCase();\n for (const extension of CODE_EXTENSIONS) {\n if (lower.endsWith(extension)) return true;\n }\n return false;\n}\n\nfunction readDirectoryNames(pathValue: string): string[] {\n try {\n return readdirSync(pathValue).slice(0, 200);\n } catch {\n return [];\n }\n}\n\nfunction directoryExists(pathValue: string): boolean {\n try {\n return statSync(pathValue).isDirectory();\n } catch {\n return false;\n }\n}\n\nexport function inferProjectKind(input: {\n name?: string | null;\n description?: string | null;\n workspaceRoot?: string | null;\n projectKind?: string | null;\n}): ProjectKindInference {\n const override = normalizeOverride(input.projectKind);\n if (override === 'coding') return { kind: 'coding', confidence: 1, reasons: ['selected coding project type'] };\n if (override === 'general') return { kind: 'general', confidence: 1, reasons: ['selected general project type'] };\n\n const workspaceRoot = canonicalWorkspacePath(input.workspaceRoot);\n const reasons: string[] = [];\n let score = 0;\n\n if (workspaceRoot && directoryExists(workspaceRoot)) {\n for (const marker of STRONG_CODE_MARKERS) {\n if (existsSync(join(workspaceRoot, marker))) {\n score += 4;\n reasons.push(`found ${marker}`);\n break;\n }\n }\n\n for (const dir of WEAK_CODE_DIRECTORIES) {\n if (directoryExists(join(workspaceRoot, dir))) {\n score += 1;\n reasons.push(`found ${dir}/`);\n break;\n }\n }\n\n if (readDirectoryNames(workspaceRoot).some(hasSourceExtension)) {\n score += 2;\n reasons.push('found source files');\n } else {\n for (const dir of ['src', 'app', 'lib']) {\n const childDir = join(workspaceRoot, dir);\n if (directoryExists(childDir) && readDirectoryNames(childDir).some(hasSourceExtension)) {\n score += 2;\n reasons.push(`found source files in ${dir}/`);\n break;\n }\n }\n }\n }\n\n if (score >= 4) return { kind: 'coding', confidence: 0.9, reasons };\n if (score >= 3) return { kind: 'coding', confidence: 0.75, reasons };\n if (workspaceRoot) return { kind: 'general', confidence: 0.55, reasons };\n return { kind: 'unknown', confidence: 0.25, reasons };\n}\n"],"mappings":";;;;AAcA,MAAM,sBAAsB;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,wBAAwB;CAAC;CAAO;CAAO;CAAO;CAAS;CAAQ;CAAa;CAAU;AAC5F,MAAM,kBAAkB,IAAI,IAAI;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAS,kBAAkB,OAAuD;CAChF,MAAM,aAAa,OAAO,MAAM,CAAC,aAAa;AAC9C,QAAO,eAAe,YAAY,eAAe,YAAY,aAAa;;AAG5E,SAAS,mBAAmB,MAAuB;CACjD,MAAM,QAAQ,KAAK,aAAa;AAChC,MAAK,MAAM,aAAa,gBACtB,KAAI,MAAM,SAAS,UAAU,CAAE,QAAO;AAExC,QAAO;;AAGT,SAAS,mBAAmB,WAA6B;AACvD,KAAI;AACF,SAAO,YAAY,UAAU,CAAC,MAAM,GAAG,IAAI;SACrC;AACN,SAAO,EAAE;;;AAIb,SAAS,gBAAgB,WAA4B;AACnD,KAAI;AACF,SAAO,SAAS,UAAU,CAAC,aAAa;SAClC;AACN,SAAO;;;AAIX,SAAgB,iBAAiB,OAKR;CACvB,MAAM,WAAW,kBAAkB,MAAM,YAAY;AACrD,KAAI,aAAa,SAAU,QAAO;EAAE,MAAM;EAAU,YAAY;EAAG,SAAS,CAAC,+BAA+B;EAAE;AAC9G,KAAI,aAAa,UAAW,QAAO;EAAE,MAAM;EAAW,YAAY;EAAG,SAAS,CAAC,gCAAgC;EAAE;CAEjH,MAAM,gBAAgB,uBAAuB,MAAM,cAAc;CACjE,MAAM,UAAoB,EAAE;CAC5B,IAAI,QAAQ;AAEZ,KAAI,iBAAiB,gBAAgB,cAAc,EAAE;AACnD,OAAK,MAAM,UAAU,oBACnB,KAAI,WAAW,KAAK,eAAe,OAAO,CAAC,EAAE;AAC3C,YAAS;AACT,WAAQ,KAAK,SAAS,SAAS;AAC/B;;AAIJ,OAAK,MAAM,OAAO,sBAChB,KAAI,gBAAgB,KAAK,eAAe,IAAI,CAAC,EAAE;AAC7C,YAAS;AACT,WAAQ,KAAK,SAAS,IAAI,GAAG;AAC7B;;AAIJ,MAAI,mBAAmB,cAAc,CAAC,KAAK,mBAAmB,EAAE;AAC9D,YAAS;AACT,WAAQ,KAAK,qBAAqB;QAElC,MAAK,MAAM,OAAO;GAAC;GAAO;GAAO;GAAM,EAAE;GACvC,MAAM,WAAW,KAAK,eAAe,IAAI;AACzC,OAAI,gBAAgB,SAAS,IAAI,mBAAmB,SAAS,CAAC,KAAK,mBAAmB,EAAE;AACtF,aAAS;AACT,YAAQ,KAAK,yBAAyB,IAAI,GAAG;AAC7C;;;;AAMR,KAAI,SAAS,EAAG,QAAO;EAAE,MAAM;EAAU,YAAY;EAAK;EAAS;AACnE,KAAI,SAAS,EAAG,QAAO;EAAE,MAAM;EAAU,YAAY;EAAM;EAAS;AACpE,KAAI,cAAe,QAAO;EAAE,MAAM;EAAW,YAAY;EAAM;EAAS;AACxE,QAAO;EAAE,MAAM;EAAW,YAAY;EAAM;EAAS"}
@@ -5,6 +5,7 @@ import { getDomesticProviderPreset, getDomesticProviderPresetIds } from "./domes
5
5
  init_providers();
6
6
  init_plugin_registry();
7
7
  const FEATURED_PROVIDER_ORDER = [
8
+ "deepseek",
8
9
  "openai",
9
10
  "anthropic",
10
11
  "xai",
@@ -15,7 +16,6 @@ const FEATURED_PROVIDER_ORDER = [
15
16
  "volcengine-ark",
16
17
  "volcengine-plan",
17
18
  "byteplus-plan",
18
- "deepseek",
19
19
  "moonshotai",
20
20
  "moonshotai-cn",
21
21
  "kimi-coding",
@@ -1 +1 @@
1
- {"version":3,"file":"presentation.js","names":[],"sources":["../../../src/providers/presentation.ts"],"sourcesContent":["import type { Api, Model } from '@earendil-works/pi-ai';\n\nimport {\n getAllModels,\n getAllProviders,\n getModelsByProvider,\n getProviderDisplayName,\n isProviderConfigured,\n PROVIDER_META,\n type ProviderCategory,\n} from './index.js';\nimport {\n getDomesticProviderPreset,\n getDomesticProviderPresetIds,\n type DomesticProviderModelPreset,\n} from './domestic-presets.js';\nimport { getProviderRegistry } from './plugin-registry.js';\n\nexport interface ModelCatalogView {\n ref: string;\n provider: string;\n id: string;\n name: string;\n reasoning: boolean;\n input: Array<'text' | 'image'>;\n contextWindow?: number;\n maxTokens?: number;\n vision: boolean;\n recommended: boolean;\n}\n\nexport interface ProviderCatalogView {\n id: string;\n name: string;\n category: ProviderCategory;\n supportsOAuth: boolean;\n supportsApiKey: boolean;\n configured: boolean;\n onboardingFeatured: boolean;\n recommendedModels: ModelCatalogView[];\n modelCount: number;\n hint?: string;\n}\n\nconst FEATURED_PROVIDER_ORDER = [\n 'openai',\n 'anthropic',\n 'xai',\n 'google',\n 'openrouter',\n 'dashscope-cn',\n 'dashscope-intl',\n 'volcengine-ark',\n 'volcengine-plan',\n 'byteplus-plan',\n 'deepseek',\n 'moonshotai',\n 'moonshotai-cn',\n 'kimi-coding',\n 'stepfun-cn',\n 'stepfun-intl',\n 'stepfun-plan-cn',\n 'stepfun-plan-intl',\n 'xiaomi',\n 'xiaomi-token-plan-cn',\n 'ant-ling',\n 'zhipu-cn',\n 'zai',\n 'zai-coding-cn',\n 'zhipu-coding-cn',\n 'minimax',\n 'minimax-cn',\n];\n\nconst PROVIDER_HINTS: Record<string, string> = {\n openai: 'Frontier OpenAI models from the official API.',\n anthropic: 'Claude models for coding, long context, and reasoning.',\n xai: 'Grok models from xAI.',\n google: 'Gemini models with strong multimodal and long-context support.',\n openrouter: 'Route many hosted models through one API key.',\n dashscope: 'DashScope service provider for Alibaba Model Studio.',\n 'dashscope-cn': 'Alibaba Bailian Qwen models through the China OpenAI-compatible endpoint.',\n 'dashscope-intl': 'Alibaba Bailian Qwen models through the international OpenAI-compatible endpoint.',\n 'volcengine-ark': 'Volcengine Ark OpenAI-compatible endpoints; use your Ark endpoint id as the model id.',\n 'volcengine-plan': 'Doubao coding-plan models through Volcengine Ark.',\n 'byteplus-plan': 'Doubao coding-plan models through BytePlus.',\n deepseek: 'DeepSeek V4 models with strong price/performance.',\n moonshotai: 'Kimi models through Moonshot International.',\n 'moonshotai-cn': 'Kimi models through Moonshot China.',\n 'kimi-coding': 'Kimi dedicated coding endpoint with Anthropic-compatible requests.',\n stepfun: 'StepFun OpenAI-compatible endpoint.',\n 'stepfun-cn': 'StepFun China OpenAI-compatible endpoint.',\n 'stepfun-intl': 'StepFun international OpenAI-compatible endpoint.',\n 'stepfun-plan': 'StepFun Step Plan coding/planning endpoint.',\n 'stepfun-plan-cn': 'StepFun Step Plan China coding/planning endpoint.',\n 'stepfun-plan-intl': 'StepFun Step Plan international coding/planning endpoint.',\n xiaomi: 'Xiaomi MiMo OpenAI-compatible model access.',\n 'xiaomi-token-plan-cn': 'Xiaomi MiMo Token Plan China endpoint.',\n 'xiaomi-token-plan-ams': 'Xiaomi MiMo Token Plan Amsterdam endpoint.',\n 'xiaomi-token-plan-sgp': 'Xiaomi MiMo Token Plan Singapore endpoint.',\n 'ant-ling': 'Ant Ling models through a domestic OpenAI-compatible endpoint.',\n 'zhipu-cn': 'Zhipu GLM China through the BigModel OpenAI-compatible API.',\n zai: 'Zhipu GLM International through z.ai.',\n 'zai-coding-cn': 'Zhipu GLM coding-plan China endpoint from pi-ai.',\n 'zai-coding-global': 'Zhipu GLM coding-plan international endpoint.',\n 'zhipu-coding-cn': 'Zhipu GLM coding-plan China endpoint.',\n minimax: 'MiniMax text models; Anthropic-compatible endpoint is preferred for agent workflows.',\n 'minimax-cn': 'MiniMax China endpoint for domestic access.',\n 'openai-codex': 'OpenAI Codex models through OAuth.',\n 'google-gemini-cli': 'Gemini through Google Cloud Code Assist OAuth.',\n 'google-antigravity': 'Gemini/Antigravity OAuth model access.',\n};\n\nconst RECOMMENDED_MODEL_PATTERNS: Record<string, RegExp[]> = {\n openai: [/^gpt-5\\.6$/i, /^gpt-5\\.6-sol$/i, /^gpt-5\\.6-terra$/i, /^gpt-5\\.6-luna$/i, /^gpt-5\\.5$/i, /^gpt-5\\.5-pro$/i],\n 'openai-codex': [/^gpt-5\\.6-sol$/i, /^gpt-5\\.6-terra$/i, /^gpt-5\\.6-luna$/i, /^gpt-5\\.5$/i],\n anthropic: [/^claude-sonnet-5$/i, /^claude-opus-4-8$/i, /^claude-fable-5$/i, /^claude-sonnet-4-6$/i, /^claude-sonnet-4-5$/i],\n google: [/^gemini-3\\.5-flash$/i, /^gemini-3\\.1-pro-preview$/i, /^gemini-3-flash-preview$/i, /^gemini-3-pro-preview$/i],\n 'google-vertex': [/^gemini-3\\.5-flash$/i, /^gemini-3\\.1-pro-preview$/i, /^gemini-3-flash-preview$/i, /^gemini-3-pro-preview$/i],\n xai: [/^grok-4/i, /^grok-3/i, /^grok-code/i],\n dashscope: [/^qwen3\\.7-plus$/i, /^qwen3\\.7-max$/i, /^qwen3\\.6-flash$/i],\n 'dashscope-cn': [/^qwen3\\.7-plus$/i, /^qwen3\\.7-max$/i, /^qwen3\\.6-flash$/i],\n 'dashscope-intl': [/^qwen3\\.7-plus$/i, /^qwen3\\.7-max$/i, /^qwen3\\.6-flash$/i],\n 'volcengine-ark': [/^ep-your-endpoint-id$/i],\n 'volcengine-plan': [/^ark-code-latest$/i, /^doubao-seed-2\\.0-code$/i, /^doubao-seed-2\\.0-pro$/i],\n 'byteplus-plan': [/^ark-code-latest$/i, /^doubao-seed-2\\.0-code$/i, /^doubao-seed-2\\.0-pro$/i],\n deepseek: [/^deepseek-v4-flash$/i, /^deepseek-v4-pro$/i],\n openrouter: [/^openai\\/gpt-5/i, /^anthropic\\/claude-sonnet-4/i, /^google\\/gemini-3/i],\n moonshotai: [/^kimi-k2\\.7-code$/i, /^kimi-k2\\.6$/i],\n 'moonshotai-cn': [/^kimi-k2\\.7-code$/i, /^kimi-k2\\.6$/i],\n 'kimi-coding': [/^k2p7$/i, /^kimi-for-coding$/i],\n stepfun: [/^step-3\\.7-flash$/i, /^step-3\\.5-flash-2603$/i, /^step-3\\.5-flash$/i],\n 'stepfun-cn': [/^step-3\\.7-flash$/i, /^step-3\\.5-flash-2603$/i, /^step-3\\.5-flash$/i],\n 'stepfun-intl': [/^step-3\\.7-flash$/i, /^step-3\\.5-flash-2603$/i, /^step-3\\.5-flash$/i],\n 'stepfun-plan': [/^step-3\\.7-flash$/i, /^step-3\\.5-flash-2603$/i, /^step-3\\.5-flash$/i],\n 'stepfun-plan-cn': [/^step-3\\.7-flash$/i, /^step-3\\.5-flash-2603$/i, /^step-3\\.5-flash$/i],\n 'stepfun-plan-intl': [/^step-3\\.7-flash$/i, /^step-3\\.5-flash-2603$/i, /^step-3\\.5-flash$/i],\n xiaomi: [/^mimo-v2\\.5-pro$/i, /^mimo-v2\\.5-pro-ultraspeed$/i, /^mimo-v2\\.5$/i],\n 'xiaomi-token-plan-cn': [/^mimo-v2\\.5-pro$/i, /^mimo-v2\\.5-pro-ultraspeed$/i, /^mimo-v2\\.5$/i],\n 'xiaomi-token-plan-ams': [/^mimo-v2\\.5-pro$/i, /^mimo-v2\\.5-pro-ultraspeed$/i, /^mimo-v2\\.5$/i],\n 'xiaomi-token-plan-sgp': [/^mimo-v2\\.5-pro$/i, /^mimo-v2\\.5-pro-ultraspeed$/i, /^mimo-v2\\.5$/i],\n 'ant-ling': [/^Ling-2\\.6-1T$/i, /^Ling-2\\.6-flash$/i, /^Ring-2\\.6-1T$/i],\n 'zhipu-cn': [/^glm-5\\.2$/i],\n zai: [/^glm-5\\.2$/i],\n 'zai-coding-cn': [/^glm-5\\.2$/i, /^glm-5\\.1$/i, /^glm-5-turbo$/i],\n 'zai-coding-global': [/^glm-5\\.2$/i],\n 'zhipu-coding-cn': [/^glm-5\\.2$/i],\n minimax: [/^MiniMax-M3$/i, /^MiniMax-M2\\.7-highspeed$/i, /^MiniMax-M2\\.7$/i],\n 'minimax-cn': [/^MiniMax-M3$/i, /^MiniMax-M2\\.7-highspeed$/i, /^MiniMax-M2\\.7$/i],\n};\n\nfunction modelRef(model: Pick<Model<Api>, 'provider' | 'id'>): string {\n return `${model.provider}/${model.id}`;\n}\n\nfunction recommendedRank(provider: string, modelId: string): number {\n const patterns = RECOMMENDED_MODEL_PATTERNS[provider] ?? [];\n const idx = patterns.findIndex((pattern) => pattern.test(modelId));\n return idx === -1 ? Number.POSITIVE_INFINITY : idx;\n}\n\nexport function isRecommendedModel(provider: string, modelId: string): boolean {\n return Number.isFinite(recommendedRank(provider, modelId));\n}\n\nexport function modelToCatalogView(model: Model<Api>): ModelCatalogView {\n const input = (model.input ?? ['text']) as Array<'text' | 'image'>;\n return {\n ref: modelRef(model),\n provider: model.provider,\n id: model.id,\n name: model.name || model.id,\n reasoning: model.reasoning ?? false,\n input,\n ...(model.contextWindow ? { contextWindow: model.contextWindow } : {}),\n ...(model.maxTokens ? { maxTokens: model.maxTokens } : {}),\n vision: input.includes('image'),\n recommended: isRecommendedModel(model.provider, model.id),\n };\n}\n\nfunction presetModelToCatalogView(provider: string, model: DomesticProviderModelPreset): ModelCatalogView {\n const input = model.input ?? ['text'];\n return {\n ref: `${provider}/${model.id}`,\n provider,\n id: model.id,\n name: model.name || model.id,\n reasoning: model.reasoning ?? false,\n input,\n ...(model.contextWindow ? { contextWindow: model.contextWindow } : {}),\n ...(model.maxTokens ? { maxTokens: model.maxTokens } : {}),\n vision: input.includes('image'),\n recommended: isRecommendedModel(provider, model.id),\n };\n}\n\nexport function sortModelsForPicker(models: readonly Model<Api>[]): Model<Api>[] {\n return [...models].sort((a, b) => {\n const aRank = recommendedRank(a.provider, a.id);\n const bRank = recommendedRank(b.provider, b.id);\n if (aRank !== bRank) return aRank - bRank;\n if (a.provider !== b.provider) return a.provider.localeCompare(b.provider);\n return (a.name || a.id).localeCompare(b.name || b.id, undefined, { sensitivity: 'base' });\n });\n}\n\nexport function getRecommendedModelsForProvider(provider: string, limit = 4): ModelCatalogView[] {\n const models = sortModelsForPicker(getModelsByProvider(provider));\n const fromRegistry = models\n .filter((model) => isRecommendedModel(provider, model.id))\n .slice(0, limit)\n .map(modelToCatalogView);\n if (fromRegistry.length > 0) return fromRegistry;\n\n const preset = getDomesticProviderPreset(provider);\n if (!preset) return [];\n return preset.models\n .filter((model) => isRecommendedModel(provider, model.id))\n .slice(0, limit)\n .map((model) => presetModelToCatalogView(provider, model));\n}\n\nexport function getProviderHint(provider: string): string | undefined {\n return PROVIDER_HINTS[provider];\n}\n\nexport function getOnboardingFeaturedProviders(): string[] {\n const providers = new Set([...getAllProviders(), ...getDomesticProviderPresetIds()]);\n return FEATURED_PROVIDER_ORDER.filter((provider) => providers.has(provider));\n}\n\nexport function sortProvidersForPicker(providers: readonly string[]): string[] {\n const featuredRank = new Map(FEATURED_PROVIDER_ORDER.map((provider, index) => [provider, index] as const));\n return [...providers].sort((a, b) => {\n const aRank = featuredRank.get(a) ?? Number.POSITIVE_INFINITY;\n const bRank = featuredRank.get(b) ?? Number.POSITIVE_INFINITY;\n if (aRank !== bRank) return aRank - bRank;\n const catA = PROVIDER_META[a]?.category ?? 'specialty';\n const catB = PROVIDER_META[b]?.category ?? 'specialty';\n const catOrder: Record<ProviderCategory, number> = {\n common: 0,\n domestic: 1,\n specialty: 2,\n enterprise: 3,\n oauth: 4,\n extension: 5,\n };\n if (catOrder[catA] !== catOrder[catB]) return catOrder[catA] - catOrder[catB];\n return getProviderDisplayName(a).localeCompare(getProviderDisplayName(b), undefined, { sensitivity: 'base' });\n });\n}\n\nexport async function getProviderCatalogViews(): Promise<ProviderCatalogView[]> {\n const pluginRegistry = getProviderRegistry();\n const providers = sortProvidersForPicker([...new Set([...getAllProviders(), ...getDomesticProviderPresetIds()])]);\n const modelCounts = new Map<string, number>();\n for (const model of getAllModels()) {\n modelCounts.set(model.provider, (modelCounts.get(model.provider) ?? 0) + 1);\n }\n\n return Promise.all(\n providers.map(async (provider) => {\n const plugin = pluginRegistry.get(provider);\n const meta = PROVIDER_META[provider];\n const domesticPreset = getDomesticProviderPreset(provider);\n return {\n id: provider,\n name: plugin?.name ?? domesticPreset?.displayName ?? getProviderDisplayName(provider),\n category: plugin ? 'extension' : (meta?.category ?? (domesticPreset ? 'domestic' : 'specialty')),\n supportsOAuth: plugin ? false : (meta?.supportsOAuth ?? false),\n supportsApiKey: plugin ? false : (meta?.supportsApiKey ?? true),\n configured: plugin ? true : await isProviderConfigured(provider),\n onboardingFeatured: FEATURED_PROVIDER_ORDER.includes(provider),\n recommendedModels: getRecommendedModelsForProvider(provider),\n modelCount: modelCounts.get(provider) ?? 0,\n ...(getProviderHint(provider) ? { hint: getProviderHint(provider) } : {}),\n };\n }),\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"presentation.js","names":[],"sources":["../../../src/providers/presentation.ts"],"sourcesContent":["import type { Api, Model } from '@earendil-works/pi-ai';\n\nimport {\n getAllModels,\n getAllProviders,\n getModelsByProvider,\n getProviderDisplayName,\n isProviderConfigured,\n PROVIDER_META,\n type ProviderCategory,\n} from './index.js';\nimport {\n getDomesticProviderPreset,\n getDomesticProviderPresetIds,\n type DomesticProviderModelPreset,\n} from './domestic-presets.js';\nimport { getProviderRegistry } from './plugin-registry.js';\n\nexport interface ModelCatalogView {\n ref: string;\n provider: string;\n id: string;\n name: string;\n reasoning: boolean;\n input: Array<'text' | 'image'>;\n contextWindow?: number;\n maxTokens?: number;\n vision: boolean;\n recommended: boolean;\n}\n\nexport interface ProviderCatalogView {\n id: string;\n name: string;\n category: ProviderCategory;\n supportsOAuth: boolean;\n supportsApiKey: boolean;\n configured: boolean;\n onboardingFeatured: boolean;\n recommendedModels: ModelCatalogView[];\n modelCount: number;\n hint?: string;\n}\n\nconst FEATURED_PROVIDER_ORDER = [\n 'deepseek',\n 'openai',\n 'anthropic',\n 'xai',\n 'google',\n 'openrouter',\n 'dashscope-cn',\n 'dashscope-intl',\n 'volcengine-ark',\n 'volcengine-plan',\n 'byteplus-plan',\n 'moonshotai',\n 'moonshotai-cn',\n 'kimi-coding',\n 'stepfun-cn',\n 'stepfun-intl',\n 'stepfun-plan-cn',\n 'stepfun-plan-intl',\n 'xiaomi',\n 'xiaomi-token-plan-cn',\n 'ant-ling',\n 'zhipu-cn',\n 'zai',\n 'zai-coding-cn',\n 'zhipu-coding-cn',\n 'minimax',\n 'minimax-cn',\n];\n\nconst PROVIDER_HINTS: Record<string, string> = {\n openai: 'Frontier OpenAI models from the official API.',\n anthropic: 'Claude models for coding, long context, and reasoning.',\n xai: 'Grok models from xAI.',\n google: 'Gemini models with strong multimodal and long-context support.',\n openrouter: 'Route many hosted models through one API key.',\n dashscope: 'DashScope service provider for Alibaba Model Studio.',\n 'dashscope-cn': 'Alibaba Bailian Qwen models through the China OpenAI-compatible endpoint.',\n 'dashscope-intl': 'Alibaba Bailian Qwen models through the international OpenAI-compatible endpoint.',\n 'volcengine-ark': 'Volcengine Ark OpenAI-compatible endpoints; use your Ark endpoint id as the model id.',\n 'volcengine-plan': 'Doubao coding-plan models through Volcengine Ark.',\n 'byteplus-plan': 'Doubao coding-plan models through BytePlus.',\n deepseek: 'DeepSeek V4 models with strong price/performance.',\n moonshotai: 'Kimi models through Moonshot International.',\n 'moonshotai-cn': 'Kimi models through Moonshot China.',\n 'kimi-coding': 'Kimi dedicated coding endpoint with Anthropic-compatible requests.',\n stepfun: 'StepFun OpenAI-compatible endpoint.',\n 'stepfun-cn': 'StepFun China OpenAI-compatible endpoint.',\n 'stepfun-intl': 'StepFun international OpenAI-compatible endpoint.',\n 'stepfun-plan': 'StepFun Step Plan coding/planning endpoint.',\n 'stepfun-plan-cn': 'StepFun Step Plan China coding/planning endpoint.',\n 'stepfun-plan-intl': 'StepFun Step Plan international coding/planning endpoint.',\n xiaomi: 'Xiaomi MiMo OpenAI-compatible model access.',\n 'xiaomi-token-plan-cn': 'Xiaomi MiMo Token Plan China endpoint.',\n 'xiaomi-token-plan-ams': 'Xiaomi MiMo Token Plan Amsterdam endpoint.',\n 'xiaomi-token-plan-sgp': 'Xiaomi MiMo Token Plan Singapore endpoint.',\n 'ant-ling': 'Ant Ling models through a domestic OpenAI-compatible endpoint.',\n 'zhipu-cn': 'Zhipu GLM China through the BigModel OpenAI-compatible API.',\n zai: 'Zhipu GLM International through z.ai.',\n 'zai-coding-cn': 'Zhipu GLM coding-plan China endpoint from pi-ai.',\n 'zai-coding-global': 'Zhipu GLM coding-plan international endpoint.',\n 'zhipu-coding-cn': 'Zhipu GLM coding-plan China endpoint.',\n minimax: 'MiniMax text models; Anthropic-compatible endpoint is preferred for agent workflows.',\n 'minimax-cn': 'MiniMax China endpoint for domestic access.',\n 'openai-codex': 'OpenAI Codex models through OAuth.',\n 'google-gemini-cli': 'Gemini through Google Cloud Code Assist OAuth.',\n 'google-antigravity': 'Gemini/Antigravity OAuth model access.',\n};\n\nconst RECOMMENDED_MODEL_PATTERNS: Record<string, RegExp[]> = {\n openai: [/^gpt-5\\.6$/i, /^gpt-5\\.6-sol$/i, /^gpt-5\\.6-terra$/i, /^gpt-5\\.6-luna$/i, /^gpt-5\\.5$/i, /^gpt-5\\.5-pro$/i],\n 'openai-codex': [/^gpt-5\\.6-sol$/i, /^gpt-5\\.6-terra$/i, /^gpt-5\\.6-luna$/i, /^gpt-5\\.5$/i],\n anthropic: [/^claude-sonnet-5$/i, /^claude-opus-4-8$/i, /^claude-fable-5$/i, /^claude-sonnet-4-6$/i, /^claude-sonnet-4-5$/i],\n google: [/^gemini-3\\.5-flash$/i, /^gemini-3\\.1-pro-preview$/i, /^gemini-3-flash-preview$/i, /^gemini-3-pro-preview$/i],\n 'google-vertex': [/^gemini-3\\.5-flash$/i, /^gemini-3\\.1-pro-preview$/i, /^gemini-3-flash-preview$/i, /^gemini-3-pro-preview$/i],\n xai: [/^grok-4/i, /^grok-3/i, /^grok-code/i],\n dashscope: [/^qwen3\\.7-plus$/i, /^qwen3\\.7-max$/i, /^qwen3\\.6-flash$/i],\n 'dashscope-cn': [/^qwen3\\.7-plus$/i, /^qwen3\\.7-max$/i, /^qwen3\\.6-flash$/i],\n 'dashscope-intl': [/^qwen3\\.7-plus$/i, /^qwen3\\.7-max$/i, /^qwen3\\.6-flash$/i],\n 'volcengine-ark': [/^ep-your-endpoint-id$/i],\n 'volcengine-plan': [/^ark-code-latest$/i, /^doubao-seed-2\\.0-code$/i, /^doubao-seed-2\\.0-pro$/i],\n 'byteplus-plan': [/^ark-code-latest$/i, /^doubao-seed-2\\.0-code$/i, /^doubao-seed-2\\.0-pro$/i],\n deepseek: [/^deepseek-v4-flash$/i, /^deepseek-v4-pro$/i],\n openrouter: [/^openai\\/gpt-5/i, /^anthropic\\/claude-sonnet-4/i, /^google\\/gemini-3/i],\n moonshotai: [/^kimi-k2\\.7-code$/i, /^kimi-k2\\.6$/i],\n 'moonshotai-cn': [/^kimi-k2\\.7-code$/i, /^kimi-k2\\.6$/i],\n 'kimi-coding': [/^k2p7$/i, /^kimi-for-coding$/i],\n stepfun: [/^step-3\\.7-flash$/i, /^step-3\\.5-flash-2603$/i, /^step-3\\.5-flash$/i],\n 'stepfun-cn': [/^step-3\\.7-flash$/i, /^step-3\\.5-flash-2603$/i, /^step-3\\.5-flash$/i],\n 'stepfun-intl': [/^step-3\\.7-flash$/i, /^step-3\\.5-flash-2603$/i, /^step-3\\.5-flash$/i],\n 'stepfun-plan': [/^step-3\\.7-flash$/i, /^step-3\\.5-flash-2603$/i, /^step-3\\.5-flash$/i],\n 'stepfun-plan-cn': [/^step-3\\.7-flash$/i, /^step-3\\.5-flash-2603$/i, /^step-3\\.5-flash$/i],\n 'stepfun-plan-intl': [/^step-3\\.7-flash$/i, /^step-3\\.5-flash-2603$/i, /^step-3\\.5-flash$/i],\n xiaomi: [/^mimo-v2\\.5-pro$/i, /^mimo-v2\\.5-pro-ultraspeed$/i, /^mimo-v2\\.5$/i],\n 'xiaomi-token-plan-cn': [/^mimo-v2\\.5-pro$/i, /^mimo-v2\\.5-pro-ultraspeed$/i, /^mimo-v2\\.5$/i],\n 'xiaomi-token-plan-ams': [/^mimo-v2\\.5-pro$/i, /^mimo-v2\\.5-pro-ultraspeed$/i, /^mimo-v2\\.5$/i],\n 'xiaomi-token-plan-sgp': [/^mimo-v2\\.5-pro$/i, /^mimo-v2\\.5-pro-ultraspeed$/i, /^mimo-v2\\.5$/i],\n 'ant-ling': [/^Ling-2\\.6-1T$/i, /^Ling-2\\.6-flash$/i, /^Ring-2\\.6-1T$/i],\n 'zhipu-cn': [/^glm-5\\.2$/i],\n zai: [/^glm-5\\.2$/i],\n 'zai-coding-cn': [/^glm-5\\.2$/i, /^glm-5\\.1$/i, /^glm-5-turbo$/i],\n 'zai-coding-global': [/^glm-5\\.2$/i],\n 'zhipu-coding-cn': [/^glm-5\\.2$/i],\n minimax: [/^MiniMax-M3$/i, /^MiniMax-M2\\.7-highspeed$/i, /^MiniMax-M2\\.7$/i],\n 'minimax-cn': [/^MiniMax-M3$/i, /^MiniMax-M2\\.7-highspeed$/i, /^MiniMax-M2\\.7$/i],\n};\n\nfunction modelRef(model: Pick<Model<Api>, 'provider' | 'id'>): string {\n return `${model.provider}/${model.id}`;\n}\n\nfunction recommendedRank(provider: string, modelId: string): number {\n const patterns = RECOMMENDED_MODEL_PATTERNS[provider] ?? [];\n const idx = patterns.findIndex((pattern) => pattern.test(modelId));\n return idx === -1 ? Number.POSITIVE_INFINITY : idx;\n}\n\nexport function isRecommendedModel(provider: string, modelId: string): boolean {\n return Number.isFinite(recommendedRank(provider, modelId));\n}\n\nexport function modelToCatalogView(model: Model<Api>): ModelCatalogView {\n const input = (model.input ?? ['text']) as Array<'text' | 'image'>;\n return {\n ref: modelRef(model),\n provider: model.provider,\n id: model.id,\n name: model.name || model.id,\n reasoning: model.reasoning ?? false,\n input,\n ...(model.contextWindow ? { contextWindow: model.contextWindow } : {}),\n ...(model.maxTokens ? { maxTokens: model.maxTokens } : {}),\n vision: input.includes('image'),\n recommended: isRecommendedModel(model.provider, model.id),\n };\n}\n\nfunction presetModelToCatalogView(provider: string, model: DomesticProviderModelPreset): ModelCatalogView {\n const input = model.input ?? ['text'];\n return {\n ref: `${provider}/${model.id}`,\n provider,\n id: model.id,\n name: model.name || model.id,\n reasoning: model.reasoning ?? false,\n input,\n ...(model.contextWindow ? { contextWindow: model.contextWindow } : {}),\n ...(model.maxTokens ? { maxTokens: model.maxTokens } : {}),\n vision: input.includes('image'),\n recommended: isRecommendedModel(provider, model.id),\n };\n}\n\nexport function sortModelsForPicker(models: readonly Model<Api>[]): Model<Api>[] {\n return [...models].sort((a, b) => {\n const aRank = recommendedRank(a.provider, a.id);\n const bRank = recommendedRank(b.provider, b.id);\n if (aRank !== bRank) return aRank - bRank;\n if (a.provider !== b.provider) return a.provider.localeCompare(b.provider);\n return (a.name || a.id).localeCompare(b.name || b.id, undefined, { sensitivity: 'base' });\n });\n}\n\nexport function getRecommendedModelsForProvider(provider: string, limit = 4): ModelCatalogView[] {\n const models = sortModelsForPicker(getModelsByProvider(provider));\n const fromRegistry = models\n .filter((model) => isRecommendedModel(provider, model.id))\n .slice(0, limit)\n .map(modelToCatalogView);\n if (fromRegistry.length > 0) return fromRegistry;\n\n const preset = getDomesticProviderPreset(provider);\n if (!preset) return [];\n return preset.models\n .filter((model) => isRecommendedModel(provider, model.id))\n .slice(0, limit)\n .map((model) => presetModelToCatalogView(provider, model));\n}\n\nexport function getProviderHint(provider: string): string | undefined {\n return PROVIDER_HINTS[provider];\n}\n\nexport function getOnboardingFeaturedProviders(): string[] {\n const providers = new Set([...getAllProviders(), ...getDomesticProviderPresetIds()]);\n return FEATURED_PROVIDER_ORDER.filter((provider) => providers.has(provider));\n}\n\nexport function sortProvidersForPicker(providers: readonly string[]): string[] {\n const featuredRank = new Map(FEATURED_PROVIDER_ORDER.map((provider, index) => [provider, index] as const));\n return [...providers].sort((a, b) => {\n const aRank = featuredRank.get(a) ?? Number.POSITIVE_INFINITY;\n const bRank = featuredRank.get(b) ?? Number.POSITIVE_INFINITY;\n if (aRank !== bRank) return aRank - bRank;\n const catA = PROVIDER_META[a]?.category ?? 'specialty';\n const catB = PROVIDER_META[b]?.category ?? 'specialty';\n const catOrder: Record<ProviderCategory, number> = {\n common: 0,\n domestic: 1,\n specialty: 2,\n enterprise: 3,\n oauth: 4,\n extension: 5,\n };\n if (catOrder[catA] !== catOrder[catB]) return catOrder[catA] - catOrder[catB];\n return getProviderDisplayName(a).localeCompare(getProviderDisplayName(b), undefined, { sensitivity: 'base' });\n });\n}\n\nexport async function getProviderCatalogViews(): Promise<ProviderCatalogView[]> {\n const pluginRegistry = getProviderRegistry();\n const providers = sortProvidersForPicker([...new Set([...getAllProviders(), ...getDomesticProviderPresetIds()])]);\n const modelCounts = new Map<string, number>();\n for (const model of getAllModels()) {\n modelCounts.set(model.provider, (modelCounts.get(model.provider) ?? 0) + 1);\n }\n\n return Promise.all(\n providers.map(async (provider) => {\n const plugin = pluginRegistry.get(provider);\n const meta = PROVIDER_META[provider];\n const domesticPreset = getDomesticProviderPreset(provider);\n return {\n id: provider,\n name: plugin?.name ?? domesticPreset?.displayName ?? getProviderDisplayName(provider),\n category: plugin ? 'extension' : (meta?.category ?? (domesticPreset ? 'domestic' : 'specialty')),\n supportsOAuth: plugin ? false : (meta?.supportsOAuth ?? false),\n supportsApiKey: plugin ? false : (meta?.supportsApiKey ?? true),\n configured: plugin ? true : await isProviderConfigured(provider),\n onboardingFeatured: FEATURED_PROVIDER_ORDER.includes(provider),\n recommendedModels: getRecommendedModelsForProvider(provider),\n modelCount: modelCounts.get(provider) ?? 0,\n ...(getProviderHint(provider) ? { hint: getProviderHint(provider) } : {}),\n };\n }),\n );\n}\n"],"mappings":"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"}
@@ -12,6 +12,7 @@ export { appendTranscriptEntry, captureCompactionCheckpoint, getCompactionCheckp
12
12
  export { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord, } from './notes-repository.js';
13
13
  export { deleteNoteAgentContextRecord, getNoteAgentContextRecord, upsertNoteAgentContextRecord, type NoteAgentContextRecord, } from './note-agent-context-repository.js';
14
14
  export { resolveAgentIdFromMemoriesDir, searchMemoryIndex, syncMemoryIndex, type MemorySearchHit, } from './memory-index-repository.js';
15
- export { appendMemorySignal, appendMemoryTraceEvent, deleteMemoryRecord, getMemoryProviderState, getMemoryRecord, listMemorySignals, listMemoryTraceEvents, listMemoryRecords, searchMemoryRecords, setMemoryProviderState, setMemoryTraceFeedback, summarizeMemoryRecallFeedback, upsertMemoryRecord, type AppendMemorySignalInput, type AppendMemoryTraceEventInput, type ListMemoryRecordsOptions, type MemoryRecallFeedbackSummary, type MemorySignalRowPayload, type MemoryTraceFeedback, type MemoryTraceEventPayload, type SearchMemoryRecordsOptions, type SetMemoryTraceFeedbackInput, type UpsertMemoryRecordInput, } from './memory-records-repository.js';
15
+ export { appendMemorySignal, appendMemoryTraceEvent, deleteMemoryRecord, findLatestMemoryInjectTrace, getMemoryProviderState, getMemoryRecord, listMemorySignals, listMemoryTraceEvents, listMemoryRecords, searchMemoryRecords, setMemoryProviderState, setMemoryTraceFeedback, setLatestMemoryInjectFeedback, summarizeMemoryRecallFeedback, summarizeUserUnderstandingQuality, USER_UNDERSTANDING_REMEDIATION_POLICY, upsertMemoryRecord, type AppendMemorySignalInput, type AppendMemoryTraceEventInput, type FindLatestMemoryInjectTraceInput, type ListMemoryRecordsOptions, type MemoryRecallFeedbackSummary, type MemoryFeedbackRemediationResult, type MemorySignalRowPayload, type MemoryTraceFeedback, type MemoryTraceEventPayload, type UserUnderstandingQualityMetrics, type SearchMemoryRecordsOptions, type SetMemoryTraceFeedbackInput, type SetLatestMemoryInjectFeedbackInput, type UpsertMemoryRecordInput, } from './memory-records-repository.js';
16
+ export { attachMemoryEvidence, finishKnowledgeSyncRun, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, setKnowledgeSourceItemSynthesisStatus, setKnowledgeSourceCursor, startKnowledgeSyncRun, upsertKnowledgeSourceItems, } from './knowledge-repository.js';
16
17
  export { deleteSessionConfig, getSessionConfig, hasSessionConfig, setSessionConfig, updateSessionConfig, } from './config-repository.js';
17
18
  export { createObjectLinkRecord, getActivityEventRecord, listActivityRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, recordActivityEvent, } from './activity-repository.js';
@@ -13,7 +13,8 @@ import { appendTranscriptEntry, captureCompactionCheckpoint, getCompactionCheckp
13
13
  import { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord } from "./notes-repository.js";
14
14
  import { deleteNoteAgentContextRecord, getNoteAgentContextRecord, upsertNoteAgentContextRecord } from "./note-agent-context-repository.js";
15
15
  import { resolveAgentIdFromMemoriesDir, searchMemoryIndex, syncMemoryIndex } from "./memory-index-repository.js";
16
- import { appendMemorySignal, appendMemoryTraceEvent, deleteMemoryRecord, getMemoryProviderState, getMemoryRecord, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, searchMemoryRecords, setMemoryProviderState, setMemoryTraceFeedback, summarizeMemoryRecallFeedback, upsertMemoryRecord } from "./memory-records-repository.js";
16
+ import { USER_UNDERSTANDING_REMEDIATION_POLICY, appendMemorySignal, appendMemoryTraceEvent, deleteMemoryRecord, findLatestMemoryInjectTrace, getMemoryProviderState, getMemoryRecord, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, searchMemoryRecords, setLatestMemoryInjectFeedback, setMemoryProviderState, setMemoryTraceFeedback, summarizeMemoryRecallFeedback, summarizeUserUnderstandingQuality, upsertMemoryRecord } from "./memory-records-repository.js";
17
+ import { attachMemoryEvidence, finishKnowledgeSyncRun, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, startKnowledgeSyncRun, upsertKnowledgeSourceItems } from "./knowledge-repository.js";
17
18
  import { deleteSessionConfig, getSessionConfig, hasSessionConfig, setSessionConfig, updateSessionConfig } from "./config-repository.js";
18
19
  import { createObjectLinkRecord, getActivityEventRecord, listActivityRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, recordActivityEvent } from "./activity-repository.js";
19
- export { DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, SCHEMA_META_SCHEMA_VERSION_KEY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, appendMemorySignal, appendMemoryTraceEvent, appendTranscriptEntry, applyPendingMigrations, buildDefaultSessionMetadata, buildGlobalSessionStats, captureCompactionCheckpoint, classifyStoredRow, closeXopcDatabase, createObjectLinkRecord, deleteMemoryRecord, deleteNoteAgentContextRecord, deleteNoteRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findSessionKeyBySessionId, getActivityEventRecord, getCompactionCheckpointDetail, getCurrentSessionId, getGlobalSessionStats, getMemoryProviderState, getMemoryRecord, getNoteAgentContextRecord, getNoteRecord, getSessionConfig, getSessionMetadata, getSessionPersistedLevels, getSqliteDatabase, getXopcDatabase, hasSessionConfig, incrementSessionStatsOnAppend, inspectSchemaMigrationStatus, isXopcDatabaseOpen, listActivityRecords, listCompactionCheckpoints, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRows, loadTranscriptRowsForSession, metadataToSessionInsert, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, readSchemaVersion, readSchemaVersionForTest, recordActivityEvent, replaceTranscriptRows, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveAgentIdFromMemoriesDir, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreCompactionCheckpoint, runSqliteWriteTransaction, searchMemoryIndex, searchMemoryRecords, sessionConfigRowToConfig, sessionRowToMetadata, setMemoryProviderState, setMemoryTraceFeedback, setSessionConfig, summarizeMemoryRecallFeedback, syncMemoryIndex, transcriptEntryRowToStoredRow, updateSessionConfig, updateSessionStats, upsertMemoryRecord, upsertNoteAgentContextRecord, upsertNoteRecord };
20
+ export { DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, SCHEMA_META_SCHEMA_VERSION_KEY, USER_UNDERSTANDING_REMEDIATION_POLICY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, appendMemorySignal, appendMemoryTraceEvent, appendTranscriptEntry, applyPendingMigrations, attachMemoryEvidence, buildDefaultSessionMetadata, buildGlobalSessionStats, captureCompactionCheckpoint, classifyStoredRow, closeXopcDatabase, createObjectLinkRecord, deleteMemoryRecord, deleteNoteAgentContextRecord, deleteNoteRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findLatestMemoryInjectTrace, findSessionKeyBySessionId, finishKnowledgeSyncRun, getActivityEventRecord, getCompactionCheckpointDetail, getCurrentSessionId, getGlobalSessionStats, getKnowledgeSourceCursor, getKnowledgeSourceItem, getMemoryProviderState, getMemoryRecord, getNoteAgentContextRecord, getNoteRecord, getSessionConfig, getSessionMetadata, getSessionPersistedLevels, getSqliteDatabase, getXopcDatabase, hasSessionConfig, incrementSessionStatsOnAppend, inspectSchemaMigrationStatus, isXopcDatabaseOpen, listActivityRecords, listCompactionCheckpoints, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRows, loadTranscriptRowsForSession, metadataToSessionInsert, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, readSchemaVersion, readSchemaVersionForTest, recordActivityEvent, replaceTranscriptRows, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveAgentIdFromMemoriesDir, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreCompactionCheckpoint, runSqliteWriteTransaction, searchMemoryIndex, searchMemoryRecords, sessionConfigRowToConfig, sessionRowToMetadata, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, setLatestMemoryInjectFeedback, setMemoryProviderState, setMemoryTraceFeedback, setSessionConfig, startKnowledgeSyncRun, summarizeMemoryRecallFeedback, summarizeUserUnderstandingQuality, syncMemoryIndex, transcriptEntryRowToStoredRow, updateSessionConfig, updateSessionStats, upsertKnowledgeSourceItems, upsertMemoryRecord, upsertNoteAgentContextRecord, upsertNoteRecord };
@@ -0,0 +1,50 @@
1
+ import type { KnowledgeSourceItem, KnowledgeSourceItemInput, KnowledgeSyncRun, KnowledgeSyncRunStatus, KnowledgeSynthesisStatus } from '../../knowledge/types.js';
2
+ import type { MemoryEvidence, MemoryEvidenceRelation } from '../../agent/memory/types.js';
3
+ export declare function startKnowledgeSyncRun(input: {
4
+ sourceInstanceId: string;
5
+ cursorBefore?: string;
6
+ nowMs?: number;
7
+ }): KnowledgeSyncRun;
8
+ export declare function finishKnowledgeSyncRun(input: {
9
+ runId: string;
10
+ status: Exclude<KnowledgeSyncRunStatus, 'running'>;
11
+ cursorAfter?: string;
12
+ itemsSeen?: number;
13
+ itemsCreated?: number;
14
+ itemsUpdated?: number;
15
+ warnings?: string[];
16
+ error?: string;
17
+ nowMs?: number;
18
+ }): KnowledgeSyncRun;
19
+ export declare function listKnowledgeSyncRuns(options?: {
20
+ sourceInstanceId?: string;
21
+ status?: KnowledgeSyncRunStatus;
22
+ limit?: number;
23
+ }): KnowledgeSyncRun[];
24
+ export declare function getKnowledgeSourceCursor(sourceInstanceId: string): string | undefined;
25
+ export declare function setKnowledgeSourceCursor(sourceInstanceId: string, cursor: string | undefined): void;
26
+ export declare function upsertKnowledgeSourceItems(inputs: KnowledgeSourceItemInput[], nowMs?: number): {
27
+ items: KnowledgeSourceItem[];
28
+ created: number;
29
+ updated: number;
30
+ unchanged: number;
31
+ };
32
+ export declare function getKnowledgeSourceItem(itemId: string): KnowledgeSourceItem | null;
33
+ export declare function listKnowledgeSourceItems(options?: {
34
+ sourceInstanceId?: string;
35
+ synthesisStatus?: KnowledgeSynthesisStatus;
36
+ includeDeleted?: boolean;
37
+ limit?: number;
38
+ offset?: number;
39
+ }): KnowledgeSourceItem[];
40
+ export declare function setKnowledgeSourceItemSynthesisStatus(itemIds: string[], status: KnowledgeSynthesisStatus, nowMs?: number): number;
41
+ export declare function attachMemoryEvidence(input: {
42
+ recordId: string;
43
+ sourceItemId?: string;
44
+ relation?: MemoryEvidenceRelation;
45
+ excerpt?: string;
46
+ confidence?: number;
47
+ observedAt?: string;
48
+ nowMs?: number;
49
+ }): MemoryEvidence;
50
+ export declare function listMemoryEvidence(recordId: string): MemoryEvidence[];
@@ -0,0 +1,237 @@
1
+ import { getSqliteDatabase, runSqliteWriteTransaction } from "./transaction.js";
2
+ import { randomUUID } from "node:crypto";
3
+ //#region src/storage/sqlite/knowledge-repository.ts
4
+ function parseTimestamp(value) {
5
+ if (!value) return null;
6
+ const parsed = Date.parse(value);
7
+ return Number.isFinite(parsed) ? parsed : null;
8
+ }
9
+ function timestampToIso(value) {
10
+ return value == null ? void 0 : new Date(value).toISOString();
11
+ }
12
+ function parseRecord(json) {
13
+ try {
14
+ const parsed = JSON.parse(json);
15
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
16
+ } catch {
17
+ return {};
18
+ }
19
+ }
20
+ function parseStrings(json) {
21
+ try {
22
+ const parsed = JSON.parse(json);
23
+ return Array.isArray(parsed) ? parsed.filter((item) => typeof item === "string") : [];
24
+ } catch {
25
+ return [];
26
+ }
27
+ }
28
+ function sourceItemFromRow(row) {
29
+ return {
30
+ id: row.item_id,
31
+ sourceInstanceId: row.source_instance_id,
32
+ externalId: row.external_id,
33
+ itemType: row.item_type,
34
+ ...row.author_role ? { authorRole: row.author_role } : {},
35
+ ...timestampToIso(row.occurred_at) ? { occurredAt: timestampToIso(row.occurred_at) } : {},
36
+ ...timestampToIso(row.source_updated_at) ? { sourceUpdatedAt: timestampToIso(row.source_updated_at) } : {},
37
+ contentHash: row.content_hash,
38
+ ...row.normalized_text ? { normalizedText: row.normalized_text } : {},
39
+ ...row.payload_ref ? { payloadRef: row.payload_ref } : {},
40
+ metadata: parseRecord(row.metadata_json),
41
+ sensitivity: row.sensitivity,
42
+ retentionClass: row.retention_class,
43
+ synthesisStatus: row.synthesis_status,
44
+ ...timestampToIso(row.deleted_at) ? { deletedAt: timestampToIso(row.deleted_at) } : {},
45
+ createdAt: new Date(row.created_at).toISOString(),
46
+ updatedAt: new Date(row.updated_at).toISOString()
47
+ };
48
+ }
49
+ function syncRunFromRow(row) {
50
+ return {
51
+ id: row.run_id,
52
+ sourceInstanceId: row.source_instance_id,
53
+ status: row.status,
54
+ ...row.cursor_before ? { cursorBefore: row.cursor_before } : {},
55
+ ...row.cursor_after ? { cursorAfter: row.cursor_after } : {},
56
+ itemsSeen: row.items_seen,
57
+ itemsCreated: row.items_created,
58
+ itemsUpdated: row.items_updated,
59
+ warnings: parseStrings(row.warnings_json),
60
+ ...row.error ? { error: row.error } : {},
61
+ startedAt: new Date(row.started_at).toISOString(),
62
+ ...timestampToIso(row.finished_at) ? { finishedAt: timestampToIso(row.finished_at) } : {}
63
+ };
64
+ }
65
+ function startKnowledgeSyncRun(input) {
66
+ const id = randomUUID();
67
+ const now = input.nowMs ?? Date.now();
68
+ runSqliteWriteTransaction((db) => {
69
+ db.prepare(`INSERT INTO knowledge_sync_runs (
70
+ run_id, source_instance_id, status, cursor_before, started_at
71
+ ) VALUES (?, ?, 'running', ?, ?)`).run(id, input.sourceInstanceId, input.cursorBefore ?? null, now);
72
+ });
73
+ return {
74
+ id,
75
+ sourceInstanceId: input.sourceInstanceId,
76
+ status: "running",
77
+ ...input.cursorBefore ? { cursorBefore: input.cursorBefore } : {},
78
+ itemsSeen: 0,
79
+ itemsCreated: 0,
80
+ itemsUpdated: 0,
81
+ warnings: [],
82
+ startedAt: new Date(now).toISOString()
83
+ };
84
+ }
85
+ function finishKnowledgeSyncRun(input) {
86
+ const now = input.nowMs ?? Date.now();
87
+ runSqliteWriteTransaction((db) => {
88
+ db.prepare(`UPDATE knowledge_sync_runs SET
89
+ status = ?, cursor_after = ?, items_seen = ?, items_created = ?,
90
+ items_updated = ?, warnings_json = ?, error = ?, finished_at = ?
91
+ WHERE run_id = ?`).run(input.status, input.cursorAfter ?? null, input.itemsSeen ?? 0, input.itemsCreated ?? 0, input.itemsUpdated ?? 0, JSON.stringify(input.warnings ?? []), input.error ?? null, now, input.runId);
92
+ });
93
+ const row = getSqliteDatabase().prepare(`SELECT * FROM knowledge_sync_runs WHERE run_id = ?`).get(input.runId);
94
+ if (!row) throw new Error(`Knowledge sync run not found: ${input.runId}`);
95
+ return syncRunFromRow(row);
96
+ }
97
+ function listKnowledgeSyncRuns(options = {}) {
98
+ const where = [];
99
+ const params = [];
100
+ if (options.sourceInstanceId) {
101
+ where.push("source_instance_id = ?");
102
+ params.push(options.sourceInstanceId);
103
+ }
104
+ if (options.status) {
105
+ where.push("status = ?");
106
+ params.push(options.status);
107
+ }
108
+ const limit = Math.max(1, Math.min(500, options.limit ?? 100));
109
+ return getSqliteDatabase().prepare(`SELECT * FROM knowledge_sync_runs
110
+ ${where.length > 0 ? `WHERE ${where.join(" AND ")}` : ""}
111
+ ORDER BY started_at DESC LIMIT ?`).all(...params, limit).map(syncRunFromRow);
112
+ }
113
+ function getKnowledgeSourceCursor(sourceInstanceId) {
114
+ return getSqliteDatabase().prepare(`SELECT cursor FROM knowledge_source_state WHERE source_instance_id = ?`).get(sourceInstanceId)?.cursor ?? void 0;
115
+ }
116
+ function setKnowledgeSourceCursor(sourceInstanceId, cursor) {
117
+ runSqliteWriteTransaction((db) => {
118
+ db.prepare(`INSERT INTO knowledge_source_state (source_instance_id, cursor, updated_at)
119
+ VALUES (?, ?, ?)
120
+ ON CONFLICT(source_instance_id) DO UPDATE SET
121
+ cursor = excluded.cursor,
122
+ updated_at = excluded.updated_at`).run(sourceInstanceId, cursor ?? null, Date.now());
123
+ });
124
+ }
125
+ function upsertKnowledgeSourceItems(inputs, nowMs = Date.now()) {
126
+ return runSqliteWriteTransaction((db) => {
127
+ const items = [];
128
+ let created = 0;
129
+ let updated = 0;
130
+ let unchanged = 0;
131
+ for (const input of inputs) {
132
+ const existing = db.prepare(`SELECT * FROM knowledge_source_items
133
+ WHERE source_instance_id = ? AND external_id = ?`).get(input.sourceInstanceId, input.externalId);
134
+ const id = existing?.item_id ?? input.id ?? randomUUID();
135
+ if (existing?.content_hash === input.contentHash && existing.deleted_at === parseTimestamp(input.deletedAt)) {
136
+ unchanged += 1;
137
+ items.push(sourceItemFromRow(existing));
138
+ continue;
139
+ }
140
+ db.prepare(`INSERT INTO knowledge_source_items (
141
+ item_id, source_instance_id, external_id, item_type, author_role,
142
+ occurred_at, source_updated_at, content_hash, normalized_text,
143
+ payload_ref, metadata_json, sensitivity, retention_class,
144
+ synthesis_status, deleted_at, created_at, updated_at
145
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
146
+ ON CONFLICT(source_instance_id, external_id) DO UPDATE SET
147
+ item_type = excluded.item_type,
148
+ author_role = excluded.author_role,
149
+ occurred_at = excluded.occurred_at,
150
+ source_updated_at = excluded.source_updated_at,
151
+ content_hash = excluded.content_hash,
152
+ normalized_text = excluded.normalized_text,
153
+ payload_ref = excluded.payload_ref,
154
+ metadata_json = excluded.metadata_json,
155
+ sensitivity = excluded.sensitivity,
156
+ retention_class = excluded.retention_class,
157
+ synthesis_status = excluded.synthesis_status,
158
+ deleted_at = excluded.deleted_at,
159
+ updated_at = excluded.updated_at`).run(id, input.sourceInstanceId, input.externalId, input.itemType, input.authorRole ?? null, parseTimestamp(input.occurredAt), parseTimestamp(input.sourceUpdatedAt), input.contentHash, input.normalizedText ?? null, input.payloadRef ?? null, JSON.stringify(input.metadata ?? {}), input.sensitivity ?? "normal", input.retentionClass ?? "bounded", input.synthesisStatus ?? "pending", parseTimestamp(input.deletedAt), existing?.created_at ?? nowMs, nowMs);
160
+ const row = db.prepare(`SELECT * FROM knowledge_source_items WHERE item_id = ?`).get(id);
161
+ items.push(sourceItemFromRow(row));
162
+ if (existing) updated += 1;
163
+ else created += 1;
164
+ }
165
+ return {
166
+ items,
167
+ created,
168
+ updated,
169
+ unchanged
170
+ };
171
+ });
172
+ }
173
+ function getKnowledgeSourceItem(itemId) {
174
+ const row = getSqliteDatabase().prepare(`SELECT * FROM knowledge_source_items WHERE item_id = ?`).get(itemId);
175
+ return row ? sourceItemFromRow(row) : null;
176
+ }
177
+ function listKnowledgeSourceItems(options = {}) {
178
+ const where = [];
179
+ const params = [];
180
+ if (options.sourceInstanceId) {
181
+ where.push("source_instance_id = ?");
182
+ params.push(options.sourceInstanceId);
183
+ }
184
+ if (options.synthesisStatus) {
185
+ where.push("synthesis_status = ?");
186
+ params.push(options.synthesisStatus);
187
+ }
188
+ if (!options.includeDeleted) where.push("deleted_at IS NULL");
189
+ const limit = Math.max(1, Math.min(500, options.limit ?? 100));
190
+ const offset = Math.max(0, options.offset ?? 0);
191
+ return getSqliteDatabase().prepare(`SELECT * FROM knowledge_source_items
192
+ ${where.length > 0 ? `WHERE ${where.join(" AND ")}` : ""}
193
+ ORDER BY COALESCE(source_updated_at, occurred_at, updated_at) DESC
194
+ LIMIT ? OFFSET ?`).all(...params, limit, offset).map(sourceItemFromRow);
195
+ }
196
+ function setKnowledgeSourceItemSynthesisStatus(itemIds, status, nowMs = Date.now()) {
197
+ if (itemIds.length === 0) return 0;
198
+ return runSqliteWriteTransaction((db) => {
199
+ const placeholders = itemIds.map(() => "?").join(", ");
200
+ const result = db.prepare(`UPDATE knowledge_source_items SET synthesis_status = ?, updated_at = ?
201
+ WHERE item_id IN (${placeholders})`).run(status, nowMs, ...itemIds);
202
+ return Number(result.changes);
203
+ });
204
+ }
205
+ function attachMemoryEvidence(input) {
206
+ const evidenceId = randomUUID();
207
+ const now = input.nowMs ?? Date.now();
208
+ const observedAt = parseTimestamp(input.observedAt);
209
+ runSqliteWriteTransaction((db) => {
210
+ db.prepare(`INSERT INTO memory_evidence (
211
+ evidence_id, record_id, source_item_id, relation, excerpt,
212
+ confidence, observed_at, created_at
213
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(evidenceId, input.recordId, input.sourceItemId ?? null, input.relation ?? "supports", input.excerpt ?? null, input.confidence ?? null, observedAt, now);
214
+ });
215
+ return {
216
+ evidenceId,
217
+ ...input.sourceItemId ? { sourceItemId: input.sourceItemId } : {},
218
+ relation: input.relation ?? "supports",
219
+ ...input.excerpt ? { sourceText: input.excerpt } : {},
220
+ ...input.confidence != null ? { confidence: input.confidence } : {},
221
+ ...observedAt != null ? { observedAt: new Date(observedAt).toISOString() } : {}
222
+ };
223
+ }
224
+ function listMemoryEvidence(recordId) {
225
+ return getSqliteDatabase().prepare(`SELECT * FROM memory_evidence WHERE record_id = ? ORDER BY created_at ASC`).all(recordId).map((row) => ({
226
+ evidenceId: row.evidence_id,
227
+ ...row.source_item_id ? { sourceItemId: row.source_item_id } : {},
228
+ relation: row.relation,
229
+ ...row.excerpt ? { sourceText: row.excerpt } : {},
230
+ ...row.confidence != null ? { confidence: row.confidence } : {},
231
+ ...timestampToIso(row.observed_at) ? { observedAt: timestampToIso(row.observed_at) } : {}
232
+ }));
233
+ }
234
+ //#endregion
235
+ export { attachMemoryEvidence, finishKnowledgeSyncRun, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, startKnowledgeSyncRun, upsertKnowledgeSourceItems };
236
+
237
+ //# sourceMappingURL=knowledge-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-repository.js","names":[],"sources":["../../../../src/storage/sqlite/knowledge-repository.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type {\n KnowledgeSourceItem,\n KnowledgeSourceItemInput,\n KnowledgeSyncRun,\n KnowledgeSyncRunStatus,\n KnowledgeSynthesisStatus,\n} from '../../knowledge/types.js';\nimport type { MemoryEvidence, MemoryEvidenceRelation } from '../../agent/memory/types.js';\nimport { getSqliteDatabase, runSqliteWriteTransaction } from './transaction.js';\n\ntype KnowledgeSourceItemRow = {\n item_id: string;\n source_instance_id: string;\n external_id: string;\n item_type: string;\n author_role: string | null;\n occurred_at: number | null;\n source_updated_at: number | null;\n content_hash: string;\n normalized_text: string | null;\n payload_ref: string | null;\n metadata_json: string;\n sensitivity: string;\n retention_class: string;\n synthesis_status: string;\n deleted_at: number | null;\n created_at: number;\n updated_at: number;\n};\n\ntype KnowledgeSyncRunRow = {\n run_id: string;\n source_instance_id: string;\n status: string;\n cursor_before: string | null;\n cursor_after: string | null;\n items_seen: number;\n items_created: number;\n items_updated: number;\n warnings_json: string;\n error: string | null;\n started_at: number;\n finished_at: number | null;\n};\n\ntype MemoryEvidenceRow = {\n evidence_id: string;\n record_id: string;\n source_item_id: string | null;\n relation: string;\n excerpt: string | null;\n confidence: number | null;\n observed_at: number | null;\n created_at: number;\n};\n\nfunction parseTimestamp(value: string | undefined): number | null {\n if (!value) return null;\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction timestampToIso(value: number | null): string | undefined {\n return value == null ? undefined : new Date(value).toISOString();\n}\n\nfunction parseRecord(json: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(json) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : {};\n } catch {\n return {};\n }\n}\n\nfunction parseStrings(json: string): string[] {\n try {\n const parsed = JSON.parse(json) as unknown;\n return Array.isArray(parsed) ? parsed.filter((item): item is string => typeof item === 'string') : [];\n } catch {\n return [];\n }\n}\n\nfunction sourceItemFromRow(row: KnowledgeSourceItemRow): KnowledgeSourceItem {\n return {\n id: row.item_id,\n sourceInstanceId: row.source_instance_id,\n externalId: row.external_id,\n itemType: row.item_type,\n ...(row.author_role ? { authorRole: row.author_role as KnowledgeSourceItem['authorRole'] } : {}),\n ...(timestampToIso(row.occurred_at) ? { occurredAt: timestampToIso(row.occurred_at) } : {}),\n ...(timestampToIso(row.source_updated_at) ? { sourceUpdatedAt: timestampToIso(row.source_updated_at) } : {}),\n contentHash: row.content_hash,\n ...(row.normalized_text ? { normalizedText: row.normalized_text } : {}),\n ...(row.payload_ref ? { payloadRef: row.payload_ref } : {}),\n metadata: parseRecord(row.metadata_json),\n sensitivity: row.sensitivity as KnowledgeSourceItem['sensitivity'],\n retentionClass: row.retention_class as KnowledgeSourceItem['retentionClass'],\n synthesisStatus: row.synthesis_status as KnowledgeSourceItem['synthesisStatus'],\n ...(timestampToIso(row.deleted_at) ? { deletedAt: timestampToIso(row.deleted_at) } : {}),\n createdAt: new Date(row.created_at).toISOString(),\n updatedAt: new Date(row.updated_at).toISOString(),\n };\n}\n\nfunction syncRunFromRow(row: KnowledgeSyncRunRow): KnowledgeSyncRun {\n return {\n id: row.run_id,\n sourceInstanceId: row.source_instance_id,\n status: row.status as KnowledgeSyncRunStatus,\n ...(row.cursor_before ? { cursorBefore: row.cursor_before } : {}),\n ...(row.cursor_after ? { cursorAfter: row.cursor_after } : {}),\n itemsSeen: row.items_seen,\n itemsCreated: row.items_created,\n itemsUpdated: row.items_updated,\n warnings: parseStrings(row.warnings_json),\n ...(row.error ? { error: row.error } : {}),\n startedAt: new Date(row.started_at).toISOString(),\n ...(timestampToIso(row.finished_at) ? { finishedAt: timestampToIso(row.finished_at) } : {}),\n };\n}\n\nexport function startKnowledgeSyncRun(input: {\n sourceInstanceId: string;\n cursorBefore?: string;\n nowMs?: number;\n}): KnowledgeSyncRun {\n const id = randomUUID();\n const now = input.nowMs ?? Date.now();\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO knowledge_sync_runs (\n run_id, source_instance_id, status, cursor_before, started_at\n ) VALUES (?, ?, 'running', ?, ?)`,\n ).run(id, input.sourceInstanceId, input.cursorBefore ?? null, now);\n });\n return {\n id,\n sourceInstanceId: input.sourceInstanceId,\n status: 'running',\n ...(input.cursorBefore ? { cursorBefore: input.cursorBefore } : {}),\n itemsSeen: 0,\n itemsCreated: 0,\n itemsUpdated: 0,\n warnings: [],\n startedAt: new Date(now).toISOString(),\n };\n}\n\nexport function finishKnowledgeSyncRun(input: {\n runId: string;\n status: Exclude<KnowledgeSyncRunStatus, 'running'>;\n cursorAfter?: string;\n itemsSeen?: number;\n itemsCreated?: number;\n itemsUpdated?: number;\n warnings?: string[];\n error?: string;\n nowMs?: number;\n}): KnowledgeSyncRun {\n const now = input.nowMs ?? Date.now();\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `UPDATE knowledge_sync_runs SET\n status = ?, cursor_after = ?, items_seen = ?, items_created = ?,\n items_updated = ?, warnings_json = ?, error = ?, finished_at = ?\n WHERE run_id = ?`,\n ).run(\n input.status,\n input.cursorAfter ?? null,\n input.itemsSeen ?? 0,\n input.itemsCreated ?? 0,\n input.itemsUpdated ?? 0,\n JSON.stringify(input.warnings ?? []),\n input.error ?? null,\n now,\n input.runId,\n );\n });\n const row = getSqliteDatabase()\n .prepare(`SELECT * FROM knowledge_sync_runs WHERE run_id = ?`)\n .get(input.runId) as KnowledgeSyncRunRow | undefined;\n if (!row) throw new Error(`Knowledge sync run not found: ${input.runId}`);\n return syncRunFromRow(row);\n}\n\nexport function listKnowledgeSyncRuns(options: {\n sourceInstanceId?: string;\n status?: KnowledgeSyncRunStatus;\n limit?: number;\n} = {}): KnowledgeSyncRun[] {\n const where: string[] = [];\n const params: Array<string | number> = [];\n if (options.sourceInstanceId) {\n where.push('source_instance_id = ?');\n params.push(options.sourceInstanceId);\n }\n if (options.status) {\n where.push('status = ?');\n params.push(options.status);\n }\n const limit = Math.max(1, Math.min(500, options.limit ?? 100));\n const rows = getSqliteDatabase()\n .prepare(\n `SELECT * FROM knowledge_sync_runs\n ${where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''}\n ORDER BY started_at DESC LIMIT ?`,\n )\n .all(...params, limit) as KnowledgeSyncRunRow[];\n return rows.map(syncRunFromRow);\n}\n\nexport function getKnowledgeSourceCursor(sourceInstanceId: string): string | undefined {\n const row = getSqliteDatabase()\n .prepare(`SELECT cursor FROM knowledge_source_state WHERE source_instance_id = ?`)\n .get(sourceInstanceId) as { cursor: string | null } | undefined;\n return row?.cursor ?? undefined;\n}\n\nexport function setKnowledgeSourceCursor(sourceInstanceId: string, cursor: string | undefined): void {\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO knowledge_source_state (source_instance_id, cursor, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT(source_instance_id) DO UPDATE SET\n cursor = excluded.cursor,\n updated_at = excluded.updated_at`,\n ).run(sourceInstanceId, cursor ?? null, Date.now());\n });\n}\n\nexport function upsertKnowledgeSourceItems(\n inputs: KnowledgeSourceItemInput[],\n nowMs = Date.now(),\n): { items: KnowledgeSourceItem[]; created: number; updated: number; unchanged: number } {\n return runSqliteWriteTransaction((db) => {\n const items: KnowledgeSourceItem[] = [];\n let created = 0;\n let updated = 0;\n let unchanged = 0;\n for (const input of inputs) {\n const existing = db.prepare(\n `SELECT * FROM knowledge_source_items\n WHERE source_instance_id = ? AND external_id = ?`,\n ).get(input.sourceInstanceId, input.externalId) as KnowledgeSourceItemRow | undefined;\n const id = existing?.item_id ?? input.id ?? randomUUID();\n if (existing?.content_hash === input.contentHash && existing.deleted_at === parseTimestamp(input.deletedAt)) {\n unchanged += 1;\n items.push(sourceItemFromRow(existing));\n continue;\n }\n db.prepare(\n `INSERT INTO knowledge_source_items (\n item_id, source_instance_id, external_id, item_type, author_role,\n occurred_at, source_updated_at, content_hash, normalized_text,\n payload_ref, metadata_json, sensitivity, retention_class,\n synthesis_status, deleted_at, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(source_instance_id, external_id) DO UPDATE SET\n item_type = excluded.item_type,\n author_role = excluded.author_role,\n occurred_at = excluded.occurred_at,\n source_updated_at = excluded.source_updated_at,\n content_hash = excluded.content_hash,\n normalized_text = excluded.normalized_text,\n payload_ref = excluded.payload_ref,\n metadata_json = excluded.metadata_json,\n sensitivity = excluded.sensitivity,\n retention_class = excluded.retention_class,\n synthesis_status = excluded.synthesis_status,\n deleted_at = excluded.deleted_at,\n updated_at = excluded.updated_at`,\n ).run(\n id,\n input.sourceInstanceId,\n input.externalId,\n input.itemType,\n input.authorRole ?? null,\n parseTimestamp(input.occurredAt),\n parseTimestamp(input.sourceUpdatedAt),\n input.contentHash,\n input.normalizedText ?? null,\n input.payloadRef ?? null,\n JSON.stringify(input.metadata ?? {}),\n input.sensitivity ?? 'normal',\n input.retentionClass ?? 'bounded',\n input.synthesisStatus ?? 'pending',\n parseTimestamp(input.deletedAt),\n existing?.created_at ?? nowMs,\n nowMs,\n );\n const row = db.prepare(`SELECT * FROM knowledge_source_items WHERE item_id = ?`).get(id) as KnowledgeSourceItemRow;\n items.push(sourceItemFromRow(row));\n if (existing) updated += 1;\n else created += 1;\n }\n return { items, created, updated, unchanged };\n });\n}\n\nexport function getKnowledgeSourceItem(itemId: string): KnowledgeSourceItem | null {\n const row = getSqliteDatabase()\n .prepare(`SELECT * FROM knowledge_source_items WHERE item_id = ?`)\n .get(itemId) as KnowledgeSourceItemRow | undefined;\n return row ? sourceItemFromRow(row) : null;\n}\n\nexport function listKnowledgeSourceItems(options: {\n sourceInstanceId?: string;\n synthesisStatus?: KnowledgeSynthesisStatus;\n includeDeleted?: boolean;\n limit?: number;\n offset?: number;\n} = {}): KnowledgeSourceItem[] {\n const where: string[] = [];\n const params: Array<string | number> = [];\n if (options.sourceInstanceId) {\n where.push('source_instance_id = ?');\n params.push(options.sourceInstanceId);\n }\n if (options.synthesisStatus) {\n where.push('synthesis_status = ?');\n params.push(options.synthesisStatus);\n }\n if (!options.includeDeleted) where.push('deleted_at IS NULL');\n const limit = Math.max(1, Math.min(500, options.limit ?? 100));\n const offset = Math.max(0, options.offset ?? 0);\n const rows = getSqliteDatabase()\n .prepare(\n `SELECT * FROM knowledge_source_items\n ${where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''}\n ORDER BY COALESCE(source_updated_at, occurred_at, updated_at) DESC\n LIMIT ? OFFSET ?`,\n )\n .all(...params, limit, offset) as KnowledgeSourceItemRow[];\n return rows.map(sourceItemFromRow);\n}\n\nexport function setKnowledgeSourceItemSynthesisStatus(\n itemIds: string[],\n status: KnowledgeSynthesisStatus,\n nowMs = Date.now(),\n): number {\n if (itemIds.length === 0) return 0;\n return runSqliteWriteTransaction((db) => {\n const placeholders = itemIds.map(() => '?').join(', ');\n const result = db.prepare(\n `UPDATE knowledge_source_items SET synthesis_status = ?, updated_at = ?\n WHERE item_id IN (${placeholders})`,\n ).run(status, nowMs, ...itemIds);\n return Number(result.changes);\n });\n}\n\nexport function attachMemoryEvidence(input: {\n recordId: string;\n sourceItemId?: string;\n relation?: MemoryEvidenceRelation;\n excerpt?: string;\n confidence?: number;\n observedAt?: string;\n nowMs?: number;\n}): MemoryEvidence {\n const evidenceId = randomUUID();\n const now = input.nowMs ?? Date.now();\n const observedAt = parseTimestamp(input.observedAt);\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO memory_evidence (\n evidence_id, record_id, source_item_id, relation, excerpt,\n confidence, observed_at, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n evidenceId,\n input.recordId,\n input.sourceItemId ?? null,\n input.relation ?? 'supports',\n input.excerpt ?? null,\n input.confidence ?? null,\n observedAt,\n now,\n );\n });\n return {\n evidenceId,\n ...(input.sourceItemId ? { sourceItemId: input.sourceItemId } : {}),\n relation: input.relation ?? 'supports',\n ...(input.excerpt ? { sourceText: input.excerpt } : {}),\n ...(input.confidence != null ? { confidence: input.confidence } : {}),\n ...(observedAt != null ? { observedAt: new Date(observedAt).toISOString() } : {}),\n };\n}\n\nexport function listMemoryEvidence(recordId: string): MemoryEvidence[] {\n const rows = getSqliteDatabase()\n .prepare(`SELECT * FROM memory_evidence WHERE record_id = ? ORDER BY created_at ASC`)\n .all(recordId) as MemoryEvidenceRow[];\n return rows.map((row) => ({\n evidenceId: row.evidence_id,\n ...(row.source_item_id ? { sourceItemId: row.source_item_id } : {}),\n relation: row.relation as MemoryEvidenceRelation,\n ...(row.excerpt ? { sourceText: row.excerpt } : {}),\n ...(row.confidence != null ? { confidence: row.confidence } : {}),\n ...(timestampToIso(row.observed_at) ? { observedAt: timestampToIso(row.observed_at) } : {}),\n }));\n}\n"],"mappings":"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"}