@xopcai/xopc 0.0.344 → 0.0.345

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 (246) hide show
  1. package/dist/browser-ext/dist/assets/{auth-BsvblhQz.js → auth-CFiOJ_rf.js} +1 -1
  2. package/dist/browser-ext/dist/background.js +1 -1
  3. package/dist/browser-ext/dist/sidepanel.html +1 -1
  4. package/dist/browser-ext/dist/sidepanel.js +1 -1
  5. package/dist/browser-ext/manifest.json +1 -1
  6. package/dist/extensions/telegram/xopc.extension.json +1 -1
  7. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DRFs0Jjv.js → agent-avatar-dicebear-DzTpItp_.js} +1 -1
  8. package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-C9J-ILd0.js → agent-defaults-settings-panel-B1al6YWa.js} +1 -1
  9. package/dist/gateway/static/root/assets/{agent-plugin-dialog-CGstiK5S.js → agent-plugin-dialog-DSoB0gnd.js} +1 -1
  10. package/dist/gateway/static/root/assets/{agents-DS-CV-xB.js → agents-CwRQCefk.js} +6 -6
  11. package/dist/gateway/static/root/assets/{agents-admin-api-BTYHoqlW.js → agents-admin-api-Dlw9XxYa.js} +1 -1
  12. package/dist/gateway/static/root/assets/{app-management-settings-panel-znCRRKVF.js → app-management-settings-panel-CLHHHWYO.js} +1 -1
  13. package/dist/gateway/static/root/assets/{appearance-settings-DSUujN-S.js → appearance-settings-CDHVSJLa.js} +1 -1
  14. package/dist/gateway/static/root/assets/{apps-page-7uOjQp30.js → apps-page-d6fHnMl5.js} +1 -1
  15. package/dist/gateway/static/root/assets/{archive-plugin-DV01jcWu.js → archive-plugin-D_nLN0ho.js} +1 -1
  16. package/dist/gateway/static/root/assets/{automations-page-D_Ts5PDI.js → automations-page-CU8i_OF1.js} +1 -1
  17. package/dist/gateway/static/root/assets/{automations-workspace-Dg7IuWeB.js → automations-workspace-FUZW78oM.js} +1 -1
  18. package/dist/gateway/static/root/assets/{binary-plugins-CEoIySYJ.js → binary-plugins-cOFd2Nir.js} +1 -1
  19. package/dist/gateway/static/root/assets/{block-editor-4bv_tjfg.js → block-editor-BJiU5Z4T.js} +1 -1
  20. package/dist/gateway/static/root/assets/{browser-automation-inputs-UYRx7nE_.js → browser-automation-inputs-C9W2EklQ.js} +1 -1
  21. package/dist/gateway/static/root/assets/{browser-automations-page-EtXgro_V.js → browser-automations-page-Ccv2YZy3.js} +1 -1
  22. package/dist/gateway/static/root/assets/{browser-settings-page-Bf45sjmd.js → browser-settings-page-Da1ldGha.js} +1 -1
  23. package/dist/gateway/static/root/assets/{capabilities-B-2wxCUQ.js → capabilities-Co9ZxHHB.js} +1 -1
  24. package/dist/gateway/static/root/assets/{capabilities-page-YjIv97Sw.js → capabilities-page-DVg7nuOv.js} +2 -2
  25. package/dist/gateway/static/root/assets/{capabilities-settings-panel-Ch2iNnfI.js → capabilities-settings-panel-C5pn_cxD.js} +1 -1
  26. package/dist/gateway/static/root/assets/{capability-header-actions-DJKC0sss.js → capability-header-actions-BTKmmXDt.js} +1 -1
  27. package/dist/gateway/static/root/assets/{channels-BWZmepe_.js → channels-DW8nOovI.js} +1 -1
  28. package/dist/gateway/static/root/assets/{chat-terminal-dock-DLBqdgS-.js → chat-terminal-dock-CP8Y9yw4.js} +1 -1
  29. package/dist/gateway/static/root/assets/computer-settings-page-d2HeneXw.js +1 -0
  30. package/dist/gateway/static/root/assets/{connector-service-page-CYE4gX1g.js → connector-service-page-DurvkNyY.js} +1 -1
  31. package/dist/gateway/static/root/assets/{connectors-page-dJDZx96_.js → connectors-page-InzpTQdx.js} +1 -1
  32. package/dist/gateway/static/root/assets/{date-picker-BM9HDlUj.js → date-picker-C66v8-Yb.js} +1 -1
  33. package/dist/gateway/static/root/assets/{dependency-picker-BybqITjG.js → dependency-picker-DdI7qT11.js} +1 -1
  34. package/dist/gateway/static/root/assets/{desktop-pet-CYoJiTna.js → desktop-pet-BNApFzEs.js} +1 -1
  35. package/dist/gateway/static/root/assets/{desktop-pet-settings-CXcTdFHs.js → desktop-pet-settings-CzlyUvVW.js} +1 -1
  36. package/dist/gateway/static/root/assets/{device-pairing-wizard-DnkRc3SQ.js → device-pairing-wizard-kGWh--bQ.js} +1 -1
  37. package/dist/gateway/static/root/assets/{directory-picker-path-field-BNC2UnEM.js → directory-picker-path-field-C_dseFuW.js} +1 -1
  38. package/dist/gateway/static/root/assets/{extension-debug-page-CHU0dr2j.js → extension-debug-page-Bm_VpS_w.js} +1 -1
  39. package/dist/gateway/static/root/assets/{extension-page-DXjPSQIh.js → extension-page-BwoZPA_b.js} +1 -1
  40. package/dist/gateway/static/root/assets/{extension-settings-page-DqFNPQsx.js → extension-settings-page-zk5g1zeU.js} +1 -1
  41. package/dist/gateway/static/root/assets/{gateway-config-swr-DcE8n_ZS.js → gateway-config-swr-ukBQYwfH.js} +1 -1
  42. package/dist/gateway/static/root/assets/gateway-realtime-DvNfXjan.js +1 -0
  43. package/dist/gateway/static/root/assets/gateway-realtime-store-DGQMXjfI.js +1 -0
  44. package/dist/gateway/static/root/assets/{gateway-settings-BJVKTwIx.js → gateway-settings-ys3GodI9.js} +1 -1
  45. package/dist/gateway/static/root/assets/{gateway-startup-retry-CCPlq9Lk.js → gateway-startup-retry-CVpOj205.js} +1 -1
  46. package/dist/gateway/static/root/assets/{home-page-B2imtrmi.js → home-page-DCch7Wli.js} +1 -1
  47. package/dist/gateway/static/root/assets/{image-generation-api-D1Uh-05P.js → image-generation-api-zxx0qG9z.js} +1 -1
  48. package/dist/gateway/static/root/assets/{imports-page-CsypWC3J.js → imports-page-B_FXRx3e.js} +1 -1
  49. package/dist/gateway/static/root/assets/index-CmBebI78.js +106 -0
  50. package/dist/gateway/static/root/assets/index-y6kxoLV2.css +1 -0
  51. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CSzm05SM.js → keyboard-shortcuts-settings-G6jipaPk.js} +1 -1
  52. package/dist/gateway/static/root/assets/{local-app-workbench-page-BulzWHzC.js → local-app-workbench-page-DBk6VCUD.js} +1 -1
  53. package/dist/gateway/static/root/assets/{local-apps-page-BQ2QlJNH.js → local-apps-page-JTCwJwFQ.js} +1 -1
  54. package/dist/gateway/static/root/assets/{local-session-drafts-D9DeB55u.js → local-session-drafts-Dt_Yx7kq.js} +1 -1
  55. package/dist/gateway/static/root/assets/{locale-store-B0WmWiCo.js → locale-store-B008NR-f.js} +1 -1
  56. package/dist/gateway/static/root/assets/{logs-page-harzpOPJ.js → logs-page-BSY86BVu.js} +1 -1
  57. package/dist/gateway/static/root/assets/{management-settings-BXKeyT_O.js → management-settings-DVawGOeE.js} +1 -1
  58. package/dist/gateway/static/root/assets/{markdown-view-CSADmLmZ.js → markdown-view-BjDzimRP.js} +1 -1
  59. package/dist/gateway/static/root/assets/{media-plugins-CMe8YQ8l.js → media-plugins-CkAqQ2Tl.js} +1 -1
  60. package/dist/gateway/static/root/assets/messages-aVTaD9Mj.js +3 -0
  61. package/dist/gateway/static/root/assets/{note-detail-panel-DD9n9tnf.js → note-detail-panel-Cm-tLgD2.js} +3 -3
  62. package/dist/gateway/static/root/assets/{notes-page-B5NcvMau.js → notes-page-CYI52sAi.js} +1 -1
  63. package/dist/gateway/static/root/assets/{page-context-capture-button-BwFIuZqk.js → page-context-capture-button-DZEkVWnp.js} +1 -1
  64. package/dist/gateway/static/root/assets/{page-tabs-DH4JI3t_.js → page-tabs-CDZsjC4h.js} +1 -1
  65. package/dist/gateway/static/root/assets/{preview-open-alternatives-D3Wsh5jh.js → preview-open-alternatives-Cx5BFcNM.js} +1 -1
  66. package/dist/gateway/static/root/assets/{product-open-page-iigCUM2g.js → product-open-page-B-5PABzZ.js} +1 -1
  67. package/dist/gateway/static/root/assets/{project-detail-page-C19aDnSV.js → project-detail-page-cDOhoUoN.js} +1 -1
  68. package/dist/gateway/static/root/assets/{projects-page-aWOL4_py.js → projects-page-CiM0TnYn.js} +1 -1
  69. package/dist/gateway/static/root/assets/{registry-api-Bw0ZkSav.js → registry-api-EPj5O77m.js} +1 -1
  70. package/dist/gateway/static/root/assets/{remote-access-hub-CGLJFrLG.js → remote-access-hub-CieyswCw.js} +1 -1
  71. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-ArGdQMYT.js → runtime-tools-settings-panel-AVqU_pNz.js} +1 -1
  72. package/dist/gateway/static/root/assets/{scenes-page-WB5cZttQ.js → scenes-page-CRoeeOsQ.js} +1 -1
  73. package/dist/gateway/static/root/assets/{schema-form-Bzga2Tq0.js → schema-form-6rX3xac-.js} +1 -1
  74. package/dist/gateway/static/root/assets/session-api-D5BlAIge.js +1 -0
  75. package/dist/gateway/static/root/assets/session-manager-DcFS0yfO.js +16 -0
  76. package/dist/gateway/static/root/assets/{sessions-page-DCs83Gg-.js → sessions-page-CcLgWmnz.js} +1 -1
  77. package/dist/gateway/static/root/assets/settings-advanced-gate-t9xHuUNo.js +1 -0
  78. package/dist/gateway/static/root/assets/{settings-form-section-DMchToFl.js → settings-form-section-D4yLlpSo.js} +1 -1
  79. package/dist/gateway/static/root/assets/{settings-page-Dh-S9_GO.js → settings-page-CiuxRfw3.js} +1 -1
  80. package/dist/gateway/static/root/assets/{setup-status-panel-kFPkdt3z.js → setup-status-panel-C5mzr9U_.js} +1 -1
  81. package/dist/gateway/static/root/assets/{share-preview-page-CrVC0BzQ.js → share-preview-page-sZ5BzkSM.js} +1 -1
  82. package/dist/gateway/static/root/assets/{shares-settings-ZesbsEGA.js → shares-settings-Hk3h-pmX.js} +1 -1
  83. package/dist/gateway/static/root/assets/{skill-api-Deb8HqtR.js → skill-api-D7yidXQV.js} +1 -1
  84. package/dist/gateway/static/root/assets/skill-reload-api-hmT7uaZI.js +1 -0
  85. package/dist/gateway/static/root/assets/{skills-page-Bgs9jaCc.js → skills-page-D2ABIJZ8.js} +1 -1
  86. package/dist/gateway/static/root/assets/{system-settings-panel-CwD47-_i.js → system-settings-panel-DlmGH7bX.js} +1 -1
  87. package/dist/gateway/static/root/assets/task-detail-page-CB-LT_2z.js +1 -0
  88. package/dist/gateway/static/root/assets/{tasks-QQJXsiER.js → tasks-BH8_WMUF.js} +1 -1
  89. package/dist/gateway/static/root/assets/{tunnel-api-DtL__Vgg.js → tunnel-api-D3M3MUBJ.js} +1 -1
  90. package/dist/gateway/static/root/assets/{usage-page-DZ01CsLl.js → usage-page-YtsLilis.js} +1 -1
  91. package/dist/gateway/static/root/assets/{use-autosave-XBFnwLd0.js → use-autosave-CWMidLRt.js} +1 -1
  92. package/dist/gateway/static/root/assets/{user-model-page-ByACaDBG.js → user-model-page-Cjy2mA_0.js} +1 -1
  93. package/dist/gateway/static/root/assets/{voice-api-key-field-NaIj9rQC.js → voice-api-key-field-C4OR4RzY.js} +1 -1
  94. package/dist/gateway/static/root/assets/{voice-config-api-st1q4lqP.js → voice-config-api-BnnUzr07.js} +1 -1
  95. package/dist/gateway/static/root/assets/{work-discovery-overlay-D418eqa5.js → work-discovery-overlay-C53YDtCc.js} +1 -1
  96. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CSXIidqw.js → workflow-run-setup-panel-CoaJDAAq.js} +1 -1
  97. package/dist/gateway/static/root/assets/{workflows-page-nGttfQ1r.js → workflows-page-EQdAkdTP.js} +1 -1
  98. package/dist/gateway/static/root/index.html +16 -16
  99. package/dist/package.js +1 -1
  100. package/dist/packages/endpoint-tools-protocol/src/index.js +2 -1
  101. package/dist/packages/gateway-contract/src/sessions.js +11 -0
  102. package/dist/packages/gateway-contract/src/tasks.js +1 -0
  103. package/dist/src/agent/agent-manager.js +4 -4
  104. package/dist/src/agent/background-review/run-background-review.js +1 -1
  105. package/dist/src/agent/bootstrap/filter-bootstrap-files.js +1 -1
  106. package/dist/src/agent/external-tools/endpoint-provider.js +2 -2
  107. package/dist/src/agent/image/tool-model-config.js +1 -1
  108. package/dist/src/agent/service/direct-turn-helpers.js +2 -2
  109. package/dist/src/agent/service/process-direct-streaming.js +16 -2
  110. package/dist/src/agent/service.js +2 -2
  111. package/dist/src/agent/tasks/task-judge-service.d.ts +1 -0
  112. package/dist/src/agent/tasks/task-judge-service.js +55 -33
  113. package/dist/src/agent/tool-manuals/computer.d.ts +1 -1
  114. package/dist/src/agent/tool-manuals/computer.js +2 -2
  115. package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -1
  116. package/dist/src/agent/tool-manuals/xopc-use.js +28 -2
  117. package/dist/src/agent/tools/computer-use-tool.d.ts +0 -2
  118. package/dist/src/agent/tools/computer-use-tool.js +31 -19
  119. package/dist/src/agent/tools/factory.js +2 -3
  120. package/dist/src/agent/tools/xopc-use-tool.js +180 -9
  121. package/dist/src/agent-catalog/capabilities.js +2 -2
  122. package/dist/src/auth/credentials.js +1 -1
  123. package/dist/src/auth/oauth-provider-lock.js +1 -1
  124. package/dist/src/auth/sync-provider-auth.js +1 -1
  125. package/dist/src/automations/capabilities/drafts.js +1 -1
  126. package/dist/src/bootstrap/application-state.js +1 -1
  127. package/dist/src/capabilities/runtime/dispatcher.d.ts +2 -0
  128. package/dist/src/capabilities/runtime/dispatcher.js +1 -1
  129. package/dist/src/capabilities/runtime/product.js +1 -1
  130. package/dist/src/chat-commands/agent-edit.js +1 -1
  131. package/dist/src/chat-commands/builtins/config.js +1 -1
  132. package/dist/src/cli/commands/agent.js +1 -1
  133. package/dist/src/cli/commands/agents.js +1 -1
  134. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  135. package/dist/src/cli/commands/models.js +1 -1
  136. package/dist/src/cli/commands/onboard/model.js +2 -2
  137. package/dist/src/cli/utils/init-workspace-core.js +1 -1
  138. package/dist/src/computer/broker.d.ts +6 -0
  139. package/dist/src/computer/broker.js +14 -0
  140. package/dist/src/computer/errors.js +2 -1
  141. package/dist/src/computer/model-adapter.js +3 -3
  142. package/dist/src/config/index.js +4 -4
  143. package/dist/src/config/loader.js +2 -2
  144. package/dist/src/config/models-json.js +1 -1
  145. package/dist/src/config/schema.js +1 -1
  146. package/dist/src/extensions/agent-plugins/validation.js +1 -1
  147. package/dist/src/gateway/agents-admin.js +2 -2
  148. package/dist/src/gateway/chat-stream/mapper.d.ts +3 -0
  149. package/dist/src/gateway/chat-stream/mapper.js +5 -1
  150. package/dist/src/gateway/chat-stream/protocol.d.ts +3 -0
  151. package/dist/src/gateway/file-path-classifier.js +1 -1
  152. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  153. package/dist/src/gateway/hono/routes/config-patch/misc.js +2 -2
  154. package/dist/src/gateway/hono/routes/models.js +1 -1
  155. package/dist/src/gateway/hono/routes/notes.js +2 -2
  156. package/dist/src/gateway/hono/routes/projects.js +2 -2
  157. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +2 -2
  158. package/dist/src/gateway/hono/routes/session-input-handler.js +1 -1
  159. package/dist/src/gateway/hono/routes/sessions.js +19 -2
  160. package/dist/src/gateway/hono/routes/tasks.js +94 -1
  161. package/dist/src/gateway/image-generation-setup.js +2 -2
  162. package/dist/src/gateway/lock.js +1 -1
  163. package/dist/src/gateway/service/active-execution.js +1 -1
  164. package/dist/src/gateway/service/run-gateway-agent.js +5 -1
  165. package/dist/src/gateway/service/session-input-coordinator.d.ts +1 -1
  166. package/dist/src/gateway/service.d.ts +2 -1
  167. package/dist/src/gateway/service.js +72 -8
  168. package/dist/src/gateway/session-context-summary.js +17 -0
  169. package/dist/src/gateway/xopc-cloud-capability-setup.js +1 -1
  170. package/dist/src/home-intelligence/host.js +2 -2
  171. package/dist/src/local-apps/service.js +1 -1
  172. package/dist/src/providers/model-catalog-persistence.js +1 -1
  173. package/dist/src/session/client-history.d.ts +7 -1
  174. package/dist/src/session/client-history.js +51 -1
  175. package/dist/src/session/store.js +10 -2
  176. package/dist/src/session/types.d.ts +1 -0
  177. package/dist/src/storage/sqlite/index.d.ts +1 -1
  178. package/dist/src/storage/sqlite/index.js +2 -2
  179. package/dist/src/storage/sqlite/migrations/224_task_origin_links.sql +8 -0
  180. package/dist/src/storage/sqlite/migrations/225_task_collaboration.sql +32 -0
  181. package/dist/src/storage/sqlite/migrations/226_task_main_updates.sql +9 -0
  182. package/dist/src/storage/sqlite/migrations/227_task_main_update_decisions.sql +8 -0
  183. package/dist/src/storage/sqlite/migrations/228_task_main_agent_links.sql +14 -0
  184. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  185. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  186. package/dist/src/storage/sqlite/schema.js +1 -1
  187. package/dist/src/storage/sqlite/session-input-repository.d.ts +9 -0
  188. package/dist/src/storage/sqlite/session-input-repository.js +28 -1
  189. package/dist/src/storage/sqlite/session-repository.js +11 -0
  190. package/dist/src/tasks/capabilities/read.js +2 -2
  191. package/dist/src/tasks/capabilities/write.js +2 -0
  192. package/dist/src/tasks/index.js +2 -2
  193. package/dist/src/tasks/task-application-service.js +19 -1
  194. package/dist/src/tasks/task-collaboration-delivery.d.ts +9 -0
  195. package/dist/src/tasks/task-collaboration-delivery.js +100 -0
  196. package/dist/src/tasks/task-collaboration-repository.d.ts +52 -0
  197. package/dist/src/tasks/task-collaboration-repository.js +151 -0
  198. package/dist/src/tasks/task-context-assembler.d.ts +2 -0
  199. package/dist/src/tasks/task-context-assembler.js +23 -1
  200. package/dist/src/tasks/task-main-agent-repository.d.ts +10 -0
  201. package/dist/src/tasks/task-main-agent-repository.js +30 -0
  202. package/dist/src/tasks/task-main-update-decision-service.d.ts +21 -0
  203. package/dist/src/tasks/task-main-update-decision-service.js +118 -0
  204. package/dist/src/tasks/task-main-update-delivery.d.ts +16 -0
  205. package/dist/src/tasks/task-main-update-delivery.js +64 -0
  206. package/dist/src/tasks/task-main-update-input.d.ts +20 -0
  207. package/dist/src/tasks/task-main-update-input.js +37 -0
  208. package/dist/src/tasks/task-orchestration-metrics.d.ts +17 -0
  209. package/dist/src/tasks/task-orchestration-metrics.js +61 -0
  210. package/dist/src/tasks/task-origin-repository.d.ts +14 -0
  211. package/dist/src/tasks/task-origin-repository.js +29 -0
  212. package/dist/src/tasks/task-run-dispatcher.d.ts +3 -0
  213. package/dist/src/tasks/task-run-dispatcher.js +65 -7
  214. package/dist/src/tasks/task-run-repository.d.ts +2 -0
  215. package/dist/src/tasks/task-run-repository.js +12 -1
  216. package/dist/src/tasks/task-sidebar-hierarchy.d.ts +14 -0
  217. package/dist/src/tasks/task-sidebar-hierarchy.js +49 -0
  218. package/dist/src/tui/backends/embedded-backend.js +3 -3
  219. package/dist/src/tui/chat-history.js +8 -0
  220. package/dist/src/tui/tui-commands.js +1 -1
  221. package/dist/src/tui/tui-session-snapshot.js +4 -3
  222. package/dist/src/tui/tui-startup-resources.js +1 -1
  223. package/dist/src/tui/tui.js +1 -1
  224. package/dist/src/voice/realtime/agentBroker.d.ts +4 -0
  225. package/dist/src/voice/realtime/agentBroker.js +9 -3
  226. package/dist/src/voice/realtime/agentEngine.js +47 -13
  227. package/dist/src/voice/realtime/engine.d.ts +5 -0
  228. package/dist/src/voice/realtime/omniEngine.js +66 -12
  229. package/dist/src/voice/realtime/persona-context.js +1 -1
  230. package/dist/src/voice/realtime/playback-echo.js +2 -0
  231. package/dist/src/voice/realtime/runtime.d.ts +6 -0
  232. package/dist/src/voice/realtime/runtime.js +12 -0
  233. package/dist/src/voice/realtime/turnPolicy.d.ts +1 -0
  234. package/dist/src/voice/realtime/turnPolicy.js +3 -0
  235. package/package.json +3 -3
  236. package/dist/gateway/static/root/assets/computer-settings-page-CciQtKpz.js +0 -1
  237. package/dist/gateway/static/root/assets/gateway-realtime-BeUJkjA3.js +0 -1
  238. package/dist/gateway/static/root/assets/gateway-realtime-store-C-8wwbt_.js +0 -1
  239. package/dist/gateway/static/root/assets/index-Ca6iqaCn.css +0 -1
  240. package/dist/gateway/static/root/assets/index-DqQgdJHd.js +0 -106
  241. package/dist/gateway/static/root/assets/messages-CTKYRqR-.js +0 -3
  242. package/dist/gateway/static/root/assets/session-api-BY3dAGBn.js +0 -1
  243. package/dist/gateway/static/root/assets/session-manager-D10sD8IN.js +0 -16
  244. package/dist/gateway/static/root/assets/settings-advanced-gate-yIwyFL-A.js +0 -1
  245. package/dist/gateway/static/root/assets/skill-reload-api-DvWOrc3C.js +0 -1
  246. package/dist/gateway/static/root/assets/task-detail-page-DFEM3Xbj.js +0 -1
@@ -10,20 +10,21 @@ import { getSqliteDatabase, init_transaction } from "../storage/sqlite/transacti
10
10
  import { getBrowserTabBindingById, init_browser_tab_binding_repository } from "../storage/sqlite/browser-tab-binding-repository.js";
11
11
  import { findSessionInput, init_session_input_repository, insertSessionInput } from "../storage/sqlite/session-input-repository.js";
12
12
  import { TaskRepository } from "../tasks/task-repository.js";
13
+ import { TaskRunRepository, init_task_run_repository } from "../tasks/task-run-repository.js";
13
14
  import { init_changes, notifyUserContextChange } from "../user-context/changes.js";
14
15
  import { getSessionMetadata } from "../storage/sqlite/session-read-repository.js";
15
16
  import { init_session_repository, listSessionMetadata, patchSessionMetadata } from "../storage/sqlite/session-repository.js";
16
17
  import { getSessionConfig, init_config_repository } from "../storage/sqlite/config-repository.js";
17
18
  import { init_sqlite } from "../storage/sqlite/index.js";
18
19
  import { normalizeAgentId } from "../agent-catalog/id.js";
19
- import { init_agent_scope, listAgentEntries, resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agent/agent-scope.js";
20
- import { init_paths, resolveConfigPath, resolveExtensionsDir } from "../config/paths.js";
21
20
  import { init_config, resolveKnowledgeReadPolicy } from "../user-context/config.js";
22
21
  import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
22
+ import { init_agent_scope, listAgentEntries, resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agent/agent-scope.js";
23
23
  import { init_agent_session_key, resolveAgentMainConversationId } from "../routing/agent-session-key.js";
24
24
  import { init_session_key, resolveConversationId, sanitizeSegment } from "../routing/session-key.js";
25
25
  import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
26
26
  import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
27
+ import { init_paths, resolveConfigPath, resolveExtensionsDir } from "../config/paths.js";
27
28
  import { prewarmModelRegistry } from "../providers/model-registry.js";
28
29
  import { init_providers, providers_exports } from "../providers/index.js";
29
30
  import { AI_USAGE_RETENTION_MS, markStaleAiUsageEventsUnknown, pruneAiUsageEvents } from "../storage/sqlite/ai-usage-repository.js";
@@ -87,10 +88,6 @@ import { DiscussionSealer } from "../discussions/sealer.js";
87
88
  import "../discussions/index.js";
88
89
  import { EndpointToolRuntime } from "../endpoint-tools/runtime.js";
89
90
  import "../endpoint-tools/index.js";
90
- import { HomeCapabilityPreflightService } from "../home-intelligence/capability-preflight.js";
91
- import { HomeAdviceGenerator } from "../home-intelligence/generator.js";
92
- import { HomeIntelligenceHost } from "../home-intelligence/host.js";
93
- import { HomeSnapshotBuilder } from "../home-intelligence/snapshot.js";
94
91
  import { assertGatewayAuthConfigured, extractToken, resolveGatewayAuth, validateToken } from "./auth.js";
95
92
  import { prepareAutomationAgentSession } from "./automation-agent-session.js";
96
93
  import { stopTailscaleExposure } from "./tailscale-lifecycle.js";
@@ -146,8 +143,16 @@ import { reconcileMemoryMaintenanceAutomations } from "./memory-maintenance-auto
146
143
  import { GatewayReadiness } from "./startup-readiness.js";
147
144
  import { createGatewayStartupTrace } from "./startup-trace.js";
148
145
  import { GatewaySceneHost } from "./scenes/host.js";
146
+ import { TaskCollaborationDelivery } from "../tasks/task-collaboration-delivery.js";
147
+ import { TaskMainUpdateDelivery } from "../tasks/task-main-update-delivery.js";
148
+ import { TaskMainUpdateDecisionService } from "../tasks/task-main-update-decision-service.js";
149
+ import { selectTaskMainUpdateAttempt, submitAndConfirmTaskMainUpdate } from "../tasks/task-main-update-input.js";
149
150
  import { checkAppContextAccess, prepareAppContext } from "./service/app-context-access.js";
150
151
  import { applyAutomaticVoiceLanguage, inferProductLanguageFromEnvironment, initializeVoiceDefaults } from "../voice/language-profile.js";
152
+ import { HomeAdviceGenerator } from "../home-intelligence/generator.js";
153
+ import { HomeIntelligenceHost } from "../home-intelligence/host.js";
154
+ import { HomeSnapshotBuilder } from "../home-intelligence/snapshot.js";
155
+ import { HomeCapabilityPreflightService } from "../home-intelligence/capability-preflight.js";
151
156
  import crypto from "node:crypto";
152
157
  //#region src/gateway/service.ts
153
158
  init_session_repository();
@@ -163,6 +168,7 @@ init_logger();
163
168
  init_log_stream();
164
169
  init_paths();
165
170
  init_package_version();
171
+ init_task_run_repository();
166
172
  init_resolve_route();
167
173
  init_session_key();
168
174
  init_sqlite();
@@ -763,7 +769,7 @@ var GatewayService = class {
763
769
  this.ensureAgentService();
764
770
  return;
765
771
  }
766
- const clientMessageId = `task:${runId}`;
772
+ const clientMessageId = new TaskRunRepository().nextAgentInputClientMessageId(runId);
767
773
  const session = await this.sessionIndex.getSessionMetadata(conversationId);
768
774
  if (!session) throw new Error("Task session is unavailable");
769
775
  insertSessionInput({
@@ -804,6 +810,19 @@ var GatewayService = class {
804
810
  this.projects.flushCommittedEffects();
805
811
  this._workDiscovery?.dispatchProjectUnderstanding();
806
812
  this.dispatchTaskEvents();
813
+ await new TaskCollaborationDelivery().drain(async (input) => {
814
+ const state = this.agentRunner.inputs.snapshot(input.conversationId);
815
+ return (await this.agentRunner.submitSessionInput({
816
+ conversationId: input.conversationId,
817
+ clientMessageId: input.clientMessageId,
818
+ delivery: state.activeRunId ? "steer" : "next",
819
+ content: input.content,
820
+ origin: {
821
+ type: "system",
822
+ source: "workflow"
823
+ }
824
+ })).ok;
825
+ });
807
826
  this.createTaskRunDispatcher().dispatch();
808
827
  await this.createWorkflowRunService().dispatchTaskRuns();
809
828
  }, (err) => {
@@ -814,8 +833,53 @@ var GatewayService = class {
814
833
  phase: "task_run_dispatch"
815
834
  }, `Task dispatch failed: ${errorMessage}`);
816
835
  });
836
+ taskMainUpdateDispatch = createBackgroundTask(async () => {
837
+ await new TaskMainUpdateDelivery().drain({
838
+ isAvailable: (conversationId) => {
839
+ const state = this.agentRunner.inputs.snapshot(conversationId);
840
+ return !state.activeRunId && state.inputs.every((item) => item.status === "interrupted") && (!this.voiceRealtime.hasConversation(conversationId) || this.voiceRealtime.canOfferTaskUpdate(conversationId));
841
+ },
842
+ decide: (input) => new TaskMainUpdateDecisionService({
843
+ getModelRef: (conversationId) => this.ensureAgentService().getModelForSession(conversationId),
844
+ loadHistory: (conversationId) => this.sessionIndex.loadMessages(conversationId)
845
+ }).decide(input),
846
+ submitAndConfirm: (input) => {
847
+ if (this.voiceRealtime.hasConversation(input.conversationId)) {
848
+ const attempt = selectTaskMainUpdateAttempt(input.conversationId, input.clientMessageId, findSessionInput);
849
+ if (attempt.kind === "completed") return Promise.resolve(true);
850
+ if (attempt.kind !== "new" || !attempt.clientMessageId) return Promise.resolve(false);
851
+ return this.voiceRealtime.offerTaskUpdate({
852
+ ...input,
853
+ clientMessageId: attempt.clientMessageId
854
+ });
855
+ }
856
+ return submitAndConfirmTaskMainUpdate(input, {
857
+ findInput: findSessionInput,
858
+ submit: async (message) => {
859
+ return (await this.agentRunner.submitSessionInput({
860
+ ...message,
861
+ delivery: "next",
862
+ origin: {
863
+ type: "system",
864
+ source: "task_update"
865
+ }
866
+ })).ok;
867
+ },
868
+ waitForCompletion: (conversationId, clientMessageId) => this.agentRunner.inputs.waitForCompletion(conversationId, clientMessageId)
869
+ });
870
+ }
871
+ });
872
+ }, (err) => {
873
+ const errorMessage = err instanceof Error ? err.message : String(err);
874
+ log.error({
875
+ err,
876
+ errorMessage,
877
+ phase: "task_main_update_dispatch"
878
+ }, `Main Agent update dispatch failed: ${errorMessage}`);
879
+ });
817
880
  dispatchTaskRuns() {
818
881
  this.taskRunDispatch();
882
+ this.taskMainUpdateDispatch();
819
883
  }
820
884
  async ensureTaskConversation(taskId, options = {}) {
821
885
  const task = new TaskRepository().require(taskId);
@@ -1864,7 +1928,7 @@ var GatewayService = class {
1864
1928
  });
1865
1929
  }
1866
1930
  if (event.type.startsWith("task.")) this.emit(event.type, event.payload);
1867
- if (this.config.userContext.homeIntelligence.refreshOnContextChange && (event.type.startsWith("task.") || event.type.startsWith("project."))) {
1931
+ if (this.config.userContext.homeIntelligence.refreshOnContextChange && (event.type.startsWith("task.") && event.type !== "task.collaboration_entry_added" || event.type.startsWith("project."))) {
1868
1932
  const payload = event.payload;
1869
1933
  const objectId = event.type.startsWith("task.") ? payload.taskId : payload.projectId;
1870
1934
  const revision = payload.version ?? payload.revision ?? "unknown";
@@ -11,6 +11,8 @@ import { getExecutionEnvironmentForSession } from "../execution-environments/sub
11
11
  import { effectiveWorkspacePathForSession } from "../session/session-workspace.js";
12
12
  import { ProjectStore } from "../projects/project-store.js";
13
13
  import { runExec } from "../infra/exec.js";
14
+ import { TaskCollaborationRepository } from "../tasks/task-collaboration-repository.js";
15
+ import { TaskOriginRepository } from "../tasks/task-origin-repository.js";
14
16
  import { isSessionSourceBinding } from "../agent/source-context/types.js";
15
17
  import { realpath, stat } from "node:fs/promises";
16
18
  //#region src/gateway/session-context-summary.ts
@@ -106,6 +108,21 @@ async function getSessionContextSummary(config, conversationId, scopes) {
106
108
  phase: task.phase
107
109
  };
108
110
  else if (taskId) unavailable("work");
111
+ const delegated = new TaskOriginRepository().list(conversationId, 20);
112
+ const board = new TaskCollaborationRepository();
113
+ summary.work.delegatedTasks = delegated.items.map((item) => {
114
+ const latest = board.latest(item.id);
115
+ return {
116
+ ...item,
117
+ title: item.title.slice(0, 240),
118
+ ...latest ? { latestUpdate: {
119
+ kind: latest.kind,
120
+ body: latest.body.slice(0, 400),
121
+ createdAt: latest.createdAt
122
+ } } : {}
123
+ };
124
+ });
125
+ summary.work.delegatedTaskCount = delegated.total;
109
126
  } catch (err) {
110
127
  unavailable("work", err);
111
128
  }
@@ -1,7 +1,7 @@
1
1
  import { AgentCatalogRepository, init_repository } from "../agent-catalog/repository.js";
2
- import { AgentCatalogService } from "../agent-catalog/service.js";
3
2
  import { getModelCatalogStore, init_model_catalog_store } from "../providers/model-catalog-store.js";
4
3
  import { compareCatalogModels } from "../providers/model-catalog-ranking.js";
4
+ import { AgentCatalogService } from "../agent-catalog/service.js";
5
5
  import { prepareUpdateGlobalDefaults } from "./global-defaults-admin.js";
6
6
  //#region src/gateway/xopc-cloud-capability-setup.ts
7
7
  init_repository();
@@ -1,10 +1,10 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
+ import { HomeAdviceBudgetExceededError } from "./generator.js";
3
4
  import { homePatternKey } from "./strategy.js";
5
+ import { HomeAdvicePolicy } from "./policy.js";
4
6
  import { HomeIntelligenceRepository } from "./repository.js";
5
7
  import { HomeOpportunityApplicationService } from "./application-service.js";
6
- import { HomeAdvicePolicy } from "./policy.js";
7
- import { HomeAdviceBudgetExceededError } from "./generator.js";
8
8
  import { buildHomeOpportunityNotification } from "./notification.js";
9
9
  import { createHash } from "node:crypto";
10
10
  //#region src/home-intelligence/host.ts
@@ -5,10 +5,10 @@ import { currentOperationId, init_operation_context } from "../infra/operation-c
5
5
  import { afterSqliteCommit, init_transaction, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
6
6
  import { ExtensionCapabilityBindingsSchema, extensionCapabilityPermissions } from "../../packages/gateway-contract/src/extension-capabilities.js";
7
7
  import { init_src } from "../../packages/gateway-contract/src/index.js";
8
- import { CapabilityError } from "../capabilities/runtime/errors.js";
9
8
  import { init_paths, resolveExtensionsDir } from "../config/paths.js";
10
9
  import { LocalAppStore } from "./store.js";
11
10
  import { slugifyProjectName } from "../projects/project-store.js";
11
+ import { CapabilityError } from "../capabilities/runtime/errors.js";
12
12
  import { DomainOutboxDispatcher } from "../infra/domain-outbox-dispatcher.js";
13
13
  import { validateLocalAppCapabilityContracts } from "./capabilities/contracts.js";
14
14
  import { buildLocalAppFixGuidance } from "./fix-guidance.js";
@@ -1,7 +1,7 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
2
  import { init_paths_state, resolveXopcCloudCatalogCachePath } from "../config/paths-state.js";
3
- import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
4
3
  import { ComputerProfileSchema, init_src } from "../../packages/computer-control-contract/src/index.js";
4
+ import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
5
5
  import { voiceManifestSchema } from "../../packages/realtime-protocol/src/voice-catalog.js";
6
6
  import { init_voice } from "../../packages/realtime-protocol/src/voice.js";
7
7
  import { readFileSync, rmSync } from "node:fs";
@@ -1,12 +1,16 @@
1
1
  import { type TurnOutcome, type UserTurnDocument } from '@xopcai/gateway-contract';
2
2
  import type { Message } from './types.js';
3
+ import type { TaskUpdateTrigger } from '../storage/sqlite/session-input-repository.js';
3
4
  import type { TranscriptStoredRow } from './session-context-for-llm.js';
4
5
  /** Transcript row for TUI and HTTP clients (flattened from persisted session messages). */
5
6
  export interface ClientHistoryMessage {
6
7
  id?: string;
7
8
  turnId?: string;
8
- role: 'user' | 'assistant' | 'system';
9
+ /** A background Agent turn starts a new visible assistant bubble without a visible user row. */
10
+ startsNewBubble?: boolean;
11
+ role: 'user' | 'assistant' | 'system' | 'task';
9
12
  content: string;
13
+ taskTrigger?: TaskUpdateTrigger;
10
14
  displayIndex?: number;
11
15
  rawContent?: string | unknown[];
12
16
  /** Persisted inbound attachment metadata used by chat clients to reload media. */
@@ -81,4 +85,6 @@ export declare function transcriptRowsToClientHistory(rows: TranscriptStoredRow[
81
85
  startRowNumber?: number;
82
86
  endRowNumber?: number;
83
87
  rowNumberOffset?: number;
88
+ startsNewBubbleTurnIds?: ReadonlySet<string>;
89
+ taskUpdateTriggers?: ReadonlyMap<string, TaskUpdateTrigger>;
84
90
  }): ClientHistoryMessage[];
@@ -5,6 +5,24 @@ import { stripRuntimeContextFromUserMessage } from "./user-message-display.js";
5
5
  import { buildTranscriptOutline } from "./transcript-outline.js";
6
6
  //#region src/session/client-history.ts
7
7
  init_src();
8
+ function taskTriggerFromMetadata(metadata) {
9
+ if (!metadata || typeof metadata !== "object" || Array.isArray(metadata)) return void 0;
10
+ const value = metadata.taskTrigger;
11
+ if (!value || typeof value !== "object" || Array.isArray(value)) return void 0;
12
+ const trigger = value;
13
+ if (typeof trigger.entryId !== "string" || typeof trigger.taskId !== "string" || typeof trigger.taskTitle !== "string" || !trigger.taskTitle.trim() || ![
14
+ "progress",
15
+ "question",
16
+ "result",
17
+ "failure"
18
+ ].includes(String(trigger.kind))) return void 0;
19
+ return {
20
+ entryId: trigger.entryId,
21
+ taskId: trigger.taskId,
22
+ taskTitle: trigger.taskTitle,
23
+ kind: trigger.kind
24
+ };
25
+ }
8
26
  function sourceContextDisplayMetadata(metadata) {
9
27
  if (!metadata || typeof metadata !== "object" || Array.isArray(metadata)) return void 0;
10
28
  const record = metadata;
@@ -143,9 +161,23 @@ function messagesToClientHistory(messages, opts) {
143
161
  const slice = opts?.limit !== void 0 && messages.length > opts.limit ? messages.slice(-opts.limit) : messages;
144
162
  const results = collectToolResults(slice);
145
163
  const out = [];
164
+ const hiddenTurnIds = new Set(slice.flatMap((message) => message.metadata?.hiddenFromClient === true && typeof message.turnId === "string" ? [message.turnId] : []));
165
+ const assistantTurnIds = new Set(slice.filter((message) => message.role === "assistant").map((message) => message.turnId).filter((turnId) => Boolean(turnId)));
146
166
  for (const m of slice) {
147
167
  if (m.role === "tool" || m.role === "toolResult") continue;
148
168
  if (m.role === "user" || m.role === "system") {
169
+ if (m.metadata?.hiddenFromClient === true) {
170
+ const turnId = m.turnId;
171
+ const trigger = turnId && assistantTurnIds.has(turnId) ? taskTriggerFromMetadata(m.metadata) : void 0;
172
+ if (trigger) out.push({
173
+ role: "task",
174
+ turnId,
175
+ content: "",
176
+ taskTrigger: trigger,
177
+ timestamp: parseTimestamp(m.timestamp)
178
+ });
179
+ continue;
180
+ }
149
181
  const text = flattenMessageContent(m.content);
150
182
  out.push({
151
183
  role: m.role,
@@ -163,6 +195,7 @@ function messagesToClientHistory(messages, opts) {
163
195
  out.push({
164
196
  role: "assistant",
165
197
  ...typeof m.turnId === "string" ? { turnId: m.turnId } : {},
198
+ ...typeof m.turnId === "string" && hiddenTurnIds.has(m.turnId) ? { startsNewBubble: true } : {},
166
199
  content: text,
167
200
  timestamp: parseTimestamp(m.timestamp),
168
201
  toolCalls
@@ -368,7 +401,9 @@ function transcriptRowsToClientHistory(rows, opts) {
368
401
  const startIndex = hasRowWindow ? Math.max(0, Math.trunc(opts?.startRowNumber ?? 1) - 1) : opts?.limit !== void 0 && rows.length > opts.limit ? rows.length - opts.limit : 0;
369
402
  const endIndex = hasRowWindow ? Math.max(startIndex, Math.min(rows.length, Math.trunc(opts?.endRowNumber ?? rows.length))) : rows.length;
370
403
  const slice = hasRowWindow ? rows.slice(startIndex, endIndex) : opts?.limit !== void 0 && rows.length > opts.limit ? rows.slice(-opts.limit) : rows;
371
- const results = collectHistoryToolResults(slice.map(asHistoryMessageRow).filter((row) => row !== null));
404
+ const messages = slice.map(asHistoryMessageRow).filter((row) => row !== null);
405
+ const results = collectHistoryToolResults(messages);
406
+ const assistantTurnIds = new Set(messages.filter((message) => message.role === "assistant").map((message) => message.turnId).filter((turnId) => Boolean(turnId)));
372
407
  const out = [];
373
408
  const reviewTraceToolById = /* @__PURE__ */ new Map();
374
409
  for (const [offset, row] of slice.entries()) {
@@ -472,6 +507,20 @@ function transcriptRowsToClientHistory(rows, opts) {
472
507
  if (!messageRow) continue;
473
508
  if (messageRow.role === "tool" || messageRow.role === "toolResult") continue;
474
509
  if (messageRow.role === "user" || messageRow.role === "system") {
510
+ if (messageRow.metadata?.hiddenFromClient === true) {
511
+ const trigger = messageRow.turnId && assistantTurnIds.has(messageRow.turnId) ? taskTriggerFromMetadata(messageRow.metadata) ?? opts?.taskUpdateTriggers?.get(messageRow.turnId) : void 0;
512
+ if (trigger) out.push({
513
+ id,
514
+ turnId: messageRow.turnId,
515
+ role: "task",
516
+ kind: "message",
517
+ content: "",
518
+ taskTrigger: trigger,
519
+ timestamp: parseTimestampValue(messageRow.timestamp),
520
+ ...displayIndex !== void 0 ? { displayIndex } : {}
521
+ });
522
+ continue;
523
+ }
475
524
  out.push({
476
525
  id,
477
526
  ...messageRow.turnId ? { turnId: messageRow.turnId } : {},
@@ -489,6 +538,7 @@ function transcriptRowsToClientHistory(rows, opts) {
489
538
  out.push({
490
539
  id,
491
540
  ...messageRow.turnId ? { turnId: messageRow.turnId } : {},
541
+ ...messageRow.turnId && opts?.startsNewBubbleTurnIds?.has(messageRow.turnId) ? { startsNewBubble: true } : {},
492
542
  role: "assistant",
493
543
  kind: "message",
494
544
  content: flattenMessageContent(messageRow.content ?? ""),
@@ -3,6 +3,7 @@ import { createLogger } from "../utils/logger/index.js";
3
3
  import { init_logger } from "../utils/logger.js";
4
4
  import { requireXopcDatabase } from "../storage/sqlite/connection.js";
5
5
  import { runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
6
+ import { listTaskUpdateRunIds, listTaskUpdateTriggers } from "../storage/sqlite/session-input-repository.js";
6
7
  import { buildSessionContextForLlm, buildSessionDisplayMessages, init_session_context_for_llm, isRuntimeOnlyTranscriptMessage, isTranscriptCompactionEntry, mergeLlmMessagesPreservingContextRows, transcriptRowsFromJsonArray } from "./session-context-for-llm.js";
7
8
  import "./types.js";
8
9
  import { estimateTokensFromMessages } from "../storage/sqlite/row-mappers.js";
@@ -192,7 +193,11 @@ var SessionStore = class {
192
193
  });
193
194
  const endIndex = hasBeforeCursor ? Math.min(page.total, Math.max(0, parsedBefore)) : Math.max(0, page.total - offset);
194
195
  const startIndex = Math.max(0, endIndex - page.rows.length);
195
- const history = transcriptRowsToClientHistory(page.rows, { rowNumberOffset: startIndex });
196
+ const history = transcriptRowsToClientHistory(page.rows, {
197
+ rowNumberOffset: startIndex,
198
+ startsNewBubbleTurnIds: listTaskUpdateRunIds(key),
199
+ taskUpdateTriggers: listTaskUpdateTriggers(key)
200
+ });
196
201
  const messages = options.compact ? compactHistory(history) : history;
197
202
  const session = {
198
203
  ...metadata,
@@ -632,7 +637,10 @@ var SessionStore = class {
632
637
  }
633
638
  async findInSession(key, query, limit) {
634
639
  if (!await this.getMetadata(key)) return null;
635
- return findSessionMessages(transcriptRowsToClientHistory(await this.loadTranscriptRows(key)), query, limit);
640
+ return findSessionMessages(transcriptRowsToClientHistory(await this.loadTranscriptRows(key), {
641
+ startsNewBubbleTurnIds: listTaskUpdateRunIds(key),
642
+ taskUpdateTriggers: listTaskUpdateTriggers(key)
643
+ }), query, limit);
636
644
  }
637
645
  recallSession(key, query, options) {
638
646
  requireXopcDatabase();
@@ -142,6 +142,7 @@ export interface SessionDetail extends SessionMetadata {
142
142
  }
143
143
  /** Session list query parameters */
144
144
  export interface SessionListQuery extends SessionDiscoveryQuery {
145
+ rootConversationsOnly?: boolean;
145
146
  status?: SessionStatus | SessionStatus[];
146
147
  /** Single `sourceChannel`, or comma-separated list (e.g. `telegram,weixin`). */
147
148
  channel?: string;
@@ -14,7 +14,7 @@ export { claimContextExtractionRun, finishContextExtractionRun, getContextExtrac
14
14
  export { createCollaborationRule, getCollaborationRule, listCollaborationRules, setCollaborationRuleStatus, type CollaborationRule, } from './collaboration-rule-repository.js';
15
15
  export { createContextEvidence, type ContextEvidence } from './context-evidence-repository.js';
16
16
  export { getUserPerson, getUserPeopleIndexState, listUserPeople, mergeUserPeople, replaceUserPeopleIndex, summarizeUserPeople, updateUserPerson, } from './user-people-repository.js';
17
- export { cancelQueuedSessionInput, claimNextSessionInput, findSessionInput, finishSessionInputRun, getSessionInputState, getSessionInputById, insertSessionInput, listActiveSessionInputExecutions, listActiveSessionInputRuns, mutateQueuedSessionInput, recoverSessionInputState, setSessionInputStatus, type SessionInput, type SessionInputDelivery, type SessionInputPayload, type SessionInputState, type SessionInputStatus, } from './session-input-repository.js';
17
+ export { cancelQueuedSessionInput, claimNextSessionInput, findSessionInput, finishSessionInputRun, getSessionInputState, getSessionInputById, insertSessionInput, listActiveSessionInputExecutions, listActiveSessionInputRuns, listTaskUpdateRunIds, listTaskUpdateTriggers, mutateQueuedSessionInput, recoverSessionInputState, setSessionInputStatus, type SessionInput, type SessionInputDelivery, type SessionInputPayload, type SessionInputState, type TaskUpdateTrigger, type SessionInputStatus, } from './session-input-repository.js';
18
18
  export { consumeClarificationApproval, consumeClarificationResume, createClarificationWait, getActiveClarification, getClarification, getClarificationResumeInput, getClarificationSnapshot, isClarificationSuspended, resolveClarification, supersedeActiveClarification, type CreateClarificationInput, type ResolveClarificationInput, type ResolveClarificationResult, } from './clarification-wait-repository.js';
19
19
  export { replaceLatestSessionTurnAndQueueInput, validateLatestSessionTurnTarget, type ReplaceLatestSessionTurnInput, type ReplaceLatestSessionTurnResult, } from './session-turn-replace-repository.js';
20
20
  export { acknowledgeHomeAttention, isHomeAttentionAcknowledged, type HomeAttentionSubjectKind, } from './home-attention-repository.js';
@@ -17,7 +17,7 @@ import { claimContextExtractionRun, finishContextExtractionRun, getContextExtrac
17
17
  import { createCollaborationRule, getCollaborationRule, init_collaboration_rule_repository, listCollaborationRules, setCollaborationRuleStatus } from "./collaboration-rule-repository.js";
18
18
  import { createContextEvidence, init_context_evidence_repository } from "./context-evidence-repository.js";
19
19
  import { getUserPeopleIndexState, getUserPerson, init_user_people_repository, listUserPeople, mergeUserPeople, replaceUserPeopleIndex, summarizeUserPeople, updateUserPerson } from "./user-people-repository.js";
20
- import { cancelQueuedSessionInput, claimNextSessionInput, findSessionInput, finishSessionInputRun, getSessionInputById, getSessionInputState, init_session_input_repository, insertSessionInput, listActiveSessionInputExecutions, listActiveSessionInputRuns, mutateQueuedSessionInput, recoverSessionInputState, setSessionInputStatus } from "./session-input-repository.js";
20
+ import { cancelQueuedSessionInput, claimNextSessionInput, findSessionInput, finishSessionInputRun, getSessionInputById, getSessionInputState, init_session_input_repository, insertSessionInput, listActiveSessionInputExecutions, listActiveSessionInputRuns, listTaskUpdateRunIds, listTaskUpdateTriggers, mutateQueuedSessionInput, recoverSessionInputState, setSessionInputStatus } from "./session-input-repository.js";
21
21
  import { consumeClarificationApproval, consumeClarificationResume, createClarificationWait, getActiveClarification, getClarification, getClarificationResumeInput, getClarificationSnapshot, init_clarification_wait_repository, isClarificationSuspended, resolveClarification, supersedeActiveClarification } from "./clarification-wait-repository.js";
22
22
  import { buildDefaultSessionMetadata, init_session_metadata } from "./session-metadata.js";
23
23
  import { buildGlobalSessionStats, classifyStoredRow, estimateTokensFromMessages, extractFtsContent, init_row_mappers, metadataToSessionInsert, sessionConfigRowToConfig, sessionRowToMetadata, transcriptEntryRowToStoredRow } from "./row-mappers.js";
@@ -87,4 +87,4 @@ var init_sqlite = __esmMin((() => {
87
87
  }));
88
88
  //#endregion
89
89
  init_sqlite();
90
- export { COMPOSER_INPUT_HISTORY_LIMIT, DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, DatabaseSchemaTooOldError, SCHEMA_META_SCHEMA_VERSION_KEY, SidebarLayoutConflictError, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, acknowledgeHomeAttention, appendCompactionBoundaryIfUnchanged, appendComposerInputHistory, appendConnectorExecutionAudit, appendMediaToAssistantTranscriptEntry, appendTranscriptEntry, applyPendingMigrations, authenticateDeviceAccessToken, bindEndpointPrincipal, buildDefaultSessionMetadata, buildGlobalSessionStats, buildRefreshProofMessage, cancelQueuedSessionInput, claimConnectorWebhookDelivery, claimContextExtractionRun, claimKnowledgeSourceItems, claimNextConnectorLearningJob, claimNextSessionInput, classifyStoredRow, clearComposerInputHistory, clearGatewayIdentityForTest, closeXopcDatabase, completeConnectorWebhookDelivery, completeKnowledgeSourceItemSynthesis, consumeClarificationApproval, consumeClarificationResume, consumeConnectorApproval, countKnowledgeSourceItems, createClarificationWait, createCollaborationRule, createConnectorApproval, createContextEvidence, createDevice, createDevicePairingSetup, createEndpointPrincipal, createObjectLinkRecord, decideConnectorApproval, deleteBrowserTabBinding, deleteBrowserTabBindingsByEndpoint, deleteBrowserTabBindingsByPrincipal, deleteConnectorConnection, deleteConnectorInstallation, deleteEndpointSessionBinding, deleteEndpointSessionBindingsByPrincipal, deleteKnowledgeSourceItems, deleteNoteAgentContextRecord, deleteNoteRecord, deleteObjectLinkRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, enqueueConnectorLearningJob, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findConversationIdByTranscriptId, findLatestAssistantTranscriptEntryId, findSessionInput, finishContextExtractionRun, finishEndpointToolInvocationAudit, finishKnowledgeSyncRun, finishSessionInputRun, getActiveClarification, getActivityEventRecord, getBrowserTabBinding, getBrowserTabBindingById, getCachedConnectorCatalogEntry, getClarification, getClarificationResumeInput, getClarificationSnapshot, getCollaborationRule, getConnectorAccount, getConnectorApproval, getConnectorConnection, getConnectorInstallation, getConnectorSyncPolicy, getConnectorSyncPolicyForConnection, getContextExtractionRun, getCurrentTranscriptId, getDevice, getEndpointPrincipal, getEndpointSessionBinding, getGlobalSessionStats, getInteractionState, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, getNoteAgentContextRecord, getNoteRecord, getOrCreateGatewayIdentity, getSessionConfig, getSessionInputById, getSessionInputState, getSessionMetadata, getSessionTaskPlan, getSidebarLayout, getSqliteDatabase, getUserPeopleIndexState, getUserPerson, getUserTrustPolicy, getXopcDatabase, hasSessionConfig, incrementSessionStatsOnAppend, init_sqlite, insertSessionInput, inspectSchemaMigrationStatus, isClarificationSuspended, isDevicePairingSetupActive, isHomeAttentionAcknowledged, isXopcDatabaseOpen, issueDeviceTokenPair, listActiveSessionInputExecutions, listActiveSessionInputRuns, listActivityRecords, listCachedConnectorCatalogEntries, listCollaborationRules, listCompactionBoundaries, listComposerInputHistory, listConnectorAccounts, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, listConnectorLearningJobs, listConnectorSyncPolicies, listContextExtractionOutputs, listContextExtractionRuns, listDevices, listEndpointPrincipals, listEndpointToolInvocationAuditPage, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, listUserPeople, loadCompactionSourceSnapshot, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, mergeUserPeople, metadataToSessionInsert, mutateQueuedSessionInput, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, pruneBoundedKnowledgeSourceItems, readSchemaVersion, readSchemaVersionForTest, reconcileConnectorAccount, recordActivityEvent, recoverSessionInputState, recoverStaleConnectorLearningJobs, refreshConnectorAccountCurrent, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, replaceLatestSessionTurnAndQueueInput, replaceSidebarLayout, replaceTranscriptRows, replaceUserPeopleIndex, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveClarification, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreBeforeCompactionBoundary, revokeDevice, revokeEndpointPrincipal, rotateDeviceRefreshToken, runSqliteWriteTransaction, searchSessionTranscript, sessionConfigRowToConfig, sessionRowToMetadata, setBrowserTabBinding, setCollaborationRuleStatus, setConnectorLearningPaused, setEndpointSessionBinding, setInteractionState, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, setSessionConfig, setSessionInputStatus, setSessionTaskPlan, setUserTrustPolicy, signGatewayPayload, sortBySidebarLayout, startEndpointToolInvocationAudit, startKnowledgeSyncRun, summarizeUserPeople, supersedeActiveClarification, touchEndpointPrincipal, transcriptEntryRowToStoredRow, updateConnectorLearningJob, updateInteractionStateFromMessage, updateSessionConfig, updateSessionStats, updateUserPerson, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, upsertConnectorSyncPolicy, upsertKnowledgeSourceItems, upsertNoteAgentContextRecord, upsertNoteRecord, validateLatestSessionTurnTarget };
90
+ export { COMPOSER_INPUT_HISTORY_LIMIT, DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, DatabaseSchemaTooOldError, SCHEMA_META_SCHEMA_VERSION_KEY, SidebarLayoutConflictError, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, acknowledgeHomeAttention, appendCompactionBoundaryIfUnchanged, appendComposerInputHistory, appendConnectorExecutionAudit, appendMediaToAssistantTranscriptEntry, appendTranscriptEntry, applyPendingMigrations, authenticateDeviceAccessToken, bindEndpointPrincipal, buildDefaultSessionMetadata, buildGlobalSessionStats, buildRefreshProofMessage, cancelQueuedSessionInput, claimConnectorWebhookDelivery, claimContextExtractionRun, claimKnowledgeSourceItems, claimNextConnectorLearningJob, claimNextSessionInput, classifyStoredRow, clearComposerInputHistory, clearGatewayIdentityForTest, closeXopcDatabase, completeConnectorWebhookDelivery, completeKnowledgeSourceItemSynthesis, consumeClarificationApproval, consumeClarificationResume, consumeConnectorApproval, countKnowledgeSourceItems, createClarificationWait, createCollaborationRule, createConnectorApproval, createContextEvidence, createDevice, createDevicePairingSetup, createEndpointPrincipal, createObjectLinkRecord, decideConnectorApproval, deleteBrowserTabBinding, deleteBrowserTabBindingsByEndpoint, deleteBrowserTabBindingsByPrincipal, deleteConnectorConnection, deleteConnectorInstallation, deleteEndpointSessionBinding, deleteEndpointSessionBindingsByPrincipal, deleteKnowledgeSourceItems, deleteNoteAgentContextRecord, deleteNoteRecord, deleteObjectLinkRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, enqueueConnectorLearningJob, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findConversationIdByTranscriptId, findLatestAssistantTranscriptEntryId, findSessionInput, finishContextExtractionRun, finishEndpointToolInvocationAudit, finishKnowledgeSyncRun, finishSessionInputRun, getActiveClarification, getActivityEventRecord, getBrowserTabBinding, getBrowserTabBindingById, getCachedConnectorCatalogEntry, getClarification, getClarificationResumeInput, getClarificationSnapshot, getCollaborationRule, getConnectorAccount, getConnectorApproval, getConnectorConnection, getConnectorInstallation, getConnectorSyncPolicy, getConnectorSyncPolicyForConnection, getContextExtractionRun, getCurrentTranscriptId, getDevice, getEndpointPrincipal, getEndpointSessionBinding, getGlobalSessionStats, getInteractionState, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, getNoteAgentContextRecord, getNoteRecord, getOrCreateGatewayIdentity, getSessionConfig, getSessionInputById, getSessionInputState, getSessionMetadata, getSessionTaskPlan, getSidebarLayout, getSqliteDatabase, getUserPeopleIndexState, getUserPerson, getUserTrustPolicy, getXopcDatabase, hasSessionConfig, incrementSessionStatsOnAppend, init_sqlite, insertSessionInput, inspectSchemaMigrationStatus, isClarificationSuspended, isDevicePairingSetupActive, isHomeAttentionAcknowledged, isXopcDatabaseOpen, issueDeviceTokenPair, listActiveSessionInputExecutions, listActiveSessionInputRuns, listActivityRecords, listCachedConnectorCatalogEntries, listCollaborationRules, listCompactionBoundaries, listComposerInputHistory, listConnectorAccounts, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, listConnectorLearningJobs, listConnectorSyncPolicies, listContextExtractionOutputs, listContextExtractionRuns, listDevices, listEndpointPrincipals, listEndpointToolInvocationAuditPage, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, listTaskUpdateRunIds, listTaskUpdateTriggers, listUserPeople, loadCompactionSourceSnapshot, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, mergeUserPeople, metadataToSessionInsert, mutateQueuedSessionInput, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, pruneBoundedKnowledgeSourceItems, readSchemaVersion, readSchemaVersionForTest, reconcileConnectorAccount, recordActivityEvent, recoverSessionInputState, recoverStaleConnectorLearningJobs, refreshConnectorAccountCurrent, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, replaceLatestSessionTurnAndQueueInput, replaceSidebarLayout, replaceTranscriptRows, replaceUserPeopleIndex, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveClarification, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreBeforeCompactionBoundary, revokeDevice, revokeEndpointPrincipal, rotateDeviceRefreshToken, runSqliteWriteTransaction, searchSessionTranscript, sessionConfigRowToConfig, sessionRowToMetadata, setBrowserTabBinding, setCollaborationRuleStatus, setConnectorLearningPaused, setEndpointSessionBinding, setInteractionState, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, setSessionConfig, setSessionInputStatus, setSessionTaskPlan, setUserTrustPolicy, signGatewayPayload, sortBySidebarLayout, startEndpointToolInvocationAudit, startKnowledgeSyncRun, summarizeUserPeople, supersedeActiveClarification, touchEndpointPrincipal, transcriptEntryRowToStoredRow, updateConnectorLearningJob, updateInteractionStateFromMessage, updateSessionConfig, updateSessionStats, updateUserPerson, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, upsertConnectorSyncPolicy, upsertKnowledgeSourceItems, upsertNoteAgentContextRecord, upsertNoteRecord, validateLatestSessionTurnTarget };
@@ -0,0 +1,8 @@
1
+ CREATE TABLE IF NOT EXISTS task_origin_links (
2
+ task_id TEXT PRIMARY KEY REFERENCES tasks(task_id) ON DELETE CASCADE,
3
+ conversation_id TEXT NOT NULL REFERENCES sessions(conversation_id) ON DELETE CASCADE,
4
+ created_at INTEGER NOT NULL
5
+ );
6
+
7
+ CREATE INDEX IF NOT EXISTS idx_task_origin_links_conversation
8
+ ON task_origin_links(conversation_id, created_at DESC);
@@ -0,0 +1,32 @@
1
+ CREATE TABLE task_collaboration_entries (
2
+ entry_id TEXT PRIMARY KEY,
3
+ task_id TEXT NOT NULL REFERENCES tasks(task_id) ON DELETE CASCADE,
4
+ task_run_id TEXT REFERENCES task_runs(run_id) ON DELETE SET NULL,
5
+ assignment_epoch INTEGER,
6
+ sequence INTEGER NOT NULL,
7
+ author_kind TEXT NOT NULL CHECK (author_kind IN ('main_agent', 'worker_agent', 'user', 'system')),
8
+ author_id TEXT NOT NULL,
9
+ kind TEXT NOT NULL CHECK (kind IN ('progress', 'question', 'answer', 'instruction', 'ack', 'result', 'failure')),
10
+ body TEXT NOT NULL CHECK (length(body) BETWEEN 1 AND 8000),
11
+ causation_id TEXT,
12
+ idempotency_key TEXT NOT NULL,
13
+ created_at INTEGER NOT NULL,
14
+ UNIQUE (task_id, sequence),
15
+ UNIQUE (task_id, idempotency_key)
16
+ );
17
+
18
+ CREATE INDEX idx_task_collaboration_task_sequence
19
+ ON task_collaboration_entries(task_id, sequence);
20
+
21
+ CREATE TABLE task_collaboration_deliveries (
22
+ entry_id TEXT PRIMARY KEY REFERENCES task_collaboration_entries(entry_id) ON DELETE CASCADE,
23
+ status TEXT NOT NULL CHECK (status IN ('pending', 'delivered', 'confirmed', 'stale')),
24
+ conversation_id TEXT,
25
+ assignment_epoch INTEGER,
26
+ client_message_id TEXT NOT NULL UNIQUE,
27
+ attempts INTEGER NOT NULL DEFAULT 0,
28
+ updated_at INTEGER NOT NULL
29
+ );
30
+
31
+ CREATE INDEX idx_task_collaboration_deliveries_pending
32
+ ON task_collaboration_deliveries(status, updated_at);
@@ -0,0 +1,9 @@
1
+ CREATE TABLE task_main_update_deliveries (
2
+ entry_id TEXT PRIMARY KEY REFERENCES task_collaboration_entries(entry_id) ON DELETE CASCADE,
3
+ conversation_id TEXT NOT NULL REFERENCES sessions(conversation_id) ON DELETE CASCADE,
4
+ status TEXT NOT NULL CHECK (status IN ('pending', 'delivered')),
5
+ updated_at INTEGER NOT NULL
6
+ );
7
+
8
+ CREATE INDEX idx_task_main_update_deliveries_pending
9
+ ON task_main_update_deliveries(status, updated_at);
@@ -0,0 +1,8 @@
1
+ ALTER TABLE task_main_update_deliveries
2
+ ADD COLUMN decision TEXT CHECK (decision IN ('notify', 'silent'));
3
+
4
+ ALTER TABLE task_main_update_deliveries
5
+ ADD COLUMN decision_reason TEXT;
6
+
7
+ ALTER TABLE task_main_update_deliveries
8
+ ADD COLUMN decided_at INTEGER;
@@ -0,0 +1,14 @@
1
+ CREATE TABLE task_main_agent_links (
2
+ task_id TEXT PRIMARY KEY REFERENCES tasks(task_id) ON DELETE CASCADE,
3
+ agent_id TEXT NOT NULL,
4
+ origin_conversation_id TEXT,
5
+ created_at INTEGER NOT NULL
6
+ );
7
+
8
+ CREATE INDEX idx_task_main_agent_links_agent_created
9
+ ON task_main_agent_links(agent_id, created_at DESC);
10
+
11
+ INSERT INTO task_main_agent_links (task_id, agent_id, origin_conversation_id, created_at)
12
+ SELECT origin.task_id, session.agent_id, origin.conversation_id, origin.created_at
13
+ FROM task_origin_links origin
14
+ JOIN sessions session ON session.conversation_id = origin.conversation_id;
@@ -3,7 +3,7 @@ import type { ApplyMigrationsOptions } from './types.js';
3
3
  /** Baseline schema version applied from schema.sql on first open. */
4
4
  export declare const XOPC_DB_BASELINE_SCHEMA_VERSION = 165;
5
5
  /** Latest schema version this release supports (increment when adding migrations). */
6
- export declare const XOPC_DB_SCHEMA_VERSION = 223;
6
+ export declare const XOPC_DB_SCHEMA_VERSION = 228;
7
7
  export declare function resolveMigrationsDir(override?: string): string;
8
8
  /**
9
9
  * Apply sequential SQL migrations from (currentVersion + 1) through targetVersion.
@@ -57,7 +57,7 @@ function applySingleMigration(db, migration, discardOldScenes = false) {
57
57
  */
58
58
  function applyPendingMigrations(db, options = {}) {
59
59
  db.function("xopc_operation_id", () => currentOperationId() ?? null);
60
- const targetVersion = options.targetVersion ?? 223;
60
+ const targetVersion = options.targetVersion ?? 228;
61
61
  let currentVersion = readSchemaVersion(db);
62
62
  if (currentVersion > targetVersion) throw new DatabaseSchemaTooNewError(currentVersion, targetVersion);
63
63
  if (!options.migrationsDir && currentVersion < 165) throw new DatabaseSchemaTooOldError(currentVersion, 165);
@@ -95,7 +95,7 @@ function applyPendingMigrations(db, options = {}) {
95
95
  }
96
96
  /** Inspect schema version without mutating the database. */
97
97
  function inspectSchemaMigrationStatus(db, options = {}) {
98
- const appVersion = options.targetVersion ?? 223;
98
+ const appVersion = options.targetVersion ?? 228;
99
99
  const dbVersion = readSchemaVersion(db);
100
100
  if (dbVersion > appVersion) return {
101
101
  dbVersion,
@@ -137,7 +137,7 @@ var init_runner = __esmMin((() => {
137
137
  init_errors();
138
138
  log = createLogger("Sqlite:Migrations");
139
139
  XOPC_DB_BASELINE_SCHEMA_VERSION = 165;
140
- XOPC_DB_SCHEMA_VERSION = 223;
140
+ XOPC_DB_SCHEMA_VERSION = 228;
141
141
  }));
142
142
  //#endregion
143
143
  init_runner();
@@ -28,7 +28,7 @@ function ensureXopcDatabaseSchema(db, options = {}) {
28
28
  currentVersion = 165;
29
29
  }
30
30
  applyPendingMigrations(db, {
31
- targetVersion: 223,
31
+ targetVersion: 228,
32
32
  databasePath: fresh ? void 0 : options.databasePath
33
33
  });
34
34
  }
@@ -53,6 +53,15 @@ export declare function listActiveSessionInputRuns(): Array<{
53
53
  conversationId: string;
54
54
  runId: string;
55
55
  }>;
56
+ export declare function listTaskUpdateRunIds(conversationId: string): Set<string>;
57
+ export type TaskUpdateTrigger = {
58
+ entryId: string;
59
+ taskId: string;
60
+ taskTitle: string;
61
+ kind: 'progress' | 'question' | 'result' | 'failure';
62
+ };
63
+ /** Safe, user-facing provenance for task update turns; worker text stays on the board. */
64
+ export declare function listTaskUpdateTriggers(conversationId: string): Map<string, TaskUpdateTrigger>;
56
65
  /** Durable active runs with the claimed input metadata needed by runtime policy surfaces. */
57
66
  export declare function listActiveSessionInputExecutions(): Array<{
58
67
  conversationId: string;
@@ -67,6 +67,33 @@ function listActiveSessionInputRuns() {
67
67
  runId: row.active_run_id
68
68
  }));
69
69
  }
70
+ function listTaskUpdateRunIds(conversationId) {
71
+ const rows = getSqliteDatabase().prepare(`SELECT run_id FROM session_inputs
72
+ WHERE conversation_id = ? AND run_id IS NOT NULL
73
+ AND json_extract(origin_json, '$.type') = 'system'
74
+ AND json_extract(origin_json, '$.source') = 'task_update'`).all(conversationId);
75
+ return new Set(rows.map((row) => row.run_id));
76
+ }
77
+ /** Safe, user-facing provenance for task update turns; worker text stays on the board. */
78
+ function listTaskUpdateTriggers(conversationId) {
79
+ const rows = getSqliteDatabase().prepare(`SELECT input.run_id, entry.entry_id, entry.task_id,
80
+ task.title AS task_title, entry.kind
81
+ FROM session_inputs input
82
+ JOIN task_collaboration_entries entry ON entry.entry_id =
83
+ substr(input.client_message_id, length('task-main-update:') + 1, 36)
84
+ JOIN tasks task ON task.task_id = entry.task_id
85
+ WHERE input.conversation_id = ? AND input.run_id IS NOT NULL
86
+ AND input.client_message_id LIKE 'task-main-update:%'
87
+ AND json_extract(input.origin_json, '$.type') = 'system'
88
+ AND json_extract(input.origin_json, '$.source') = 'task_update'
89
+ AND entry.kind IN ('progress', 'question', 'result', 'failure')`).all(conversationId);
90
+ return new Map(rows.map((row) => [row.run_id, {
91
+ entryId: row.entry_id,
92
+ taskId: row.task_id,
93
+ taskTitle: row.task_title,
94
+ kind: row.kind
95
+ }]));
96
+ }
70
97
  /** Durable active runs with the claimed input metadata needed by runtime policy surfaces. */
71
98
  function listActiveSessionInputExecutions() {
72
99
  return getSqliteDatabase().prepare(`SELECT runtime.conversation_id, runtime.active_run_id,
@@ -211,4 +238,4 @@ var init_session_input_repository = __esmMin((() => {
211
238
  }));
212
239
  //#endregion
213
240
  init_session_input_repository();
214
- export { SessionInstanceChangedError, bumpSessionInputRevision, cancelQueuedSessionInput, claimNextSessionInput, findSessionInput, finishSessionInputRun, getSessionInputById, getSessionInputState, init_session_input_repository, insertSessionInput, listActiveSessionInputExecutions, listActiveSessionInputRuns, mutateQueuedSessionInput, recoverSessionInputState, setSessionInputStatus };
241
+ export { SessionInstanceChangedError, bumpSessionInputRevision, cancelQueuedSessionInput, claimNextSessionInput, findSessionInput, finishSessionInputRun, getSessionInputById, getSessionInputState, init_session_input_repository, insertSessionInput, listActiveSessionInputExecutions, listActiveSessionInputRuns, listTaskUpdateRunIds, listTaskUpdateTriggers, mutateQueuedSessionInput, recoverSessionInputState, setSessionInputStatus };