@xopcai/xopc 0.0.180 → 0.0.188

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 (838) hide show
  1. package/README.md +1 -1
  2. package/README.zh-CN.md +1 -1
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/demo-memory/src/index.js +1 -0
  5. package/dist/extensions/feishu/src/streaming/streaming-adapter.js +1 -3
  6. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +0 -2
  7. package/dist/extensions/telegram/src/draft-stream.d.ts +0 -4
  8. package/dist/extensions/telegram/src/draft-stream.js +1 -53
  9. package/dist/extensions/telegram/xopc.extension.json +1 -1
  10. package/dist/gateway/static/root/assets/{activity-store-DFKtQDgE.js → activity-store--QoUGhiS.js} +1 -1
  11. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CcTvB_4W.js → agent-avatar-dicebear-B0yweLNQ.js} +1 -1
  12. package/dist/gateway/static/root/assets/agents-C6OV-gMm.js +2 -0
  13. package/dist/gateway/static/root/assets/{api-CUClAvuL.js → api-5laWqfiE.js} +1 -1
  14. package/dist/gateway/static/root/assets/{app-management-settings-panel-Ib-cWKHM.js → app-management-settings-panel-BXJ8Jiv_.js} +1 -1
  15. package/dist/gateway/static/root/assets/{appearance-settings-CRSN8WuA.js → appearance-settings-DG9n9D1M.js} +1 -1
  16. package/dist/gateway/static/root/assets/apps-page-Ci14lDeO.js +1 -0
  17. package/dist/gateway/static/root/assets/{archive-plugin-BBF9zspN.js → archive-plugin-Ceh5qrZf.js} +1 -1
  18. package/dist/gateway/static/root/assets/{attachment-load-D3QQfA7w.js → attachment-load-jFW7uYf7.js} +1 -1
  19. package/dist/gateway/static/root/assets/automations-page-Q1xmb4Rh.js +6 -0
  20. package/dist/gateway/static/root/assets/{binary-plugins-D78XOjJ3.js → binary-plugins-XDlkI1r4.js} +1 -1
  21. package/dist/gateway/static/root/assets/{block-editor-D_VVXlYX.js → block-editor-kyKc2IhE.js} +46 -46
  22. package/dist/gateway/static/root/assets/browser-settings-page-DbowrHXD.js +8 -0
  23. package/dist/gateway/static/root/assets/browser-workflow-inputs-BJa5Iz_v.js +1 -0
  24. package/dist/gateway/static/root/assets/{browser-workflows-page-58DBMXgG.js → browser-workflows-page-CTQQOsn5.js} +2 -2
  25. package/dist/gateway/static/root/assets/capabilities-settings-panel-DoZPFdKF.js +7 -0
  26. package/dist/gateway/static/root/assets/capability-presets-api-Dn-7MMEo.js +1 -0
  27. package/dist/gateway/static/root/assets/capability-presets-settings-panel-Bt8Hnx0h.js +1 -0
  28. package/dist/gateway/static/root/assets/{channel-recipient-api-DYtoNV5A.js → channel-recipient-api-BgIkWq01.js} +1 -1
  29. package/dist/gateway/static/root/assets/channels-settings-Bpsebsru.js +1 -0
  30. package/dist/gateway/static/root/assets/channels-status-swr-DFmdYRE5.js +1 -0
  31. package/dist/gateway/static/root/assets/{connector-logo-CxIXnifA.js → connector-logo-TRr9ybf6.js} +1 -1
  32. package/dist/gateway/static/root/assets/connectors-page-Tg5kl22i.js +2 -0
  33. package/dist/gateway/static/root/assets/desktop-pet-CSwd00CV.js +1 -0
  34. package/dist/gateway/static/root/assets/{desktop-pet-settings-BOIp4q0Z.js → desktop-pet-settings-CuNQvHGu.js} +1 -1
  35. package/dist/gateway/static/root/assets/{directory-picker-path-field-C8_lsW6S.js → directory-picker-path-field-ct0n5Rje.js} +1 -1
  36. package/dist/gateway/static/root/assets/{extension-debug-page-CMNnSJP6.js → extension-debug-page-BeRBuMUU.js} +1 -1
  37. package/dist/gateway/static/root/assets/{extension-page-t0pJqLvM.js → extension-page-DbK-Cwao.js} +1 -1
  38. package/dist/gateway/static/root/assets/{extension-settings-page-aiR-tKnW.js → extension-settings-page-C9ag5tb5.js} +1 -1
  39. package/dist/gateway/static/root/assets/{gateway-config-api-CkyQBD6r.js → gateway-config-api-CC7EvEFp.js} +1 -1
  40. package/dist/gateway/static/root/assets/{gateway-settings-BIZfAgfB.js → gateway-settings-9g8uIry9.js} +1 -1
  41. package/dist/gateway/static/root/assets/{gateway-startup-retry-CSU7UvzG.js → gateway-startup-retry-B2DmdlwO.js} +1 -1
  42. package/dist/gateway/static/root/assets/heartbeat-settings-fl1oC_-5.js +1 -0
  43. package/dist/gateway/static/root/assets/home-page-Bao9jq_z.js +3 -0
  44. package/dist/gateway/static/root/assets/{image-generation-api-BR6Kb77X.js → image-generation-api-GMTaS6eI.js} +1 -1
  45. package/dist/gateway/static/root/assets/index-Cl5n1f_U.css +1 -0
  46. package/dist/gateway/static/root/assets/index-OJgiMh07.js +223 -0
  47. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-D76uYKeQ.js → keyboard-shortcuts-settings-DhGYddbI.js} +1 -1
  48. package/dist/gateway/static/root/assets/local-app-workbench-page-B69NvtvH.js +2 -0
  49. package/dist/gateway/static/root/assets/{local-apps-page-BsLnojTh.js → local-apps-page-CmnrBmWi.js} +1 -1
  50. package/dist/gateway/static/root/assets/{locale-store-BNC8HUCI.js → locale-store-D6hs74o5.js} +1 -1
  51. package/dist/gateway/static/root/assets/logs-page-Cq3cABqg.js +7 -0
  52. package/dist/gateway/static/root/assets/{markdown-split-D6smTQWD.js → markdown-split-CZaBPOVn.js} +1 -1
  53. package/dist/gateway/static/root/assets/{media-plugins-D1TmMF0A.js → media-plugins-CiKvSgCv.js} +1 -1
  54. package/dist/gateway/static/root/assets/messages-D02NNLCZ.js +3 -0
  55. package/dist/gateway/static/root/assets/{notes-page-Vt-diFf0.js → notes-page-Bisbzqlz.js} +1 -1
  56. package/dist/gateway/static/root/assets/notes-workbench-BOZfJFhE.js +4 -0
  57. package/dist/gateway/static/root/assets/{page-tabs-BnSzIjH0.js → page-tabs-BxlwhAbH.js} +1 -1
  58. package/dist/gateway/static/root/assets/{preview-open-alternatives-CF12Eqi4.js → preview-open-alternatives-RM8wXxfT.js} +1 -1
  59. package/dist/gateway/static/root/assets/product-delivery-C8JbSj5Y.js +1 -0
  60. package/dist/gateway/static/root/assets/{product-open-page-Du0TE_CU.js → product-open-page-DdBlibek.js} +1 -1
  61. package/dist/gateway/static/root/assets/project-detail-page-TSKFb2tN.js +1 -0
  62. package/dist/gateway/static/root/assets/projects-page-BokeBrTT.js +1 -0
  63. package/dist/gateway/static/root/assets/remote-access-hub-C56anxCX.js +1 -0
  64. package/dist/gateway/static/root/assets/{schema-form-BKvpxqof.js → schema-form-BDKbpmXv.js} +1 -1
  65. package/dist/gateway/static/root/assets/sessions-page-C7TQADrD.js +1 -0
  66. package/dist/gateway/static/root/assets/settings-advanced-gate-BDOPKeAX.js +1 -0
  67. package/dist/gateway/static/root/assets/{settings-form-section-kt6GIS32.js → settings-form-section-zxo5ZGOu.js} +1 -1
  68. package/dist/gateway/static/root/assets/{settings-loading-skeleton-85eUPcKz.js → settings-loading-skeleton-DgIp8_S6.js} +1 -1
  69. package/dist/gateway/static/root/assets/settings-page-BUPSIa9P.js +1 -0
  70. package/dist/gateway/static/root/assets/{settings-page-layout-CkkCee_x.js → settings-page-layout-97LmwrzC.js} +1 -1
  71. package/dist/gateway/static/root/assets/setup-status-panel-BRg766eW.js +1 -0
  72. package/dist/gateway/static/root/assets/{share-preview-page-BtLEstaI.js → share-preview-page-BH7i3g1S.js} +1 -1
  73. package/dist/gateway/static/root/assets/shares-settings-DhEAviQ_.js +1 -0
  74. package/dist/gateway/static/root/assets/skill-reload-api-Ct7AV8ls.js +1 -0
  75. package/dist/gateway/static/root/assets/skills-page-DoVuprZm.js +2 -0
  76. package/dist/gateway/static/root/assets/{skills-page.utils-C2SHvq8V.js → skills-page.utils-s-a5WV9j.js} +1 -1
  77. package/dist/gateway/static/root/assets/system-settings-panel-BxjeMT5k.js +1 -0
  78. package/dist/gateway/static/root/assets/task-detail-page-BahycnfW.js +1 -0
  79. package/dist/gateway/static/root/assets/{theme-store-ClDa_Bci.js → theme-store-BRxdsmic.js} +1 -1
  80. package/dist/gateway/static/root/assets/time-picker-BGk_Tbsj.js +1 -0
  81. package/dist/gateway/static/root/assets/{typed-models-lib-GsmwmB40.js → typed-models-lib-39MjwPSq.js} +1 -1
  82. package/dist/gateway/static/root/assets/use-save-bar-registration-5aVSjTjO.js +1 -0
  83. package/dist/gateway/static/root/assets/user-context-page-B9K41qmy.js +1 -0
  84. package/dist/gateway/static/root/assets/{voice-api-key-field-Blaxsbb3.js → voice-api-key-field-XU-7sBSg.js} +1 -1
  85. package/dist/gateway/static/root/assets/work-discovery-overlay-CJqu8UHq.js +1 -0
  86. package/dist/gateway/static/root/assets/work-discovery-page-BBVnRHju.js +1 -0
  87. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CTG4RpRE.js → workflow-run-setup-panel-DXtg8Qxl.js} +2 -2
  88. package/dist/gateway/static/root/assets/workflows-page-Bs_tYfst.js +11 -0
  89. package/dist/gateway/static/root/index.html +8 -8
  90. package/dist/package.js +1 -1
  91. package/dist/packages/gateway-contract/src/product-delivery.js +1 -3
  92. package/dist/packages/gateway-contract/src/project-monitoring.js +31 -0
  93. package/dist/packages/gateway-contract/src/task-lifecycle.js +67 -0
  94. package/dist/packages/gateway-contract/src/task-runs.js +80 -0
  95. package/dist/packages/gateway-contract/src/tasks.js +353 -0
  96. package/dist/packages/gateway-contract/src/tool-activity.js +223 -0
  97. package/dist/src/activity/types.d.ts +2 -2
  98. package/dist/src/agent/agent-instance-gateway.d.ts +1 -1
  99. package/dist/src/agent/agent-manager.d.ts +3 -3
  100. package/dist/src/agent/agent-manager.js +25 -30
  101. package/dist/src/agent/bootstrap/filter-bootstrap-files.js +1 -1
  102. package/dist/src/agent/child-agent-factory.d.ts +1 -2
  103. package/dist/src/agent/child-agent-factory.js +4 -10
  104. package/dist/src/agent/code-intelligence/binary.js +1 -1
  105. package/dist/src/agent/context/execution-scope.d.ts +2 -2
  106. package/dist/src/agent/context/execution-scope.js +17 -20
  107. package/dist/src/agent/context/project-context.d.ts +6 -2
  108. package/dist/src/agent/context/project-context.js +17 -25
  109. package/dist/src/agent/context/workspace-templates/AGENTS.md +1 -1
  110. package/dist/src/agent/embedded/model-runtime.js +1 -1
  111. package/dist/src/agent/embedded/run-for-session.d.ts +0 -2
  112. package/dist/src/agent/embedded/run-for-session.js +99 -112
  113. package/dist/src/agent/embedded/run-turn.js +2 -0
  114. package/dist/src/agent/embedded/session-tool-result-guard.d.ts +2 -0
  115. package/dist/src/agent/embedded/session-tool-result-guard.js +16 -4
  116. package/dist/src/agent/external-tools/composio-provider.d.ts +29 -0
  117. package/dist/src/agent/external-tools/composio-provider.js +307 -0
  118. package/dist/src/agent/external-tools/extension-provider.d.ts +20 -0
  119. package/dist/src/agent/external-tools/extension-provider.js +68 -0
  120. package/dist/src/agent/external-tools/gateway-tools.d.ts +8 -0
  121. package/dist/src/agent/external-tools/gateway-tools.js +89 -0
  122. package/dist/src/agent/external-tools/index.d.ts +24 -0
  123. package/dist/src/agent/external-tools/index.js +40 -0
  124. package/dist/src/agent/external-tools/mcp-provider.d.ts +29 -0
  125. package/dist/src/agent/external-tools/mcp-provider.js +118 -0
  126. package/dist/src/agent/external-tools/memory-provider.d.ts +21 -0
  127. package/dist/src/agent/external-tools/memory-provider.js +56 -0
  128. package/dist/src/agent/external-tools/refs.d.ts +5 -0
  129. package/dist/src/agent/external-tools/refs.js +18 -0
  130. package/dist/src/agent/external-tools/service.d.ts +26 -0
  131. package/dist/src/agent/external-tools/service.js +117 -0
  132. package/dist/src/agent/external-tools/types.d.ts +28 -0
  133. package/dist/src/agent/external-tools/types.js +9 -0
  134. package/dist/src/agent/image/tool-model-config.js +1 -1
  135. package/dist/src/agent/inbound/inbound-loop.d.ts +0 -2
  136. package/dist/src/agent/inbound/inbound-loop.js +1 -4
  137. package/dist/src/agent/inbound/turn-dispatcher.js +1 -1
  138. package/dist/src/agent/ipc/inbox.js +1 -1
  139. package/dist/src/agent/mcp/{bundle-mcp-materialize.d.ts → bundle-mcp-gateway.d.ts} +1 -19
  140. package/dist/src/agent/mcp/bundle-mcp-gateway.js +60 -0
  141. package/dist/src/agent/mcp/bundle-mcp-names.d.ts +0 -8
  142. package/dist/src/agent/mcp/bundle-mcp-names.js +2 -29
  143. package/dist/src/agent/mcp/bundle-mcp-policy.d.ts +5 -10
  144. package/dist/src/agent/mcp/bundle-mcp-policy.js +6 -17
  145. package/dist/src/agent/mcp/bundle-mcp-runtime.js +2 -2
  146. package/dist/src/agent/mcp/bundle-mcp-tools.d.ts +1 -2
  147. package/dist/src/agent/mcp/bundle-mcp-tools.js +1 -2
  148. package/dist/src/agent/mcp/bundle-mcp-types.d.ts +0 -5
  149. package/dist/src/agent/mcp/index.d.ts +0 -2
  150. package/dist/src/agent/mcp/index.js +2 -5
  151. package/dist/src/agent/mcp/mcp-stdio-transport.js +1 -1
  152. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  153. package/dist/src/agent/memory/builtin-provider.d.ts +1 -5
  154. package/dist/src/agent/memory/builtin-provider.js +75 -229
  155. package/dist/src/agent/memory/compaction.js +1 -1
  156. package/dist/src/agent/memory/context/planner.d.ts +4 -0
  157. package/dist/src/agent/memory/context/planner.js +53 -17
  158. package/dist/src/agent/memory/context/types.d.ts +6 -0
  159. package/dist/src/agent/memory/create-memory-manager.d.ts +1 -2
  160. package/dist/src/agent/memory/create-memory-manager.js +4 -4
  161. package/dist/src/agent/memory/dreaming/config.d.ts +16 -13
  162. package/dist/src/agent/memory/dreaming/config.js +47 -40
  163. package/dist/src/agent/memory/dreaming/constants.d.ts +5 -22
  164. package/dist/src/agent/memory/dreaming/constants.js +6 -24
  165. package/dist/src/agent/memory/dreaming/deep-promotion.d.ts +4 -11
  166. package/dist/src/agent/memory/dreaming/deep-promotion.js +126 -279
  167. package/dist/src/agent/memory/dreaming/light-sweep.d.ts +5 -2
  168. package/dist/src/agent/memory/dreaming/light-sweep.js +79 -197
  169. package/dist/src/agent/memory/dreaming/preview.d.ts +3 -9
  170. package/dist/src/agent/memory/dreaming/preview.js +34 -77
  171. package/dist/src/agent/memory/dreaming/promotion-lifecycle.d.ts +1 -15
  172. package/dist/src/agent/memory/dreaming/promotion-lifecycle.js +3 -42
  173. package/dist/src/agent/memory/dreaming/rem-patterns.d.ts +7 -13
  174. package/dist/src/agent/memory/dreaming/rem-patterns.js +104 -261
  175. package/dist/src/agent/memory/dreaming/runner.d.ts +10 -0
  176. package/dist/src/agent/memory/dreaming/runner.js +78 -0
  177. package/dist/src/agent/memory/dreaming/schedule.d.ts +23 -0
  178. package/dist/src/agent/memory/dreaming/schedule.js +38 -0
  179. package/dist/src/agent/memory/dreaming/scope.d.ts +2 -4
  180. package/dist/src/agent/memory/dreaming/scope.js +21 -13
  181. package/dist/src/agent/memory/dreaming/utils.d.ts +2 -51
  182. package/dist/src/agent/memory/dreaming/utils.js +4 -112
  183. package/dist/src/agent/memory/index.d.ts +1 -3
  184. package/dist/src/agent/memory/index.js +2 -3
  185. package/dist/src/agent/memory/manager.d.ts +5 -6
  186. package/dist/src/agent/memory/manager.js +6 -29
  187. package/dist/src/agent/memory/memory-config.d.ts +1 -6
  188. package/dist/src/agent/memory/memory-config.js +2 -23
  189. package/dist/src/agent/memory/summary-generator.d.ts +1 -1
  190. package/dist/src/agent/memory/types.d.ts +7 -48
  191. package/dist/src/agent/memory/understanding/service.js +1 -2
  192. package/dist/src/agent/memory/user-context-coordinator.d.ts +2 -1
  193. package/dist/src/agent/memory/user-context-coordinator.js +32 -14
  194. package/dist/src/agent/messaging/command-handler.d.ts +1 -9
  195. package/dist/src/agent/messaging/command-handler.js +0 -8
  196. package/dist/src/agent/messaging/outbound-coordinator.d.ts +5 -14
  197. package/dist/src/agent/messaging/outbound-coordinator.js +4 -9
  198. package/dist/src/agent/messaging/stream-manager.d.ts +2 -14
  199. package/dist/src/agent/messaging/stream-manager.js +0 -12
  200. package/dist/src/agent/middleware/index.d.ts +1 -1
  201. package/dist/src/agent/middleware/self-verify.d.ts +2 -2
  202. package/dist/src/agent/middleware/self-verify.js +7 -7
  203. package/dist/src/agent/orchestration/agent-event-handler.d.ts +1 -3
  204. package/dist/src/agent/orchestration/agent-event-handler.js +0 -36
  205. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +0 -5
  206. package/dist/src/agent/orchestration/agent-orchestrator.js +16 -71
  207. package/dist/src/agent/prompt/response-language.d.ts +3 -0
  208. package/dist/src/agent/prompt/response-language.js +11 -0
  209. package/dist/src/agent/prompt/sections/behavior.js +8 -6
  210. package/dist/src/agent/prompt/sections/memory-skills.js +10 -13
  211. package/dist/src/agent/prompt/sections/response-language.d.ts +2 -0
  212. package/dist/src/agent/prompt/sections/response-language.js +13 -0
  213. package/dist/src/agent/prompt/sections/tooling.js +0 -2
  214. package/dist/src/agent/prompt/service-prompt-builder.d.ts +1 -1
  215. package/dist/src/agent/prompt/service-prompt-builder.js +6 -29
  216. package/dist/src/agent/prompt/subagent-context.d.ts +2 -0
  217. package/dist/src/agent/prompt/subagent-context.js +1 -0
  218. package/dist/src/agent/prompt/system-prompt.d.ts +3 -0
  219. package/dist/src/agent/prompt/system-prompt.js +10 -2
  220. package/dist/src/agent/service/direct-turn-helpers.d.ts +2 -2
  221. package/dist/src/agent/service/direct-turn-helpers.js +8 -5
  222. package/dist/src/agent/service/process-direct-streaming.d.ts +2 -2
  223. package/dist/src/agent/service/process-direct-streaming.js +2 -2
  224. package/dist/src/agent/service.d.ts +6 -12
  225. package/dist/src/agent/service.js +31 -53
  226. package/dist/src/agent/service.types.d.ts +2 -18
  227. package/dist/src/agent/session/index.d.ts +1 -1
  228. package/dist/src/agent/session/session-config-service.d.ts +1 -0
  229. package/dist/src/agent/session/session-config-service.js +14 -0
  230. package/dist/src/agent/session/session-inspector.js +1 -1
  231. package/dist/src/agent/session/session-state-bag.d.ts +8 -8
  232. package/dist/src/agent/session/session-state-bag.js +10 -10
  233. package/dist/src/agent/skills/hub-lock.js +1 -1
  234. package/dist/src/agent/skills/hub-pull.js +1 -1
  235. package/dist/src/agent/source-context/types.d.ts +1 -1
  236. package/dist/src/agent/source-context/types.js +1 -1
  237. package/dist/src/agent/starter-agents.js +3 -3
  238. package/dist/src/agent/{outcomes → tasks}/execution-verifier.d.ts +3 -0
  239. package/dist/src/agent/{outcomes → tasks}/execution-verifier.js +3 -2
  240. package/dist/src/agent/tasks/task-judge-service.d.ts +31 -0
  241. package/dist/src/agent/tasks/task-judge-service.js +183 -0
  242. package/dist/src/agent/tool-manuals/index.js +1 -1
  243. package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -1
  244. package/dist/src/agent/tool-manuals/xopc-use.js +253 -118
  245. package/dist/src/agent/tools/apply-patch.d.ts +1 -5
  246. package/dist/src/agent/tools/apply-patch.js +1 -12
  247. package/dist/src/agent/tools/clarify-tool.js +1 -1
  248. package/dist/src/agent/tools/delegate-tool.js +9 -5
  249. package/dist/src/agent/tools/dreaming-tool.d.ts +0 -1
  250. package/dist/src/agent/tools/dreaming-tool.js +48 -80
  251. package/dist/src/agent/tools/exec-command.d.ts +0 -2
  252. package/dist/src/agent/tools/exec-command.js +2 -19
  253. package/dist/src/agent/tools/executor.js +1 -1
  254. package/dist/src/agent/tools/factory.d.ts +4 -5
  255. package/dist/src/agent/tools/factory.js +24 -51
  256. package/dist/src/agent/tools/index.d.ts +0 -3
  257. package/dist/src/agent/tools/index.js +1 -4
  258. package/dist/src/agent/tools/managed-job-tool.js +1 -1
  259. package/dist/src/agent/tools/memory-tool.d.ts +0 -3
  260. package/dist/src/agent/tools/memory-tool.js +14 -36
  261. package/dist/src/agent/tools/tool-manual-tool.js +1 -1
  262. package/dist/src/agent/tools/workflow-tool.d.ts +1 -1
  263. package/dist/src/agent/tools/workflow-tool.js +4 -4
  264. package/dist/src/agent/tools/write.d.ts +0 -2
  265. package/dist/src/agent/tools/write.js +0 -11
  266. package/dist/src/agent/tools/xopc-use-tool.d.ts +5 -4
  267. package/dist/src/agent/tools/xopc-use-tool.js +987 -143
  268. package/dist/src/agent/transcript/thinking-types.d.ts +3 -0
  269. package/dist/src/agent/workflow/builtins/index.js +2 -2
  270. package/dist/src/agent/workflow/index.js +2 -2
  271. package/dist/src/agent/workflow/subagent-runner.js +1 -0
  272. package/dist/src/agent/workflow/workflow-child-tools.js +7 -4
  273. package/dist/src/agent/workspace-runtime/registry.d.ts +2 -4
  274. package/dist/src/agent/workspace-runtime/registry.js +1 -2
  275. package/dist/src/agent-manifest/index.js +3 -3
  276. package/dist/src/agent-manifest/resolver.d.ts +20 -1
  277. package/dist/src/agent-manifest/resolver.js +47 -20
  278. package/dist/src/agent-manifest/schema.d.ts +128 -52
  279. package/dist/src/agent-manifest/schema.js +46 -8
  280. package/dist/src/agent-runtime/memory-runtime.d.ts +2 -2
  281. package/dist/src/ai-assist/text-assist.js +4 -4
  282. package/dist/src/auth/credentials.js +2 -2
  283. package/dist/src/auth/profiles/store.js +1 -1
  284. package/dist/src/auth/sync-provider-auth.js +2 -2
  285. package/dist/src/automations/domain/defaults.js +1 -1
  286. package/dist/src/automations/domain/types.d.ts +15 -1
  287. package/dist/src/automations/domain/validation.d.ts +336 -12
  288. package/dist/src/automations/domain/validation.js +6 -0
  289. package/dist/src/automations/draft/automation-draft-prompt.js +3 -3
  290. package/dist/src/automations/draft/automation-draft-validator.d.ts +62 -1
  291. package/dist/src/automations/draft/automation-draft-validator.js +1 -0
  292. package/dist/src/automations/index.js +1 -1
  293. package/dist/src/automations/service/action-executor.d.ts +2 -2
  294. package/dist/src/automations/service/action-executor.js +21 -1
  295. package/dist/src/automations/service/automation-service.js +21 -21
  296. package/dist/src/browser/providers/browser-ext-install.js +1 -1
  297. package/dist/src/browser/providers/cloakbrowser.js +1 -1
  298. package/dist/src/channels/channel-domain.d.ts +0 -4
  299. package/dist/src/channels/plugin-types.d.ts +0 -2
  300. package/dist/src/chat-commands/builtins/understanding.d.ts +1 -0
  301. package/dist/src/chat-commands/builtins/understanding.js +91 -0
  302. package/dist/src/chat-commands/context.d.ts +0 -3
  303. package/dist/src/chat-commands/context.js +0 -2
  304. package/dist/src/chat-commands/index.d.ts +1 -2
  305. package/dist/src/chat-commands/index.js +3 -5
  306. package/dist/src/chat-commands/types.d.ts +0 -3
  307. package/dist/src/cli/command-catalog.js +0 -43
  308. package/dist/src/cli/command-loaders.js +0 -1
  309. package/dist/src/cli/command-manifest.js +0 -4
  310. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  311. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  312. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  313. package/dist/src/cli/commands/gateway/lifecycle-core.js +1 -1
  314. package/dist/src/cli/commands/gateway/restart-health.d.ts +2 -2
  315. package/dist/src/cli/commands/gateway/restart-health.js +3 -3
  316. package/dist/src/cli/commands/gateway/service.js +4 -4
  317. package/dist/src/cli/commands/models.js +1 -1
  318. package/dist/src/cli/commands/onboard/gateway.js +1 -1
  319. package/dist/src/cli/commands/project.js +12 -33
  320. package/dist/src/cli/commands/providers.d.ts +4 -4
  321. package/dist/src/cli/commands/providers.js +16 -16
  322. package/dist/src/cli/commands/search.js +7 -7
  323. package/dist/src/cli/commands/setup-shared/index.d.ts +2 -2
  324. package/dist/src/cli/commands/setup-shared/index.js +2 -2
  325. package/dist/src/cli/commands/setup-shared/output.d.ts +4 -4
  326. package/dist/src/cli/commands/setup-shared/output.js +26 -26
  327. package/dist/src/cli/commands/setup-shared/runner.d.ts +8 -8
  328. package/dist/src/cli/commands/setup-shared/runner.js +9 -9
  329. package/dist/src/cli/commands/setup-shared/types.d.ts +2 -2
  330. package/dist/src/cli/commands/skills.d.ts +7 -0
  331. package/dist/src/cli/commands/skills.js +16 -16
  332. package/dist/src/cli/commands/update.js +1 -1
  333. package/dist/src/cli/commands/voice.d.ts +1 -1
  334. package/dist/src/cli/commands/voice.js +6 -6
  335. package/dist/src/cli/templates.js +1 -1
  336. package/dist/src/commands/agents.config.js +2 -18
  337. package/dist/src/config/agent-profile.d.ts +1 -1
  338. package/dist/src/config/agent-profile.js +1 -1
  339. package/dist/src/config/index.js +7 -7
  340. package/dist/src/config/loader.js +1 -1
  341. package/dist/src/config/models-json.js +1 -1
  342. package/dist/src/config/paths.d.ts +0 -3
  343. package/dist/src/config/paths.js +2 -7
  344. package/dist/src/config/schema.d.ts +160 -258
  345. package/dist/src/config/schema.js +8 -114
  346. package/dist/src/config/web-patch.d.ts +0 -29
  347. package/dist/src/config/web-patch.js +2 -69
  348. package/dist/src/connectors/composio-catalog.js +7 -20
  349. package/dist/src/connectors/composio-sessions.js +14 -4
  350. package/dist/src/connectors/composio.d.ts +7 -2
  351. package/dist/src/connectors/composio.js +49 -40
  352. package/dist/src/connectors/connected-source-ingestion.js +2 -1
  353. package/dist/src/connectors/connected-source-normalizers.js +5 -5
  354. package/dist/src/connectors/connector-identity.d.ts +2 -0
  355. package/dist/src/connectors/connector-identity.js +64 -1
  356. package/dist/src/connectors/health.js +1 -1
  357. package/dist/src/connectors/learning-coordinator.js +34 -15
  358. package/dist/src/connectors/learning-recipes.d.ts +2 -0
  359. package/dist/src/connectors/learning-recipes.js +11 -1
  360. package/dist/src/connectors/source-change-publisher.js +5 -4
  361. package/dist/src/connectors/types.d.ts +16 -0
  362. package/dist/src/daemon/launchd.js +2 -2
  363. package/dist/src/daemon/schtasks.js +1 -1
  364. package/dist/src/daemon/service.js +3 -3
  365. package/dist/src/daemon/systemd.js +1 -1
  366. package/dist/src/daemon/types.d.ts +5 -5
  367. package/dist/src/discussions/analyzer.d.ts +6 -6
  368. package/dist/src/discussions/analyzer.js +32 -22
  369. package/dist/src/discussions/index.d.ts +3 -2
  370. package/dist/src/discussions/index.js +5 -4
  371. package/dist/src/discussions/live-worker.d.ts +5 -3
  372. package/dist/src/discussions/live-worker.js +24 -12
  373. package/dist/src/discussions/{worker.d.ts → organizer-worker.d.ts} +3 -5
  374. package/dist/src/discussions/organizer-worker.js +58 -0
  375. package/dist/src/discussions/organizer.d.ts +22 -0
  376. package/dist/src/discussions/organizer.js +92 -0
  377. package/dist/src/discussions/repository.d.ts +16 -5
  378. package/dist/src/discussions/repository.js +159 -135
  379. package/dist/src/discussions/sealer.d.ts +25 -0
  380. package/dist/src/discussions/sealer.js +116 -0
  381. package/dist/src/discussions/service.d.ts +2 -1
  382. package/dist/src/discussions/service.js +70 -60
  383. package/dist/src/discussions/transcript.js +1 -1
  384. package/dist/src/discussions/types.d.ts +45 -20
  385. package/dist/src/discussions/types.js +4 -2
  386. package/dist/src/extensions/extension-registry-impl.d.ts +3 -1
  387. package/dist/src/extensions/extension-registry-impl.js +7 -1
  388. package/dist/src/extensions/loader.js +1 -1
  389. package/dist/src/extensions/lockfile.js +1 -1
  390. package/dist/src/extensions/types/core.d.ts +5 -4
  391. package/dist/src/extensions/types/tui.d.ts +2 -2
  392. package/dist/src/extensions/update.d.ts +3 -3
  393. package/dist/src/extensions/update.js +14 -14
  394. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  395. package/dist/src/gateway/agent-builtin-tools.js +5 -3
  396. package/dist/src/gateway/agent-run-relay.d.ts +1 -1
  397. package/dist/src/gateway/agents-admin.js +17 -19
  398. package/dist/src/gateway/capability-presets-admin.d.ts +13 -0
  399. package/dist/src/gateway/capability-presets-admin.js +59 -2
  400. package/dist/src/gateway/chat-limits.d.ts +6 -2
  401. package/dist/src/gateway/chat-limits.js +17 -3
  402. package/dist/src/gateway/chat-stream/mapper.js +16 -1
  403. package/dist/src/gateway/chat-stream/protocol.d.ts +4 -0
  404. package/dist/src/gateway/chat-stream/thinking-delta-coalescer.js +3 -3
  405. package/dist/src/gateway/dreaming-automation-reconciler.js +13 -12
  406. package/dist/src/gateway/file-path-classifier.js +1 -1
  407. package/dist/src/gateway/file-reference-errors.d.ts +6 -0
  408. package/dist/src/gateway/file-reference-errors.js +21 -0
  409. package/dist/src/gateway/hono/app.js +9 -10
  410. package/dist/src/gateway/hono/index.d.ts +1 -1
  411. package/dist/src/gateway/hono/index.js +2 -2
  412. package/dist/src/gateway/hono/lib/config-payload.d.ts +15 -35
  413. package/dist/src/gateway/hono/lib/config-payload.js +7 -5
  414. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +4 -0
  415. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +8 -1
  416. package/dist/src/gateway/hono/routes/activity.js +1 -2
  417. package/dist/src/gateway/hono/routes/agent-stream.js +135 -34
  418. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  419. package/dist/src/gateway/hono/routes/capability-presets.js +27 -1
  420. package/dist/src/gateway/hono/routes/composer-history.js +1 -1
  421. package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +1 -1
  422. package/dist/src/gateway/hono/routes/config-patch/misc.js +2 -7
  423. package/dist/src/gateway/hono/routes/connectors.js +35 -30
  424. package/dist/src/gateway/hono/routes/deps.d.ts +1 -0
  425. package/dist/src/gateway/hono/routes/discussions.js +13 -3
  426. package/dist/src/gateway/hono/routes/home.d.ts +1 -1
  427. package/dist/src/gateway/hono/routes/home.js +2 -2
  428. package/dist/src/gateway/hono/routes/index.js +2 -4
  429. package/dist/src/gateway/hono/routes/lazy-bundles.js +0 -16
  430. package/dist/src/gateway/hono/routes/mcp.js +1 -1
  431. package/dist/src/gateway/hono/routes/media.js +9 -3
  432. package/dist/src/gateway/hono/routes/memory.js +38 -113
  433. package/dist/src/gateway/hono/routes/models.js +1 -1
  434. package/dist/src/gateway/hono/routes/projects.js +254 -601
  435. package/dist/src/gateway/hono/routes/public-gateway.js +4 -2
  436. package/dist/src/gateway/hono/routes/{work.d.ts → tasks.d.ts} +1 -1
  437. package/dist/src/gateway/hono/routes/tasks.js +343 -0
  438. package/dist/src/gateway/hono/routes/workflows.js +8 -9
  439. package/dist/src/gateway/hono/routes/workspace.js +34 -13
  440. package/dist/src/gateway/hono/routes/you.d.ts +1 -1
  441. package/dist/src/gateway/hono/routes/you.js +252 -80
  442. package/dist/src/gateway/hono/sse.d.ts +1 -16
  443. package/dist/src/gateway/hono/sse.js +4 -161
  444. package/dist/src/gateway/index.js +2 -2
  445. package/dist/src/gateway/rate-limit/buckets.d.ts +3 -0
  446. package/dist/src/gateway/rate-limit/buckets.js +12 -0
  447. package/dist/src/gateway/security/csp.d.ts +2 -0
  448. package/dist/src/gateway/security/csp.js +4 -0
  449. package/dist/src/gateway/service/agent-runner.d.ts +32 -13
  450. package/dist/src/gateway/service/agent-runner.js +97 -46
  451. package/dist/src/gateway/service/config-coordinator.js +2 -2
  452. package/dist/src/gateway/service/run-gateway-agent.d.ts +1 -1
  453. package/dist/src/gateway/service/run-gateway-agent.js +31 -43
  454. package/dist/src/gateway/service/session-input-coordinator.d.ts +59 -0
  455. package/dist/src/gateway/service/session-input-coordinator.js +183 -0
  456. package/dist/src/gateway/service/sessions-api.d.ts +1 -0
  457. package/dist/src/gateway/service.d.ts +28 -16
  458. package/dist/src/gateway/service.js +154 -137
  459. package/dist/src/gateway/session-reset-service.js +6 -6
  460. package/dist/src/gateway/user-turn-input.d.ts +0 -1
  461. package/dist/src/i18n/index.d.ts +0 -1
  462. package/dist/src/i18n/index.js +1 -2
  463. package/dist/src/i18n/language-consistency.d.ts +10 -0
  464. package/dist/src/i18n/language-consistency.js +34 -0
  465. package/dist/src/i18n/response-language.d.ts +8 -0
  466. package/dist/src/i18n/response-language.js +17 -0
  467. package/dist/src/i18n/share-tool-bundle.js +2 -2
  468. package/dist/src/infra/update-runner.js +1 -1
  469. package/dist/src/mcp/channel-bridge.js +5 -3
  470. package/dist/src/media/store.js +1 -1
  471. package/dist/src/media/types.d.ts +1 -1
  472. package/dist/src/media/uri.js +1 -2
  473. package/dist/src/media-understanding/runner.d.ts +1 -1
  474. package/dist/src/media-understanding/runner.js +9 -9
  475. package/dist/src/media-understanding/types.d.ts +4 -4
  476. package/dist/src/mobile/notification-service.js +16 -21
  477. package/dist/src/mobile/notification-types.d.ts +2 -2
  478. package/dist/src/notes/types.d.ts +0 -1
  479. package/dist/src/proactive/events/product-event-bridge.js +17 -14
  480. package/dist/src/proactive/execution/context.js +45 -28
  481. package/dist/src/proactive/execution/insight.js +1 -1
  482. package/dist/src/proactive/temporal/worker.js +2 -2
  483. package/dist/src/projects/index.d.ts +0 -1
  484. package/dist/src/projects/index.js +1 -2
  485. package/dist/src/projects/project-loop.d.ts +16 -8
  486. package/dist/src/projects/project-loop.js +41 -48
  487. package/dist/src/projects/project-service.d.ts +14 -4
  488. package/dist/src/projects/project-service.js +18 -10
  489. package/dist/src/projects/project-store.d.ts +36 -3
  490. package/dist/src/projects/project-store.js +116 -14
  491. package/dist/src/projects/types.d.ts +50 -3
  492. package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
  493. package/dist/src/providers/index.js +2 -2
  494. package/dist/src/providers/model-registry.js +1 -1
  495. package/dist/src/providers/model-response.d.ts +4 -0
  496. package/dist/src/providers/model-response.js +28 -0
  497. package/dist/src/providers/register-runtime-providers.js +1 -1
  498. package/dist/src/session/config-types.d.ts +3 -0
  499. package/dist/src/session/index.d.ts +0 -1
  500. package/dist/src/session/index.js +1 -2
  501. package/dist/src/session/init-session-turn.js +6 -6
  502. package/dist/src/session/store.js +4 -4
  503. package/dist/src/session/types.d.ts +1 -6
  504. package/dist/src/share/share-zip.js +1 -1
  505. package/dist/src/share/site-proxy.js +1 -1
  506. package/dist/src/storage/sqlite/config-repository.js +7 -4
  507. package/dist/src/storage/sqlite/connection.js +1 -1
  508. package/dist/src/storage/sqlite/connector-account-repository.d.ts +12 -0
  509. package/dist/src/storage/sqlite/connector-account-repository.js +143 -0
  510. package/dist/src/storage/sqlite/connector-learning-repository.d.ts +5 -2
  511. package/dist/src/storage/sqlite/connector-learning-repository.js +14 -7
  512. package/dist/src/storage/sqlite/connector-repository.js +12 -3
  513. package/dist/src/storage/sqlite/connector-sync-policy-repository.d.ts +4 -3
  514. package/dist/src/storage/sqlite/connector-sync-policy-repository.js +20 -10
  515. package/dist/src/storage/sqlite/dreaming-repository.d.ts +61 -0
  516. package/dist/src/storage/sqlite/dreaming-repository.js +88 -0
  517. package/dist/src/storage/sqlite/index.d.ts +6 -4
  518. package/dist/src/storage/sqlite/index.js +7 -5
  519. package/dist/src/storage/sqlite/memory-readiness-repository.d.ts +7 -0
  520. package/dist/src/storage/sqlite/memory-readiness-repository.js +30 -0
  521. package/dist/src/storage/sqlite/memory-records-repository.d.ts +31 -26
  522. package/dist/src/storage/sqlite/memory-records-repository.js +112 -139
  523. package/dist/src/storage/sqlite/migrations/090_outcome_contract_judgment.sql +2 -0
  524. package/dist/src/storage/sqlite/migrations/091_context_allocation.sql +1 -0
  525. package/dist/src/storage/sqlite/migrations/092_outcome_execution_runtime.sql +88 -0
  526. package/dist/src/storage/sqlite/migrations/093_remove_legacy_goals.sql +174 -0
  527. package/dist/src/storage/sqlite/migrations/094_outcome_judgment_and_authority.sql +3 -0
  528. package/dist/src/storage/sqlite/migrations/095_session_input_queue.sql +35 -0
  529. package/dist/src/storage/sqlite/migrations/096_drop_work_intakes.sql +6 -0
  530. package/dist/src/storage/sqlite/migrations/097_work_item_lifecycle.sql +194 -0
  531. package/dist/src/storage/sqlite/migrations/098_discussion_note_documents.sql +99 -0
  532. package/dist/src/storage/sqlite/migrations/099_task_model.sql +500 -0
  533. package/dist/src/storage/sqlite/migrations/100_project_task_taskrun.sql +763 -0
  534. package/dist/src/storage/sqlite/migrations/101_session_response_language.sql +1 -0
  535. package/dist/src/storage/sqlite/migrations/102_session_user_context_mode.sql +2 -0
  536. package/dist/src/storage/sqlite/migrations/103_finalize_structured_memory.sql +3 -0
  537. package/dist/src/storage/sqlite/migrations/104_turn_memory_feedback.sql +77 -0
  538. package/dist/src/storage/sqlite/migrations/105_dreaming_ledger.sql +34 -0
  539. package/dist/src/storage/sqlite/migrations/106_dreaming_run_reproducibility.sql +2 -0
  540. package/dist/src/storage/sqlite/migrations/107_connector_accounts.sql +146 -0
  541. package/dist/src/storage/sqlite/migrations/108_repair_user_memory_provider.sql +18 -0
  542. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  543. package/dist/src/storage/sqlite/migrations/runner.js +37 -5
  544. package/dist/src/storage/sqlite/migrations/runner.ts +44 -3
  545. package/dist/src/storage/sqlite/migrations/types.d.ts +2 -0
  546. package/dist/src/storage/sqlite/migrations/types.ts +2 -0
  547. package/dist/src/storage/sqlite/row-mappers.d.ts +2 -2
  548. package/dist/src/storage/sqlite/row-mappers.js +2 -2
  549. package/dist/src/storage/sqlite/schema.d.ts +3 -1
  550. package/dist/src/storage/sqlite/schema.js +5 -2
  551. package/dist/src/storage/sqlite/schema.sql +76 -61
  552. package/dist/src/storage/sqlite/session-input-repository.d.ts +59 -0
  553. package/dist/src/storage/sqlite/session-input-repository.js +147 -0
  554. package/dist/src/storage/sqlite/session-repository.js +5 -6
  555. package/dist/src/{work → tasks}/attention-governor.d.ts +5 -5
  556. package/dist/src/{work → tasks}/attention-governor.js +3 -4
  557. package/dist/src/tasks/execution-context.d.ts +23 -0
  558. package/dist/src/{work → tasks}/execution-context.js +7 -20
  559. package/dist/src/{work → tasks}/home-query-service.d.ts +16 -28
  560. package/dist/src/{work → tasks}/home-query-service.js +56 -126
  561. package/dist/src/tasks/index.d.ts +20 -0
  562. package/dist/src/tasks/index.js +21 -0
  563. package/dist/src/{work → tasks}/project-monitoring-service.js +1 -1
  564. package/dist/src/{work → tasks}/project-operating-view-service.d.ts +2 -4
  565. package/dist/src/tasks/project-operating-view-service.js +77 -0
  566. package/dist/src/tasks/task-application-service.d.ts +35 -0
  567. package/dist/src/tasks/task-application-service.js +423 -0
  568. package/dist/src/tasks/task-context-assembler.d.ts +36 -0
  569. package/dist/src/tasks/task-context-assembler.js +125 -0
  570. package/dist/src/tasks/task-context-repository.d.ts +52 -0
  571. package/dist/src/tasks/task-context-repository.js +97 -0
  572. package/dist/src/tasks/task-contract-definition.d.ts +10 -0
  573. package/dist/src/{work/outcome-contract-definition.js → tasks/task-contract-definition.js} +7 -5
  574. package/dist/src/tasks/task-contract-planner.d.ts +17 -0
  575. package/dist/src/tasks/task-contract-planner.js +87 -0
  576. package/dist/src/tasks/task-dependency-service.d.ts +21 -0
  577. package/dist/src/tasks/task-dependency-service.js +81 -0
  578. package/dist/src/tasks/task-outbox-dispatcher.d.ts +6 -0
  579. package/dist/src/tasks/task-outbox-dispatcher.js +31 -0
  580. package/dist/src/tasks/task-read-model-projector.d.ts +16 -0
  581. package/dist/src/tasks/task-read-model-projector.js +93 -0
  582. package/dist/src/tasks/task-repository.d.ts +82 -0
  583. package/dist/src/tasks/task-repository.js +185 -0
  584. package/dist/src/{work/outcome-run-coordinator.d.ts → tasks/task-run-coordinator.d.ts} +6 -8
  585. package/dist/src/tasks/task-run-coordinator.js +130 -0
  586. package/dist/src/tasks/task-run-dispatcher.d.ts +11 -0
  587. package/dist/src/tasks/task-run-dispatcher.js +90 -0
  588. package/dist/src/tasks/task-run-repository.d.ts +102 -0
  589. package/dist/src/tasks/task-run-repository.js +312 -0
  590. package/dist/src/tasks/task-signal-service.d.ts +8 -0
  591. package/dist/src/tasks/task-signal-service.js +72 -0
  592. package/dist/src/tasks/task-value-metrics-service.d.ts +4 -0
  593. package/dist/src/tasks/task-value-metrics-service.js +78 -0
  594. package/dist/src/tasks/task-workflow-coordinator.d.ts +5 -0
  595. package/dist/src/tasks/task-workflow-coordinator.js +54 -0
  596. package/dist/src/tui/backends/embedded-backend.d.ts +11 -1
  597. package/dist/src/tui/backends/embedded-backend.js +29 -3
  598. package/dist/src/tui/backends/gateway-sse-backend.d.ts +6 -3
  599. package/dist/src/tui/backends/gateway-sse-backend.js +38 -127
  600. package/dist/src/tui/components/settings-selector.js +0 -20
  601. package/dist/src/tui/components/tui-bottom-bar.d.ts +2 -3
  602. package/dist/src/tui/components/tui-bottom-bar.js +4 -9
  603. package/dist/src/tui/extension-host/runtime-context.js +1 -1
  604. package/dist/src/tui/tool-summary.d.ts +1 -2
  605. package/dist/src/tui/tool-summary.js +2 -18
  606. package/dist/src/tui/tui-backend.d.ts +13 -1
  607. package/dist/src/tui/tui-backend.js +10 -1
  608. package/dist/src/tui/tui-command-formatters.js +1 -2
  609. package/dist/src/tui/tui-commands.js +8 -19
  610. package/dist/src/tui/tui-session-actions.js +0 -2
  611. package/dist/src/tui/tui-settings.d.ts +0 -6
  612. package/dist/src/tui/tui-settings.js +0 -10
  613. package/dist/src/tui/tui-startup-resources.js +1 -1
  614. package/dist/src/tui/tui-types.d.ts +1 -4
  615. package/dist/src/tui/tui-types.js +1 -2
  616. package/dist/src/tui/tui.js +90 -73
  617. package/dist/src/tui/xopc-tui-keybindings.d.ts +25 -6
  618. package/dist/src/tui/xopc-tui-keybindings.js +0 -5
  619. package/dist/src/tunnel/frpc-binary.js +1 -1
  620. package/dist/src/tunnel/frpc-extract.js +1 -1
  621. package/dist/src/user-context/config.d.ts +165 -16
  622. package/dist/src/user-context/config.js +74 -14
  623. package/dist/src/user-context/context-compiler.d.ts +4 -8
  624. package/dist/src/user-context/context-compiler.js +7 -10
  625. package/dist/src/user-context/interaction-state.js +8 -4
  626. package/dist/src/user-context/manual-understanding.d.ts +19 -0
  627. package/dist/src/user-context/manual-understanding.js +69 -0
  628. package/dist/src/user-context/memory-episode-evaluator.d.ts +32 -0
  629. package/dist/src/user-context/memory-episode-evaluator.js +35 -0
  630. package/dist/src/user-context/memory-readiness.d.ts +33 -0
  631. package/dist/src/user-context/memory-readiness.js +41 -0
  632. package/dist/src/user-context/memory-use-audit.js +3 -2
  633. package/dist/src/user-context/projection.d.ts +14 -0
  634. package/dist/src/user-context/projection.js +15 -3
  635. package/dist/src/user-context/relationship-continuity.js +1 -1
  636. package/dist/src/user-context/runtime.d.ts +0 -2
  637. package/dist/src/user-context/runtime.js +1 -10
  638. package/dist/src/user-context/source-recommendations.d.ts +5 -5
  639. package/dist/src/user-context/source-recommendations.js +9 -8
  640. package/dist/src/voice/local/model-files.js +1 -1
  641. package/dist/src/voice/stt/transcribe-core.js +3 -3
  642. package/dist/src/voice/stt/types.d.ts +2 -2
  643. package/dist/src/voice/tts/speak-core.js +4 -4
  644. package/dist/src/voice/tts/types.d.ts +2 -2
  645. package/dist/src/work-discovery/analyzer.js +5 -5
  646. package/dist/src/work-discovery/service.d.ts +1 -10
  647. package/dist/src/work-discovery/service.js +4 -6
  648. package/dist/src/work-discovery/types.d.ts +1 -1
  649. package/dist/src/workflows/domain/run.d.ts +3 -4
  650. package/dist/src/workflows/draft/workflow-draft-prompt.js +1 -1
  651. package/dist/src/workflows/index.js +1 -1
  652. package/dist/src/workflows/service/workflow-run-service.d.ts +2 -2
  653. package/dist/src/workflows/service/workflow-run-service.js +105 -35
  654. package/dist/src/workflows/service/workflow-run-service.types.d.ts +1 -2
  655. package/dist/src/workflows/service/workflow-session-bridge.js +4 -12
  656. package/dist/src/workflows/store/run-index-store.d.ts +1 -1
  657. package/dist/src/workflows/store/run-index-store.js +10 -8
  658. package/dist/src/workflows/store/run-store.d.ts +1 -1
  659. package/dist/src/workflows/store/run-store.js +2 -2
  660. package/package.json +5 -5
  661. package/dist/gateway/static/root/assets/agents-DgGj9bu6.js +0 -2
  662. package/dist/gateway/static/root/assets/apps-page-B5xahuT-.js +0 -1
  663. package/dist/gateway/static/root/assets/automations-page-BUYrvMmD.js +0 -6
  664. package/dist/gateway/static/root/assets/browser-settings-page-Cjw07q9h.js +0 -8
  665. package/dist/gateway/static/root/assets/browser-workflow-inputs-_gu08MA4.js +0 -1
  666. package/dist/gateway/static/root/assets/capabilities-settings-panel-D_dfVxHY.js +0 -7
  667. package/dist/gateway/static/root/assets/capability-presets-api-DhCn9rPv.js +0 -1
  668. package/dist/gateway/static/root/assets/capability-presets-settings-panel-LWWIYUT7.js +0 -1
  669. package/dist/gateway/static/root/assets/channels-settings-Cyj5OunL.js +0 -1
  670. package/dist/gateway/static/root/assets/channels-status-swr-TEFnV0IG.js +0 -1
  671. package/dist/gateway/static/root/assets/connectors-page-0TobCpBB.js +0 -2
  672. package/dist/gateway/static/root/assets/desktop-pet-CwVSLL6N.js +0 -1
  673. package/dist/gateway/static/root/assets/dreaming-scene-BHMRVEUS.js +0 -4585
  674. package/dist/gateway/static/root/assets/dreaming-settings-Da9FeWQl.js +0 -3
  675. package/dist/gateway/static/root/assets/format-cron-label-arqgGlVV.js +0 -1
  676. package/dist/gateway/static/root/assets/goals-settings-Dx9uTyWF.js +0 -1
  677. package/dist/gateway/static/root/assets/heartbeat-settings-Cnr5ORXL.js +0 -1
  678. package/dist/gateway/static/root/assets/index-B0Tdge_q.css +0 -1
  679. package/dist/gateway/static/root/assets/index-BA56bQ68.js +0 -224
  680. package/dist/gateway/static/root/assets/local-app-workbench-page-DSUNtLHg.js +0 -2
  681. package/dist/gateway/static/root/assets/logs-page-yI8kpQtO.js +0 -7
  682. package/dist/gateway/static/root/assets/messages-H_iJjnEM.js +0 -3
  683. package/dist/gateway/static/root/assets/notes-workbench-BD297EZt.js +0 -4
  684. package/dist/gateway/static/root/assets/outcome-detail-page-C5i_ZR9a.js +0 -1
  685. package/dist/gateway/static/root/assets/product-delivery-BVG-eWQO.js +0 -1
  686. package/dist/gateway/static/root/assets/project-detail-page-D1HGz7Dy.js +0 -1
  687. package/dist/gateway/static/root/assets/projects-page-CqP2TnW-.js +0 -1
  688. package/dist/gateway/static/root/assets/remote-access-hub-BXdVJLS3.js +0 -1
  689. package/dist/gateway/static/root/assets/save-bar-controls-B53UNtDM.js +0 -1
  690. package/dist/gateway/static/root/assets/schedule-field-C3dIMN5q.js +0 -1
  691. package/dist/gateway/static/root/assets/sessions-page-CPAwDdl5.js +0 -1
  692. package/dist/gateway/static/root/assets/settings-advanced-gate-C-jGsoft.js +0 -1
  693. package/dist/gateway/static/root/assets/settings-page-Di5x6Xrc.js +0 -1
  694. package/dist/gateway/static/root/assets/setup-status-panel-uxEE6gAB.js +0 -1
  695. package/dist/gateway/static/root/assets/shares-settings-2mcsMWgn.js +0 -1
  696. package/dist/gateway/static/root/assets/skill-reload-api-ocDwsrEt.js +0 -1
  697. package/dist/gateway/static/root/assets/skills-page-9_jfsFU5.js +0 -2
  698. package/dist/gateway/static/root/assets/system-settings-panel-CIJ66cUy.js +0 -1
  699. package/dist/gateway/static/root/assets/time-picker-D0zAsHOo.js +0 -1
  700. package/dist/gateway/static/root/assets/use-channel-catalog-BQz3K7xj.js +0 -1
  701. package/dist/gateway/static/root/assets/user-context-page-Bn4BLg4W.js +0 -1
  702. package/dist/gateway/static/root/assets/work-copy-Cwyan9Sn.js +0 -1
  703. package/dist/gateway/static/root/assets/work-discovery-page-iJ9RBSpu.js +0 -1
  704. package/dist/gateway/static/root/assets/work-item-detail-page-CqTH7PQX.js +0 -1
  705. package/dist/gateway/static/root/assets/work-page-H3m99ccS.js +0 -3
  706. package/dist/gateway/static/root/assets/workflows-page-BxZSKMfv.js +0 -11
  707. package/dist/packages/gateway-contract/src/outcomes.js +0 -137
  708. package/dist/packages/gateway-contract/src/work-intake.js +0 -85
  709. package/dist/src/agent/feedback/feedback-coordinator.d.ts +0 -73
  710. package/dist/src/agent/feedback/feedback-coordinator.js +0 -156
  711. package/dist/src/agent/feedback/index.d.ts +0 -4
  712. package/dist/src/agent/feedback/index.js +0 -2
  713. package/dist/src/agent/goals/checklist-judge.d.ts +0 -48
  714. package/dist/src/agent/goals/checklist-judge.js +0 -237
  715. package/dist/src/agent/goals/checklist-types.d.ts +0 -21
  716. package/dist/src/agent/goals/checklist-types.js +0 -24
  717. package/dist/src/agent/goals/evaluate-turn.d.ts +0 -29
  718. package/dist/src/agent/goals/evaluate-turn.js +0 -209
  719. package/dist/src/agent/goals/goal-locale.d.ts +0 -26
  720. package/dist/src/agent/goals/goal-locale.js +0 -61
  721. package/dist/src/agent/goals/judge.d.ts +0 -41
  722. package/dist/src/agent/goals/judge.js +0 -176
  723. package/dist/src/agent/goals/persistent-goal-apis.d.ts +0 -15
  724. package/dist/src/agent/goals/persistent-goal-apis.js +0 -1
  725. package/dist/src/agent/goals/persistent-goal-service.d.ts +0 -93
  726. package/dist/src/agent/goals/persistent-goal-service.js +0 -128
  727. package/dist/src/agent/goals/post-turn.d.ts +0 -28
  728. package/dist/src/agent/goals/post-turn.js +0 -187
  729. package/dist/src/agent/goals/state.d.ts +0 -46
  730. package/dist/src/agent/goals/state.js +0 -80
  731. package/dist/src/agent/lifecycle/progress.d.ts +0 -90
  732. package/dist/src/agent/lifecycle/progress.js +0 -340
  733. package/dist/src/agent/mcp/bundle-mcp-materialize.js +0 -183
  734. package/dist/src/agent/mcp/mcp-tool-meta.d.ts +0 -8
  735. package/dist/src/agent/mcp/mcp-tool-meta.js +0 -13
  736. package/dist/src/agent/mcp/resolve-embedded-mcp-tools.d.ts +0 -14
  737. package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js +0 -49
  738. package/dist/src/agent/memory/builtin-memory-store.d.ts +0 -54
  739. package/dist/src/agent/memory/builtin-memory-store.js +0 -315
  740. package/dist/src/agent/memory/dreaming/events.d.ts +0 -36
  741. package/dist/src/agent/memory/dreaming/events.js +0 -42
  742. package/dist/src/agent/memory/dreaming/last-run.d.ts +0 -80
  743. package/dist/src/agent/memory/dreaming/last-run.js +0 -96
  744. package/dist/src/agent/memory/dreaming/short-term-store.d.ts +0 -75
  745. package/dist/src/agent/memory/dreaming/short-term-store.js +0 -273
  746. package/dist/src/agent/outcomes/execution-evaluation.d.ts +0 -20
  747. package/dist/src/agent/outcomes/execution-evaluation.js +0 -48
  748. package/dist/src/agent/prompt/memory/index.d.ts +0 -23
  749. package/dist/src/agent/prompt/memory/index.js +0 -101
  750. package/dist/src/agent/tools/composio-tool.d.ts +0 -21
  751. package/dist/src/agent/tools/composio-tool.js +0 -261
  752. package/dist/src/agent/tools/curated-memory-tool.d.ts +0 -3
  753. package/dist/src/agent/tools/curated-memory-tool.js +0 -174
  754. package/dist/src/agent/tools/goal-evidence-recorder.d.ts +0 -6
  755. package/dist/src/agent/tools/goal-evidence-recorder.js +0 -32
  756. package/dist/src/agent/tools/goal-tool.d.ts +0 -29
  757. package/dist/src/agent/tools/goal-tool.js +0 -136
  758. package/dist/src/chat-commands/builtins/goal.d.ts +0 -4
  759. package/dist/src/chat-commands/builtins/goal.js +0 -122
  760. package/dist/src/chat-commands/builtins/subgoal.d.ts +0 -4
  761. package/dist/src/chat-commands/builtins/subgoal.js +0 -117
  762. package/dist/src/cli/commands/goal.d.ts +0 -4
  763. package/dist/src/cli/commands/goal.js +0 -235
  764. package/dist/src/discussions/pipeline.d.ts +0 -33
  765. package/dist/src/discussions/pipeline.js +0 -205
  766. package/dist/src/discussions/worker.js +0 -74
  767. package/dist/src/gateway/hono/routes/dreaming.d.ts +0 -3
  768. package/dist/src/gateway/hono/routes/dreaming.js +0 -323
  769. package/dist/src/gateway/hono/routes/execution-receipts.d.ts +0 -3
  770. package/dist/src/gateway/hono/routes/execution-receipts.js +0 -163
  771. package/dist/src/gateway/hono/routes/goals.d.ts +0 -4
  772. package/dist/src/gateway/hono/routes/goals.js +0 -786
  773. package/dist/src/gateway/hono/routes/work.js +0 -207
  774. package/dist/src/goals/goal-notifications.d.ts +0 -31
  775. package/dist/src/goals/goal-notifications.js +0 -157
  776. package/dist/src/goals/goal-queue-store.d.ts +0 -18
  777. package/dist/src/goals/goal-queue-store.js +0 -133
  778. package/dist/src/goals/goal-queue-types.d.ts +0 -42
  779. package/dist/src/goals/goal-queue-types.js +0 -1
  780. package/dist/src/goals/goal-runner.d.ts +0 -17
  781. package/dist/src/goals/goal-runner.js +0 -153
  782. package/dist/src/goals/goal-service.d.ts +0 -87
  783. package/dist/src/goals/goal-service.js +0 -323
  784. package/dist/src/goals/goal-store.d.ts +0 -44
  785. package/dist/src/goals/goal-store.js +0 -472
  786. package/dist/src/goals/goal-workflow-judge.d.ts +0 -13
  787. package/dist/src/goals/goal-workflow-judge.js +0 -145
  788. package/dist/src/goals/index.d.ts +0 -10
  789. package/dist/src/goals/index.js +0 -7
  790. package/dist/src/goals/types.d.ts +0 -136
  791. package/dist/src/goals/types.js +0 -1
  792. package/dist/src/i18n/goals-bundle.d.ts +0 -35
  793. package/dist/src/i18n/goals-bundle.js +0 -61
  794. package/dist/src/i18n/locales/goals.en.js +0 -36
  795. package/dist/src/i18n/locales/goals.zh.js +0 -35
  796. package/dist/src/projects/goal-bind.d.ts +0 -4
  797. package/dist/src/projects/goal-bind.js +0 -38
  798. package/dist/src/session/abort-cutoff.d.ts +0 -6
  799. package/dist/src/session/abort-cutoff.js +0 -8
  800. package/dist/src/storage/sqlite/execution-receipt-repository.d.ts +0 -146
  801. package/dist/src/storage/sqlite/execution-receipt-repository.js +0 -235
  802. package/dist/src/storage/sqlite/memory-index-repository.d.ts +0 -18
  803. package/dist/src/storage/sqlite/memory-index-repository.js +0 -136
  804. package/dist/src/tui/tui-follow-up-queue.d.ts +0 -9
  805. package/dist/src/tui/tui-follow-up-queue.js +0 -16
  806. package/dist/src/work/execution-context.d.ts +0 -16
  807. package/dist/src/work/index.d.ts +0 -14
  808. package/dist/src/work/index.js +0 -15
  809. package/dist/src/work/outcome-contract-definition.d.ts +0 -8
  810. package/dist/src/work/outcome-execution-service.d.ts +0 -27
  811. package/dist/src/work/outcome-execution-service.js +0 -60
  812. package/dist/src/work/outcome-projection-service.d.ts +0 -7
  813. package/dist/src/work/outcome-projection-service.js +0 -51
  814. package/dist/src/work/outcome-receipt-service.d.ts +0 -13
  815. package/dist/src/work/outcome-receipt-service.js +0 -55
  816. package/dist/src/work/outcome-repository.d.ts +0 -50
  817. package/dist/src/work/outcome-repository.js +0 -112
  818. package/dist/src/work/outcome-run-coordinator.js +0 -117
  819. package/dist/src/work/project-operating-view-service.js +0 -46
  820. package/dist/src/work/work-intake-repository.d.ts +0 -49
  821. package/dist/src/work/work-intake-repository.js +0 -97
  822. package/dist/src/work/work-intake-service.d.ts +0 -26
  823. package/dist/src/work/work-intake-service.js +0 -171
  824. package/dist/src/work/work-value-metrics-service.d.ts +0 -4
  825. package/dist/src/work/work-value-metrics-service.js +0 -88
  826. package/dist/src/work-items/agent-context.d.ts +0 -7
  827. package/dist/src/work-items/agent-context.js +0 -73
  828. package/dist/src/work-items/index.d.ts +0 -5
  829. package/dist/src/work-items/index.js +0 -5
  830. package/dist/src/work-items/types.d.ts +0 -112
  831. package/dist/src/work-items/types.js +0 -1
  832. package/dist/src/work-items/work-item-service.d.ts +0 -36
  833. package/dist/src/work-items/work-item-service.js +0 -281
  834. package/dist/src/work-items/work-item-store.d.ts +0 -22
  835. package/dist/src/work-items/work-item-store.js +0 -313
  836. package/dist/src/work-items/work-item-workflow-judge.d.ts +0 -8
  837. package/dist/src/work-items/work-item-workflow-judge.js +0 -48
  838. /package/dist/src/{work → tasks}/project-monitoring-service.d.ts +0 -0
@@ -1,52 +1,42 @@
1
1
  import { getSqliteDatabase, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
2
+ import { DISCUSSION_STATUSES } from "./types.js";
3
+ import { randomUUID } from "node:crypto";
2
4
  //#region src/discussions/repository.ts
3
- function parseJson(value) {
4
- if (!value) return void 0;
5
- try {
6
- return JSON.parse(value);
7
- } catch {
8
- return;
9
- }
5
+ function optional(condition, value) {
6
+ return condition ? value : {};
10
7
  }
11
8
  function discussionFromRow(row) {
12
- return {
9
+ const capture = {
13
10
  id: row.id,
14
11
  clientRequestId: row.client_request_id,
15
12
  noteId: row.note_id,
16
- ...row.project_id ? { projectId: row.project_id } : {},
17
- ...row.audio_attachment_id ? { audioAttachmentId: row.audio_attachment_id } : {},
18
13
  source: row.source,
19
14
  status: row.status,
20
- ...row.processing_stage ? { processingStage: row.processing_stage } : {},
21
- ...row.duration_ms != null ? { durationMs: row.duration_ms } : {},
22
- ...row.expected_last_sequence != null ? { expectedLastSequence: row.expected_last_sequence } : {},
23
- ...row.mime_type ? { mimeType: row.mime_type } : {},
24
- ...row.audio_size_bytes != null ? { audioSizeBytes: row.audio_size_bytes } : {},
25
- ...row.audio_sha256 ? { audioSha256: row.audio_sha256 } : {},
26
- ...row.transcript_raw ? { transcriptRaw: row.transcript_raw } : {},
27
- ...row.transcript_sha256 ? { transcriptSha256: row.transcript_sha256 } : {},
28
- ...row.transcript_language ? { transcriptLanguage: row.transcript_language } : {},
29
- ...row.stt_provider ? { sttProvider: row.stt_provider } : {},
30
- ...row.analysis_json ? { analysis: parseJson(row.analysis_json) } : {},
31
- ...row.analysis_input_hash ? { analysisInputHash: row.analysis_input_hash } : {},
32
- ...row.analyzer_model_ref ? { analyzerModelRef: row.analyzer_model_ref } : {},
33
- ...row.generated_title ? { generatedTitle: row.generated_title } : {},
34
- ...row.project_inference_score != null ? { projectInferenceScore: row.project_inference_score } : {},
35
- ...row.project_inference_source ? { projectInferenceSource: row.project_inference_source } : {},
36
- finalizationRevision: row.finalization_revision,
37
- attemptCount: row.attempt_count,
38
- ...row.next_attempt_at != null ? { nextAttemptAt: row.next_attempt_at } : {},
39
- ...row.lease_owner ? { leaseOwner: row.lease_owner } : {},
40
- ...row.lease_expires_at != null ? { leaseExpiresAt: row.lease_expires_at } : {},
41
- ...row.last_error_code ? { lastErrorCode: row.last_error_code } : {},
42
- ...row.last_error_message ? { lastErrorMessage: row.last_error_message } : {},
15
+ transcriptRevision: row.transcript_revision,
43
16
  recordingStartedAt: row.recording_started_at,
44
- ...row.recording_finished_at != null ? { recordingFinishedAt: row.recording_finished_at } : {},
45
17
  createdAt: row.created_at,
46
- updatedAt: row.updated_at,
47
- ...row.completed_at != null ? { completedAt: row.completed_at } : {},
48
- ...row.audio_deleted_at != null ? { audioDeletedAt: row.audio_deleted_at } : {}
18
+ updatedAt: row.updated_at
49
19
  };
20
+ if (row.project_id) capture.projectId = row.project_id;
21
+ if (row.audio_attachment_id) capture.audioAttachmentId = row.audio_attachment_id;
22
+ if (row.duration_ms != null) capture.durationMs = row.duration_ms;
23
+ if (row.expected_last_sequence != null) capture.expectedLastSequence = row.expected_last_sequence;
24
+ if (row.mime_type) capture.mimeType = row.mime_type;
25
+ if (row.audio_size_bytes != null) capture.audioSizeBytes = row.audio_size_bytes;
26
+ if (row.audio_sha256) capture.audioSha256 = row.audio_sha256;
27
+ if (row.canonical_transcript) capture.canonicalTranscript = row.canonical_transcript;
28
+ if (row.canonical_transcript_sha256) capture.canonicalTranscriptSha256 = row.canonical_transcript_sha256;
29
+ if (row.transcript_language) capture.transcriptLanguage = row.transcript_language;
30
+ if (row.generated_title) capture.generatedTitle = row.generated_title;
31
+ if (row.project_inference_score != null) capture.projectInferenceScore = row.project_inference_score;
32
+ if (row.project_inference_source) capture.projectInferenceSource = row.project_inference_source;
33
+ if (row.failure_stage) capture.failureStage = row.failure_stage;
34
+ if (row.failure_code) capture.failureCode = row.failure_code;
35
+ if (row.failure_message) capture.failureMessage = row.failure_message;
36
+ if (row.recording_stopped_at != null) capture.recordingStoppedAt = row.recording_stopped_at;
37
+ if (row.completed_at != null) capture.completedAt = row.completed_at;
38
+ if (row.audio_deleted_at != null) capture.audioDeletedAt = row.audio_deleted_at;
39
+ return capture;
50
40
  }
51
41
  function segmentFromRow(row) {
52
42
  return {
@@ -56,39 +46,53 @@ function segmentFromRow(row) {
56
46
  startedAtMs: row.started_at_ms,
57
47
  endedAtMs: row.ended_at_ms,
58
48
  status: row.status,
59
- ...row.transcript ? { transcript: row.transcript } : {},
60
- ...row.provider ? { provider: row.provider } : {},
49
+ ...optional(row.raw_text, { rawText: row.raw_text }),
50
+ ...optional(row.display_text, { displayText: row.display_text }),
51
+ ...optional(row.language, { language: row.language }),
52
+ ...optional(row.provider, { provider: row.provider }),
53
+ ...optional(row.confidence != null, { confidence: row.confidence }),
54
+ ...optional(row.speaker_label, { speakerLabel: row.speaker_label }),
55
+ revision: row.revision,
56
+ correctedByUser: row.corrected_by_user === 1,
57
+ ...optional(row.corrected_at != null, { correctedAt: row.corrected_at }),
61
58
  attemptCount: row.attempt_count,
62
- ...row.next_attempt_at != null ? { nextAttemptAt: row.next_attempt_at } : {},
63
- ...row.lease_owner ? { leaseOwner: row.lease_owner } : {},
64
- ...row.lease_expires_at != null ? { leaseExpiresAt: row.lease_expires_at } : {},
65
- ...row.last_error ? { lastError: row.last_error } : {},
59
+ ...optional(row.next_attempt_at != null, { nextAttemptAt: row.next_attempt_at }),
60
+ ...optional(row.lease_owner, { leaseOwner: row.lease_owner }),
61
+ ...optional(row.lease_expires_at != null, { leaseExpiresAt: row.lease_expires_at }),
62
+ ...optional(row.last_error, { lastError: row.last_error }),
66
63
  createdAt: row.created_at,
67
64
  updatedAt: row.updated_at
68
65
  };
69
66
  }
70
- function readOne(column, value) {
67
+ function organizationFromRow(row) {
68
+ return {
69
+ id: row.id,
70
+ discussionId: row.discussion_id,
71
+ revision: row.revision,
72
+ inputTranscriptSha256: row.input_transcript_sha256,
73
+ promptVersion: row.prompt_version,
74
+ modelRef: row.model_ref,
75
+ ...optional(row.organization_json, { organization: JSON.parse(row.organization_json) }),
76
+ status: row.status,
77
+ ...optional(row.error_message, { errorMessage: row.error_message }),
78
+ createdAt: row.created_at,
79
+ ...optional(row.completed_at != null, { completedAt: row.completed_at })
80
+ };
81
+ }
82
+ function getBy(column, value) {
71
83
  const row = getSqliteDatabase().prepare(`SELECT * FROM discussion_captures WHERE ${column} = ?`).get(value);
72
84
  return row ? discussionFromRow(row) : null;
73
85
  }
74
86
  function createDiscussionCapture(capture) {
75
87
  runSqliteWriteTransaction((db) => db.prepare(`INSERT INTO discussion_captures (
76
- id, client_request_id, note_id, project_id, source, status,
77
- processing_stage, project_inference_score, project_inference_source,
78
- finalization_revision, attempt_count, recording_started_at, created_at, updated_at
79
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(capture.id, capture.clientRequestId, capture.noteId, capture.projectId ?? null, capture.source, capture.status, capture.processingStage ?? null, capture.projectInferenceScore ?? null, capture.projectInferenceSource ?? null, capture.finalizationRevision, capture.attemptCount, capture.recordingStartedAt, capture.createdAt, capture.updatedAt));
88
+ id, client_request_id, note_id, project_id, source, status, transcript_revision,
89
+ project_inference_score, project_inference_source, recording_started_at, created_at, updated_at
90
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(capture.id, capture.clientRequestId, capture.noteId, capture.projectId ?? null, capture.source, capture.status, capture.transcriptRevision, capture.projectInferenceScore ?? null, capture.projectInferenceSource ?? null, capture.recordingStartedAt, capture.createdAt, capture.updatedAt));
80
91
  return getDiscussionCapture(capture.id);
81
92
  }
82
- function getDiscussionCapture(id) {
83
- return readOne("id", id);
84
- }
85
- function getDiscussionCaptureByClientRequestId(clientRequestId) {
86
- return readOne("client_request_id", clientRequestId);
87
- }
88
- function getDiscussionCaptureByNoteId(noteId) {
89
- const row = getSqliteDatabase().prepare("SELECT * FROM discussion_captures WHERE note_id = ?").get(noteId);
90
- return row ? discussionFromRow(row) : null;
91
- }
93
+ const getDiscussionCapture = (id) => getBy("id", id);
94
+ const getDiscussionCaptureByClientRequestId = (id) => getBy("client_request_id", id);
95
+ const getDiscussionCaptureByNoteId = (id) => getBy("note_id", id);
92
96
  function listDiscussionCaptures(query = {}) {
93
97
  const clauses = [];
94
98
  const params = [];
@@ -101,13 +105,13 @@ function listDiscussionCaptures(query = {}) {
101
105
  clauses.push("project_id = ?");
102
106
  params.push(query.projectId);
103
107
  }
104
- const where = clauses.length > 0 ? `WHERE ${clauses.join(" AND ")}` : "";
108
+ const where = clauses.length ? `WHERE ${clauses.join(" AND ")}` : "";
105
109
  const limit = Math.min(100, Math.max(1, Math.floor(query.limit ?? 30)));
106
110
  const offset = Math.max(0, Math.floor(query.offset ?? 0));
107
111
  const db = getSqliteDatabase();
108
112
  const total = db.prepare(`SELECT COUNT(*) AS total FROM discussion_captures ${where}`).get(...params).total;
109
113
  const rows = db.prepare(`SELECT * FROM discussion_captures ${where}
110
- ORDER BY updated_at DESC, id DESC LIMIT ? OFFSET ?`).all(...params, limit, offset);
114
+ ORDER BY updated_at DESC, id DESC LIMIT ? OFFSET ?`).all(...params, limit, offset);
111
115
  return {
112
116
  items: rows.map(discussionFromRow),
113
117
  total,
@@ -118,138 +122,158 @@ function listDiscussionCaptures(query = {}) {
118
122
  }
119
123
  function getDiscussionMetrics() {
120
124
  const db = getSqliteDatabase();
121
- const rows = db.prepare("SELECT status, COUNT(*) AS count FROM discussion_captures GROUP BY status").all();
125
+ const rows = db.prepare("SELECT status, COUNT(*) count FROM discussion_captures GROUP BY status").all();
122
126
  const timing = db.prepare(`SELECT
123
- AVG((SELECT MIN(s.updated_at) FROM discussion_transcript_segments s
124
- WHERE s.discussion_id = d.id AND s.status = 'completed') - d.recording_started_at) AS first_transcript_ms,
125
- AVG(CASE WHEN d.completed_at IS NOT NULL THEN d.completed_at - d.recording_started_at END) AS complete_ms
126
- FROM discussion_captures d`).get();
127
- const byStatus = Object.fromEntries([
128
- "recording",
129
- "finalizing",
130
- "completed",
131
- "failed",
132
- "cancelled"
133
- ].map((status) => [status, 0]));
127
+ AVG((SELECT MIN(s.updated_at) FROM discussion_transcript_segments s
128
+ WHERE s.discussion_id = d.id AND s.status = 'confirmed') - d.recording_started_at) first_ms,
129
+ AVG(CASE WHEN d.completed_at IS NOT NULL THEN d.completed_at - d.recording_started_at END) complete_ms
130
+ FROM discussion_captures d`).get();
131
+ const byStatus = Object.fromEntries(DISCUSSION_STATUSES.map((status) => [status, 0]));
134
132
  for (const row of rows) byStatus[row.status] = row.count;
135
133
  return {
136
134
  total: rows.reduce((sum, row) => sum + row.count, 0),
137
135
  byStatus,
138
- averageTimeToFirstTranscriptMs: timing.first_transcript_ms == null ? null : Math.max(0, Math.round(timing.first_transcript_ms)),
139
- averageTimeToCompleteMs: timing.complete_ms == null ? null : Math.round(timing.complete_ms)
136
+ averageTimeToFirstTranscriptMs: timing.first_ms == null ? null : Math.max(0, Math.round(timing.first_ms)),
137
+ averageTimeToCompleteMs: timing.complete_ms == null ? null : Math.max(0, Math.round(timing.complete_ms))
140
138
  };
141
139
  }
142
140
  function updateDiscussionCapture(id, patch, expectedStatuses) {
143
- const existing = getDiscussionCapture(id);
144
- if (!existing || expectedStatuses && !expectedStatuses.includes(existing.status)) return null;
141
+ const current = getDiscussionCapture(id);
142
+ if (!current || expectedStatuses && !expectedStatuses.includes(current.status)) return null;
145
143
  const next = {
146
- ...existing,
144
+ ...current,
147
145
  ...patch,
148
146
  updatedAt: patch.updatedAt ?? Date.now()
149
147
  };
150
- const sql = `UPDATE discussion_captures SET
151
- project_id = ?, audio_attachment_id = ?, source = ?, status = ?, processing_stage = ?,
152
- duration_ms = ?, expected_last_sequence = ?, mime_type = ?, audio_size_bytes = ?, audio_sha256 = ?,
153
- transcript_raw = ?, transcript_sha256 = ?, transcript_language = ?, stt_provider = ?, analysis_json = ?,
154
- analysis_input_hash = ?, analyzer_model_ref = ?, generated_title = ?, project_inference_score = ?,
155
- project_inference_source = ?, finalization_revision = ?, attempt_count = ?, next_attempt_at = ?,
156
- lease_owner = ?, lease_expires_at = ?, last_error_code = ?, last_error_message = ?,
157
- recording_started_at = ?, recording_finished_at = ?, updated_at = ?, completed_at = ?, audio_deleted_at = ?
158
- WHERE id = ?${expectedStatuses?.length ? ` AND status IN (${expectedStatuses.map(() => "?").join(", ")})` : ""}`;
159
- return runSqliteWriteTransaction((db) => db.prepare(sql).run(next.projectId ?? null, next.audioAttachmentId ?? null, next.source, next.status, next.processingStage ?? null, next.durationMs ?? null, next.expectedLastSequence ?? null, next.mimeType ?? null, next.audioSizeBytes ?? null, next.audioSha256 ?? null, next.transcriptRaw ?? null, next.transcriptSha256 ?? null, next.transcriptLanguage ?? null, next.sttProvider ?? null, next.analysis === void 0 ? null : JSON.stringify(next.analysis), next.analysisInputHash ?? null, next.analyzerModelRef ?? null, next.generatedTitle ?? null, next.projectInferenceScore ?? null, next.projectInferenceSource ?? null, next.finalizationRevision, next.attemptCount, next.nextAttemptAt ?? null, next.leaseOwner ?? null, next.leaseExpiresAt ?? null, next.lastErrorCode ?? null, next.lastErrorMessage ?? null, next.recordingStartedAt, next.recordingFinishedAt ?? null, next.updatedAt, next.completedAt ?? null, next.audioDeletedAt ?? null, id, ...expectedStatuses ?? []).changes) > 0 ? getDiscussionCapture(id) : null;
148
+ const statusGuard = expectedStatuses?.length ? ` AND status IN (${expectedStatuses.map(() => "?").join(",")})` : "";
149
+ return runSqliteWriteTransaction((db) => db.prepare(`UPDATE discussion_captures SET
150
+ project_id=?, audio_attachment_id=?, source=?, status=?, duration_ms=?, expected_last_sequence=?,
151
+ mime_type=?, audio_size_bytes=?, audio_sha256=?, canonical_transcript=?, canonical_transcript_sha256=?,
152
+ transcript_language=?, transcript_revision=?, generated_title=?, project_inference_score=?,
153
+ project_inference_source=?, failure_stage=?, failure_code=?, failure_message=?, recording_started_at=?,
154
+ 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;
160
155
  }
161
156
  function claimNextDiscussionCapture(owner, now = Date.now(), leaseMs = 5 * 6e4) {
162
157
  return runSqliteWriteTransaction((db) => {
163
158
  const row = db.prepare(`SELECT * FROM discussion_captures
164
- WHERE status = 'finalizing'
165
- AND (next_attempt_at IS NULL OR next_attempt_at <= ?)
166
- AND (lease_owner IS NULL OR lease_expires_at IS NULL OR lease_expires_at <= ?)
167
- ORDER BY created_at ASC, id ASC LIMIT 1`).get(now, now);
159
+ WHERE status='organizing' AND (work_lease_owner IS NULL OR work_lease_expires_at <= ?)
160
+ ORDER BY updated_at ASC LIMIT 1`).get(now);
168
161
  if (!row) return null;
169
- return db.prepare(`UPDATE discussion_captures SET attempt_count = attempt_count + 1,
170
- next_attempt_at = NULL, lease_owner = ?, lease_expires_at = ?, updated_at = ?
171
- WHERE id = ? AND status = 'finalizing'
172
- AND (lease_owner IS NULL OR lease_expires_at IS NULL OR lease_expires_at <= ?)`).run(owner, now + leaseMs, now, row.id, now).changes > 0 ? getDiscussionCapture(row.id) : null;
162
+ return db.prepare(`UPDATE discussion_captures SET work_lease_owner=?, work_lease_expires_at=?, updated_at=?
163
+ 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;
173
164
  });
174
165
  }
166
+ function releaseDiscussionWorkLease(id) {
167
+ runSqliteWriteTransaction((db) => db.prepare("UPDATE discussion_captures SET work_lease_owner=NULL, work_lease_expires_at=NULL WHERE id=?").run(id));
168
+ }
175
169
  function createDiscussionTranscriptSegment(input) {
176
170
  const existing = getDiscussionTranscriptSegment(input.discussionId, input.sequence);
177
171
  if (existing) return existing;
178
172
  const now = input.now ?? Date.now();
179
- runSqliteWriteTransaction((db) => db.prepare(`INSERT INTO discussion_transcript_segments (
173
+ runSqliteWriteTransaction((db) => {
174
+ db.prepare(`INSERT INTO discussion_transcript_segments (
180
175
  discussion_id, sequence, audio_sha256, audio_blob, started_at_ms, ended_at_ms,
181
- status, attempt_count, created_at, updated_at
182
- ) VALUES (?, ?, ?, ?, ?, ?, 'uploaded', 0, ?, ?)`).run(input.discussionId, input.sequence, input.audioSha256, input.audioBuffer, input.startedAtMs, input.endedAtMs, now, now));
176
+ status, revision, corrected_by_user, attempt_count, created_at, updated_at
177
+ ) VALUES (?, ?, ?, ?, ?, ?, 'uploaded', 1, 0, 0, ?, ?)`).run(input.discussionId, input.sequence, input.audioSha256, input.audioBuffer, input.startedAtMs, input.endedAtMs, now, now);
178
+ db.prepare("UPDATE discussion_captures SET transcript_revision=transcript_revision+1, updated_at=? WHERE id=?").run(now, input.discussionId);
179
+ });
183
180
  return getDiscussionTranscriptSegment(input.discussionId, input.sequence);
184
181
  }
185
182
  function getDiscussionTranscriptSegment(discussionId, sequence) {
186
- const row = getSqliteDatabase().prepare("SELECT * FROM discussion_transcript_segments WHERE discussion_id = ? AND sequence = ?").get(discussionId, sequence);
183
+ const row = getSqliteDatabase().prepare("SELECT * FROM discussion_transcript_segments WHERE discussion_id=? AND sequence=?").get(discussionId, sequence);
187
184
  return row ? segmentFromRow(row) : null;
188
185
  }
189
186
  function listDiscussionTranscriptSegments(discussionId) {
190
- return getSqliteDatabase().prepare("SELECT * FROM discussion_transcript_segments WHERE discussion_id = ? ORDER BY sequence ASC").all(discussionId).map(segmentFromRow);
187
+ return getSqliteDatabase().prepare("SELECT * FROM discussion_transcript_segments WHERE discussion_id=? ORDER BY sequence").all(discussionId).map(segmentFromRow);
191
188
  }
192
189
  function claimNextDiscussionTranscriptSegment(owner, now = Date.now(), leaseMs = 2 * 6e4) {
193
190
  return runSqliteWriteTransaction((db) => {
194
191
  const row = db.prepare(`SELECT s.* FROM discussion_transcript_segments s
195
- JOIN discussion_captures d ON d.id = s.discussion_id
196
- WHERE (s.status = 'uploaded'
197
- OR (s.status = 'transcribing' AND (s.lease_expires_at IS NULL OR s.lease_expires_at <= ?)))
198
- AND d.status IN ('recording', 'finalizing')
199
- AND (s.next_attempt_at IS NULL OR s.next_attempt_at <= ?)
200
- AND NOT EXISTS (
201
- SELECT 1 FROM discussion_transcript_segments earlier
202
- WHERE earlier.discussion_id = s.discussion_id
203
- AND earlier.sequence < s.sequence
204
- AND earlier.status IN ('uploaded', 'transcribing')
205
- )
206
- ORDER BY s.created_at ASC, s.sequence ASC LIMIT 1`).get(now, now);
192
+ JOIN discussion_captures d ON d.id=s.discussion_id
193
+ WHERE (s.status='uploaded' OR (s.status='transcribing' AND s.lease_expires_at <= ?))
194
+ AND d.status IN ('recording','stopping','sealing')
195
+ AND (s.next_attempt_at IS NULL OR s.next_attempt_at <= ?)
196
+ ORDER BY s.created_at, s.sequence LIMIT 1`).get(now, now);
207
197
  if (!row?.audio_blob) return null;
208
- if (db.prepare(`UPDATE discussion_transcript_segments
209
- SET status = 'transcribing', attempt_count = attempt_count + 1,
210
- next_attempt_at = NULL, lease_owner = ?, lease_expires_at = ?, updated_at = ?
211
- WHERE discussion_id = ? AND sequence = ?
212
- AND (status = 'uploaded'
213
- OR (status = 'transcribing' AND (lease_expires_at IS NULL OR lease_expires_at <= ?)))`).run(owner, now + leaseMs, now, row.discussion_id, row.sequence, now).changes === 0) return null;
214
- const claimed = db.prepare("SELECT * FROM discussion_transcript_segments WHERE discussion_id = ? AND sequence = ?").get(row.discussion_id, row.sequence);
198
+ if (!db.prepare(`UPDATE discussion_transcript_segments SET status='transcribing',
199
+ attempt_count=attempt_count+1, next_attempt_at=NULL, lease_owner=?, lease_expires_at=?,
200
+ revision=revision+1, updated_at=? WHERE discussion_id=? AND sequence=?
201
+ AND (status='uploaded' OR (status='transcribing' AND lease_expires_at <= ?))`).run(owner, now + leaseMs, now, row.discussion_id, row.sequence, now).changes) return null;
202
+ const claimed = db.prepare("SELECT * FROM discussion_transcript_segments WHERE discussion_id=? AND sequence=?").get(row.discussion_id, row.sequence);
215
203
  return {
216
204
  ...segmentFromRow(claimed),
217
205
  audioBuffer: Buffer.from(claimed.audio_blob)
218
206
  };
219
207
  });
220
208
  }
221
- function completeDiscussionTranscriptSegment(discussionId, sequence, owner, transcript, provider) {
209
+ function completeDiscussionTranscriptSegment(discussionId, sequence, owner, text, provider, language, confidence) {
222
210
  const now = Date.now();
223
- return runSqliteWriteTransaction((db) => db.prepare(`UPDATE discussion_transcript_segments SET
224
- status = 'completed', transcript = ?, provider = ?, audio_blob = NULL,
225
- lease_owner = NULL, lease_expires_at = NULL, next_attempt_at = NULL,
226
- last_error = NULL, updated_at = ?
227
- WHERE discussion_id = ? AND sequence = ? AND status = 'transcribing' AND lease_owner = ?`).run(transcript, provider, now, discussionId, sequence, owner).changes) > 0 ? getDiscussionTranscriptSegment(discussionId, sequence) : null;
211
+ return runSqliteWriteTransaction((db) => {
212
+ const changed = db.prepare(`UPDATE discussion_transcript_segments SET status='confirmed',
213
+ raw_text=?, display_text=?, provider=?, language=?, confidence=?, audio_blob=NULL,
214
+ lease_owner=NULL, lease_expires_at=NULL, next_attempt_at=NULL, last_error=NULL,
215
+ revision=revision+1, updated_at=? WHERE discussion_id=? AND sequence=?
216
+ AND status='transcribing' AND lease_owner=?`).run(text, text, provider, language ?? null, confidence ?? null, now, discussionId, sequence, owner).changes;
217
+ if (changed) db.prepare("UPDATE discussion_captures SET transcript_revision=transcript_revision+1, updated_at=? WHERE id=?").run(now, discussionId);
218
+ return changed;
219
+ }) ? getDiscussionTranscriptSegment(discussionId, sequence) : null;
220
+ }
221
+ function correctDiscussionTranscriptSegment(discussionId, sequence, displayText, expectedRevision) {
222
+ const now = Date.now();
223
+ return runSqliteWriteTransaction((db) => {
224
+ const changed = db.prepare(`UPDATE discussion_transcript_segments SET display_text=?, corrected_by_user=1,
225
+ corrected_at=?, revision=revision+1, updated_at=? WHERE discussion_id=? AND sequence=?
226
+ AND status='confirmed' AND revision=?`).run(displayText, now, now, discussionId, sequence, expectedRevision).changes;
227
+ if (changed) db.prepare("UPDATE discussion_captures SET transcript_revision=transcript_revision+1, updated_at=? WHERE id=?").run(now, discussionId);
228
+ return changed;
229
+ }) ? getDiscussionTranscriptSegment(discussionId, sequence) : null;
228
230
  }
229
231
  function retryOrFailDiscussionTranscriptSegment(discussionId, sequence, owner, error, exhausted) {
230
232
  const now = Date.now();
231
233
  return runSqliteWriteTransaction((db) => db.prepare(`UPDATE discussion_transcript_segments SET
232
- status = ?, lease_owner = NULL, lease_expires_at = NULL,
233
- next_attempt_at = ?, last_error = ?, audio_blob = CASE WHEN ? THEN NULL ELSE audio_blob END,
234
- updated_at = ?
235
- WHERE discussion_id = ? AND sequence = ? AND status = 'transcribing' AND lease_owner = ?`).run(exhausted ? "failed" : "uploaded", exhausted ? null : now + 2e3, error.slice(0, 1e3), exhausted ? 1 : 0, now, discussionId, sequence, owner).changes) > 0 ? getDiscussionTranscriptSegment(discussionId, sequence) : null;
234
+ status=?, lease_owner=NULL, lease_expires_at=NULL, next_attempt_at=?, last_error=?,
235
+ audio_blob=CASE WHEN ? THEN NULL ELSE audio_blob END, revision=revision+1, updated_at=?
236
+ WHERE discussion_id=? AND sequence=? AND status='transcribing' AND lease_owner=?`).run(exhausted ? "failed" : "uploaded", exhausted ? null : now + 2e3, error.slice(0, 1e3), exhausted ? 1 : 0, now, discussionId, sequence, owner).changes) ? getDiscussionTranscriptSegment(discussionId, sequence) : null;
236
237
  }
237
238
  function deleteDiscussionSegmentAudio(discussionId) {
238
- runSqliteWriteTransaction((db) => db.prepare("UPDATE discussion_transcript_segments SET audio_blob = NULL WHERE discussion_id = ?").run(discussionId));
239
+ runSqliteWriteTransaction((db) => db.prepare("UPDATE discussion_transcript_segments SET audio_blob=NULL WHERE discussion_id=?").run(discussionId));
240
+ }
241
+ function createDiscussionOrganization(input) {
242
+ const now = Date.now();
243
+ const revision = (getLatestDiscussionOrganization(input.discussionId)?.revision ?? 0) + 1;
244
+ const id = randomUUID();
245
+ runSqliteWriteTransaction((db) => db.prepare(`INSERT INTO discussion_organizations (
246
+ id, discussion_id, revision, input_transcript_sha256, prompt_version, model_ref, status, created_at
247
+ ) VALUES (?, ?, ?, ?, ?, ?, 'running', ?)`).run(id, input.discussionId, revision, input.inputTranscriptSha256, input.promptVersion, input.modelRef, now));
248
+ return getLatestDiscussionOrganization(input.discussionId);
249
+ }
250
+ function getLatestDiscussionOrganization(discussionId) {
251
+ const row = getSqliteDatabase().prepare("SELECT * FROM discussion_organizations WHERE discussion_id=? ORDER BY revision DESC LIMIT 1").get(discussionId);
252
+ return row ? organizationFromRow(row) : null;
253
+ }
254
+ function completeDiscussionOrganization(id, organization) {
255
+ const now = Date.now();
256
+ if (!runSqliteWriteTransaction((db) => db.prepare(`UPDATE discussion_organizations SET
257
+ organization_json=?, status='completed', error_message=NULL, completed_at=? WHERE id=? AND status='running'`).run(JSON.stringify(organization), now, id).changes)) return null;
258
+ return organizationFromRow(getSqliteDatabase().prepare("SELECT * FROM discussion_organizations WHERE id=?").get(id));
259
+ }
260
+ function failDiscussionOrganization(id, error) {
261
+ runSqliteWriteTransaction((db) => db.prepare(`UPDATE discussion_organizations SET
262
+ status='failed', error_message=?, completed_at=? WHERE id=? AND status='running'`).run(error.slice(0, 1e3), Date.now(), id));
239
263
  }
240
264
  function getDiscussionCaptureSettings() {
241
265
  const row = getSqliteDatabase().prepare(`SELECT consent_policy_version, consent_acknowledged_at
242
- FROM discussion_capture_settings WHERE workspace_id = 'default'`).get();
266
+ FROM discussion_capture_settings WHERE workspace_id='default'`).get();
243
267
  return {
244
268
  consentPolicyVersion: row.consent_policy_version,
245
- ...row.consent_acknowledged_at != null ? { consentAcknowledgedAt: row.consent_acknowledged_at } : {}
269
+ ...optional(row.consent_acknowledged_at != null, { consentAcknowledgedAt: row.consent_acknowledged_at })
246
270
  };
247
271
  }
248
272
  function acknowledgeDiscussionCaptureConsent(policyVersion) {
249
273
  const now = Date.now();
250
- runSqliteWriteTransaction((db) => db.prepare(`UPDATE discussion_capture_settings SET consent_acknowledged_at = ?, updated_at = ?
251
- WHERE workspace_id = 'default' AND consent_policy_version = ?`).run(now, now, policyVersion));
274
+ runSqliteWriteTransaction((db) => db.prepare(`UPDATE discussion_capture_settings
275
+ SET consent_acknowledged_at=?, updated_at=? WHERE workspace_id='default' AND consent_policy_version=?`).run(now, now, policyVersion));
252
276
  return getDiscussionCaptureSettings();
253
277
  }
254
278
  //#endregion
255
- export { acknowledgeDiscussionCaptureConsent, claimNextDiscussionCapture, claimNextDiscussionTranscriptSegment, completeDiscussionTranscriptSegment, createDiscussionCapture, createDiscussionTranscriptSegment, deleteDiscussionSegmentAudio, getDiscussionCapture, getDiscussionCaptureByClientRequestId, getDiscussionCaptureByNoteId, getDiscussionCaptureSettings, getDiscussionMetrics, getDiscussionTranscriptSegment, listDiscussionCaptures, listDiscussionTranscriptSegments, retryOrFailDiscussionTranscriptSegment, updateDiscussionCapture };
279
+ export { acknowledgeDiscussionCaptureConsent, claimNextDiscussionCapture, claimNextDiscussionTranscriptSegment, completeDiscussionOrganization, completeDiscussionTranscriptSegment, correctDiscussionTranscriptSegment, createDiscussionCapture, createDiscussionOrganization, createDiscussionTranscriptSegment, deleteDiscussionSegmentAudio, failDiscussionOrganization, getDiscussionCapture, getDiscussionCaptureByClientRequestId, getDiscussionCaptureByNoteId, getDiscussionCaptureSettings, getDiscussionMetrics, getDiscussionTranscriptSegment, getLatestDiscussionOrganization, listDiscussionCaptures, listDiscussionTranscriptSegments, releaseDiscussionWorkLease, retryOrFailDiscussionTranscriptSegment, updateDiscussionCapture };
@@ -0,0 +1,25 @@
1
+ import type { Config } from '../config/schema.js';
2
+ import type { NotesService } from '../notes/service.js';
3
+ import type { DiscussionCapture } from './types.js';
4
+ export interface DiscussionSealerDeps {
5
+ notes: NotesService;
6
+ getConfig: () => Config;
7
+ transcribeRecording?: (buffer: Buffer, capture: DiscussionCapture, signal?: AbortSignal) => Promise<{
8
+ text: string;
9
+ language?: string;
10
+ }>;
11
+ onUpdated?: (capture: DiscussionCapture) => void;
12
+ }
13
+ export declare class DiscussionSealer {
14
+ private readonly deps;
15
+ private readonly intervalMs;
16
+ private timer?;
17
+ private running;
18
+ constructor(deps: DiscussionSealerDeps, intervalMs?: number);
19
+ start(): void;
20
+ stop(): Promise<void>;
21
+ tick(now?: number): Promise<void>;
22
+ private sealWhenReady;
23
+ private transcribeFullRecording;
24
+ private fail;
25
+ }
@@ -0,0 +1,116 @@
1
+ import { createLogger } from "../utils/logger/index.js";
2
+ import { init_logger } from "../utils/logger.js";
3
+ import { transcribe } from "../voice/stt/transcribe-core.js";
4
+ import { isSTTAvailable } from "../voice/stt/availability.js";
5
+ import { mergeSttConfigFromAppConfig } from "../voice/stt/config.js";
6
+ import "../voice/stt/index.js";
7
+ import { getDiscussionCapture, listDiscussionCaptures, listDiscussionTranscriptSegments, updateDiscussionCapture } from "./repository.js";
8
+ import { assembleDiscussionTranscript } from "./transcript.js";
9
+ import { createHash } from "node:crypto";
10
+ import { readFile } from "node:fs/promises";
11
+ //#region src/discussions/sealer.ts
12
+ init_logger();
13
+ const log = createLogger("DiscussionSealer");
14
+ const UPLOAD_GRACE_MS = 2 * 6e4;
15
+ var DiscussionSealer = class {
16
+ timer;
17
+ running = false;
18
+ constructor(deps, intervalMs = 1e3) {
19
+ this.deps = deps;
20
+ this.intervalMs = intervalMs;
21
+ }
22
+ start() {
23
+ if (this.timer) return;
24
+ this.timer = setInterval(() => void this.tick(), this.intervalMs);
25
+ this.timer.unref();
26
+ this.tick();
27
+ }
28
+ async stop() {
29
+ if (this.timer) clearInterval(this.timer);
30
+ this.timer = void 0;
31
+ while (this.running) await new Promise((resolve) => setTimeout(resolve, 10));
32
+ }
33
+ async tick(now = Date.now()) {
34
+ if (this.running) return;
35
+ this.running = true;
36
+ try {
37
+ const capture = [...listDiscussionCaptures({
38
+ status: "sealing",
39
+ limit: 1
40
+ }).items, ...listDiscussionCaptures({
41
+ status: "stopping",
42
+ limit: 1
43
+ }).items][0];
44
+ if (!capture) return;
45
+ await this.sealWhenReady(capture, now);
46
+ } finally {
47
+ this.running = false;
48
+ }
49
+ }
50
+ async sealWhenReady(capture, now) {
51
+ const ageMs = now - (capture.recordingStoppedAt ?? now);
52
+ if (!capture.audioAttachmentId) {
53
+ if (ageMs >= UPLOAD_GRACE_MS) this.fail(capture, "audio_upload", "recording_missing", "Original recording was not uploaded");
54
+ return;
55
+ }
56
+ const segments = listDiscussionTranscriptSegments(capture.id);
57
+ const expected = capture.expectedLastSequence ?? -1;
58
+ const bySequence = new Map(segments.map((segment) => [segment.sequence, segment]));
59
+ const missing = Array.from({ length: expected + 1 }, (_, sequence) => sequence).filter((sequence) => !bySequence.has(sequence));
60
+ const pending = segments.some((segment) => segment.status === "uploaded" || segment.status === "transcribing");
61
+ if ((missing.length > 0 || pending) && ageMs < UPLOAD_GRACE_MS) return;
62
+ const sealing = capture.status === "sealing" ? capture : updateDiscussionCapture(capture.id, { status: "sealing" }, ["stopping"]);
63
+ if (!sealing) return;
64
+ try {
65
+ const confirmed = segments.filter((segment) => segment.status === "confirmed");
66
+ const result = expected >= 0 && missing.length === 0 && !pending && confirmed.length === expected + 1 ? { text: assembleDiscussionTranscript(confirmed) } : await this.transcribeFullRecording(sealing);
67
+ const text = result.text.trim();
68
+ if (!text) throw new Error("Discussion transcription produced no text");
69
+ const updated = updateDiscussionCapture(capture.id, {
70
+ status: "organizing",
71
+ canonicalTranscript: text,
72
+ canonicalTranscriptSha256: createHash("sha256").update(text).digest("hex"),
73
+ transcriptLanguage: result.language,
74
+ failureStage: void 0,
75
+ failureCode: void 0,
76
+ failureMessage: void 0
77
+ }, ["sealing"]);
78
+ if (!updated) throw new Error("Discussion changed while sealing transcript");
79
+ this.deps.onUpdated?.(updated);
80
+ } catch (error) {
81
+ const message = error instanceof Error ? error.message : String(error);
82
+ this.fail(sealing, "transcript_sealing", "transcript_sealing_failed", message);
83
+ }
84
+ }
85
+ async transcribeFullRecording(capture) {
86
+ const attachment = await this.deps.notes.getAttachmentPath(capture.noteId, capture.audioAttachmentId);
87
+ if (!attachment) throw new Error("Discussion audio file is missing");
88
+ const buffer = await readFile(attachment.filePath);
89
+ if (this.deps.transcribeRecording) return this.deps.transcribeRecording(buffer, capture);
90
+ const config = this.deps.getConfig();
91
+ const sttConfig = mergeSttConfigFromAppConfig(config.tools?.media?.audio, config.tools?.media);
92
+ if (!isSTTAvailable(sttConfig)) throw new Error("STT is not configured");
93
+ return transcribe(buffer, sttConfig, {
94
+ mime: attachment.mimeType || capture.mimeType,
95
+ fileName: attachment.fileName
96
+ });
97
+ }
98
+ fail(capture, stage, code, message) {
99
+ const current = getDiscussionCapture(capture.id);
100
+ if (!current || current.status !== "stopping" && current.status !== "sealing") return;
101
+ const updated = updateDiscussionCapture(capture.id, {
102
+ status: "needs_attention",
103
+ failureStage: stage,
104
+ failureCode: code,
105
+ failureMessage: message.slice(0, 1e3)
106
+ }, [current.status]);
107
+ if (updated) this.deps.onUpdated?.(updated);
108
+ log.warn({
109
+ discussionId: capture.id,
110
+ stage,
111
+ code
112
+ }, `Discussion sealing failed: ${message}`);
113
+ }
114
+ };
115
+ //#endregion
116
+ export { DiscussionSealer };
@@ -36,12 +36,13 @@ export declare class DiscussionService {
36
36
  endedAtMs: number;
37
37
  sha256: string;
38
38
  }): DiscussionTranscript;
39
+ correctSegment(id: string, sequence: number, displayText: string, expectedRevision: number): DiscussionTranscript;
39
40
  uploadRecording(id: string, file: {
40
41
  name: string;
41
42
  buffer: Buffer;
42
43
  mimeType: string;
43
44
  }, durationMs: number): Promise<DiscussionDetail | null>;
44
- finish(id: string, lastSequence: number, durationMs: number): Promise<DiscussionDetail | null>;
45
+ stop(id: string, lastSequence: number, durationMs: number): Promise<DiscussionDetail | null>;
45
46
  retry(id: string): Promise<DiscussionDetail | null>;
46
47
  cancel(id: string): Promise<DiscussionDetail | null>;
47
48
  deleteAudio(id: string): Promise<DiscussionDetail | null>;