@xopcai/xopc 0.0.333 → 0.0.334

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 (273) hide show
  1. package/dist/browser-ext/dist/assets/{auth-DocRzRlS.js → auth-Cjj5SuoT.js} +49 -39
  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 +240 -36
  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-DiI2O7lC.js → agent-avatar-dicebear-B73q7mlz.js} +1 -1
  8. package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-CVp3J969.js → agent-defaults-settings-panel-B9L2YIXz.js} +1 -1
  9. package/dist/gateway/static/root/assets/{agent-plugin-dialog-CacyndrS.js → agent-plugin-dialog-COOjsvea.js} +1 -1
  10. package/dist/gateway/static/root/assets/agents-CCj1JnLu.js +70 -0
  11. package/dist/gateway/static/root/assets/agents-admin-api-Cuqi5xZn.js +2 -0
  12. package/dist/gateway/static/root/assets/{app-link-C6gA5Nck.js → app-link-DRL0YnPs.js} +1 -1
  13. package/dist/gateway/static/root/assets/{app-management-settings-panel-BcszTlqr.js → app-management-settings-panel-CckioKud.js} +1 -1
  14. package/dist/gateway/static/root/assets/{appearance-settings-B1XPe8qz.js → appearance-settings-DDiPIr_Q.js} +1 -1
  15. package/dist/gateway/static/root/assets/apps-page-Azqy8vfo.js +1 -0
  16. package/dist/gateway/static/root/assets/{archive-plugin-MjUsJcNb.js → archive-plugin-Dtyr0RhX.js} +1 -1
  17. package/dist/gateway/static/root/assets/attachment-load-qjPpQzYY.js +1 -0
  18. package/dist/gateway/static/root/assets/attachment-utils-core-BIOUBrpT.js +1 -0
  19. package/dist/gateway/static/root/assets/{automations-page-Dsjivdxs.js → automations-page-g3SrFkTC.js} +1 -1
  20. package/dist/gateway/static/root/assets/automations-workspace-B0nW2nZD.js +7 -0
  21. package/dist/gateway/static/root/assets/binary-plugins-BwKQVxsU.js +2 -0
  22. package/dist/gateway/static/root/assets/{block-editor-Bx0uXbJP.js → block-editor-DD9d5pCt.js} +29 -29
  23. package/dist/gateway/static/root/assets/{browser-automation-inputs-1ZIPGDeq.js → browser-automation-inputs-D2gNdS3e.js} +1 -1
  24. package/dist/gateway/static/root/assets/{browser-automations-page-CCjYipHc.js → browser-automations-page-BKqqJR7P.js} +2 -2
  25. package/dist/gateway/static/root/assets/browser-settings-page-BZH9bZbk.js +3 -0
  26. package/dist/gateway/static/root/assets/capabilities-CHk4RZl4.js +1 -0
  27. package/dist/gateway/static/root/assets/capabilities-page-CfWaVH-6.js +2 -0
  28. package/dist/gateway/static/root/assets/capabilities-settings-panel-C5FcWsSe.js +8 -0
  29. package/dist/gateway/static/root/assets/capability-header-actions-Bd66yEOa.js +1 -0
  30. package/dist/gateway/static/root/assets/channels-DIU5Gq4o.js +1 -0
  31. package/dist/gateway/static/root/assets/{chat-terminal-dock-Fnum_IEm.js → chat-terminal-dock-B0nPDJyj.js} +2 -2
  32. package/dist/gateway/static/root/assets/{computer-settings-page-DI1zfCTA.js → computer-settings-page-D7PxxaoG.js} +1 -1
  33. package/dist/gateway/static/root/assets/{connector-service-page-CiGDAubm.js → connector-service-page-BZH4SeQg.js} +1 -1
  34. package/dist/gateway/static/root/assets/connectors-page-BC81R_fz.js +2 -0
  35. package/dist/gateway/static/root/assets/{turn-outcome-D0SnyZ3Z.js → constants-Co2_smKQ.js} +1 -1
  36. package/dist/gateway/static/root/assets/date-picker-CDEVYjXI.js +1 -0
  37. package/dist/gateway/static/root/assets/{dependency-picker-DpD3xaEB.js → dependency-picker-AInmpSwC.js} +1 -1
  38. package/dist/gateway/static/root/assets/{desktop-pet-CCoDxKqh.js → desktop-pet-Sjgnlq8M.js} +1 -1
  39. package/dist/gateway/static/root/assets/{desktop-pet-settings-GxndKfCx.js → desktop-pet-settings-BWn0rrhr.js} +1 -1
  40. package/dist/gateway/static/root/assets/{device-pairing-wizard-B71w3ptm.js → device-pairing-wizard-BtW837_d.js} +1 -1
  41. package/dist/gateway/static/root/assets/{directory-picker-path-field-CUzjJvjs.js → directory-picker-path-field-2CpmDx_D.js} +1 -1
  42. package/dist/gateway/static/root/assets/dist-CKkafhaS.js +1 -0
  43. package/dist/gateway/static/root/assets/dist-io9jFpN72.js +1 -0
  44. package/dist/gateway/static/root/assets/{extension-debug-page-BtDY8ntX.js → extension-debug-page-WWJFj9Z5.js} +1 -1
  45. package/dist/gateway/static/root/assets/{extension-page-D9_XF-XC.js → extension-page-DL00dFRr.js} +1 -1
  46. package/dist/gateway/static/root/assets/{extension-settings-page-CjhUFAaC.js → extension-settings-page-CN-agjPk.js} +1 -1
  47. package/dist/gateway/static/root/assets/{files-BK6enEvD.js → files-Bw4SBGdM.js} +1 -1
  48. package/dist/gateway/static/root/assets/gateway-realtime-Ciq4c7KT.js +1 -0
  49. package/dist/gateway/static/root/assets/gateway-realtime-store-BHeHN26R.js +1 -0
  50. package/dist/gateway/static/root/assets/gateway-settings-4oD6fhAm.js +1 -0
  51. package/dist/gateway/static/root/assets/home-page-nEpyJUBY.js +1 -0
  52. package/dist/gateway/static/root/assets/{imports-page-BEtq5BRU.js → imports-page-BivdeiQ5.js} +1 -1
  53. package/dist/gateway/static/root/assets/index-BioG1pRD.js +106 -0
  54. package/dist/gateway/static/root/assets/index-DbLEkdNg.css +1 -0
  55. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-JUYY_18v.js → keyboard-shortcuts-settings-B_8AJTFr.js} +1 -1
  56. package/dist/gateway/static/root/assets/local-app-workbench-page-CRtZQrmz.js +1 -0
  57. package/dist/gateway/static/root/assets/{local-apps-page-BlYESNqz.js → local-apps-page-DclxpoqR.js} +1 -1
  58. package/dist/gateway/static/root/assets/{local-apps-Bpja8nC6.js → local-apps-yys1VChX.js} +1 -1
  59. package/dist/gateway/static/root/assets/local-session-drafts-DkolHmyp.js +1 -0
  60. package/dist/gateway/static/root/assets/logs-page-DX8TxkRl.js +2 -0
  61. package/dist/gateway/static/root/assets/{management-settings-c4krhYU7.js → management-settings-5WFufZ4g.js} +1 -1
  62. package/dist/gateway/static/root/assets/{markdown-view-BEeXMfDw.js → markdown-view-DYJnwlDr.js} +1 -1
  63. package/dist/gateway/static/root/assets/media-plugins-DlJDvwLK.js +1 -0
  64. package/dist/gateway/static/root/assets/note-detail-panel-GF5Q9Fqy.js +5 -0
  65. package/dist/gateway/static/root/assets/notes-page-E8o4_Ty9.js +8 -0
  66. package/dist/gateway/static/root/assets/page-context-capture-button-CiCmfRTw.js +1 -0
  67. package/dist/gateway/static/root/assets/{page-tabs-BhYBCqls.js → page-tabs-Cwp3fGVM.js} +1 -1
  68. package/dist/gateway/static/root/assets/popover-select-0p9PIHRy.js +1 -0
  69. package/dist/gateway/static/root/assets/{preview-open-alternatives-CP8agNlc.js → preview-open-alternatives-DJ5xqGeu.js} +1 -1
  70. package/dist/gateway/static/root/assets/{product-delivery-bv3z8Xkh.js → product-delivery-BAks11S4.js} +1 -1
  71. package/dist/gateway/static/root/assets/{product-open-page-CU7fRhfT.js → product-open-page-CcGwNePw.js} +1 -1
  72. package/dist/gateway/static/root/assets/project-detail-page-6hhRBkmC.js +1 -0
  73. package/dist/gateway/static/root/assets/projects-page-DUOzRaFI.js +1 -0
  74. package/dist/gateway/static/root/assets/remote-access-hub-BWpWUXiE.js +1 -0
  75. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-Czvzsuj_.js → runtime-tools-settings-panel-C6eDCNHz.js} +2 -2
  76. package/dist/gateway/static/root/assets/scenes-page-pF7Lmqnk.js +2 -0
  77. package/dist/gateway/static/root/assets/{schema-form-B9Ni5O93.js → schema-form-D8W8q_ez.js} +1 -1
  78. package/dist/gateway/static/root/assets/{schemas-88fK3zzl.js → schemas-CObaziC7.js} +3 -3
  79. package/dist/gateway/static/root/assets/session-api-BAyUr97V.js +1 -0
  80. package/dist/gateway/static/root/assets/session-manager-BAy2sR2Q.js +16 -0
  81. package/dist/gateway/static/root/assets/sessions-page-BDKDqqf9.js +1 -0
  82. package/dist/gateway/static/root/assets/settings-advanced-gate-C9cJWlAq.js +1 -0
  83. package/dist/gateway/static/root/assets/{settings-form-section-jquf1P7n.js → settings-form-section-B0cAj0nq.js} +1 -1
  84. package/dist/gateway/static/root/assets/{settings-page-DPomsvba.js → settings-page-DZVVTFxs.js} +1 -1
  85. package/dist/gateway/static/root/assets/setup-status-panel-DZCPVx9c.js +1 -0
  86. package/dist/gateway/static/root/assets/share-preview-page-BkPNyV8c.js +2 -0
  87. package/dist/gateway/static/root/assets/shares-settings-Bqlv5JBi.js +1 -0
  88. package/dist/gateway/static/root/assets/{skill-api-Bu7-3w-L.js → skill-api-C0dufzQC.js} +1 -1
  89. package/dist/gateway/static/root/assets/skill-reload-api-3JF2OTBz.js +1 -0
  90. package/dist/gateway/static/root/assets/skills-page-DB4lR4om.js +2 -0
  91. package/dist/gateway/static/root/assets/{system-settings-panel-BwFR0Uci.js → system-settings-panel-xjrlhdUz.js} +1 -1
  92. package/dist/gateway/static/root/assets/task-detail-page-CB6M7wSs.js +1 -0
  93. package/dist/gateway/static/root/assets/{tasks-CDR_RVbQ.js → tasks-QQJXsiER.js} +1 -1
  94. package/dist/gateway/static/root/assets/{tunnel-api-PfucxMP3.js → tunnel-api--68MQEWM.js} +1 -1
  95. package/dist/gateway/static/root/assets/{usage-page-t_zdQHcy.js → usage-page-OLZ00eqD.js} +1 -1
  96. package/dist/gateway/static/root/assets/{use-autosave-DLyy2wHz.js → use-autosave-DsnHYpTv.js} +1 -1
  97. package/dist/gateway/static/root/assets/user-model-page-CoePFpHD.js +2 -0
  98. package/dist/gateway/static/root/assets/{voice-api-key-field-CQDY5EBK.js → voice-api-key-field-CvIXutQp.js} +1 -1
  99. package/dist/gateway/static/root/assets/{work-discovery-overlay-CJzqJ47I.js → work-discovery-overlay-By5_7MLR.js} +1 -1
  100. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-sCOk-esV.js → workflow-run-setup-panel-HSMDxDXV.js} +2 -2
  101. package/dist/gateway/static/root/assets/workflows-page-DElQ47Da.js +6 -0
  102. package/dist/gateway/static/root/index.html +24 -18
  103. package/dist/package.js +1 -1
  104. package/dist/packages/gateway-contract/src/capabilities.js +14 -2
  105. package/dist/packages/gateway-contract/src/index.js +6 -2
  106. package/dist/packages/gateway-contract/src/session-command-rejection.js +19 -0
  107. package/dist/packages/gateway-contract/src/session-input-command.js +109 -0
  108. package/dist/packages/gateway-contract/src/sessions.js +0 -6
  109. package/dist/src/agent/agent-manager.js +6 -6
  110. package/dist/src/agent/background-review/run-background-review.js +2 -2
  111. package/dist/src/agent/bootstrap/filter-bootstrap-files.js +1 -1
  112. package/dist/src/agent/embedded/model-runtime.js +1 -1
  113. package/dist/src/agent/embedded/run-for-session.js +1 -1
  114. package/dist/src/agent/external-tools/endpoint-provider.js +2 -2
  115. package/dist/src/agent/external-tools/gateway-tools.js +2 -1
  116. package/dist/src/agent/image/tool-model-config.js +2 -2
  117. package/dist/src/agent/service/process-direct-streaming.js +4 -2
  118. package/dist/src/agent/service.js +4 -4
  119. package/dist/src/agent/session/session-inspector.js +1 -1
  120. package/dist/src/agent/tasks/task-judge-service.js +3 -3
  121. package/dist/src/agent/tools/xopc-use-tool.js +1 -1
  122. package/dist/src/agent-catalog/capabilities.js +2 -2
  123. package/dist/src/ai-assist/text-assist.js +1 -1
  124. package/dist/src/auth/credentials.js +1 -1
  125. package/dist/src/auth/oauth-provider-lock.js +1 -1
  126. package/dist/src/auth/sync-provider-auth.js +1 -1
  127. package/dist/src/automations/capabilities/drafts.js +1 -1
  128. package/dist/src/automations/capabilities/write.d.ts +11 -11
  129. package/dist/src/automations/domain/validation.d.ts +11 -11
  130. package/dist/src/automations/draft/automation-draft-validator.d.ts +1 -1
  131. package/dist/src/bootstrap/application-state.js +1 -1
  132. package/dist/src/capabilities/runtime/dispatcher.js +1 -1
  133. package/dist/src/capabilities/runtime/product.js +1 -1
  134. package/dist/src/channels/attachments/voice-stt-webchat.js +1 -1
  135. package/dist/src/chat-commands/agent-edit.js +1 -1
  136. package/dist/src/chat-commands/builtins/config.js +1 -1
  137. package/dist/src/cli/commands/agent.js +1 -1
  138. package/dist/src/cli/commands/agents.js +1 -1
  139. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  140. package/dist/src/cli/commands/doctor/checks/provider-auth.js +2 -2
  141. package/dist/src/cli/commands/models.js +1 -1
  142. package/dist/src/cli/commands/onboard/model.js +2 -2
  143. package/dist/src/cli/utils/init-workspace-core.js +1 -1
  144. package/dist/src/computer/runtime.js +1 -1
  145. package/dist/src/config/index.js +5 -5
  146. package/dist/src/config/loader.js +2 -2
  147. package/dist/src/config/models-json.js +1 -1
  148. package/dist/src/config/schema.js +1 -1
  149. package/dist/src/connectors/cli/authorization.d.ts +1 -1
  150. package/dist/src/connectors/cli/store.d.ts +1 -1
  151. package/dist/src/connectors/connection-candidates.js +53 -15
  152. package/dist/src/connectors/connection-capabilities.js +5 -1
  153. package/dist/src/execution-environments/local-worktree-manager.js +10 -1
  154. package/dist/src/execution-environments/session-environment-service.d.ts +3 -0
  155. package/dist/src/execution-environments/session-environment-service.js +28 -4
  156. package/dist/src/extensions/agent-plugins/validation.js +1 -1
  157. package/dist/src/gateway/agents-admin.js +2 -2
  158. package/dist/src/gateway/file-path-classifier.js +1 -1
  159. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  160. package/dist/src/gateway/hono/routes/agent-stream.js +6 -2
  161. package/dist/src/gateway/hono/routes/browser-session.js +4 -2
  162. package/dist/src/gateway/hono/routes/commands-skills.js +9 -2
  163. package/dist/src/gateway/hono/routes/config-patch/misc.js +2 -2
  164. package/dist/src/gateway/hono/routes/files.js +3 -0
  165. package/dist/src/gateway/hono/routes/models.js +17 -1
  166. package/dist/src/gateway/hono/routes/notes.js +2 -4
  167. package/dist/src/gateway/hono/routes/projects.js +2 -2
  168. package/dist/src/gateway/hono/routes/session-command-handler.d.ts +5 -0
  169. package/dist/src/gateway/hono/routes/session-command-handler.js +189 -0
  170. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +14 -2
  171. package/dist/src/gateway/hono/routes/session-input-handler.js +2 -2
  172. package/dist/src/gateway/hono/routes/sessions.js +0 -168
  173. package/dist/src/gateway/hono/routes/tasks.js +1 -1
  174. package/dist/src/gateway/hono/routes/tui.js +2 -1
  175. package/dist/src/gateway/hono/routes/voice.js +9 -0
  176. package/dist/src/gateway/image-generation-setup.js +2 -2
  177. package/dist/src/gateway/lock.js +1 -1
  178. package/dist/src/gateway/resolve-webchat-session-key.d.ts +1 -1
  179. package/dist/src/gateway/resolve-webchat-session-key.js +2 -2
  180. package/dist/src/gateway/service/run-gateway-agent.js +1 -1
  181. package/dist/src/gateway/service/session-command-service.d.ts +34 -0
  182. package/dist/src/gateway/service/session-command-service.js +81 -0
  183. package/dist/src/gateway/service/session-input-coordinator.d.ts +21 -0
  184. package/dist/src/gateway/service/session-input-coordinator.js +41 -0
  185. package/dist/src/gateway/service/session-preparation-worker.d.ts +15 -0
  186. package/dist/src/gateway/service/session-preparation-worker.js +125 -0
  187. package/dist/src/gateway/service.d.ts +24 -0
  188. package/dist/src/gateway/service.js +27 -14
  189. package/dist/src/gateway/side-chat/promotion-service.js +0 -1
  190. package/dist/src/gateway/xopc-cloud-capability-setup.js +1 -1
  191. package/dist/src/home-intelligence/generator.js +1 -1
  192. package/dist/src/home-intelligence/host.js +1 -1
  193. package/dist/src/local-apps/service.js +1 -1
  194. package/dist/src/mcp/channel-bridge.js +12 -2
  195. package/dist/src/notes/capabilities/read.js +2 -2
  196. package/dist/src/notes/service.d.ts +4 -1
  197. package/dist/src/notes/service.js +11 -8
  198. package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
  199. package/dist/src/providers/index.js +2 -2
  200. package/dist/src/providers/model-catalog-persistence.js +1 -1
  201. package/dist/src/providers/register-runtime-providers.js +1 -1
  202. package/dist/src/session/store.js +0 -1
  203. package/dist/src/storage/sqlite/migrations/223_session_creation_receipts.sql +59 -0
  204. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  205. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  206. package/dist/src/storage/sqlite/schema.js +1 -1
  207. package/dist/src/storage/sqlite/session-creation-repository.d.ts +50 -0
  208. package/dist/src/storage/sqlite/session-creation-repository.js +166 -0
  209. package/dist/src/storage/sqlite/session-input-repository.d.ts +4 -2
  210. package/dist/src/storage/sqlite/session-input-repository.js +7 -1
  211. package/dist/src/tasks/capabilities/read.js +2 -2
  212. package/dist/src/tui/backends/embedded-backend.d.ts +5 -0
  213. package/dist/src/tui/backends/embedded-backend.js +266 -20
  214. package/dist/src/tui/backends/embedded-drafts.d.ts +22 -0
  215. package/dist/src/tui/backends/embedded-drafts.js +53 -0
  216. package/dist/src/tui/backends/gateway-realtime-backend.d.ts +10 -0
  217. package/dist/src/tui/backends/gateway-realtime-backend.js +214 -33
  218. package/dist/src/tui/tui-backend.d.ts +1 -1
  219. package/dist/src/tui/tui-chat-input-state.d.ts +1 -0
  220. package/dist/src/tui/tui-commands.js +1 -1
  221. package/dist/src/tui/tui-session-format.js +0 -1
  222. package/dist/src/tui/tui-startup-resources.d.ts +1 -0
  223. package/dist/src/tui/tui-startup-resources.js +2 -2
  224. package/dist/src/tui/tui-types.d.ts +0 -1
  225. package/dist/src/tui/tui.js +69 -29
  226. package/dist/src/voice/realtime/persona-context.js +1 -1
  227. package/dist/src/work-discovery/service.js +3 -6
  228. package/dist/src/workflows/service/workflow-run-service.js +1 -1
  229. package/package.json +2 -2
  230. package/dist/gateway/static/root/assets/agents-DXYZSuUV.js +0 -70
  231. package/dist/gateway/static/root/assets/apps-page-ZqANbUZv.js +0 -1
  232. package/dist/gateway/static/root/assets/attachment-load-DHa-BI9a.js +0 -1
  233. package/dist/gateway/static/root/assets/automations-workspace-B37vs5tk.js +0 -7
  234. package/dist/gateway/static/root/assets/binary-plugins-DQYcuBHP.js +0 -2
  235. package/dist/gateway/static/root/assets/browser-settings-page-CSv4rvmx.js +0 -3
  236. package/dist/gateway/static/root/assets/capabilities-BnO9LV7U.js +0 -1
  237. package/dist/gateway/static/root/assets/capabilities-page-BfvDvIY1.js +0 -2
  238. package/dist/gateway/static/root/assets/capabilities-settings-panel-CoW7-ESq.js +0 -8
  239. package/dist/gateway/static/root/assets/capability-header-actions-D_hbWRRF.js +0 -1
  240. package/dist/gateway/static/root/assets/channels-BhMaRh1x.js +0 -1
  241. package/dist/gateway/static/root/assets/connectors-page-Ono0Pha1.js +0 -2
  242. package/dist/gateway/static/root/assets/conversation-identity-Cw0n9uzK.js +0 -1
  243. package/dist/gateway/static/root/assets/date-picker-D-JhzZyW.js +0 -1
  244. package/dist/gateway/static/root/assets/dist-3h6cXXhT.js +0 -1
  245. package/dist/gateway/static/root/assets/dist-Che_jiQF.js +0 -1
  246. package/dist/gateway/static/root/assets/gateway-settings-BWaCnwT1.js +0 -1
  247. package/dist/gateway/static/root/assets/home-page-BTjGLngn.js +0 -1
  248. package/dist/gateway/static/root/assets/index-DHL16aYZ.js +0 -121
  249. package/dist/gateway/static/root/assets/index-N1e6PDwx.css +0 -1
  250. package/dist/gateway/static/root/assets/local-app-workbench-page-uI7mtoVz.js +0 -1
  251. package/dist/gateway/static/root/assets/logs-page-BbLQreeN.js +0 -2
  252. package/dist/gateway/static/root/assets/media-plugins-DEFN1I73.js +0 -1
  253. package/dist/gateway/static/root/assets/note-detail-panel--09xGxyE.js +0 -5
  254. package/dist/gateway/static/root/assets/notes-page-DsxcVBXF.js +0 -8
  255. package/dist/gateway/static/root/assets/page-context-capture-button-D43aVpCj.js +0 -1
  256. package/dist/gateway/static/root/assets/popover-select-DcsFzD_i.js +0 -1
  257. package/dist/gateway/static/root/assets/project-detail-page-U-EdDfAW.js +0 -1
  258. package/dist/gateway/static/root/assets/projects-page-DUOKZLt7.js +0 -1
  259. package/dist/gateway/static/root/assets/remote-access-hub-fVPQe5YS.js +0 -1
  260. package/dist/gateway/static/root/assets/scenes-page-C0-WHOY3.js +0 -2
  261. package/dist/gateway/static/root/assets/sessions-page-DdXvW09N.js +0 -1
  262. package/dist/gateway/static/root/assets/settings-advanced-gate-BtF83fBY.js +0 -1
  263. package/dist/gateway/static/root/assets/setup-status-panel-BvVlqpHf.js +0 -1
  264. package/dist/gateway/static/root/assets/share-preview-page-b9DI0N1J.js +0 -2
  265. package/dist/gateway/static/root/assets/shares-settings-R_qwc4DN.js +0 -1
  266. package/dist/gateway/static/root/assets/skill-reload-api-CNJAQ_e-.js +0 -1
  267. package/dist/gateway/static/root/assets/skills-page-D7XPEQu_.js +0 -2
  268. package/dist/gateway/static/root/assets/task-detail-page-PFjGW2g1.js +0 -1
  269. package/dist/gateway/static/root/assets/user-model-page-OyfPVfB9.js +0 -2
  270. package/dist/gateway/static/root/assets/workflows-page-DYBGjN7C.js +0 -6
  271. package/dist/src/tui/tui-empty-session-cleanup.d.ts +0 -9
  272. package/dist/src/tui/tui-empty-session-cleanup.js +0 -19
  273. /package/dist/gateway/static/root/assets/{dist-CI_fqRk-.js → dist-CI_fqRk-2.js} +0 -0
@@ -1,6 +1,6 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
- import { getOAuthProviderDefinition, init_registry } from "../auth/oauth/registry.js";
3
2
  import { getModelCatalogStore, init_model_catalog_store } from "./model-catalog-store.js";
3
+ import { getOAuthProviderDefinition, init_registry } from "../auth/oauth/registry.js";
4
4
  import { XOPC_CLOUD_PROVIDER_ID, init_xopc_cloud_config, resolveXopcModelRouterUrl } from "./xopc-cloud-config.js";
5
5
  //#region src/providers/register-runtime-providers.ts
6
6
  function registerRuntimeProvider(modelRuntime, source) {
@@ -794,7 +794,6 @@ var SessionStore = class {
794
794
  customData: {
795
795
  ...sourceMetadata.customData ?? {},
796
796
  ...options.targetMetadata.customData ?? {},
797
- genericNewChatShell: false,
798
797
  forkedFromConversationId: sourceKey,
799
798
  forkedFromTranscriptId: sourceMetadata.transcriptId,
800
799
  forkedFromSessionName: sourceMetadata.name,
@@ -0,0 +1,59 @@
1
+ UPDATE sessions SET custom_data_json=json_remove(custom_data_json, '$.genericNewChatShell')
2
+ WHERE json_type(custom_data_json, '$.genericNewChatShell') IS NOT NULL;
3
+
4
+ CREATE TABLE session_input_receipts (
5
+ conversation_id TEXT NOT NULL,
6
+ client_message_id TEXT NOT NULL,
7
+ principal_id TEXT NOT NULL,
8
+ request_hash TEXT NOT NULL,
9
+ input_id TEXT,
10
+ transcript_id TEXT NOT NULL,
11
+ accepted_at INTEGER NOT NULL,
12
+ PRIMARY KEY (conversation_id, client_message_id)
13
+ );
14
+
15
+ CREATE TABLE session_tombstones (
16
+ conversation_id TEXT PRIMARY KEY,
17
+ deleted_at INTEGER NOT NULL
18
+ );
19
+
20
+ CREATE TABLE session_preparation_retries (
21
+ conversation_id TEXT NOT NULL,
22
+ idempotency_key TEXT NOT NULL,
23
+ operation_id TEXT NOT NULL,
24
+ expected_revision INTEGER NOT NULL,
25
+ principal_id TEXT NOT NULL,
26
+ PRIMARY KEY (conversation_id, idempotency_key)
27
+ );
28
+
29
+ CREATE TABLE session_preparations (
30
+ conversation_id TEXT PRIMARY KEY REFERENCES sessions(conversation_id) ON DELETE CASCADE,
31
+ operation_id TEXT NOT NULL UNIQUE,
32
+ creation_json TEXT NOT NULL CHECK(json_valid(creation_json)),
33
+ state TEXT NOT NULL CHECK(state IN ('preparing', 'ready', 'preparation_failed')),
34
+ environment_id TEXT NOT NULL,
35
+ base_commit TEXT,
36
+ revision INTEGER NOT NULL DEFAULT 1,
37
+ lease_until INTEGER NOT NULL DEFAULT 0,
38
+ last_error TEXT,
39
+ created_at INTEGER NOT NULL,
40
+ updated_at INTEGER NOT NULL
41
+ );
42
+
43
+ CREATE TABLE session_preparation_cleanup (
44
+ environment_id TEXT PRIMARY KEY,
45
+ conversation_id TEXT NOT NULL,
46
+ not_before INTEGER NOT NULL,
47
+ last_error TEXT
48
+ );
49
+
50
+ CREATE TRIGGER session_creation_tombstone BEFORE DELETE ON sessions BEGIN
51
+ INSERT INTO session_tombstones(conversation_id, deleted_at)
52
+ VALUES (OLD.conversation_id, CAST(unixepoch('subsec') * 1000 AS INTEGER))
53
+ ON CONFLICT(conversation_id) DO NOTHING;
54
+ INSERT INTO session_preparation_cleanup(environment_id, conversation_id, not_before)
55
+ SELECT environment_id, conversation_id, max(lease_until, CAST(unixepoch('subsec') * 1000 AS INTEGER)) + 5000
56
+ FROM session_preparations WHERE conversation_id=OLD.conversation_id
57
+ AND json_extract(creation_json, '$.execution.mode')='managed_worktree'
58
+ ON CONFLICT(environment_id) DO NOTHING;
59
+ END;
@@ -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 = 222;
6
+ export declare const XOPC_DB_SCHEMA_VERSION = 223;
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 ?? 222;
60
+ const targetVersion = options.targetVersion ?? 223;
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 ?? 222;
98
+ const appVersion = options.targetVersion ?? 223;
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 = 222;
140
+ XOPC_DB_SCHEMA_VERSION = 223;
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: 222,
31
+ targetVersion: 223,
32
32
  databasePath: fresh ? void 0 : options.databasePath
33
33
  });
34
34
  }
@@ -0,0 +1,50 @@
1
+ import { type SessionCreation, type SessionInputCommand, type SessionMaterializeCommand, type SessionPreparationState } from '@xopcai/gateway-contract';
2
+ import type { SessionAgentConfig } from '../../session/config-types.js';
3
+ import { insertSessionInput } from './session-input-repository.js';
4
+ export declare class SessionCommandError extends Error {
5
+ readonly code: 'IDEMPOTENCY_CONFLICT' | 'CONVERSATION_EXISTS' | 'SESSION_DELETED' | 'FORBIDDEN' | 'SESSION_CHANGED' | 'CONFIG_CHANGED' | 'NOT_FOUND' | 'BAD_REQUEST' | 'SESSION_BUSY' | 'QUEUE_FULL';
6
+ constructor(code: 'IDEMPOTENCY_CONFLICT' | 'CONVERSATION_EXISTS' | 'SESSION_DELETED' | 'FORBIDDEN' | 'SESSION_CHANGED' | 'CONFIG_CHANGED' | 'NOT_FOUND' | 'BAD_REQUEST' | 'SESSION_BUSY' | 'QUEUE_FULL', message: string);
7
+ }
8
+ export type SessionInputReceipt = {
9
+ conversationId: string;
10
+ clientMessageId: string;
11
+ principalId: string;
12
+ requestHash: string;
13
+ inputId: string | null;
14
+ transcriptId: string;
15
+ acceptedAt: number;
16
+ };
17
+ export type SessionPreparation = {
18
+ conversationId: string;
19
+ operationId: string;
20
+ creation: SessionCreation;
21
+ state: SessionPreparationState;
22
+ environmentId: string;
23
+ baseCommit: string | null;
24
+ revision: number;
25
+ leaseUntil: number;
26
+ lastError: string | null;
27
+ };
28
+ export declare function sessionCommandHash(command: SessionInputCommand | SessionMaterializeCommand): string;
29
+ export declare function isConversationDeleted(conversationId: string): boolean;
30
+ export declare function getSessionInputReceipt(conversationId: string, clientMessageId: string, principalId: string): SessionInputReceipt | undefined;
31
+ export declare function matchSessionInputReceipt(conversationId: string, clientMessageId: string, principalId: string, hash: string): SessionInputReceipt | undefined;
32
+ export declare function getSessionPreparation(conversationId: string): SessionPreparation | undefined;
33
+ /** Commit the identity, configuration, input and replay receipt together. All preparation happens before entry. */
34
+ export declare function acceptSessionCommand(input: {
35
+ conversationId: string;
36
+ principalId: string;
37
+ command: SessionInputCommand | SessionMaterializeCommand;
38
+ preparedInput?: Omit<Parameters<typeof insertSessionInput>[0], 'conversationId' | 'id' | 'clientMessageId' | 'expectedTranscriptId'>;
39
+ config?: SessionAgentConfig;
40
+ sourceChannel?: 'webchat' | 'tui';
41
+ attachProject?: (conversationId: string, projectId: string) => void;
42
+ }): SessionInputReceipt;
43
+ export declare function claimSessionPreparation(conversationId: string, now?: number): SessionPreparation | undefined;
44
+ export declare function finishSessionPreparation(operation: SessionPreparation, error?: string): boolean;
45
+ export declare function pendingSessionPreparations(): string[];
46
+ export declare function retrySessionPreparation(conversationId: string, principalId: string, input: {
47
+ operationId: string;
48
+ expectedRevision: number;
49
+ idempotencyKey: string;
50
+ }): SessionPreparation;
@@ -0,0 +1,166 @@
1
+ import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "./transaction.js";
2
+ import { sessionCommandIdentity } from "../../../packages/gateway-contract/src/session-input-command.js";
3
+ import { init_src } from "../../../packages/gateway-contract/src/index.js";
4
+ import { init_session_input_repository, insertSessionInput } from "./session-input-repository.js";
5
+ import { init_clarification_wait_repository, supersedeActiveClarification } from "./clarification-wait-repository.js";
6
+ import { init_connection_wait_repository, invalidateConnectionResumeIntent } from "./connection-wait-repository.js";
7
+ import { getSessionMetadata } from "./session-read-repository.js";
8
+ import { init_session_repository } from "./session-repository.js";
9
+ import { init_config_repository, setSessionConfig } from "./config-repository.js";
10
+ import { createConversation, init_conversation_repository } from "./conversation-repository.js";
11
+ import { createHash, randomUUID } from "node:crypto";
12
+ //#region src/storage/sqlite/session-creation-repository.ts
13
+ init_src();
14
+ init_conversation_repository();
15
+ init_config_repository();
16
+ init_session_repository();
17
+ init_session_input_repository();
18
+ init_connection_wait_repository();
19
+ init_clarification_wait_repository();
20
+ init_transaction();
21
+ var SessionCommandError = class extends Error {
22
+ constructor(code, message) {
23
+ super(message);
24
+ this.code = code;
25
+ }
26
+ };
27
+ function sessionCommandHash(command) {
28
+ return createHash("sha256").update(sessionCommandIdentity(command)).digest("hex");
29
+ }
30
+ function isConversationDeleted(conversationId) {
31
+ return Boolean(getSqliteDatabase().prepare("SELECT 1 FROM session_tombstones WHERE conversation_id=?").get(conversationId));
32
+ }
33
+ function getSessionInputReceipt(conversationId, clientMessageId, principalId) {
34
+ const row = getSqliteDatabase().prepare(`SELECT conversation_id AS conversationId, client_message_id AS clientMessageId,
35
+ principal_id AS principalId, request_hash AS requestHash, input_id AS inputId,
36
+ transcript_id AS transcriptId, accepted_at AS acceptedAt FROM session_input_receipts
37
+ WHERE conversation_id=? AND client_message_id=?`).get(conversationId, clientMessageId);
38
+ if (row && row.principalId !== principalId) throw new SessionCommandError("FORBIDDEN", "Input belongs to another principal");
39
+ return row;
40
+ }
41
+ function matchSessionInputReceipt(conversationId, clientMessageId, principalId, hash) {
42
+ const receipt = getSessionInputReceipt(conversationId, clientMessageId, principalId);
43
+ if (receipt && receipt.requestHash !== hash) throw new SessionCommandError("IDEMPOTENCY_CONFLICT", "Input identity was reused with different content");
44
+ if (isConversationDeleted(conversationId)) throw new SessionCommandError("SESSION_DELETED", "Conversation was deleted");
45
+ return receipt;
46
+ }
47
+ function getSessionPreparation(conversationId) {
48
+ const row = getSqliteDatabase().prepare(`SELECT conversation_id AS conversationId, operation_id AS operationId,
49
+ creation_json AS creationJson, state, environment_id AS environmentId, base_commit AS baseCommit,
50
+ revision, lease_until AS leaseUntil, last_error AS lastError FROM session_preparations WHERE conversation_id=?`).get(conversationId);
51
+ if (!row) return void 0;
52
+ const { creationJson, ...rest } = row;
53
+ return {
54
+ ...rest,
55
+ creation: JSON.parse(creationJson)
56
+ };
57
+ }
58
+ /** Commit the identity, configuration, input and replay receipt together. All preparation happens before entry. */
59
+ function acceptSessionCommand(input) {
60
+ return runSqliteWriteTransaction((db) => {
61
+ const { conversationId, command, principalId } = input;
62
+ const clientMessageId = "commandId" in command ? command.commandId : command.clientMessageId;
63
+ const requestHash = sessionCommandHash(command);
64
+ const existing = matchSessionInputReceipt(conversationId, clientMessageId, principalId, requestHash);
65
+ if (existing) return existing;
66
+ if ("input" in command !== Boolean(input.preparedInput)) throw new SessionCommandError("BAD_REQUEST", "Prepared input is required for input commands only");
67
+ const pending = db.prepare(`SELECT count(*) AS count FROM session_inputs WHERE conversation_id=?
68
+ AND status IN ('queued','running','injecting','interrupted')`).get(conversationId);
69
+ if (input.preparedInput && pending.count >= 10) throw new SessionCommandError("QUEUE_FULL", "Input queue is full");
70
+ const creation = "creation" in command ? command.creation : void 0;
71
+ let session = getSessionMetadata(conversationId);
72
+ if (creation) {
73
+ if (session) throw new SessionCommandError("CONVERSATION_EXISTS", "Conversation already exists");
74
+ session = createConversation({
75
+ agentId: creation.agentId,
76
+ sourceChannel: input.sourceChannel ?? "webchat",
77
+ sourceChatId: conversationId,
78
+ sessionType: "chat",
79
+ hiddenFromSessionList: !input.preparedInput,
80
+ routing: {
81
+ agentId: creation.agentId,
82
+ source: input.sourceChannel ?? "webchat",
83
+ accountId: "default",
84
+ peerKind: "direct",
85
+ peerId: conversationId
86
+ }
87
+ }, "", conversationId);
88
+ setSessionConfig(conversationId, input.config ?? {
89
+ modelOverride: creation.model,
90
+ fixedModel: true,
91
+ thinkingLevel: creation.thinkingLevel,
92
+ userContextMode: creation.temporary ? "temporary" : "enabled"
93
+ }, "");
94
+ if (creation.projectId) {
95
+ if (!input.attachProject) throw new Error("Project attachment is required");
96
+ input.attachProject(conversationId, creation.projectId);
97
+ }
98
+ if (creation.execution) db.prepare(`INSERT INTO session_preparations
99
+ (conversation_id,operation_id,creation_json,state,environment_id,created_at,updated_at)
100
+ VALUES (?,?,?,'preparing',?,?,?)`).run(conversationId, randomUUID(), JSON.stringify(creation), randomUUID(), Date.now(), Date.now());
101
+ } else {
102
+ if (!session) throw new SessionCommandError("NOT_FOUND", "Conversation not found");
103
+ if (!("kind" in command) || command.kind !== "append" || command.expectedTranscriptId !== session.transcriptId) throw new SessionCommandError("SESSION_CHANGED", "Conversation transcript changed");
104
+ if ((db.prepare("SELECT updated_at FROM session_config WHERE conversation_id=?").get(conversationId)?.updated_at ?? 0) !== command.configVersion) throw new SessionCommandError("CONFIG_CHANGED", "Model configuration changed");
105
+ }
106
+ const transcriptId = session.transcriptId;
107
+ const inputId = input.preparedInput ? randomUUID() : null;
108
+ if (input.preparedInput && inputId) insertSessionInput({
109
+ ...input.preparedInput,
110
+ conversationId,
111
+ id: inputId,
112
+ clientMessageId,
113
+ expectedTranscriptId: transcriptId
114
+ });
115
+ if (inputId) {
116
+ invalidateConnectionResumeIntent(conversationId);
117
+ supersedeActiveClarification(conversationId);
118
+ }
119
+ const receipt = {
120
+ conversationId,
121
+ clientMessageId,
122
+ principalId,
123
+ requestHash,
124
+ inputId,
125
+ transcriptId,
126
+ acceptedAt: Date.now()
127
+ };
128
+ db.prepare(`INSERT INTO session_input_receipts
129
+ (conversation_id,client_message_id,principal_id,request_hash,input_id,transcript_id,accepted_at)
130
+ VALUES (?,?,?,?,?,?,?)`).run(conversationId, clientMessageId, principalId, requestHash, inputId, transcriptId, receipt.acceptedAt);
131
+ return receipt;
132
+ });
133
+ }
134
+ function claimSessionPreparation(conversationId, now = Date.now()) {
135
+ return runSqliteWriteTransaction((db) => {
136
+ return db.prepare(`UPDATE session_preparations SET lease_until=?,revision=revision+1,updated_at=?
137
+ WHERE conversation_id=? AND state='preparing' AND lease_until<=?`).run(now + 6e4, now, conversationId, now).changes ? getSessionPreparation(conversationId) : void 0;
138
+ });
139
+ }
140
+ function finishSessionPreparation(operation, error) {
141
+ return runSqliteWriteTransaction((db) => Boolean(db.prepare(`UPDATE session_preparations
142
+ SET state=?,last_error=?,lease_until=0,revision=revision+1,updated_at=?
143
+ WHERE conversation_id=? AND operation_id=? AND revision=? AND state='preparing'`).run(error ? "preparation_failed" : "ready", error ?? null, Date.now(), operation.conversationId, operation.operationId, operation.revision).changes));
144
+ }
145
+ function pendingSessionPreparations() {
146
+ return getSqliteDatabase().prepare("SELECT conversation_id FROM session_preparations WHERE state='preparing' AND lease_until<=?").all(Date.now()).map((row) => row.conversation_id);
147
+ }
148
+ function retrySessionPreparation(conversationId, principalId, input) {
149
+ return runSqliteWriteTransaction((db) => {
150
+ if (isConversationDeleted(conversationId)) throw new SessionCommandError("SESSION_DELETED", "Conversation was deleted");
151
+ const operation = getSessionPreparation(conversationId);
152
+ if (!operation) throw new SessionCommandError("NOT_FOUND", "Preparation not found");
153
+ if (db.prepare("SELECT principal_id FROM session_input_receipts WHERE conversation_id=? ORDER BY accepted_at LIMIT 1").get(conversationId)?.principal_id !== principalId) throw new SessionCommandError("FORBIDDEN", "Preparation belongs to another principal");
154
+ const previous = db.prepare("SELECT * FROM session_preparation_retries WHERE conversation_id=? AND idempotency_key=?").get(conversationId, input.idempotencyKey);
155
+ if (previous) {
156
+ if (previous.operation_id !== input.operationId || previous.expected_revision !== input.expectedRevision || previous.principal_id !== principalId) throw new SessionCommandError("IDEMPOTENCY_CONFLICT", "Retry identity was reused");
157
+ return operation;
158
+ }
159
+ if (!db.prepare(`UPDATE session_preparations SET state='preparing', revision=revision+1,
160
+ lease_until=0,last_error=NULL,updated_at=? WHERE conversation_id=? AND operation_id=? AND revision=? AND state='preparation_failed'`).run(Date.now(), conversationId, input.operationId, input.expectedRevision).changes) throw new SessionCommandError("SESSION_CHANGED", "Preparation state changed");
161
+ db.prepare("INSERT INTO session_preparation_retries VALUES (?,?,?,?,?)").run(conversationId, input.idempotencyKey, input.operationId, input.expectedRevision, principalId);
162
+ return getSessionPreparation(conversationId);
163
+ });
164
+ }
165
+ //#endregion
166
+ export { SessionCommandError, acceptSessionCommand, claimSessionPreparation, finishSessionPreparation, getSessionInputReceipt, getSessionPreparation, isConversationDeleted, matchSessionInputReceipt, pendingSessionPreparations, retrySessionPreparation, sessionCommandHash };
@@ -1,5 +1,6 @@
1
1
  import { getSqliteDatabase } from './transaction.js';
2
2
  import { type TurnOrigin } from '@xopcai/endpoint-tools-protocol';
3
+ import type { SessionPreparationView } from '@xopcai/gateway-contract';
3
4
  import type { AgentSourceContext, SourceContextRefSummary } from '../../agent/source-context/types.js';
4
5
  export type SessionInputDelivery = 'next' | 'steer';
5
6
  export type SessionInputStatus = 'queued' | 'running' | 'injecting' | 'completed' | 'cancelled' | 'failed' | 'interrupted' | 'suspended';
@@ -38,6 +39,7 @@ export type SessionInput = {
38
39
  updatedAtMs: number;
39
40
  };
40
41
  export type SessionInputState = {
42
+ preparation?: SessionPreparationView;
41
43
  conversationId: string;
42
44
  revision: number;
43
45
  activeRunId?: string;
@@ -83,8 +85,8 @@ export declare function insertSessionInput(input: {
83
85
  origin: TurnOrigin;
84
86
  targetRunId?: string;
85
87
  }): SessionInput;
86
- export declare function claimNextSessionInput(conversationId: string, runId: string): SessionInput | undefined;
87
- export declare function finishSessionInputRun(conversationId: string, runId: string, status: 'completed' | 'failed' | 'cancelled' | 'suspended', error?: string): boolean;
88
+ export declare function claimNextSessionInput(conversationId: string, runId: string, expectedInputId?: string): SessionInput | undefined;
89
+ export declare function finishSessionInputRun(conversationId: string, runId: string, status: 'completed' | 'failed' | 'cancelled' | 'suspended' | 'interrupted', error?: string): boolean;
88
90
  export declare function setSessionInputStatus(id: string, status: SessionInputStatus, patch?: {
89
91
  effectiveDelivery?: SessionInputDelivery;
90
92
  targetRunId?: string | null;
@@ -42,12 +42,14 @@ function bumpSessionInputRevision(db, conversationId) {
42
42
  }
43
43
  function getSessionInputState(conversationId) {
44
44
  const db = getSqliteDatabase();
45
+ const preparation = db.prepare("SELECT operation_id AS operationId, revision, state, last_error AS lastError FROM session_preparations WHERE conversation_id=?").get(conversationId);
45
46
  const runtime = db.prepare(`SELECT revision, active_run_id, active_input_id
46
47
  FROM session_input_runtime WHERE conversation_id = ?`).get(conversationId);
47
48
  const rows = db.prepare(`${SELECT_INPUTS} WHERE conversation_id = ? AND status IN
48
49
  ('queued','running','injecting','interrupted') ORDER BY position, created_at_ms, id`).all(conversationId);
49
50
  return {
50
51
  conversationId,
52
+ ...preparation ? { preparation } : {},
51
53
  revision: runtime?.revision ?? 0,
52
54
  activeRunId: runtime?.active_run_id ?? void 0,
53
55
  activeInputId: runtime?.active_input_id ?? void 0,
@@ -107,8 +109,11 @@ function insertSessionInput(input) {
107
109
  return mapInput(db.prepare(`${SELECT_INPUTS} WHERE id = ?`).get(input.id));
108
110
  });
109
111
  }
110
- function claimNextSessionInput(conversationId, runId) {
112
+ function claimNextSessionInput(conversationId, runId, expectedInputId) {
111
113
  return runSqliteWriteTransaction((db) => {
114
+ const preparation = db.prepare("SELECT state FROM session_preparations WHERE conversation_id=?").get(conversationId);
115
+ if (preparation && preparation.state !== "ready") return void 0;
116
+ if (db.prepare("SELECT 1 FROM session_tombstones WHERE conversation_id=?").get(conversationId)) return void 0;
112
117
  ensureRuntime(db, conversationId);
113
118
  if (db.prepare(`SELECT active_run_id FROM session_input_runtime WHERE conversation_id = ?`).get(conversationId).active_run_id) return void 0;
114
119
  if (db.prepare(`UPDATE session_inputs SET status = 'interrupted', error = 'Session changed before delivery',
@@ -117,6 +122,7 @@ function claimNextSessionInput(conversationId, runId) {
117
122
  const row = db.prepare(`${SELECT_INPUTS} WHERE conversation_id = ? AND effective_delivery = 'next'
118
123
  AND status = 'queued' ORDER BY position, created_at_ms, id LIMIT 1`).get(conversationId);
119
124
  if (!row) return void 0;
125
+ if (expectedInputId && row.id !== expectedInputId) return void 0;
120
126
  const now = Date.now();
121
127
  db.prepare(`UPDATE session_inputs SET status = 'running', run_id = ?, version = version + 1,
122
128
  updated_at_ms = ? WHERE id = ?`).run(runId, now, row.id);
@@ -2,10 +2,10 @@ import { ProductReadContracts } from "../../../packages/gateway-contract/src/cap
2
2
  import { init_src } from "../../../packages/gateway-contract/src/index.js";
3
3
  import { TaskRepository, init_task_repository } from "../task-repository.js";
4
4
  import { TaskRunRepository, init_task_run_repository } from "../task-run-repository.js";
5
- import { TaskConversationRepository } from "../task-conversation-repository.js";
6
- import { TaskReadModelProjector } from "../task-read-model-projector.js";
7
5
  import { CapabilityError } from "../../capabilities/runtime/errors.js";
8
6
  import { defineReadCapability } from "../../capabilities/runtime/dispatcher.js";
7
+ import { TaskConversationRepository } from "../task-conversation-repository.js";
8
+ import { TaskReadModelProjector } from "../task-read-model-projector.js";
9
9
  import { TaskContextRepository } from "../task-context-repository.js";
10
10
  import { TaskDependencyService } from "../task-dependency-service.js";
11
11
  import { TaskValueMetricsService } from "../task-value-metrics-service.js";
@@ -29,12 +29,15 @@ export declare class EmbeddedBackend implements TuiBackend {
29
29
  private running;
30
30
  private chatAbort;
31
31
  private readonly chatInputStates;
32
+ private readonly drafts;
33
+ private readonly inputStateRevisions;
32
34
  onEvent?: (evt: TuiEvent) => void;
33
35
  onConnected?: () => void;
34
36
  onDisconnected?: (reason: string) => void;
35
37
  constructor(opts?: EmbeddedBackendOptions);
36
38
  get connectionLabel(): string;
37
39
  getComposerInputHistory(): Promise<TuiComposerHistoryItem[]>;
40
+ getComposerDraftDirectory(): Promise<string>;
38
41
  recordComposerInputHistory(text: string): Promise<TuiComposerHistoryItem>;
39
42
  start(): void;
40
43
  private ensureAgent;
@@ -97,6 +100,7 @@ export declare class EmbeddedBackend implements TuiBackend {
97
100
  private appendPendingChatInput;
98
101
  private consumePendingChatInput;
99
102
  private publishChatInputState;
103
+ private sequenceInputState;
100
104
  private replaceEmbeddedQueue;
101
105
  loadHistory(opts: {
102
106
  conversationId: string;
@@ -130,6 +134,7 @@ export declare class EmbeddedBackend implements TuiBackend {
130
134
  ok: boolean;
131
135
  }>;
132
136
  createConversation(agentId: string, conversationId?: string): Promise<string>;
137
+ private materializeDraft;
133
138
  getSessionInfo(conversationId: string): Promise<SessionInfo>;
134
139
  listModels(): Promise<TuiModelChoice[]>;
135
140
  refreshModels(): Promise<void>;