@xopcai/xopc 0.0.277 → 0.0.282

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 (315) hide show
  1. package/dist/browser-ext/_locales/en/messages.json +34 -4
  2. package/dist/browser-ext/_locales/zh_CN/messages.json +34 -4
  3. package/dist/browser-ext/dist/assets/{auth-ClQTK565.js → auth-DB30ywek.js} +18 -53
  4. package/dist/browser-ext/dist/assets/pcm-capture-worklet-CGN9Mlhg.js +39 -0
  5. package/dist/browser-ext/dist/assets/{sidepanel-CeGqObOa.css → sidepanel-BbSQr-6P.css} +40 -6
  6. package/dist/browser-ext/dist/background.js +1 -1
  7. package/dist/browser-ext/dist/sidepanel.html +2 -2
  8. package/dist/browser-ext/dist/sidepanel.js +1219 -191
  9. package/dist/browser-ext/manifest.json +2 -1
  10. package/dist/extensions/telegram/xopc.extension.json +1 -1
  11. package/dist/gateway/static/root/assets/{activity-store-SJZ5fS17.js → activity-store-iPtG94qr.js} +1 -1
  12. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Cavbls0E.js → agent-avatar-dicebear-Cny5rATT.js} +1 -1
  13. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-OyQ8OVZv.js +1 -0
  14. package/dist/gateway/static/root/assets/{agents-DlDTItrB.js → agents-DJeh_Ewo.js} +1 -1
  15. package/dist/gateway/static/root/assets/{api-CnJAVHBu.js → api-KMJzMqvZ.js} +1 -1
  16. package/dist/gateway/static/root/assets/{app-management-settings-panel-5gS0_LWl.js → app-management-settings-panel-ZqQKaZEI.js} +1 -1
  17. package/dist/gateway/static/root/assets/{appearance-settings-DHzZCJon.js → appearance-settings-CfXsQkKO.js} +1 -1
  18. package/dist/gateway/static/root/assets/apps-page-k-QnVhKW.js +1 -0
  19. package/dist/gateway/static/root/assets/{archive-plugin-Ia98yZe3.js → archive-plugin-BrW53Hap.js} +1 -1
  20. package/dist/gateway/static/root/assets/{attachment-load-DiWW88c8.js → attachment-load-DkfFWHiS.js} +1 -1
  21. package/dist/gateway/static/root/assets/{automations-page-BuhTeGRJ.js → automations-page-e-5we6kD.js} +1 -1
  22. package/dist/gateway/static/root/assets/automations-workspace-DPnlkws1.js +6 -0
  23. package/dist/gateway/static/root/assets/{binary-plugins-DDD48cJv.js → binary-plugins-CWIswfXA.js} +1 -1
  24. package/dist/gateway/static/root/assets/{block-editor-0AWVCD3F.js → block-editor-CfeF1OmA.js} +3 -3
  25. package/dist/gateway/static/root/assets/{browser-automation-inputs-DcVLoIzc.js → browser-automation-inputs-BTIufVbM.js} +1 -1
  26. package/dist/gateway/static/root/assets/{browser-automations-page-BKOYX5xV.js → browser-automations-page-DnsuWKRu.js} +2 -2
  27. package/dist/gateway/static/root/assets/browser-settings-page-C8xyhnxx.js +8 -0
  28. package/dist/gateway/static/root/assets/capabilities-settings-panel-CBllOLTT.js +8 -0
  29. package/dist/gateway/static/root/assets/channels-settings-C-A-VUE2.js +1 -0
  30. package/dist/gateway/static/root/assets/{channels-status-swr-BTT2sIGg.js → channels-status-swr-DMYQNs-J.js} +1 -1
  31. package/dist/gateway/static/root/assets/{chat-terminal-dock-CW9Byi8V.js → chat-terminal-dock-C_Fw1R3A.js} +2 -2
  32. package/dist/gateway/static/root/assets/connectors-page-CtsMo3H4.js +2 -0
  33. package/dist/gateway/static/root/assets/{date-picker-gdYmKC8W.js → date-picker-CPFxjTrN.js} +1 -1
  34. package/dist/gateway/static/root/assets/{dependency-picker-40BYmiMc.js → dependency-picker-C_5KqzjI.js} +1 -1
  35. package/dist/gateway/static/root/assets/{desktop-pet-By1z6tKE.js → desktop-pet-DLJsC5D6.js} +1 -1
  36. package/dist/gateway/static/root/assets/{desktop-pet-settings-ByjJqx9H.js → desktop-pet-settings-BdI1iSgz.js} +1 -1
  37. package/dist/gateway/static/root/assets/device-pairing-wizard-BnvPLhc9.js +1 -0
  38. package/dist/gateway/static/root/assets/{extension-debug-page-DQO65KbM.js → extension-debug-page-BNS_TkZQ.js} +1 -1
  39. package/dist/gateway/static/root/assets/{extension-page-Db32jip6.js → extension-page-DMSDZ7Mb.js} +1 -1
  40. package/dist/gateway/static/root/assets/{extension-settings-page-CL8Wx8lf.js → extension-settings-page-CeGCWMt0.js} +1 -1
  41. package/dist/gateway/static/root/assets/gateway-config-swr-Cpmyrr6j.js +1 -0
  42. package/dist/gateway/static/root/assets/gateway-settings-DKOTYUma.js +1 -0
  43. package/dist/gateway/static/root/assets/{gateway-startup-retry-CVTa5HSS.js → gateway-startup-retry-DoiPeb65.js} +1 -1
  44. package/dist/gateway/static/root/assets/{heartbeat-settings-CRXWu2q6.js → heartbeat-settings-gsdL_Yij.js} +1 -1
  45. package/dist/gateway/static/root/assets/home-page-CbeAdS1T.js +1 -0
  46. package/dist/gateway/static/root/assets/{image-generation-api-DtMRG1oF.js → image-generation-api-CqjHWl2T.js} +1 -1
  47. package/dist/gateway/static/root/assets/index-B_Sg5BKz.css +2 -0
  48. package/dist/gateway/static/root/assets/index-enFXJJCU.js +74 -0
  49. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CjehhHPz.js → keyboard-shortcuts-settings-CCLtJ8s8.js} +1 -1
  50. package/dist/gateway/static/root/assets/local-app-workbench-page-DzC6SrXj.js +2 -0
  51. package/dist/gateway/static/root/assets/{local-apps-page-CrIdaTrK.js → local-apps-page-3LdgP3NO.js} +1 -1
  52. package/dist/gateway/static/root/assets/{locale-store-BkJ7g35d.js → locale-store-1urrBBCQ.js} +1 -1
  53. package/dist/gateway/static/root/assets/{logs-page-FfSwV_VH.js → logs-page-DHClKtm6.js} +2 -2
  54. package/dist/gateway/static/root/assets/{management-settings-BakV5aOw.js → management-settings-BaCo9Nuo.js} +1 -1
  55. package/dist/gateway/static/root/assets/{markdown-view-DF3aJP_5.js → markdown-view-BZmcFIWa.js} +1 -1
  56. package/dist/gateway/static/root/assets/{media-plugins-Blv9U6Jp.js → media-plugins-BMjJppvG.js} +1 -1
  57. package/dist/gateway/static/root/assets/messages-DYFcjtmG.js +3 -0
  58. package/dist/gateway/static/root/assets/note-detail-panel-hYO2jNhL.js +5 -0
  59. package/dist/gateway/static/root/assets/notes-page-BT66x22W.js +8 -0
  60. package/dist/gateway/static/root/assets/{page-tabs-BQfVtLLC.js → page-tabs-BCszXX_F.js} +1 -1
  61. package/dist/gateway/static/root/assets/{preview-open-alternatives-kjHFiO81.js → preview-open-alternatives-CyM0sanh.js} +1 -1
  62. package/dist/gateway/static/root/assets/proactive-page-CVDGA5sB.js +1 -0
  63. package/dist/gateway/static/root/assets/{product-open-page-BazdmFYo.js → product-open-page-lXAbj85Z.js} +1 -1
  64. package/dist/gateway/static/root/assets/project-detail-page-Bp6TAMPM.js +1 -0
  65. package/dist/gateway/static/root/assets/projects-page-UhOIiDcg.js +1 -0
  66. package/dist/gateway/static/root/assets/{registry-api-CTq8EECj.js → registry-api-CxQstD00.js} +1 -1
  67. package/dist/gateway/static/root/assets/remote-access-hub-DJIkMFT4.js +1 -0
  68. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-BhJlopSW.js → runtime-tools-settings-panel-BUFCgRdZ.js} +2 -2
  69. package/dist/gateway/static/root/assets/{schema-form-cxoO_5I1.js → schema-form-B01ksA8M.js} +1 -1
  70. package/dist/gateway/static/root/assets/sessions-page-CQOAwPDt.js +1 -0
  71. package/dist/gateway/static/root/assets/settings-advanced-gate-CFuqbGI-.js +1 -0
  72. package/dist/gateway/static/root/assets/{settings-form-section-BiRTWiBi.js → settings-form-section-DvnjZBa3.js} +1 -1
  73. package/dist/gateway/static/root/assets/{settings-page-D-Cb71pq.js → settings-page-DZRkpbCh.js} +1 -1
  74. package/dist/gateway/static/root/assets/setup-status-panel-DVaEiAVY.js +1 -0
  75. package/dist/gateway/static/root/assets/{share-preview-page-DciHfTay.js → share-preview-page-vz0UK56q.js} +1 -1
  76. package/dist/gateway/static/root/assets/shares-settings-XiCqMDAe.js +1 -0
  77. package/dist/gateway/static/root/assets/skill-reload-api-C3D8WanU.js +1 -0
  78. package/dist/gateway/static/root/assets/skills-page-CxMWwR6A.js +2 -0
  79. package/dist/gateway/static/root/assets/{skills-page.utils-CU7PALQB.js → skills-page.utils-BryVNYll.js} +1 -1
  80. package/dist/gateway/static/root/assets/{system-settings-panel-GpjNbqvM.js → system-settings-panel-mKFDe6aZ.js} +1 -1
  81. package/dist/gateway/static/root/assets/task-detail-page-Cb0RZNcJ.js +1 -0
  82. package/dist/gateway/static/root/assets/{theme-store-mV6Cm2vj.js → theme-store-Dc5s20V3.js} +1 -1
  83. package/dist/gateway/static/root/assets/tunnel-api-FcI3wKy3.js +1 -0
  84. package/dist/gateway/static/root/assets/{use-autosave-LvCiBidm.js → use-autosave-CDgdtjTC.js} +1 -1
  85. package/dist/gateway/static/root/assets/user-model-page-Cnshc-Un.js +2 -0
  86. package/dist/gateway/static/root/assets/{voice-api-key-field-BlGysZxj.js → voice-api-key-field-Ce8cb5mN.js} +1 -1
  87. package/dist/gateway/static/root/assets/{voice-config-api-D3DdcH4H.js → voice-config-api-Mk78BrpP.js} +1 -1
  88. package/dist/gateway/static/root/assets/{work-discovery-overlay-DvIQOR5x.js → work-discovery-overlay-CacFTtXe.js} +1 -1
  89. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-JIp60bXT.js → workflow-run-setup-panel-V-5HuEUq.js} +2 -2
  90. package/dist/gateway/static/root/assets/workflows-page-1OJimIfo.js +6 -0
  91. package/dist/gateway/static/root/index.html +10 -11
  92. package/dist/package.js +1 -1
  93. package/dist/packages/gateway-contract/src/discussions.js +17 -0
  94. package/dist/packages/gateway-contract/src/proactive.js +4 -2
  95. package/dist/src/agent/agent-manager.js +4 -4
  96. package/dist/src/agent/background-review/run-background-review.js +1 -1
  97. package/dist/src/agent/commands/command-isolation.d.ts +1 -0
  98. package/dist/src/agent/commands/command-isolation.js +17 -1
  99. package/dist/src/agent/commands/commandMounts.d.ts +2 -0
  100. package/dist/src/agent/commands/commandMounts.js +32 -0
  101. package/dist/src/agent/context/project-context.d.ts +1 -0
  102. package/dist/src/agent/context/project-context.js +12 -4
  103. package/dist/src/agent/embedded/model-runtime.js +1 -1
  104. package/dist/src/agent/embedded/run-for-session.js +1 -1
  105. package/dist/src/agent/image/tool-model-config.js +1 -1
  106. package/dist/src/agent/mcp/oauth/mcp-oauth-store.js +1 -1
  107. package/dist/src/agent/sandbox/command-validator.js +0 -20
  108. package/dist/src/agent/sandbox/exec-policy.d.ts +1 -0
  109. package/dist/src/agent/sandbox/exec-policy.js +4 -4
  110. package/dist/src/agent/sandbox/fileAccess.d.ts +7 -0
  111. package/dist/src/agent/sandbox/fileAccess.js +100 -0
  112. package/dist/src/agent/sandbox/path-policy.d.ts +2 -0
  113. package/dist/src/agent/sandbox/path-policy.js +54 -17
  114. package/dist/src/agent/sandbox/sanitize-env-vars.js +10 -9
  115. package/dist/src/agent/service.js +2 -2
  116. package/dist/src/agent/session/session-inspector.js +1 -1
  117. package/dist/src/agent/skills/hub-lock.js +1 -1
  118. package/dist/src/agent/source-context/task-context.d.ts +3 -0
  119. package/dist/src/agent/source-context/task-context.js +24 -0
  120. package/dist/src/agent/source-context/types.d.ts +2 -2
  121. package/dist/src/agent/source-context/types.js +1 -1
  122. package/dist/src/agent/tasks/task-judge-service.js +3 -3
  123. package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -1
  124. package/dist/src/agent/tool-manuals/xopc-use.js +1 -0
  125. package/dist/src/agent/tools/apply-patch.js +25 -38
  126. package/dist/src/agent/tools/create-share-tool.js +11 -3
  127. package/dist/src/agent/tools/exec-command.js +2 -1
  128. package/dist/src/agent/tools/find.js +5 -3
  129. package/dist/src/agent/tools/grep.js +21 -4
  130. package/dist/src/agent/tools/image-generate-tool.js +3 -4
  131. package/dist/src/agent/tools/list-dir.js +2 -1
  132. package/dist/src/agent/tools/managed-job-tool.js +1 -0
  133. package/dist/src/agent/tools/publish-artifacts.js +4 -3
  134. package/dist/src/agent/tools/read.js +8 -5
  135. package/dist/src/agent/tools/repository-search.d.ts +2 -0
  136. package/dist/src/agent/tools/repository-search.js +51 -7
  137. package/dist/src/agent/tools/review-workspace.js +76 -10
  138. package/dist/src/agent/tools/send-media.js +4 -3
  139. package/dist/src/agent/tools/tool-paths.js +3 -1
  140. package/dist/src/agent/tools/write.js +4 -17
  141. package/dist/src/agent/tools/xopc-use-tool.js +2 -2
  142. package/dist/src/agent-config/schema.d.ts +24 -0
  143. package/dist/src/agent-config/schema.js +2 -1
  144. package/dist/src/ai-assist/text-assist.js +1 -1
  145. package/dist/src/auth/credentials.js +2 -2
  146. package/dist/src/auth/oauth/xopc-cloud.js +1 -1
  147. package/dist/src/auth/profiles/store.js +1 -1
  148. package/dist/src/auth/sync-provider-auth.js +2 -2
  149. package/dist/src/browser/providers/browser-ext-install.js +1 -1
  150. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  151. package/dist/src/cli/commands/doctor/checks/provider-auth.js +21 -20
  152. package/dist/src/cli/commands/models.js +1 -1
  153. package/dist/src/config/index.js +4 -4
  154. package/dist/src/config/loader.js +2 -2
  155. package/dist/src/config/models-json.js +1 -1
  156. package/dist/src/config/schema.d.ts +16 -0
  157. package/dist/src/discussions/action-tasks.d.ts +21 -0
  158. package/dist/src/discussions/action-tasks.js +93 -0
  159. package/dist/src/discussions/analyzer.d.ts +21 -1
  160. package/dist/src/discussions/analyzer.js +229 -62
  161. package/dist/src/discussions/audio-repair.d.ts +8 -0
  162. package/dist/src/discussions/audio-repair.js +41 -0
  163. package/dist/src/discussions/edits.d.ts +22 -0
  164. package/dist/src/discussions/edits.js +81 -0
  165. package/dist/src/discussions/errors.d.ts +4 -0
  166. package/dist/src/discussions/errors.js +10 -0
  167. package/dist/src/discussions/export.d.ts +2 -0
  168. package/dist/src/discussions/export.js +23 -0
  169. package/dist/src/discussions/index.js +3 -2
  170. package/dist/src/discussions/live-worker.js +1 -1
  171. package/dist/src/discussions/organizer-worker.js +14 -5
  172. package/dist/src/discussions/organizer.d.ts +1 -1
  173. package/dist/src/discussions/organizer.js +60 -24
  174. package/dist/src/discussions/reconcile.d.ts +22 -0
  175. package/dist/src/discussions/reconcile.js +55 -0
  176. package/dist/src/discussions/recording.d.ts +9 -0
  177. package/dist/src/discussions/recording.js +219 -0
  178. package/dist/src/discussions/recordingJobs.d.ts +14 -0
  179. package/dist/src/discussions/recordingJobs.js +69 -0
  180. package/dist/src/discussions/repository.d.ts +4 -2
  181. package/dist/src/discussions/repository.js +15 -10
  182. package/dist/src/discussions/revisions.d.ts +12 -0
  183. package/dist/src/discussions/revisions.js +36 -0
  184. package/dist/src/discussions/sealer.d.ts +1 -0
  185. package/dist/src/discussions/sealer.js +61 -11
  186. package/dist/src/discussions/service.d.ts +16 -15
  187. package/dist/src/discussions/service.js +177 -91
  188. package/dist/src/discussions/types.d.ts +4 -139
  189. package/dist/src/discussions/types.js +1 -11
  190. package/dist/src/extensions/lockfile.js +1 -1
  191. package/dist/src/files/file-service.d.ts +1 -0
  192. package/dist/src/files/file-service.js +77 -0
  193. package/dist/src/gateway/agents-admin.js +1 -1
  194. package/dist/src/gateway/chat-stream/mapper.js +2 -2
  195. package/dist/src/gateway/file-path-classifier.js +1 -1
  196. package/dist/src/gateway/hono/app.js +3 -2
  197. package/dist/src/gateway/hono/lib/config-payload.d.ts +1 -0
  198. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  199. package/dist/src/gateway/hono/lib/static-ui.js +1 -0
  200. package/dist/src/gateway/hono/routes/context-sources.js +1 -2
  201. package/dist/src/gateway/hono/routes/discussions.js +126 -19
  202. package/dist/src/gateway/hono/routes/files.js +1 -22
  203. package/dist/src/gateway/hono/routes/index.js +0 -2
  204. package/dist/src/gateway/hono/routes/lazy-bundles.js +16 -0
  205. package/dist/src/gateway/hono/routes/models.js +1 -1
  206. package/dist/src/gateway/hono/routes/proactive-control.js +2 -36
  207. package/dist/src/gateway/hono/routes/project-understanding.d.ts +3 -0
  208. package/dist/src/gateway/hono/routes/project-understanding.js +65 -0
  209. package/dist/src/gateway/hono/routes/projects.js +20 -4
  210. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +2 -2
  211. package/dist/src/gateway/hono/routes/session-input-handler.js +2 -2
  212. package/dist/src/gateway/hono/routes/shares.js +22 -1
  213. package/dist/src/gateway/hono/routes/tasks.js +2 -1
  214. package/dist/src/gateway/hono/routes/work-discovery.d.ts +0 -2
  215. package/dist/src/gateway/hono/routes/work-discovery.js +2 -16
  216. package/dist/src/gateway/hono/routes/workflows.js +2 -2
  217. package/dist/src/gateway/security/gateway-scopes.js +1 -2
  218. package/dist/src/gateway/service/agent-runner.js +2 -2
  219. package/dist/src/gateway/service/config-coordinator.js +1 -1
  220. package/dist/src/gateway/service.d.ts +3 -0
  221. package/dist/src/gateway/service.js +28 -13
  222. package/dist/src/knowledge-memory/repository.d.ts +2 -0
  223. package/dist/src/knowledge-memory/repository.js +3 -1
  224. package/dist/src/media-understanding/audio-transcription-runner.d.ts +1 -0
  225. package/dist/src/media-understanding/audio-transcription-runner.js +1 -0
  226. package/dist/src/media-understanding/runner.js +1 -0
  227. package/dist/src/media-understanding/types.d.ts +8 -0
  228. package/dist/src/notes/service.d.ts +3 -1
  229. package/dist/src/notes/store.d.ts +3 -1
  230. package/dist/src/notes/store.js +5 -3
  231. package/dist/src/proactive/experience.d.ts +38 -21
  232. package/dist/src/proactive/experience.js +113 -12
  233. package/dist/src/proactive/inbox/cards.js +7 -1
  234. package/dist/src/proactive/maintenance.js +0 -1
  235. package/dist/src/proactive/scenarios/control.d.ts +0 -35
  236. package/dist/src/proactive/scenarios/control.js +7 -53
  237. package/dist/src/projects/project-store.js +6 -4
  238. package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
  239. package/dist/src/providers/index.js +2 -2
  240. package/dist/src/providers/model-registry.js +1 -1
  241. package/dist/src/providers/register-runtime-providers.js +1 -1
  242. package/dist/src/session/client-history.d.ts +1 -1
  243. package/dist/src/session/client-history.js +1 -1
  244. package/dist/src/share/share-store.js +5 -1
  245. package/dist/src/storage/sqlite/migrations/166_remove_proactive_previews.sql +1 -0
  246. package/dist/src/storage/sqlite/migrations/167_discussion_recording_chunks.sql +7 -0
  247. package/dist/src/storage/sqlite/migrations/168_discussion_evidence.sql +16 -0
  248. package/dist/src/storage/sqlite/migrations/169_discussion_action_tasks.sql +8 -0
  249. package/dist/src/storage/sqlite/migrations/170_discussion_edits.sql +8 -0
  250. package/dist/src/storage/sqlite/migrations/171_discussion_recording_jobs.sql +14 -0
  251. package/dist/src/storage/sqlite/migrations/172_project_understanding.sql +3 -0
  252. package/dist/src/storage/sqlite/migrations/173_mobile_discussion_source.sql +5 -0
  253. package/dist/src/storage/sqlite/migrations/__tests__/mobile-discussion-source.test.ts +20 -0
  254. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  255. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  256. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  257. package/dist/src/storage/sqlite/schema.js +1 -1
  258. package/dist/src/tasks/home-query-service.js +2 -2
  259. package/dist/src/tasks/task-application-service.js +77 -3
  260. package/dist/src/tasks/task-context-assembler.js +1 -0
  261. package/dist/src/tasks/task-repository.d.ts +1 -0
  262. package/dist/src/tasks/task-repository.js +4 -0
  263. package/dist/src/tui/tui-startup-resources.js +1 -1
  264. package/dist/src/tui/tui.js +1 -1
  265. package/dist/src/voice/audio/normalize.js +28 -5
  266. package/dist/src/voice/stt/transcribe-core.js +1 -0
  267. package/dist/src/voice/stt/types.d.ts +1 -0
  268. package/dist/src/work-discovery/analyzer.d.ts +1 -0
  269. package/dist/src/work-discovery/analyzer.js +28 -22
  270. package/dist/src/work-discovery/index.js +3 -3
  271. package/dist/src/work-discovery/investigator.js +1 -1
  272. package/dist/src/work-discovery/project-understanding.d.ts +7 -0
  273. package/dist/src/work-discovery/project-understanding.js +38 -0
  274. package/dist/src/work-discovery/repository.d.ts +3 -1
  275. package/dist/src/work-discovery/repository.js +18 -5
  276. package/dist/src/work-discovery/service.d.ts +8 -0
  277. package/dist/src/work-discovery/service.js +163 -15
  278. package/dist/src/work-discovery/types.d.ts +2 -0
  279. package/dist/src/workflows/service/workflow-run-service.js +2 -2
  280. package/package.json +3 -3
  281. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-DyCyuJpi.js +0 -1
  282. package/dist/gateway/static/root/assets/apps-page-__yzruGu.js +0 -1
  283. package/dist/gateway/static/root/assets/automations-workspace-DaisbmEh.js +0 -6
  284. package/dist/gateway/static/root/assets/browser-settings-page-C7zjxscU.js +0 -8
  285. package/dist/gateway/static/root/assets/capabilities-settings-panel-7kZMT1r6.js +0 -8
  286. package/dist/gateway/static/root/assets/channels-settings-BKUh6hzO.js +0 -1
  287. package/dist/gateway/static/root/assets/config-reload-event-Bjh2zoKp.js +0 -1
  288. package/dist/gateway/static/root/assets/connectors-page-m8J-F3u8.js +0 -2
  289. package/dist/gateway/static/root/assets/device-pairing-wizard-CfWQfz7a.js +0 -1
  290. package/dist/gateway/static/root/assets/gateway-config-swr-cd8owslz.js +0 -1
  291. package/dist/gateway/static/root/assets/gateway-settings-wLly-Kc1.js +0 -1
  292. package/dist/gateway/static/root/assets/home-page-FqgSwpmy.js +0 -1
  293. package/dist/gateway/static/root/assets/index-5UchbidQ.js +0 -74
  294. package/dist/gateway/static/root/assets/index-CXF9-BpI.css +0 -2
  295. package/dist/gateway/static/root/assets/local-app-workbench-page-DtYZa4GK.js +0 -2
  296. package/dist/gateway/static/root/assets/messages-BGc-OJWg.js +0 -3
  297. package/dist/gateway/static/root/assets/note-detail-panel-JbvyGdEX.js +0 -5
  298. package/dist/gateway/static/root/assets/notes-page-Dm7mE2FK.js +0 -8
  299. package/dist/gateway/static/root/assets/proactive-card-Ap_wfos3.js +0 -1
  300. package/dist/gateway/static/root/assets/proactive-page-D1lEuanT.js +0 -1
  301. package/dist/gateway/static/root/assets/project-detail-page-h00lfcVI.js +0 -1
  302. package/dist/gateway/static/root/assets/projects-page-C2Bo1FAL.js +0 -1
  303. package/dist/gateway/static/root/assets/remote-access-hub-_bZYAl49.js +0 -1
  304. package/dist/gateway/static/root/assets/sessions-page-F7CHsvPa.js +0 -1
  305. package/dist/gateway/static/root/assets/settings-advanced-gate-DtZSUX4H.js +0 -1
  306. package/dist/gateway/static/root/assets/setup-status-panel-VPfBsNVv.js +0 -1
  307. package/dist/gateway/static/root/assets/shares-settings-BS2pnWO0.js +0 -1
  308. package/dist/gateway/static/root/assets/skill-reload-api-DX344nVV.js +0 -1
  309. package/dist/gateway/static/root/assets/skills-page-BhfKUsv7.js +0 -2
  310. package/dist/gateway/static/root/assets/task-detail-page-CElcQ9Sh.js +0 -1
  311. package/dist/gateway/static/root/assets/tunnel-api-Bhi_x_h4.js +0 -1
  312. package/dist/gateway/static/root/assets/user-model-page-BydARq2C.js +0 -2
  313. package/dist/gateway/static/root/assets/workflows-page-B972t6zx.js +0 -6
  314. package/dist/src/proactive/scenarios/preview.d.ts +0 -13
  315. package/dist/src/proactive/scenarios/preview.js +0 -81
@@ -1,5 +1,5 @@
1
1
  import { getSqliteDatabase, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
2
- import { DISCUSSION_STATUSES } from "./types.js";
2
+ import { DISCUSSION_STATUSES } from "../../packages/gateway-contract/src/discussions.js";
3
3
  import { randomUUID } from "node:crypto";
4
4
  //#region src/discussions/repository.ts
5
5
  function optional(condition, value) {
@@ -17,6 +17,7 @@ function discussionFromRow(row) {
17
17
  createdAt: row.created_at,
18
18
  updatedAt: row.updated_at
19
19
  };
20
+ capture.template = row.organization_template;
20
21
  if (row.project_id) capture.projectId = row.project_id;
21
22
  if (row.audio_attachment_id) capture.audioAttachmentId = row.audio_attachment_id;
22
23
  if (row.duration_ms != null) capture.durationMs = row.duration_ms;
@@ -71,6 +72,7 @@ function organizationFromRow(row) {
71
72
  revision: row.revision,
72
73
  inputTranscriptSha256: row.input_transcript_sha256,
73
74
  promptVersion: row.prompt_version,
75
+ transcriptRevision: row.transcript_revision,
74
76
  modelRef: row.model_ref,
75
77
  ...optional(row.organization_json, { organization: JSON.parse(row.organization_json) }),
76
78
  status: row.status,
@@ -161,7 +163,7 @@ function updateDiscussionCapture(id, patch, expectedStatuses) {
161
163
  mime_type=?, audio_size_bytes=?, audio_sha256=?, canonical_transcript=?, canonical_transcript_sha256=?,
162
164
  transcript_language=?, transcript_revision=?, generated_title=?, project_inference_score=?,
163
165
  project_inference_source=?, failure_stage=?, failure_code=?, failure_message=?, recording_started_at=?,
164
- recording_stopped_at=?, updated_at=?, completed_at=?, audio_deleted_at=? WHERE id=?${statusGuard}`).run(next.projectId ?? null, next.audioAttachmentId ?? null, next.source, next.status, next.durationMs ?? null, next.expectedLastSequence ?? null, next.mimeType ?? null, next.audioSizeBytes ?? null, next.audioSha256 ?? null, next.canonicalTranscript ?? null, next.canonicalTranscriptSha256 ?? null, next.transcriptLanguage ?? null, next.transcriptRevision, next.generatedTitle ?? null, next.projectInferenceScore ?? null, next.projectInferenceSource ?? null, next.failureStage ?? null, next.failureCode ?? null, next.failureMessage ?? null, next.recordingStartedAt, next.recordingStoppedAt ?? null, next.updatedAt, next.completedAt ?? null, next.audioDeletedAt ?? null, id, ...expectedStatuses ?? []).changes) ? getDiscussionCapture(id) : null;
166
+ recording_stopped_at=?, updated_at=?, completed_at=?, audio_deleted_at=?, organization_template=? WHERE id=?${statusGuard}`).run(next.projectId ?? null, next.audioAttachmentId ?? null, next.source, next.status, next.durationMs ?? null, next.expectedLastSequence ?? null, next.mimeType ?? null, next.audioSizeBytes ?? null, next.audioSha256 ?? null, next.canonicalTranscript ?? null, next.canonicalTranscriptSha256 ?? null, next.transcriptLanguage ?? null, next.transcriptRevision, next.generatedTitle ?? null, next.projectInferenceScore ?? null, next.projectInferenceSource ?? null, next.failureStage ?? null, next.failureCode ?? null, next.failureMessage ?? null, next.recordingStartedAt, next.recordingStoppedAt ?? null, next.updatedAt, next.completedAt ?? null, next.audioDeletedAt ?? null, next.template ?? "general", id, ...expectedStatuses ?? []).changes) ? getDiscussionCapture(id) : null;
165
167
  }
166
168
  function claimNextDiscussionCapture(owner, now = Date.now(), leaseMs = 5 * 6e4) {
167
169
  return runSqliteWriteTransaction((db) => {
@@ -173,8 +175,8 @@ function claimNextDiscussionCapture(owner, now = Date.now(), leaseMs = 5 * 6e4)
173
175
  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;
174
176
  });
175
177
  }
176
- function releaseDiscussionWorkLease(id) {
177
- runSqliteWriteTransaction((db) => db.prepare("UPDATE discussion_captures SET work_lease_owner=NULL, work_lease_expires_at=NULL WHERE id=?").run(id));
178
+ function releaseDiscussionWorkLease(id, owner) {
179
+ runSqliteWriteTransaction((db) => db.prepare("UPDATE discussion_captures SET work_lease_owner=NULL, work_lease_expires_at=NULL WHERE id=? AND work_lease_owner=?").run(id, owner));
178
180
  }
179
181
  function createDiscussionTranscriptSegment(input) {
180
182
  const existing = getDiscussionTranscriptSegment(input.discussionId, input.sequence);
@@ -228,12 +230,12 @@ function completeDiscussionTranscriptSegment(discussionId, sequence, owner, text
228
230
  return changed;
229
231
  }) ? getDiscussionTranscriptSegment(discussionId, sequence) : null;
230
232
  }
231
- function correctDiscussionTranscriptSegment(discussionId, sequence, displayText, expectedRevision) {
233
+ function correctDiscussionTranscriptSegment(discussionId, sequence, displayText, expectedRevision, speakerLabel) {
232
234
  const now = Date.now();
233
235
  return runSqliteWriteTransaction((db) => {
234
- const changed = db.prepare(`UPDATE discussion_transcript_segments SET display_text=?, corrected_by_user=1,
236
+ const changed = db.prepare(`UPDATE discussion_transcript_segments SET display_text=?, speaker_label=CASE WHEN ? THEN ? ELSE speaker_label END, corrected_by_user=1,
235
237
  corrected_at=?, revision=revision+1, updated_at=? WHERE discussion_id=? AND sequence=?
236
- AND status='confirmed' AND revision=?`).run(displayText, now, now, discussionId, sequence, expectedRevision).changes;
238
+ AND status='confirmed' AND revision=?`).run(displayText, speakerLabel === void 0 ? 0 : 1, speakerLabel?.trim() || null, now, now, discussionId, sequence, expectedRevision).changes;
237
239
  if (changed) db.prepare("UPDATE discussion_captures SET transcript_revision=transcript_revision+1, updated_at=? WHERE id=?").run(now, discussionId);
238
240
  return changed;
239
241
  }) ? getDiscussionTranscriptSegment(discussionId, sequence) : null;
@@ -253,8 +255,8 @@ function createDiscussionOrganization(input) {
253
255
  const revision = (getLatestDiscussionOrganization(input.discussionId)?.revision ?? 0) + 1;
254
256
  const id = randomUUID();
255
257
  runSqliteWriteTransaction((db) => db.prepare(`INSERT INTO discussion_organizations (
256
- id, discussion_id, revision, input_transcript_sha256, prompt_version, model_ref, status, created_at
257
- ) VALUES (?, ?, ?, ?, ?, ?, 'running', ?)`).run(id, input.discussionId, revision, input.inputTranscriptSha256, input.promptVersion, input.modelRef, now));
258
+ id, discussion_id, revision, input_transcript_sha256, prompt_version, model_ref, transcript_revision, status, created_at
259
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, 'running', ?)`).run(id, input.discussionId, revision, input.inputTranscriptSha256, input.promptVersion, input.modelRef, input.transcriptRevision, now));
258
260
  return getLatestDiscussionOrganization(input.discussionId);
259
261
  }
260
262
  function getLatestDiscussionOrganization(discussionId) {
@@ -285,5 +287,8 @@ function acknowledgeDiscussionCaptureConsent(policyVersion) {
285
287
  SET consent_acknowledged_at=?, updated_at=? WHERE workspace_id='default' AND consent_policy_version=?`).run(now, now, policyVersion));
286
288
  return getDiscussionCaptureSettings();
287
289
  }
290
+ function renewDiscussionWorkLease(id, owner) {
291
+ return Number(getSqliteDatabase().prepare("UPDATE discussion_captures SET work_lease_expires_at=? WHERE id=? AND work_lease_owner=? AND status='organizing'").run(Date.now() + 5 * 6e4, id, owner).changes) === 1;
292
+ }
288
293
  //#endregion
289
- export { acknowledgeDiscussionCaptureConsent, claimNextDiscussionCapture, claimNextDiscussionTranscriptSegment, completeDiscussionOrganization, completeDiscussionTranscriptSegment, correctDiscussionTranscriptSegment, createDiscussionCapture, createDiscussionOrganization, createDiscussionTranscriptSegment, deleteDiscussionSegmentAudio, failDiscussionOrganization, getDiscussionCapture, getDiscussionCaptureByClientRequestId, getDiscussionCaptureByNoteId, getDiscussionCaptureSettings, getDiscussionMetrics, getDiscussionTranscriptSegment, getLatestDiscussionOrganization, listDiscussionCaptures, listDiscussionTranscriptSegments, releaseDiscussionWorkLease, retryOrFailDiscussionTranscriptSegment, updateDiscussionCapture };
294
+ export { acknowledgeDiscussionCaptureConsent, claimNextDiscussionCapture, claimNextDiscussionTranscriptSegment, completeDiscussionOrganization, completeDiscussionTranscriptSegment, correctDiscussionTranscriptSegment, createDiscussionCapture, createDiscussionOrganization, createDiscussionTranscriptSegment, deleteDiscussionSegmentAudio, failDiscussionOrganization, getDiscussionCapture, getDiscussionCaptureByClientRequestId, getDiscussionCaptureByNoteId, getDiscussionCaptureSettings, getDiscussionMetrics, getDiscussionTranscriptSegment, getLatestDiscussionOrganization, listDiscussionCaptures, listDiscussionTranscriptSegments, releaseDiscussionWorkLease, renewDiscussionWorkLease, retryOrFailDiscussionTranscriptSegment, updateDiscussionCapture };
@@ -0,0 +1,12 @@
1
+ import type { DiscussionTranscriptSegment } from './types.js';
2
+ export declare function saveTranscriptRevision(id: string): number;
3
+ export declare function readTranscriptRevision(id: string, revision: number): DiscussionTranscriptSegment[] | null;
4
+ export declare function replaceTranscriptSegments(id: string, segments: Array<{
5
+ text: string;
6
+ startedAtMs: number;
7
+ endedAtMs: number;
8
+ speakerLabel?: string;
9
+ correctedByUser?: boolean;
10
+ rawText?: string;
11
+ }>): void;
12
+ export declare function refreshCanonicalTranscript(id: string): void;
@@ -0,0 +1,36 @@
1
+ import { getSqliteDatabase, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
2
+ import { getDiscussionCapture, listDiscussionTranscriptSegments, updateDiscussionCapture } from "./repository.js";
3
+ import { assembleDiscussionTranscript } from "./transcript.js";
4
+ import { createHash } from "node:crypto";
5
+ //#region src/discussions/revisions.ts
6
+ function saveTranscriptRevision(id) {
7
+ const capture = getDiscussionCapture(id);
8
+ if (!capture) throw new Error("Discussion not found");
9
+ getSqliteDatabase().prepare("INSERT OR IGNORE INTO discussion_transcript_revisions (discussion_id, revision, segments_json, created_at) VALUES (?, ?, ?, ?)").run(id, capture.transcriptRevision, JSON.stringify(listDiscussionTranscriptSegments(id)), Date.now());
10
+ return capture.transcriptRevision;
11
+ }
12
+ function readTranscriptRevision(id, revision) {
13
+ const row = getSqliteDatabase().prepare("SELECT segments_json FROM discussion_transcript_revisions WHERE discussion_id=? AND revision=?").get(id, revision);
14
+ return row ? JSON.parse(row.segments_json) : null;
15
+ }
16
+ function replaceTranscriptSegments(id, segments) {
17
+ runSqliteWriteTransaction((db) => {
18
+ saveTranscriptRevision(id);
19
+ db.prepare("DELETE FROM discussion_transcript_segments WHERE discussion_id=?").run(id);
20
+ const insert = db.prepare(`INSERT INTO discussion_transcript_segments
21
+ (discussion_id, sequence, audio_sha256, started_at_ms, ended_at_ms, status, raw_text, display_text, speaker_label, revision, corrected_by_user, attempt_count, created_at, updated_at)
22
+ VALUES (?, ?, ?, ?, ?, 'confirmed', ?, ?, ?, 1, ?, 0, ?, ?)`);
23
+ segments.forEach((segment, index) => insert.run(id, index, createHash("sha256").update(segment.text).digest("hex"), segment.startedAtMs, segment.endedAtMs, segment.rawText ?? segment.text, segment.text, segment.speakerLabel ?? null, segment.correctedByUser ? 1 : 0, Date.now(), Date.now()));
24
+ db.prepare("UPDATE discussion_captures SET transcript_revision=transcript_revision+1 WHERE id=?").run(id);
25
+ saveTranscriptRevision(id);
26
+ });
27
+ }
28
+ function refreshCanonicalTranscript(id) {
29
+ const text = assembleDiscussionTranscript(listDiscussionTranscriptSegments(id));
30
+ updateDiscussionCapture(id, {
31
+ canonicalTranscript: text,
32
+ canonicalTranscriptSha256: createHash("sha256").update(text).digest("hex")
33
+ });
34
+ }
35
+ //#endregion
36
+ export { readTranscriptRevision, refreshCanonicalTranscript, replaceTranscriptSegments, saveTranscriptRevision };
@@ -2,6 +2,7 @@ import type { Config } from '../config/schema.js';
2
2
  import type { NotesService } from '../notes/service.js';
3
3
  import type { DiscussionCapture } from './types.js';
4
4
  export interface DiscussionSealerDeps {
5
+ processRecordingJob?: () => Promise<void>;
5
6
  notes: NotesService;
6
7
  getConfig: () => Config;
7
8
  transcribeRecording?: (filePath: string, capture: DiscussionCapture, signal?: AbortSignal) => Promise<{
@@ -1,12 +1,16 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
+ import { decodeWavToMonoFloat32 } from "../voice/local/wav.js";
3
4
  import { forEachNormalizedAudioSegment } from "../voice/audio/normalize.js";
4
5
  import { transcribe } from "../voice/stt/transcribe-core.js";
5
6
  import { isSTTAvailable } from "../voice/stt/availability.js";
6
7
  import { mergeSttConfigFromAppConfig } from "../voice/stt/config.js";
7
8
  import "../voice/stt/index.js";
8
9
  import { getDiscussionCapture, listDiscussionCaptures, listDiscussionTranscriptSegments, updateDiscussionCapture } from "./repository.js";
9
- import { appendSequentialTranscript, assembleDiscussionTranscript } from "./transcript.js";
10
+ import { assembleDiscussionTranscript } from "./transcript.js";
11
+ import { replaceTranscriptSegments, saveTranscriptRevision } from "./revisions.js";
12
+ import { missingAudioRanges, slicePcmWav } from "./audio-repair.js";
13
+ import { getRecordingJob } from "./recordingJobs.js";
10
14
  import { createHash } from "node:crypto";
11
15
  //#region src/discussions/sealer.ts
12
16
  init_logger();
@@ -34,6 +38,7 @@ var DiscussionSealer = class {
34
38
  if (this.running) return;
35
39
  this.running = true;
36
40
  try {
41
+ await this.deps.processRecordingJob?.();
37
42
  const capture = [...listDiscussionCaptures({
38
43
  status: "sealing",
39
44
  limit: 1
@@ -50,6 +55,8 @@ var DiscussionSealer = class {
50
55
  async sealWhenReady(capture, now) {
51
56
  const ageMs = now - (capture.recordingStoppedAt ?? now);
52
57
  if (!capture.audioAttachmentId) {
58
+ const job = getRecordingJob(capture.id);
59
+ if (job && (job.state === "queued" || job.state === "running")) return;
53
60
  if (ageMs >= UPLOAD_GRACE_MS) this.fail(capture, "audio_upload", "recording_missing", "Original recording was not uploaded");
54
61
  return;
55
62
  }
@@ -65,6 +72,7 @@ var DiscussionSealer = class {
65
72
  const confirmed = segments.filter((segment) => segment.status === "confirmed");
66
73
  const result = expected >= 0 && missing.length === 0 && !pending && confirmed.length === expected + 1 ? { text: assembleDiscussionTranscript(confirmed) } : await this.transcribeFullRecording(sealing);
67
74
  const text = result.text.trim();
75
+ saveTranscriptRevision(capture.id);
68
76
  if (!text) throw new Error("Discussion transcription produced no text");
69
77
  const updated = updateDiscussionCapture(capture.id, {
70
78
  status: "organizing",
@@ -85,22 +93,64 @@ var DiscussionSealer = class {
85
93
  async transcribeFullRecording(capture) {
86
94
  const attachment = await this.deps.notes.getAttachmentPath(capture.noteId, capture.audioAttachmentId);
87
95
  if (!attachment) throw new Error("Discussion audio file is missing");
88
- if (this.deps.transcribeRecording) return this.deps.transcribeRecording(attachment.filePath, capture);
96
+ if (this.deps.transcribeRecording) {
97
+ const result = await this.deps.transcribeRecording(attachment.filePath, capture);
98
+ replaceTranscriptSegments(capture.id, [{
99
+ text: result.text,
100
+ startedAtMs: 0,
101
+ endedAtMs: capture.durationMs ?? 1e3
102
+ }]);
103
+ return result;
104
+ }
89
105
  const config = this.deps.getConfig();
90
106
  const sttConfig = mergeSttConfigFromAppConfig(config.tools?.media?.audio, config.tools?.media);
91
107
  if (!isSTTAvailable(sttConfig)) throw new Error("STT is not configured");
92
- let text = "";
108
+ let offset = 0;
109
+ const confirmed = listDiscussionTranscriptSegments(capture.id).filter((segment) => segment.status === "confirmed");
110
+ const segments = confirmed.map((segment) => ({
111
+ text: segment.displayText ?? segment.rawText ?? "",
112
+ rawText: segment.rawText,
113
+ startedAtMs: segment.startedAtMs,
114
+ endedAtMs: segment.endedAtMs,
115
+ speakerLabel: segment.speakerLabel,
116
+ correctedByUser: segment.correctedByUser
117
+ }));
93
118
  let language;
94
- await forEachNormalizedAudioSegment({ filePath: attachment.filePath }, async (buffer, index) => {
95
- const result = await transcribe(buffer, sttConfig, {
96
- mime: "audio/wav",
97
- fileName: `discussion-recovery-${index}.wav`
98
- });
99
- text = appendSequentialTranscript(text, result.text);
100
- language ??= result.language;
119
+ await forEachNormalizedAudioSegment({
120
+ filePath: attachment.filePath,
121
+ maxDurationSeconds: 7200
122
+ }, async (buffer, index) => {
123
+ const decoded = decodeWavToMonoFloat32(buffer);
124
+ const durationMs = decoded.durationSeconds * 1e3;
125
+ const gaps = missingAudioRanges(offset, offset + durationMs, confirmed);
126
+ for (const [gapIndex, gap] of gaps.entries()) {
127
+ const audio = gaps.length === 1 && gap.startedAtMs === offset && gap.endedAtMs === offset + durationMs ? buffer : slicePcmWav(decoded, gap.startedAtMs - offset, gap.endedAtMs - offset);
128
+ if (audio.length <= 44) continue;
129
+ const result = await transcribe(audio, sttConfig, {
130
+ mime: "audio/wav",
131
+ fileName: `discussion-recovery-${index}-${gapIndex}.wav`
132
+ });
133
+ if (result.segments?.length) for (const part of result.segments) {
134
+ if (!Number.isFinite(part.startMs) || !Number.isFinite(part.endMs) || part.startMs < 0 || part.endMs <= part.startMs || part.endMs > gap.endedAtMs - gap.startedAtMs + 100) throw new Error("Provider returned an invalid transcript time range");
135
+ segments.push({
136
+ text: part.text,
137
+ startedAtMs: gap.startedAtMs + part.startMs,
138
+ endedAtMs: Math.min(gap.endedAtMs, gap.startedAtMs + part.endMs),
139
+ ...part.speaker ? { speakerLabel: `${index + 1}:${gapIndex + 1}:${part.speaker}` } : {}
140
+ });
141
+ }
142
+ else if (result.text.trim()) segments.push({
143
+ text: result.text,
144
+ ...gap
145
+ });
146
+ language ??= result.language;
147
+ }
148
+ offset += durationMs;
101
149
  });
150
+ segments.sort((a, b) => a.startedAtMs - b.startedAtMs);
151
+ replaceTranscriptSegments(capture.id, segments);
102
152
  return {
103
- text,
153
+ text: assembleDiscussionTranscript(listDiscussionTranscriptSegments(capture.id)),
104
154
  ...language ? { language } : {}
105
155
  };
106
156
  }
@@ -1,13 +1,10 @@
1
+ import { type DiscussionRecordingManifest } from '@xopcai/gateway-contract';
1
2
  import type { NotesService } from '../notes/service.js';
2
3
  import type { ProjectService } from '../projects/project-service.js';
3
4
  import type { CreateDiscussionInput, DiscussionCaptureSettings, DiscussionDetail, DiscussionListResult, DiscussionMetrics, DiscussionTranscript, ListDiscussionsQuery } from './types.js';
4
- export declare const DISCUSSION_AUDIO_MAX_BYTES: number;
5
- export declare const DISCUSSION_SEGMENT_MAX_BYTES: number;
6
- export declare const DISCUSSION_MAX_DURATION_MS: number;
7
- export declare class DiscussionServiceError extends Error {
8
- readonly code: 'invalid_input' | 'not_found' | 'conflict';
9
- constructor(code: 'invalid_input' | 'not_found' | 'conflict', message: string);
10
- }
5
+ import { editMeeting } from './edits.js';
6
+ export { DiscussionServiceError } from './errors.js';
7
+ export { DISCUSSION_MAX_DURATION_MS, DISCUSSION_AUDIO_MAX_BYTES, DISCUSSION_SEGMENT_MAX_BYTES } from '@xopcai/gateway-contract';
11
8
  export declare class DiscussionService {
12
9
  private readonly notes;
13
10
  private readonly projects;
@@ -15,6 +12,8 @@ export declare class DiscussionService {
15
12
  private readonly createsInFlight;
16
13
  private readonly mutationTails;
17
14
  private readonly objectLinks;
15
+ private readonly recordingOwner;
16
+ private readonly recordingControllers;
18
17
  constructor(notes: NotesService, projects: ProjectService, emit?: (type: string, payload: unknown) => void);
19
18
  settings(): DiscussionCaptureSettings;
20
19
  acknowledgeConsent(policyVersion: number): DiscussionCaptureSettings;
@@ -24,7 +23,7 @@ export declare class DiscussionService {
24
23
  getByNoteId(noteId: string): Promise<DiscussionDetail | null>;
25
24
  list(query?: ListDiscussionsQuery): DiscussionListResult;
26
25
  metrics(): DiscussionMetrics;
27
- transcript(id: string): DiscussionTranscript | null;
26
+ transcript(id: string, revision?: number): DiscussionTranscript | null;
28
27
  uploadSegment(input: {
29
28
  discussionId: string;
30
29
  sequence: number;
@@ -36,13 +35,15 @@ export declare class DiscussionService {
36
35
  endedAtMs: number;
37
36
  sha256: string;
38
37
  }): DiscussionTranscript;
39
- correctSegment(id: string, sequence: number, displayText: string, expectedRevision: number): DiscussionTranscript;
40
- uploadRecording(id: string, file: {
41
- name: string;
42
- buffer: Buffer;
43
- mimeType: string;
44
- }, durationMs: number): Promise<DiscussionDetail | null>;
45
- stop(id: string, lastSequence: number, durationMs: number): Promise<DiscussionDetail | null>;
38
+ correctSegment(id: string, sequence: number, displayText: string, expectedRevision: number, speakerLabel?: string, applyToSpeakerGroup?: boolean, expectedTranscriptRevision?: number): DiscussionTranscript;
39
+ editSummary(id: string, input: Parameters<typeof editMeeting>[1]): import("@xopcai/gateway-contract").DiscussionOrganizationRecord;
40
+ recordingChunks(id: string): import("@xopcai/gateway-contract").DiscussionRecordingChunk[];
41
+ reorganize(id: string, template?: string): Promise<DiscussionDetail>;
42
+ uploadRecordingChunk(id: string, sequence: number, sha256: string, body: ReadableStream<Uint8Array>): Promise<import("@xopcai/gateway-contract").DiscussionRecordingChunk>;
43
+ recordingJob(id: string): import("@xopcai/gateway-contract").DiscussionRecordingJob;
44
+ sealRecording(id: string, input: DiscussionRecordingManifest): Promise<import("@xopcai/gateway-contract").DiscussionRecordingJob>;
45
+ /** Runs inside the existing sealer lifecycle; unfinished leases survive process restart. */
46
+ processRecordingJob(): Promise<void>;
46
47
  retry(id: string): Promise<DiscussionDetail | null>;
47
48
  cancel(id: string): Promise<DiscussionDetail | null>;
48
49
  deleteAudio(id: string): Promise<DiscussionDetail | null>;