@xopcai/xopc 0.0.333 → 0.0.335

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 (294) 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-DtmNsTNI.js} +1 -1
  8. package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-CVp3J969.js → agent-defaults-settings-panel-AvGo9fao.js} +1 -1
  9. package/dist/gateway/static/root/assets/{agent-plugin-dialog-CacyndrS.js → agent-plugin-dialog-DZCh4_E1.js} +1 -1
  10. package/dist/gateway/static/root/assets/agents-Drt1vHf6.js +70 -0
  11. package/dist/gateway/static/root/assets/agents-admin-api-C82B1W9Z.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-IKZm5_s2.js} +1 -1
  14. package/dist/gateway/static/root/assets/{appearance-settings-B1XPe8qz.js → appearance-settings-DKWGkrVW.js} +1 -1
  15. package/dist/gateway/static/root/assets/apps-page-DY6Q7TMZ.js +1 -0
  16. package/dist/gateway/static/root/assets/{archive-plugin-MjUsJcNb.js → archive-plugin-DXGAt0G7.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-DzqfYcqe.js} +1 -1
  20. package/dist/gateway/static/root/assets/automations-workspace-qMpqvBz1.js +7 -0
  21. package/dist/gateway/static/root/assets/binary-plugins-Cy2FLsPv.js +2 -0
  22. package/dist/gateway/static/root/assets/{block-editor-Bx0uXbJP.js → block-editor-BqSpSNnv.js} +29 -29
  23. package/dist/gateway/static/root/assets/{browser-automation-inputs-1ZIPGDeq.js → browser-automation-inputs-CLOq1KtH.js} +1 -1
  24. package/dist/gateway/static/root/assets/{browser-automations-page-CCjYipHc.js → browser-automations-page-BEeyiVEw.js} +2 -2
  25. package/dist/gateway/static/root/assets/browser-settings-page-D6SygxnY.js +3 -0
  26. package/dist/gateway/static/root/assets/capabilities-BfHgt4uk.js +1 -0
  27. package/dist/gateway/static/root/assets/capabilities-page-C9Od0WN-.js +2 -0
  28. package/dist/gateway/static/root/assets/capabilities-settings-panel-6HAVkNE4.js +8 -0
  29. package/dist/gateway/static/root/assets/capability-header-actions-CwcT7mjE.js +1 -0
  30. package/dist/gateway/static/root/assets/channels-D5HNBMLS.js +1 -0
  31. package/dist/gateway/static/root/assets/{chat-terminal-dock-Fnum_IEm.js → chat-terminal-dock-BsxTfU1T.js} +2 -2
  32. package/dist/gateway/static/root/assets/{computer-settings-page-DI1zfCTA.js → computer-settings-page-CH01h8yI.js} +1 -1
  33. package/dist/gateway/static/root/assets/{connector-service-page-CiGDAubm.js → connector-service-page-CTi8iaOn.js} +1 -1
  34. package/dist/gateway/static/root/assets/connectors-page-C3GhbPPg.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-DTEOeiC4.js +1 -0
  37. package/dist/gateway/static/root/assets/{dependency-picker-DpD3xaEB.js → dependency-picker-DFA0RZ02.js} +1 -1
  38. package/dist/gateway/static/root/assets/{desktop-pet-CCoDxKqh.js → desktop-pet-Txr49_Zi.js} +1 -1
  39. package/dist/gateway/static/root/assets/{desktop-pet-settings-GxndKfCx.js → desktop-pet-settings-Coi0DUai.js} +1 -1
  40. package/dist/gateway/static/root/assets/{device-pairing-wizard-B71w3ptm.js → device-pairing-wizard-OPY8ujCN.js} +1 -1
  41. package/dist/gateway/static/root/assets/{directory-picker-path-field-CUzjJvjs.js → directory-picker-path-field-B1ckH4hn.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-6e8BCEb6.js} +1 -1
  45. package/dist/gateway/static/root/assets/{extension-page-D9_XF-XC.js → extension-page-DgaFykYf.js} +1 -1
  46. package/dist/gateway/static/root/assets/{extension-settings-page-CjhUFAaC.js → extension-settings-page-B-TyR9GM.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-config-swr-CgIjCxM8.js → gateway-config-swr-Hn1vj6uI.js} +1 -1
  49. package/dist/gateway/static/root/assets/gateway-realtime-CGjSxzj6.js +1 -0
  50. package/dist/gateway/static/root/assets/gateway-realtime-store-DytaaEu8.js +1 -0
  51. package/dist/gateway/static/root/assets/gateway-settings-CtjGyqB2.js +1 -0
  52. package/dist/gateway/static/root/assets/{gateway-startup-retry-i-1lTrwY.js → gateway-startup-retry-CtTVgB7_.js} +1 -1
  53. package/dist/gateway/static/root/assets/home-page-Cs5fPXcJ.js +1 -0
  54. package/dist/gateway/static/root/assets/{image-generation-api-gilc-u7M.js → image-generation-api-DBA-bdEM.js} +1 -1
  55. package/dist/gateway/static/root/assets/{imports-page-BEtq5BRU.js → imports-page-C72wCY44.js} +1 -1
  56. package/dist/gateway/static/root/assets/index-BkSp_1Il.js +106 -0
  57. package/dist/gateway/static/root/assets/index-DbLEkdNg.css +1 -0
  58. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-JUYY_18v.js → keyboard-shortcuts-settings-D1nzw6zI.js} +1 -1
  59. package/dist/gateway/static/root/assets/local-app-workbench-page-DqB0hGrZ.js +1 -0
  60. package/dist/gateway/static/root/assets/{local-apps-page-BlYESNqz.js → local-apps-page-D4FX0Ptx.js} +1 -1
  61. package/dist/gateway/static/root/assets/{local-apps-Bpja8nC6.js → local-apps-yys1VChX.js} +1 -1
  62. package/dist/gateway/static/root/assets/local-session-drafts-Byxxogdc.js +1 -0
  63. package/dist/gateway/static/root/assets/{locale-store-BY30D6tg.js → locale-store-7F4l6DRV.js} +1 -1
  64. package/dist/gateway/static/root/assets/logs-page-CcWD_-zy.js +2 -0
  65. package/dist/gateway/static/root/assets/{management-settings-c4krhYU7.js → management-settings-L9YGzLaz.js} +1 -1
  66. package/dist/gateway/static/root/assets/{markdown-view-BEeXMfDw.js → markdown-view-bxpOryax.js} +1 -1
  67. package/dist/gateway/static/root/assets/media-plugins-DqsiYyAz.js +1 -0
  68. package/dist/gateway/static/root/assets/{messages-_6IXbP2u.js → messages-DsUnS7rn.js} +2 -2
  69. package/dist/gateway/static/root/assets/note-detail-panel-DwK9Ndw1.js +5 -0
  70. package/dist/gateway/static/root/assets/notes-page-D2FvAV9x.js +8 -0
  71. package/dist/gateway/static/root/assets/page-context-capture-button-CeWnFomm.js +1 -0
  72. package/dist/gateway/static/root/assets/{page-tabs-BhYBCqls.js → page-tabs-B90ywILw.js} +1 -1
  73. package/dist/gateway/static/root/assets/popover-select-0p9PIHRy.js +1 -0
  74. package/dist/gateway/static/root/assets/{preview-open-alternatives-CP8agNlc.js → preview-open-alternatives-CwuY-FIE.js} +1 -1
  75. package/dist/gateway/static/root/assets/{product-delivery-bv3z8Xkh.js → product-delivery-BAks11S4.js} +1 -1
  76. package/dist/gateway/static/root/assets/{product-open-page-CU7fRhfT.js → product-open-page-CUcJOCAz.js} +1 -1
  77. package/dist/gateway/static/root/assets/project-detail-page-Blo9-zcq.js +1 -0
  78. package/dist/gateway/static/root/assets/projects-page-C9rh1U9Z.js +1 -0
  79. package/dist/gateway/static/root/assets/{registry-api-BvVx0G1o.js → registry-api-DU915Prn.js} +1 -1
  80. package/dist/gateway/static/root/assets/remote-access-hub-Cw2Beq7s.js +1 -0
  81. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-Czvzsuj_.js → runtime-tools-settings-panel-Cj8LnZRV.js} +2 -2
  82. package/dist/gateway/static/root/assets/scenes-page-BZd4VZBP.js +2 -0
  83. package/dist/gateway/static/root/assets/{schema-form-B9Ni5O93.js → schema-form-CNbrdYAu.js} +1 -1
  84. package/dist/gateway/static/root/assets/{schemas-88fK3zzl.js → schemas-CObaziC7.js} +3 -3
  85. package/dist/gateway/static/root/assets/session-api-C7i3UFhq.js +1 -0
  86. package/dist/gateway/static/root/assets/session-manager-DAck_U0C.js +16 -0
  87. package/dist/gateway/static/root/assets/sessions-page-BKt3Cd0a.js +1 -0
  88. package/dist/gateway/static/root/assets/settings-advanced-gate-BToasX5M.js +1 -0
  89. package/dist/gateway/static/root/assets/{settings-form-section-jquf1P7n.js → settings-form-section-u6ZXo3oJ.js} +1 -1
  90. package/dist/gateway/static/root/assets/{settings-page-DPomsvba.js → settings-page-gXacaOIv.js} +1 -1
  91. package/dist/gateway/static/root/assets/setup-status-panel-qKaz5drv.js +1 -0
  92. package/dist/gateway/static/root/assets/share-preview-page-DdkQ-B5M.js +2 -0
  93. package/dist/gateway/static/root/assets/shares-settings-BwFn5CYE.js +1 -0
  94. package/dist/gateway/static/root/assets/{skill-api-Bu7-3w-L.js → skill-api-Cf3_ZQOb.js} +1 -1
  95. package/dist/gateway/static/root/assets/skill-reload-api-CdNp1N-Y.js +1 -0
  96. package/dist/gateway/static/root/assets/skills-page-fKPvwSpa.js +2 -0
  97. package/dist/gateway/static/root/assets/{system-settings-panel-BwFR0Uci.js → system-settings-panel-CO3l1jdd.js} +1 -1
  98. package/dist/gateway/static/root/assets/task-detail-page-zClWGuT5.js +1 -0
  99. package/dist/gateway/static/root/assets/{tasks-CDR_RVbQ.js → tasks-QQJXsiER.js} +1 -1
  100. package/dist/gateway/static/root/assets/{tunnel-api-PfucxMP3.js → tunnel-api-Dw6DW1j5.js} +1 -1
  101. package/dist/gateway/static/root/assets/{usage-page-t_zdQHcy.js → usage-page-QP_8nuHU.js} +1 -1
  102. package/dist/gateway/static/root/assets/{use-autosave-DLyy2wHz.js → use-autosave-ZwnXUpG4.js} +1 -1
  103. package/dist/gateway/static/root/assets/user-model-page-B72PRFAI.js +2 -0
  104. package/dist/gateway/static/root/assets/{voice-api-key-field-CQDY5EBK.js → voice-api-key-field-CbIxN5SC.js} +1 -1
  105. package/dist/gateway/static/root/assets/{voice-config-api-Bwy3Al3J.js → voice-config-api-LKFent6f.js} +1 -1
  106. package/dist/gateway/static/root/assets/{work-discovery-overlay-CJzqJ47I.js → work-discovery-overlay-WIGHfEL3.js} +1 -1
  107. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-sCOk-esV.js → workflow-run-setup-panel-Bk0Jhdeq.js} +2 -2
  108. package/dist/gateway/static/root/assets/workflows-page-BC385JPr.js +6 -0
  109. package/dist/gateway/static/root/index.html +27 -21
  110. package/dist/package.js +1 -1
  111. package/dist/packages/gateway-contract/src/capabilities.js +14 -2
  112. package/dist/packages/gateway-contract/src/index.js +6 -2
  113. package/dist/packages/gateway-contract/src/session-command-rejection.js +19 -0
  114. package/dist/packages/gateway-contract/src/session-input-command.js +109 -0
  115. package/dist/packages/gateway-contract/src/sessions.js +11 -6
  116. package/dist/src/agent/agent-instance-gateway.d.ts +0 -2
  117. package/dist/src/agent/agent-manager.d.ts +0 -2
  118. package/dist/src/agent/agent-manager.js +5 -36
  119. package/dist/src/agent/background-review/run-background-review.d.ts +0 -7
  120. package/dist/src/agent/background-review/run-background-review.js +3 -23
  121. package/dist/src/agent/bootstrap/filter-bootstrap-files.js +1 -1
  122. package/dist/src/agent/embedded/model-runtime.js +1 -1
  123. package/dist/src/agent/embedded/run-for-session.js +1 -1
  124. package/dist/src/agent/external-tools/endpoint-provider.js +2 -2
  125. package/dist/src/agent/external-tools/gateway-tools.js +2 -1
  126. package/dist/src/agent/image/tool-model-config.js +2 -2
  127. package/dist/src/agent/orchestration/agent-orchestrator.js +0 -3
  128. package/dist/src/agent/service/direct-turn-helpers.js +0 -3
  129. package/dist/src/agent/service/process-direct-streaming.js +4 -2
  130. package/dist/src/agent/service.js +4 -4
  131. package/dist/src/agent/session/session-inspector.js +1 -1
  132. package/dist/src/agent/tasks/task-judge-service.js +3 -3
  133. package/dist/src/agent/tools/xopc-use-tool.js +1 -1
  134. package/dist/src/agent-catalog/capabilities.js +2 -2
  135. package/dist/src/ai-assist/text-assist.js +1 -1
  136. package/dist/src/auth/credentials.js +1 -1
  137. package/dist/src/auth/oauth-provider-lock.js +1 -1
  138. package/dist/src/auth/sync-provider-auth.js +1 -1
  139. package/dist/src/automations/capabilities/drafts.js +1 -1
  140. package/dist/src/automations/capabilities/write.d.ts +11 -11
  141. package/dist/src/automations/domain/validation.d.ts +11 -11
  142. package/dist/src/automations/draft/automation-draft-validator.d.ts +1 -1
  143. package/dist/src/automations/events/event-dispatcher.d.ts +10 -3
  144. package/dist/src/automations/service/automation-service.js +0 -1
  145. package/dist/src/bootstrap/application-state.js +1 -1
  146. package/dist/src/capabilities/runtime/dispatcher.js +1 -1
  147. package/dist/src/capabilities/runtime/product.js +1 -1
  148. package/dist/src/channels/attachments/voice-stt-webchat.js +1 -1
  149. package/dist/src/chat-commands/agent-edit.js +1 -1
  150. package/dist/src/chat-commands/builtins/config.js +1 -1
  151. package/dist/src/cli/commands/agent.js +1 -1
  152. package/dist/src/cli/commands/agents.js +1 -1
  153. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  154. package/dist/src/cli/commands/doctor/checks/provider-auth.js +2 -2
  155. package/dist/src/cli/commands/models.js +1 -1
  156. package/dist/src/cli/commands/onboard/model.js +2 -2
  157. package/dist/src/cli/utils/init-workspace-core.js +1 -1
  158. package/dist/src/computer/runtime.js +1 -1
  159. package/dist/src/config/index.js +5 -5
  160. package/dist/src/config/loader.js +2 -2
  161. package/dist/src/config/models-json.js +1 -1
  162. package/dist/src/config/schema.js +1 -1
  163. package/dist/src/connectors/cli/authorization.d.ts +1 -1
  164. package/dist/src/connectors/cli/store.d.ts +1 -1
  165. package/dist/src/connectors/connection-candidates.js +53 -15
  166. package/dist/src/connectors/connection-capabilities.js +5 -1
  167. package/dist/src/execution-environments/local-worktree-manager.js +10 -1
  168. package/dist/src/execution-environments/session-environment-service.d.ts +3 -0
  169. package/dist/src/execution-environments/session-environment-service.js +28 -4
  170. package/dist/src/extensions/agent-plugins/validation.js +1 -1
  171. package/dist/src/gateway/agents-admin.js +2 -2
  172. package/dist/src/gateway/file-path-classifier.js +1 -1
  173. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  174. package/dist/src/gateway/hono/routes/agent-stream.js +6 -2
  175. package/dist/src/gateway/hono/routes/browser-session.js +4 -2
  176. package/dist/src/gateway/hono/routes/commands-skills.js +9 -2
  177. package/dist/src/gateway/hono/routes/config-patch/misc.js +2 -2
  178. package/dist/src/gateway/hono/routes/files.js +3 -0
  179. package/dist/src/gateway/hono/routes/models.js +17 -1
  180. package/dist/src/gateway/hono/routes/notes.js +2 -4
  181. package/dist/src/gateway/hono/routes/projects.js +2 -2
  182. package/dist/src/gateway/hono/routes/session-command-handler.d.ts +5 -0
  183. package/dist/src/gateway/hono/routes/session-command-handler.js +189 -0
  184. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +14 -2
  185. package/dist/src/gateway/hono/routes/session-input-handler.js +2 -2
  186. package/dist/src/gateway/hono/routes/sessions.js +15 -169
  187. package/dist/src/gateway/hono/routes/tasks.js +1 -1
  188. package/dist/src/gateway/hono/routes/tui.js +2 -1
  189. package/dist/src/gateway/hono/routes/voice.js +9 -0
  190. package/dist/src/gateway/image-generation-setup.js +2 -2
  191. package/dist/src/gateway/lock.js +1 -1
  192. package/dist/src/gateway/resolve-webchat-session-key.d.ts +1 -1
  193. package/dist/src/gateway/resolve-webchat-session-key.js +2 -2
  194. package/dist/src/gateway/service/run-gateway-agent.js +1 -1
  195. package/dist/src/gateway/service/session-command-service.d.ts +34 -0
  196. package/dist/src/gateway/service/session-command-service.js +81 -0
  197. package/dist/src/gateway/service/session-input-coordinator.d.ts +21 -0
  198. package/dist/src/gateway/service/session-input-coordinator.js +41 -0
  199. package/dist/src/gateway/service/session-preparation-worker.d.ts +22 -0
  200. package/dist/src/gateway/service/session-preparation-worker.js +125 -0
  201. package/dist/src/gateway/service.d.ts +24 -0
  202. package/dist/src/gateway/service.js +29 -16
  203. package/dist/src/gateway/side-chat/promotion-service.js +0 -1
  204. package/dist/src/gateway/xopc-cloud-capability-setup.js +1 -1
  205. package/dist/src/home-intelligence/generator.d.ts +8 -1
  206. package/dist/src/home-intelligence/generator.js +26 -15
  207. package/dist/src/home-intelligence/host.d.ts +8 -1
  208. package/dist/src/home-intelligence/host.js +82 -8
  209. package/dist/src/home-intelligence/repository.d.ts +5 -1
  210. package/dist/src/home-intelligence/repository.js +16 -9
  211. package/dist/src/home-intelligence/snapshot.js +4 -4
  212. package/dist/src/local-apps/service.js +1 -1
  213. package/dist/src/mcp/channel-bridge.js +12 -2
  214. package/dist/src/notes/capabilities/read.js +2 -2
  215. package/dist/src/notes/service.d.ts +4 -1
  216. package/dist/src/notes/service.js +11 -8
  217. package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
  218. package/dist/src/providers/index.js +2 -2
  219. package/dist/src/providers/model-catalog-persistence.js +1 -1
  220. package/dist/src/providers/register-runtime-providers.js +1 -1
  221. package/dist/src/session/store.js +0 -1
  222. package/dist/src/storage/sqlite/ai-usage-repository.d.ts +3 -0
  223. package/dist/src/storage/sqlite/ai-usage-repository.js +25 -1
  224. package/dist/src/storage/sqlite/migrations/223_session_creation_receipts.sql +59 -0
  225. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  226. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  227. package/dist/src/storage/sqlite/schema.js +1 -1
  228. package/dist/src/storage/sqlite/session-creation-repository.d.ts +50 -0
  229. package/dist/src/storage/sqlite/session-creation-repository.js +166 -0
  230. package/dist/src/storage/sqlite/session-input-repository.d.ts +4 -2
  231. package/dist/src/storage/sqlite/session-input-repository.js +7 -1
  232. package/dist/src/tasks/capabilities/read.js +2 -2
  233. package/dist/src/tui/backends/embedded-backend.d.ts +5 -0
  234. package/dist/src/tui/backends/embedded-backend.js +266 -20
  235. package/dist/src/tui/backends/embedded-drafts.d.ts +22 -0
  236. package/dist/src/tui/backends/embedded-drafts.js +53 -0
  237. package/dist/src/tui/backends/gateway-realtime-backend.d.ts +10 -0
  238. package/dist/src/tui/backends/gateway-realtime-backend.js +214 -33
  239. package/dist/src/tui/tui-backend.d.ts +1 -1
  240. package/dist/src/tui/tui-chat-input-state.d.ts +1 -0
  241. package/dist/src/tui/tui-commands.js +1 -1
  242. package/dist/src/tui/tui-session-format.js +0 -1
  243. package/dist/src/tui/tui-startup-resources.d.ts +1 -0
  244. package/dist/src/tui/tui-startup-resources.js +2 -2
  245. package/dist/src/tui/tui-types.d.ts +0 -1
  246. package/dist/src/tui/tui.js +69 -29
  247. package/dist/src/voice/realtime/persona-context.js +1 -1
  248. package/dist/src/work-discovery/service.js +3 -6
  249. package/dist/src/workflows/service/workflow-run-service.js +1 -1
  250. package/package.json +5 -5
  251. package/dist/gateway/static/root/assets/agents-DXYZSuUV.js +0 -70
  252. package/dist/gateway/static/root/assets/apps-page-ZqANbUZv.js +0 -1
  253. package/dist/gateway/static/root/assets/attachment-load-DHa-BI9a.js +0 -1
  254. package/dist/gateway/static/root/assets/automations-workspace-B37vs5tk.js +0 -7
  255. package/dist/gateway/static/root/assets/binary-plugins-DQYcuBHP.js +0 -2
  256. package/dist/gateway/static/root/assets/browser-settings-page-CSv4rvmx.js +0 -3
  257. package/dist/gateway/static/root/assets/capabilities-BnO9LV7U.js +0 -1
  258. package/dist/gateway/static/root/assets/capabilities-page-BfvDvIY1.js +0 -2
  259. package/dist/gateway/static/root/assets/capabilities-settings-panel-CoW7-ESq.js +0 -8
  260. package/dist/gateway/static/root/assets/capability-header-actions-D_hbWRRF.js +0 -1
  261. package/dist/gateway/static/root/assets/channels-BhMaRh1x.js +0 -1
  262. package/dist/gateway/static/root/assets/connectors-page-Ono0Pha1.js +0 -2
  263. package/dist/gateway/static/root/assets/conversation-identity-Cw0n9uzK.js +0 -1
  264. package/dist/gateway/static/root/assets/date-picker-D-JhzZyW.js +0 -1
  265. package/dist/gateway/static/root/assets/dist-3h6cXXhT.js +0 -1
  266. package/dist/gateway/static/root/assets/dist-Che_jiQF.js +0 -1
  267. package/dist/gateway/static/root/assets/gateway-settings-BWaCnwT1.js +0 -1
  268. package/dist/gateway/static/root/assets/home-page-BTjGLngn.js +0 -1
  269. package/dist/gateway/static/root/assets/index-DHL16aYZ.js +0 -121
  270. package/dist/gateway/static/root/assets/index-N1e6PDwx.css +0 -1
  271. package/dist/gateway/static/root/assets/local-app-workbench-page-uI7mtoVz.js +0 -1
  272. package/dist/gateway/static/root/assets/logs-page-BbLQreeN.js +0 -2
  273. package/dist/gateway/static/root/assets/media-plugins-DEFN1I73.js +0 -1
  274. package/dist/gateway/static/root/assets/note-detail-panel--09xGxyE.js +0 -5
  275. package/dist/gateway/static/root/assets/notes-page-DsxcVBXF.js +0 -8
  276. package/dist/gateway/static/root/assets/page-context-capture-button-D43aVpCj.js +0 -1
  277. package/dist/gateway/static/root/assets/popover-select-DcsFzD_i.js +0 -1
  278. package/dist/gateway/static/root/assets/project-detail-page-U-EdDfAW.js +0 -1
  279. package/dist/gateway/static/root/assets/projects-page-DUOKZLt7.js +0 -1
  280. package/dist/gateway/static/root/assets/remote-access-hub-fVPQe5YS.js +0 -1
  281. package/dist/gateway/static/root/assets/scenes-page-C0-WHOY3.js +0 -2
  282. package/dist/gateway/static/root/assets/sessions-page-DdXvW09N.js +0 -1
  283. package/dist/gateway/static/root/assets/settings-advanced-gate-BtF83fBY.js +0 -1
  284. package/dist/gateway/static/root/assets/setup-status-panel-BvVlqpHf.js +0 -1
  285. package/dist/gateway/static/root/assets/share-preview-page-b9DI0N1J.js +0 -2
  286. package/dist/gateway/static/root/assets/shares-settings-R_qwc4DN.js +0 -1
  287. package/dist/gateway/static/root/assets/skill-reload-api-CNJAQ_e-.js +0 -1
  288. package/dist/gateway/static/root/assets/skills-page-D7XPEQu_.js +0 -2
  289. package/dist/gateway/static/root/assets/task-detail-page-PFjGW2g1.js +0 -1
  290. package/dist/gateway/static/root/assets/user-model-page-OyfPVfB9.js +0 -2
  291. package/dist/gateway/static/root/assets/workflows-page-DYBGjN7C.js +0 -6
  292. package/dist/src/tui/tui-empty-session-cleanup.d.ts +0 -9
  293. package/dist/src/tui/tui-empty-session-cleanup.js +0 -19
  294. /package/dist/gateway/static/root/assets/{dist-CI_fqRk-.js → dist-CI_fqRk-2.js} +0 -0
@@ -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>;
@@ -1,14 +1,20 @@
1
+ import { resolveStateDir } from "../../config/paths-state.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
4
  import { openXopcDatabase } from "../../storage/sqlite/connection.js";
5
+ import { canonicalSessionCommand, sessionInputCommandSchema } from "../../../packages/gateway-contract/src/session-input-command.js";
6
+ import { init_src } from "../../../packages/gateway-contract/src/index.js";
7
+ import { cancelQueuedSessionInput, claimNextSessionInput, finishSessionInputRun, getSessionInputById, getSessionInputState, init_session_input_repository, setSessionInputStatus } from "../../storage/sqlite/session-input-repository.js";
4
8
  import { appendComposerInputHistory, listComposerInputHistory } from "../../storage/sqlite/composer-input-history-repository.js";
5
9
  import { getSessionMetadata } from "../../storage/sqlite/session-read-repository.js";
6
10
  import { init_sqlite } from "../../storage/sqlite/index.js";
7
11
  import { normalizeAgentId } from "../../agent-catalog/id.js";
8
- import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
9
12
  import { init_agent_scope, listAgentEntries } from "../../agent/agent-scope.js";
10
- import { createConversation, init_conversation_repository } from "../../storage/sqlite/conversation-repository.js";
13
+ import { init_paths } from "../../config/paths.js";
14
+ import { AgentCatalogService } from "../../agent-catalog/service.js";
15
+ import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
11
16
  import { init_agent_session_key, resolveAgentIdFromConversationId } from "../../routing/agent-session-key.js";
17
+ import { resolveEffectiveAgentProfile } from "../../config/agent-profile.js";
12
18
  import { effectiveWorkspacePathForSession } from "../../session/session-workspace.js";
13
19
  import { ProjectService } from "../../projects/project-service.js";
14
20
  import { inferSuggestedProjectDefaultAgentId } from "../../projects/project-agent-suggestion.js";
@@ -17,7 +23,6 @@ import { buildSessionTimeline } from "../../session/transcript-outline.js";
17
23
  import { transcriptRowsToClientHistory } from "../../session/client-history.js";
18
24
  import { createCreateShareTool, isShareToolAvailable } from "../../agent/tools/create-share-tool.js";
19
25
  import { evictEmbeddedSessionRunner } from "../../agent/embedded/session-runner.js";
20
- import { AgentCatalogService } from "../../agent-catalog/service.js";
21
26
  import { SessionIndex } from "../../session/manager.js";
22
27
  import "../../session/index.js";
23
28
  import { parseModelRef } from "../../agent/models/selection.js";
@@ -33,15 +38,19 @@ import { WorkflowRunService } from "../../workflows/service/workflow-run-service
33
38
  import { WorkflowSessionBridge } from "../../workflows/service/workflow-session-bridge.js";
34
39
  import { ChatStreamMapper } from "../../gateway/chat-stream/mapper.js";
35
40
  import { getXopcCloudCatalogCoordinator } from "../../providers/xopc-cloud-catalog-coordinator.js";
41
+ import { acceptSessionCommand } from "../../storage/sqlite/session-creation-repository.js";
36
42
  import { fuzzySearchWorkspaceFiles } from "../../gateway/workspace-file-search.js";
37
43
  import { commitDeliveredChatInput } from "../tui-chat-input-state.js";
38
44
  import { sessionMetadataToTuiItem } from "../tui-session-format.js";
39
45
  import { buildTuiTranscriptTree, transcriptTreeEntryIdToRowNumber } from "../tui-transcript-tree.js";
40
46
  import { computeTuiSessionStats } from "../tui-session-stats.js";
41
47
  import { collectTuiStartupResources } from "../tui-startup-resources.js";
42
- import { isAbsolute, relative, resolve } from "node:path";
48
+ import { EmbeddedDraftStore } from "./embedded-drafts.js";
49
+ import { isAbsolute, join, relative, resolve } from "node:path";
43
50
  //#region src/tui/backends/embedded-backend.ts
44
- init_conversation_repository();
51
+ init_src();
52
+ init_paths();
53
+ init_session_input_repository();
45
54
  init_agent_scope();
46
55
  init_agent_session_key();
47
56
  init_schema();
@@ -83,6 +92,8 @@ var EmbeddedBackend = class {
83
92
  running = false;
84
93
  chatAbort = null;
85
94
  chatInputStates = /* @__PURE__ */ new Map();
95
+ drafts = new EmbeddedDraftStore();
96
+ inputStateRevisions = /* @__PURE__ */ new Map();
86
97
  onEvent;
87
98
  onConnected;
88
99
  onDisconnected;
@@ -96,6 +107,9 @@ var EmbeddedBackend = class {
96
107
  async getComposerInputHistory() {
97
108
  return listComposerInputHistory();
98
109
  }
110
+ async getComposerDraftDirectory() {
111
+ return join(resolveStateDir(), "client-drafts", "embedded", "composers");
112
+ }
99
113
  async recordComposerInputHistory(text) {
100
114
  return appendComposerInputHistory(text).item;
101
115
  }
@@ -231,12 +245,17 @@ var EmbeddedBackend = class {
231
245
  return Boolean(implicit && isPathSameOrInside(implicit, workspaceDir));
232
246
  }
233
247
  async getStartupResources(conversationId) {
234
- return collectTuiStartupResources(this.activeConfig(), conversationId, { isWorkspaceTrusted: (workspaceDir) => this.isWorkspaceTrusted(workspaceDir) });
248
+ const draft = this.drafts.read(conversationId);
249
+ return collectTuiStartupResources(this.activeConfig(), draft ? void 0 : conversationId, {
250
+ agentId: draft?.creation.agentId,
251
+ isWorkspaceTrusted: (workspaceDir) => this.isWorkspaceTrusted(workspaceDir)
252
+ });
235
253
  }
236
254
  refreshWorkspaceTrust() {
237
255
  this.agent?.refreshSkillsAfterTrustChange();
238
256
  }
239
257
  async startWorkflowRun(opts) {
258
+ await this.materializeDraft(opts.conversationId);
240
259
  await this.sessionIndexReady;
241
260
  const agentId = opts.agentId?.trim() || resolveAgentIdFromConversationId(opts.conversationId);
242
261
  const result = await this.getWorkflowRunService().startWorkflowRun({
@@ -278,6 +297,17 @@ var EmbeddedBackend = class {
278
297
  created: match.created,
279
298
  reason: match.reason
280
299
  };
300
+ const draft = this.drafts.read(opts.conversationId);
301
+ if (draft) {
302
+ if (draft.command || draft.materialization) throw new Error("First input is awaiting confirmation");
303
+ draft.creation.projectId = match.project.id;
304
+ this.drafts.save(opts.conversationId, draft);
305
+ return {
306
+ project: match.project,
307
+ created: match.created,
308
+ reason: match.reason
309
+ };
310
+ }
281
311
  if (!getSessionMetadata(opts.conversationId)) await this.sessionIndex.getStore().resolveTranscriptPath(opts.conversationId, { metadata: {
282
312
  sourceChannel: "tui",
283
313
  sourceChatId: `default:direct:${opts.conversationId}`,
@@ -299,9 +329,10 @@ var EmbeddedBackend = class {
299
329
  };
300
330
  }
301
331
  async searchWorkspaceFiles(conversationId, query, options) {
302
- if (!this.agent) return [];
332
+ const draft = this.drafts.read(conversationId);
333
+ if (!this.agent && !draft) return [];
303
334
  try {
304
- return await fuzzySearchWorkspaceFiles(await this.agent.getEffectiveWorkspacePathForSession(conversationId), query, options?.limit ?? 15);
335
+ return await fuzzySearchWorkspaceFiles(draft ? (await this.getSessionInfo(conversationId)).effectiveWorkspacePath : await this.agent.getEffectiveWorkspacePathForSession(conversationId), query, options?.limit ?? 15);
305
336
  } catch (error) {
306
337
  const errorMessage = error instanceof Error ? error.message : String(error);
307
338
  log.warn({
@@ -313,13 +344,91 @@ var EmbeddedBackend = class {
313
344
  }
314
345
  }
315
346
  async getReviewContext(conversationId) {
347
+ if (this.drafts.read(conversationId)) return buildReviewContext(await resolveGitRoot((await this.getSessionInfo(conversationId)).effectiveWorkspacePath));
316
348
  const config = this.activeConfig();
317
349
  const metadata = getSessionMetadata(conversationId);
318
350
  return buildReviewContext(await resolveGitRoot(effectiveWorkspacePathForSession(config, conversationId, null, metadata?.projectId ? new ProjectService().get(metadata.projectId) : null)));
319
351
  }
320
352
  async sendChat(opts) {
321
- const agent = await this.ensureAgent();
353
+ if (this.drafts.read(opts.conversationId)?.materialization) await this.materializeDraft(opts.conversationId);
322
354
  const runId = crypto.randomUUID();
355
+ let durableInput = false;
356
+ const draft = this.drafts.read(opts.conversationId);
357
+ if (draft) {
358
+ const candidate = sessionInputCommandSchema.parse({
359
+ kind: "start",
360
+ clientMessageId: draft.command?.clientMessageId ?? crypto.randomUUID(),
361
+ creation: {
362
+ ...draft.creation,
363
+ thinkingLevel: opts.thinking ?? draft.creation.thinkingLevel
364
+ },
365
+ input: {
366
+ content: opts.message,
367
+ ...opts.attachments?.length ? { attachments: opts.attachments } : {}
368
+ },
369
+ origin: {
370
+ type: "system",
371
+ source: "cli"
372
+ }
373
+ });
374
+ if (candidate.kind !== "start") throw new Error("Expected first input");
375
+ if (draft.command && canonicalSessionCommand(draft.command) !== canonicalSessionCommand(candidate)) throw new Error("First input is awaiting confirmation");
376
+ draft.command = candidate;
377
+ draft.creation = candidate.creation;
378
+ this.drafts.save(opts.conversationId, draft);
379
+ await this.ensureAgent();
380
+ const receipt = acceptSessionCommand({
381
+ conversationId: opts.conversationId,
382
+ principalId: "local:tui",
383
+ command: candidate,
384
+ sourceChannel: "tui",
385
+ config: {
386
+ ...draft.config,
387
+ modelOverride: draft.creation.model,
388
+ fixedModel: true,
389
+ thinkingLevel: draft.creation.thinkingLevel
390
+ },
391
+ attachProject: (id, projectId) => {
392
+ new ProjectService().attachSession(id, projectId);
393
+ },
394
+ preparedInput: {
395
+ content: opts.message,
396
+ attachments: opts.attachments,
397
+ thinking: opts.thinking,
398
+ requestedDelivery: "next",
399
+ effectiveDelivery: "next",
400
+ status: "queued",
401
+ origin: candidate.origin
402
+ }
403
+ });
404
+ const accepted = getSessionInputById(opts.conversationId, receipt.inputId);
405
+ if (accepted?.runId && ![
406
+ "running",
407
+ "interrupted",
408
+ "queued"
409
+ ].includes(accepted.status)) {
410
+ this.drafts.remove(opts.conversationId);
411
+ return { runId: accepted.runId };
412
+ }
413
+ if (accepted?.status === "running") {
414
+ let alive = true;
415
+ if (draft.ownerPid) try {
416
+ process.kill(draft.ownerPid, 0);
417
+ } catch (error) {
418
+ alive = error.code !== "ESRCH";
419
+ }
420
+ if (alive) throw new Error("First input is still owned by a running process");
421
+ finishSessionInputRun(opts.conversationId, accepted.runId, "interrupted", "Embedded process exited");
422
+ throw new Error("Previous run was interrupted. Review its history before explicitly retrying the same input.");
423
+ }
424
+ if (accepted?.status === "interrupted") setSessionInputStatus(accepted.id, "queued");
425
+ draft.ownerPid = process.pid;
426
+ this.drafts.save(opts.conversationId, draft);
427
+ const claimed = claimNextSessionInput(opts.conversationId, runId, receipt.inputId);
428
+ if (!claimed || claimed.id !== receipt.inputId) throw new Error("First input is already queued for execution");
429
+ durableInput = true;
430
+ }
431
+ const agent = await this.ensureAgent();
323
432
  this.chatAbort?.abort();
324
433
  this.chatAbort = new AbortController();
325
434
  const signal = this.chatAbort.signal;
@@ -335,6 +444,7 @@ var EmbeddedBackend = class {
335
444
  });
336
445
  (async () => {
337
446
  let initialUserMessageObserved = false;
447
+ let outcome = "completed";
338
448
  try {
339
449
  const messageForAgent = opts.message.trimStart().startsWith("/") ? opts.message : prependEnvelopeTimestamp(opts.message);
340
450
  const stream = agent.turnDispatcher.processDirectStreaming(messageForAgent, opts.conversationId, {
@@ -361,6 +471,7 @@ var EmbeddedBackend = class {
361
471
  source: "embedded"
362
472
  });
363
473
  } catch (error) {
474
+ outcome = "failed";
364
475
  if (signal.aborted) return;
365
476
  const errorMessage = error instanceof Error ? error.message : String(error);
366
477
  for (const mapped of mapper.error(errorMessage)) this.onEvent?.({
@@ -373,6 +484,23 @@ var EmbeddedBackend = class {
373
484
  data: mapped,
374
485
  source: "embedded"
375
486
  });
487
+ } finally {
488
+ if (durableInput) {
489
+ finishSessionInputRun(opts.conversationId, runId, signal.aborted ? "cancelled" : outcome);
490
+ try {
491
+ this.drafts.remove(opts.conversationId);
492
+ } catch (err) {
493
+ log.warn({
494
+ err,
495
+ conversationId: opts.conversationId
496
+ }, "Accepted draft cleanup failed");
497
+ }
498
+ this.publishChatInputState(this.chatInputStates.get(opts.conversationId) ?? {
499
+ conversationId: opts.conversationId,
500
+ revision: 0,
501
+ inputs: []
502
+ });
503
+ }
376
504
  }
377
505
  })();
378
506
  return { runId };
@@ -406,11 +534,35 @@ var EmbeddedBackend = class {
406
534
  };
407
535
  }
408
536
  async getChatInputState(conversationId) {
409
- return this.chatInputStates.get(conversationId) ?? {
537
+ const draft = this.drafts.read(conversationId);
538
+ if (draft?.command) {
539
+ const durable = getSessionInputState(conversationId);
540
+ const input = durable.inputs.find((item) => item.clientMessageId === draft.command.clientMessageId);
541
+ if (input?.status === "running" && draft.ownerPid) {
542
+ let alive = true;
543
+ try {
544
+ process.kill(draft.ownerPid, 0);
545
+ } catch (error) {
546
+ alive = error.code !== "ESRCH";
547
+ }
548
+ if (!alive) {
549
+ finishSessionInputRun(conversationId, input.runId, "interrupted", "Embedded process exited");
550
+ return this.sequenceInputState(getSessionInputState(conversationId));
551
+ }
552
+ }
553
+ if (durable.inputs.length) {
554
+ const local = this.chatInputStates.get(conversationId);
555
+ return this.sequenceInputState({
556
+ ...durable,
557
+ inputs: [...durable.inputs, ...local?.inputs.filter((item) => !durable.inputs.some((saved) => saved.id === item.id)) ?? []]
558
+ });
559
+ }
560
+ }
561
+ return this.sequenceInputState(this.chatInputStates.get(conversationId) ?? {
410
562
  conversationId,
411
563
  revision: 0,
412
564
  inputs: []
413
- };
565
+ });
414
566
  }
415
567
  async updateChatInput(opts) {
416
568
  const current = await this.getChatInputState(opts.conversationId);
@@ -439,6 +591,14 @@ var EmbeddedBackend = class {
439
591
  };
440
592
  }
441
593
  async removeChatInput(opts) {
594
+ if (this.drafts.read(opts.conversationId)?.command && getSessionInputById(opts.conversationId, opts.inputId)) {
595
+ const ok = cancelQueuedSessionInput(opts.conversationId, opts.inputId, opts.version);
596
+ if (ok) this.drafts.remove(opts.conversationId);
597
+ return {
598
+ ok,
599
+ state: this.sequenceInputState(getSessionInputState(opts.conversationId))
600
+ };
601
+ }
442
602
  const current = await this.getChatInputState(opts.conversationId);
443
603
  const target = current.inputs.find((input) => input.id === opts.inputId);
444
604
  if (!target || target.version !== opts.version || target.status !== "queued" && target.status !== "interrupted") return {
@@ -489,23 +649,37 @@ var EmbeddedBackend = class {
489
649
  if (next !== current) this.publishChatInputState(next);
490
650
  }
491
651
  publishChatInputState(state) {
492
- this.chatInputStates.set(state.conversationId, state);
652
+ state = this.sequenceInputState(state);
653
+ this.chatInputStates.set(state.conversationId, {
654
+ ...state,
655
+ inputs: state.inputs.filter((input) => input.status !== "running")
656
+ });
493
657
  this.onEvent?.({
494
658
  event: "session.input-state",
495
659
  data: state,
496
660
  source: "embedded"
497
661
  });
498
662
  }
663
+ sequenceInputState(state) {
664
+ const revision = Math.max(state.revision, (this.inputStateRevisions.get(state.conversationId) ?? -1) + 1);
665
+ this.inputStateRevisions.set(state.conversationId, revision);
666
+ return {
667
+ ...state,
668
+ revision
669
+ };
670
+ }
499
671
  async replaceEmbeddedQueue(conversationId, state) {
500
672
  const { getEmbeddedRunByConversationId } = await import("../../agent/embedded/runs.js");
501
673
  const handle = getEmbeddedRunByConversationId(conversationId);
502
674
  if (!handle) return false;
503
675
  handle.session.clearQueue();
504
676
  for (const input of state.inputs) if (input.status === "injecting") await handle.session.steer(input.content);
505
- else await handle.session.followUp(input.content);
677
+ else if (input.status === "queued") await handle.session.followUp(input.content);
506
678
  return true;
507
679
  }
508
680
  async loadHistory(opts) {
681
+ const draft = this.drafts.read(opts.conversationId);
682
+ if (draft && (!draft.command || !getSessionMetadata(opts.conversationId))) return { messages: [] };
509
683
  if (!this.agent) return { messages: [] };
510
684
  try {
511
685
  return { messages: transcriptRowsToClientHistory(await this.agent.sessionStore.loadTranscriptRows(opts.conversationId), { limit: opts.limit }) };
@@ -656,10 +830,17 @@ var EmbeddedBackend = class {
656
830
  }
657
831
  }
658
832
  async deleteSession(conversationId) {
833
+ const draft = this.drafts.read(conversationId);
834
+ if (draft && !draft.command && !draft.materialization) {
835
+ this.drafts.remove(conversationId);
836
+ return { ok: true };
837
+ }
659
838
  const store = this.agent?.sessionStore ?? this.sessionIndex?.getStore();
660
839
  if (!store) return { ok: false };
661
840
  try {
662
- return { ok: await store.deleteSession(conversationId) };
841
+ const ok = await store.deleteSession(conversationId);
842
+ if (ok && draft) this.drafts.remove(conversationId);
843
+ return { ok };
663
844
  } catch (error) {
664
845
  const errorMessage = error instanceof Error ? error.message : String(error);
665
846
  log.warn({
@@ -671,14 +852,68 @@ var EmbeddedBackend = class {
671
852
  }
672
853
  }
673
854
  async createConversation(agentId, conversationId) {
674
- return createConversation({
675
- agentId,
855
+ const id = conversationId ?? crypto.randomUUID();
856
+ if (this.drafts.read(id)) return id;
857
+ const profile = resolveEffectiveAgentProfile(agentId);
858
+ this.drafts.save(id, {
859
+ creation: {
860
+ agentId: profile.agentId,
861
+ projectId: null,
862
+ execution: null,
863
+ temporary: false,
864
+ model: profile.primaryModelRef,
865
+ thinkingLevel: "off"
866
+ },
867
+ config: {}
868
+ });
869
+ return id;
870
+ }
871
+ async materializeDraft(conversationId) {
872
+ const draft = this.drafts.read(conversationId);
873
+ if (!draft) return;
874
+ if (draft.command) throw new Error("First input is awaiting confirmation");
875
+ draft.materialization ??= {
876
+ commandId: crypto.randomUUID(),
877
+ purpose: "session_resources",
878
+ creation: draft.creation
879
+ };
880
+ this.drafts.save(conversationId, draft);
881
+ await this.ensureAgent();
882
+ acceptSessionCommand({
883
+ conversationId,
884
+ principalId: "local:tui",
676
885
  sourceChannel: "tui",
677
- customData: { genericNewChatShell: true },
678
- hiddenFromSessionList: true
679
- }, "", conversationId).key;
886
+ command: draft.materialization,
887
+ config: {
888
+ ...draft.config,
889
+ modelOverride: draft.creation.model,
890
+ fixedModel: true,
891
+ thinkingLevel: draft.creation.thinkingLevel
892
+ },
893
+ attachProject: (id, projectId) => {
894
+ new ProjectService().attachSession(id, projectId);
895
+ }
896
+ });
897
+ this.drafts.remove(conversationId);
680
898
  }
681
899
  async getSessionInfo(conversationId) {
900
+ const draft = this.drafts.read(conversationId);
901
+ if (draft) {
902
+ const model = parseModelRef(draft.creation.model);
903
+ const profile = resolveEffectiveAgentProfile(draft.creation.agentId);
904
+ const project = draft.creation.projectId ? new ProjectService().get(draft.creation.projectId) : null;
905
+ return {
906
+ agentId: draft.creation.agentId,
907
+ model: model?.model ?? draft.creation.model,
908
+ modelProvider: model?.provider,
909
+ thinkingLevel: draft.creation.thinkingLevel,
910
+ reasoningLevel: draft.config.reasoningLevel,
911
+ verboseLevel: draft.config.verboseLevel,
912
+ projectId: draft.creation.projectId ?? void 0,
913
+ workingDirectoryLocked: Boolean(project),
914
+ effectiveWorkspacePath: project?.workspaceRoot || draft.config.workingDirectoryOverride || profile.resolvedWorkspacePath
915
+ };
916
+ }
682
917
  if (!this.agent) return { model: getAgentDefaultModelRef() ?? void 0 };
683
918
  try {
684
919
  const cfg = await this.agent.sessionInspector.agentConfig(conversationId);
@@ -686,7 +921,6 @@ var EmbeddedBackend = class {
686
921
  const usage = await this.agent.sessionInspector.contextUsage(conversationId);
687
922
  return {
688
923
  agentId: getSessionMetadata(conversationId)?.agentId,
689
- generatedShell: getSessionMetadata(conversationId)?.customData?.genericNewChatShell === true,
690
924
  model: parsed?.model ?? cfg.model,
691
925
  modelProvider: parsed?.provider,
692
926
  thinkingLevel: cfg.thinkingLevel,
@@ -726,6 +960,18 @@ var EmbeddedBackend = class {
726
960
  await this.agent.resetSession(conversationId);
727
961
  }
728
962
  async patchSession(conversationId, patch) {
963
+ const draft = this.drafts.read(conversationId);
964
+ if (draft) {
965
+ if (draft.command || draft.materialization) throw new Error("First input is awaiting confirmation");
966
+ if (typeof patch.model === "string") draft.creation.model = patch.model;
967
+ if (typeof patch.thinkingLevel === "string") draft.creation.thinkingLevel = patch.thinkingLevel;
968
+ if (typeof patch.workingDirectory === "string") draft.config.workingDirectoryOverride = resolve(patch.workingDirectory);
969
+ if (patch.reasoningLevel === "off" || patch.reasoningLevel === "on" || patch.reasoningLevel === "stream") draft.config.reasoningLevel = patch.reasoningLevel;
970
+ if (patch.verboseLevel === "off" || patch.verboseLevel === "on" || patch.verboseLevel === "full") draft.config.verboseLevel = patch.verboseLevel;
971
+ if (patch.projectId === null || typeof patch.projectId === "string") draft.creation.projectId = typeof patch.projectId === "string" ? patch.projectId : null;
972
+ this.drafts.save(conversationId, draft);
973
+ return;
974
+ }
729
975
  const agent = await this.ensureAgent();
730
976
  const hasProjectPatch = Object.prototype.hasOwnProperty.call(patch, "projectId");
731
977
  const projectId = typeof patch.projectId === "string" ? patch.projectId.trim() : "";
@@ -0,0 +1,22 @@
1
+ import type { SessionCreation, SessionInputCommand, SessionMaterializeCommand } from '@xopcai/gateway-contract';
2
+ import type { SessionAgentConfig } from '../../session/config-types.js';
3
+ export interface EmbeddedDraft {
4
+ creation: SessionCreation;
5
+ config: SessionAgentConfig;
6
+ command?: Extract<SessionInputCommand, {
7
+ kind: 'start';
8
+ }>;
9
+ materialization?: SessionMaterializeCommand;
10
+ ownerPid?: number;
11
+ }
12
+ /** Draft files are private client state, never session/transcript rows. */
13
+ export declare class TuiDraftFileStore<T> {
14
+ private readonly directory;
15
+ constructor(directory?: string);
16
+ private path;
17
+ read(id: string): T | undefined;
18
+ save(id: string, draft: T): void;
19
+ remove(id: string): void;
20
+ }
21
+ export declare class EmbeddedDraftStore extends TuiDraftFileStore<EmbeddedDraft> {
22
+ }
@@ -0,0 +1,53 @@
1
+ import { resolveStateDir } from "../../config/paths-state.js";
2
+ import { init_paths } from "../../config/paths.js";
3
+ import { join } from "node:path";
4
+ import { mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
5
+ import { randomUUID } from "node:crypto";
6
+ //#region src/tui/backends/embedded-drafts.ts
7
+ init_paths();
8
+ /** Draft files are private client state, never session/transcript rows. */
9
+ var TuiDraftFileStore = class {
10
+ constructor(directory = join(resolveStateDir(), "client-drafts", "embedded")) {
11
+ this.directory = directory;
12
+ }
13
+ path(id) {
14
+ if (!/^[0-9a-f]{8}-[0-9a-f-]{27}$/i.test(id)) throw new Error("Invalid conversation UUID");
15
+ return join(this.directory, `${id}.json`);
16
+ }
17
+ read(id) {
18
+ if (!/^[0-9a-f]{8}-[0-9a-f-]{27}$/i.test(id)) return void 0;
19
+ try {
20
+ return JSON.parse(readFileSync(this.path(id), "utf8"));
21
+ } catch (error) {
22
+ if (error.code !== "ENOENT") throw error;
23
+ }
24
+ }
25
+ save(id, draft) {
26
+ const path = this.path(id);
27
+ mkdirSync(this.directory, {
28
+ recursive: true,
29
+ mode: 448
30
+ });
31
+ const temporary = `${path}.${randomUUID()}.tmp`;
32
+ try {
33
+ writeFileSync(temporary, JSON.stringify(draft), { mode: 384 });
34
+ renameSync(temporary, path);
35
+ } finally {
36
+ try {
37
+ unlinkSync(temporary);
38
+ } catch (error) {
39
+ if (error.code !== "ENOENT") throw error;
40
+ }
41
+ }
42
+ }
43
+ remove(id) {
44
+ try {
45
+ unlinkSync(this.path(id));
46
+ } catch (error) {
47
+ if (error.code !== "ENOENT") throw error;
48
+ }
49
+ }
50
+ };
51
+ var EmbeddedDraftStore = class extends TuiDraftFileStore {};
52
+ //#endregion
53
+ export { EmbeddedDraftStore, TuiDraftFileStore };
@@ -23,6 +23,10 @@ export declare class GatewayRealtimeBackend implements TuiBackend {
23
23
  private activeRunId;
24
24
  private observedConversationId;
25
25
  private chatAbort;
26
+ private readonly drafts;
27
+ private readonly pendingInputs;
28
+ private draftDirectory?;
29
+ private draftInitialization?;
26
30
  onEvent?: (evt: TuiEvent) => void;
27
31
  onConnected?: () => void;
28
32
  onDisconnected?: (reason: string) => void;
@@ -32,11 +36,17 @@ export declare class GatewayRealtimeBackend implements TuiBackend {
32
36
  }) => void;
33
37
  constructor(opts: GatewayRealtimeOptions);
34
38
  get connectionLabel(): string;
39
+ getComposerDraftDirectory(): Promise<string>;
40
+ private initializeDrafts;
41
+ private persistDraft;
35
42
  start(): void;
36
43
  stop(): void;
37
44
  getActiveSignal(): AbortSignal | undefined;
38
45
  getComposerInputHistory(): Promise<TuiComposerHistoryItem[]>;
39
46
  recordComposerInputHistory(text: string): Promise<TuiComposerHistoryItem>;
47
+ private acceptReceipt;
48
+ private reconcileInput;
49
+ private prepareInput;
40
50
  sendChat(opts: ChatSendOptions): Promise<{
41
51
  runId: string;
42
52
  }>;