@xopcai/xopc 0.0.144 → 0.0.145

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 (353) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  3. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
  4. package/dist/extensions/telegram/src/inbound-processor.js +1 -1
  5. package/dist/extensions/telegram/src/plugin.js +1 -1
  6. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  7. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  8. package/dist/extensions/telegram/xopc.extension.json +1 -1
  9. package/dist/extensions/weixin/src/api/api.js +1 -1
  10. package/dist/extensions/weixin/src/plugin.js +1 -1
  11. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  12. package/dist/gateway/static/root/assets/Combination-DolwnuKi.js +41 -0
  13. package/dist/gateway/static/root/assets/{activity-center-store-jITiX2vJ.js → activity-center-store-3l9ahUqb.js} +1 -1
  14. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-EAVnrCAs.js → agent-avatar-dicebear-BEUxdhZx.js} +1 -1
  15. package/dist/gateway/static/root/assets/agents-1bpT0xRO.js +2 -0
  16. package/dist/gateway/static/root/assets/app-management-settings-panel-CRHSZJWi.js +1 -0
  17. package/dist/gateway/static/root/assets/{appearance-settings-DSkm9bp_.js → appearance-settings-BunADYJb.js} +1 -1
  18. package/dist/gateway/static/root/assets/apps-page-Cc4JgVUQ.js +1 -0
  19. package/dist/gateway/static/root/assets/{archive-plugin-C99N0vV6.js → archive-plugin-B6vTkH2A.js} +1 -1
  20. package/dist/gateway/static/root/assets/{attachment-load-CHTDqME5.js → attachment-load-BjZXzaNv.js} +1 -1
  21. package/dist/gateway/static/root/assets/{automation-suggestion-card-CBt6U3-S.js → automation-suggestion-card-ZDA-Stg1.js} +1 -1
  22. package/dist/gateway/static/root/assets/automations-page-mb0fdVpq.js +6 -0
  23. package/dist/gateway/static/root/assets/{binary-plugins-BRtxOLlM.js → binary-plugins-DYZfLvPz.js} +1 -1
  24. package/dist/gateway/static/root/assets/{block-editor-CUlXfgXd.js → block-editor-C3MUlYC9.js} +46 -46
  25. package/dist/gateway/static/root/assets/browser-settings-page-Bb0xhaMN.js +8 -0
  26. package/dist/gateway/static/root/assets/capability-presets-api-BV76yN9a.js +1 -0
  27. package/dist/gateway/static/root/assets/capability-presets-settings-panel-CUcGKZqC.js +2 -0
  28. package/dist/gateway/static/root/assets/channel-recipient-api-fTlTnWB4.js +1 -0
  29. package/dist/gateway/static/root/assets/channels-settings-BlSDMGdy.js +1 -0
  30. package/dist/gateway/static/root/assets/channels-status-swr-CJauF1CW.js +1 -0
  31. package/dist/gateway/static/root/assets/{code-editor--tMO38Tr.js → code-editor-D4_k-6QN.js} +1 -1
  32. package/dist/gateway/static/root/assets/connector-logo-BVFNT2zW.js +1 -0
  33. package/dist/gateway/static/root/assets/connectors-page-CMgAFGvb.js +2 -0
  34. package/dist/gateway/static/root/assets/copy-to-clipboard-HOJ79TWv.js +1 -0
  35. package/dist/gateway/static/root/assets/{desktop-pet-C-Drhqyk.js → desktop-pet-_jUmoXd3.js} +1 -1
  36. package/dist/gateway/static/root/assets/{desktop-pet-settings-CRGiolqF.js → desktop-pet-settings-DwGOy4AQ.js} +1 -1
  37. package/dist/gateway/static/root/assets/{directory-picker-path-field-Dw1L3M84.js → directory-picker-path-field-akvF0F-u.js} +1 -1
  38. package/dist/gateway/static/root/assets/{dist-SwiI0Xu3.js → dist-C99RGfAH.js} +1 -1
  39. package/dist/gateway/static/root/assets/dreaming-settings-BLetQiYY.js +3 -0
  40. package/dist/gateway/static/root/assets/{extension-debug-page-Dcl8LJG_.js → extension-debug-page-Cof2ncxE.js} +1 -1
  41. package/dist/gateway/static/root/assets/{extension-page-i_BXmO_x.js → extension-page-CwWktRNz.js} +1 -1
  42. package/dist/gateway/static/root/assets/extension-settings-page-CuggWOIl.js +1 -0
  43. package/dist/gateway/static/root/assets/gateway-config-api-B7sxIbza.js +1 -0
  44. package/dist/gateway/static/root/assets/gateway-settings-DIv0eKMf.js +1 -0
  45. package/dist/gateway/static/root/assets/gateway-startup-retry-DtoLihQE.js +1 -0
  46. package/dist/gateway/static/root/assets/goal-create-dialog-C4Kw0mfS.js +1 -0
  47. package/dist/gateway/static/root/assets/goal-detail-page-BMmzYpZL.js +4 -0
  48. package/dist/gateway/static/root/assets/goals-config-api-B0jm5JaA.js +1 -0
  49. package/dist/gateway/static/root/assets/goals-page-CGeT77PC.js +2 -0
  50. package/dist/gateway/static/root/assets/goals-settings-N5_iL7es.js +1 -0
  51. package/dist/gateway/static/root/assets/heartbeat-settings-XzH3lbRR.js +1 -0
  52. package/dist/gateway/static/root/assets/{html-workspace-editor-COqmtESs.js → html-workspace-editor-C3DKAkMc.js} +1 -1
  53. package/dist/gateway/static/root/assets/index-CSLF84-Q.css +1 -0
  54. package/dist/gateway/static/root/assets/index-I-ZCenVw.js +259 -0
  55. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-x_v0nrIi.js +1 -0
  56. package/dist/gateway/static/root/assets/locale-store-CiM-D9jA.js +1 -0
  57. package/dist/gateway/static/root/assets/logs-page-BSh1t8cD.js +7 -0
  58. package/dist/gateway/static/root/assets/markdown-editor-BvUebh3C.js +2 -0
  59. package/dist/gateway/static/root/assets/{markdown-split-BTRFTK0w.js → markdown-split-5rJx5flj.js} +1 -1
  60. package/dist/gateway/static/root/assets/{media-plugins-BABfIZPU.js → media-plugins-DYXccwAd.js} +1 -1
  61. package/dist/gateway/static/root/assets/messages-Cb1VMeqP.js +5 -0
  62. package/dist/gateway/static/root/assets/models-hub-panel-BNpTenAI.js +2 -0
  63. package/dist/gateway/static/root/assets/{notes-page-88QBHW9a.js → notes-page-BgLyndCO.js} +1 -1
  64. package/dist/gateway/static/root/assets/notes-workbench-teklkhcE.js +4 -0
  65. package/dist/gateway/static/root/assets/{page-tabs-je95DZOf.js → page-tabs-6Al9_sGz.js} +1 -1
  66. package/dist/gateway/static/root/assets/{preview-open-alternatives-BJbwi7Rc.js → preview-open-alternatives-Cm3G72Hv.js} +1 -1
  67. package/dist/gateway/static/root/assets/project-detail-page-CCB_dKoh.js +1 -0
  68. package/dist/gateway/static/root/assets/projects-page-VOAFAHYj.js +1 -0
  69. package/dist/gateway/static/root/assets/remote-access-hub-USYu64Ru.js +1 -0
  70. package/dist/gateway/static/root/assets/{save-bar-controls-qWMQ9mod.js → save-bar-controls-BYtfzu_F.js} +1 -1
  71. package/dist/gateway/static/root/assets/{schedule-field-kxd270Gs.js → schedule-field-CvIRc6yK.js} +1 -1
  72. package/dist/gateway/static/root/assets/{schema-form-DLnD-MuD.js → schema-form-CQuKx0n7.js} +1 -1
  73. package/dist/gateway/static/root/assets/sessions-page-oGC8O5h_.js +1 -0
  74. package/dist/gateway/static/root/assets/settings-advanced-gate-D4rP66R1.js +1 -0
  75. package/dist/gateway/static/root/assets/{settings-collapsible-section-DQprvu5J.js → settings-collapsible-section-CF3HHM-t.js} +1 -1
  76. package/dist/gateway/static/root/assets/{settings-form-section-Cqq7Y98y.js → settings-form-section-CwWjoRN6.js} +1 -1
  77. package/dist/gateway/static/root/assets/{settings-loading-skeleton-b6rXULL5.js → settings-loading-skeleton-aUFmJa13.js} +1 -1
  78. package/dist/gateway/static/root/assets/{settings-page-BtBVz3cX.js → settings-page-B2UUU9TF.js} +1 -1
  79. package/dist/gateway/static/root/assets/{settings-page-layout-BNJbtklV.js → settings-page-layout-DqpbTWqI.js} +1 -1
  80. package/dist/gateway/static/root/assets/setup-status-panel-Ck9keROI.js +1 -0
  81. package/dist/gateway/static/root/assets/share-preview-page-BOhlPsS1.js +2 -0
  82. package/dist/gateway/static/root/assets/shares-settings-BYLsCuqj.js +1 -0
  83. package/dist/gateway/static/root/assets/skill-reload-api-BNHUyVML.js +1 -0
  84. package/dist/gateway/static/root/assets/skills-page-CpXbQH4n.js +2 -0
  85. package/dist/gateway/static/root/assets/{system-settings-panel-Cq9J7i7v.js → system-settings-panel-CWxSvuwD.js} +1 -1
  86. package/dist/gateway/static/root/assets/{theme-store-Bt6vAkSB.js → theme-store-C9Dxcppm.js} +1 -1
  87. package/dist/gateway/static/root/assets/{typed-models-lib-CdSwi1gT.js → typed-models-lib-qROAvqTw.js} +1 -1
  88. package/dist/gateway/static/root/assets/use-channel-catalog-DE9cpn4G.js +1 -0
  89. package/dist/gateway/static/root/assets/user-context-page-DbNEK4Yp.js +1 -0
  90. package/dist/gateway/static/root/assets/user-profile-fields-editor-CWxc0ghP.js +1 -0
  91. package/dist/gateway/static/root/assets/{user-profile-settings-panel-B8hlamVB.js → user-profile-settings-panel-DW-Up6vt.js} +1 -1
  92. package/dist/gateway/static/root/assets/{utils-Dx01V8qF.js → utils-D53uRXVr.js} +1 -1
  93. package/dist/gateway/static/root/assets/{vendor-codemirror-C1WKjCk5.js → vendor-codemirror--gTq3YAI.js} +17 -17
  94. package/dist/gateway/static/root/assets/voice-api-key-field-Cs7MOrg0.js +1 -0
  95. package/dist/gateway/static/root/assets/work-item-detail-page-D1ziG1Pp.js +1 -0
  96. package/dist/gateway/static/root/assets/workflow-run-setup-panel-D_x9ELJp.js +3 -0
  97. package/dist/gateway/static/root/assets/workflows-page-DHGV_n6i.js +11 -0
  98. package/dist/gateway/static/root/index.html +10 -10
  99. package/dist/package.js +1 -1
  100. package/dist/src/activity/emitter.js +1 -1
  101. package/dist/src/agent/agent-manager.js +4 -4
  102. package/dist/src/agent/code-intelligence/binary.js +1 -1
  103. package/dist/src/agent/context/project-context.js +2 -2
  104. package/dist/src/agent/context/workspace-seed.js +2 -2
  105. package/dist/src/agent/embedded/run-for-session.js +1 -1
  106. package/dist/src/agent/embedded/session-runner.js +3 -3
  107. package/dist/src/agent/embedded/session-runner.js.map +1 -1
  108. package/dist/src/agent/embedded/xopc-auth-storage.d.ts +3 -1
  109. package/dist/src/agent/embedded/xopc-auth-storage.js +11 -1
  110. package/dist/src/agent/embedded/xopc-auth-storage.js.map +1 -1
  111. package/dist/src/agent/goals/post-turn.js +2 -2
  112. package/dist/src/agent/ipc/bus.js +1 -1
  113. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  114. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  115. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  116. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  117. package/dist/src/agent/memory/dreaming/config.js +1 -1
  118. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  119. package/dist/src/agent/models/manager.js +1 -1
  120. package/dist/src/agent/orchestration/agent-orchestrator.js +1 -1
  121. package/dist/src/agent/service.js +3 -3
  122. package/dist/src/agent/session/session-inspector.js +2 -2
  123. package/dist/src/agent/skills/hub-pull.js +1 -1
  124. package/dist/src/agent/tools/composio-tool.js +1 -1
  125. package/dist/src/agent/tools/goal-tool.js +2 -2
  126. package/dist/src/agent/tools/workflow-tool.js +1 -1
  127. package/dist/src/agent/tools/xopc-use-tool.js +1 -1
  128. package/dist/src/agent/workspace-runtime/registry.js +2 -2
  129. package/dist/src/agent-runtime/index.js +1 -1
  130. package/dist/src/agent-runtime/runtime-profile.js +1 -1
  131. package/dist/src/automations/api/routes.js +1 -1
  132. package/dist/src/automations/service/action-executor.js +2 -2
  133. package/dist/src/browser/cdp-local-launcher.js +1 -1
  134. package/dist/src/browser/providers/browser-ext-install.js +3 -3
  135. package/dist/src/browser/providers/cloakbrowser.js +2 -2
  136. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  137. package/dist/src/browser/stealth.js +1 -1
  138. package/dist/src/capabilities/store-connector.js +1 -1
  139. package/dist/src/chat-commands/agent-edit.js +1 -1
  140. package/dist/src/chat-commands/builtins/config.js +1 -1
  141. package/dist/src/chat-commands/builtins/goal.js +2 -2
  142. package/dist/src/chat-commands/context.js +1 -1
  143. package/dist/src/cli/commands/agent.js +1 -1
  144. package/dist/src/cli/commands/doctor/checks/database-schema.js +2 -2
  145. package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
  146. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  147. package/dist/src/cli/commands/extension-pack.js +1 -1
  148. package/dist/src/cli/commands/goal.js +2 -2
  149. package/dist/src/cli/commands/init.js +1 -1
  150. package/dist/src/cli/commands/project.js +3 -3
  151. package/dist/src/config/agent-profile.js +1 -1
  152. package/dist/src/config/gateway-bind.js +1 -1
  153. package/dist/src/config/index.js +3 -3
  154. package/dist/src/config/loader.js +1 -1
  155. package/dist/src/config/models-json.js +1 -1
  156. package/dist/src/config/schema.d.ts +60 -5
  157. package/dist/src/config/schema.js +30 -9
  158. package/dist/src/config/schema.js.map +1 -1
  159. package/dist/src/connectors/composio-catalog.js +11 -2
  160. package/dist/src/connectors/composio-catalog.js.map +1 -1
  161. package/dist/src/connectors/composio-sessions.js +1 -1
  162. package/dist/src/connectors/composio.js +1 -1
  163. package/dist/src/connectors/connector-memory-sync.js +135 -26
  164. package/dist/src/connectors/connector-memory-sync.js.map +1 -1
  165. package/dist/src/daemon/launchd.js +1 -1
  166. package/dist/src/daemon/systemd.js +1 -1
  167. package/dist/src/extensions/discover-extensions.js +1 -1
  168. package/dist/src/extensions/loader.js +2 -2
  169. package/dist/src/gateway/agents-admin.js +1 -1
  170. package/dist/src/gateway/heartbeat/service.js +1 -1
  171. package/dist/src/gateway/hono/app.js +1 -1
  172. package/dist/src/gateway/hono/app.js.map +1 -1
  173. package/dist/src/gateway/hono/lib/config-payload.d.ts +11 -0
  174. package/dist/src/gateway/hono/lib/config-payload.js +1 -0
  175. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  176. package/dist/src/gateway/hono/lib/static-ui.js +1 -1
  177. package/dist/src/gateway/hono/routes/config-patch/misc.js +6 -1
  178. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
  179. package/dist/src/gateway/hono/routes/home.js +2 -2
  180. package/dist/src/gateway/hono/routes/memory.js +13 -3
  181. package/dist/src/gateway/hono/routes/memory.js.map +1 -1
  182. package/dist/src/gateway/hono/routes/projects.js +5 -5
  183. package/dist/src/gateway/hono/routes/status.js +3 -0
  184. package/dist/src/gateway/hono/routes/status.js.map +1 -1
  185. package/dist/src/gateway/hono/routes/voice.d.ts +5 -5
  186. package/dist/src/gateway/hono/routes/voice.js +288 -62
  187. package/dist/src/gateway/hono/routes/voice.js.map +1 -1
  188. package/dist/src/gateway/hono/routes/workflows.js +1 -1
  189. package/dist/src/gateway/hono/routes/you.js +11 -7
  190. package/dist/src/gateway/hono/routes/you.js.map +1 -1
  191. package/dist/src/gateway/lock.js +1 -1
  192. package/dist/src/gateway/ports.js +1 -1
  193. package/dist/src/gateway/service.d.ts +8 -0
  194. package/dist/src/gateway/service.js +47 -17
  195. package/dist/src/gateway/service.js.map +1 -1
  196. package/dist/src/goals/goal-workflow-judge.js +1 -1
  197. package/dist/src/heartbeat/index.js +1 -1
  198. package/dist/src/infra/ports.js +1 -1
  199. package/dist/src/infra/ssh-tunnel.js +1 -1
  200. package/dist/src/infra/update-check.js +1 -1
  201. package/dist/src/knowledge/connected-knowledge-pipeline.d.ts +21 -0
  202. package/dist/src/knowledge/connected-knowledge-pipeline.js +267 -0
  203. package/dist/src/knowledge/connected-knowledge-pipeline.js.map +1 -0
  204. package/dist/src/knowledge/coordinator.d.ts +10 -0
  205. package/dist/src/knowledge/coordinator.js +52 -0
  206. package/dist/src/knowledge/coordinator.js.map +1 -0
  207. package/dist/src/knowledge/index.d.ts +2 -0
  208. package/dist/src/knowledge/index.js +3 -1
  209. package/dist/src/knowledge/ingestion-service.d.ts +7 -1
  210. package/dist/src/knowledge/ingestion-service.js +28 -0
  211. package/dist/src/knowledge/ingestion-service.js.map +1 -1
  212. package/dist/src/knowledge/types.d.ts +18 -0
  213. package/dist/src/media-understanding/audio-transcription-runner.js +5 -3
  214. package/dist/src/media-understanding/audio-transcription-runner.js.map +1 -1
  215. package/dist/src/media-understanding/runner.js +8 -3
  216. package/dist/src/media-understanding/runner.js.map +1 -1
  217. package/dist/src/media-understanding/types.d.ts +7 -0
  218. package/dist/src/migrations/runner.js +1 -1
  219. package/dist/src/notes/service.js +3 -3
  220. package/dist/src/notes/store.js +1 -1
  221. package/dist/src/projects/project-service.js +1 -1
  222. package/dist/src/projects/workspace.js +1 -1
  223. package/dist/src/routing/agent-session-key.js +1 -1
  224. package/dist/src/routing/resolve-route.js +1 -1
  225. package/dist/src/routing/resolve-tui-session-key.js +1 -1
  226. package/dist/src/session/init-session-turn.js +1 -1
  227. package/dist/src/session/resolve-session.js +1 -1
  228. package/dist/src/session/session-title.js +2 -2
  229. package/dist/src/session/store.js +1 -1
  230. package/dist/src/storage/sqlite/connection.js +1 -1
  231. package/dist/src/storage/sqlite/index.d.ts +1 -1
  232. package/dist/src/storage/sqlite/index.js +2 -2
  233. package/dist/src/storage/sqlite/knowledge-repository.d.ts +26 -1
  234. package/dist/src/storage/sqlite/knowledge-repository.js +120 -6
  235. package/dist/src/storage/sqlite/knowledge-repository.js.map +1 -1
  236. package/dist/src/storage/sqlite/migrations/037_connected_knowledge_pipeline.sql +47 -0
  237. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  238. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  239. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  240. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  241. package/dist/src/storage/sqlite/row-mappers.js +1 -1
  242. package/dist/src/storage/sqlite/schema.js +1 -1
  243. package/dist/src/tui/backends/embedded-backend.js +4 -4
  244. package/dist/src/tui/clipboard-image.js +1 -1
  245. package/dist/src/tui/tui-command-formatters.js +2 -2
  246. package/dist/src/tui/tui-commands.js +3 -3
  247. package/dist/src/tui/tui.js +1 -1
  248. package/dist/src/user-context/projection.d.ts +13 -4
  249. package/dist/src/user-context/projection.js +19 -7
  250. package/dist/src/user-context/projection.js.map +1 -1
  251. package/dist/src/utils/index.js +1 -1
  252. package/dist/src/utils/logger/index.js +1 -1
  253. package/dist/src/utils/logger.js +1 -1
  254. package/dist/src/voice/language-profile.d.ts +20 -0
  255. package/dist/src/voice/language-profile.js +156 -0
  256. package/dist/src/voice/language-profile.js.map +1 -0
  257. package/dist/src/voice/local/model-files.d.ts +14 -0
  258. package/dist/src/voice/local/model-files.js +94 -0
  259. package/dist/src/voice/local/model-files.js.map +1 -0
  260. package/dist/src/voice/local/model-manager.d.ts +18 -0
  261. package/dist/src/voice/local/model-manager.js +135 -0
  262. package/dist/src/voice/local/model-manager.js.map +1 -0
  263. package/dist/src/voice/local/models.d.ts +28 -0
  264. package/dist/src/voice/local/models.js +101 -0
  265. package/dist/src/voice/local/models.js.map +1 -0
  266. package/dist/src/voice/local/runtime-client.d.ts +26 -0
  267. package/dist/src/voice/local/runtime-client.js +166 -0
  268. package/dist/src/voice/local/runtime-client.js.map +1 -0
  269. package/dist/src/voice/local/runtime-dispatcher.d.ts +9 -0
  270. package/dist/src/voice/local/runtime-dispatcher.js +22 -0
  271. package/dist/src/voice/local/runtime-dispatcher.js.map +1 -0
  272. package/dist/src/voice/local/runtime-worker.d.ts +1 -0
  273. package/dist/src/voice/local/runtime-worker.js +249 -0
  274. package/dist/src/voice/local/runtime-worker.js.map +1 -0
  275. package/dist/src/voice/local/wav.d.ts +6 -0
  276. package/dist/src/voice/local/wav.js +69 -0
  277. package/dist/src/voice/local/wav.js.map +1 -0
  278. package/dist/src/voice/metadata/builtin.js +46 -0
  279. package/dist/src/voice/metadata/builtin.js.map +1 -1
  280. package/dist/src/voice/stt/factory.js +8 -2
  281. package/dist/src/voice/stt/factory.js.map +1 -1
  282. package/dist/src/voice/stt/providers/alibaba-transcription.js +14 -8
  283. package/dist/src/voice/stt/providers/alibaba-transcription.js.map +1 -1
  284. package/dist/src/voice/stt/providers/index.d.ts +1 -0
  285. package/dist/src/voice/stt/providers/index.js +2 -1
  286. package/dist/src/voice/stt/providers/local-transcription.d.ts +2 -0
  287. package/dist/src/voice/stt/providers/local-transcription.js +51 -0
  288. package/dist/src/voice/stt/providers/local-transcription.js.map +1 -0
  289. package/dist/src/voice/stt/providers/openai-transcription.js +5 -3
  290. package/dist/src/voice/stt/providers/openai-transcription.js.map +1 -1
  291. package/dist/src/voice/stt/transcribe-core.js +5 -4
  292. package/dist/src/voice/stt/transcribe-core.js.map +1 -1
  293. package/dist/src/voice/stt/types.d.ts +4 -0
  294. package/dist/src/voice/stt/types.js +5 -4
  295. package/dist/src/voice/stt/types.js.map +1 -1
  296. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  297. package/dist/src/voice/tts/providers/edge-speech.js.map +1 -1
  298. package/dist/src/voice/tts/types.js +3 -3
  299. package/dist/src/voice/tts/types.js.map +1 -1
  300. package/dist/src/work-items/work-item-service.js +1 -1
  301. package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
  302. package/dist/src/workflows/service/workflow-session-bridge.js +3 -3
  303. package/package.json +3 -1
  304. package/dist/gateway/static/root/assets/Combination-HAlzriaz.js +0 -41
  305. package/dist/gateway/static/root/assets/agents-5rTuJOtT.js +0 -2
  306. package/dist/gateway/static/root/assets/app-management-settings-panel-Bu568NpC.js +0 -1
  307. package/dist/gateway/static/root/assets/apps-page-DWetalKp.js +0 -1
  308. package/dist/gateway/static/root/assets/automations-page-ICUfxeOz.js +0 -4
  309. package/dist/gateway/static/root/assets/browser-settings-page-D7Bj4MKi.js +0 -8
  310. package/dist/gateway/static/root/assets/capability-presets-api-Bg1ntFSD.js +0 -1
  311. package/dist/gateway/static/root/assets/capability-presets-settings-panel-C-8I-Ktn.js +0 -2
  312. package/dist/gateway/static/root/assets/channel-recipient-api-DuulnhIj.js +0 -1
  313. package/dist/gateway/static/root/assets/channels-settings-Dm5EqQyK.js +0 -1
  314. package/dist/gateway/static/root/assets/channels-status-swr-B5lVrUsN.js +0 -1
  315. package/dist/gateway/static/root/assets/connectors-page-BOzjh-OK.js +0 -2
  316. package/dist/gateway/static/root/assets/dreaming-settings-CF21cbjo.js +0 -3
  317. package/dist/gateway/static/root/assets/extension-settings-page-CWIi7xsn.js +0 -1
  318. package/dist/gateway/static/root/assets/fetch-8QNN25Sh.js +0 -1
  319. package/dist/gateway/static/root/assets/gateway-config-api-2sLP2kkA.js +0 -1
  320. package/dist/gateway/static/root/assets/gateway-settings-DMHiZc-2.js +0 -1
  321. package/dist/gateway/static/root/assets/gateway-startup-retry-5YBnS9Fj.js +0 -1
  322. package/dist/gateway/static/root/assets/goal-create-dialog-CAODVDiA.js +0 -1
  323. package/dist/gateway/static/root/assets/goal-detail-page-_d4DjmeX.js +0 -4
  324. package/dist/gateway/static/root/assets/goals-config-api-B4qeLKQS.js +0 -1
  325. package/dist/gateway/static/root/assets/goals-page-lgsop664.js +0 -2
  326. package/dist/gateway/static/root/assets/goals-settings-Dx_1ZNgb.js +0 -1
  327. package/dist/gateway/static/root/assets/heartbeat-settings-DeTseEk_.js +0 -1
  328. package/dist/gateway/static/root/assets/index-CphxClbs.css +0 -1
  329. package/dist/gateway/static/root/assets/index-VWvztcst.js +0 -257
  330. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-BpwpMmlk.js +0 -1
  331. package/dist/gateway/static/root/assets/locale-store-Ba72bFmP.js +0 -1
  332. package/dist/gateway/static/root/assets/logs-page-9_hbTg3j.js +0 -7
  333. package/dist/gateway/static/root/assets/markdown-editor-jD1LPiP-.js +0 -2
  334. package/dist/gateway/static/root/assets/messages-CzKxM6I4.js +0 -5
  335. package/dist/gateway/static/root/assets/models-hub-panel-B1CUvZxh.js +0 -2
  336. package/dist/gateway/static/root/assets/notes-workbench-CerZOeLW.js +0 -2
  337. package/dist/gateway/static/root/assets/project-detail-page-BmrApldl.js +0 -1
  338. package/dist/gateway/static/root/assets/projects-page-tTn-k76N.js +0 -1
  339. package/dist/gateway/static/root/assets/remote-access-hub-DeA2-pOi.js +0 -1
  340. package/dist/gateway/static/root/assets/sessions-page-D4kvvcL1.js +0 -1
  341. package/dist/gateway/static/root/assets/settings-advanced-gate-CI1OG4gq.js +0 -1
  342. package/dist/gateway/static/root/assets/setup-status-panel-cmclUJzS.js +0 -1
  343. package/dist/gateway/static/root/assets/share-preview-page--zO-A1W1.js +0 -2
  344. package/dist/gateway/static/root/assets/shares-settings-DNJvqA67.js +0 -1
  345. package/dist/gateway/static/root/assets/skill-reload-api-DWr_0Xgn.js +0 -1
  346. package/dist/gateway/static/root/assets/skills-page-DEGsTbJx.js +0 -2
  347. package/dist/gateway/static/root/assets/use-channel-catalog-COXIfXcl.js +0 -1
  348. package/dist/gateway/static/root/assets/user-context-page-C-V73ZaJ.js +0 -1
  349. package/dist/gateway/static/root/assets/user-profile-fields-editor-B1cxoGkh.js +0 -1
  350. package/dist/gateway/static/root/assets/voice-api-key-field-DGpIUelZ.js +0 -1
  351. package/dist/gateway/static/root/assets/work-item-detail-page-fzWTxF26.js +0 -1
  352. package/dist/gateway/static/root/assets/workflow-run-setup-panel-Dt_x8LGg.js +0 -3
  353. package/dist/gateway/static/root/assets/workflows-page-Bg02zEUh.js +0 -11
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","names":[],"sources":["../../../src/media-understanding/runner.ts"],"sourcesContent":["/**\n * MediaUnderstanding capability runner.\n *\n * Orchestrates per-attachment fallback across providers for one capability\n * (audio / image / video). For each attachment:\n * 1. Build the candidate provider list from the registry, ordered by\n * autoPriority (lower = first), with caller-supplied `providerOrder`\n * overriding when set.\n * 2. Try providers in order. A provider is SKIPPED when it does not declare\n * the requested capability OR does not implement the corresponding method.\n * 3. The first provider whose capability call resolves successfully wins;\n * its output is recorded as `chosen`. Failures are recorded as attempts\n * and the next provider is tried.\n * 4. When ALL providers for an attachment fail, the attachment outcome is\n * `failed`; when no provider was even eligible (capability not registered),\n * it's `disabled`.\n *\n * DECISION (per docs/voice-rearchitecture.md §5):\n * - This is a thin runner only. xopc v2.0 ships ONLY audio; image/video\n * branches exist as type-level fall-throughs (the runner happily handles\n * them once a provider registers describeImage / describeVideo, but no\n * image-specific helpers — like multi-image batching — live here yet).\n * - We deliberately do NOT port openclaw's `MediaAttachmentCache` (which\n * handles temp-file extraction, SSRF re-validation on remote URLs, etc.).\n * For xopc v2.0 the caller is expected to pre-load the buffer; remote URL\n * fetching is the caller's responsibility (typically the channel adapter\n * does this before invoking the runner).\n */\n\nimport { createLogger } from '../utils/logger.js';\n\nimport { listProvidersForCapability } from './registry.js';\nimport type {\n AudioTranscriptionRequest,\n AudioTranscriptionResult,\n CapabilityAttachmentInput,\n ImageDescriptionRequest,\n ImageDescriptionResult,\n MediaCapability,\n MediaUnderstandingAttachmentDecision,\n MediaUnderstandingKind,\n MediaUnderstandingModelDecision,\n MediaUnderstandingOutput,\n MediaUnderstandingProvider,\n MediaUnderstandingResult,\n VideoDescriptionRequest,\n VideoDescriptionResult,\n} from './types.js';\n\nconst log = createLogger('MediaUnderstandingRunner');\n\nexport type { CapabilityAttachmentInput } from './types.js';\n\nexport interface RunCapabilityOptions {\n capability: MediaCapability;\n attachments: readonly CapabilityAttachmentInput[];\n /** Caller-supplied ordering. When set, overrides registry autoPriority. */\n providerOrder?: readonly string[];\n /**\n * Per-provider request builder. Returned shape MUST match the capability:\n * audio → AudioTranscriptionRequest\n * image → ImageDescriptionRequest\n * video → VideoDescriptionRequest\n * The runner does not synthesize api keys / urls — that's the caller's job\n * (typically reads from cfg.tools.media.audio.providers[providerId]).\n */\n buildRequest: (params: {\n provider: MediaUnderstandingProvider;\n attachment: CapabilityAttachmentInput;\n }) =>\n | AudioTranscriptionRequest\n | ImageDescriptionRequest\n | VideoDescriptionRequest\n | undefined;\n /** Optional global timeout signal (e.g. from agent-level cancellation). */\n signal?: AbortSignal;\n}\n\nconst KIND_BY_CAPABILITY: Record<MediaCapability, MediaUnderstandingKind> = {\n audio: 'audio.transcription',\n image: 'image.description',\n video: 'video.description',\n};\n\nfunction orderProviders(\n providers: MediaUnderstandingProvider[],\n capability: MediaCapability,\n override?: readonly string[],\n): MediaUnderstandingProvider[] {\n if (override && override.length > 0) {\n const lookup = new Map(providers.map((p) => [p.id.toLowerCase(), p]));\n const ordered: MediaUnderstandingProvider[] = [];\n const used = new Set<string>();\n for (const id of override) {\n const provider = lookup.get(id.toLowerCase());\n if (provider && !used.has(provider.id)) {\n ordered.push(provider);\n used.add(provider.id);\n }\n }\n // Append any registered providers not in the override (preserves capability\n // availability when the override list is incomplete).\n for (const provider of providers) {\n if (!used.has(provider.id)) {\n ordered.push(provider);\n }\n }\n return ordered;\n }\n return [...providers].sort((a, b) => {\n const aPriority = a.autoPriority?.[capability] ?? Number.MAX_SAFE_INTEGER;\n const bPriority = b.autoPriority?.[capability] ?? Number.MAX_SAFE_INTEGER;\n return aPriority - bPriority;\n });\n}\n\nfunction pickMethod(\n provider: MediaUnderstandingProvider,\n capability: MediaCapability,\n): ((req: never) => Promise<{ text: string; model?: string }>) | undefined {\n if (capability === 'audio') {\n return provider.transcribeAudio as (\n req: AudioTranscriptionRequest,\n ) => Promise<AudioTranscriptionResult>;\n }\n if (capability === 'image') {\n return provider.describeImage as (\n req: ImageDescriptionRequest,\n ) => Promise<ImageDescriptionResult>;\n }\n return provider.describeVideo as (\n req: VideoDescriptionRequest,\n ) => Promise<VideoDescriptionResult>;\n}\n\nexport async function runCapability(\n options: RunCapabilityOptions,\n): Promise<MediaUnderstandingResult> {\n const eligibleProviders = listProvidersForCapability(options.capability);\n\n // Capability outcome is 'disabled' when no registered provider implements it.\n if (eligibleProviders.length === 0) {\n log.debug(\n { capability: options.capability },\n `No providers registered for capability \"${options.capability}\"`,\n );\n return {\n decision: {\n capability: options.capability,\n outcome: 'disabled',\n attachments: options.attachments.map((a) => ({\n attachmentIndex: a.attachmentIndex,\n attempts: [],\n })),\n },\n outputs: [],\n };\n }\n\n if (options.attachments.length === 0) {\n return {\n decision: { capability: options.capability, outcome: 'no-attachment', attachments: [] },\n outputs: [],\n };\n }\n\n const providers = orderProviders(eligibleProviders, options.capability, options.providerOrder);\n const attachmentDecisions: MediaUnderstandingAttachmentDecision[] = [];\n const outputs: MediaUnderstandingOutput[] = [];\n\n for (const attachment of options.attachments) {\n options.signal?.throwIfAborted();\n\n const attempts: MediaUnderstandingModelDecision[] = [];\n let chosen: MediaUnderstandingModelDecision | undefined;\n\n for (const provider of providers) {\n const method = pickMethod(provider, options.capability);\n if (!method) {\n // Defensive: registry filter should already exclude these. Recorded as\n // skipped so callers can diagnose registry/method mismatches.\n attempts.push({\n provider: provider.id,\n type: 'provider',\n outcome: 'skipped',\n reason: `provider \"${provider.id}\" missing method for capability \"${options.capability}\"`,\n });\n continue;\n }\n const request = options.buildRequest({ provider, attachment });\n if (!request) {\n attempts.push({\n provider: provider.id,\n type: 'provider',\n outcome: 'skipped',\n reason: 'caller buildRequest returned undefined (likely missing config)',\n });\n continue;\n }\n try {\n // We narrow `method` by capability above; cast through `unknown` to keep\n // a single call site without per-capability ceremony.\n const callResult = await (method as (req: unknown) => Promise<{ text: string; model?: string }>)(\n request,\n );\n const text = callResult.text?.trim() ?? '';\n if (!text) {\n attempts.push({\n provider: provider.id,\n type: 'provider',\n outcome: 'failed',\n reason: 'empty transcription/description text',\n model: callResult.model,\n });\n continue;\n }\n chosen = {\n provider: provider.id,\n type: 'provider',\n outcome: 'success',\n model: callResult.model,\n };\n attempts.push(chosen);\n outputs.push({\n kind: KIND_BY_CAPABILITY[options.capability],\n attachmentIndex: attachment.attachmentIndex,\n text,\n provider: provider.id,\n model: callResult.model,\n });\n break;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n log.warn(\n {\n err: error,\n providerId: provider.id,\n capability: options.capability,\n attachmentIndex: attachment.attachmentIndex,\n },\n `Provider \"${provider.id}\" failed for ${options.capability}: ${reason}`,\n );\n attempts.push({\n provider: provider.id,\n type: 'provider',\n outcome: 'failed',\n reason,\n });\n }\n }\n\n attachmentDecisions.push({\n attachmentIndex: attachment.attachmentIndex,\n attempts,\n ...(chosen ? { chosen } : {}),\n });\n }\n\n const overallOutcome = attachmentDecisions.every((d) => d.chosen)\n ? 'success'\n : attachmentDecisions.some((d) => d.chosen)\n ? 'success' // partial success — at least one attachment succeeded\n : 'failed';\n\n return {\n decision: {\n capability: options.capability,\n outcome: overallOutcome,\n attachments: attachmentDecisions,\n },\n outputs,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"runner.js","names":[],"sources":["../../../src/media-understanding/runner.ts"],"sourcesContent":["/**\n * MediaUnderstanding capability runner.\n *\n * Orchestrates per-attachment fallback across providers for one capability\n * (audio / image / video). For each attachment:\n * 1. Build the candidate provider list from the registry, ordered by\n * autoPriority (lower = first), with caller-supplied `providerOrder`\n * overriding when set.\n * 2. Try providers in order. A provider is SKIPPED when it does not declare\n * the requested capability OR does not implement the corresponding method.\n * 3. The first provider whose capability call resolves successfully wins;\n * its output is recorded as `chosen`. Failures are recorded as attempts\n * and the next provider is tried.\n * 4. When ALL providers for an attachment fail, the attachment outcome is\n * `failed`; when no provider was even eligible (capability not registered),\n * it's `disabled`.\n *\n * DECISION (per docs/voice-rearchitecture.md §5):\n * - This is a thin runner only. xopc v2.0 ships ONLY audio; image/video\n * branches exist as type-level fall-throughs (the runner happily handles\n * them once a provider registers describeImage / describeVideo, but no\n * image-specific helpers — like multi-image batching — live here yet).\n * - We deliberately do NOT port openclaw's `MediaAttachmentCache` (which\n * handles temp-file extraction, SSRF re-validation on remote URLs, etc.).\n * For xopc v2.0 the caller is expected to pre-load the buffer; remote URL\n * fetching is the caller's responsibility (typically the channel adapter\n * does this before invoking the runner).\n */\n\nimport { createLogger } from '../utils/logger.js';\n\nimport { listProvidersForCapability } from './registry.js';\nimport type {\n AudioTranscriptionRequest,\n AudioTranscriptionResult,\n CapabilityAttachmentInput,\n ImageDescriptionRequest,\n ImageDescriptionResult,\n MediaCapability,\n MediaUnderstandingAttachmentDecision,\n MediaUnderstandingKind,\n MediaUnderstandingModelDecision,\n MediaUnderstandingOutput,\n MediaUnderstandingProvider,\n MediaUnderstandingResult,\n VideoDescriptionRequest,\n VideoDescriptionResult,\n} from './types.js';\n\nconst log = createLogger('MediaUnderstandingRunner');\n\nexport type { CapabilityAttachmentInput } from './types.js';\n\nexport interface RunCapabilityOptions {\n capability: MediaCapability;\n attachments: readonly CapabilityAttachmentInput[];\n /** Caller-supplied ordering. When set, overrides registry autoPriority. */\n providerOrder?: readonly string[];\n /**\n * Per-provider request builder. Returned shape MUST match the capability:\n * audio → AudioTranscriptionRequest\n * image → ImageDescriptionRequest\n * video → VideoDescriptionRequest\n * The runner does not synthesize api keys / urls — that's the caller's job\n * (typically reads from cfg.tools.media.audio.providers[providerId]).\n */\n buildRequest: (params: {\n provider: MediaUnderstandingProvider;\n attachment: CapabilityAttachmentInput;\n }) =>\n | AudioTranscriptionRequest\n | ImageDescriptionRequest\n | VideoDescriptionRequest\n | undefined;\n /** Optional global timeout signal (e.g. from agent-level cancellation). */\n signal?: AbortSignal;\n}\n\nconst KIND_BY_CAPABILITY: Record<MediaCapability, MediaUnderstandingKind> = {\n audio: 'audio.transcription',\n image: 'image.description',\n video: 'video.description',\n};\n\nfunction orderProviders(\n providers: MediaUnderstandingProvider[],\n capability: MediaCapability,\n override?: readonly string[],\n): MediaUnderstandingProvider[] {\n if (override && override.length > 0) {\n const lookup = new Map(providers.map((p) => [p.id.toLowerCase(), p]));\n const ordered: MediaUnderstandingProvider[] = [];\n const used = new Set<string>();\n for (const id of override) {\n const provider = lookup.get(id.toLowerCase());\n if (provider && !used.has(provider.id)) {\n ordered.push(provider);\n used.add(provider.id);\n }\n }\n // Append any registered providers not in the override (preserves capability\n // availability when the override list is incomplete).\n for (const provider of providers) {\n if (!used.has(provider.id)) {\n ordered.push(provider);\n }\n }\n return ordered;\n }\n return [...providers].sort((a, b) => {\n const aPriority = a.autoPriority?.[capability] ?? Number.MAX_SAFE_INTEGER;\n const bPriority = b.autoPriority?.[capability] ?? Number.MAX_SAFE_INTEGER;\n return aPriority - bPriority;\n });\n}\n\nfunction pickMethod(\n provider: MediaUnderstandingProvider,\n capability: MediaCapability,\n): ((req: never) => Promise<{ text: string; model?: string }>) | undefined {\n if (capability === 'audio') {\n return provider.transcribeAudio as (\n req: AudioTranscriptionRequest,\n ) => Promise<AudioTranscriptionResult>;\n }\n if (capability === 'image') {\n return provider.describeImage as (\n req: ImageDescriptionRequest,\n ) => Promise<ImageDescriptionResult>;\n }\n return provider.describeVideo as (\n req: VideoDescriptionRequest,\n ) => Promise<VideoDescriptionResult>;\n}\n\nexport async function runCapability(\n options: RunCapabilityOptions,\n): Promise<MediaUnderstandingResult> {\n const eligibleProviders = listProvidersForCapability(options.capability);\n\n // Capability outcome is 'disabled' when no registered provider implements it.\n if (eligibleProviders.length === 0) {\n log.debug(\n { capability: options.capability },\n `No providers registered for capability \"${options.capability}\"`,\n );\n return {\n decision: {\n capability: options.capability,\n outcome: 'disabled',\n attachments: options.attachments.map((a) => ({\n attachmentIndex: a.attachmentIndex,\n attempts: [],\n })),\n },\n outputs: [],\n };\n }\n\n if (options.attachments.length === 0) {\n return {\n decision: { capability: options.capability, outcome: 'no-attachment', attachments: [] },\n outputs: [],\n };\n }\n\n const providers = orderProviders(eligibleProviders, options.capability, options.providerOrder);\n const attachmentDecisions: MediaUnderstandingAttachmentDecision[] = [];\n const outputs: MediaUnderstandingOutput[] = [];\n\n for (const attachment of options.attachments) {\n options.signal?.throwIfAborted();\n\n const attempts: MediaUnderstandingModelDecision[] = [];\n let chosen: MediaUnderstandingModelDecision | undefined;\n\n for (const provider of providers) {\n const method = pickMethod(provider, options.capability);\n if (!method) {\n // Defensive: registry filter should already exclude these. Recorded as\n // skipped so callers can diagnose registry/method mismatches.\n attempts.push({\n provider: provider.id,\n type: 'provider',\n outcome: 'skipped',\n reason: `provider \"${provider.id}\" missing method for capability \"${options.capability}\"`,\n });\n continue;\n }\n const request = options.buildRequest({ provider, attachment });\n if (!request) {\n attempts.push({\n provider: provider.id,\n type: 'provider',\n outcome: 'skipped',\n reason: 'caller buildRequest returned undefined (likely missing config)',\n });\n continue;\n }\n const startedAt = Date.now();\n try {\n // We narrow `method` by capability above; cast through `unknown` to keep\n // a single call site without per-capability ceremony.\n const callResult = await (method as (req: unknown) => Promise<{ text: string; model?: string }>)(\n request,\n );\n const text = callResult.text?.trim() ?? '';\n if (!text) {\n attempts.push({\n provider: provider.id,\n type: 'provider',\n outcome: 'failed',\n reason: 'empty transcription/description text',\n model: callResult.model,\n latencyMs: Date.now() - startedAt,\n });\n continue;\n }\n chosen = {\n provider: provider.id,\n type: 'provider',\n outcome: 'success',\n model: callResult.model,\n latencyMs: Date.now() - startedAt,\n };\n attempts.push(chosen);\n outputs.push({\n kind: KIND_BY_CAPABILITY[options.capability],\n attachmentIndex: attachment.attachmentIndex,\n text,\n provider: provider.id,\n model: callResult.model,\n });\n break;\n } catch (error) {\n if (options.signal?.aborted) {\n throw error;\n }\n const reason = error instanceof Error ? error.message : String(error);\n log.warn(\n {\n err: error,\n providerId: provider.id,\n capability: options.capability,\n attachmentIndex: attachment.attachmentIndex,\n },\n `Provider \"${provider.id}\" failed for ${options.capability}: ${reason}`,\n );\n attempts.push({\n provider: provider.id,\n type: 'provider',\n outcome: 'failed',\n reason,\n latencyMs: Date.now() - startedAt,\n });\n }\n }\n\n attachmentDecisions.push({\n attachmentIndex: attachment.attachmentIndex,\n attempts,\n ...(chosen ? { chosen } : {}),\n });\n }\n\n const overallOutcome = attachmentDecisions.every((d) => d.chosen)\n ? 'success'\n : attachmentDecisions.some((d) => d.chosen)\n ? 'success' // partial success — at least one attachment succeeded\n : 'failed';\n\n return {\n decision: {\n capability: options.capability,\n outcome: overallOutcome,\n attachments: attachmentDecisions,\n },\n outputs,\n };\n}\n"],"mappings":"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"}
@@ -70,6 +70,8 @@ export interface MediaUnderstandingModelDecision {
70
70
  type: 'provider' | 'cli';
71
71
  outcome: MediaUnderstandingAttemptOutcome;
72
72
  reason?: string;
73
+ /** Wall-clock time spent in this provider attempt. */
74
+ latencyMs?: number;
73
75
  }
74
76
  export interface MediaUnderstandingAttachmentDecision {
75
77
  attachmentIndex: number;
@@ -98,6 +100,7 @@ export interface AudioTranscriptionRequest {
98
100
  prompt?: string;
99
101
  query?: Record<string, string | number | boolean>;
100
102
  timeoutMs: number;
103
+ signal?: AbortSignal;
101
104
  }
102
105
  export interface AudioTranscriptionResult {
103
106
  text: string;
@@ -156,6 +159,10 @@ export interface MediaUnderstandingProvider {
156
159
  * Defaults to true.
157
160
  */
158
161
  requiresApiKey?: boolean;
162
+ /** Optional runtime readiness check for bundled providers such as local STT. */
163
+ isConfigured?: (options?: {
164
+ model?: string;
165
+ }) => boolean;
159
166
  /** Lower number = higher priority in auto-selection. */
160
167
  autoPriority?: Partial<Record<MediaCapability, number>>;
161
168
  /** True when the provider can natively ingest PDF (no OCR pre-step needed). */
@@ -1,6 +1,6 @@
1
- import { ConfigSchema, init_schema } from "../config/schema.js";
2
1
  import { createLogger } from "../utils/logger/index.js";
3
2
  import { init_logger } from "../utils/logger.js";
3
+ import { ConfigSchema, init_schema } from "../config/schema.js";
4
4
  import { listRegisteredMigrations } from "./registry.js";
5
5
  import { defaultCapabilityPresetMigration } from "./config/default-capability-preset.js";
6
6
  import { dirname, join } from "node:path";
@@ -1,11 +1,11 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
- import { getDefaultModelSync, init_providers, resolveModel } from "../providers/index.js";
4
- import { publishAutomationProductEvent } from "../automations/product-events.js";
5
- import { completeWithResolvedCredentials } from "../providers/model-call.js";
6
3
  import { buildNoteAttachmentRef } from "./attachment-ref.js";
7
4
  import { parseNoteMarkdown } from "./note-markdown.js";
8
5
  import { changedFieldsFromPatch, emitActivity, previewText, systemActivityActor, systemActivitySource } from "../activity/emitter.js";
6
+ import { getDefaultModelSync, init_providers, resolveModel } from "../providers/index.js";
7
+ import { publishAutomationProductEvent } from "../automations/product-events.js";
8
+ import { completeWithResolvedCredentials } from "../providers/model-call.js";
9
9
  import { NotesStore } from "./store.js";
10
10
  import { partitionAttachmentsByReference } from "./note-attachment-sync.js";
11
11
  import { buildNoteAgentContextArtifact, getCachedNoteAgentContextArtifact } from "./agent-context.js";
@@ -1,11 +1,11 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
- import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
4
3
  import { requireXopcDatabase } from "../storage/sqlite/connection.js";
5
4
  import { buildNoteIndexMeta } from "./note-index-meta.js";
6
5
  import { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord } from "../storage/sqlite/notes-repository.js";
7
6
  import { deleteNoteAgentContextRecord } from "../storage/sqlite/note-agent-context-repository.js";
8
7
  import "../storage/sqlite/index.js";
8
+ import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
9
9
  import { resolveNoteHistoryDir, resolveNoteMediaDir } from "./paths.js";
10
10
  import { join } from "node:path";
11
11
  import { randomUUID } from "node:crypto";
@@ -1,7 +1,7 @@
1
1
  import { getSessionMetadata } from "../storage/sqlite/session-repository.js";
2
2
  import "../storage/sqlite/index.js";
3
- import { ProjectStore } from "./project-store.js";
4
3
  import { changedFieldsFromPatch, emitActivity, systemActivityActor, systemActivitySource } from "../activity/emitter.js";
4
+ import { ProjectStore } from "./project-store.js";
5
5
  import { bindGoalToProject, listProjectGoalIds, unbindGoalFromProject } from "./goal-bind.js";
6
6
  import { bindSessionToProject, listProjectSessionKeys, unbindSessionFromProject } from "./session-bind.js";
7
7
  import { ProjectWorkspaceConflictError, ProjectWorkspaceMissingError, canonicalWorkspacePath, ensureWorkspaceDirectory, inferProjectNameFromWorkspaceRoot, isPathSameOrInsideWorkspace, isSafeAutoCreateWorkspaceRoot, resolveWorkspaceProjectRoot, workspaceDirectoryExists } from "./workspace-project.js";
@@ -1,7 +1,7 @@
1
- import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
2
1
  import { isXopcDatabaseOpen } from "../storage/sqlite/connection.js";
3
2
  import { getSessionMetadata } from "../storage/sqlite/session-repository.js";
4
3
  import "../storage/sqlite/index.js";
4
+ import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
5
5
  import { projectWorkspacePath } from "../session/session-workspace.js";
6
6
  import { ProjectStore } from "./project-store.js";
7
7
  //#region src/projects/workspace.ts
@@ -1,6 +1,6 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
- import { DEFAULT_ACCOUNT_ID, init_account_id, normalizeAccountId, normalizeOptionalAccountId } from "./account-id.js";
3
2
  import { init_string_coerce, normalizeLowercaseStringOrEmpty } from "../utils/string-coerce.js";
3
+ import { DEFAULT_ACCOUNT_ID, init_account_id, normalizeAccountId, normalizeOptionalAccountId } from "./account-id.js";
4
4
  import { getSubagentDepth, init_session_key_utils, isAcpSessionKey, isCronSessionKey, isSubagentSessionKey, parseAgentSessionKey, parseThreadSessionSuffix } from "./session-key-utils.js";
5
5
  //#region src/routing/agent-session-key.ts
6
6
  function normalizeToken(value) {
@@ -1,7 +1,7 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
- import { init_agent_scope, resolveDefaultAgentId } from "../agent/agent-scope.js";
3
2
  import { init_account_id, normalizeAccountId } from "./account-id.js";
4
3
  import { buildAgentMainSessionKey, buildAgentPeerSessionKey, init_agent_session_key, normalizeSessionKey } from "./agent-session-key.js";
4
+ import { init_agent_scope, resolveDefaultAgentId } from "../agent/agent-scope.js";
5
5
  import { buildSessionKey, init_session_key, parseSessionKey } from "./session-key.js";
6
6
  import { init_bindings, parseBindingRules, resolveRoute as resolveRoute$1 } from "./bindings.js";
7
7
  //#region src/routing/resolve-route.ts
@@ -1,7 +1,7 @@
1
- import { init_agent_scope, listAgentEntries, resolveAgentIdByWorkspacePath, resolveDefaultAgentId } from "../agent/agent-scope.js";
2
1
  import { init_string_coerce, normalizeLowercaseStringOrEmpty } from "../utils/string-coerce.js";
3
2
  import { parseAgentSessionKey } from "./session-key-utils.js";
4
3
  import { buildAgentMainSessionKey, init_agent_session_key, normalizeAgentId, normalizeMainKey } from "./agent-session-key.js";
4
+ import { init_agent_scope, listAgentEntries, resolveAgentIdByWorkspacePath, resolveDefaultAgentId } from "../agent/agent-scope.js";
5
5
  import { randomUUID } from "node:crypto";
6
6
  //#region src/routing/resolve-tui-session-key.ts
7
7
  init_agent_scope();
@@ -1,8 +1,8 @@
1
- import { SessionConfigSchema, init_schema } from "../config/schema.js";
2
1
  import { createLogger } from "../utils/logger/index.js";
3
2
  import { init_logger } from "../utils/logger.js";
4
3
  import { requireXopcDatabase } from "../storage/sqlite/connection.js";
5
4
  import "../storage/sqlite/index.js";
5
+ import { SessionConfigSchema, init_schema } from "../config/schema.js";
6
6
  import { evaluateSessionFreshness, resolveSessionResetPolicy } from "./reset-policy.js";
7
7
  import { resolveChannelResetConfig, resolveSessionResetType } from "./reset-type.js";
8
8
  import { resolveSessionLifecycleTimestamps } from "./lifecycle-timestamps.js";
@@ -1,9 +1,9 @@
1
- import { SessionConfigSchema, init_schema } from "../config/schema.js";
2
1
  import { createLogger } from "../utils/logger/index.js";
3
2
  import { init_logger } from "../utils/logger.js";
4
3
  import { requireXopcDatabase } from "../storage/sqlite/connection.js";
5
4
  import { findSessionKeyBySessionId, getSessionMetadata, getSessionPersistedLevels } from "../storage/sqlite/session-repository.js";
6
5
  import "../storage/sqlite/index.js";
6
+ import { SessionConfigSchema, init_schema } from "../config/schema.js";
7
7
  import { normalizeThinkLevel, normalizeVerboseLevel } from "../agent/transcript/thinking-types.js";
8
8
  import { evaluateSessionFreshness, resolveSessionResetPolicy } from "./reset-policy.js";
9
9
  import { resolveChannelResetConfig, resolveSessionResetType } from "./reset-type.js";
@@ -1,7 +1,7 @@
1
- import { isCronSessionKey } from "../routing/session-key-utils.js";
2
- import { init_session_key, parseSessionKey } from "../routing/session-key.js";
3
1
  import { createLogger } from "../utils/logger/index.js";
4
2
  import { init_logger } from "../utils/logger.js";
3
+ import { isCronSessionKey } from "../routing/session-key-utils.js";
4
+ import { init_session_key, parseSessionKey } from "../routing/session-key.js";
5
5
  import { init_providers, resolveModel } from "../providers/index.js";
6
6
  import { completeWithResolvedCredentials } from "../providers/model-call.js";
7
7
  import { readAgentMessageContent } from "../agent/memory/agent-message-access.js";
@@ -1,5 +1,4 @@
1
1
  import { init_paths_state, resolveStateDir } from "../config/paths-state.js";
2
- import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
3
2
  import { createLogger } from "../utils/logger/index.js";
4
3
  import { init_logger } from "../utils/logger.js";
5
4
  import { requireXopcDatabase } from "../storage/sqlite/connection.js";
@@ -9,6 +8,7 @@ import { estimateTokensFromMessages } from "../storage/sqlite/row-mappers.js";
9
8
  import { deleteSessionRecord, ensureSessionRecord, findSessionKeyBySessionId, getGlobalSessionStats, getSessionMetadata, listSessionMetadata, listSessionsByAgent, patchSessionMetadata, resetSessionRecord } from "../storage/sqlite/session-repository.js";
10
9
  import { appendTranscriptEntry, captureCompactionCheckpoint, getCompactionCheckpointDetail, listCompactionCheckpoints, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRowsForSession, paginateTranscriptMessages, replaceTranscriptRows, restoreCompactionCheckpoint } from "../storage/sqlite/transcript-repository.js";
11
10
  import "../storage/sqlite/index.js";
11
+ import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
12
12
  import { readPostCompactionContext } from "../agent/reply/post-compaction-context.js";
13
13
  import { SessionCompactor } from "../agent/memory/compaction.js";
14
14
  import { SlidingWindow } from "../agent/memory/window.js";
@@ -1,9 +1,9 @@
1
1
  import { resolveXopcDatabasePath } from "../../config/paths-state.js";
2
2
  import { createLogger } from "../../utils/logger/index.js";
3
3
  import { init_logger } from "../../utils/logger.js";
4
+ import { ensureXopcDatabaseSchema } from "./schema.js";
4
5
  import { requireNodeSqlite } from "../../infra/node-sqlite.js";
5
6
  import { installSqliteTransientRejectionHandler } from "../../infra/unhandled-rejections.js";
6
- import { ensureXopcDatabaseSchema } from "./schema.js";
7
7
  import path from "node:path";
8
8
  import fs from "node:fs";
9
9
  import childProcess from "node:child_process";
@@ -13,7 +13,7 @@ export { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord, } f
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
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
+ export { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, deleteMemoryEvidenceForRecord, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceItems, listKnowledgeSourceChanges, listKnowledgeSyncRuns, listMemoryEvidence, setKnowledgeSourceItemSynthesisStatus, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, startKnowledgeSyncRun, upsertKnowledgeSourceItems, } from './knowledge-repository.js';
17
17
  export { deleteSessionConfig, getSessionConfig, hasSessionConfig, setSessionConfig, updateSessionConfig, } from './config-repository.js';
18
18
  export { createObjectLinkRecord, getActivityEventRecord, listActivityRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, recordActivityEvent, } from './activity-repository.js';
19
19
  export { appendConnectorExecutionAudit, claimConnectorWebhookDelivery, completeConnectorWebhookDelivery, consumeConnectorApproval, createConnectorApproval, decideConnectorApproval, deleteConnectorConnection, deleteConnectorInstallation, getConnectorConnection, getConnectorApproval, getConnectorInstallation, getCachedConnectorCatalogEntry, listCachedConnectorCatalogEntries, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, releaseConnectorWebhookDelivery, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, type CachedConnectorCatalogEntry, } from './connector-repository.js';
@@ -14,10 +14,10 @@ import { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord } fr
14
14
  import { deleteNoteAgentContextRecord, getNoteAgentContextRecord, upsertNoteAgentContextRecord } from "./note-agent-context-repository.js";
15
15
  import { resolveAgentIdFromMemoriesDir, searchMemoryIndex, syncMemoryIndex } from "./memory-index-repository.js";
16
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
+ import { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, deleteMemoryEvidenceForRecord, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, startKnowledgeSyncRun, upsertKnowledgeSourceItems } from "./knowledge-repository.js";
18
18
  import { deleteSessionConfig, getSessionConfig, hasSessionConfig, setSessionConfig, updateSessionConfig } from "./config-repository.js";
19
19
  import { createObjectLinkRecord, getActivityEventRecord, listActivityRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, recordActivityEvent } from "./activity-repository.js";
20
20
  import { appendConnectorExecutionAudit, claimConnectorWebhookDelivery, completeConnectorWebhookDelivery, consumeConnectorApproval, createConnectorApproval, decideConnectorApproval, deleteConnectorConnection, deleteConnectorInstallation, getCachedConnectorCatalogEntry, getConnectorApproval, getConnectorConnection, getConnectorInstallation, listCachedConnectorCatalogEntries, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, releaseConnectorWebhookDelivery, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation } from "./connector-repository.js";
21
21
  import { getUserTrustPolicy, setUserTrustPolicy } from "./user-trust-repository.js";
22
22
  import { getUserProfilePromptState, setUserProfilePromptState } from "./user-profile-setup-repository.js";
23
- export { DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, SCHEMA_META_SCHEMA_VERSION_KEY, USER_UNDERSTANDING_REMEDIATION_POLICY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, appendConnectorExecutionAudit, appendMemorySignal, appendMemoryTraceEvent, appendTranscriptEntry, applyPendingMigrations, attachMemoryEvidence, buildDefaultSessionMetadata, buildGlobalSessionStats, captureCompactionCheckpoint, claimConnectorWebhookDelivery, classifyStoredRow, closeXopcDatabase, completeConnectorWebhookDelivery, consumeConnectorApproval, createConnectorApproval, createObjectLinkRecord, decideConnectorApproval, deleteConnectorConnection, deleteConnectorInstallation, deleteMemoryRecord, deleteNoteAgentContextRecord, deleteNoteRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findLatestMemoryInjectTrace, findSessionKeyBySessionId, finishKnowledgeSyncRun, getActivityEventRecord, getCachedConnectorCatalogEntry, getCompactionCheckpointDetail, getConnectorApproval, getConnectorConnection, getConnectorInstallation, getCurrentSessionId, getGlobalSessionStats, getKnowledgeSourceCursor, getKnowledgeSourceItem, getMemoryProviderState, getMemoryRecord, getNoteAgentContextRecord, getNoteRecord, getSessionConfig, getSessionMetadata, getSessionPersistedLevels, getSqliteDatabase, getUserProfilePromptState, getUserTrustPolicy, getXopcDatabase, hasSessionConfig, incrementSessionStatsOnAppend, inspectSchemaMigrationStatus, isXopcDatabaseOpen, listActivityRecords, listCachedConnectorCatalogEntries, listCompactionCheckpoints, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRows, loadTranscriptRowsForSession, metadataToSessionInsert, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, readSchemaVersion, readSchemaVersionForTest, recordActivityEvent, releaseConnectorWebhookDelivery, replaceTranscriptRows, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveAgentIdFromMemoriesDir, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreCompactionCheckpoint, runSqliteWriteTransaction, searchMemoryIndex, searchMemoryRecords, sessionConfigRowToConfig, sessionRowToMetadata, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, setLatestMemoryInjectFeedback, setMemoryProviderState, setMemoryTraceFeedback, setSessionConfig, setUserProfilePromptState, setUserTrustPolicy, startKnowledgeSyncRun, summarizeMemoryRecallFeedback, summarizeUserUnderstandingQuality, syncMemoryIndex, transcriptEntryRowToStoredRow, updateSessionConfig, updateSessionStats, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, upsertKnowledgeSourceItems, upsertMemoryRecord, upsertNoteAgentContextRecord, upsertNoteRecord };
23
+ export { DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, SCHEMA_META_SCHEMA_VERSION_KEY, USER_UNDERSTANDING_REMEDIATION_POLICY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, appendConnectorExecutionAudit, appendMemorySignal, appendMemoryTraceEvent, appendTranscriptEntry, applyPendingMigrations, attachMemoryEvidence, buildDefaultSessionMetadata, buildGlobalSessionStats, captureCompactionCheckpoint, claimConnectorWebhookDelivery, claimKnowledgeSourceItems, classifyStoredRow, closeXopcDatabase, completeConnectorWebhookDelivery, completeKnowledgeSourceItemSynthesis, consumeConnectorApproval, createConnectorApproval, createObjectLinkRecord, decideConnectorApproval, deleteConnectorConnection, deleteConnectorInstallation, deleteMemoryEvidenceForRecord, deleteMemoryRecord, deleteNoteAgentContextRecord, deleteNoteRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findLatestMemoryInjectTrace, findSessionKeyBySessionId, finishKnowledgeSyncRun, getActivityEventRecord, getCachedConnectorCatalogEntry, getCompactionCheckpointDetail, getConnectorApproval, getConnectorConnection, getConnectorInstallation, getCurrentSessionId, getGlobalSessionStats, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, getMemoryProviderState, getMemoryRecord, getNoteAgentContextRecord, getNoteRecord, getSessionConfig, getSessionMetadata, getSessionPersistedLevels, getSqliteDatabase, getUserProfilePromptState, getUserTrustPolicy, getXopcDatabase, hasSessionConfig, incrementSessionStatsOnAppend, inspectSchemaMigrationStatus, isXopcDatabaseOpen, listActivityRecords, listCachedConnectorCatalogEntries, listCompactionCheckpoints, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRows, loadTranscriptRowsForSession, metadataToSessionInsert, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, readSchemaVersion, readSchemaVersionForTest, recordActivityEvent, releaseConnectorWebhookDelivery, replaceTranscriptRows, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveAgentIdFromMemoriesDir, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreCompactionCheckpoint, runSqliteWriteTransaction, searchMemoryIndex, searchMemoryRecords, sessionConfigRowToConfig, sessionRowToMetadata, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, setLatestMemoryInjectFeedback, setMemoryProviderState, setMemoryTraceFeedback, setSessionConfig, setUserProfilePromptState, setUserTrustPolicy, startKnowledgeSyncRun, summarizeMemoryRecallFeedback, summarizeUserUnderstandingQuality, syncMemoryIndex, transcriptEntryRowToStoredRow, updateSessionConfig, updateSessionStats, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, upsertKnowledgeSourceItems, upsertMemoryRecord, upsertNoteAgentContextRecord, upsertNoteRecord };
@@ -1,4 +1,4 @@
1
- import type { KnowledgeSourceItem, KnowledgeSourceItemInput, KnowledgeSyncRun, KnowledgeSyncRunStatus, KnowledgeSynthesisStatus } from '../../knowledge/types.js';
1
+ import type { KnowledgeSourceChange, KnowledgeSourceItem, KnowledgeSourceItemInput, KnowledgeSyncRun, KnowledgeSyncRunStatus, KnowledgeSynthesisPipeline, KnowledgeSynthesisStatus } from '../../knowledge/types.js';
2
2
  import type { MemoryEvidence, MemoryEvidenceRelation } from '../../agent/memory/types.js';
3
3
  export declare function startKnowledgeSyncRun(input: {
4
4
  sourceInstanceId: string;
@@ -30,6 +30,13 @@ export declare function upsertKnowledgeSourceItems(inputs: KnowledgeSourceItemIn
30
30
  unchanged: number;
31
31
  };
32
32
  export declare function getKnowledgeSourceItem(itemId: string): KnowledgeSourceItem | null;
33
+ export declare function listKnowledgeSourceChanges(options?: {
34
+ sourceInstanceId?: string;
35
+ afterSequence?: number;
36
+ limit?: number;
37
+ }): KnowledgeSourceChange[];
38
+ export declare function getKnowledgeConsumerWatermark(consumerId: string, sourceInstanceId: string): number;
39
+ export declare function setKnowledgeConsumerWatermark(consumerId: string, sourceInstanceId: string, sequence: number, nowMs?: number): void;
33
40
  export declare function listKnowledgeSourceItems(options?: {
34
41
  sourceInstanceId?: string;
35
42
  synthesisStatus?: KnowledgeSynthesisStatus;
@@ -38,6 +45,23 @@ export declare function listKnowledgeSourceItems(options?: {
38
45
  offset?: number;
39
46
  }): KnowledgeSourceItem[];
40
47
  export declare function setKnowledgeSourceItemSynthesisStatus(itemIds: string[], status: KnowledgeSynthesisStatus, nowMs?: number): number;
48
+ export declare function claimKnowledgeSourceItems(options: {
49
+ workerId: string;
50
+ sourceInstanceId?: string;
51
+ synthesisPipeline?: KnowledgeSynthesisPipeline;
52
+ limit?: number;
53
+ leaseMs?: number;
54
+ retryDelayMs?: number;
55
+ maxAttempts?: number;
56
+ nowMs?: number;
57
+ }): KnowledgeSourceItem[];
58
+ export declare function completeKnowledgeSourceItemSynthesis(input: {
59
+ itemId: string;
60
+ workerId: string;
61
+ status: 'completed' | 'failed' | 'ignored';
62
+ error?: string;
63
+ nowMs?: number;
64
+ }): boolean;
41
65
  export declare function attachMemoryEvidence(input: {
42
66
  recordId: string;
43
67
  sourceItemId?: string;
@@ -47,4 +71,5 @@ export declare function attachMemoryEvidence(input: {
47
71
  observedAt?: string;
48
72
  nowMs?: number;
49
73
  }): MemoryEvidence;
74
+ export declare function deleteMemoryEvidenceForRecord(recordId: string, relation?: MemoryEvidenceRelation): number;
50
75
  export declare function listMemoryEvidence(recordId: string): MemoryEvidence[];
@@ -40,12 +40,29 @@ function sourceItemFromRow(row) {
40
40
  metadata: parseRecord(row.metadata_json),
41
41
  sensitivity: row.sensitivity,
42
42
  retentionClass: row.retention_class,
43
+ synthesisPipeline: row.synthesis_pipeline,
43
44
  synthesisStatus: row.synthesis_status,
45
+ synthesisAttempts: row.synthesis_attempts,
46
+ ...timestampToIso(row.synthesis_claimed_at) ? { synthesisClaimedAt: timestampToIso(row.synthesis_claimed_at) } : {},
47
+ ...row.synthesis_claimed_by ? { synthesisClaimedBy: row.synthesis_claimed_by } : {},
48
+ ...row.synthesis_error ? { synthesisError: row.synthesis_error } : {},
44
49
  ...timestampToIso(row.deleted_at) ? { deletedAt: timestampToIso(row.deleted_at) } : {},
45
50
  createdAt: new Date(row.created_at).toISOString(),
46
51
  updatedAt: new Date(row.updated_at).toISOString()
47
52
  };
48
53
  }
54
+ function sourceChangeFromRow(row) {
55
+ return {
56
+ sequence: row.sequence,
57
+ id: row.change_id,
58
+ sourceInstanceId: row.source_instance_id,
59
+ sourceItemId: row.source_item_id,
60
+ kind: row.change_kind,
61
+ ...row.old_hash ? { oldHash: row.old_hash } : {},
62
+ ...row.new_hash ? { newHash: row.new_hash } : {},
63
+ changedAt: new Date(row.changed_at).toISOString()
64
+ };
65
+ }
49
66
  function syncRunFromRow(row) {
50
67
  return {
51
68
  id: row.run_id,
@@ -141,8 +158,8 @@ function upsertKnowledgeSourceItems(inputs, nowMs = Date.now()) {
141
158
  item_id, source_instance_id, external_id, item_type, author_role,
142
159
  occurred_at, source_updated_at, content_hash, normalized_text,
143
160
  payload_ref, metadata_json, sensitivity, retention_class,
144
- synthesis_status, deleted_at, created_at, updated_at
145
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
161
+ synthesis_pipeline, synthesis_status, deleted_at, created_at, updated_at
162
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
146
163
  ON CONFLICT(source_instance_id, external_id) DO UPDATE SET
147
164
  item_type = excluded.item_type,
148
165
  author_role = excluded.author_role,
@@ -154,11 +171,21 @@ function upsertKnowledgeSourceItems(inputs, nowMs = Date.now()) {
154
171
  metadata_json = excluded.metadata_json,
155
172
  sensitivity = excluded.sensitivity,
156
173
  retention_class = excluded.retention_class,
174
+ synthesis_pipeline = excluded.synthesis_pipeline,
157
175
  synthesis_status = excluded.synthesis_status,
176
+ synthesis_attempts = 0,
177
+ synthesis_claimed_at = NULL,
178
+ synthesis_claimed_by = NULL,
179
+ synthesis_error = NULL,
158
180
  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);
181
+ 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.synthesisPipeline ?? "user_understanding", input.synthesisStatus ?? "pending", parseTimestamp(input.deletedAt), existing?.created_at ?? nowMs, nowMs);
160
182
  const row = db.prepare(`SELECT * FROM knowledge_source_items WHERE item_id = ?`).get(id);
161
183
  items.push(sourceItemFromRow(row));
184
+ const changeKind = input.deletedAt ? "deleted" : existing ? "modified" : "added";
185
+ db.prepare(`INSERT INTO knowledge_source_changes (
186
+ change_id, source_instance_id, source_item_id, change_kind,
187
+ old_hash, new_hash, changed_at
188
+ ) VALUES (?, ?, ?, ?, ?, ?, ?)`).run(randomUUID(), input.sourceInstanceId, id, changeKind, existing?.content_hash ?? null, input.deletedAt ? null : input.contentHash, nowMs);
162
189
  if (existing) updated += 1;
163
190
  else created += 1;
164
191
  }
@@ -174,6 +201,36 @@ function getKnowledgeSourceItem(itemId) {
174
201
  const row = getSqliteDatabase().prepare(`SELECT * FROM knowledge_source_items WHERE item_id = ?`).get(itemId);
175
202
  return row ? sourceItemFromRow(row) : null;
176
203
  }
204
+ function listKnowledgeSourceChanges(options = {}) {
205
+ const where = [];
206
+ const params = [];
207
+ if (options.sourceInstanceId) {
208
+ where.push("source_instance_id = ?");
209
+ params.push(options.sourceInstanceId);
210
+ }
211
+ if (options.afterSequence != null) {
212
+ where.push("sequence > ?");
213
+ params.push(Math.max(0, options.afterSequence));
214
+ }
215
+ const limit = Math.max(1, Math.min(1e3, options.limit ?? 100));
216
+ return getSqliteDatabase().prepare(`SELECT * FROM knowledge_source_changes
217
+ ${where.length > 0 ? `WHERE ${where.join(" AND ")}` : ""}
218
+ ORDER BY sequence ASC LIMIT ?`).all(...params, limit).map(sourceChangeFromRow);
219
+ }
220
+ function getKnowledgeConsumerWatermark(consumerId, sourceInstanceId) {
221
+ return getSqliteDatabase().prepare(`SELECT last_sequence FROM knowledge_consumer_watermarks
222
+ WHERE consumer_id = ? AND source_instance_id = ?`).get(consumerId, sourceInstanceId)?.last_sequence ?? 0;
223
+ }
224
+ function setKnowledgeConsumerWatermark(consumerId, sourceInstanceId, sequence, nowMs = Date.now()) {
225
+ runSqliteWriteTransaction((db) => {
226
+ db.prepare(`INSERT INTO knowledge_consumer_watermarks (
227
+ consumer_id, source_instance_id, last_sequence, updated_at
228
+ ) VALUES (?, ?, ?, ?)
229
+ ON CONFLICT(consumer_id, source_instance_id) DO UPDATE SET
230
+ last_sequence = MAX(last_sequence, excluded.last_sequence),
231
+ updated_at = excluded.updated_at`).run(consumerId, sourceInstanceId, Math.max(0, sequence), nowMs);
232
+ });
233
+ }
177
234
  function listKnowledgeSourceItems(options = {}) {
178
235
  const where = [];
179
236
  const params = [];
@@ -202,15 +259,66 @@ function setKnowledgeSourceItemSynthesisStatus(itemIds, status, nowMs = Date.now
202
259
  return Number(result.changes);
203
260
  });
204
261
  }
262
+ function claimKnowledgeSourceItems(options) {
263
+ const now = options.nowMs ?? Date.now();
264
+ const leaseCutoff = now - Math.max(1e3, options.leaseMs ?? 5 * 6e4);
265
+ const retryCutoff = now - Math.max(1e3, options.retryDelayMs ?? 3e4);
266
+ const limit = Math.max(1, Math.min(100, options.limit ?? 20));
267
+ const maxAttempts = Math.max(1, options.maxAttempts ?? 3);
268
+ return runSqliteWriteTransaction((db) => {
269
+ const rows = db.prepare(`SELECT * FROM knowledge_source_items
270
+ WHERE synthesis_attempts < ?
271
+ ${options.sourceInstanceId ? "AND source_instance_id = ?" : ""}
272
+ ${options.synthesisPipeline ? "AND synthesis_pipeline = ?" : ""}
273
+ AND (
274
+ synthesis_status = 'pending'
275
+ OR (synthesis_status = 'failed' AND updated_at < ?)
276
+ OR (synthesis_status = 'processing' AND synthesis_claimed_at < ?)
277
+ )
278
+ ORDER BY COALESCE(source_updated_at, occurred_at, updated_at) ASC
279
+ LIMIT ?`).all(maxAttempts, ...options.sourceInstanceId ? [options.sourceInstanceId] : [], ...options.synthesisPipeline ? [options.synthesisPipeline] : [], retryCutoff, leaseCutoff, limit);
280
+ if (rows.length === 0) return [];
281
+ const ids = rows.map((row) => row.item_id);
282
+ const placeholders = ids.map(() => "?").join(", ");
283
+ db.prepare(`UPDATE knowledge_source_items SET
284
+ synthesis_status = 'processing',
285
+ synthesis_attempts = synthesis_attempts + 1,
286
+ synthesis_claimed_at = ?,
287
+ synthesis_claimed_by = ?,
288
+ synthesis_error = NULL,
289
+ updated_at = ?
290
+ WHERE item_id IN (${placeholders})`).run(now, options.workerId, now, ...ids);
291
+ return db.prepare(`SELECT * FROM knowledge_source_items WHERE item_id IN (${placeholders})`).all(...ids).map(sourceItemFromRow);
292
+ });
293
+ }
294
+ function completeKnowledgeSourceItemSynthesis(input) {
295
+ const now = input.nowMs ?? Date.now();
296
+ return runSqliteWriteTransaction((db) => {
297
+ const result = db.prepare(`UPDATE knowledge_source_items SET
298
+ synthesis_status = ?,
299
+ synthesis_claimed_at = NULL,
300
+ synthesis_claimed_by = NULL,
301
+ synthesis_error = ?,
302
+ updated_at = ?
303
+ WHERE item_id = ? AND synthesis_status = 'processing' AND synthesis_claimed_by = ?`).run(input.status, input.error ?? null, now, input.itemId, input.workerId);
304
+ return Number(result.changes) > 0;
305
+ });
306
+ }
205
307
  function attachMemoryEvidence(input) {
206
- const evidenceId = randomUUID();
308
+ let evidenceId = randomUUID();
207
309
  const now = input.nowMs ?? Date.now();
208
310
  const observedAt = parseTimestamp(input.observedAt);
209
311
  runSqliteWriteTransaction((db) => {
210
312
  db.prepare(`INSERT INTO memory_evidence (
211
313
  evidence_id, record_id, source_item_id, relation, excerpt,
212
314
  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);
315
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
316
+ ON CONFLICT DO UPDATE SET
317
+ excerpt = COALESCE(excluded.excerpt, memory_evidence.excerpt),
318
+ confidence = MAX(COALESCE(memory_evidence.confidence, 0), COALESCE(excluded.confidence, 0)),
319
+ observed_at = MAX(COALESCE(memory_evidence.observed_at, 0), COALESCE(excluded.observed_at, 0))`).run(evidenceId, input.recordId, input.sourceItemId ?? null, input.relation ?? "supports", input.excerpt ?? null, input.confidence ?? null, observedAt, now);
320
+ if (input.sourceItemId) evidenceId = db.prepare(`SELECT evidence_id FROM memory_evidence
321
+ WHERE record_id = ? AND source_item_id = ? AND relation = ?`).get(input.recordId, input.sourceItemId, input.relation ?? "supports")?.evidence_id ?? evidenceId;
214
322
  });
215
323
  return {
216
324
  evidenceId,
@@ -221,6 +329,12 @@ function attachMemoryEvidence(input) {
221
329
  ...observedAt != null ? { observedAt: new Date(observedAt).toISOString() } : {}
222
330
  };
223
331
  }
332
+ function deleteMemoryEvidenceForRecord(recordId, relation) {
333
+ return runSqliteWriteTransaction((db) => {
334
+ const result = relation ? db.prepare(`DELETE FROM memory_evidence WHERE record_id = ? AND relation = ?`).run(recordId, relation) : db.prepare(`DELETE FROM memory_evidence WHERE record_id = ?`).run(recordId);
335
+ return Number(result.changes);
336
+ });
337
+ }
224
338
  function listMemoryEvidence(recordId) {
225
339
  return getSqliteDatabase().prepare(`SELECT * FROM memory_evidence WHERE record_id = ? ORDER BY created_at ASC`).all(recordId).map((row) => ({
226
340
  evidenceId: row.evidence_id,
@@ -232,6 +346,6 @@ function listMemoryEvidence(recordId) {
232
346
  }));
233
347
  }
234
348
  //#endregion
235
- export { attachMemoryEvidence, finishKnowledgeSyncRun, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, startKnowledgeSyncRun, upsertKnowledgeSourceItems };
349
+ export { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, deleteMemoryEvidenceForRecord, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, startKnowledgeSyncRun, upsertKnowledgeSourceItems };
236
350
 
237
351
  //# sourceMappingURL=knowledge-repository.js.map