@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
@@ -0,0 +1,267 @@
1
+ import { createLogger } from "../utils/logger/index.js";
2
+ import { init_logger } from "../utils/logger.js";
3
+ import { getMemoryRecord, upsertMemoryRecord } from "../storage/sqlite/memory-records-repository.js";
4
+ import { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, deleteMemoryEvidenceForRecord, listKnowledgeSourceItems } from "../storage/sqlite/knowledge-repository.js";
5
+ import "../storage/sqlite/index.js";
6
+ import { createHash, randomUUID } from "node:crypto";
7
+ //#region src/knowledge/connected-knowledge-pipeline.ts
8
+ init_logger();
9
+ const log = createLogger("ConnectedKnowledge");
10
+ const MAX_ITEM_CHARS = 8e3;
11
+ const MAX_SUMMARY_CHARS = 6e3;
12
+ const MAX_SUMMARY_ITEMS = 24;
13
+ function providerId(item) {
14
+ const connectorId = item.metadata.connectorId;
15
+ if (typeof connectorId === "string" && connectorId.trim()) return connectorId.trim();
16
+ return item.sourceInstanceId.split(":")[0] || "connected-source";
17
+ }
18
+ function ownerAgentId(item, fallback) {
19
+ const agentId = item.metadata.agentId;
20
+ return typeof agentId === "string" && agentId.trim() ? agentId.trim() : fallback;
21
+ }
22
+ function ownerWorkspaceId(item, fallback) {
23
+ const workspaceId = item.metadata.workspaceId;
24
+ return typeof workspaceId === "string" && workspaceId.trim() ? workspaceId.trim() : fallback;
25
+ }
26
+ function knowledgeRecordId(itemId) {
27
+ return `knowledge:${itemId}`;
28
+ }
29
+ function boundedText(item) {
30
+ const text = item.normalizedText?.trim() ?? "";
31
+ return text.length > MAX_ITEM_CHARS ? `${text.slice(0, MAX_ITEM_CHARS)}\n…` : text;
32
+ }
33
+ function dayFor(item) {
34
+ return (item.occurredAt ?? item.sourceUpdatedAt ?? item.updatedAt).slice(0, 10);
35
+ }
36
+ function summaryRecordId(sourceInstanceId, day) {
37
+ return `knowledge-summary:${createHash("sha256").update(`${sourceInstanceId}:${day}`).digest("hex").slice(0, 24)}`;
38
+ }
39
+ var ConnectedKnowledgePipeline = class {
40
+ workerId;
41
+ batchSize;
42
+ constructor(options) {
43
+ this.options = options;
44
+ this.workerId = options.workerId ?? `connected-knowledge:${process.pid}:${randomUUID()}`;
45
+ this.batchSize = Math.max(1, Math.min(100, options.batchSize ?? 20));
46
+ }
47
+ async processPending(sourceInstanceId) {
48
+ const claimed = claimKnowledgeSourceItems({
49
+ workerId: this.workerId,
50
+ sourceInstanceId,
51
+ synthesisPipeline: "connected_knowledge",
52
+ limit: this.batchSize
53
+ });
54
+ const result = {
55
+ claimed: claimed.length,
56
+ completed: 0,
57
+ ignored: 0,
58
+ failed: 0,
59
+ recordIds: []
60
+ };
61
+ const summaryKeys = /* @__PURE__ */ new Set();
62
+ for (const item of claimed) try {
63
+ const recordId = knowledgeRecordId(item.id);
64
+ const content = boundedText(item);
65
+ if (item.deletedAt) {
66
+ const existing = getMemoryRecord(recordId);
67
+ if (existing) upsertMemoryRecord({
68
+ id: existing.id,
69
+ providerId: "connected-knowledge",
70
+ kind: existing.kind,
71
+ agentId: existing.scope.agentId,
72
+ workspaceId: existing.scope.workspaceId,
73
+ content: existing.content,
74
+ source: existing.source,
75
+ confidence: existing.confidence,
76
+ tags: existing.tags,
77
+ status: "archived",
78
+ sensitivity: existing.sensitivity,
79
+ explicitness: existing.explicitness,
80
+ durability: existing.durability,
81
+ importance: existing.importance,
82
+ disclosurePolicy: existing.disclosurePolicy,
83
+ evidence: existing.evidence,
84
+ validFrom: existing.validFrom,
85
+ validTo: item.deletedAt,
86
+ reviewAfter: existing.reviewAfter,
87
+ expiresAt: existing.expiresAt,
88
+ canonicalKey: existing.canonicalKey,
89
+ supersedesRecordId: existing.supersedesRecordId,
90
+ conflictGroupId: existing.conflictGroupId
91
+ });
92
+ completeKnowledgeSourceItemSynthesis({
93
+ itemId: item.id,
94
+ workerId: this.workerId,
95
+ status: "ignored"
96
+ });
97
+ result.ignored += 1;
98
+ summaryKeys.add(`${item.sourceInstanceId}\u0000${dayFor(item)}`);
99
+ continue;
100
+ }
101
+ if (!content || item.sensitivity === "secret" || item.sensitivity === "regulated") {
102
+ completeKnowledgeSourceItemSynthesis({
103
+ itemId: item.id,
104
+ workerId: this.workerId,
105
+ status: "ignored"
106
+ });
107
+ result.ignored += 1;
108
+ continue;
109
+ }
110
+ const sourceProvider = providerId(item);
111
+ const record = upsertMemoryRecord({
112
+ id: recordId,
113
+ providerId: "connected-knowledge",
114
+ kind: "workspace_fact",
115
+ agentId: ownerAgentId(item, this.options.agentId),
116
+ workspaceId: ownerWorkspaceId(item, this.options.workspaceId),
117
+ content,
118
+ canonicalKey: `source-item:${item.sourceInstanceId}:${item.externalId}`,
119
+ source: {
120
+ provider: sourceProvider,
121
+ path: item.payloadRef
122
+ },
123
+ confidence: .78,
124
+ tags: [
125
+ "connected-source",
126
+ "external",
127
+ sourceProvider,
128
+ item.itemType
129
+ ],
130
+ status: "active",
131
+ sensitivity: item.sensitivity,
132
+ explicitness: "observed",
133
+ durability: item.retentionClass === "durable" ? "durable" : "recurring",
134
+ importance: .5,
135
+ disclosurePolicy: "referenceable",
136
+ evidence: [{
137
+ sourceItemId: item.id,
138
+ relation: "derived_from",
139
+ sourceText: content.slice(0, 1e3),
140
+ confidence: .78,
141
+ observedAt: item.occurredAt ?? item.sourceUpdatedAt
142
+ }],
143
+ validFrom: item.occurredAt ?? item.sourceUpdatedAt
144
+ });
145
+ attachMemoryEvidence({
146
+ recordId: record.id,
147
+ sourceItemId: item.id,
148
+ relation: "derived_from",
149
+ excerpt: content.slice(0, 1e3),
150
+ confidence: .78,
151
+ observedAt: item.occurredAt ?? item.sourceUpdatedAt
152
+ });
153
+ completeKnowledgeSourceItemSynthesis({
154
+ itemId: item.id,
155
+ workerId: this.workerId,
156
+ status: "completed"
157
+ });
158
+ result.completed += 1;
159
+ result.recordIds.push(record.id);
160
+ summaryKeys.add(`${item.sourceInstanceId}\u0000${dayFor(item)}`);
161
+ } catch (err) {
162
+ const errorMessage = err instanceof Error ? err.message : String(err);
163
+ completeKnowledgeSourceItemSynthesis({
164
+ itemId: item.id,
165
+ workerId: this.workerId,
166
+ status: "failed",
167
+ error: errorMessage.slice(0, 1e3)
168
+ });
169
+ result.failed += 1;
170
+ log.warn({
171
+ err,
172
+ itemId: item.id,
173
+ sourceInstanceId: item.sourceInstanceId
174
+ }, `Connected knowledge synthesis failed: ${errorMessage}`);
175
+ }
176
+ for (const key of summaryKeys) {
177
+ const [sourceInstanceId, day] = key.split("\0");
178
+ if (sourceInstanceId && day) this.rebuildDailySummary(sourceInstanceId, day);
179
+ }
180
+ return result;
181
+ }
182
+ rebuildDailySummary(sourceInstanceId, day) {
183
+ const items = listKnowledgeSourceItems({
184
+ sourceInstanceId,
185
+ limit: 500
186
+ }).filter((item) => dayFor(item) === day && item.synthesisStatus === "completed").slice(0, MAX_SUMMARY_ITEMS);
187
+ if (items.length === 0) {
188
+ const existing = getMemoryRecord(summaryRecordId(sourceInstanceId, day));
189
+ if (existing) upsertMemoryRecord({
190
+ id: existing.id,
191
+ providerId: "connected-knowledge",
192
+ kind: existing.kind,
193
+ agentId: existing.scope.agentId,
194
+ workspaceId: existing.scope.workspaceId,
195
+ content: existing.content,
196
+ source: existing.source,
197
+ confidence: existing.confidence,
198
+ tags: existing.tags,
199
+ status: "archived",
200
+ sensitivity: existing.sensitivity,
201
+ explicitness: existing.explicitness,
202
+ durability: existing.durability,
203
+ importance: existing.importance,
204
+ disclosurePolicy: existing.disclosurePolicy,
205
+ evidence: existing.evidence,
206
+ validFrom: existing.validFrom,
207
+ validTo: (/* @__PURE__ */ new Date()).toISOString(),
208
+ reviewAfter: existing.reviewAfter,
209
+ expiresAt: existing.expiresAt,
210
+ canonicalKey: existing.canonicalKey
211
+ });
212
+ return;
213
+ }
214
+ const sourceProvider = providerId(items[0]);
215
+ const lines = [`# ${sourceProvider} updates for ${day}`, ""];
216
+ for (const item of items) {
217
+ const text = boundedText(item).replace(/\s+/g, " ").trim();
218
+ if (!text) continue;
219
+ lines.push(`- ${text.slice(0, 360)}`);
220
+ if (lines.join("\n").length >= MAX_SUMMARY_CHARS) break;
221
+ }
222
+ const content = lines.join("\n").slice(0, MAX_SUMMARY_CHARS);
223
+ const summary = upsertMemoryRecord({
224
+ id: summaryRecordId(sourceInstanceId, day),
225
+ providerId: "connected-knowledge",
226
+ kind: "daily_note",
227
+ agentId: ownerAgentId(items[0], this.options.agentId),
228
+ workspaceId: ownerWorkspaceId(items[0], this.options.workspaceId),
229
+ content,
230
+ canonicalKey: `source-day:${sourceInstanceId}:${day}`,
231
+ source: { provider: sourceProvider },
232
+ confidence: .72,
233
+ tags: [
234
+ "connected-source",
235
+ "source-day-summary",
236
+ sourceProvider
237
+ ],
238
+ status: "active",
239
+ sensitivity: items.some((item) => item.sensitivity === "personal") ? "personal" : "normal",
240
+ explicitness: "observed",
241
+ durability: "recurring",
242
+ importance: .55,
243
+ disclosurePolicy: "referenceable",
244
+ evidence: items.map((item) => ({
245
+ sourceItemId: item.id,
246
+ relation: "derived_from",
247
+ sourceText: boundedText(item).slice(0, 500),
248
+ confidence: .72,
249
+ observedAt: item.occurredAt ?? item.sourceUpdatedAt
250
+ })),
251
+ validFrom: `${day}T00:00:00.000Z`
252
+ });
253
+ deleteMemoryEvidenceForRecord(summary.id, "derived_from");
254
+ for (const item of items) attachMemoryEvidence({
255
+ recordId: summary.id,
256
+ sourceItemId: item.id,
257
+ relation: "derived_from",
258
+ excerpt: boundedText(item).slice(0, 500),
259
+ confidence: .72,
260
+ observedAt: item.occurredAt ?? item.sourceUpdatedAt
261
+ });
262
+ }
263
+ };
264
+ //#endregion
265
+ export { ConnectedKnowledgePipeline };
266
+
267
+ //# sourceMappingURL=connected-knowledge-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connected-knowledge-pipeline.js","names":[],"sources":["../../../src/knowledge/connected-knowledge-pipeline.ts"],"sourcesContent":["import { createHash, randomUUID } from 'node:crypto';\n\nimport {\n attachMemoryEvidence,\n claimKnowledgeSourceItems,\n completeKnowledgeSourceItemSynthesis,\n deleteMemoryEvidenceForRecord,\n getMemoryRecord,\n listKnowledgeSourceItems,\n upsertMemoryRecord,\n} from '../storage/sqlite/index.js';\nimport { createLogger } from '../utils/logger.js';\nimport type { KnowledgeSourceItem } from './types.js';\n\nconst log = createLogger('ConnectedKnowledge');\nconst MAX_ITEM_CHARS = 8_000;\nconst MAX_SUMMARY_CHARS = 6_000;\nconst MAX_SUMMARY_ITEMS = 24;\n\nexport type ConnectedKnowledgePipelineOptions = {\n agentId: string;\n workspaceId: string;\n workerId?: string;\n batchSize?: number;\n};\n\nexport type KnowledgeSynthesisBatchResult = {\n claimed: number;\n completed: number;\n ignored: number;\n failed: number;\n recordIds: string[];\n};\n\nfunction providerId(item: KnowledgeSourceItem): string {\n const connectorId = item.metadata.connectorId;\n if (typeof connectorId === 'string' && connectorId.trim()) return connectorId.trim();\n return item.sourceInstanceId.split(':')[0] || 'connected-source';\n}\n\nfunction ownerAgentId(item: KnowledgeSourceItem, fallback: string): string {\n const agentId = item.metadata.agentId;\n return typeof agentId === 'string' && agentId.trim() ? agentId.trim() : fallback;\n}\n\nfunction ownerWorkspaceId(item: KnowledgeSourceItem, fallback: string): string {\n const workspaceId = item.metadata.workspaceId;\n return typeof workspaceId === 'string' && workspaceId.trim() ? workspaceId.trim() : fallback;\n}\n\nfunction knowledgeRecordId(itemId: string): string {\n return `knowledge:${itemId}`;\n}\n\nfunction boundedText(item: KnowledgeSourceItem): string {\n const text = item.normalizedText?.trim() ?? '';\n return text.length > MAX_ITEM_CHARS ? `${text.slice(0, MAX_ITEM_CHARS)}\\n…` : text;\n}\n\nfunction dayFor(item: KnowledgeSourceItem): string {\n const timestamp = item.occurredAt ?? item.sourceUpdatedAt ?? item.updatedAt;\n return timestamp.slice(0, 10);\n}\n\nfunction summaryRecordId(sourceInstanceId: string, day: string): string {\n const key = createHash('sha256').update(`${sourceInstanceId}:${day}`).digest('hex').slice(0, 24);\n return `knowledge-summary:${key}`;\n}\n\nexport class ConnectedKnowledgePipeline {\n private readonly workerId: string;\n private readonly batchSize: number;\n\n constructor(private readonly options: ConnectedKnowledgePipelineOptions) {\n this.workerId = options.workerId ?? `connected-knowledge:${process.pid}:${randomUUID()}`;\n this.batchSize = Math.max(1, Math.min(100, options.batchSize ?? 20));\n }\n\n async processPending(sourceInstanceId?: string): Promise<KnowledgeSynthesisBatchResult> {\n const claimed = claimKnowledgeSourceItems({\n workerId: this.workerId,\n sourceInstanceId,\n synthesisPipeline: 'connected_knowledge',\n limit: this.batchSize,\n });\n const result: KnowledgeSynthesisBatchResult = {\n claimed: claimed.length,\n completed: 0,\n ignored: 0,\n failed: 0,\n recordIds: [],\n };\n const summaryKeys = new Set<string>();\n\n for (const item of claimed) {\n try {\n const recordId = knowledgeRecordId(item.id);\n const content = boundedText(item);\n if (item.deletedAt) {\n const existing = getMemoryRecord(recordId);\n if (existing) {\n upsertMemoryRecord({\n id: existing.id,\n providerId: 'connected-knowledge',\n kind: existing.kind,\n agentId: existing.scope.agentId,\n workspaceId: existing.scope.workspaceId,\n content: existing.content,\n source: existing.source,\n confidence: existing.confidence,\n tags: existing.tags,\n status: 'archived',\n sensitivity: existing.sensitivity,\n explicitness: existing.explicitness,\n durability: existing.durability,\n importance: existing.importance,\n disclosurePolicy: existing.disclosurePolicy,\n evidence: existing.evidence,\n validFrom: existing.validFrom,\n validTo: item.deletedAt,\n reviewAfter: existing.reviewAfter,\n expiresAt: existing.expiresAt,\n canonicalKey: existing.canonicalKey,\n supersedesRecordId: existing.supersedesRecordId,\n conflictGroupId: existing.conflictGroupId,\n });\n }\n completeKnowledgeSourceItemSynthesis({\n itemId: item.id,\n workerId: this.workerId,\n status: 'ignored',\n });\n result.ignored += 1;\n summaryKeys.add(`${item.sourceInstanceId}\\u0000${dayFor(item)}`);\n continue;\n }\n if (!content || item.sensitivity === 'secret' || item.sensitivity === 'regulated') {\n completeKnowledgeSourceItemSynthesis({\n itemId: item.id,\n workerId: this.workerId,\n status: 'ignored',\n });\n result.ignored += 1;\n continue;\n }\n\n const sourceProvider = providerId(item);\n const record = upsertMemoryRecord({\n id: recordId,\n providerId: 'connected-knowledge',\n kind: 'workspace_fact',\n agentId: ownerAgentId(item, this.options.agentId),\n workspaceId: ownerWorkspaceId(item, this.options.workspaceId),\n content,\n canonicalKey: `source-item:${item.sourceInstanceId}:${item.externalId}`,\n source: { provider: sourceProvider, path: item.payloadRef },\n confidence: 0.78,\n tags: ['connected-source', 'external', sourceProvider, item.itemType],\n status: 'active',\n sensitivity: item.sensitivity,\n explicitness: 'observed',\n durability: item.retentionClass === 'durable' ? 'durable' : 'recurring',\n importance: 0.5,\n disclosurePolicy: 'referenceable',\n evidence: [{\n sourceItemId: item.id,\n relation: 'derived_from',\n sourceText: content.slice(0, 1_000),\n confidence: 0.78,\n observedAt: item.occurredAt ?? item.sourceUpdatedAt,\n }],\n validFrom: item.occurredAt ?? item.sourceUpdatedAt,\n });\n attachMemoryEvidence({\n recordId: record.id,\n sourceItemId: item.id,\n relation: 'derived_from',\n excerpt: content.slice(0, 1_000),\n confidence: 0.78,\n observedAt: item.occurredAt ?? item.sourceUpdatedAt,\n });\n completeKnowledgeSourceItemSynthesis({\n itemId: item.id,\n workerId: this.workerId,\n status: 'completed',\n });\n result.completed += 1;\n result.recordIds.push(record.id);\n summaryKeys.add(`${item.sourceInstanceId}\\u0000${dayFor(item)}`);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n completeKnowledgeSourceItemSynthesis({\n itemId: item.id,\n workerId: this.workerId,\n status: 'failed',\n error: errorMessage.slice(0, 1_000),\n });\n result.failed += 1;\n log.warn(\n { err, itemId: item.id, sourceInstanceId: item.sourceInstanceId },\n `Connected knowledge synthesis failed: ${errorMessage}`,\n );\n }\n }\n\n for (const key of summaryKeys) {\n const [sourceInstanceId, day] = key.split('\\u0000');\n if (sourceInstanceId && day) this.rebuildDailySummary(sourceInstanceId, day);\n }\n return result;\n }\n\n private rebuildDailySummary(sourceInstanceId: string, day: string): void {\n const items = listKnowledgeSourceItems({ sourceInstanceId, limit: 500 })\n .filter((item) => dayFor(item) === day && item.synthesisStatus === 'completed')\n .slice(0, MAX_SUMMARY_ITEMS);\n if (items.length === 0) {\n const existing = getMemoryRecord(summaryRecordId(sourceInstanceId, day));\n if (existing) {\n upsertMemoryRecord({\n id: existing.id,\n providerId: 'connected-knowledge',\n kind: existing.kind,\n agentId: existing.scope.agentId,\n workspaceId: existing.scope.workspaceId,\n content: existing.content,\n source: existing.source,\n confidence: existing.confidence,\n tags: existing.tags,\n status: 'archived',\n sensitivity: existing.sensitivity,\n explicitness: existing.explicitness,\n durability: existing.durability,\n importance: existing.importance,\n disclosurePolicy: existing.disclosurePolicy,\n evidence: existing.evidence,\n validFrom: existing.validFrom,\n validTo: new Date().toISOString(),\n reviewAfter: existing.reviewAfter,\n expiresAt: existing.expiresAt,\n canonicalKey: existing.canonicalKey,\n });\n }\n return;\n }\n const sourceProvider = providerId(items[0]!);\n const lines = [`# ${sourceProvider} updates for ${day}`, ''];\n for (const item of items) {\n const text = boundedText(item).replace(/\\s+/g, ' ').trim();\n if (!text) continue;\n lines.push(`- ${text.slice(0, 360)}`);\n if (lines.join('\\n').length >= MAX_SUMMARY_CHARS) break;\n }\n const content = lines.join('\\n').slice(0, MAX_SUMMARY_CHARS);\n const summary = upsertMemoryRecord({\n id: summaryRecordId(sourceInstanceId, day),\n providerId: 'connected-knowledge',\n kind: 'daily_note',\n agentId: ownerAgentId(items[0]!, this.options.agentId),\n workspaceId: ownerWorkspaceId(items[0]!, this.options.workspaceId),\n content,\n canonicalKey: `source-day:${sourceInstanceId}:${day}`,\n source: { provider: sourceProvider },\n confidence: 0.72,\n tags: ['connected-source', 'source-day-summary', sourceProvider],\n status: 'active',\n sensitivity: items.some((item) => item.sensitivity === 'personal') ? 'personal' : 'normal',\n explicitness: 'observed',\n durability: 'recurring',\n importance: 0.55,\n disclosurePolicy: 'referenceable',\n evidence: items.map((item) => ({\n sourceItemId: item.id,\n relation: 'derived_from' as const,\n sourceText: boundedText(item).slice(0, 500),\n confidence: 0.72,\n observedAt: item.occurredAt ?? item.sourceUpdatedAt,\n })),\n validFrom: `${day}T00:00:00.000Z`,\n });\n deleteMemoryEvidenceForRecord(summary.id, 'derived_from');\n for (const item of items) {\n attachMemoryEvidence({\n recordId: summary.id,\n sourceItemId: item.id,\n relation: 'derived_from',\n excerpt: boundedText(item).slice(0, 500),\n confidence: 0.72,\n observedAt: item.occurredAt ?? item.sourceUpdatedAt,\n });\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type ConnectedKnowledgePipelineOptions } from './connected-knowledge-pipeline.js';
2
+ export type ConnectedKnowledgeCoordinator = {
3
+ runNow(): Promise<void>;
4
+ stop(): void;
5
+ };
6
+ export declare function startConnectedKnowledgeCoordinator(options: {
7
+ resolvePipelineOptions: () => ConnectedKnowledgePipelineOptions;
8
+ intervalMs?: number;
9
+ initialDelayMs?: number;
10
+ }): ConnectedKnowledgeCoordinator;
@@ -0,0 +1,52 @@
1
+ import { createLogger } from "../utils/logger/index.js";
2
+ import { init_logger } from "../utils/logger.js";
3
+ import { ConnectedKnowledgePipeline } from "./connected-knowledge-pipeline.js";
4
+ //#region src/knowledge/coordinator.ts
5
+ init_logger();
6
+ const log = createLogger("ConnectedKnowledge:Coordinator");
7
+ function startConnectedKnowledgeCoordinator(options) {
8
+ const intervalMs = Math.max(1e4, Math.min(options.intervalMs ?? 6e4, 30 * 6e4));
9
+ let timer = null;
10
+ let running = false;
11
+ let stopped = false;
12
+ async function runNow() {
13
+ if (running || stopped) return;
14
+ running = true;
15
+ try {
16
+ const pipeline = new ConnectedKnowledgePipeline(options.resolvePipelineOptions());
17
+ let processed = 0;
18
+ for (let batch = 0; batch < 5; batch += 1) {
19
+ const result = await pipeline.processPending();
20
+ processed += result.claimed;
21
+ if (result.claimed === 0) break;
22
+ }
23
+ if (processed > 0) log.info({ processed }, "Connected knowledge synthesis queue drained");
24
+ } catch (err) {
25
+ const errorMessage = err instanceof Error ? err.message : String(err);
26
+ log.warn({ err }, `Connected knowledge coordinator failed: ${errorMessage}`);
27
+ } finally {
28
+ running = false;
29
+ }
30
+ }
31
+ timer = setTimeout(() => {
32
+ runNow();
33
+ timer = setInterval(() => void runNow(), intervalMs);
34
+ timer.unref?.();
35
+ }, Math.max(0, options.initialDelayMs ?? 2e3));
36
+ timer.unref?.();
37
+ return {
38
+ runNow,
39
+ stop() {
40
+ stopped = true;
41
+ if (timer) {
42
+ clearTimeout(timer);
43
+ clearInterval(timer);
44
+ timer = null;
45
+ }
46
+ }
47
+ };
48
+ }
49
+ //#endregion
50
+ export { startConnectedKnowledgeCoordinator };
51
+
52
+ //# sourceMappingURL=coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator.js","names":[],"sources":["../../../src/knowledge/coordinator.ts"],"sourcesContent":["import { createLogger } from '../utils/logger.js';\nimport { ConnectedKnowledgePipeline, type ConnectedKnowledgePipelineOptions } from './connected-knowledge-pipeline.js';\n\nconst log = createLogger('ConnectedKnowledge:Coordinator');\n\nexport type ConnectedKnowledgeCoordinator = {\n runNow(): Promise<void>;\n stop(): void;\n};\n\nexport function startConnectedKnowledgeCoordinator(options: {\n resolvePipelineOptions: () => ConnectedKnowledgePipelineOptions;\n intervalMs?: number;\n initialDelayMs?: number;\n}): ConnectedKnowledgeCoordinator {\n const intervalMs = Math.max(10_000, Math.min(options.intervalMs ?? 60_000, 30 * 60_000));\n let timer: NodeJS.Timeout | null = null;\n let running = false;\n let stopped = false;\n\n async function runNow(): Promise<void> {\n if (running || stopped) return;\n running = true;\n try {\n const pipeline = new ConnectedKnowledgePipeline(options.resolvePipelineOptions());\n let processed = 0;\n for (let batch = 0; batch < 5; batch += 1) {\n const result = await pipeline.processPending();\n processed += result.claimed;\n if (result.claimed === 0) break;\n }\n if (processed > 0) {\n log.info({ processed }, 'Connected knowledge synthesis queue drained');\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n log.warn({ err }, `Connected knowledge coordinator failed: ${errorMessage}`);\n } finally {\n running = false;\n }\n }\n\n timer = setTimeout(() => {\n void runNow();\n timer = setInterval(() => void runNow(), intervalMs);\n timer.unref?.();\n }, Math.max(0, options.initialDelayMs ?? 2_000));\n timer.unref?.();\n\n return {\n runNow,\n stop() {\n stopped = true;\n if (timer) {\n clearTimeout(timer);\n clearInterval(timer);\n timer = null;\n }\n },\n };\n}\n"],"mappings":";;;;aAAkD;AAGlD,MAAM,MAAM,aAAa,iCAAiC;AAO1D,SAAgB,mCAAmC,SAIjB;CAChC,MAAM,aAAa,KAAK,IAAI,KAAQ,KAAK,IAAI,QAAQ,cAAc,KAAQ,KAAK,IAAO,CAAC;CACxF,IAAI,QAA+B;CACnC,IAAI,UAAU;CACd,IAAI,UAAU;CAEd,eAAe,SAAwB;AACrC,MAAI,WAAW,QAAS;AACxB,YAAU;AACV,MAAI;GACF,MAAM,WAAW,IAAI,2BAA2B,QAAQ,wBAAwB,CAAC;GACjF,IAAI,YAAY;AAChB,QAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG;IACzC,MAAM,SAAS,MAAM,SAAS,gBAAgB;AAC9C,iBAAa,OAAO;AACpB,QAAI,OAAO,YAAY,EAAG;;AAE5B,OAAI,YAAY,EACd,KAAI,KAAK,EAAE,WAAW,EAAE,8CAA8C;WAEjE,KAAK;GACZ,MAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AACrE,OAAI,KAAK,EAAE,KAAK,EAAE,2CAA2C,eAAe;YACpE;AACR,aAAU;;;AAId,SAAQ,iBAAiB;AAClB,UAAQ;AACb,UAAQ,kBAAkB,KAAK,QAAQ,EAAE,WAAW;AACpD,QAAM,SAAS;IACd,KAAK,IAAI,GAAG,QAAQ,kBAAkB,IAAM,CAAC;AAChD,OAAM,SAAS;AAEf,QAAO;EACL;EACA,OAAO;AACL,aAAU;AACV,OAAI,OAAO;AACT,iBAAa,MAAM;AACnB,kBAAc,MAAM;AACpB,YAAQ;;;EAGb"}
@@ -1,2 +1,4 @@
1
1
  export * from './types.js';
2
2
  export * from './ingestion-service.js';
3
+ export * from './connected-knowledge-pipeline.js';
4
+ export * from './coordinator.js';
@@ -1,2 +1,4 @@
1
1
  import { KnowledgeIngestionService, SqliteKnowledgeSourceStateStore } from "./ingestion-service.js";
2
- export { KnowledgeIngestionService, SqliteKnowledgeSourceStateStore };
2
+ import { ConnectedKnowledgePipeline } from "./connected-knowledge-pipeline.js";
3
+ import { startConnectedKnowledgeCoordinator } from "./coordinator.js";
4
+ export { ConnectedKnowledgePipeline, KnowledgeIngestionService, SqliteKnowledgeSourceStateStore, startConnectedKnowledgeCoordinator };
@@ -1,4 +1,4 @@
1
- import type { KnowledgeSourceAdapter, KnowledgeSyncRun } from './types.js';
1
+ import type { KnowledgeSourceAdapter, KnowledgeSourceItemInput, KnowledgeSyncRun } from './types.js';
2
2
  export interface KnowledgeSourceStateStore {
3
3
  getCursor(instanceId: string): string | undefined;
4
4
  setCursor(instanceId: string, cursor: string | undefined): void;
@@ -11,6 +11,12 @@ export declare class KnowledgeIngestionService {
11
11
  private readonly adapters;
12
12
  private readonly state;
13
13
  constructor(adapters: ReadonlyMap<string, KnowledgeSourceAdapter>, state?: KnowledgeSourceStateStore);
14
+ ingest(params: {
15
+ instanceId: string;
16
+ items: KnowledgeSourceItemInput[];
17
+ cursorAfter?: string;
18
+ warnings?: string[];
19
+ }): KnowledgeSyncRun;
14
20
  sync(params: {
15
21
  adapterKind: string;
16
22
  instanceId: string;
@@ -17,6 +17,34 @@ var KnowledgeIngestionService = class {
17
17
  this.adapters = adapters;
18
18
  this.state = state;
19
19
  }
20
+ ingest(params) {
21
+ const cursorBefore = this.state.getCursor(params.instanceId);
22
+ const run = startKnowledgeSyncRun({
23
+ sourceInstanceId: params.instanceId,
24
+ cursorBefore
25
+ });
26
+ try {
27
+ const stored = upsertKnowledgeSourceItems(params.items);
28
+ this.state.setCursor(params.instanceId, params.cursorAfter);
29
+ return finishKnowledgeSyncRun({
30
+ runId: run.id,
31
+ status: params.warnings?.length ? "partial" : "succeeded",
32
+ cursorAfter: params.cursorAfter,
33
+ itemsSeen: params.items.length,
34
+ itemsCreated: stored.created,
35
+ itemsUpdated: stored.updated,
36
+ warnings: params.warnings
37
+ });
38
+ } catch (err) {
39
+ const errorMessage = err instanceof Error ? err.message : String(err);
40
+ finishKnowledgeSyncRun({
41
+ runId: run.id,
42
+ status: "failed",
43
+ error: errorMessage
44
+ });
45
+ throw err;
46
+ }
47
+ }
20
48
  async sync(params) {
21
49
  const adapter = this.adapters.get(params.adapterKind);
22
50
  if (!adapter) throw new Error(`Knowledge source adapter not found: ${params.adapterKind}`);
@@ -1 +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"}
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, KnowledgeSourceItemInput, 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 ingest(params: {\n instanceId: string;\n items: KnowledgeSourceItemInput[];\n cursorAfter?: string;\n warnings?: string[];\n }): KnowledgeSyncRun {\n const cursorBefore = this.state.getCursor(params.instanceId);\n const run = startKnowledgeSyncRun({ sourceInstanceId: params.instanceId, cursorBefore });\n try {\n const stored = upsertKnowledgeSourceItems(params.items);\n this.state.setCursor(params.instanceId, params.cursorAfter);\n return finishKnowledgeSyncRun({\n runId: run.id,\n status: params.warnings?.length ? 'partial' : 'succeeded',\n cursorAfter: params.cursorAfter,\n itemsSeen: params.items.length,\n itemsCreated: stored.created,\n itemsUpdated: stored.updated,\n warnings: params.warnings,\n });\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n finishKnowledgeSyncRun({ runId: run.id, status: 'failed', error: errorMessage });\n throw err;\n }\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,OAAO,QAKc;EACnB,MAAM,eAAe,KAAK,MAAM,UAAU,OAAO,WAAW;EAC5D,MAAM,MAAM,sBAAsB;GAAE,kBAAkB,OAAO;GAAY;GAAc,CAAC;AACxF,MAAI;GACF,MAAM,SAAS,2BAA2B,OAAO,MAAM;AACvD,QAAK,MAAM,UAAU,OAAO,YAAY,OAAO,YAAY;AAC3D,UAAO,uBAAuB;IAC5B,OAAO,IAAI;IACX,QAAQ,OAAO,UAAU,SAAS,YAAY;IAC9C,aAAa,OAAO;IACpB,WAAW,OAAO,MAAM;IACxB,cAAc,OAAO;IACrB,cAAc,OAAO;IACrB,UAAU,OAAO;IAClB,CAAC;WACK,KAAK;GACZ,MAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AACrE,0BAAuB;IAAE,OAAO,IAAI;IAAI,QAAQ;IAAU,OAAO;IAAc,CAAC;AAChF,SAAM;;;CAIV,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"}
@@ -1,8 +1,10 @@
1
1
  import type { MemorySensitivity } from '../agent/memory/types.js';
2
2
  export type KnowledgeSyncRunStatus = 'running' | 'succeeded' | 'partial' | 'failed' | 'cancelled';
3
3
  export type KnowledgeSynthesisStatus = 'pending' | 'processing' | 'completed' | 'failed' | 'ignored';
4
+ export type KnowledgeSynthesisPipeline = 'user_understanding' | 'connected_knowledge';
4
5
  export type KnowledgeRetentionClass = 'ephemeral' | 'bounded' | 'durable';
5
6
  export type KnowledgeAuthorRole = 'user' | 'assistant' | 'third_party' | 'system' | 'unknown';
7
+ export type KnowledgeChangeKind = 'added' | 'modified' | 'deleted';
6
8
  export interface KnowledgeSourceItem {
7
9
  id: string;
8
10
  sourceInstanceId: string;
@@ -17,11 +19,26 @@ export interface KnowledgeSourceItem {
17
19
  metadata: Record<string, unknown>;
18
20
  sensitivity: MemorySensitivity;
19
21
  retentionClass: KnowledgeRetentionClass;
22
+ synthesisPipeline: KnowledgeSynthesisPipeline;
20
23
  synthesisStatus: KnowledgeSynthesisStatus;
24
+ synthesisAttempts: number;
25
+ synthesisClaimedAt?: string;
26
+ synthesisClaimedBy?: string;
27
+ synthesisError?: string;
21
28
  deletedAt?: string;
22
29
  createdAt: string;
23
30
  updatedAt: string;
24
31
  }
32
+ export interface KnowledgeSourceChange {
33
+ sequence: number;
34
+ id: string;
35
+ sourceInstanceId: string;
36
+ sourceItemId: string;
37
+ kind: KnowledgeChangeKind;
38
+ oldHash?: string;
39
+ newHash?: string;
40
+ changedAt: string;
41
+ }
25
42
  export interface KnowledgeSourceItemInput {
26
43
  id?: string;
27
44
  sourceInstanceId: string;
@@ -36,6 +53,7 @@ export interface KnowledgeSourceItemInput {
36
53
  metadata?: Record<string, unknown>;
37
54
  sensitivity?: MemorySensitivity;
38
55
  retentionClass?: KnowledgeRetentionClass;
56
+ synthesisPipeline?: KnowledgeSynthesisPipeline;
39
57
  synthesisStatus?: KnowledgeSynthesisStatus;
40
58
  deletedAt?: string;
41
59
  }
@@ -17,7 +17,8 @@ async function runAudioTranscription(options) {
17
17
  provider,
18
18
  attachment,
19
19
  config: configById.get(provider.id.toLowerCase()),
20
- timeoutMs: options.timeoutMs
20
+ timeoutMs: options.timeoutMs,
21
+ signal: options.signal
21
22
  })
22
23
  });
23
24
  const outputs = result.outputs.map((entry) => ({
@@ -33,7 +34,7 @@ async function runAudioTranscription(options) {
33
34
  };
34
35
  }
35
36
  function buildAudioRequest(params) {
36
- const { provider, attachment, config, timeoutMs } = params;
37
+ const { provider, attachment, config, timeoutMs, signal } = params;
37
38
  if (!config) {
38
39
  log.debug({
39
40
  providerId: provider.id,
@@ -59,7 +60,8 @@ function buildAudioRequest(params) {
59
60
  ...config.language ? { language: config.language } : {},
60
61
  ...config.prompt ? { prompt: config.prompt } : {},
61
62
  ...config.query ? { query: config.query } : {},
62
- timeoutMs
63
+ timeoutMs,
64
+ ...signal ? { signal } : {}
63
65
  };
64
66
  }
65
67
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"audio-transcription-runner.js","names":[],"sources":["../../../src/media-understanding/audio-transcription-runner.ts"],"sourcesContent":["/**\n * Audio transcription entry point.\n *\n * Thin facade over `runCapability({ capability: 'audio' })` that:\n * 1. Builds the per-provider AudioTranscriptionRequest from\n * `cfg.tools.media.audio`.\n * 2. Resolves the api key / base URL / per-provider model from config + env.\n * 3. Returns a normalized `{ transcript, attempts }` shape so the agent /\n * channel layer doesn't see the registry plumbing.\n */\n\nimport { createLogger } from '../utils/logger.js';\n\nimport { runCapability } from './runner.js';\nimport type {\n AudioTranscriptionRequest,\n CapabilityAttachmentInput,\n MediaUnderstandingDecision,\n MediaUnderstandingProvider,\n} from './types.js';\n// Re-export to keep callers' import paths short.\nexport type { AudioTranscriptionRequest, AudioTranscriptionResult } from './types.js';\n\nconst log = createLogger('AudioTranscriptionRunner');\n\nexport interface AudioProviderResolvedConfig {\n /** Provider id (must match a registered MediaUnderstandingProvider id). */\n id: string;\n apiKey?: string;\n baseUrl?: string;\n model?: string;\n language?: string;\n prompt?: string;\n query?: Record<string, string | number | boolean>;\n headers?: Record<string, string>;\n /** Provider-specific extra fields preserved as-is. */\n extra?: Record<string, unknown>;\n}\n\nexport interface RunAudioTranscriptionOptions {\n /** Pre-resolved provider configs in the order to try them. */\n providers: readonly AudioProviderResolvedConfig[];\n /** Audio buffers to transcribe. */\n attachments: readonly CapabilityAttachmentInput[];\n /** Hard timeout per provider call (ms). */\n timeoutMs: number;\n signal?: AbortSignal;\n}\n\nexport interface RunAudioTranscriptionResult {\n /** First successful transcript across attachments (joined when multiple). */\n transcript?: string;\n /** Per-attachment outputs (preserves order). */\n outputs: Array<{ attachmentIndex: number; text: string; provider: string; model?: string }>;\n decision: MediaUnderstandingDecision;\n}\n\nexport async function runAudioTranscription(\n options: RunAudioTranscriptionOptions,\n): Promise<RunAudioTranscriptionResult> {\n if (options.providers.length === 0) {\n log.warn(\n { attachmentCount: options.attachments.length },\n 'No audio providers configured; transcription disabled',\n );\n }\n\n // Index resolved configs by provider id for quick lookup inside buildRequest.\n const configById = new Map<string, AudioProviderResolvedConfig>();\n for (const cfg of options.providers) {\n configById.set(cfg.id.toLowerCase(), cfg);\n }\n\n const result = await runCapability({\n capability: 'audio',\n attachments: options.attachments,\n providerOrder: options.providers.map((cfg) => cfg.id),\n signal: options.signal,\n buildRequest: ({ provider, attachment }) =>\n buildAudioRequest({\n provider,\n attachment,\n config: configById.get(provider.id.toLowerCase()),\n timeoutMs: options.timeoutMs,\n }),\n });\n\n // Aggregate transcripts by attachment order.\n const outputs = result.outputs.map((entry) => ({\n attachmentIndex: entry.attachmentIndex,\n text: entry.text,\n provider: entry.provider,\n ...(entry.model ? { model: entry.model } : {}),\n }));\n\n const transcript =\n outputs.length === 0\n ? undefined\n : outputs\n .slice()\n .sort((a, b) => a.attachmentIndex - b.attachmentIndex)\n .map((o) => o.text)\n .join('\\n')\n .trim() || undefined;\n\n return { transcript, outputs, decision: result.decision };\n}\n\nfunction buildAudioRequest(params: {\n provider: MediaUnderstandingProvider;\n attachment: CapabilityAttachmentInput;\n config?: AudioProviderResolvedConfig;\n timeoutMs: number;\n}): AudioTranscriptionRequest | undefined {\n const { provider, attachment, config, timeoutMs } = params;\n if (!config) {\n log.debug(\n { providerId: provider.id, attachmentIndex: attachment.attachmentIndex },\n `No resolved config for provider \"${provider.id}\"; skipping`,\n );\n return undefined;\n }\n const requiresApiKey = provider.requiresApiKey !== false;\n if (requiresApiKey && !config.apiKey) {\n log.debug(\n { providerId: provider.id, attachmentIndex: attachment.attachmentIndex },\n `Provider \"${provider.id}\" has no apiKey; skipping`,\n );\n return undefined;\n }\n return {\n buffer: attachment.buffer,\n fileName: attachment.fileName,\n ...(attachment.mime ? { mime: attachment.mime } : {}),\n ...(config.apiKey ? { apiKey: config.apiKey } : {}),\n ...(config.baseUrl ? { baseUrl: config.baseUrl } : {}),\n ...(config.headers ? { headers: config.headers } : {}),\n ...(config.model ?? provider.defaultModels?.audio\n ? { model: config.model ?? provider.defaultModels?.audio }\n : {}),\n ...(config.language ? { language: config.language } : {}),\n ...(config.prompt ? { prompt: config.prompt } : {}),\n ...(config.query ? { query: config.query } : {}),\n timeoutMs,\n };\n}\n"],"mappings":";;;;aAWkD;AAYlD,MAAM,MAAM,aAAa,2BAA2B;AAkCpD,eAAsB,sBACpB,SACsC;AACtC,KAAI,QAAQ,UAAU,WAAW,EAC/B,KAAI,KACF,EAAE,iBAAiB,QAAQ,YAAY,QAAQ,EAC/C,wDACD;CAIH,MAAM,6BAAa,IAAI,KAA0C;AACjE,MAAK,MAAM,OAAO,QAAQ,UACxB,YAAW,IAAI,IAAI,GAAG,aAAa,EAAE,IAAI;CAG3C,MAAM,SAAS,MAAM,cAAc;EACjC,YAAY;EACZ,aAAa,QAAQ;EACrB,eAAe,QAAQ,UAAU,KAAK,QAAQ,IAAI,GAAG;EACrD,QAAQ,QAAQ;EAChB,eAAe,EAAE,UAAU,iBACzB,kBAAkB;GAChB;GACA;GACA,QAAQ,WAAW,IAAI,SAAS,GAAG,aAAa,CAAC;GACjD,WAAW,QAAQ;GACpB,CAAC;EACL,CAAC;CAGF,MAAM,UAAU,OAAO,QAAQ,KAAK,WAAW;EAC7C,iBAAiB,MAAM;EACvB,MAAM,MAAM;EACZ,UAAU,MAAM;EAChB,GAAI,MAAM,QAAQ,EAAE,OAAO,MAAM,OAAO,GAAG,EAAE;EAC9C,EAAE;AAYH,QAAO;EAAE,YATP,QAAQ,WAAW,IACf,KAAA,IACA,QACG,OAAO,CACP,MAAM,GAAG,MAAM,EAAE,kBAAkB,EAAE,gBAAgB,CACrD,KAAK,MAAM,EAAE,KAAK,CAClB,KAAK,KAAK,CACV,MAAM,IAAI,KAAA;EAEE;EAAS,UAAU,OAAO;EAAU;;AAG3D,SAAS,kBAAkB,QAKe;CACxC,MAAM,EAAE,UAAU,YAAY,QAAQ,cAAc;AACpD,KAAI,CAAC,QAAQ;AACX,MAAI,MACF;GAAE,YAAY,SAAS;GAAI,iBAAiB,WAAW;GAAiB,EACxE,oCAAoC,SAAS,GAAG,aACjD;AACD;;AAGF,KADuB,SAAS,mBAAmB,SAC7B,CAAC,OAAO,QAAQ;AACpC,MAAI,MACF;GAAE,YAAY,SAAS;GAAI,iBAAiB,WAAW;GAAiB,EACxE,aAAa,SAAS,GAAG,2BAC1B;AACD;;AAEF,QAAO;EACL,QAAQ,WAAW;EACnB,UAAU,WAAW;EACrB,GAAI,WAAW,OAAO,EAAE,MAAM,WAAW,MAAM,GAAG,EAAE;EACpD,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,QAAQ,GAAG,EAAE;EAClD,GAAI,OAAO,UAAU,EAAE,SAAS,OAAO,SAAS,GAAG,EAAE;EACrD,GAAI,OAAO,UAAU,EAAE,SAAS,OAAO,SAAS,GAAG,EAAE;EACrD,GAAI,OAAO,SAAS,SAAS,eAAe,QACxC,EAAE,OAAO,OAAO,SAAS,SAAS,eAAe,OAAO,GACxD,EAAE;EACN,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,UAAU,GAAG,EAAE;EACxD,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,QAAQ,GAAG,EAAE;EAClD,GAAI,OAAO,QAAQ,EAAE,OAAO,OAAO,OAAO,GAAG,EAAE;EAC/C;EACD"}
1
+ {"version":3,"file":"audio-transcription-runner.js","names":[],"sources":["../../../src/media-understanding/audio-transcription-runner.ts"],"sourcesContent":["/**\n * Audio transcription entry point.\n *\n * Thin facade over `runCapability({ capability: 'audio' })` that:\n * 1. Builds the per-provider AudioTranscriptionRequest from\n * `cfg.tools.media.audio`.\n * 2. Resolves the api key / base URL / per-provider model from config + env.\n * 3. Returns a normalized `{ transcript, attempts }` shape so the agent /\n * channel layer doesn't see the registry plumbing.\n */\n\nimport { createLogger } from '../utils/logger.js';\n\nimport { runCapability } from './runner.js';\nimport type {\n AudioTranscriptionRequest,\n CapabilityAttachmentInput,\n MediaUnderstandingDecision,\n MediaUnderstandingProvider,\n} from './types.js';\n// Re-export to keep callers' import paths short.\nexport type { AudioTranscriptionRequest, AudioTranscriptionResult } from './types.js';\n\nconst log = createLogger('AudioTranscriptionRunner');\n\nexport interface AudioProviderResolvedConfig {\n /** Provider id (must match a registered MediaUnderstandingProvider id). */\n id: string;\n apiKey?: string;\n baseUrl?: string;\n model?: string;\n language?: string;\n prompt?: string;\n query?: Record<string, string | number | boolean>;\n headers?: Record<string, string>;\n /** Provider-specific extra fields preserved as-is. */\n extra?: Record<string, unknown>;\n}\n\nexport interface RunAudioTranscriptionOptions {\n /** Pre-resolved provider configs in the order to try them. */\n providers: readonly AudioProviderResolvedConfig[];\n /** Audio buffers to transcribe. */\n attachments: readonly CapabilityAttachmentInput[];\n /** Hard timeout per provider call (ms). */\n timeoutMs: number;\n signal?: AbortSignal;\n}\n\nexport interface RunAudioTranscriptionResult {\n /** First successful transcript across attachments (joined when multiple). */\n transcript?: string;\n /** Per-attachment outputs (preserves order). */\n outputs: Array<{ attachmentIndex: number; text: string; provider: string; model?: string }>;\n decision: MediaUnderstandingDecision;\n}\n\nexport async function runAudioTranscription(\n options: RunAudioTranscriptionOptions,\n): Promise<RunAudioTranscriptionResult> {\n if (options.providers.length === 0) {\n log.warn(\n { attachmentCount: options.attachments.length },\n 'No audio providers configured; transcription disabled',\n );\n }\n\n // Index resolved configs by provider id for quick lookup inside buildRequest.\n const configById = new Map<string, AudioProviderResolvedConfig>();\n for (const cfg of options.providers) {\n configById.set(cfg.id.toLowerCase(), cfg);\n }\n\n const result = await runCapability({\n capability: 'audio',\n attachments: options.attachments,\n providerOrder: options.providers.map((cfg) => cfg.id),\n signal: options.signal,\n buildRequest: ({ provider, attachment }) =>\n buildAudioRequest({\n provider,\n attachment,\n config: configById.get(provider.id.toLowerCase()),\n timeoutMs: options.timeoutMs,\n signal: options.signal,\n }),\n });\n\n // Aggregate transcripts by attachment order.\n const outputs = result.outputs.map((entry) => ({\n attachmentIndex: entry.attachmentIndex,\n text: entry.text,\n provider: entry.provider,\n ...(entry.model ? { model: entry.model } : {}),\n }));\n\n const transcript =\n outputs.length === 0\n ? undefined\n : outputs\n .slice()\n .sort((a, b) => a.attachmentIndex - b.attachmentIndex)\n .map((o) => o.text)\n .join('\\n')\n .trim() || undefined;\n\n return { transcript, outputs, decision: result.decision };\n}\n\nfunction buildAudioRequest(params: {\n provider: MediaUnderstandingProvider;\n attachment: CapabilityAttachmentInput;\n config?: AudioProviderResolvedConfig;\n timeoutMs: number;\n signal?: AbortSignal;\n}): AudioTranscriptionRequest | undefined {\n const { provider, attachment, config, timeoutMs, signal } = params;\n if (!config) {\n log.debug(\n { providerId: provider.id, attachmentIndex: attachment.attachmentIndex },\n `No resolved config for provider \"${provider.id}\"; skipping`,\n );\n return undefined;\n }\n const requiresApiKey = provider.requiresApiKey !== false;\n if (requiresApiKey && !config.apiKey) {\n log.debug(\n { providerId: provider.id, attachmentIndex: attachment.attachmentIndex },\n `Provider \"${provider.id}\" has no apiKey; skipping`,\n );\n return undefined;\n }\n return {\n buffer: attachment.buffer,\n fileName: attachment.fileName,\n ...(attachment.mime ? { mime: attachment.mime } : {}),\n ...(config.apiKey ? { apiKey: config.apiKey } : {}),\n ...(config.baseUrl ? { baseUrl: config.baseUrl } : {}),\n ...(config.headers ? { headers: config.headers } : {}),\n ...(config.model ?? provider.defaultModels?.audio\n ? { model: config.model ?? provider.defaultModels?.audio }\n : {}),\n ...(config.language ? { language: config.language } : {}),\n ...(config.prompt ? { prompt: config.prompt } : {}),\n ...(config.query ? { query: config.query } : {}),\n timeoutMs,\n ...(signal ? { signal } : {}),\n };\n}\n"],"mappings":";;;;aAWkD;AAYlD,MAAM,MAAM,aAAa,2BAA2B;AAkCpD,eAAsB,sBACpB,SACsC;AACtC,KAAI,QAAQ,UAAU,WAAW,EAC/B,KAAI,KACF,EAAE,iBAAiB,QAAQ,YAAY,QAAQ,EAC/C,wDACD;CAIH,MAAM,6BAAa,IAAI,KAA0C;AACjE,MAAK,MAAM,OAAO,QAAQ,UACxB,YAAW,IAAI,IAAI,GAAG,aAAa,EAAE,IAAI;CAG3C,MAAM,SAAS,MAAM,cAAc;EACjC,YAAY;EACZ,aAAa,QAAQ;EACrB,eAAe,QAAQ,UAAU,KAAK,QAAQ,IAAI,GAAG;EACrD,QAAQ,QAAQ;EAChB,eAAe,EAAE,UAAU,iBACzB,kBAAkB;GAChB;GACA;GACA,QAAQ,WAAW,IAAI,SAAS,GAAG,aAAa,CAAC;GACjD,WAAW,QAAQ;GACnB,QAAQ,QAAQ;GACjB,CAAC;EACL,CAAC;CAGF,MAAM,UAAU,OAAO,QAAQ,KAAK,WAAW;EAC7C,iBAAiB,MAAM;EACvB,MAAM,MAAM;EACZ,UAAU,MAAM;EAChB,GAAI,MAAM,QAAQ,EAAE,OAAO,MAAM,OAAO,GAAG,EAAE;EAC9C,EAAE;AAYH,QAAO;EAAE,YATP,QAAQ,WAAW,IACf,KAAA,IACA,QACG,OAAO,CACP,MAAM,GAAG,MAAM,EAAE,kBAAkB,EAAE,gBAAgB,CACrD,KAAK,MAAM,EAAE,KAAK,CAClB,KAAK,KAAK,CACV,MAAM,IAAI,KAAA;EAEE;EAAS,UAAU,OAAO;EAAU;;AAG3D,SAAS,kBAAkB,QAMe;CACxC,MAAM,EAAE,UAAU,YAAY,QAAQ,WAAW,WAAW;AAC5D,KAAI,CAAC,QAAQ;AACX,MAAI,MACF;GAAE,YAAY,SAAS;GAAI,iBAAiB,WAAW;GAAiB,EACxE,oCAAoC,SAAS,GAAG,aACjD;AACD;;AAGF,KADuB,SAAS,mBAAmB,SAC7B,CAAC,OAAO,QAAQ;AACpC,MAAI,MACF;GAAE,YAAY,SAAS;GAAI,iBAAiB,WAAW;GAAiB,EACxE,aAAa,SAAS,GAAG,2BAC1B;AACD;;AAEF,QAAO;EACL,QAAQ,WAAW;EACnB,UAAU,WAAW;EACrB,GAAI,WAAW,OAAO,EAAE,MAAM,WAAW,MAAM,GAAG,EAAE;EACpD,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,QAAQ,GAAG,EAAE;EAClD,GAAI,OAAO,UAAU,EAAE,SAAS,OAAO,SAAS,GAAG,EAAE;EACrD,GAAI,OAAO,UAAU,EAAE,SAAS,OAAO,SAAS,GAAG,EAAE;EACrD,GAAI,OAAO,SAAS,SAAS,eAAe,QACxC,EAAE,OAAO,OAAO,SAAS,SAAS,eAAe,OAAO,GACxD,EAAE;EACN,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,UAAU,GAAG,EAAE;EACxD,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,QAAQ,GAAG,EAAE;EAClD,GAAI,OAAO,QAAQ,EAAE,OAAO,OAAO,OAAO,GAAG,EAAE;EAC/C;EACA,GAAI,SAAS,EAAE,QAAQ,GAAG,EAAE;EAC7B"}
@@ -88,6 +88,7 @@ async function runCapability(options) {
88
88
  });
89
89
  continue;
90
90
  }
91
+ const startedAt = Date.now();
91
92
  try {
92
93
  const callResult = await method(request);
93
94
  const text = callResult.text?.trim() ?? "";
@@ -97,7 +98,8 @@ async function runCapability(options) {
97
98
  type: "provider",
98
99
  outcome: "failed",
99
100
  reason: "empty transcription/description text",
100
- model: callResult.model
101
+ model: callResult.model,
102
+ latencyMs: Date.now() - startedAt
101
103
  });
102
104
  continue;
103
105
  }
@@ -105,7 +107,8 @@ async function runCapability(options) {
105
107
  provider: provider.id,
106
108
  type: "provider",
107
109
  outcome: "success",
108
- model: callResult.model
110
+ model: callResult.model,
111
+ latencyMs: Date.now() - startedAt
109
112
  };
110
113
  attempts.push(chosen);
111
114
  outputs.push({
@@ -117,6 +120,7 @@ async function runCapability(options) {
117
120
  });
118
121
  break;
119
122
  } catch (error) {
123
+ if (options.signal?.aborted) throw error;
120
124
  const reason = error instanceof Error ? error.message : String(error);
121
125
  log.warn({
122
126
  err: error,
@@ -128,7 +132,8 @@ async function runCapability(options) {
128
132
  provider: provider.id,
129
133
  type: "provider",
130
134
  outcome: "failed",
131
- reason
135
+ reason,
136
+ latencyMs: Date.now() - startedAt
132
137
  });
133
138
  }
134
139
  }