@xopcai/xopc 0.0.178 → 0.0.180

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 (450) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{activity-store-BzGX__8I.js → activity-store-DFKtQDgE.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BzxntcaZ.js → agent-avatar-dicebear-CcTvB_4W.js} +1 -1
  5. package/dist/gateway/static/root/assets/agents-DgGj9bu6.js +2 -0
  6. package/dist/gateway/static/root/assets/{api-hi6f2Xtp.js → api-CUClAvuL.js} +1 -1
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-fTY1F7ac.js → app-management-settings-panel-Ib-cWKHM.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-BZ-IxQfB.js → appearance-settings-CRSN8WuA.js} +1 -1
  9. package/dist/gateway/static/root/assets/apps-page-B5xahuT-.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-ZSLLG8wB.js → archive-plugin-BBF9zspN.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-D4YktqIF.js → attachment-load-D3QQfA7w.js} +1 -1
  12. package/dist/gateway/static/root/assets/automations-page-BUYrvMmD.js +6 -0
  13. package/dist/gateway/static/root/assets/{binary-plugins-BIkPxfxj.js → binary-plugins-D78XOjJ3.js} +1 -1
  14. package/dist/gateway/static/root/assets/{block-editor-Q3v_YQom.js → block-editor-D_VVXlYX.js} +46 -46
  15. package/dist/gateway/static/root/assets/browser-settings-page-Cjw07q9h.js +8 -0
  16. package/dist/gateway/static/root/assets/{browser-workflow-inputs-M5lTEW1I.js → browser-workflow-inputs-_gu08MA4.js} +1 -1
  17. package/dist/gateway/static/root/assets/{browser-workflows-page-B3T1KYk4.js → browser-workflows-page-58DBMXgG.js} +2 -2
  18. package/dist/gateway/static/root/assets/capabilities-settings-panel-D_dfVxHY.js +7 -0
  19. package/dist/gateway/static/root/assets/{capability-presets-api-DE09c0VB.js → capability-presets-api-DhCn9rPv.js} +1 -1
  20. package/dist/gateway/static/root/assets/capability-presets-settings-panel-LWWIYUT7.js +1 -0
  21. package/dist/gateway/static/root/assets/{channel-recipient-api-CFR5FBfS.js → channel-recipient-api-DYtoNV5A.js} +1 -1
  22. package/dist/gateway/static/root/assets/channels-settings-Cyj5OunL.js +1 -0
  23. package/dist/gateway/static/root/assets/channels-status-swr-TEFnV0IG.js +1 -0
  24. package/dist/gateway/static/root/assets/{connector-logo-B1mD-3pM.js → connector-logo-CxIXnifA.js} +1 -1
  25. package/dist/gateway/static/root/assets/connectors-page-0TobCpBB.js +2 -0
  26. package/dist/gateway/static/root/assets/desktop-pet-CwVSLL6N.js +1 -0
  27. package/dist/gateway/static/root/assets/desktop-pet-settings-BOIp4q0Z.js +1 -0
  28. package/dist/gateway/static/root/assets/{directory-picker-path-field-BYQJ2XUS.js → directory-picker-path-field-C8_lsW6S.js} +1 -1
  29. package/dist/gateway/static/root/assets/{dreaming-settings-BXcb8fwx.js → dreaming-settings-Da9FeWQl.js} +3 -3
  30. package/dist/gateway/static/root/assets/{extension-debug-page-O1Xu1r4Q.js → extension-debug-page-CMNnSJP6.js} +1 -1
  31. package/dist/gateway/static/root/assets/{extension-page-C2Jraq8l.js → extension-page-t0pJqLvM.js} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-settings-page-DcXQDTpG.js → extension-settings-page-aiR-tKnW.js} +1 -1
  33. package/dist/gateway/static/root/assets/{gateway-config-api-DmPIZrvg.js → gateway-config-api-CkyQBD6r.js} +1 -1
  34. package/dist/gateway/static/root/assets/gateway-settings-BIZfAgfB.js +1 -0
  35. package/dist/gateway/static/root/assets/{gateway-startup-retry-BZEkOdPm.js → gateway-startup-retry-CSU7UvzG.js} +1 -1
  36. package/dist/gateway/static/root/assets/goals-settings-Dx9uTyWF.js +1 -0
  37. package/dist/gateway/static/root/assets/{heartbeat-settings-BtKu2NWT.js → heartbeat-settings-Cnr5ORXL.js} +1 -1
  38. package/dist/gateway/static/root/assets/{image-generation-api-05Gg8wsU.js → image-generation-api-BR6Kb77X.js} +1 -1
  39. package/dist/gateway/static/root/assets/index-B0Tdge_q.css +1 -0
  40. package/dist/gateway/static/root/assets/index-BA56bQ68.js +224 -0
  41. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CfmDR9Sc.js → keyboard-shortcuts-settings-D76uYKeQ.js} +1 -1
  42. package/dist/gateway/static/root/assets/local-app-workbench-page-DSUNtLHg.js +2 -0
  43. package/dist/gateway/static/root/assets/{local-apps-page-Df8BW1A_.js → local-apps-page-BsLnojTh.js} +1 -1
  44. package/dist/gateway/static/root/assets/{locale-store-CTwSy7yW.js → locale-store-BNC8HUCI.js} +1 -1
  45. package/dist/gateway/static/root/assets/logs-page-yI8kpQtO.js +7 -0
  46. package/dist/gateway/static/root/assets/{markdown-split-B3FvKbaP.js → markdown-split-D6smTQWD.js} +1 -1
  47. package/dist/gateway/static/root/assets/{media-plugins-DsjrvvB6.js → media-plugins-D1TmMF0A.js} +1 -1
  48. package/dist/gateway/static/root/assets/messages-H_iJjnEM.js +3 -0
  49. package/dist/gateway/static/root/assets/{notes-page-tuzIwy3c.js → notes-page-Vt-diFf0.js} +1 -1
  50. package/dist/gateway/static/root/assets/notes-workbench-BD297EZt.js +4 -0
  51. package/dist/gateway/static/root/assets/outcome-detail-page-C5i_ZR9a.js +1 -0
  52. package/dist/gateway/static/root/assets/{page-tabs-ke9s4nYi.js → page-tabs-BnSzIjH0.js} +1 -1
  53. package/dist/gateway/static/root/assets/{preview-open-alternatives-Cp1eI4S9.js → preview-open-alternatives-CF12Eqi4.js} +1 -1
  54. package/dist/gateway/static/root/assets/product-delivery-BVG-eWQO.js +1 -0
  55. package/dist/gateway/static/root/assets/{product-open-page-dXQCMAtH.js → product-open-page-Du0TE_CU.js} +1 -1
  56. package/dist/gateway/static/root/assets/project-detail-page-D1HGz7Dy.js +1 -0
  57. package/dist/gateway/static/root/assets/projects-page-CqP2TnW-.js +1 -0
  58. package/dist/gateway/static/root/assets/remote-access-hub-BXdVJLS3.js +1 -0
  59. package/dist/gateway/static/root/assets/{save-bar-controls-Bl30zjHc.js → save-bar-controls-B53UNtDM.js} +1 -1
  60. package/dist/gateway/static/root/assets/{schedule-field-DqhmXQKo.js → schedule-field-C3dIMN5q.js} +1 -1
  61. package/dist/gateway/static/root/assets/{schema-form-DkUCy6vf.js → schema-form-BKvpxqof.js} +1 -1
  62. package/dist/gateway/static/root/assets/{schemas-DgQq6Z5S.js → schemas-C6onAggk.js} +2 -2
  63. package/dist/gateway/static/root/assets/sessions-page-CPAwDdl5.js +1 -0
  64. package/dist/gateway/static/root/assets/settings-advanced-gate-C-jGsoft.js +1 -0
  65. package/dist/gateway/static/root/assets/{settings-form-section-C6ZbNpdy.js → settings-form-section-kt6GIS32.js} +1 -1
  66. package/dist/gateway/static/root/assets/{settings-loading-skeleton-Bk58_cr7.js → settings-loading-skeleton-85eUPcKz.js} +1 -1
  67. package/dist/gateway/static/root/assets/{settings-page-k8iE_NdX.js → settings-page-Di5x6Xrc.js} +1 -1
  68. package/dist/gateway/static/root/assets/{settings-page-layout-DgFSya2e.js → settings-page-layout-CkkCee_x.js} +1 -1
  69. package/dist/gateway/static/root/assets/{setup-status-panel-B_KDlyZA.js → setup-status-panel-uxEE6gAB.js} +1 -1
  70. package/dist/gateway/static/root/assets/{share-preview-page-CV7nL_J9.js → share-preview-page-BtLEstaI.js} +1 -1
  71. package/dist/gateway/static/root/assets/shares-settings-2mcsMWgn.js +1 -0
  72. package/dist/gateway/static/root/assets/skill-reload-api-ocDwsrEt.js +1 -0
  73. package/dist/gateway/static/root/assets/skills-page-9_jfsFU5.js +2 -0
  74. package/dist/gateway/static/root/assets/{skills-page.utils-kahBIHg0.js → skills-page.utils-C2SHvq8V.js} +1 -1
  75. package/dist/gateway/static/root/assets/{system-settings-panel-JV3-MG5F.js → system-settings-panel-CIJ66cUy.js} +1 -1
  76. package/dist/gateway/static/root/assets/{theme-store-DFLyzoLO.js → theme-store-ClDa_Bci.js} +1 -1
  77. package/dist/gateway/static/root/assets/time-picker-D0zAsHOo.js +1 -0
  78. package/dist/gateway/static/root/assets/{typed-models-lib-60Aqo-UJ.js → typed-models-lib-GsmwmB40.js} +1 -1
  79. package/dist/gateway/static/root/assets/{use-channel-catalog-CnTkHDnw.js → use-channel-catalog-BQz3K7xj.js} +1 -1
  80. package/dist/gateway/static/root/assets/user-context-page-Bn4BLg4W.js +1 -0
  81. package/dist/gateway/static/root/assets/{voice-api-key-field-CNa8qUgS.js → voice-api-key-field-Blaxsbb3.js} +1 -1
  82. package/dist/gateway/static/root/assets/work-copy-Cwyan9Sn.js +1 -0
  83. package/dist/gateway/static/root/assets/work-discovery-page-iJ9RBSpu.js +1 -0
  84. package/dist/gateway/static/root/assets/work-item-detail-page-CqTH7PQX.js +1 -0
  85. package/dist/gateway/static/root/assets/work-page-H3m99ccS.js +3 -0
  86. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-yV_x595t.js → workflow-run-setup-panel-CTG4RpRE.js} +2 -2
  87. package/dist/gateway/static/root/assets/workflows-page-BxZSKMfv.js +11 -0
  88. package/dist/gateway/static/root/index.html +9 -10
  89. package/dist/package.js +1 -1
  90. package/dist/packages/gateway-contract/src/outcomes.js +137 -0
  91. package/dist/packages/gateway-contract/src/product-delivery.js +1 -0
  92. package/dist/packages/gateway-contract/src/work-intake.js +85 -0
  93. package/dist/src/activity/service.d.ts +1 -0
  94. package/dist/src/activity/service.js +4 -1
  95. package/dist/src/agent/agent-manager.d.ts +4 -1
  96. package/dist/src/agent/agent-manager.js +21 -7
  97. package/dist/src/agent/bootstrap/filter-bootstrap-files.js +1 -1
  98. package/dist/src/agent/code-intelligence/binary.js +1 -1
  99. package/dist/src/agent/context/execution-scope.d.ts +1 -1
  100. package/dist/src/agent/context/execution-scope.js +6 -4
  101. package/dist/src/agent/embedded/model-runtime.js +1 -1
  102. package/dist/src/agent/embedded/run-for-session.d.ts +2 -0
  103. package/dist/src/agent/embedded/run-for-session.js +3 -1
  104. package/dist/src/agent/goals/post-turn.js +7 -6
  105. package/dist/src/agent/image/tool-model-config.js +1 -1
  106. package/dist/src/agent/inbound/turn-dispatcher.d.ts +6 -1
  107. package/dist/src/agent/inbound/turn-dispatcher.js +5 -2
  108. package/dist/src/agent/ipc/inbox.js +1 -1
  109. package/dist/src/agent/lifecycle/timeout-wrapper.d.ts +2 -0
  110. package/dist/src/agent/lifecycle/timeout-wrapper.js +39 -9
  111. package/dist/src/agent/mcp/bundle-mcp-materialize.js +2 -2
  112. package/dist/src/agent/mcp/bundle-mcp-runtime.js +6 -1
  113. package/dist/src/agent/mcp/bundle-mcp-types.d.ts +1 -1
  114. package/dist/src/agent/mcp/mcp-stdio-transport.js +1 -1
  115. package/dist/src/agent/mcp/mcp-transport-config.d.ts +2 -0
  116. package/dist/src/agent/mcp/mcp-transport-config.js +10 -3
  117. package/dist/src/agent/mcp/mcp-transport.d.ts +1 -0
  118. package/dist/src/agent/mcp/mcp-transport.js +5 -2
  119. package/dist/src/agent/memory/dreaming/config.js +1 -1
  120. package/dist/src/agent/memory/user-context-coordinator.d.ts +1 -0
  121. package/dist/src/agent/memory/user-context-coordinator.js +17 -1
  122. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.d.ts +1 -1
  123. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js +6 -2
  124. package/dist/src/agent/outcomes/{task-evaluation.d.ts → execution-evaluation.d.ts} +3 -3
  125. package/dist/src/agent/outcomes/{task-evaluation.js → execution-evaluation.js} +5 -5
  126. package/dist/src/agent/outcomes/execution-verifier.d.ts +29 -0
  127. package/dist/src/agent/outcomes/{task-verifier.js → execution-verifier.js} +4 -4
  128. package/dist/src/agent/service/direct-turn-helpers.d.ts +1 -0
  129. package/dist/src/agent/service/direct-turn-helpers.js +1 -0
  130. package/dist/src/agent/service/process-direct-one-shot.d.ts +3 -0
  131. package/dist/src/agent/service/process-direct-one-shot.js +4 -1
  132. package/dist/src/agent/service/process-direct-streaming.js +3 -1
  133. package/dist/src/agent/service.d.ts +1 -0
  134. package/dist/src/agent/service.js +5 -2
  135. package/dist/src/agent/session/session-inspector.js +1 -1
  136. package/dist/src/agent/skills/config.js +6 -0
  137. package/dist/src/agent/skills/filesystem-watcher.d.ts +4 -0
  138. package/dist/src/agent/skills/filesystem-watcher.js +16 -7
  139. package/dist/src/agent/skills/hub-lock.js +1 -1
  140. package/dist/src/agent/skills/index.d.ts +10 -7
  141. package/dist/src/agent/skills/index.js +56 -47
  142. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  143. package/dist/src/agent/skills/skill-manager.d.ts +5 -2
  144. package/dist/src/agent/skills/skill-manager.js +10 -5
  145. package/dist/src/agent/skills/skill-sources.d.ts +18 -0
  146. package/dist/src/agent/skills/skill-sources.js +143 -0
  147. package/dist/src/agent/skills/types.d.ts +25 -2
  148. package/dist/src/agent/tools/delegate-tool.js +2 -1
  149. package/dist/src/agent/tools/executor.d.ts +2 -0
  150. package/dist/src/agent/tools/executor.js +18 -11
  151. package/dist/src/agent/tools/factory.js +18 -1
  152. package/dist/src/agent/tools/goal-tool.js +5 -3
  153. package/dist/src/agent/tools/index.d.ts +1 -0
  154. package/dist/src/agent/tools/index.js +2 -1
  155. package/dist/src/agent/tools/managed-job-tool.d.ts +2 -0
  156. package/dist/src/agent/tools/managed-job-tool.js +160 -0
  157. package/dist/src/agent/tools/todo-tool.d.ts +5 -0
  158. package/dist/src/agent/tools/todo-tool.js +16 -4
  159. package/dist/src/agent/tools/update-plan-tool.d.ts +1 -0
  160. package/dist/src/agent/tools/update-plan-tool.js +6 -0
  161. package/dist/src/agent/workspace-runtime/registry.d.ts +3 -0
  162. package/dist/src/agent/workspace-runtime/registry.js +3 -1
  163. package/dist/src/agent-runtime/index.js +1 -1
  164. package/dist/src/agent-runtime/runtime-profile.js +1 -1
  165. package/dist/src/auth/credentials.d.ts +9 -1
  166. package/dist/src/auth/credentials.js +112 -56
  167. package/dist/src/auth/model-credential-store.js +7 -22
  168. package/dist/src/auth/oauth-provider-lock.d.ts +5 -0
  169. package/dist/src/auth/oauth-provider-lock.js +91 -0
  170. package/dist/src/auth/profiles/store.js +1 -1
  171. package/dist/src/auth/sync-provider-auth.js +2 -2
  172. package/dist/src/automations/domain/defaults.d.ts +8 -1
  173. package/dist/src/automations/domain/defaults.js +9 -2
  174. package/dist/src/automations/domain/index.js +2 -2
  175. package/dist/src/automations/domain/types.d.ts +33 -7
  176. package/dist/src/automations/domain/validation.d.ts +8 -0
  177. package/dist/src/automations/domain/validation.js +2 -0
  178. package/dist/src/automations/draft/automation-draft-validator.d.ts +2 -1
  179. package/dist/src/automations/index.js +2 -2
  180. package/dist/src/automations/service/action-executor.d.ts +2 -2
  181. package/dist/src/automations/service/action-executor.js +144 -34
  182. package/dist/src/automations/service/automation-service.d.ts +4 -0
  183. package/dist/src/automations/service/automation-service.js +197 -18
  184. package/dist/src/automations/storage/automation-run-repository.d.ts +1 -0
  185. package/dist/src/automations/storage/automation-run-repository.js +37 -7
  186. package/dist/src/automations/storage/index.js +2 -2
  187. package/dist/src/browser/providers/browser-ext-install.js +1 -1
  188. package/dist/src/browser/providers/cloakbrowser.js +2 -2
  189. package/dist/src/channels/attachments/voice-stt-webchat.d.ts +0 -3
  190. package/dist/src/channels/attachments/voice-stt-webchat.js +1 -24
  191. package/dist/src/chat-commands/builtins/goal.js +5 -4
  192. package/dist/src/cli/commands/agents.js +1 -1
  193. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  194. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  195. package/dist/src/cli/commands/goal.js +6 -5
  196. package/dist/src/cli/commands/models.js +1 -1
  197. package/dist/src/cli/commands/tunnel.js +3 -3
  198. package/dist/src/cli/utils/oauth-login.js +1 -7
  199. package/dist/src/config/agent-profile.js +1 -1
  200. package/dist/src/config/index.js +4 -4
  201. package/dist/src/config/loader.js +1 -1
  202. package/dist/src/config/models-json.js +1 -1
  203. package/dist/src/config/schema.d.ts +3 -0
  204. package/dist/src/config/schema.js +2 -1
  205. package/dist/src/connectors/learning-coordinator.js +7 -1
  206. package/dist/src/connectors/source-change-publisher.d.ts +17 -0
  207. package/dist/src/connectors/source-change-publisher.js +148 -0
  208. package/dist/src/discussions/analyzer.d.ts +35 -0
  209. package/dist/src/discussions/analyzer.js +127 -0
  210. package/dist/src/discussions/index.d.ts +7 -0
  211. package/dist/src/discussions/index.js +7 -0
  212. package/dist/src/discussions/live-worker.d.ts +33 -0
  213. package/dist/src/discussions/live-worker.js +148 -0
  214. package/dist/src/discussions/pipeline.d.ts +33 -0
  215. package/dist/src/discussions/pipeline.js +205 -0
  216. package/dist/src/discussions/project-inference.d.ts +13 -0
  217. package/dist/src/discussions/project-inference.js +19 -0
  218. package/dist/src/discussions/repository.d.ts +29 -0
  219. package/dist/src/discussions/repository.js +255 -0
  220. package/dist/src/discussions/service.d.ts +51 -0
  221. package/dist/src/discussions/service.js +335 -0
  222. package/dist/src/discussions/transcript.d.ts +3 -0
  223. package/dist/src/discussions/transcript.js +15 -0
  224. package/dist/src/discussions/types.d.ts +116 -0
  225. package/dist/src/discussions/types.js +10 -0
  226. package/dist/src/discussions/worker.d.ts +18 -0
  227. package/dist/src/discussions/worker.js +74 -0
  228. package/dist/src/extensions/activation-context.js +2 -1
  229. package/dist/src/extensions/lockfile.js +1 -1
  230. package/dist/src/extensions/sdk/testing.js +1 -1
  231. package/dist/src/gateway/agents-admin.js +3 -3
  232. package/dist/src/gateway/chat-stream/mapper.js +53 -3
  233. package/dist/src/gateway/chat-stream/protocol.d.ts +17 -1
  234. package/dist/src/gateway/file-path-classifier.js +1 -1
  235. package/dist/src/gateway/hono/app.js +8 -3
  236. package/dist/src/gateway/hono/lib/config-payload.js +2 -2
  237. package/dist/src/gateway/hono/middleware/auth.js +2 -2
  238. package/dist/src/gateway/hono/middleware/logger.js +1 -1
  239. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +1 -1
  240. package/dist/src/gateway/hono/oauth-async.js +1 -7
  241. package/dist/src/gateway/hono/oauth.js +1 -7
  242. package/dist/src/gateway/hono/routes/agents.js +1 -1
  243. package/dist/src/gateway/hono/routes/config-patch/misc.js +2 -2
  244. package/dist/src/gateway/hono/routes/connectors.js +79 -0
  245. package/dist/src/gateway/hono/routes/discussions.d.ts +3 -0
  246. package/dist/src/gateway/hono/routes/discussions.js +177 -0
  247. package/dist/src/gateway/hono/routes/execution-receipts.d.ts +3 -0
  248. package/dist/src/gateway/hono/routes/execution-receipts.js +163 -0
  249. package/dist/src/gateway/hono/routes/exposure.js +1 -1
  250. package/dist/src/gateway/hono/routes/goals.js +3 -288
  251. package/dist/src/gateway/hono/routes/home.d.ts +2 -102
  252. package/dist/src/gateway/hono/routes/home.js +8 -424
  253. package/dist/src/gateway/hono/routes/index.js +6 -2
  254. package/dist/src/gateway/hono/routes/memory.js +7 -7
  255. package/dist/src/gateway/hono/routes/models.js +1 -1
  256. package/dist/src/gateway/hono/routes/notes.js +30 -0
  257. package/dist/src/gateway/hono/routes/projects.js +8 -152
  258. package/dist/src/gateway/hono/routes/shares.js +1 -1
  259. package/dist/src/gateway/hono/routes/status.js +2 -2
  260. package/dist/src/gateway/hono/routes/tunnel.js +3 -3
  261. package/dist/src/gateway/hono/routes/voice.js +1 -1
  262. package/dist/src/gateway/hono/routes/work.d.ts +3 -0
  263. package/dist/src/gateway/hono/routes/work.js +207 -0
  264. package/dist/src/gateway/hono/routes/you.js +13 -15
  265. package/dist/src/gateway/index.js +2 -2
  266. package/dist/src/gateway/runtime-config.js +2 -2
  267. package/dist/src/gateway/security/audit.js +2 -2
  268. package/dist/src/gateway/security/index.js +1 -1
  269. package/dist/src/gateway/service/config-coordinator.js +2 -2
  270. package/dist/src/gateway/service/run-gateway-agent.js +46 -51
  271. package/dist/src/gateway/service.d.ts +8 -1
  272. package/dist/src/gateway/service.js +142 -15
  273. package/dist/src/goals/goal-queue-store.d.ts +1 -0
  274. package/dist/src/goals/goal-queue-store.js +5 -1
  275. package/dist/src/goals/goal-queue-types.d.ts +11 -1
  276. package/dist/src/goals/goal-runner.js +10 -6
  277. package/dist/src/goals/goal-service.d.ts +2 -15
  278. package/dist/src/goals/goal-service.js +9 -42
  279. package/dist/src/goals/goal-store.d.ts +1 -18
  280. package/dist/src/goals/goal-store.js +25 -231
  281. package/dist/src/goals/goal-workflow-judge.js +1 -1
  282. package/dist/src/goals/index.d.ts +0 -4
  283. package/dist/src/goals/index.js +1 -3
  284. package/dist/src/goals/types.d.ts +4 -66
  285. package/dist/src/notes/agent-context.js +1 -1
  286. package/dist/src/notes/service.d.ts +1 -0
  287. package/dist/src/notes/service.js +10 -1
  288. package/dist/src/notes/types.d.ts +1 -0
  289. package/dist/src/proactive/events/product-event-bridge.d.ts +7 -0
  290. package/dist/src/proactive/events/product-event-bridge.js +84 -0
  291. package/dist/src/proactive/execution/context.d.ts +27 -11
  292. package/dist/src/proactive/execution/context.js +259 -25
  293. package/dist/src/proactive/execution/repository.js +18 -5
  294. package/dist/src/proactive/execution/types.d.ts +7 -1
  295. package/dist/src/proactive/execution/worker.js +7 -6
  296. package/dist/src/proactive/inbox/repository.js +8 -2
  297. package/dist/src/proactive/index.d.ts +4 -2
  298. package/dist/src/proactive/index.js +5 -3
  299. package/dist/src/proactive/temporal/worker.d.ts +16 -0
  300. package/dist/src/proactive/temporal/worker.js +110 -0
  301. package/dist/src/projects/project-loop.js +3 -3
  302. package/dist/src/providers/auth-runtime/oauth.js +12 -0
  303. package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
  304. package/dist/src/providers/index.js +2 -2
  305. package/dist/src/providers/model-registry.js +1 -1
  306. package/dist/src/providers/register-runtime-providers.js +1 -1
  307. package/dist/src/share/share-zip.js +1 -1
  308. package/dist/src/share/site-proxy.js +1 -1
  309. package/dist/src/storage/sqlite/activity-repository.d.ts +1 -0
  310. package/dist/src/storage/sqlite/activity-repository.js +4 -1
  311. package/dist/src/storage/sqlite/connector-sync-policy-repository.d.ts +20 -0
  312. package/dist/src/storage/sqlite/connector-sync-policy-repository.js +50 -0
  313. package/dist/src/storage/sqlite/execution-receipt-repository.d.ts +146 -0
  314. package/dist/src/storage/sqlite/execution-receipt-repository.js +235 -0
  315. package/dist/src/storage/sqlite/index.d.ts +4 -2
  316. package/dist/src/storage/sqlite/index.js +6 -4
  317. package/dist/src/storage/sqlite/knowledge-repository.d.ts +3 -0
  318. package/dist/src/storage/sqlite/knowledge-repository.js +9 -1
  319. package/dist/src/storage/sqlite/memory-records-repository.js +1 -1
  320. package/dist/src/storage/sqlite/migrations/075_connector_sync_policies.sql +13 -0
  321. package/dist/src/storage/sqlite/migrations/076_meeting_preparation_scenario.sql +29 -0
  322. package/dist/src/storage/sqlite/migrations/077_proactive_insight_fingerprints.sql +4 -0
  323. package/dist/src/storage/sqlite/migrations/078_discussion_captures.sql +64 -0
  324. package/dist/src/storage/sqlite/migrations/079_discussion_follow_up_scenario.sql +29 -0
  325. package/dist/src/storage/sqlite/migrations/080_task_outcome_context.sql +15 -0
  326. package/dist/src/storage/sqlite/migrations/081_project_monitoring_policies.sql +10 -0
  327. package/dist/src/storage/sqlite/migrations/082_one_click_live_discussions.sql +100 -0
  328. package/dist/src/storage/sqlite/migrations/083_session_task_plans.sql +9 -0
  329. package/dist/src/storage/sqlite/migrations/084_work_intake_lifecycle.sql +26 -0
  330. package/dist/src/storage/sqlite/migrations/085_task_outcome_projection.sql +19 -0
  331. package/dist/src/storage/sqlite/migrations/086_outcome_aggregates.sql +168 -0
  332. package/dist/src/storage/sqlite/migrations/087_context_snapshots.sql +21 -0
  333. package/dist/src/storage/sqlite/migrations/088_automation_execution_deadlines.sql +5 -0
  334. package/dist/src/storage/sqlite/migrations/089_automation_run_leases.sql +8 -0
  335. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  336. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  337. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  338. package/dist/src/storage/sqlite/notes-repository.js +9 -0
  339. package/dist/src/storage/sqlite/schema.js +1 -1
  340. package/dist/src/storage/sqlite/schema.sql +89 -44
  341. package/dist/src/storage/sqlite/session-repository.js +1 -1
  342. package/dist/src/storage/sqlite/session-task-plan-repository.d.ts +20 -0
  343. package/dist/src/storage/sqlite/session-task-plan-repository.js +77 -0
  344. package/dist/src/tui/backends/embedded-backend.d.ts +2 -0
  345. package/dist/src/tui/backends/embedded-backend.js +12 -8
  346. package/dist/src/tui/tui-backend.d.ts +2 -0
  347. package/dist/src/tui/tui-oauth-login.js +1 -7
  348. package/dist/src/tui/tui-picker-overlay.js +1 -0
  349. package/dist/src/tui/tui-picker-services.d.ts +1 -0
  350. package/dist/src/tui/tui-skills-autocomplete.d.ts +6 -2
  351. package/dist/src/tui/tui-skills-autocomplete.js +10 -6
  352. package/dist/src/tui/tui-startup-resources.d.ts +3 -1
  353. package/dist/src/tui/tui-startup-resources.js +4 -3
  354. package/dist/src/tui/tui.js +4 -1
  355. package/dist/src/tunnel/frpc-binary.js +1 -1
  356. package/dist/src/tunnel/frpc-extract.js +1 -1
  357. package/dist/src/tunnel/index.js +2 -2
  358. package/dist/src/user-context/context-compiler.d.ts +31 -0
  359. package/dist/src/user-context/context-compiler.js +51 -0
  360. package/dist/src/voice/local/model-files.js +1 -1
  361. package/dist/src/voice/stt/config.d.ts +4 -0
  362. package/dist/src/voice/stt/config.js +26 -0
  363. package/dist/src/voice/stt/index.d.ts +1 -0
  364. package/dist/src/voice/stt/index.js +2 -1
  365. package/dist/src/voice/stt/list-providers.js +1 -1
  366. package/dist/src/work/attention-governor.d.ts +20 -0
  367. package/dist/src/work/attention-governor.js +46 -0
  368. package/dist/src/work/execution-context.d.ts +16 -0
  369. package/dist/src/work/execution-context.js +66 -0
  370. package/dist/src/work/home-query-service.d.ts +147 -0
  371. package/dist/src/work/home-query-service.js +389 -0
  372. package/dist/src/work/index.d.ts +14 -0
  373. package/dist/src/work/index.js +15 -0
  374. package/dist/src/work/outcome-contract-definition.d.ts +8 -0
  375. package/dist/src/work/outcome-contract-definition.js +15 -0
  376. package/dist/src/work/outcome-execution-service.d.ts +27 -0
  377. package/dist/src/work/outcome-execution-service.js +60 -0
  378. package/dist/src/work/outcome-projection-service.d.ts +7 -0
  379. package/dist/src/work/outcome-projection-service.js +51 -0
  380. package/dist/src/work/outcome-receipt-service.d.ts +13 -0
  381. package/dist/src/work/outcome-receipt-service.js +55 -0
  382. package/dist/src/work/outcome-repository.d.ts +50 -0
  383. package/dist/src/work/outcome-repository.js +112 -0
  384. package/dist/src/work/outcome-run-coordinator.d.ts +25 -0
  385. package/dist/src/work/outcome-run-coordinator.js +117 -0
  386. package/dist/src/work/project-monitoring-service.d.ts +21 -0
  387. package/dist/src/work/project-monitoring-service.js +76 -0
  388. package/dist/src/work/project-operating-view-service.d.ts +10 -0
  389. package/dist/src/work/project-operating-view-service.js +46 -0
  390. package/dist/src/work/work-intake-repository.d.ts +49 -0
  391. package/dist/src/work/work-intake-repository.js +97 -0
  392. package/dist/src/work/work-intake-service.d.ts +26 -0
  393. package/dist/src/work/work-intake-service.js +171 -0
  394. package/dist/src/work/work-value-metrics-service.d.ts +4 -0
  395. package/dist/src/work/work-value-metrics-service.js +88 -0
  396. package/dist/src/work-items/work-item-service.d.ts +0 -2
  397. package/dist/src/work-items/work-item-service.js +0 -28
  398. package/dist/src/workflows/service/workflow-run-service.js +2 -2
  399. package/dist/src/workflows/service/workflow-run-service.types.d.ts +3 -1
  400. package/dist/src/workflows/service/workflow-session-bridge.js +2 -2
  401. package/package.json +1 -1
  402. package/dist/gateway/static/root/assets/agents-DC9F12Kw.js +0 -2
  403. package/dist/gateway/static/root/assets/apps-page-5bKr05Fa.js +0 -1
  404. package/dist/gateway/static/root/assets/automation-suggestion-card-B7mxFRtf.js +0 -1
  405. package/dist/gateway/static/root/assets/automations-page-Dg6dmt5g.js +0 -6
  406. package/dist/gateway/static/root/assets/browser-settings-page-BHoo6Rpq.js +0 -8
  407. package/dist/gateway/static/root/assets/capabilities-settings-panel-BlsqN8Fu.js +0 -7
  408. package/dist/gateway/static/root/assets/capability-presets-settings-panel-DJeT8_B4.js +0 -1
  409. package/dist/gateway/static/root/assets/channels-settings-C4VVjYEm.js +0 -1
  410. package/dist/gateway/static/root/assets/channels-status-swr-vdf8kB16.js +0 -1
  411. package/dist/gateway/static/root/assets/circle-alert-BEjgurr2.js +0 -1
  412. package/dist/gateway/static/root/assets/connectors-page-DNcrDThX.js +0 -2
  413. package/dist/gateway/static/root/assets/desktop-pet-B1urphOZ.js +0 -1
  414. package/dist/gateway/static/root/assets/desktop-pet-settings-DTL6J3EP.js +0 -1
  415. package/dist/gateway/static/root/assets/gateway-settings-DmObBx9b.js +0 -1
  416. package/dist/gateway/static/root/assets/goal-create-dialog-BRhmmBe9.js +0 -1
  417. package/dist/gateway/static/root/assets/goal-detail-page-C1k7_s_O.js +0 -4
  418. package/dist/gateway/static/root/assets/goals-config-api-Fwu1wjEP.js +0 -1
  419. package/dist/gateway/static/root/assets/goals-page-hOu9uA3q.js +0 -2
  420. package/dist/gateway/static/root/assets/goals-settings-DY-JjvHz.js +0 -1
  421. package/dist/gateway/static/root/assets/index-C0CGebQ1.js +0 -212
  422. package/dist/gateway/static/root/assets/index-eqq25gvV.css +0 -1
  423. package/dist/gateway/static/root/assets/local-app-workbench-page-EjsNT7nJ.js +0 -2
  424. package/dist/gateway/static/root/assets/logs-page-Dswjlraa.js +0 -7
  425. package/dist/gateway/static/root/assets/messages-DP6tPKk-.js +0 -3
  426. package/dist/gateway/static/root/assets/notes-workbench-DSh3-hMY.js +0 -4
  427. package/dist/gateway/static/root/assets/product-delivery-BTRT9kCS.js +0 -1
  428. package/dist/gateway/static/root/assets/project-detail-page-D0QPRHR_.js +0 -1
  429. package/dist/gateway/static/root/assets/projects-page-CI5Vz62F.js +0 -1
  430. package/dist/gateway/static/root/assets/remote-access-hub-S1jpzBS5.js +0 -1
  431. package/dist/gateway/static/root/assets/sessions-page-CTm66k7h.js +0 -1
  432. package/dist/gateway/static/root/assets/settings-advanced-gate-CU52AUVD.js +0 -1
  433. package/dist/gateway/static/root/assets/shares-settings-DK6XK95e.js +0 -1
  434. package/dist/gateway/static/root/assets/skill-reload-api-Bvv_u4ii.js +0 -1
  435. package/dist/gateway/static/root/assets/skills-page-BGHvVbay.js +0 -2
  436. package/dist/gateway/static/root/assets/time-picker-XwpxdZFr.js +0 -1
  437. package/dist/gateway/static/root/assets/user-context-page-DBCMk-Vn.js +0 -1
  438. package/dist/gateway/static/root/assets/work-discovery-page-C1UIdsCl.js +0 -1
  439. package/dist/gateway/static/root/assets/work-item-detail-page-DEAQepB8.js +0 -1
  440. package/dist/gateway/static/root/assets/work-page-D5qYmCTq.js +0 -3
  441. package/dist/gateway/static/root/assets/workflows-page-yrK17ZZ5.js +0 -11
  442. package/dist/src/agent/outcomes/task-verifier.d.ts +0 -29
  443. package/dist/src/gateway/hono/routes/task-outcomes.d.ts +0 -3
  444. package/dist/src/gateway/hono/routes/task-outcomes.js +0 -109
  445. package/dist/src/goals/goal-contract-draft.d.ts +0 -15
  446. package/dist/src/goals/goal-contract-draft.js +0 -112
  447. package/dist/src/goals/goal-evidence-review.d.ts +0 -15
  448. package/dist/src/goals/goal-evidence-review.js +0 -89
  449. package/dist/src/storage/sqlite/task-outcome-repository.d.ts +0 -90
  450. package/dist/src/storage/sqlite/task-outcome-repository.js +0 -138
@@ -0,0 +1,35 @@
1
+ import { z } from 'zod';
2
+ import type { Config } from '../config/schema.js';
3
+ import type { DiscussionAnalysis } from './types.js';
4
+ declare const LiveEnrichmentSchema: z.ZodObject<{
5
+ title: z.ZodString;
6
+ projectCandidateId: z.ZodOptional<z.ZodString>;
7
+ projectConfidence: z.ZodOptional<z.ZodNumber>;
8
+ projectAlternativeConfidence: z.ZodOptional<z.ZodNumber>;
9
+ }, z.core.$strip>;
10
+ export declare function normalizeDiscussionAnalysis(value: unknown): DiscussionAnalysis;
11
+ export declare function analyzeDiscussion(input: {
12
+ config: Config;
13
+ transcript: string;
14
+ languageHint?: string;
15
+ projects?: Array<{
16
+ id: string;
17
+ name: string;
18
+ }>;
19
+ signal?: AbortSignal;
20
+ }): Promise<{
21
+ analysis: DiscussionAnalysis;
22
+ modelRef: string;
23
+ }>;
24
+ export declare function enrichLiveDiscussion(input: {
25
+ config: Config;
26
+ transcript: string;
27
+ projects: Array<{
28
+ id: string;
29
+ name: string;
30
+ }>;
31
+ signal?: AbortSignal;
32
+ }): Promise<z.infer<typeof LiveEnrichmentSchema> & {
33
+ modelRef: string;
34
+ }>;
35
+ export {};
@@ -0,0 +1,127 @@
1
+ import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
2
+ import { init_providers, resolveModel } from "../providers/index.js";
3
+ import { completeWithResolvedCredentials } from "../providers/model-call.js";
4
+ import { createHash } from "node:crypto";
5
+ import { z } from "zod";
6
+ //#region src/discussions/analyzer.ts
7
+ init_schema();
8
+ init_providers();
9
+ const MAX_TRANSCRIPT_CHARS = 12e4;
10
+ const AnalysisSchema = z.object({
11
+ title: z.string().trim().min(1).max(200),
12
+ summary: z.string().trim().min(1).max(4e3),
13
+ keyPoints: z.array(z.string().trim().min(1).max(1e3)).max(12).default([]),
14
+ decisions: z.array(z.string().trim().min(1).max(1e3)).max(12).default([]),
15
+ actionItems: z.array(z.object({
16
+ id: z.string().trim().min(1).max(100).optional(),
17
+ title: z.string().trim().min(1).max(500),
18
+ owner: z.string().trim().min(1).max(200).optional(),
19
+ dueDate: z.string().trim().min(1).max(100).optional()
20
+ })).max(20).default([]),
21
+ risks: z.array(z.string().trim().min(1).max(1e3)).max(12).default([]),
22
+ openQuestions: z.array(z.string().trim().min(1).max(1e3)).max(12).default([]),
23
+ projectCandidateId: z.string().trim().min(1).max(200).optional(),
24
+ projectConfidence: z.number().min(0).max(1).optional(),
25
+ projectAlternativeConfidence: z.number().min(0).max(1).optional()
26
+ });
27
+ const LiveEnrichmentSchema = z.object({
28
+ title: z.string().trim().min(1).max(200),
29
+ projectCandidateId: z.string().trim().min(1).max(200).optional(),
30
+ projectConfidence: z.number().min(0).max(1).optional(),
31
+ projectAlternativeConfidence: z.number().min(0).max(1).optional()
32
+ });
33
+ function extractText(content) {
34
+ if (typeof content === "string") return content;
35
+ if (!Array.isArray(content)) return "";
36
+ return content.map((part) => {
37
+ if (!part || typeof part !== "object") return "";
38
+ const value = part;
39
+ return value.type === "text" && typeof value.text === "string" ? value.text : "";
40
+ }).join("");
41
+ }
42
+ function parseJsonObject(raw) {
43
+ const stripped = raw.trim().replace(/^```json\s*/i, "").replace(/```$/i, "").trim();
44
+ try {
45
+ return JSON.parse(stripped);
46
+ } catch {
47
+ const start = stripped.indexOf("{");
48
+ const end = stripped.lastIndexOf("}");
49
+ if (start < 0 || end <= start) throw new Error("Discussion analysis did not return valid JSON");
50
+ return JSON.parse(stripped.slice(start, end + 1));
51
+ }
52
+ }
53
+ function actionId(title, index) {
54
+ return createHash("sha256").update(`${index}:${title}`).digest("hex").slice(0, 16);
55
+ }
56
+ function normalizeDiscussionAnalysis(value) {
57
+ const parsed = AnalysisSchema.safeParse(value);
58
+ if (!parsed.success) throw new Error(`Invalid discussion analysis: ${parsed.error.issues[0]?.message ?? "schema mismatch"}`);
59
+ return {
60
+ ...parsed.data,
61
+ actionItems: parsed.data.actionItems.map((item, index) => ({
62
+ id: item.id ?? actionId(item.title, index),
63
+ title: item.title,
64
+ ...item.owner ? { owner: item.owner } : {},
65
+ ...item.dueDate ? { dueDate: item.dueDate } : {}
66
+ }))
67
+ };
68
+ }
69
+ async function analyzeDiscussion(input) {
70
+ const modelRef = getAgentDefaultModelRef(input.config);
71
+ if (!modelRef) throw new Error("No default model configured for discussion analysis");
72
+ const transcript = input.transcript.trim().slice(0, MAX_TRANSCRIPT_CHARS);
73
+ if (!transcript) throw new Error("Discussion transcript is empty");
74
+ const message = {
75
+ role: "user",
76
+ content: [
77
+ "Analyze the supplied workplace discussion transcript.",
78
+ "Use only facts explicitly present in the transcript. Do not invent owners, dates, decisions, or commitments.",
79
+ "Return exactly one JSON object with: title, summary, keyPoints, decisions, actionItems, risks, openQuestions, and optional projectCandidateId, projectConfidence, and projectAlternativeConfidence.",
80
+ "title is a short concrete note title derived from the discussion.",
81
+ "actionItems contains title and optional owner and dueDate. Omit owner or dueDate when not explicit.",
82
+ "Keep unresolved possibilities in openQuestions, not decisions.",
83
+ input.projects?.length ? `Choose projectCandidateId only from this catalog when the discussion clearly belongs to it; otherwise omit it. projectConfidence is the top probability and projectAlternativeConfidence is the runner-up probability: ${JSON.stringify(input.projects.slice(0, 100))}` : "Omit projectCandidateId and projectConfidence.",
84
+ `Use ${input.languageHint === "en" ? "English" : input.languageHint === "zh" ? "Simplified Chinese" : "the main language of the transcript"} for every user-facing string.`,
85
+ "",
86
+ transcript
87
+ ].join("\n"),
88
+ timestamp: Date.now()
89
+ };
90
+ return {
91
+ modelRef,
92
+ analysis: normalizeDiscussionAnalysis(parseJsonObject(extractText((await completeWithResolvedCredentials(resolveModel(modelRef), { messages: [message] }, {
93
+ maxTokens: 3e3,
94
+ temperature: .1,
95
+ signal: input.signal
96
+ })).content)))
97
+ };
98
+ }
99
+ async function enrichLiveDiscussion(input) {
100
+ const modelRef = getAgentDefaultModelRef(input.config);
101
+ if (!modelRef) throw new Error("No default model configured for discussion enrichment");
102
+ const transcript = input.transcript.trim().slice(0, 12e3);
103
+ if (!transcript) throw new Error("Discussion transcript is empty");
104
+ const message = {
105
+ role: "user",
106
+ content: [
107
+ "Create a short concrete note title for this partial workplace discussion transcript.",
108
+ "Return exactly one JSON object with title and optional projectCandidateId, projectConfidence, and projectAlternativeConfidence.",
109
+ "Choose a project only when the transcript clearly belongs to it. Never invent a project id.",
110
+ `Project catalog: ${JSON.stringify(input.projects.slice(0, 100))}`,
111
+ "",
112
+ transcript
113
+ ].join("\n"),
114
+ timestamp: Date.now()
115
+ };
116
+ const response = await completeWithResolvedCredentials(resolveModel(modelRef), { messages: [message] }, {
117
+ maxTokens: 400,
118
+ temperature: .1,
119
+ signal: input.signal
120
+ });
121
+ return {
122
+ modelRef,
123
+ ...LiveEnrichmentSchema.parse(parseJsonObject(extractText(response.content)))
124
+ };
125
+ }
126
+ //#endregion
127
+ export { analyzeDiscussion, enrichLiveDiscussion, normalizeDiscussionAnalysis };
@@ -0,0 +1,7 @@
1
+ export { DISCUSSION_AUDIO_MAX_BYTES, DISCUSSION_MAX_DURATION_MS, DiscussionService, DiscussionServiceError, } from './service.js';
2
+ export { analyzeDiscussion } from './analyzer.js';
3
+ export { DiscussionPipeline, mergeDiscussionAnalysisIntoMarkdown } from './pipeline.js';
4
+ export { DiscussionLiveWorker } from './live-worker.js';
5
+ export { DiscussionWorker } from './worker.js';
6
+ export { DISCUSSION_STATUSES } from './types.js';
7
+ export type * from './types.js';
@@ -0,0 +1,7 @@
1
+ import { analyzeDiscussion } from "./analyzer.js";
2
+ import { DISCUSSION_AUDIO_MAX_BYTES, DISCUSSION_MAX_DURATION_MS, DiscussionService, DiscussionServiceError } from "./service.js";
3
+ import { DiscussionPipeline, mergeDiscussionAnalysisIntoMarkdown } from "./pipeline.js";
4
+ import { DiscussionLiveWorker } from "./live-worker.js";
5
+ import { DiscussionWorker } from "./worker.js";
6
+ import { DISCUSSION_STATUSES } from "./types.js";
7
+ export { DISCUSSION_AUDIO_MAX_BYTES, DISCUSSION_MAX_DURATION_MS, DISCUSSION_STATUSES, DiscussionLiveWorker, DiscussionPipeline, DiscussionService, DiscussionServiceError, DiscussionWorker, analyzeDiscussion, mergeDiscussionAnalysisIntoMarkdown };
@@ -0,0 +1,33 @@
1
+ import type { Config } from '../config/schema.js';
2
+ import type { NotesService } from '../notes/service.js';
3
+ import type { ProjectService } from '../projects/project-service.js';
4
+ import { enrichLiveDiscussion } from './analyzer.js';
5
+ import type { DiscussionCapture } from './types.js';
6
+ export interface DiscussionLiveWorkerDeps {
7
+ notes: NotesService;
8
+ projects: ProjectService;
9
+ getConfig: () => Config;
10
+ transcribeSegment?: (buffer: Buffer, signal?: AbortSignal) => Promise<{
11
+ text: string;
12
+ provider: string;
13
+ }>;
14
+ enrichTranscript?: typeof enrichLiveDiscussion;
15
+ onTranscriptUpdated?: (discussionId: string, sequence: number) => void;
16
+ onDiscussionUpdated?: (capture: DiscussionCapture) => void;
17
+ }
18
+ export declare class DiscussionLiveWorker {
19
+ private readonly deps;
20
+ private readonly intervalMs;
21
+ private readonly owner;
22
+ private readonly objectLinks;
23
+ private timer?;
24
+ private running;
25
+ private stoppedWaiters;
26
+ constructor(deps: DiscussionLiveWorkerDeps, intervalMs?: number);
27
+ start(): void;
28
+ stop(): Promise<void>;
29
+ tick(): Promise<void>;
30
+ private transcribeSegment;
31
+ private enrichOnce;
32
+ private linkProject;
33
+ }
@@ -0,0 +1,148 @@
1
+ import { createLogger } from "../utils/logger/index.js";
2
+ import { init_logger } from "../utils/logger.js";
3
+ import { ObjectLinkService } from "../activity/service.js";
4
+ import { transcribe } from "../voice/stt/transcribe-core.js";
5
+ import { isSTTAvailable } from "../voice/stt/availability.js";
6
+ import { mergeSttConfigFromAppConfig } from "../voice/stt/config.js";
7
+ import "../voice/stt/index.js";
8
+ import { enrichLiveDiscussion } from "./analyzer.js";
9
+ import { claimNextDiscussionTranscriptSegment, completeDiscussionTranscriptSegment, getDiscussionCapture, listDiscussionTranscriptSegments, retryOrFailDiscussionTranscriptSegment, updateDiscussionCapture } from "./repository.js";
10
+ import { assembleDiscussionTranscript } from "./transcript.js";
11
+ import { acceptRankedProject, findExactProjectMention } from "./project-inference.js";
12
+ import { randomUUID } from "node:crypto";
13
+ //#region src/discussions/live-worker.ts
14
+ init_logger();
15
+ const log = createLogger("DiscussionLiveWorker");
16
+ const MAX_ATTEMPTS = 3;
17
+ const MIN_ENRICHMENT_CHARS = 80;
18
+ var DiscussionLiveWorker = class {
19
+ owner = randomUUID();
20
+ objectLinks = new ObjectLinkService();
21
+ timer;
22
+ running = false;
23
+ stoppedWaiters = [];
24
+ constructor(deps, intervalMs = 1e3) {
25
+ this.deps = deps;
26
+ this.intervalMs = intervalMs;
27
+ }
28
+ start() {
29
+ if (this.timer) return;
30
+ this.timer = setInterval(() => void this.tick(), this.intervalMs);
31
+ this.timer.unref();
32
+ this.tick();
33
+ }
34
+ async stop() {
35
+ if (this.timer) clearInterval(this.timer);
36
+ this.timer = void 0;
37
+ if (!this.running) return;
38
+ await new Promise((resolve) => this.stoppedWaiters.push(resolve));
39
+ }
40
+ async tick() {
41
+ if (this.running) return;
42
+ this.running = true;
43
+ try {
44
+ const segment = claimNextDiscussionTranscriptSegment(this.owner);
45
+ if (!segment) return;
46
+ try {
47
+ const result = this.deps.transcribeSegment ? await this.deps.transcribeSegment(segment.audioBuffer) : await this.transcribeSegment(segment.audioBuffer);
48
+ if (!completeDiscussionTranscriptSegment(segment.discussionId, segment.sequence, this.owner, result.text.trim(), result.provider)) return;
49
+ this.deps.onTranscriptUpdated?.(segment.discussionId, segment.sequence);
50
+ await this.enrichOnce(segment.discussionId).catch((error) => {
51
+ log.warn({
52
+ err: error,
53
+ discussionId: segment.discussionId
54
+ }, "Live discussion enrichment failed");
55
+ });
56
+ } catch (error) {
57
+ const exhausted = segment.attemptCount >= MAX_ATTEMPTS;
58
+ const message = error instanceof Error ? error.message : String(error);
59
+ retryOrFailDiscussionTranscriptSegment(segment.discussionId, segment.sequence, this.owner, message, exhausted);
60
+ this.deps.onTranscriptUpdated?.(segment.discussionId, segment.sequence);
61
+ log.warn({
62
+ err: error,
63
+ discussionId: segment.discussionId,
64
+ sequence: segment.sequence,
65
+ exhausted
66
+ }, `Live discussion transcription failed: ${message}`);
67
+ }
68
+ } finally {
69
+ this.running = false;
70
+ const waiters = this.stoppedWaiters.splice(0);
71
+ for (const resolve of waiters) resolve();
72
+ }
73
+ }
74
+ async transcribeSegment(buffer, signal) {
75
+ const config = this.deps.getConfig();
76
+ const sttConfig = mergeSttConfigFromAppConfig(config.tools?.media?.audio, config.tools?.media);
77
+ if (!isSTTAvailable(sttConfig)) throw new Error("STT is not configured");
78
+ return transcribe(buffer, sttConfig, {
79
+ mime: "audio/wav",
80
+ fileName: "discussion-segment.wav",
81
+ signal
82
+ });
83
+ }
84
+ async enrichOnce(discussionId) {
85
+ const capture = getDiscussionCapture(discussionId);
86
+ if (!capture || capture.generatedTitle || capture.status === "cancelled" || capture.status === "completed") return;
87
+ const transcript = assembleDiscussionTranscript(listDiscussionTranscriptSegments(discussionId));
88
+ if (transcript.length < MIN_ENRICHMENT_CHARS) return;
89
+ const projects = this.deps.projects.list({
90
+ status: "active",
91
+ limit: 100
92
+ }).items;
93
+ const enrichment = await (this.deps.enrichTranscript ?? enrichLiveDiscussion)({
94
+ config: this.deps.getConfig(),
95
+ transcript,
96
+ projects: projects.map(({ id, name }) => ({
97
+ id,
98
+ name
99
+ }))
100
+ });
101
+ const exact = capture.projectId ? void 0 : findExactProjectMention(transcript, projects);
102
+ const ranked = capture.projectId ? void 0 : acceptRankedProject(enrichment, projects);
103
+ const inferred = exact ? {
104
+ id: exact.id,
105
+ score: 1,
106
+ source: "exact_name"
107
+ } : ranked ? {
108
+ ...ranked,
109
+ source: "model"
110
+ } : void 0;
111
+ const note = await this.deps.notes.getNote(capture.noteId);
112
+ if (!note) throw new Error("Discussion note is missing");
113
+ if (note.title !== enrichment.title) {
114
+ if (!await this.deps.notes.updateNote(capture.noteId, { title: enrichment.title }, "ai_edit")) throw new Error("Discussion note disappeared while applying the live title");
115
+ }
116
+ const updated = updateDiscussionCapture(discussionId, {
117
+ generatedTitle: enrichment.title,
118
+ ...inferred ? {
119
+ projectId: inferred.id,
120
+ projectInferenceScore: inferred.score,
121
+ projectInferenceSource: inferred.source
122
+ } : {}
123
+ }, [capture.status]);
124
+ if (!updated) return;
125
+ if (inferred) this.linkProject(updated, inferred.id);
126
+ this.deps.onDiscussionUpdated?.(updated);
127
+ }
128
+ linkProject(capture, projectId) {
129
+ const project = this.deps.projects.get(projectId);
130
+ if (!project) return;
131
+ this.objectLinks.create({
132
+ id: `discussion:${capture.id}:project`,
133
+ from: {
134
+ kind: "note",
135
+ id: capture.noteId
136
+ },
137
+ to: {
138
+ kind: "project",
139
+ id: project.id,
140
+ title: project.name
141
+ },
142
+ relation: "belongs_to",
143
+ source: "agent"
144
+ });
145
+ }
146
+ };
147
+ //#endregion
148
+ export { DiscussionLiveWorker };
@@ -0,0 +1,33 @@
1
+ import type { Config } from '../config/schema.js';
2
+ import type { NotesService } from '../notes/service.js';
3
+ import type { ProjectService } from '../projects/project-service.js';
4
+ import type { DiscussionAnalysis, DiscussionCapture } from './types.js';
5
+ export interface DiscussionTranscriptionResult {
6
+ text: string;
7
+ provider: string;
8
+ language?: string;
9
+ }
10
+ export interface DiscussionPipelineDeps {
11
+ notes: NotesService;
12
+ projects: ProjectService;
13
+ getConfig: () => Config;
14
+ transcribeAudio?: (buffer: Buffer, capture: DiscussionCapture, signal?: AbortSignal) => Promise<DiscussionTranscriptionResult>;
15
+ analyzeTranscript?: (transcript: string, capture: DiscussionCapture, signal?: AbortSignal) => Promise<{
16
+ analysis: DiscussionAnalysis;
17
+ modelRef: string;
18
+ }>;
19
+ onUpdated?: (capture: DiscussionCapture) => void;
20
+ onCompleted?: (capture: DiscussionCapture, analysis: DiscussionAnalysis) => void;
21
+ }
22
+ export declare function mergeDiscussionAnalysisIntoMarkdown(markdown: string, transcript: string, analysis: DiscussionAnalysis, audioRef?: string): string;
23
+ export declare class DiscussionPipeline {
24
+ private readonly deps;
25
+ private readonly objectLinks;
26
+ constructor(deps: DiscussionPipelineDeps);
27
+ process(capture: DiscussionCapture, owner: string, signal?: AbortSignal): Promise<DiscussionCapture>;
28
+ private transcribe;
29
+ private analyze;
30
+ private writeNote;
31
+ private linkProject;
32
+ private defaultTranscribe;
33
+ }
@@ -0,0 +1,205 @@
1
+ import { buildNoteAttachmentRef } from "../notes/attachment-ref.js";
2
+ import { ObjectLinkService } from "../activity/service.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 { analyzeDiscussion } from "./analyzer.js";
8
+ import { deleteDiscussionSegmentAudio, updateDiscussionCapture } from "./repository.js";
9
+ import { acceptRankedProject, findExactProjectMention } from "./project-inference.js";
10
+ import { createHash } from "node:crypto";
11
+ import { readFile } from "node:fs/promises";
12
+ //#region src/discussions/pipeline.ts
13
+ const MANAGED_START = "<!-- xopc:discussion-analysis:start -->";
14
+ const MANAGED_END = "<!-- xopc:discussion-analysis:end -->";
15
+ function list(values) {
16
+ return values.length > 0 ? values.map((value) => `- ${value}`).join("\n") : "- None identified";
17
+ }
18
+ function renderManagedSection(transcript, analysis) {
19
+ const actions = analysis.actionItems.length > 0 ? analysis.actionItems.map((item) => {
20
+ const metadata = [item.owner ? `Owner: ${item.owner}` : "", item.dueDate ? `Due: ${item.dueDate}` : ""].filter(Boolean).join(" · ");
21
+ return `- [ ] ${item.title}${metadata ? ` — ${metadata}` : ""}`;
22
+ }).join("\n") : "- None identified";
23
+ return [
24
+ MANAGED_START,
25
+ "## Summary",
26
+ analysis.summary,
27
+ "",
28
+ "## Key points",
29
+ list(analysis.keyPoints),
30
+ "",
31
+ "## Decisions",
32
+ list(analysis.decisions),
33
+ "",
34
+ "## Action items",
35
+ actions,
36
+ "",
37
+ "## Risks",
38
+ list(analysis.risks),
39
+ "",
40
+ "## Open questions",
41
+ list(analysis.openQuestions),
42
+ "",
43
+ "## Transcript",
44
+ transcript.trim(),
45
+ MANAGED_END
46
+ ].join("\n");
47
+ }
48
+ function mergeDiscussionAnalysisIntoMarkdown(markdown, transcript, analysis, audioRef) {
49
+ const managed = renderManagedSection(transcript, analysis);
50
+ const withoutPlaceholder = markdown.replace(/^> Recording in progress\. Live transcript will appear here\.\s*$/gm, "").replace(/^> Finalizing recording\.\.\.\s*$/gm, "").replace(/\n{3,}/g, "\n\n").trim();
51
+ const start = withoutPlaceholder.indexOf(MANAGED_START);
52
+ const end = withoutPlaceholder.indexOf(MANAGED_END);
53
+ const base = start >= 0 && end >= start ? `${withoutPlaceholder.slice(0, start).trimEnd()}\n\n${managed}${withoutPlaceholder.slice(end + 37)}`.trim() : `${withoutPlaceholder}\n\n${managed}`.trim();
54
+ return audioRef && !base.includes(`](${audioRef})`) ? `${base}\n\n[Discussion audio](${audioRef})` : base;
55
+ }
56
+ var DiscussionPipeline = class {
57
+ objectLinks = new ObjectLinkService();
58
+ constructor(deps) {
59
+ this.deps = deps;
60
+ }
61
+ async process(capture, owner, signal) {
62
+ let current = capture;
63
+ if (!current.transcriptRaw) current = await this.transcribe(current, owner, signal);
64
+ if (!current.analysis) current = await this.analyze(current, owner, signal);
65
+ return this.writeNote(current);
66
+ }
67
+ async transcribe(capture, owner, signal) {
68
+ if (!capture.audioAttachmentId) throw new Error("Discussion audio attachment is missing");
69
+ const attachment = await this.deps.notes.getAttachmentPath(capture.noteId, capture.audioAttachmentId);
70
+ if (!attachment) throw new Error("Discussion audio file is missing");
71
+ const buffer = await readFile(attachment.filePath);
72
+ const result = this.deps.transcribeAudio ? await this.deps.transcribeAudio(buffer, capture, signal) : await this.defaultTranscribe(buffer, capture, attachment, signal);
73
+ const transcript = result.text.trim();
74
+ if (!transcript) throw new Error("Discussion transcription produced no text");
75
+ const updated = updateDiscussionCapture(capture.id, {
76
+ processingStage: "analysis",
77
+ transcriptRaw: transcript,
78
+ transcriptSha256: createHash("sha256").update(transcript).digest("hex"),
79
+ transcriptLanguage: result.language,
80
+ sttProvider: result.provider,
81
+ lastErrorCode: void 0,
82
+ lastErrorMessage: void 0,
83
+ leaseOwner: owner,
84
+ leaseExpiresAt: Date.now() + 5 * 6e4
85
+ }, ["finalizing"]);
86
+ if (!updated) throw new Error("Discussion changed while transcribing");
87
+ this.deps.onUpdated?.(updated);
88
+ return updated;
89
+ }
90
+ async analyze(capture, owner, signal) {
91
+ if (!capture.transcriptRaw) throw new Error("Discussion transcript is missing");
92
+ const projects = this.deps.projects.list({
93
+ status: "active",
94
+ limit: 100
95
+ }).items;
96
+ const result = this.deps.analyzeTranscript ? await this.deps.analyzeTranscript(capture.transcriptRaw, capture, signal) : await analyzeDiscussion({
97
+ config: this.deps.getConfig(),
98
+ transcript: capture.transcriptRaw,
99
+ projects: projects.map(({ id, name }) => ({
100
+ id,
101
+ name
102
+ })),
103
+ signal
104
+ });
105
+ const analysis = result.analysis;
106
+ let inferredProject;
107
+ if (!capture.projectId) {
108
+ const exact = findExactProjectMention(capture.transcriptRaw, projects);
109
+ const ranked = acceptRankedProject(analysis, projects);
110
+ if (exact) inferredProject = {
111
+ id: exact.id,
112
+ score: 1,
113
+ source: "exact_name"
114
+ };
115
+ else if (ranked) inferredProject = {
116
+ ...ranked,
117
+ source: "model"
118
+ };
119
+ }
120
+ const updated = updateDiscussionCapture(capture.id, {
121
+ processingStage: "note_write",
122
+ analysis,
123
+ analysisInputHash: capture.transcriptSha256,
124
+ analyzerModelRef: result.modelRef,
125
+ generatedTitle: analysis.title,
126
+ ...inferredProject ? {
127
+ projectId: inferredProject.id,
128
+ projectInferenceScore: inferredProject.score,
129
+ projectInferenceSource: inferredProject.source
130
+ } : {},
131
+ leaseOwner: owner,
132
+ leaseExpiresAt: Date.now() + 5 * 6e4
133
+ }, ["finalizing"]);
134
+ if (!updated) throw new Error("Discussion changed while analyzing");
135
+ if (inferredProject) this.linkProject(updated, inferredProject.id);
136
+ this.deps.onUpdated?.(updated);
137
+ return updated;
138
+ }
139
+ async writeNote(capture) {
140
+ if (!capture.transcriptRaw || !capture.analysis || !capture.audioAttachmentId) throw new Error("Discussion finalization data is incomplete");
141
+ const note = await this.deps.notes.getNote(capture.noteId);
142
+ if (!note) throw new Error("Discussion note is missing");
143
+ const title = capture.analysis.title.trim().slice(0, 200);
144
+ const audioRef = buildNoteAttachmentRef(capture.noteId, capture.audioAttachmentId);
145
+ const markdown = mergeDiscussionAnalysisIntoMarkdown(note.markdown, capture.transcriptRaw, capture.analysis, audioRef);
146
+ const attachments = (note.attachments ?? []).map((attachment) => attachment.id === capture.audioAttachmentId ? {
147
+ ...attachment,
148
+ transcript: capture.transcriptRaw
149
+ } : attachment);
150
+ if (capture.projectId && capture.projectInferenceSource !== "context") this.linkProject(capture, capture.projectId);
151
+ if (note.title !== title || note.markdown !== markdown || note.status !== "processed") await this.deps.notes.updateNote(capture.noteId, {
152
+ title,
153
+ markdown,
154
+ attachments,
155
+ status: "processed"
156
+ }, "ai_edit");
157
+ const now = Date.now();
158
+ const updated = updateDiscussionCapture(capture.id, {
159
+ status: "completed",
160
+ processingStage: void 0,
161
+ finalizationRevision: capture.finalizationRevision + 1,
162
+ completedAt: now,
163
+ leaseOwner: void 0,
164
+ leaseExpiresAt: void 0,
165
+ nextAttemptAt: void 0,
166
+ lastErrorCode: void 0,
167
+ lastErrorMessage: void 0
168
+ }, ["finalizing"]);
169
+ if (!updated || updated.leaseOwner) throw new Error("Discussion changed while writing the note");
170
+ deleteDiscussionSegmentAudio(capture.id);
171
+ this.deps.onUpdated?.(updated);
172
+ this.deps.onCompleted?.(updated, capture.analysis);
173
+ return updated;
174
+ }
175
+ linkProject(capture, projectId) {
176
+ const project = this.deps.projects.get(projectId);
177
+ if (!project) return;
178
+ this.objectLinks.create({
179
+ id: `discussion:${capture.id}:project`,
180
+ from: {
181
+ kind: "note",
182
+ id: capture.noteId
183
+ },
184
+ to: {
185
+ kind: "project",
186
+ id: project.id,
187
+ title: project.name
188
+ },
189
+ relation: "belongs_to",
190
+ source: "agent"
191
+ });
192
+ }
193
+ async defaultTranscribe(buffer, capture, attachment, signal) {
194
+ const config = this.deps.getConfig();
195
+ const sttConfig = mergeSttConfigFromAppConfig(config.tools?.media?.audio, config.tools?.media);
196
+ if (!isSTTAvailable(sttConfig)) throw new Error("STT is not configured");
197
+ return transcribe(buffer, sttConfig, {
198
+ mime: attachment.mimeType || capture.mimeType,
199
+ fileName: attachment.fileName,
200
+ signal
201
+ });
202
+ }
203
+ };
204
+ //#endregion
205
+ export { DiscussionPipeline, mergeDiscussionAnalysisIntoMarkdown };
@@ -0,0 +1,13 @@
1
+ export interface DiscussionProjectCandidate {
2
+ id: string;
3
+ name: string;
4
+ }
5
+ export declare function findExactProjectMention(transcript: string, projects: DiscussionProjectCandidate[]): DiscussionProjectCandidate | undefined;
6
+ export declare function acceptRankedProject(input: {
7
+ projectCandidateId?: string;
8
+ projectConfidence?: number;
9
+ projectAlternativeConfidence?: number;
10
+ }, projects: DiscussionProjectCandidate[]): {
11
+ id: string;
12
+ score: number;
13
+ } | undefined;
@@ -0,0 +1,19 @@
1
+ //#region src/discussions/project-inference.ts
2
+ function findExactProjectMention(transcript, projects) {
3
+ const normalizedTranscript = normalize(transcript);
4
+ const matches = projects.filter((project) => normalizedTranscript.includes(normalize(project.name)));
5
+ return matches.length === 1 ? matches[0] : void 0;
6
+ }
7
+ function acceptRankedProject(input, projects) {
8
+ const score = input.projectConfidence ?? 0;
9
+ if (!input.projectCandidateId || !projects.some((project) => project.id === input.projectCandidateId) || score < .85 || score - (input.projectAlternativeConfidence ?? 0) < .15) return void 0;
10
+ return {
11
+ id: input.projectCandidateId,
12
+ score
13
+ };
14
+ }
15
+ function normalize(value) {
16
+ return value.normalize("NFKC").toLocaleLowerCase().replace(/\s+/g, " ").trim();
17
+ }
18
+ //#endregion
19
+ export { acceptRankedProject, findExactProjectMention };
@@ -0,0 +1,29 @@
1
+ import type { DiscussionCapture, DiscussionCaptureSettings, DiscussionListResult, DiscussionMetrics, DiscussionStatus, DiscussionTranscriptSegment, ListDiscussionsQuery } from './types.js';
2
+ export interface ClaimedDiscussionTranscriptSegment extends DiscussionTranscriptSegment {
3
+ audioBuffer: Buffer;
4
+ }
5
+ export declare function createDiscussionCapture(capture: DiscussionCapture): DiscussionCapture;
6
+ export declare function getDiscussionCapture(id: string): DiscussionCapture | null;
7
+ export declare function getDiscussionCaptureByClientRequestId(clientRequestId: string): DiscussionCapture | null;
8
+ export declare function getDiscussionCaptureByNoteId(noteId: string): DiscussionCapture | null;
9
+ export declare function listDiscussionCaptures(query?: ListDiscussionsQuery): DiscussionListResult;
10
+ export declare function getDiscussionMetrics(): DiscussionMetrics;
11
+ export declare function updateDiscussionCapture(id: string, patch: Partial<Omit<DiscussionCapture, 'id' | 'clientRequestId' | 'noteId' | 'createdAt'>>, expectedStatuses?: DiscussionStatus[]): DiscussionCapture | null;
12
+ export declare function claimNextDiscussionCapture(owner: string, now?: number, leaseMs?: number): DiscussionCapture | null;
13
+ export declare function createDiscussionTranscriptSegment(input: {
14
+ discussionId: string;
15
+ sequence: number;
16
+ audioSha256: string;
17
+ audioBuffer: Buffer;
18
+ startedAtMs: number;
19
+ endedAtMs: number;
20
+ now?: number;
21
+ }): DiscussionTranscriptSegment;
22
+ export declare function getDiscussionTranscriptSegment(discussionId: string, sequence: number): DiscussionTranscriptSegment | null;
23
+ export declare function listDiscussionTranscriptSegments(discussionId: string): DiscussionTranscriptSegment[];
24
+ export declare function claimNextDiscussionTranscriptSegment(owner: string, now?: number, leaseMs?: number): ClaimedDiscussionTranscriptSegment | null;
25
+ export declare function completeDiscussionTranscriptSegment(discussionId: string, sequence: number, owner: string, transcript: string, provider: string): DiscussionTranscriptSegment | null;
26
+ export declare function retryOrFailDiscussionTranscriptSegment(discussionId: string, sequence: number, owner: string, error: string, exhausted: boolean): DiscussionTranscriptSegment | null;
27
+ export declare function deleteDiscussionSegmentAudio(discussionId: string): void;
28
+ export declare function getDiscussionCaptureSettings(): DiscussionCaptureSettings;
29
+ export declare function acknowledgeDiscussionCaptureConsent(policyVersion: number): DiscussionCaptureSettings;