@xopcai/xopc 0.0.388 → 0.0.390

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 (644) hide show
  1. package/dist/browser-ext/_locales/en/messages.json +6 -1
  2. package/dist/browser-ext/_locales/zh_CN/messages.json +6 -1
  3. package/dist/browser-ext/dist/assets/{page-context-BeworyNB.js → page-context-A5RCibM_.js} +1 -1
  4. package/dist/browser-ext/dist/background.js +1 -1
  5. package/dist/browser-ext/dist/sidepanel.html +1 -1
  6. package/dist/browser-ext/dist/sidepanel.js +98 -53
  7. package/dist/browser-ext/manifest.json +1 -1
  8. package/dist/extensions/feishu/src/adapters/cli-login.js +3 -3
  9. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  10. package/dist/extensions/telegram/src/inbound-processor.js +2 -2
  11. package/dist/extensions/telegram/src/outbound-sender.js +1 -1
  12. package/dist/extensions/telegram/src/plugin.js +7 -5
  13. package/dist/extensions/telegram/xopc.extension.json +1 -1
  14. package/dist/extensions/weixin/src/api/api.js +2 -2
  15. package/dist/extensions/weixin/src/auth/accounts.js +12 -12
  16. package/dist/extensions/weixin/src/messaging/debug-mode.js +5 -5
  17. package/dist/extensions/weixin/src/messaging/inbound.js +11 -11
  18. package/dist/gateway/static/root/assets/{activity-store-CB2X4Gmu.js → activity-store-DGMAYkw8.js} +1 -1
  19. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-44LqtGte.js → agent-avatar-dicebear-B4AsZzJR.js} +1 -1
  20. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-9NUY1sO3.js +1 -0
  21. package/dist/gateway/static/root/assets/agent-plugin-dialog-CNc6ntzP.js +1 -0
  22. package/dist/gateway/static/root/assets/agents-QNY9Vkrf.js +77 -0
  23. package/dist/gateway/static/root/assets/{agents-admin-api-BkULgC6Q.js → agents-admin-api-DxdaiFWn.js} +1 -1
  24. package/dist/gateway/static/root/assets/app-management-settings-panel-DHRfLkYD.js +1 -0
  25. package/dist/gateway/static/root/assets/{appearance-settings-CYofu-su.js → appearance-settings-DtKSapgb.js} +1 -1
  26. package/dist/gateway/static/root/assets/{apps-page-CHjWvDjk.js → apps-page-B9kuRt_z.js} +1 -1
  27. package/dist/gateway/static/root/assets/{archive-plugin-De0ND0oA.js → archive-plugin-AgySTXp_.js} +1 -1
  28. package/dist/gateway/static/root/assets/{automations-page-BIF0skon.js → automations-page-D1o7ZtUW.js} +1 -1
  29. package/dist/gateway/static/root/assets/automations-workspace-BJenz0P1.js +6 -0
  30. package/dist/gateway/static/root/assets/{binary-plugins-Do535ZGW.js → binary-plugins-A1AXOsO6.js} +1 -1
  31. package/dist/gateway/static/root/assets/{block-editor-C_RD603p.js → block-editor-DUNLkLKF.js} +3 -3
  32. package/dist/gateway/static/root/assets/{browser-automation-inputs-B9M1RYTm.js → browser-automation-inputs-BvUC6OiW.js} +1 -1
  33. package/dist/gateway/static/root/assets/browser-automations-page-Dq2LlVMh.js +3 -0
  34. package/dist/gateway/static/root/assets/browser-settings-page-BOZ-1g51.js +3 -0
  35. package/dist/gateway/static/root/assets/{capabilities-CW389yo6.js → capabilities-BkCutK0V.js} +1 -1
  36. package/dist/gateway/static/root/assets/{capabilities-BX1rCiVm.js → capabilities-D61uSJPy.js} +1 -1
  37. package/dist/gateway/static/root/assets/capabilities-page-BDP6gzlv.js +2 -0
  38. package/dist/gateway/static/root/assets/capabilities-settings-panel-D6PL3Mfl.js +8 -0
  39. package/dist/gateway/static/root/assets/{capability-header-actions-Chuhscdb.js → capability-header-actions-D9uGs4Pw.js} +1 -1
  40. package/dist/gateway/static/root/assets/channels-xb7n8rwF.js +1 -0
  41. package/dist/gateway/static/root/assets/chat-terminal-dock-Dgn09YDs.js +36 -0
  42. package/dist/gateway/static/root/assets/{computer-settings-page-Af00Kjc0.js → computer-settings-page-C66P4ifT.js} +1 -1
  43. package/dist/gateway/static/root/assets/{connector-service-page-3W0_7-4L.js → connector-service-page-Dp35XdYf.js} +1 -1
  44. package/dist/gateway/static/root/assets/connectors-page-BHcRxYib.js +1 -0
  45. package/dist/gateway/static/root/assets/{date-picker-DBgZBmik.js → date-picker-CddHY982.js} +1 -1
  46. package/dist/gateway/static/root/assets/{dependency-picker-BDJ406kH.js → dependency-picker-Ob6BZTqv.js} +1 -1
  47. package/dist/gateway/static/root/assets/{desktop-pet-Do1XPn6U.js → desktop-pet-dmwCV-I4.js} +1 -1
  48. package/dist/gateway/static/root/assets/{desktop-pet-settings-LKeVh6OH.js → desktop-pet-settings-B-TBkZAZ.js} +1 -1
  49. package/dist/gateway/static/root/assets/device-pairing-wizard-SWHwRgG3.js +1 -0
  50. package/dist/gateway/static/root/assets/{directory-picker-path-field-BMLHoL6g.js → directory-picker-path-field-6VZa4fT1.js} +1 -1
  51. package/dist/gateway/static/root/assets/{extension-debug-page-B0wTBCx4.js → extension-debug-page-C0_njMva.js} +1 -1
  52. package/dist/gateway/static/root/assets/{extension-page-vR2r4uUB.js → extension-page-BeBLMFmW.js} +1 -1
  53. package/dist/gateway/static/root/assets/{extension-provider-CJZ5EVpQ.js → extension-provider-DWI0KAKT.js} +1 -1
  54. package/dist/gateway/static/root/assets/extension-settings-page-BiLUwoKx.js +1 -0
  55. package/dist/gateway/static/root/assets/{gateway-config-swr-D0tBjSgj.js → gateway-config-swr-CmYcOqhb.js} +1 -1
  56. package/dist/gateway/static/root/assets/{gateway-realtime-BnHraJ3O.js → gateway-realtime-Ci1Jst5g.js} +1 -1
  57. package/dist/gateway/static/root/assets/gateway-realtime-store-BMUiUQMk.js +1 -0
  58. package/dist/gateway/static/root/assets/gateway-settings-CzWT_v09.js +1 -0
  59. package/dist/gateway/static/root/assets/{gateway-startup-retry-C1DQsIH3.js → gateway-startup-retry-C-BG5M7H.js} +1 -1
  60. package/dist/gateway/static/root/assets/{highlighted-body-KQOG7T2V-BM__yiMn.js → highlighted-body-KQOG7T2V-CsA7lCVc.js} +1 -1
  61. package/dist/gateway/static/root/assets/home-page-BeXJfxsg.js +2 -0
  62. package/dist/gateway/static/root/assets/image-generation-api-B_DqCwtV.js +1 -0
  63. package/dist/gateway/static/root/assets/imports-page-oAvAF9QS.js +1 -0
  64. package/dist/gateway/static/root/assets/index-W9ls-0Yd.css +1 -0
  65. package/dist/gateway/static/root/assets/index-xTL-vb51.js +260 -0
  66. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DpyqH2cP.js → keyboard-shortcuts-settings--MjYe-Pb.js} +1 -1
  67. package/dist/gateway/static/root/assets/{local-app-workbench-page-B4hIoxV8.js → local-app-workbench-page-DL33dtd7.js} +1 -1
  68. package/dist/gateway/static/root/assets/{local-apps-page-S7lUpENM.js → local-apps-page-DOa7mxjB.js} +1 -1
  69. package/dist/gateway/static/root/assets/{local-session-drafts-Be4BGM4Z.js → local-session-drafts-DAtLkTPg.js} +1 -1
  70. package/dist/gateway/static/root/assets/{locale-store-uRu_DsWm.js → locale-store-DMy9W6IG.js} +1 -1
  71. package/dist/gateway/static/root/assets/logs-page-C-GbTYsM.js +2 -0
  72. package/dist/gateway/static/root/assets/management-settings-C0TzuD3-.js +1 -0
  73. package/dist/gateway/static/root/assets/{markdown-view-CBjl-XEc.js → markdown-view-wyOHdXEg.js} +1 -1
  74. package/dist/gateway/static/root/assets/{media-plugins-BombFqsX.js → media-plugins-Pb2zr_-L.js} +1 -1
  75. package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-BxyGGa4D.js +1 -0
  76. package/dist/gateway/static/root/assets/messages-O0BEUKnx.js +3 -0
  77. package/dist/gateway/static/root/assets/models-hub-cache-DdH1MODX.js +1 -0
  78. package/dist/gateway/static/root/assets/note-detail-panel-BFpEqskQ.js +5 -0
  79. package/dist/gateway/static/root/assets/{notes-api-BlGP533W.js → notes-api-CYt2pGsm.js} +1 -1
  80. package/dist/gateway/static/root/assets/notes-page-h-qqFJ6Z.js +8 -0
  81. package/dist/gateway/static/root/assets/{page-context-capture-button-C2bSXVbz.js → page-context-capture-button-3uj5EcQC.js} +1 -1
  82. package/dist/gateway/static/root/assets/personal-page-BGyW6cdt.js +1 -0
  83. package/dist/gateway/static/root/assets/{product-open-page-Cn16lm5l.js → product-open-page-hI13tPS1.js} +1 -1
  84. package/dist/gateway/static/root/assets/{product-preview-content-CowgeuoG.js → product-preview-content-lT_in0-Q.js} +1 -1
  85. package/dist/gateway/static/root/assets/project-detail-page-Baj7fQ7N.js +1 -0
  86. package/dist/gateway/static/root/assets/projects-page-D7DyQFU3.js +1 -0
  87. package/dist/gateway/static/root/assets/{registry-api-CYqA7bfl.js → registry-api-CgQrCqL6.js} +1 -1
  88. package/dist/gateway/static/root/assets/remote-access-hub-DU_d93Tm.js +1 -0
  89. package/dist/gateway/static/root/assets/{runtime-tools-api-zzoxjSuR.js → runtime-tools-api-D12qVKeC.js} +1 -1
  90. package/dist/gateway/static/root/assets/runtime-tools-settings-panel-DOSPOfCU.js +1 -0
  91. package/dist/gateway/static/root/assets/scenes-page-swyUIF5A.js +2 -0
  92. package/dist/gateway/static/root/assets/{schema-form-I6pzJJzg.js → schema-form-CwOFgsyh.js} +1 -1
  93. package/dist/gateway/static/root/assets/{send-session-input-C293-Hbx.js → send-session-input-nH8Cw0US.js} +1 -1
  94. package/dist/gateway/static/root/assets/{session-api-CzVTrG8n.js → session-api-B9HrwF-c.js} +1 -1
  95. package/dist/gateway/static/root/assets/session-manager-aXqXuqDX.js +16 -0
  96. package/dist/gateway/static/root/assets/sessions-page-CI_PJmlX.js +1 -0
  97. package/dist/gateway/static/root/assets/settings-advanced-gate-DCVaeBLW.js +1 -0
  98. package/dist/gateway/static/root/assets/{settings-page-Dy5oQDbx.js → settings-page-BN70wE6R.js} +1 -1
  99. package/dist/gateway/static/root/assets/setup-status-panel-CHzcVRi-.js +1 -0
  100. package/dist/gateway/static/root/assets/{share-link-dialog-BKGI8Kr0.js → share-link-dialog-B1TDyhPt.js} +1 -1
  101. package/dist/gateway/static/root/assets/{share-preview-page-BF2WaO43.js → share-preview-page-Br-eAZaP.js} +1 -1
  102. package/dist/gateway/static/root/assets/{shares-api-B0HlMAzi.js → shares-api-Bl1ZBh5S.js} +1 -1
  103. package/dist/gateway/static/root/assets/shares-settings-jgCC_E4Y.js +1 -0
  104. package/dist/gateway/static/root/assets/{skill-api-RIjxQs-Y.js → skill-api-ClUw3SRC.js} +1 -1
  105. package/dist/gateway/static/root/assets/{skill-reload-api-CEJx5rPd.js → skill-reload-api--1BfIPzb.js} +1 -1
  106. package/dist/gateway/static/root/assets/skills-page-C9oRZSuL.js +2 -0
  107. package/dist/gateway/static/root/assets/{system-settings-panel-C8aLy8T_.js → system-settings-panel-tWrqu7ai.js} +1 -1
  108. package/dist/gateway/static/root/assets/{task-detail-page-o1O2IDVP.js → task-detail-page-BYRW7Rrr.js} +2 -2
  109. package/dist/gateway/static/root/assets/{task-expandable-content-C9ohICpw.js → task-expandable-content-D2t4ahzR.js} +1 -1
  110. package/dist/gateway/static/root/assets/{theme-store-BUfzeDvL.js → theme-store-BBLjE0fi.js} +1 -1
  111. package/dist/gateway/static/root/assets/{tracing-settings-page-C2q5B3Kp.js → tracing-settings-page-5ATxQH5c.js} +1 -1
  112. package/dist/gateway/static/root/assets/{tunnel-api-JkDu1wiC.js → tunnel-api-CF1Qh4wU.js} +1 -1
  113. package/dist/gateway/static/root/assets/{usage-page-B8K6Y4ro.js → usage-page-CuEHzXil.js} +1 -1
  114. package/dist/gateway/static/root/assets/{use-autosave-DgbCgsao.js → use-autosave-tY3keIbm.js} +1 -1
  115. package/dist/gateway/static/root/assets/{use-composer-attachments-rgW7h4sD.js → use-composer-attachments-CXsocZjt.js} +1 -1
  116. package/dist/gateway/static/root/assets/{use-file-preview-expanded-DSKIxfz9.js → use-file-preview-expanded-CEsxnDnQ.js} +2 -2
  117. package/dist/gateway/static/root/assets/user-model-page-Dvt5TIZ6.js +2 -0
  118. package/dist/gateway/static/root/assets/{voice-api-key-field-4AIkbm9R.js → voice-api-key-field-COTNLUU3.js} +1 -1
  119. package/dist/gateway/static/root/assets/{voice-config-api-Kw1pYlLN.js → voice-config-api-DrxBjSja.js} +1 -1
  120. package/dist/gateway/static/root/assets/voice-transcribe-api-B47j0_xA.js +1 -0
  121. package/dist/gateway/static/root/assets/{work-discovery-overlay-BshsEDRO.js → work-discovery-overlay-PByMJrhV.js} +1 -1
  122. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CRG3paWy.js → workflow-run-setup-panel-CSUkMo63.js} +2 -2
  123. package/dist/gateway/static/root/assets/{workflows-page-c-AoSVzm.js → workflows-page-BUDvFo3R.js} +3 -3
  124. package/dist/gateway/static/root/assets/{workspace-api-JWHOFos6.js → workspace-api-Bmx1O449.js} +2 -2
  125. package/dist/gateway/static/root/assets/{xopc-cloud-account-card-PDSIicr1.js → xopc-cloud-account-card-DVsAbvwP.js} +1 -1
  126. package/dist/gateway/static/root/index.html +28 -27
  127. package/dist/package.js +1 -1
  128. package/dist/packages/gateway-contract/src/clarifications.js +79 -2
  129. package/dist/packages/gateway-contract/src/discussions.js +3 -2
  130. package/dist/packages/gateway-contract/src/index.js +4 -0
  131. package/dist/packages/gateway-contract/src/provider-setup.js +6 -0
  132. package/dist/packages/gateway-contract/src/recording-outcome.js +6 -0
  133. package/dist/packages/image-providers/src/catalog.js +10 -0
  134. package/dist/packages/image-providers/src/execute.js +5 -1
  135. package/dist/packages/image-providers/src/validation.js +19 -1
  136. package/dist/packages/realtime-protocol/src/voice.js +13 -2
  137. package/dist/src/agent/agent-manager.js +25 -21
  138. package/dist/src/agent/agent-scope.js +2 -2
  139. package/dist/src/agent/background-review/prompts.js +5 -1
  140. package/dist/src/agent/background-review/run-background-review.d.ts +0 -1
  141. package/dist/src/agent/background-review/run-background-review.js +60 -14
  142. package/dist/src/agent/child-agent-factory.js +1 -1
  143. package/dist/src/agent/coding/repository-instructions.js +1 -1
  144. package/dist/src/agent/context/coordinator.js +2 -2
  145. package/dist/src/agent/context/execution-context.js +4 -4
  146. package/dist/src/agent/context/execution-scope.js +1 -1
  147. package/dist/src/agent/context/project-context.js +3 -3
  148. package/dist/src/agent/data-acquisition/service.js +1 -1
  149. package/dist/src/agent/embedded/codemode-extension.js +1 -1
  150. package/dist/src/agent/embedded/run-for-session.js +31 -8
  151. package/dist/src/agent/embedded/run-turn.js +26 -14
  152. package/dist/src/agent/embedded/session-runner.d.ts +4 -3
  153. package/dist/src/agent/embedded/session-runner.js +9 -4
  154. package/dist/src/agent/embedded/session-tool-result-guard.js +2 -2
  155. package/dist/src/agent/embedded/tool-result-truncation.js +1 -1
  156. package/dist/src/agent/embedded/xopc-stream-bridge.js +3 -0
  157. package/dist/src/agent/embedded/xopc-tools-bridge.js +1 -1
  158. package/dist/src/agent/external-tools/cliProvider.js +3 -3
  159. package/dist/src/agent/external-tools/composio-provider.js +2 -2
  160. package/dist/src/agent/external-tools/endpoint-provider.js +4 -4
  161. package/dist/src/agent/external-tools/gateway-tools.js +2 -2
  162. package/dist/src/agent/image/generation/openai-images-provider.js +1 -1
  163. package/dist/src/agent/image/generation/runtime.js +13 -15
  164. package/dist/src/agent/image/index.js +1 -1
  165. package/dist/src/agent/image/load-image-media.js +1 -1
  166. package/dist/src/agent/image/understanding/runtime.js +5 -0
  167. package/dist/src/agent/inbound/attachment-pipeline.js +3 -3
  168. package/dist/src/agent/inbound/inbound-loop.d.ts +1 -15
  169. package/dist/src/agent/inbound/inbound-loop.js +7 -2
  170. package/dist/src/agent/index.js +3 -3
  171. package/dist/src/agent/mcp/connection-drafts.d.ts +50 -0
  172. package/dist/src/agent/mcp/connection-drafts.js +278 -0
  173. package/dist/src/agent/mcp/connection-errors.d.ts +3 -0
  174. package/dist/src/agent/mcp/connection-errors.js +32 -0
  175. package/dist/src/agent/mcp/connection-setup.d.ts +7 -2
  176. package/dist/src/agent/mcp/connection-setup.js +45 -23
  177. package/dist/src/agent/mcp/credential-store.d.ts +6 -0
  178. package/dist/src/agent/mcp/credential-store.js +24 -0
  179. package/dist/src/agent/mcp/native-mcp.d.ts +6 -1
  180. package/dist/src/agent/mcp/native-mcp.js +6 -0
  181. package/dist/src/agent/mcp/tool-catalog.d.ts +7 -2
  182. package/dist/src/agent/mcp/tool-catalog.js +25 -15
  183. package/dist/src/agent/memory/compaction.js +5 -1
  184. package/dist/src/agent/memory/context-budget.js +1 -1
  185. package/dist/src/agent/memory/context-recovery.js +1 -1
  186. package/dist/src/agent/memory/idle-compaction-scheduler.js +3 -1
  187. package/dist/src/agent/memory/index.js +1 -1
  188. package/dist/src/agent/models/manager.d.ts +1 -0
  189. package/dist/src/agent/models/manager.js +4 -2
  190. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +1 -6
  191. package/dist/src/agent/orchestration/agent-orchestrator.js +5 -0
  192. package/dist/src/agent/orchestration/llm-turn-retry.js +1 -1
  193. package/dist/src/agent/prompt/response-language.js +1 -1
  194. package/dist/src/agent/prompt/service-prompt-builder.js +3 -3
  195. package/dist/src/agent/sandbox/exec-policy.js +1 -1
  196. package/dist/src/agent/service/direct-turn-helpers.js +4 -4
  197. package/dist/src/agent/service/process-direct-one-shot.js +5 -0
  198. package/dist/src/agent/service/process-direct-streaming.d.ts +1 -0
  199. package/dist/src/agent/service/process-direct-streaming.js +23 -7
  200. package/dist/src/agent/service/webchat-tts.js +2 -2
  201. package/dist/src/agent/service.js +21 -21
  202. package/dist/src/agent/session/session-config-service.js +3 -3
  203. package/dist/src/agent/session/session-hydrator.js +1 -1
  204. package/dist/src/agent/session/session-inspector.js +1 -1
  205. package/dist/src/agent/skills/filesystem-watcher.js +1 -1
  206. package/dist/src/agent/skills/hub-pull.js +2 -2
  207. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +1 -1
  208. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +1 -1
  209. package/dist/src/agent/source-context/index.js +1 -1
  210. package/dist/src/agent/tasks/task-judge-service.js +7 -7
  211. package/dist/src/agent/tools/clarify-tool.d.ts +2 -3
  212. package/dist/src/agent/tools/clarify-tool.js +15 -9
  213. package/dist/src/agent/tools/cli-clarify.d.ts +0 -3
  214. package/dist/src/agent/tools/cli-clarify.js +18 -32
  215. package/dist/src/agent/tools/create-share-tool.js +3 -3
  216. package/dist/src/agent/tools/dataBatch.js +1 -1
  217. package/dist/src/agent/tools/delegate-tool.js +3 -3
  218. package/dist/src/agent/tools/executor.js +1 -1
  219. package/dist/src/agent/tools/factory.js +19 -19
  220. package/dist/src/agent/tools/image-generate-tool.js +8 -4
  221. package/dist/src/agent/tools/index.js +6 -6
  222. package/dist/src/agent/tools/list-dir.js +1 -1
  223. package/dist/src/agent/tools/personal-attention-tool.js +2 -2
  224. package/dist/src/agent/tools/personal-request-result-tool.js +1 -1
  225. package/dist/src/agent/tools/personal-request-tool.js +4 -4
  226. package/dist/src/agent/tools/personal-result-tool.js +1 -1
  227. package/dist/src/agent/tools/personal-task-tool.d.ts +4 -4
  228. package/dist/src/agent/tools/personal-task-tool.js +6 -6
  229. package/dist/src/agent/tools/publish-artifacts.js +2 -2
  230. package/dist/src/agent/tools/read.js +2 -2
  231. package/dist/src/agent/tools/review-workspace.js +1 -1
  232. package/dist/src/agent/tools/send-media.js +1 -1
  233. package/dist/src/agent/tools/skills-tools.js +1 -1
  234. package/dist/src/agent/tools/task-collaboration-tool.js +3 -3
  235. package/dist/src/agent/tools/tts-tool.js +1 -1
  236. package/dist/src/agent/tools/user-context-tool.js +1 -1
  237. package/dist/src/agent/tools/write.js +2 -2
  238. package/dist/src/agent/tools/xopc-use-tool.js +4 -4
  239. package/dist/src/agent/transcript/index.js +2 -2
  240. package/dist/src/agent/transcript/transcript-hygiene.js +2 -2
  241. package/dist/src/agent/workflow/subagent-runner.js +1 -1
  242. package/dist/src/agent-config/resolver.js +5 -0
  243. package/dist/src/agent-config/schema.d.ts +26 -6
  244. package/dist/src/agent-config/schema.js +2 -0
  245. package/dist/src/agent-matching/delegation-service.js +1 -1
  246. package/dist/src/ai-assist/text-assist.js +6 -17
  247. package/dist/src/auth/oauth/xopc-cloud.js +2 -2
  248. package/dist/src/auth/sync-provider-auth.js +1 -1
  249. package/dist/src/automations/capabilities/write.d.ts +2 -2
  250. package/dist/src/automations/domain/index.js +1 -1
  251. package/dist/src/automations/domain/validation.d.ts +6 -6
  252. package/dist/src/automations/draft/automation-draft-service.js +1 -1
  253. package/dist/src/automations/draft/automation-draft-validator.d.ts +2 -2
  254. package/dist/src/automations/index.js +2 -2
  255. package/dist/src/automations/service/action-executor.js +3 -1
  256. package/dist/src/browser/native-messaging-host.js +1 -1
  257. package/dist/src/capabilities/store-connector.js +2 -2
  258. package/dist/src/channels/attachments/voice-stt-webchat.js +2 -2
  259. package/dist/src/channels/index.js +3 -3
  260. package/dist/src/channels/manager.js +1 -1
  261. package/dist/src/channels/outbound-sender.js +1 -1
  262. package/dist/src/channels/pairing/allow-from-file.js +9 -9
  263. package/dist/src/channels/pairing/pairing-store.js +6 -6
  264. package/dist/src/chat-commands/builtins/config.js +4 -4
  265. package/dist/src/chat-commands/builtins/session.js +1 -1
  266. package/dist/src/chat-commands/builtins/thinking.js +1 -1
  267. package/dist/src/chat-commands/builtins/tts.js +1 -1
  268. package/dist/src/chat-commands/context.js +2 -2
  269. package/dist/src/chat-commands/index.js +3 -3
  270. package/dist/src/cli/commands/agent.js +7 -7
  271. package/dist/src/cli/commands/channels.js +1 -1
  272. package/dist/src/cli/commands/config.js +1 -1
  273. package/dist/src/cli/commands/connectors.js +2 -2
  274. package/dist/src/cli/commands/doctor/checks/channel-plugins.js +1 -1
  275. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  276. package/dist/src/cli/commands/doctor/checks/gateway-health.js +1 -1
  277. package/dist/src/cli/commands/extension-dev.js +1 -1
  278. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  279. package/dist/src/cli/commands/extension.js +2 -2
  280. package/dist/src/cli/commands/image.js +1 -1
  281. package/dist/src/cli/commands/init.js +1 -1
  282. package/dist/src/cli/commands/mcp.js +1 -1
  283. package/dist/src/cli/commands/models.js +3 -3
  284. package/dist/src/cli/commands/onboard/channels/registry.js +1 -1
  285. package/dist/src/cli/commands/onboard/model.d.ts +1 -1
  286. package/dist/src/cli/commands/onboard/model.js +21 -2
  287. package/dist/src/cli/commands/onboard.js +2 -2
  288. package/dist/src/cli/commands/project.js +1 -1
  289. package/dist/src/cli/commands/skills.js +2 -2
  290. package/dist/src/cli/commands/tunnel.js +4 -4
  291. package/dist/src/cli/extension-cli-register.js +6 -6
  292. package/dist/src/cli/utils/gateway-client.js +1 -1
  293. package/dist/src/cli/utils/init-workspace-core.js +1 -1
  294. package/dist/src/cli/utils/session.js +1 -1
  295. package/dist/src/computer/runtime.js +1 -1
  296. package/dist/src/config/agent-model-intents.js +4 -1
  297. package/dist/src/config/index.js +5 -5
  298. package/dist/src/config/loader.js +2 -2
  299. package/dist/src/config/models-json.js +1 -1
  300. package/dist/src/config/schema.d.ts +18 -6
  301. package/dist/src/config/schema.js +18 -8
  302. package/dist/src/connectors/cli/authorization.js +1 -1
  303. package/dist/src/connectors/cli/runtime.js +1 -1
  304. package/dist/src/connectors/composio-sessions.js +1 -1
  305. package/dist/src/connectors/composio.js +1 -1
  306. package/dist/src/connectors/connected-source-ingestion.js +4 -4
  307. package/dist/src/connectors/connected-source-understanding.js +4 -4
  308. package/dist/src/connectors/connection-recovery-service.js +4 -4
  309. package/dist/src/connectors/content-enrichment.js +1 -1
  310. package/dist/src/connectors/health.js +1 -1
  311. package/dist/src/connectors/learning-coordinator.js +1 -1
  312. package/dist/src/discussions/analyzer.d.ts +2 -0
  313. package/dist/src/discussions/analyzer.js +38 -9
  314. package/dist/src/discussions/audio-clip.d.ts +3 -0
  315. package/dist/src/discussions/audio-clip.js +72 -0
  316. package/dist/src/discussions/live-worker.js +4 -2
  317. package/dist/src/discussions/long-review.d.ts +17 -0
  318. package/dist/src/discussions/long-review.js +278 -0
  319. package/dist/src/discussions/media-timeline.d.ts +21 -0
  320. package/dist/src/discussions/media-timeline.js +134 -0
  321. package/dist/src/discussions/organizer-worker.d.ts +4 -1
  322. package/dist/src/discussions/organizer-worker.js +17 -12
  323. package/dist/src/discussions/organizer.js +2 -0
  324. package/dist/src/discussions/processing.d.ts +43 -0
  325. package/dist/src/discussions/processing.js +125 -0
  326. package/dist/src/discussions/recording.js +202 -42
  327. package/dist/src/discussions/recordingJobs.js +2 -0
  328. package/dist/src/discussions/repository.js +4 -2
  329. package/dist/src/discussions/review.d.ts +8 -0
  330. package/dist/src/discussions/review.js +183 -0
  331. package/dist/src/discussions/sealer.d.ts +7 -1
  332. package/dist/src/discussions/sealer.js +164 -88
  333. package/dist/src/discussions/service.d.ts +7 -1
  334. package/dist/src/discussions/service.js +51 -15
  335. package/dist/src/discussions/types.d.ts +2 -1
  336. package/dist/src/endpoint-tools/index.js +1 -1
  337. package/dist/src/endpoint-tools/runtime.js +2 -2
  338. package/dist/src/extensions/activation-context.js +3 -3
  339. package/dist/src/extensions/agent-plugins/auth.js +1 -1
  340. package/dist/src/extensions/agent-plugins/credentials.js +1 -1
  341. package/dist/src/extensions/agent-plugins/source-http-fetch.js +1 -1
  342. package/dist/src/extensions/api.js +4 -4
  343. package/dist/src/extensions/bundled-extension-activation.js +1 -1
  344. package/dist/src/extensions/index.js +3 -3
  345. package/dist/src/extensions/install.js +1 -1
  346. package/dist/src/extensions/loader.js +2 -2
  347. package/dist/src/extensions/sdk/index.js +1 -1
  348. package/dist/src/extensions/sdk/media.js +1 -1
  349. package/dist/src/extensions/update.js +1 -1
  350. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  351. package/dist/src/gateway/agents-admin.js +1 -1
  352. package/dist/src/gateway/chat-stream/mapper.js +2 -2
  353. package/dist/src/gateway/chat-stream/protocol.d.ts +2 -3
  354. package/dist/src/gateway/clarify-runtime.d.ts +2 -0
  355. package/dist/src/gateway/clarify-runtime.js +4 -1
  356. package/dist/src/gateway/device-routes.js +2 -2
  357. package/dist/src/gateway/ephemeral-clarification-waiter.d.ts +2 -1
  358. package/dist/src/gateway/ephemeral-clarification-waiter.js +19 -6
  359. package/dist/src/gateway/file-path-classifier.js +2 -2
  360. package/dist/src/gateway/global-defaults-admin.d.ts +3 -1
  361. package/dist/src/gateway/global-defaults-admin.js +15 -3
  362. package/dist/src/gateway/hono/app.js +3 -3
  363. package/dist/src/gateway/hono/lib/config-payload.d.ts +12 -3
  364. package/dist/src/gateway/hono/lib/config-payload.js +6 -4
  365. package/dist/src/gateway/hono/lib/config-write-lock.d.ts +2 -0
  366. package/dist/src/gateway/hono/lib/config-write-lock.js +14 -0
  367. package/dist/src/gateway/hono/lib/voice-settings-revisions.d.ts +5 -0
  368. package/dist/src/gateway/hono/lib/voice-settings-revisions.js +23 -0
  369. package/dist/src/gateway/hono/routes/agent-stream.js +4 -9
  370. package/dist/src/gateway/hono/routes/agents.js +1 -1
  371. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  372. package/dist/src/gateway/hono/routes/commands-skills.js +4 -4
  373. package/dist/src/gateway/hono/routes/config-patch/gateway.js +1 -1
  374. package/dist/src/gateway/hono/routes/config-patch/misc.js +12 -5
  375. package/dist/src/gateway/hono/routes/config.js +19 -5
  376. package/dist/src/gateway/hono/routes/connectors.js +1 -1
  377. package/dist/src/gateway/hono/routes/context-sources.js +2 -2
  378. package/dist/src/gateway/hono/routes/discussions.js +63 -1
  379. package/dist/src/gateway/hono/routes/endpoint-tools.js +1 -1
  380. package/dist/src/gateway/hono/routes/global-defaults.js +8 -1
  381. package/dist/src/gateway/hono/routes/home.js +1 -1
  382. package/dist/src/gateway/hono/routes/lazy-bundles.js +1 -1
  383. package/dist/src/gateway/hono/routes/mcp.js +74 -7
  384. package/dist/src/gateway/hono/routes/memory-learning.js +3 -3
  385. package/dist/src/gateway/hono/routes/models.js +17 -9
  386. package/dist/src/gateway/hono/routes/notes.js +1 -1
  387. package/dist/src/gateway/hono/routes/personal-agent.js +1 -1
  388. package/dist/src/gateway/hono/routes/projects.js +3 -3
  389. package/dist/src/gateway/hono/routes/provider-setup.d.ts +3 -0
  390. package/dist/src/gateway/hono/routes/provider-setup.js +106 -0
  391. package/dist/src/gateway/hono/routes/runtime-tools.js +1 -1
  392. package/dist/src/gateway/hono/routes/session-command-handler.js +2 -2
  393. package/dist/src/gateway/hono/routes/session-input-handler.js +5 -5
  394. package/dist/src/gateway/hono/routes/sessions.js +3 -3
  395. package/dist/src/gateway/hono/routes/shares.js +2 -2
  396. package/dist/src/gateway/hono/routes/side-chats.js +5 -4
  397. package/dist/src/gateway/hono/routes/site-shares.js +1 -1
  398. package/dist/src/gateway/hono/routes/status.js +2 -0
  399. package/dist/src/gateway/hono/routes/tasks.js +1 -1
  400. package/dist/src/gateway/hono/routes/user-model-refresh.js +1 -1
  401. package/dist/src/gateway/hono/routes/user-model.js +7 -7
  402. package/dist/src/gateway/hono/routes/voice.js +30 -17
  403. package/dist/src/gateway/hono/routes/workflows.js +1 -1
  404. package/dist/src/gateway/index.js +1 -1
  405. package/dist/src/gateway/lock.js +11 -11
  406. package/dist/src/gateway/media-access.js +1 -1
  407. package/dist/src/gateway/mobile-privacy.js +2 -2
  408. package/dist/src/gateway/ports.js +6 -6
  409. package/dist/src/gateway/provider-model-setup.d.ts +4 -0
  410. package/dist/src/gateway/provider-model-setup.js +56 -0
  411. package/dist/src/gateway/run-loop.js +1 -1
  412. package/dist/src/gateway/scenes/mailContext.js +1 -1
  413. package/dist/src/gateway/scenes/slackThreadSource.js +1 -1
  414. package/dist/src/gateway/server.js +1 -1
  415. package/dist/src/gateway/service/agent-runner.d.ts +5 -4
  416. package/dist/src/gateway/service/agent-runner.js +35 -19
  417. package/dist/src/gateway/service/config-coordinator.d.ts +619 -1
  418. package/dist/src/gateway/service/config-coordinator.js +38 -26
  419. package/dist/src/gateway/service/marketplace-service.js +2 -2
  420. package/dist/src/gateway/service/run-gateway-agent.js +4 -4
  421. package/dist/src/gateway/service/session-command-service.js +2 -2
  422. package/dist/src/gateway/service.d.ts +6 -3
  423. package/dist/src/gateway/service.js +52 -51
  424. package/dist/src/gateway/session-context-summary.js +4 -4
  425. package/dist/src/gateway/side-chat/run-service.d.ts +2 -1
  426. package/dist/src/gateway/side-chat/run-service.js +6 -3
  427. package/dist/src/gateway/side-chat/types.d.ts +3 -3
  428. package/dist/src/gateway/workspace-editor-path.js +2 -2
  429. package/dist/src/gateway/xopc-cloud-capability-setup.d.ts +2 -2
  430. package/dist/src/gateway/xopc-cloud-capability-setup.js +7 -4
  431. package/dist/src/home-intelligence/generator.js +2 -2
  432. package/dist/src/home-intelligence/host.js +2 -2
  433. package/dist/src/imports/compatibility.js +1 -1
  434. package/dist/src/imports/inventory.js +3 -3
  435. package/dist/src/imports/productImport.js +2 -2
  436. package/dist/src/imports/runtime.js +1 -1
  437. package/dist/src/infra/gateway-processes.js +2 -2
  438. package/dist/src/infra/path-env.js +3 -3
  439. package/dist/src/infra/update-global.js +9 -9
  440. package/dist/src/knowledge/connected-knowledge-pipeline.js +2 -2
  441. package/dist/src/knowledge/index.js +1 -1
  442. package/dist/src/knowledge-memory/repository.js +1 -1
  443. package/dist/src/local-apps/service.js +2 -2
  444. package/dist/src/mcp/gateway-http-client.js +1 -1
  445. package/dist/src/media-shared/http/provider-http.d.ts +0 -6
  446. package/dist/src/media-shared/http/provider-http.js +5 -4
  447. package/dist/src/media-understanding/openai-compatible-audio.js +1 -1
  448. package/dist/src/media-understanding/runner.d.ts +0 -28
  449. package/dist/src/media-understanding/runner.js +4 -0
  450. package/dist/src/memory-learning/service.js +3 -2
  451. package/dist/src/memory-learning/source-learning.js +4 -4
  452. package/dist/src/memory-learning/task-receipts.js +1 -1
  453. package/dist/src/notes/agent-context.js +4 -4
  454. package/dist/src/notes/index.js +1 -1
  455. package/dist/src/notes/service.js +3 -3
  456. package/dist/src/personal-agent/capability-service.js +2 -2
  457. package/dist/src/personal-agent/proactivity/routes.js +1 -1
  458. package/dist/src/personal-agent/proactivity/service.js +7 -7
  459. package/dist/src/personal-agent/prompt-context.js +7 -7
  460. package/dist/src/personal-agent/prompts.js +1 -1
  461. package/dist/src/personal-agent/reply-composer.js +9 -9
  462. package/dist/src/personal-agent/request-delivery.js +2 -2
  463. package/dist/src/personal-agent/request-service.js +6 -6
  464. package/dist/src/personal-agent/result-reader.js +1 -1
  465. package/dist/src/personal-agent/service.js +1 -1
  466. package/dist/src/personal-agent/task-cancel.js +1 -1
  467. package/dist/src/platform/client.d.ts +1 -1
  468. package/dist/src/platform/contracts.d.ts +1 -1
  469. package/dist/src/platform/index.js +1 -1
  470. package/dist/src/projects/index.js +1 -1
  471. package/dist/src/projects/project-agent-suggestion.js +1 -1
  472. package/dist/src/projects/project-service.js +1 -1
  473. package/dist/src/projects/project-skill-service.js +2 -2
  474. package/dist/src/projects/workspace.js +1 -1
  475. package/dist/src/providers/env-keys.js +3 -0
  476. package/dist/src/providers/extension-stream-bridge.js +3 -0
  477. package/dist/src/providers/index.js +15 -0
  478. package/dist/src/providers/model-call.d.ts +5 -2
  479. package/dist/src/providers/model-call.js +13 -2
  480. package/dist/src/providers/model-reference-auditor.js +2 -1
  481. package/dist/src/providers/model-registry.js +1 -1
  482. package/dist/src/providers/model-response.js +1 -1
  483. package/dist/src/providers/model-usage.d.ts +15 -0
  484. package/dist/src/providers/model-usage.js +50 -0
  485. package/dist/src/providers/presentation.js +8 -0
  486. package/dist/src/providers/setup/engine.d.ts +37 -0
  487. package/dist/src/providers/setup/engine.js +177 -0
  488. package/dist/src/providers/setup/profiles.d.ts +4 -0
  489. package/dist/src/providers/setup/profiles.js +94 -0
  490. package/dist/src/providers/setup/voice.d.ts +23 -0
  491. package/dist/src/providers/setup/voice.js +234 -0
  492. package/dist/src/realtime/runtime.js +1 -1
  493. package/dist/src/remote-access/exposure-manager.js +1 -1
  494. package/dist/src/routing/agent-session-key.js +1 -1
  495. package/dist/src/scenes/agentExecutor.d.ts +1 -0
  496. package/dist/src/scenes/agentExecutor.js +5 -0
  497. package/dist/src/scenes/execution.d.ts +1 -1
  498. package/dist/src/scenes/taskFollowUp/agentExecutor.js +4 -4
  499. package/dist/src/scenes/taskFollowUp/contracts.d.ts +2 -2
  500. package/dist/src/scenes/taskFollowUp/resources.js +2 -2
  501. package/dist/src/scenes/taskFollowUp/service.d.ts +5 -5
  502. package/dist/src/scenes/taskFollowUp/service.js +6 -6
  503. package/dist/src/scenes/templates.d.ts +2 -2
  504. package/dist/src/session/index.js +2 -2
  505. package/dist/src/session/init-session-turn.js +1 -1
  506. package/dist/src/session/resolve-session.js +1 -1
  507. package/dist/src/session/store.js +5 -5
  508. package/dist/src/session/thinking-resolve.js +1 -1
  509. package/dist/src/share/hosted-session-share.js +2 -2
  510. package/dist/src/share/session-share-service.js +1 -1
  511. package/dist/src/share/share-store.js +1 -1
  512. package/dist/src/share/share-thumbnail.js +1 -1
  513. package/dist/src/share/site-share-store.js +1 -1
  514. package/dist/src/storage/sqlite/clarification-wait-repository.d.ts +3 -5
  515. package/dist/src/storage/sqlite/clarification-wait-repository.js +48 -28
  516. package/dist/src/storage/sqlite/connection.js +9 -9
  517. package/dist/src/storage/sqlite/migrations/253_discussion_processing_recovery.sql +20 -0
  518. package/dist/src/storage/sqlite/migrations/254_discussion_annotations.sql +17 -0
  519. package/dist/src/storage/sqlite/migrations/255_discussion_chapter_progress.sql +10 -0
  520. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  521. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  522. package/dist/src/storage/sqlite/schema.js +1 -1
  523. package/dist/src/tasks/capabilities/management.d.ts +2 -2
  524. package/dist/src/tasks/capabilities/read.js +2 -2
  525. package/dist/src/tasks/capabilities/relations.d.ts +6 -6
  526. package/dist/src/tasks/capabilities/write.d.ts +6 -6
  527. package/dist/src/tasks/capabilities/write.js +1 -1
  528. package/dist/src/tasks/home-query-service.js +2 -2
  529. package/dist/src/tasks/index.js +4 -4
  530. package/dist/src/tasks/task-allocation-service.js +5 -5
  531. package/dist/src/tasks/task-application-service.js +6 -6
  532. package/dist/src/tasks/task-collaboration-delivery.js +1 -1
  533. package/dist/src/tasks/task-context-assembler.js +2 -2
  534. package/dist/src/tasks/task-handoff-service.js +1 -1
  535. package/dist/src/tasks/task-handoff.js +5 -5
  536. package/dist/src/tasks/task-main-update-decision-service.js +3 -3
  537. package/dist/src/tasks/task-model-call.js +1 -1
  538. package/dist/src/tasks/task-research-result.js +4 -4
  539. package/dist/src/tasks/task-result-delivery-repository.js +1 -1
  540. package/dist/src/tasks/task-result-delivery-service.js +2 -2
  541. package/dist/src/tasks/task-run-coordinator.js +4 -4
  542. package/dist/src/tasks/task-run-dispatcher.js +1 -1
  543. package/dist/src/tui/backends/embedded-backend.js +13 -13
  544. package/dist/src/tui/backends/gateway-realtime-backend.js +2 -2
  545. package/dist/src/tui/extension-host/load-extensions.js +2 -2
  546. package/dist/src/tui/tui-agent-events.js +1 -1
  547. package/dist/src/tui/tui-commands.js +5 -5
  548. package/dist/src/tui/tui-picker-overlay.js +1 -1
  549. package/dist/src/tui/tui-skills-autocomplete.js +1 -1
  550. package/dist/src/tui/tui-startup-resources.js +4 -4
  551. package/dist/src/tui/tui.js +6 -6
  552. package/dist/src/tunnel/gateway-lifecycle.js +1 -1
  553. package/dist/src/usage/recorder.js +2 -1
  554. package/dist/src/usage/scenario-registry.js +128 -123
  555. package/dist/src/user-context/access-policy.js +2 -2
  556. package/dist/src/user-context/config.d.ts +2 -2
  557. package/dist/src/user-model/bootstrap.js +1 -1
  558. package/dist/src/user-model/capture/executor.js +1 -1
  559. package/dist/src/user-model/capture/semantic.d.ts +8 -1
  560. package/dist/src/user-model/capture/semantic.js +26 -5
  561. package/dist/src/user-model/index.js +2 -2
  562. package/dist/src/voice/dashscope/streaming-stt-session.js +3 -0
  563. package/dist/src/voice/dashscope/streaming-tts-stream.js +3 -0
  564. package/dist/src/voice/dictation.d.ts +12 -0
  565. package/dist/src/voice/dictation.js +22 -0
  566. package/dist/src/voice/metadata/builtin.js +54 -0
  567. package/dist/src/voice/platform-streams.js +3 -0
  568. package/dist/src/voice/realtime/agentEngine.js +4 -2
  569. package/dist/src/voice/realtime/memory-context.js +7 -7
  570. package/dist/src/voice/realtime/omniEngine.js +5 -2
  571. package/dist/src/voice/realtime/omniRoute.js +3 -2
  572. package/dist/src/voice/realtime/runtime.js +8 -6
  573. package/dist/src/voice/stt/factory.js +9 -3
  574. package/dist/src/voice/stt/index.js +2 -2
  575. package/dist/src/voice/stt/preflight.js +1 -1
  576. package/dist/src/voice/stt/providers/alibaba-transcription.js +1 -1
  577. package/dist/src/voice/stt/providers/bailian-plan-transcription.d.ts +2 -0
  578. package/dist/src/voice/stt/providers/bailian-plan-transcription.js +32 -0
  579. package/dist/src/voice/stt/providers/index.d.ts +1 -0
  580. package/dist/src/voice/stt/providers/index.js +2 -1
  581. package/dist/src/voice/stt/providers/xopc-cloud-transcription.js +1 -1
  582. package/dist/src/voice/stt/transcribe-core.js +1 -1
  583. package/dist/src/voice/token-plan.d.ts +8 -0
  584. package/dist/src/voice/token-plan.js +11 -0
  585. package/dist/src/voice/tts/factory.js +4 -1
  586. package/dist/src/voice/tts/index.js +3 -3
  587. package/dist/src/voice/tts/merge-config.js +1 -1
  588. package/dist/src/voice/tts/payload.js +1 -1
  589. package/dist/src/voice/tts/providers/bailian-plan-speech.d.ts +2 -0
  590. package/dist/src/voice/tts/providers/bailian-plan-speech.js +84 -0
  591. package/dist/src/voice/tts/providers/index.d.ts +1 -0
  592. package/dist/src/voice/tts/providers/index.js +2 -1
  593. package/dist/src/voice/tts/providers/xopc-cloud-speech.js +1 -1
  594. package/dist/src/voice/tts/speak-core.js +11 -2
  595. package/dist/src/work-discovery/incremental-repository.js +1 -1
  596. package/dist/src/work-discovery/service.js +7 -7
  597. package/dist/src/workflows/context/workflow-context.js +1 -1
  598. package/dist/src/workflows/engine/workflow-engine.js +1 -1
  599. package/dist/src/workflows/service/workflow-run-service.js +7 -7
  600. package/dist/src/workflows/service/workflow-session-bridge.js +2 -2
  601. package/package.json +2 -2
  602. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-2VA4eKPf.js +0 -1
  603. package/dist/gateway/static/root/assets/agent-plugin-dialog-DRhTOw_O.js +0 -1
  604. package/dist/gateway/static/root/assets/agents-BemUH_Yf.js +0 -77
  605. package/dist/gateway/static/root/assets/app-management-settings-panel-CR_cc7rj.js +0 -1
  606. package/dist/gateway/static/root/assets/automations-workspace-DOwtT4sS.js +0 -6
  607. package/dist/gateway/static/root/assets/browser-automations-page-B-Ezk_8l.js +0 -3
  608. package/dist/gateway/static/root/assets/browser-settings-page-BSmmTBn4.js +0 -3
  609. package/dist/gateway/static/root/assets/capabilities-page-xZgTYYDn.js +0 -2
  610. package/dist/gateway/static/root/assets/capabilities-settings-panel-oqkuOjcR.js +0 -8
  611. package/dist/gateway/static/root/assets/channels-Dq2C2k9M.js +0 -1
  612. package/dist/gateway/static/root/assets/chat-terminal-dock-srB_M-aQ.js +0 -36
  613. package/dist/gateway/static/root/assets/connectors-page-BZk-Gou5.js +0 -1
  614. package/dist/gateway/static/root/assets/device-pairing-wizard-CvZpnSVw.js +0 -1
  615. package/dist/gateway/static/root/assets/extension-settings-page-1tbWe5xQ.js +0 -1
  616. package/dist/gateway/static/root/assets/fallback-models-CW6a1-GK.js +0 -1
  617. package/dist/gateway/static/root/assets/gateway-realtime-store-BVriF6Zj.js +0 -1
  618. package/dist/gateway/static/root/assets/gateway-settings-vQWTUx2c.js +0 -1
  619. package/dist/gateway/static/root/assets/home-page-hfWuVtcG.js +0 -2
  620. package/dist/gateway/static/root/assets/image-generation-api-DodU6GNC.js +0 -1
  621. package/dist/gateway/static/root/assets/imports-page-CuR6RSUM.js +0 -1
  622. package/dist/gateway/static/root/assets/index-CNH8vwcY.js +0 -260
  623. package/dist/gateway/static/root/assets/index-DBRwvWzm.css +0 -1
  624. package/dist/gateway/static/root/assets/logs-page-CSlZT1-L.js +0 -2
  625. package/dist/gateway/static/root/assets/management-settings-BYCL5CwV.js +0 -1
  626. package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-i9N5shss.js +0 -1
  627. package/dist/gateway/static/root/assets/messages-DTqbfje6.js +0 -3
  628. package/dist/gateway/static/root/assets/models-hub-cache-Ct6X5zmB.js +0 -1
  629. package/dist/gateway/static/root/assets/note-detail-panel-CJ5Earr_.js +0 -5
  630. package/dist/gateway/static/root/assets/notes-page-CPGk8-n1.js +0 -8
  631. package/dist/gateway/static/root/assets/personal-page-BjTt5R3s.js +0 -1
  632. package/dist/gateway/static/root/assets/project-detail-page-CyKx4PyN.js +0 -1
  633. package/dist/gateway/static/root/assets/projects-page--_hXxUMC.js +0 -1
  634. package/dist/gateway/static/root/assets/remote-access-hub-Bq_eqQYf.js +0 -1
  635. package/dist/gateway/static/root/assets/runtime-tools-settings-panel-BgCATci5.js +0 -1
  636. package/dist/gateway/static/root/assets/scenes-page-DxE3jRPR.js +0 -2
  637. package/dist/gateway/static/root/assets/session-manager-COd9RECl.js +0 -16
  638. package/dist/gateway/static/root/assets/sessions-page-CQkGFnJM.js +0 -1
  639. package/dist/gateway/static/root/assets/settings-advanced-gate-Dtlsvsci.js +0 -1
  640. package/dist/gateway/static/root/assets/settings-loading-skeleton-BTqvr_Fw.js +0 -1
  641. package/dist/gateway/static/root/assets/setup-status-panel-CrAazq4r.js +0 -1
  642. package/dist/gateway/static/root/assets/shares-settings-BNMhs-Vd.js +0 -1
  643. package/dist/gateway/static/root/assets/skills-page-XVOxILQn.js +0 -2
  644. package/dist/gateway/static/root/assets/user-model-page-C1QX47VR.js +0 -2
@@ -1,9 +1,10 @@
1
1
  import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
2
- import { DISCUSSION_MAX_DURATION_MS } from "../../packages/gateway-contract/src/discussions.js";
2
+ import { DISCUSSION_MAX_SAVED_DURATION_MS } from "../../packages/gateway-contract/src/discussions.js";
3
3
  import { init_src } from "../../packages/gateway-contract/src/index.js";
4
4
  import { resolveNoteMediaDir } from "../notes/paths.js";
5
5
  import { DiscussionServiceError } from "./errors.js";
6
6
  import { getDiscussionCapture, updateDiscussionCapture } from "./repository.js";
7
+ import { pcmEpoch, probeMediaEpoch } from "./media-timeline.js";
7
8
  import { decodeWavToMonoFloat32 } from "../voice/audio/wav.js";
8
9
  import { forEachNormalizedAudioSegment } from "../voice/audio/normalize.js";
9
10
  import { join } from "node:path";
@@ -71,6 +72,20 @@ async function saveRecordingChunk(capture, sequence, sha256, body) {
71
72
  }
72
73
  function validateRecordingManifest(capture, input) {
73
74
  if (input.containerMode !== void 0 && (input.containerMode !== "independent_wav" || input.mimeType !== "audio/wav")) throw invalid("Unsupported recording container");
75
+ if (input.events !== void 0 && (!Array.isArray(input.events) || input.events.length > 1e3 || input.events.some((event) => !event || !Number.isSafeInteger(event.recordedAt) || event.recordedAt < 0 || !Number.isSafeInteger(event.savedMs) || event.savedMs < 0 || event.savedMs > 7205e3 || ![
76
+ "start",
77
+ "resume",
78
+ "interrupted",
79
+ "seal"
80
+ ].includes(event.kind)))) throw invalid("Invalid recording events");
81
+ if (input.epochs !== void 0) {
82
+ if (input.containerMode || !Array.isArray(input.epochs) || input.epochs.length < 2 || input.epochs.length > 100 || input.epochs.some((epoch, index) => !epoch || !Number.isSafeInteger(epoch.firstChunk) || (index === 0 ? epoch.firstChunk !== 0 : epoch.firstChunk <= input.epochs[index - 1].firstChunk) || epoch.firstChunk >= input.chunkCount || !Number.isSafeInteger(epoch.startedAt) || epoch.startedAt < 0 || epoch.previousEndedAt !== void 0 && (!Number.isSafeInteger(epoch.previousEndedAt) || epoch.previousEndedAt < 0) || typeof epoch.mimeType !== "string" || ![
83
+ "audio/webm",
84
+ "audio/mp4",
85
+ "audio/ogg",
86
+ "audio/wav"
87
+ ].includes(epoch.mimeType.split(";")[0]))) throw invalid("Invalid recording epochs");
88
+ }
74
89
  const mimeType = input.mimeType.split(";")[0];
75
90
  if (![
76
91
  "audio/wav",
@@ -89,48 +104,52 @@ async function completeRecording(capture, input, notes, assertLease, signal) {
89
104
  const target = join(directory(capture), `assembled-${randomUUID()}`);
90
105
  const file = await open(target, "w");
91
106
  const hash = createHash("sha256");
107
+ let epochs;
92
108
  try {
93
109
  try {
94
- if (input.containerMode === "independent_wav") {
95
- const samples = chunks.reduce((total, chunk) => total + (chunk.bytes - 44) / 2, 0);
96
- if (!Number.isSafeInteger(samples) || samples <= 0 || samples > 16e3 * 72e5 / 1e3) throw invalid("Invalid PCM recording duration");
97
- const header = recordingWavHeader(samples);
98
- hash.update(header);
99
- await file.writeFile(header);
100
- }
101
- for (const chunk of chunks) {
102
- const chunkHash = createHash("sha256");
103
- let bytes = 0;
104
- try {
105
- if (input.containerMode === "independent_wav") {
106
- signal.throwIfAborted();
107
- const buffers = [];
110
+ if (input.epochs) epochs = await assembleEpochs(capture, input, notes, file, signal, assertLease);
111
+ else {
112
+ if (input.containerMode === "independent_wav") {
113
+ const samples = chunks.reduce((total, chunk) => total + (chunk.bytes - 44) / 2, 0);
114
+ if (!Number.isSafeInteger(samples) || samples <= 0 || samples > 16e3 * 7205e3 / 1e3) throw invalid("Invalid PCM recording duration");
115
+ const header = recordingWavHeader(samples);
116
+ hash.update(header);
117
+ await file.writeFile(header);
118
+ }
119
+ for (const chunk of chunks) {
120
+ const chunkHash = createHash("sha256");
121
+ let bytes = 0;
122
+ try {
123
+ if (input.containerMode === "independent_wav") {
124
+ signal.throwIfAborted();
125
+ const buffers = [];
126
+ for await (const buffer of createReadStream(join(directory(capture), String(chunk.sequence)))) {
127
+ signal.throwIfAborted();
128
+ bytes += buffer.length;
129
+ if (bytes > 8388608 || bytes > chunk.bytes) throw invalid("Stored WAV chunk is corrupt");
130
+ buffers.push(buffer);
131
+ }
132
+ const data = Buffer.concat(buffers, bytes);
133
+ if (data.length !== chunk.bytes || data.length <= 44 || data.length > 8388608 || data.length % 2 !== 0 || !data.subarray(0, 44).equals(recordingWavHeader((data.length - 44) / 2)) || createHash("sha256").update(data).digest("hex") !== chunk.sha256) throw invalid("Stored WAV chunk is corrupt");
134
+ hash.update(data.subarray(44));
135
+ await file.writeFile(data.subarray(44));
136
+ continue;
137
+ }
108
138
  for await (const buffer of createReadStream(join(directory(capture), String(chunk.sequence)))) {
109
139
  signal.throwIfAborted();
140
+ hash.update(buffer);
141
+ chunkHash.update(buffer);
110
142
  bytes += buffer.length;
111
- if (bytes > 8388608 || bytes > chunk.bytes) throw invalid("Stored WAV chunk is corrupt");
112
- buffers.push(buffer);
143
+ await file.writeFile(buffer);
113
144
  }
114
- const data = Buffer.concat(buffers, bytes);
115
- if (data.length !== chunk.bytes || data.length <= 44 || data.length > 8388608 || data.length % 2 !== 0 || !data.subarray(0, 44).equals(recordingWavHeader((data.length - 44) / 2)) || createHash("sha256").update(data).digest("hex") !== chunk.sha256) throw invalid("Stored WAV chunk is corrupt");
116
- hash.update(data.subarray(44));
117
- await file.writeFile(data.subarray(44));
118
- continue;
119
- }
120
- for await (const buffer of createReadStream(join(directory(capture), String(chunk.sequence)))) {
121
- signal.throwIfAborted();
122
- hash.update(buffer);
123
- chunkHash.update(buffer);
124
- bytes += buffer.length;
125
- await file.writeFile(buffer);
126
- }
127
- if (bytes !== chunk.bytes || chunkHash.digest("hex") !== chunk.sha256) throw invalid("Stored recording chunk is corrupt");
128
- } catch (error) {
129
- if (!signal.aborted && (error instanceof DiscussionServiceError || error.code === "ENOENT")) {
130
- assertLease();
131
- getSqliteDatabase().prepare("DELETE FROM discussion_recording_chunks WHERE discussion_id=? AND sequence=?").run(capture.id, chunk.sequence);
145
+ if (bytes !== chunk.bytes || chunkHash.digest("hex") !== chunk.sha256) throw invalid("Stored recording chunk is corrupt");
146
+ } catch (error) {
147
+ if (!signal.aborted && (error instanceof DiscussionServiceError || error.code === "ENOENT")) {
148
+ assertLease();
149
+ getSqliteDatabase().prepare("DELETE FROM discussion_recording_chunks WHERE discussion_id=? AND sequence=?").run(capture.id, chunk.sequence);
150
+ }
151
+ throw error;
132
152
  }
133
- throw error;
134
153
  }
135
154
  }
136
155
  await file.sync();
@@ -141,7 +160,7 @@ async function completeRecording(capture, input, notes, assertLease, signal) {
141
160
  await forEachNormalizedAudioSegment({
142
161
  filePath: target,
143
162
  segmentSeconds: 30,
144
- maxDurationSeconds: DISCUSSION_MAX_DURATION_MS / 1e3,
163
+ maxDurationSeconds: DISCUSSION_MAX_SAVED_DURATION_MS / 1e3,
145
164
  signal: AbortSignal.any([signal, AbortSignal.timeout(18e4)])
146
165
  }, async (buffer) => {
147
166
  durationMs += decodeWavToMonoFloat32(buffer).durationSeconds * 1e3;
@@ -150,11 +169,37 @@ async function completeRecording(capture, input, notes, assertLease, signal) {
150
169
  const latest = getDiscussionCapture(capture.id);
151
170
  if (!latest || latest.status === "cancelled" || latest.audioDeletedAt) throw new DiscussionServiceError("conflict", "Recording was deleted or cancelled");
152
171
  assertLease();
153
- const audioSha256 = hash.digest("hex");
172
+ const audioSha256 = input.epochs ? await hashFile(target, signal) : hash.digest("hex");
173
+ const outputMime = input.epochs ? "audio/wav" : input.mimeType;
174
+ const timeline = {
175
+ primary: input.epochs || input.containerMode === "independent_wav" || outputMime.includes("wav") ? "pcm" : "encoded",
176
+ epochs: epochs ?? [outputMime.includes("wav") ? pcmEpoch(durationMs) : await probeMediaEpoch(target, durationMs, 0, signal)]
177
+ };
178
+ if (input.events?.length) {
179
+ const events = await notes.addAttachment(capture.noteId, {
180
+ name: `recording-events-${capture.id}.json`,
181
+ buffer: Buffer.from(JSON.stringify({
182
+ version: 1,
183
+ discussionId: capture.id,
184
+ events: input.events
185
+ })),
186
+ mimeType: "application/json",
187
+ retainWithoutReference: true
188
+ }, `meeting-events:${capture.id}`);
189
+ if (!events) throw new Error("Discussion note is missing");
190
+ const saved = await notes.getAttachmentPath(capture.noteId, events.id);
191
+ if (!saved) throw new Error("Saved recording events are missing");
192
+ const durable = await open(saved.filePath, "r");
193
+ try {
194
+ await durable.sync();
195
+ } finally {
196
+ await durable.close();
197
+ }
198
+ }
154
199
  const attachment = await notes.addAttachment(capture.noteId, {
155
- name: input.fileName.trim().slice(0, 200) || "meeting.webm",
200
+ name: input.epochs ? "meeting-resumed.wav" : input.fileName.trim().slice(0, 200) || "meeting.webm",
156
201
  buffer: { filePath: target },
157
- mimeType: input.mimeType,
202
+ mimeType: outputMime,
158
203
  duration: Math.round(durationMs / 1e3),
159
204
  retainWithoutReference: true
160
205
  }, `meeting-recording:${capture.id}`);
@@ -175,13 +220,14 @@ async function completeRecording(capture, input, notes, assertLease, signal) {
175
220
  }
176
221
  const updated = runSqliteWriteTransaction(() => {
177
222
  assertLease();
223
+ getSqliteDatabase().prepare("INSERT OR REPLACE INTO discussion_media_timeline (discussion_id,audio_sha256,timeline_json) VALUES (?,?,?)").run(capture.id, audioSha256, JSON.stringify(timeline));
178
224
  return updateDiscussionCapture(capture.id, {
179
225
  status: "stopping",
180
226
  audioAttachmentId: attachment.id,
181
- mimeType: input.mimeType,
227
+ mimeType: outputMime,
182
228
  audioSha256,
183
229
  durationMs: Math.round(durationMs),
184
- audioSizeBytes: chunks.reduce((sum, chunk) => sum + chunk.bytes, 0)
230
+ audioSizeBytes: attachment.size
185
231
  }, [
186
232
  "recording",
187
233
  "stopping",
@@ -195,6 +241,120 @@ async function completeRecording(capture, input, notes, assertLease, signal) {
195
241
  await rm(target, { force: true });
196
242
  }
197
243
  }
244
+ async function hashFile(path, signal) {
245
+ const hash = createHash("sha256");
246
+ for await (const buffer of createReadStream(path)) {
247
+ signal.throwIfAborted();
248
+ hash.update(buffer);
249
+ }
250
+ return hash.digest("hex");
251
+ }
252
+ /** Independent recorder containers stay immutable; only decoded PCM is joined for playback/STT. */
253
+ async function assembleEpochs(capture, input, notes, output, signal, assertLease) {
254
+ const epochs = [];
255
+ const chunks = listRecordingChunks(capture.id);
256
+ const sources = [];
257
+ let samples = 0;
258
+ await output.writeFile(recordingWavHeader(0));
259
+ for (const [index, epoch] of input.epochs.entries()) {
260
+ const path = join(directory(capture), `epoch-${randomUUID()}`);
261
+ const source = await open(path, "wx");
262
+ try {
263
+ try {
264
+ const end = input.epochs[index + 1]?.firstChunk ?? chunks.length;
265
+ for (const chunk of chunks.slice(epoch.firstChunk, end)) try {
266
+ let bytes = 0;
267
+ const hash = createHash("sha256");
268
+ for await (const buffer of createReadStream(join(directory(capture), String(chunk.sequence)))) {
269
+ signal.throwIfAborted();
270
+ bytes += buffer.length;
271
+ hash.update(buffer);
272
+ await source.writeFile(buffer);
273
+ }
274
+ if (bytes !== chunk.bytes || hash.digest("hex") !== chunk.sha256) throw invalid("Stored recording chunk is corrupt");
275
+ } catch (error) {
276
+ if (!signal.aborted && (error instanceof DiscussionServiceError || error.code === "ENOENT")) {
277
+ assertLease();
278
+ getSqliteDatabase().prepare("DELETE FROM discussion_recording_chunks WHERE discussion_id=? AND sequence=?").run(capture.id, chunk.sequence);
279
+ }
280
+ throw error;
281
+ }
282
+ await source.sync();
283
+ } finally {
284
+ await source.close();
285
+ }
286
+ let epochSamples = 0;
287
+ await forEachNormalizedAudioSegment({
288
+ filePath: path,
289
+ segmentSeconds: 30,
290
+ maxDurationSeconds: DISCUSSION_MAX_SAVED_DURATION_MS / 1e3,
291
+ signal: AbortSignal.any([signal, AbortSignal.timeout(18e4)])
292
+ }, async (buffer) => {
293
+ const audio = decodeWavToMonoFloat32(buffer);
294
+ const pcm = Buffer.alloc(audio.samples.length * 2);
295
+ for (let i = 0; i < audio.samples.length; i++) pcm.writeInt16LE(Math.max(-32768, Math.min(32767, Math.round(audio.samples[i] * 32768))), i * 2);
296
+ samples += audio.samples.length;
297
+ epochSamples += audio.samples.length;
298
+ if (samples > 16e3 * 7205e3 / 1e3) throw invalid("Recording exceeds duration limit");
299
+ await output.writeFile(pcm);
300
+ });
301
+ if (!epochSamples) throw invalid("Recording epoch has no decodable audio");
302
+ const epochDuration = epochSamples / 16;
303
+ epochs.push(epoch.mimeType.includes("wav") ? pcmEpoch(epochDuration, (samples - epochSamples) / 16) : await probeMediaEpoch(path, epochDuration, (samples - epochSamples) / 16, signal));
304
+ assertLease();
305
+ signal.throwIfAborted();
306
+ const sha256 = await hashFile(path, signal);
307
+ const extension = epoch.mimeType.includes("mp4") ? "m4a" : epoch.mimeType.includes("ogg") ? "ogg" : epoch.mimeType.includes("wav") ? "wav" : "webm";
308
+ const attachment = await notes.addAttachment(capture.noteId, {
309
+ name: `recording-part-${capture.id}-${index + 1}.${extension}`,
310
+ buffer: { filePath: path },
311
+ mimeType: epoch.mimeType,
312
+ retainWithoutReference: true
313
+ }, `meeting-source:${capture.id}:${index}:${sha256}`);
314
+ if (!attachment) throw new Error("Discussion note is missing");
315
+ const stored = await notes.getAttachmentPath(capture.noteId, attachment.id);
316
+ if (!stored) throw new Error("Saved recording source is missing");
317
+ const durable = await open(stored.filePath, "r");
318
+ try {
319
+ await durable.sync();
320
+ } finally {
321
+ await durable.close();
322
+ }
323
+ sources.push({
324
+ ...epoch,
325
+ attachmentId: attachment.id,
326
+ sha256,
327
+ durationMs: epochSamples / 16
328
+ });
329
+ } finally {
330
+ await rm(path, { force: true });
331
+ }
332
+ }
333
+ await output.write(recordingWavHeader(samples), 0, 44, 0);
334
+ assertLease();
335
+ signal.throwIfAborted();
336
+ const manifestAttachment = await notes.addAttachment(capture.noteId, {
337
+ name: `recording-sources-${capture.id}.json`,
338
+ buffer: Buffer.from(JSON.stringify({
339
+ version: 1,
340
+ discussionId: capture.id,
341
+ noteId: capture.noteId,
342
+ sources
343
+ })),
344
+ mimeType: "application/json",
345
+ retainWithoutReference: true
346
+ }, `meeting-sources:${capture.id}`);
347
+ if (!manifestAttachment) throw new Error("Discussion note is missing");
348
+ const manifestFile = await notes.getAttachmentPath(capture.noteId, manifestAttachment.id);
349
+ if (!manifestFile) throw new Error("Saved recording manifest is missing");
350
+ const durable = await open(manifestFile.filePath, "r");
351
+ try {
352
+ await durable.sync();
353
+ } finally {
354
+ await durable.close();
355
+ }
356
+ return epochs;
357
+ }
198
358
  function recordingWavHeader(samples) {
199
359
  const header = Buffer.alloc(44);
200
360
  header.write("RIFF");
@@ -27,6 +27,8 @@ function submitRecordingJob(discussionId, input) {
27
27
  mimeType: input.mimeType,
28
28
  fileName: input.fileName,
29
29
  lastSequence: input.lastSequence,
30
+ ...input.events ? { events: input.events } : {},
31
+ ...input.epochs ? { epochs: input.epochs } : {},
30
32
  ...input.containerMode ? { containerMode: input.containerMode } : {}
31
33
  });
32
34
  return runSqliteWriteTransaction((db) => {
@@ -170,7 +170,8 @@ function claimNextDiscussionCapture(owner, now = Date.now(), leaseMs = 5 * 6e4)
170
170
  return runSqliteWriteTransaction((db) => {
171
171
  const row = db.prepare(`SELECT * FROM discussion_captures
172
172
  WHERE status='organizing' AND (work_lease_owner IS NULL OR work_lease_expires_at <= ?)
173
- ORDER BY updated_at ASC LIMIT 1`).get(now);
173
+ AND NOT EXISTS (SELECT 1 FROM discussion_processing p WHERE p.discussion_id=discussion_captures.id AND p.next_attempt_at>?)
174
+ ORDER BY updated_at ASC LIMIT 1`).get(now, now);
174
175
  if (!row) return null;
175
176
  return db.prepare(`UPDATE discussion_captures SET work_lease_owner=?, work_lease_expires_at=?, updated_at=?
176
177
  WHERE id=? AND status='organizing' AND (work_lease_owner IS NULL OR work_lease_expires_at <= ?)`).run(owner, now + leaseMs, now, row.id, now).changes ? getDiscussionCapture(row.id) : null;
@@ -226,7 +227,8 @@ function completeDiscussionTranscriptSegment(discussionId, sequence, owner, text
226
227
  raw_text=?, display_text=?, provider=?, language=?, confidence=?, audio_blob=NULL,
227
228
  lease_owner=NULL, lease_expires_at=NULL, next_attempt_at=NULL, last_error=NULL,
228
229
  revision=revision+1, updated_at=? WHERE discussion_id=? AND sequence=?
229
- AND status='transcribing' AND lease_owner=?`).run(text, text, provider, language ?? null, confidence ?? null, now, discussionId, sequence, owner).changes;
230
+ AND status='transcribing' AND lease_owner=?
231
+ AND EXISTS (SELECT 1 FROM discussion_captures d WHERE d.id=discussion_id AND d.status IN ('recording','stopping'))`).run(text, text, provider, language ?? null, confidence ?? null, now, discussionId, sequence, owner).changes;
230
232
  if (changed) db.prepare("UPDATE discussion_captures SET transcript_revision=transcript_revision+1, updated_at=? WHERE id=?").run(now, discussionId);
231
233
  return changed;
232
234
  }) ? getDiscussionTranscriptSegment(discussionId, sequence) : null;
@@ -0,0 +1,8 @@
1
+ import type { DiscussionAnnotation, DiscussionAnnotationInput, DiscussionEvidence, DiscussionResolvedAnnotation } from '@xopcai/gateway-contract';
2
+ import type { NotesService } from '../notes/service.js';
3
+ import { type RecordingTimeline } from './media-timeline.js';
4
+ export declare function listAnnotations(id: string): DiscussionAnnotation[];
5
+ export declare function putAnnotation(id: string, value: DiscussionAnnotationInput): DiscussionAnnotation;
6
+ export declare function recordingTimeline(id: string, notes: NotesService): Promise<RecordingTimeline | undefined>;
7
+ export declare function evidenceFor(id: string, revision: number, ids: number[], notes: NotesService): Promise<DiscussionEvidence>;
8
+ export declare function resolvedAnnotations(id: string, notes: NotesService): Promise<DiscussionResolvedAnnotation[]>;
@@ -0,0 +1,183 @@
1
+ import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
2
+ import { DiscussionServiceError } from "./errors.js";
3
+ import { getDiscussionCapture, listDiscussionTranscriptSegments } from "./repository.js";
4
+ import { readTranscriptRevision, saveTranscriptRevision } from "./revisions.js";
5
+ import { pcmEpoch, playbackRanges, pointToPcm, probeMediaEpoch } from "./media-timeline.js";
6
+ import { z } from "zod";
7
+ //#region src/discussions/review.ts
8
+ init_transaction();
9
+ const anchorSchema = z.object({
10
+ type: z.enum(["time", "transcript"]),
11
+ capturedAt: z.number().int().nonnegative(),
12
+ epoch: z.number().int().min(0).max(100).optional(),
13
+ coordinate: z.enum(["encoded", "pcm"]).optional(),
14
+ offsetMs: z.number().min(0).max(8e6).optional(),
15
+ positionMs: z.number().min(0).max(8e6).optional(),
16
+ transcriptRevision: z.number().int().nonnegative().optional(),
17
+ segmentIds: z.array(z.number().int().nonnegative()).min(1).max(100).optional()
18
+ }).strict().refine((anchor) => anchor.type === "transcript" ? anchor.transcriptRevision !== void 0 && !!anchor.segmentIds?.length && anchor.offsetMs === void 0 && anchor.positionMs === void 0 : anchor.transcriptRevision === void 0 && anchor.segmentIds === void 0 && !(anchor.offsetMs !== void 0 && anchor.positionMs !== void 0) && (anchor.offsetMs === void 0 || anchor.epoch !== void 0));
19
+ const inputSchema = z.object({
20
+ id: z.string().regex(/^[a-zA-Z0-9_-]{1,100}$/),
21
+ kind: z.enum([
22
+ "highlight",
23
+ "question",
24
+ "note"
25
+ ]),
26
+ text: z.string().max(4e3),
27
+ anchor: anchorSchema,
28
+ expectedRevision: z.number().int().nonnegative(),
29
+ deleted: z.boolean().optional()
30
+ });
31
+ const map = (row) => ({
32
+ id: row.id,
33
+ kind: row.kind,
34
+ text: row.text,
35
+ anchor: JSON.parse(row.anchor_json),
36
+ revision: row.revision,
37
+ deleted: !!row.deleted,
38
+ createdAt: row.created_at,
39
+ updatedAt: row.updated_at
40
+ });
41
+ const requireCapture = (id) => {
42
+ const capture = getDiscussionCapture(id);
43
+ if (!capture) throw new DiscussionServiceError("not_found", "Discussion not found");
44
+ return capture;
45
+ };
46
+ function listAnnotations(id) {
47
+ requireCapture(id);
48
+ return getSqliteDatabase().prepare("SELECT * FROM discussion_annotations WHERE discussion_id=? ORDER BY created_at,id").all(id).map(map).sort((a, b) => a.anchor.capturedAt - b.anchor.capturedAt || a.id.localeCompare(b.id));
49
+ }
50
+ function putAnnotation(id, value) {
51
+ const parsed = inputSchema.safeParse(value);
52
+ if (!parsed.success) throw new DiscussionServiceError("invalid_input", "Invalid annotation");
53
+ const input = parsed.data;
54
+ return runSqliteWriteTransaction((db) => {
55
+ const capture = requireCapture(id);
56
+ if (input.anchor.type === "transcript") {
57
+ if (input.anchor.transcriptRevision === capture.transcriptRevision) saveTranscriptRevision(id);
58
+ const segments = readTranscriptRevision(id, input.anchor.transcriptRevision);
59
+ if (!segments || input.anchor.segmentIds.some((sequence) => !segments.some((segment) => segment.sequence === sequence && segment.status === "confirmed"))) throw new DiscussionServiceError("conflict", "Transcript evidence is no longer available");
60
+ }
61
+ const row = db.prepare("SELECT * FROM discussion_annotations WHERE discussion_id=? AND id=?").get(id, input.id);
62
+ const current = row ? map(row) : void 0;
63
+ const anchor = JSON.stringify(input.anchor);
64
+ if (current && current.kind === input.kind && current.text === input.text && current.deleted === !!input.deleted && JSON.stringify(current.anchor) === anchor) return current;
65
+ if ((current?.revision ?? 0) !== input.expectedRevision) throw new DiscussionServiceError("conflict", "Annotation changed; reload before saving");
66
+ if (current && JSON.stringify(current.anchor) !== anchor) {
67
+ const previous = current.anchor;
68
+ if (!(previous.type === "time" && previous.offsetMs === void 0 && previous.positionMs === void 0 && input.anchor.type === "time" && previous.capturedAt === input.anchor.capturedAt && previous.epoch === input.anchor.epoch && previous.coordinate === input.anchor.coordinate)) throw new DiscussionServiceError("conflict", "Original annotation anchor is immutable");
69
+ }
70
+ if (!current && Number(db.prepare("SELECT COUNT(*) n FROM discussion_annotations WHERE discussion_id=?").get(id).n) >= 1e3) throw new DiscussionServiceError("invalid_input", "Annotation limit reached");
71
+ const now = Date.now();
72
+ const revision = (current?.revision ?? 0) + 1;
73
+ db.prepare(`INSERT INTO discussion_annotations(discussion_id,id,kind,text,anchor_json,revision,deleted,created_at,updated_at)
74
+ VALUES (?,?,?,?,?,?,?,?,?) ON CONFLICT(discussion_id,id) DO UPDATE SET kind=excluded.kind,text=excluded.text,anchor_json=excluded.anchor_json,revision=excluded.revision,deleted=excluded.deleted,updated_at=excluded.updated_at`).run(id, input.id, input.kind, input.text, anchor, revision, input.deleted ? 1 : 0, current?.createdAt ?? now, now);
75
+ return {
76
+ id: input.id,
77
+ kind: input.kind,
78
+ text: input.text,
79
+ anchor: input.anchor,
80
+ revision,
81
+ deleted: !!input.deleted,
82
+ createdAt: current?.createdAt ?? now,
83
+ updatedAt: now
84
+ };
85
+ });
86
+ }
87
+ const timingAttempts = /* @__PURE__ */ new Map();
88
+ const timingInFlight = /* @__PURE__ */ new Map();
89
+ async function recordingTimeline(id, notes) {
90
+ const capture = requireCapture(id);
91
+ if (!capture.audioAttachmentId || capture.audioDeletedAt || !capture.durationMs) return;
92
+ const key = `${id}:${capture.audioSha256}`;
93
+ if (timingInFlight.has(key)) return timingInFlight.get(key);
94
+ const cached = getSqliteDatabase().prepare("SELECT timeline_json FROM discussion_media_timeline WHERE discussion_id=? AND audio_sha256=?").get(id, capture.audioSha256 ?? "");
95
+ let previous;
96
+ try {
97
+ previous = cached ? JSON.parse(cached.timeline_json) : void 0;
98
+ } catch {}
99
+ if (previous && Array.isArray(previous.epochs) && (previous.primary === "pcm" || previous.epochs.every((epoch) => epoch.verified))) return previous;
100
+ if (capture.mimeType?.includes("wav")) return {
101
+ primary: "pcm",
102
+ epochs: [pcmEpoch(capture.durationMs)]
103
+ };
104
+ if (previous && Date.now() - (timingAttempts.get(key) ?? 0) < 3e4) return previous;
105
+ timingAttempts.set(key, Date.now());
106
+ if (timingAttempts.size > 256) timingAttempts.delete(timingAttempts.keys().next().value);
107
+ const pending = (async () => {
108
+ const attachment = await notes.getAttachmentPath(capture.noteId, capture.audioAttachmentId);
109
+ if (!attachment) return;
110
+ const timeline = {
111
+ primary: "encoded",
112
+ epochs: [await probeMediaEpoch(attachment.filePath, capture.durationMs, 0, AbortSignal.timeout(35e3))]
113
+ };
114
+ if (getDiscussionCapture(id)?.audioSha256 === capture.audioSha256) getSqliteDatabase().prepare("INSERT OR REPLACE INTO discussion_media_timeline(discussion_id,audio_sha256,timeline_json) VALUES(?,?,?)").run(id, capture.audioSha256 ?? "", JSON.stringify(timeline));
115
+ return timeline;
116
+ })().finally(() => timingInFlight.delete(key));
117
+ timingInFlight.set(key, pending);
118
+ return pending;
119
+ }
120
+ async function evidenceFor(id, revision, ids, notes) {
121
+ const capture = requireCapture(id);
122
+ if (!Number.isSafeInteger(revision) || revision < 0 || !ids.length || ids.length > 100 || ids.some((id) => !Number.isSafeInteger(id) || id < 0)) throw new DiscussionServiceError("invalid_input", "Invalid evidence reference");
123
+ if (capture.transcriptRevision === revision) saveTranscriptRevision(id);
124
+ const source = readTranscriptRevision(id, revision);
125
+ if (!source || ids.some((id) => !source.some((segment) => segment.sequence === id && segment.status === "confirmed"))) throw new DiscussionServiceError("not_found", "Referenced transcript revision or segment is unavailable");
126
+ const attachment = capture.audioAttachmentId && !capture.audioDeletedAt ? await notes.getAttachmentPath(capture.noteId, capture.audioAttachmentId) : null;
127
+ const timeline = attachment ? await recordingTimeline(id, notes) : void 0;
128
+ return {
129
+ transcriptRevision: revision,
130
+ stale: revision !== getDiscussionCapture(id)?.transcriptRevision,
131
+ audioAvailable: !!attachment,
132
+ timingVerified: !!timeline && (timeline.primary === "pcm" || timeline.epochs.every((epoch) => epoch.verified)),
133
+ segments: source.filter((segment) => ids.includes(segment.sequence)).map((segment) => ({
134
+ sequence: segment.sequence,
135
+ startedAtMs: segment.startedAtMs,
136
+ endedAtMs: segment.endedAtMs,
137
+ text: segment.displayText ?? segment.rawText ?? "",
138
+ speakerLabel: segment.speakerLabel,
139
+ playback: timeline ? playbackRanges(timeline, segment.startedAtMs, segment.endedAtMs) : []
140
+ }))
141
+ };
142
+ }
143
+ async function resolvedAnnotations(id, notes) {
144
+ const capture = requireCapture(id);
145
+ const annotations = listAnnotations(id);
146
+ const timeline = await recordingTimeline(id, notes);
147
+ const current = listDiscussionTranscriptSegments(id).filter((segment) => segment.status === "confirmed");
148
+ return Promise.all(annotations.map(async (annotation) => {
149
+ const anchor = annotation.anchor;
150
+ if (annotation.deleted) return {
151
+ annotation,
152
+ state: "unavailable",
153
+ playback: []
154
+ };
155
+ if (anchor.type === "transcript") {
156
+ const evidence = await evidenceFor(id, anchor.transcriptRevision, anchor.segmentIds, notes).catch(() => void 0);
157
+ return {
158
+ annotation,
159
+ state: evidence ? "located" : "unavailable",
160
+ evidence,
161
+ playback: evidence?.segments.flatMap((segment) => segment.playback) ?? []
162
+ };
163
+ }
164
+ const epoch = timeline?.epochs[anchor.epoch ?? 0];
165
+ const position = anchor.positionMs ?? (epoch && anchor.offsetMs !== void 0 ? anchor.coordinate === "pcm" ? anchor.offsetMs < epoch.durationMs ? epoch.baseMs + anchor.offsetMs : void 0 : pointToPcm(epoch, anchor.offsetMs) : void 0);
166
+ if (!(!capture.audioDeletedAt && !!capture.audioAttachmentId && position !== void 0 && position >= 0 && position < (capture.durationMs ?? 0))) return {
167
+ annotation,
168
+ state: !capture.audioAttachmentId && !capture.audioDeletedAt ? "pending" : "unavailable",
169
+ playback: []
170
+ };
171
+ const refs = current.filter((segment) => segment.startedAtMs <= position && segment.endedAtMs > position).map((segment) => segment.sequence);
172
+ const evidence = refs.length ? await evidenceFor(id, capture.transcriptRevision, refs, notes) : void 0;
173
+ return {
174
+ annotation,
175
+ state: "located",
176
+ positionMs: position,
177
+ playback: timeline ? playbackRanges(timeline, Math.max(0, position - 2e3), Math.min(capture.durationMs, position + 8e3)) : [],
178
+ evidence
179
+ };
180
+ }));
181
+ }
182
+ //#endregion
183
+ export { evidenceFor, listAnnotations, putAnnotation, recordingTimeline, resolvedAnnotations };
@@ -1,5 +1,6 @@
1
1
  import type { Config } from '../config/schema.js';
2
2
  import type { NotesService } from '../notes/service.js';
3
+ import type { STTResult } from '../voice/stt/types.js';
3
4
  import type { DiscussionCapture } from './types.js';
4
5
  export interface DiscussionSealerDeps {
5
6
  processRecordingJob?: () => Promise<void>;
@@ -9,18 +10,23 @@ export interface DiscussionSealerDeps {
9
10
  text: string;
10
11
  language?: string;
11
12
  }>;
13
+ transcribeSegment?: (audio: Buffer, signal: AbortSignal) => Promise<STTResult>;
14
+ requestTimeoutMs?: number;
12
15
  onUpdated?: (capture: DiscussionCapture) => void;
13
16
  }
14
17
  export declare class DiscussionSealer {
15
18
  private readonly deps;
16
19
  private readonly intervalMs;
20
+ private readonly owner;
17
21
  private timer?;
18
22
  private running;
23
+ private recordingRunning;
24
+ private stopping;
25
+ private controller?;
19
26
  constructor(deps: DiscussionSealerDeps, intervalMs?: number);
20
27
  start(): void;
21
28
  stop(): Promise<void>;
22
29
  tick(now?: number): Promise<void>;
23
30
  private sealWhenReady;
24
31
  private transcribeFullRecording;
25
- private fail;
26
32
  }