@xopcai/xopc 0.0.422 → 0.0.424

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 (265) hide show
  1. package/dist/browser-ext/dist/assets/{page-context-BKnEwsOO.js → page-context-b-rB5vJC.js} +1 -1
  2. package/dist/browser-ext/dist/background.js +1 -1
  3. package/dist/browser-ext/dist/sidepanel.html +1 -1
  4. package/dist/browser-ext/dist/sidepanel.js +29 -1
  5. package/dist/browser-ext/manifest.json +1 -1
  6. package/dist/extensions/telegram/xopc.extension.json +1 -1
  7. package/dist/gateway/static/root/assets/{activity-store-CvJ9rdwP.js → activity-store-AI081rxe.js} +1 -1
  8. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CFP6g4w7.js → agent-avatar-dicebear-DupnTbL7.js} +1 -1
  9. package/dist/gateway/static/root/assets/{agent-avatar-display-BHBe88Gu.js → agent-avatar-display-CmEj6Uqy.js} +2 -2
  10. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-IEV5yKuu.js +1 -0
  11. package/dist/gateway/static/root/assets/{agent-plugin-dialog-C_Dm-u6_.js → agent-plugin-dialog-D_njOuFA.js} +1 -1
  12. package/dist/gateway/static/root/assets/{agents-BdVJHOiK.js → agents-B_yg9nA3.js} +4 -4
  13. package/dist/gateway/static/root/assets/{agents-admin-api-Do1Pza0R.js → agents-admin-api-CUZUolwG.js} +1 -1
  14. package/dist/gateway/static/root/assets/{api-ONg37_fH.js → api-CWWEVThO.js} +1 -1
  15. package/dist/gateway/static/root/assets/{api-BQv5dLcH.js → api-bpQ7yR10.js} +1 -1
  16. package/dist/gateway/static/root/assets/{app-management-settings-panel-B4Wqhf4J.js → app-management-settings-panel-C0_hxwgg.js} +1 -1
  17. package/dist/gateway/static/root/assets/{appearance-settings-Dm1kRzKL.js → appearance-settings-CLh-qnCC.js} +1 -1
  18. package/dist/gateway/static/root/assets/{apps-page-D1MMk1P7.js → apps-page-Bjtm3Rgi.js} +1 -1
  19. package/dist/gateway/static/root/assets/{archive-plugin-p_yLkyaC.js → archive-plugin-dGnstkhB.js} +1 -1
  20. package/dist/gateway/static/root/assets/{automation-api-DQaWBR03.js → automation-api-MB2xCoFF.js} +1 -1
  21. package/dist/gateway/static/root/assets/{automation-result-state-CO_243JM.js → automation-result-state-DJQflY78.js} +1 -1
  22. package/dist/gateway/static/root/assets/automation-task-card-DXgBxVE2.js +3 -0
  23. package/dist/gateway/static/root/assets/{automations-page-Ba64H37d.js → automations-page-D3O7M2FH.js} +1 -1
  24. package/dist/gateway/static/root/assets/automations-workspace-Dk3FVWoX.js +9 -0
  25. package/dist/gateway/static/root/assets/{binary-plugins-B-6kyqtt.js → binary-plugins-BrVJXmYf.js} +1 -1
  26. package/dist/gateway/static/root/assets/{block-editor-B5ysJ96n.js → block-editor-Dok4sfT3.js} +2 -2
  27. package/dist/gateway/static/root/assets/{browser-automation-inputs-C2A3NIt3.js → browser-automation-inputs-PJbT3CxW.js} +1 -1
  28. package/dist/gateway/static/root/assets/{browser-automations-page-CnbXFw1_.js → browser-automations-page-kkpX1Q7K.js} +1 -1
  29. package/dist/gateway/static/root/assets/{browser-control-api-Aj_seKE9.js → browser-control-api-Bg4wnkeA.js} +1 -1
  30. package/dist/gateway/static/root/assets/{browser-settings-page-C7fxPq_z.js → browser-settings-page-BrgX_Yb2.js} +1 -1
  31. package/dist/gateway/static/root/assets/{capabilities-DOTgaSgA.js → capabilities-BMaJizw4.js} +1 -1
  32. package/dist/gateway/static/root/assets/{capabilities-BgtCwC_E.js → capabilities-Cs6Jt5Gl.js} +1 -1
  33. package/dist/gateway/static/root/assets/capabilities-page-D5hvAG6D.js +2 -0
  34. package/dist/gateway/static/root/assets/{capabilities-settings-panel-pYWZtPeU.js → capabilities-settings-panel-BrEvm4IH.js} +3 -3
  35. package/dist/gateway/static/root/assets/{channels-DGpRM6pj.js → channels-1jQgGVc9.js} +1 -1
  36. package/dist/gateway/static/root/assets/{chat-agents-api-EvJ_Wvuc.js → chat-agents-api-BAOWaUJf.js} +1 -1
  37. package/dist/gateway/static/root/assets/{chat-chart-block-BQDbHLcw.js → chat-chart-block-DeWrb9XR.js} +1 -1
  38. package/dist/gateway/static/root/assets/{chat-page-GF9NIuZN.js → chat-page-CafkCKOj.js} +30 -30
  39. package/dist/gateway/static/root/assets/{chat-terminal-dock-DHFTGoEp.js → chat-terminal-dock-C544n0-R.js} +1 -1
  40. package/dist/gateway/static/root/assets/{command-palette-api-DPA_yEuy.js → command-palette-api-D9PXzY8b.js} +1 -1
  41. package/dist/gateway/static/root/assets/{composer-payload-handoff-BTjauSNp.js → composer-payload-handoff-CYXfjpem.js} +1 -1
  42. package/dist/gateway/static/root/assets/{computer-settings-page-BFSSQfcx.js → computer-settings-page-DJmod8-w.js} +1 -1
  43. package/dist/gateway/static/root/assets/connected-providers-grid-b46VH4uy.js +1 -0
  44. package/dist/gateway/static/root/assets/{connector-service-page-CFvg58qa.js → connector-service-page-BqDbTOTp.js} +1 -1
  45. package/dist/gateway/static/root/assets/{connectors-api-CbC6Yht5.js → connectors-api-CwRuUnH4.js} +1 -1
  46. package/dist/gateway/static/root/assets/connectors-page-Mq9Bvoax.js +1 -0
  47. package/dist/gateway/static/root/assets/{date-picker-Dd3MbG0x.js → date-picker-DWaT0IC0.js} +1 -1
  48. package/dist/gateway/static/root/assets/{dependency-picker-DcsHg2ml.js → dependency-picker-DV9XAt6F.js} +1 -1
  49. package/dist/gateway/static/root/assets/{desktop-pet-DldzQT2h.js → desktop-pet-Dffq2NxL.js} +1 -1
  50. package/dist/gateway/static/root/assets/{desktop-pet-settings-CYdI4KxB.js → desktop-pet-settings-CrB1ICax.js} +1 -1
  51. package/dist/gateway/static/root/assets/{dev-view-store-JiJv585f.js → dev-view-store-liRgSkcT.js} +1 -1
  52. package/dist/gateway/static/root/assets/device-pairing-wizard-1du1hfi5.js +1 -0
  53. package/dist/gateway/static/root/assets/{directory-picker-path-field-8WOXv8zw.js → directory-picker-path-field-EKqQLQrE.js} +1 -1
  54. package/dist/gateway/static/root/assets/{discussion-annotation-sync-B-grSe0w.js → discussion-annotation-sync-D-b1X6ro.js} +1 -1
  55. package/dist/gateway/static/root/assets/{extension-debug-page-EEQkTNEu.js → extension-debug-page-wD97GeG0.js} +1 -1
  56. package/dist/gateway/static/root/assets/{extension-iframe-host-vlZVeMCY.js → extension-iframe-host-B4Q1CjvW.js} +1 -1
  57. package/dist/gateway/static/root/assets/{extension-marketplace-api-_o2In_al.js → extension-marketplace-api-ak1_K3u8.js} +1 -1
  58. package/dist/gateway/static/root/assets/{extension-page-CPrT111s.js → extension-page-DWFI4iIh.js} +1 -1
  59. package/dist/gateway/static/root/assets/{extension-provider-B2Mf3FBu.js → extension-provider-BZwcaU5Y.js} +1 -1
  60. package/dist/gateway/static/root/assets/{extension-settings-page-CznJEgWV.js → extension-settings-page-cn4KS42C.js} +1 -1
  61. package/dist/gateway/static/root/assets/{file-preview-surface-7h8_fZul.js → file-preview-surface-c3gDD9sM.js} +1 -1
  62. package/dist/gateway/static/root/assets/{gateway-config-swr-DbbNEOKj.js → gateway-config-swr-Dmt5JhZU.js} +1 -1
  63. package/dist/gateway/static/root/assets/{gateway-realtime-D20ZrAuM.js → gateway-realtime-CJtDXQCt.js} +1 -1
  64. package/dist/gateway/static/root/assets/gateway-realtime-store-DcsZyYEa.js +1 -0
  65. package/dist/gateway/static/root/assets/{gateway-restart-5ut-lhJm.js → gateway-restart-DInvvT5u.js} +1 -1
  66. package/dist/gateway/static/root/assets/{gateway-settings-BCf_cibp.js → gateway-settings-BZXdv2FE.js} +1 -1
  67. package/dist/gateway/static/root/assets/{gateway-startup-retry-DlHL0DpH.js → gateway-startup-retry-s2KcWekp.js} +1 -1
  68. package/dist/gateway/static/root/assets/{global-defaults-api-CmODomcV.js → global-defaults-api-DtnmDd87.js} +1 -1
  69. package/dist/gateway/static/root/assets/{home-page-uz22TRB-.js → home-page-CAVjA5rO.js} +2 -2
  70. package/dist/gateway/static/root/assets/{image-generation-api-dzPnpUFu.js → image-generation-api-RQQokgE9.js} +1 -1
  71. package/dist/gateway/static/root/assets/{imports-page-ChBoNMyE.js → imports-page-BP_4TubV.js} +1 -1
  72. package/dist/gateway/static/root/assets/index-BS9mjvSL.js +11 -0
  73. package/dist/gateway/static/root/assets/index-pT-m6l6b.css +1 -0
  74. package/dist/gateway/static/root/assets/{install-connector-dialog-CNcdQDX0.js → install-connector-dialog-BNzNuXJ8.js} +1 -1
  75. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CRbYq2_g.js → keyboard-shortcuts-settings-DNRQFepg.js} +1 -1
  76. package/dist/gateway/static/root/assets/{local-app-workbench-page-04cX5TJu.js → local-app-workbench-page-CvY5XxbX.js} +1 -1
  77. package/dist/gateway/static/root/assets/{local-apps-page-fWM0FEhN.js → local-apps-page-DfwEvd8G.js} +1 -1
  78. package/dist/gateway/static/root/assets/local-session-drafts-CuDdIyxR.js +4 -0
  79. package/dist/gateway/static/root/assets/{locale-store-VNjH18Dj.js → locale-store-TQcz_Vjt.js} +1 -1
  80. package/dist/gateway/static/root/assets/{logs-page-6GanGLrm.js → logs-page-eq49F1Rt.js} +1 -1
  81. package/dist/gateway/static/root/assets/{management-settings-BxD_lc4E.js → management-settings-BaYXDMOJ.js} +1 -1
  82. package/dist/gateway/static/root/assets/{markdown-view-DLCBYWtx.js → markdown-view-D4nII6Zv.js} +1 -1
  83. package/dist/gateway/static/root/assets/{media-plugins-BvtNwKFb.js → media-plugins-MvlAY405.js} +1 -1
  84. package/dist/gateway/static/root/assets/messages-DaLmc4W1.js +3 -0
  85. package/dist/gateway/static/root/assets/model-selector-nsoNHqif.js +1 -0
  86. package/dist/gateway/static/root/assets/{models-hub-cache-_qE7L-_H.js → models-hub-cache-CFIazNIF.js} +1 -1
  87. package/dist/gateway/static/root/assets/note-detail-panel-KPzbHiEW.js +5 -0
  88. package/dist/gateway/static/root/assets/note-image-lightbox-DticJxxh.js +1 -0
  89. package/dist/gateway/static/root/assets/{notes-api-Bxa11X3a.js → notes-api-HVxR5bRD.js} +1 -1
  90. package/dist/gateway/static/root/assets/{notes-page-D2QpJ3WZ.js → notes-page-yShJeR3i.js} +1 -1
  91. package/dist/gateway/static/root/assets/{oauth-api-DIE4UpP7.js → oauth-api-CfKjRVnb.js} +1 -1
  92. package/dist/gateway/static/root/assets/{oauth-provider-connect-B95tiddN.js → oauth-provider-connect-D4uqONWr.js} +1 -1
  93. package/dist/gateway/static/root/assets/{page-context-capture-button-C-QbbwmN.js → page-context-capture-button-B98nlKTc.js} +1 -1
  94. package/dist/gateway/static/root/assets/{page-context-draft-BHmOfksL.js → page-context-draft-HcuK45iu.js} +1 -1
  95. package/dist/gateway/static/root/assets/page-header-store-D6SzJ9Ch.js +1 -0
  96. package/dist/gateway/static/root/assets/{personal-avatar-nXrmMfrV.js → personal-avatar-_d72UP_d.js} +1 -1
  97. package/dist/gateway/static/root/assets/{personal-page-BCwlYT3F.js → personal-page-B19h_3WQ.js} +1 -1
  98. package/dist/gateway/static/root/assets/{personal-settings-panel-vkYmXK8h.js → personal-settings-panel-CfwtGyue.js} +1 -1
  99. package/dist/gateway/static/root/assets/{phone-dependencies-card-CZDAxTWv.js → phone-dependencies-card-D8bqsDk_.js} +1 -1
  100. package/dist/gateway/static/root/assets/{phone-model-picker-4Snfs8Hq.js → phone-model-picker-CL_Zn6Xd.js} +1 -1
  101. package/dist/gateway/static/root/assets/{phone-settings-page-D8HperfA.js → phone-settings-page-C5Jia8eQ.js} +1 -1
  102. package/dist/gateway/static/root/assets/{phone-workspace-store-Di9R9Ux5.js → phone-workspace-store-FBfrfkYq.js} +1 -1
  103. package/dist/gateway/static/root/assets/plugin-details-dialog-gAq2KPzK.js +1 -0
  104. package/dist/gateway/static/root/assets/{preference-select-fields-C6abaM3k.js → preference-select-fields-Ck8GAX_y.js} +1 -1
  105. package/dist/gateway/static/root/assets/{product-automation-feedback-C74s9Mjz.js → product-automation-feedback-BJ9oTnNs.js} +2 -2
  106. package/dist/gateway/static/root/assets/{product-open-page-AbDP5w1c.js → product-open-page-Dw9hUdxP.js} +1 -1
  107. package/dist/gateway/static/root/assets/{product-preview-content-CktjvFbc.js → product-preview-content-C0iPzmSm.js} +1 -1
  108. package/dist/gateway/static/root/assets/{product-preview-modal-CzsqLwB4.js → product-preview-modal-COFtHoh6.js} +2 -2
  109. package/dist/gateway/static/root/assets/{project-detail-page-Cf3tggGP.js → project-detail-page-C5Amjah-.js} +3 -3
  110. package/dist/gateway/static/root/assets/{project-understanding-jmhFbHch.js → project-understanding-DpL9ADQU.js} +1 -1
  111. package/dist/gateway/static/root/assets/{projects-page-jMgZiFnO.js → projects-page-gGg9nM2t.js} +1 -1
  112. package/dist/gateway/static/root/assets/{providers-api-CJBYFKAK.js → providers-api-D6JJRlJb.js} +1 -1
  113. package/dist/gateway/static/root/assets/{recording-upload-Dl9a5yOV.js → recording-upload-DxX1xKyt.js} +1 -1
  114. package/dist/gateway/static/root/assets/{registry-api-BwkbPUYu.js → registry-api-BfXzBR1D.js} +1 -1
  115. package/dist/gateway/static/root/assets/remote-access-hub-BZA4StwC.js +1 -0
  116. package/dist/gateway/static/root/assets/{resource-unavailable-35wBZxmz.js → resource-unavailable-X-SIrZYI.js} +1 -1
  117. package/dist/gateway/static/root/assets/route-preload-CWRb0UCt.js +2 -0
  118. package/dist/gateway/static/root/assets/{runtime-tools-api-BF28JDAO.js → runtime-tools-api-1DjsPyQ5.js} +1 -1
  119. package/dist/gateway/static/root/assets/runtime-tools-settings-panel-BnCtyORj.js +1 -0
  120. package/dist/gateway/static/root/assets/{service-recommendation-list-CdaS4MPF.js → service-recommendation-list-ChSOfHHh.js} +1 -1
  121. package/dist/gateway/static/root/assets/{session-api-zJXYlRPt.js → session-api-rvY5aWw8.js} +1 -1
  122. package/dist/gateway/static/root/assets/session-manager-D2rbRfX3.js +23 -0
  123. package/dist/gateway/static/root/assets/sessions-page-DAS2IUGT.js +1 -0
  124. package/dist/gateway/static/root/assets/settings-advanced-gate-CYDQybNF.js +1 -0
  125. package/dist/gateway/static/root/assets/{settings-advanced-section-C84IghdL.js → settings-advanced-section-ZKRIuk7h.js} +1 -1
  126. package/dist/gateway/static/root/assets/{settings-mode-store-CtQBJvbO.js → settings-mode-store-CtJ8pEfm.js} +1 -1
  127. package/dist/gateway/static/root/assets/{settings-page-eEIz9InP.js → settings-page-B3pUce-_.js} +1 -1
  128. package/dist/gateway/static/root/assets/{settings-page-header-CsPAYlqV.js → settings-page-header-DuNCn8i-.js} +1 -1
  129. package/dist/gateway/static/root/assets/{settings-page-layout-lPLeJQoV.js → settings-page-layout-DeNC8YHJ.js} +1 -1
  130. package/dist/gateway/static/root/assets/setup-status-panel-Fc3vuz_h.js +1 -0
  131. package/dist/gateway/static/root/assets/{share-link-dialog-NaM6jvIz.js → share-link-dialog-B3hwjVAx.js} +1 -1
  132. package/dist/gateway/static/root/assets/{share-preview-page-CHjZn27s.js → share-preview-page-D_9oFzGS.js} +1 -1
  133. package/dist/gateway/static/root/assets/{shares-api-B9rVcV1y.js → shares-api-BoUpXmxq.js} +1 -1
  134. package/dist/gateway/static/root/assets/shares-settings-Drfuvepz.js +1 -0
  135. package/dist/gateway/static/root/assets/{skill-api-D6zVfEuK.js → skill-api-By2HhJ9O.js} +1 -1
  136. package/dist/gateway/static/root/assets/{skill-list-api-SLmTBYF5.js → skill-list-api-TaUCzS8Y.js} +1 -1
  137. package/dist/gateway/static/root/assets/{skill-reload-api-UQkq2orI.js → skill-reload-api-CN2fpS1n.js} +1 -1
  138. package/dist/gateway/static/root/assets/{skills-page-Ca0pYZ4i.js → skills-page-LzGLique.js} +1 -1
  139. package/dist/gateway/static/root/assets/{system-settings-panel-BARWbjRN.js → system-settings-panel-Cuyg8Ml3.js} +1 -1
  140. package/dist/gateway/static/root/assets/{task-detail-page-roqAsGue.js → task-detail-page-6A9337pK.js} +2 -2
  141. package/dist/gateway/static/root/assets/{task-result-evidence-Bb1F7nAM.js → task-result-evidence-DDubAU_5.js} +1 -1
  142. package/dist/gateway/static/root/assets/{terminal-panel-store-DYDeXXAg.js → terminal-panel-store-BNs75Wdr.js} +1 -1
  143. package/dist/gateway/static/root/assets/{theme-store-DbStcH89.js → theme-store-DB1ZfBUm.js} +1 -1
  144. package/dist/gateway/static/root/assets/tracing-settings-page-TvtX4Goh.js +1 -0
  145. package/dist/gateway/static/root/assets/{tunnel-api-BK_ivyIb.js → tunnel-api-COoVEdV9.js} +1 -1
  146. package/dist/gateway/static/root/assets/{understanding-activity-store-p7Z7oq8z.js → understanding-activity-store-Dr_MLgYe.js} +1 -1
  147. package/dist/gateway/static/root/assets/{understanding-refresh-store-D-U6rcwZ.js → understanding-refresh-store-DGmLGEqw.js} +1 -1
  148. package/dist/gateway/static/root/assets/{usage-page-URFSiswS.js → usage-page-DP6eb6ed.js} +1 -1
  149. package/dist/gateway/static/root/assets/{use-autosave-B7cbumro.js → use-autosave-itwjDYUb.js} +1 -1
  150. package/dist/gateway/static/root/assets/{use-composer-attachments-DAtiwLsE.js → use-composer-attachments-hjIGlI_2.js} +1 -1
  151. package/dist/gateway/static/root/assets/{use-file-preview-expanded-B8erpWsX.js → use-file-preview-expanded-ClLa0g8D.js} +2 -2
  152. package/dist/gateway/static/root/assets/{use-personal-profile-DDW29nm-.js → use-personal-profile-vhWk6tTU.js} +1 -1
  153. package/dist/gateway/static/root/assets/{use-workspace-tree-DCoTf22f.js → use-workspace-tree-dfXXjA2-.js} +1 -1
  154. package/dist/gateway/static/root/assets/user-model-page-D8dswPWd.js +2 -0
  155. package/dist/gateway/static/root/assets/{voice-api-key-field-DzYdJZN4.js → voice-api-key-field-BIfBySnN.js} +1 -1
  156. package/dist/gateway/static/root/assets/{voice-config-api-wotvT6Hw.js → voice-config-api-J4o59ICE.js} +1 -1
  157. package/dist/gateway/static/root/assets/{voice-input-shortcut-events-BI6PuiIB.js → voice-input-shortcut-events-B1mlpUdC.js} +1 -1
  158. package/dist/gateway/static/root/assets/{voice-transcribe-api-DAK9eLRr.js → voice-transcribe-api-xxaSOOmq.js} +1 -1
  159. package/dist/gateway/static/root/assets/{work-discovery-overlay-BzmB9Rub.js → work-discovery-overlay-DqwT1E5u.js} +1 -1
  160. package/dist/gateway/static/root/assets/{work-discovery-page-CmGjxUIT.js → work-discovery-page-BzYQmPLT.js} +1 -1
  161. package/dist/gateway/static/root/assets/{working-directory-picker-modal-B-EHm52-.js → working-directory-picker-modal-D2Zf3GOG.js} +1 -1
  162. package/dist/gateway/static/root/assets/{workspace-api-uhiEMPpK.js → workspace-api-Bnx3eS2M.js} +2 -2
  163. package/dist/gateway/static/root/assets/workspace-editor-agent-store-COUVwj-p.js +1 -0
  164. package/dist/gateway/static/root/assets/{workspace-file-preview-dialog-BDm06MZm.js → workspace-file-preview-dialog-D13qHzVr.js} +1 -1
  165. package/dist/gateway/static/root/assets/{workspace-open-location-menu-Bv83uoqu.js → workspace-open-location-menu-Cou-ig1H.js} +1 -1
  166. package/dist/gateway/static/root/assets/{xopc-cloud-account-card-Cd5GdpGL.js → xopc-cloud-account-card-DQGPKxHA.js} +1 -1
  167. package/dist/gateway/static/root/index.html +80 -80
  168. package/dist/package.js +1 -1
  169. package/dist/packages/gateway-contract/src/clarification-questions.js +86 -0
  170. package/dist/packages/gateway-contract/src/clarifications.js +19 -0
  171. package/dist/packages/gateway-contract/src/index.js +1 -0
  172. package/dist/packages/gateway-contract/src/session-input-command.js +3 -0
  173. package/dist/src/agent/agent-manager.js +1 -1
  174. package/dist/src/agent/background-review/run-background-review.js +1 -1
  175. package/dist/src/agent/coding/repository-instructions.js +1 -1
  176. package/dist/src/agent/embedded/index.js +1 -1
  177. package/dist/src/agent/embedded/run-for-session.js +1 -1
  178. package/dist/src/agent/embedded/run-turn.js +3 -3
  179. package/dist/src/agent/embedded/session-tool-result-guard.js +2 -2
  180. package/dist/src/agent/embedded/tool-result-truncation.js +1 -1
  181. package/dist/src/agent/inbound/attachment-pipeline.js +1 -1
  182. package/dist/src/agent/memory/compaction.js +1 -1
  183. package/dist/src/agent/memory/context-budget.js +1 -1
  184. package/dist/src/agent/memory/context-recovery.js +1 -1
  185. package/dist/src/agent/memory/user-message-text.js +1 -1
  186. package/dist/src/agent/service/btw-query.js +1 -1
  187. package/dist/src/agent/service/direct-turn-helpers.js +1 -1
  188. package/dist/src/agent/service/process-direct-streaming.js +2 -2
  189. package/dist/src/agent/source-context/types.d.ts +1 -0
  190. package/dist/src/agent/tools/clarify-tool.js +43 -5
  191. package/dist/src/agent/tools/cli-clarify.js +1 -0
  192. package/dist/src/agent/tools/dataBatch.js +1 -1
  193. package/dist/src/agent/tools/personal-task-tool.d.ts +1 -1
  194. package/dist/src/agent/tools/phone-use-tool.js +2 -2
  195. package/dist/src/agent/tools/session-search-tool.js +1 -1
  196. package/dist/src/bootstrap/application-state.js +2 -2
  197. package/dist/src/cli/commands/gateway/run-foreground.js +2 -2
  198. package/dist/src/computer/diagnostics.d.ts +3 -3
  199. package/dist/src/computer/evaluation.d.ts +2 -2
  200. package/dist/src/connectors/learning-coordinator.js +1 -1
  201. package/dist/src/gateway/ephemeral-clarification-waiter.js +1 -0
  202. package/dist/src/gateway/hono/routes/composer-history.js +1 -1
  203. package/dist/src/gateway/hono/routes/connectors.js +1 -1
  204. package/dist/src/gateway/hono/routes/home.js +1 -1
  205. package/dist/src/gateway/hono/routes/phone.js +31 -6
  206. package/dist/src/gateway/hono/routes/public-gateway.js +2 -1
  207. package/dist/src/gateway/hono/routes/session-command-handler.js +1 -0
  208. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +6 -0
  209. package/dist/src/gateway/hono/routes/tunnel.js +8 -1
  210. package/dist/src/gateway/hono/routes/user-model-refresh.js +1 -1
  211. package/dist/src/gateway/next-turn-suggestions/snapshot.js +1 -1
  212. package/dist/src/gateway/ports.js +6 -1
  213. package/dist/src/gateway/run-loop.js +0 -1
  214. package/dist/src/gateway/service/agent-runner.js +8 -3
  215. package/dist/src/gateway/service/run-gateway-agent.js +1 -1
  216. package/dist/src/gateway/service/session-input-coordinator.js +5 -4
  217. package/dist/src/phone/assistance.js +3 -0
  218. package/dist/src/phone/contracts.d.ts +4 -0
  219. package/dist/src/phone/runtime.d.ts +7 -1
  220. package/dist/src/phone/runtime.js +31 -24
  221. package/dist/src/routing/agent-session-key.js +1 -1
  222. package/dist/src/session/session-context-for-llm.js +1 -0
  223. package/dist/src/session/session-title.js +1 -1
  224. package/dist/src/storage/sqlite/clarification-wait-repository.js +45 -4
  225. package/dist/src/storage/sqlite/index.js +6 -6
  226. package/dist/src/storage/sqlite/session-creation-repository.js +1 -1
  227. package/dist/src/storage/sqlite/session-repository.js +1 -1
  228. package/dist/src/tasks/home-query-service.js +1 -1
  229. package/dist/src/tasks/task-allocation-repository.js +1 -1
  230. package/dist/src/tui/backends/embedded-backend.js +1 -1
  231. package/dist/src/tunnel/broker-client.d.ts +3 -0
  232. package/dist/src/tunnel/broker-client.js +14 -6
  233. package/dist/src/tunnel/frpc-process.js +54 -33
  234. package/dist/src/tunnel/tunnel-service.d.ts +5 -1
  235. package/dist/src/tunnel/tunnel-service.js +42 -17
  236. package/package.json +5 -4
  237. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-DlGRuKMv.js +0 -1
  238. package/dist/gateway/static/root/assets/automation-task-card-D2p9qlYE.js +0 -3
  239. package/dist/gateway/static/root/assets/automations-workspace-BkzC3oIM.js +0 -9
  240. package/dist/gateway/static/root/assets/capabilities-page-m3b9sLFG.js +0 -2
  241. package/dist/gateway/static/root/assets/connected-providers-grid-DM2glQN3.js +0 -1
  242. package/dist/gateway/static/root/assets/connectors-page-D7pipFHA.js +0 -1
  243. package/dist/gateway/static/root/assets/device-pairing-wizard-D8cLc41G.js +0 -1
  244. package/dist/gateway/static/root/assets/gateway-realtime-store-C6sMzYDT.js +0 -1
  245. package/dist/gateway/static/root/assets/index-CSIg7V1A.js +0 -11
  246. package/dist/gateway/static/root/assets/index-Dv8mUlNN.css +0 -1
  247. package/dist/gateway/static/root/assets/local-session-drafts-ClrSe5mH.js +0 -1
  248. package/dist/gateway/static/root/assets/messages-Btr7C0hF.js +0 -3
  249. package/dist/gateway/static/root/assets/model-selector-DYUnp917.js +0 -1
  250. package/dist/gateway/static/root/assets/note-detail-panel-bjRZesmS.js +0 -5
  251. package/dist/gateway/static/root/assets/note-image-lightbox-D7Jqb75C.js +0 -1
  252. package/dist/gateway/static/root/assets/page-header-store-bPV8_tKL.js +0 -1
  253. package/dist/gateway/static/root/assets/plugin-details-dialog-DJsDu-_8.js +0 -1
  254. package/dist/gateway/static/root/assets/remote-access-hub-CBQ_bOy9.js +0 -1
  255. package/dist/gateway/static/root/assets/route-preload-BcA6SPeC.js +0 -2
  256. package/dist/gateway/static/root/assets/runtime-impact-DbySfhdp.js +0 -1
  257. package/dist/gateway/static/root/assets/runtime-tools-settings-panel-Bq2xQ2qd.js +0 -1
  258. package/dist/gateway/static/root/assets/session-manager-wWxpzSo0.js +0 -23
  259. package/dist/gateway/static/root/assets/sessions-page-BkjD_dUD.js +0 -1
  260. package/dist/gateway/static/root/assets/settings-advanced-gate-BUMCEtA_.js +0 -1
  261. package/dist/gateway/static/root/assets/setup-status-panel-BSU5WpaE.js +0 -1
  262. package/dist/gateway/static/root/assets/shares-settings-5sB15V5v.js +0 -1
  263. package/dist/gateway/static/root/assets/tracing-settings-page-YfkNCxbP.js +0 -1
  264. package/dist/gateway/static/root/assets/user-model-page-DSV5NkNj.js +0 -2
  265. package/dist/gateway/static/root/assets/workspace-editor-agent-store-DrPVyikA.js +0 -1
@@ -1,10 +1,10 @@
1
1
  import { getSqliteDatabase, init_transaction } from "../../storage/sqlite/transaction.js";
2
2
  import { getSessionInputState, init_session_input_repository } from "../../storage/sqlite/session-input-repository.js";
3
- import { getActiveClarification } from "../../storage/sqlite/clarification-wait-repository.js";
4
3
  import { buildSessionContextForLlm, init_session_context_for_llm } from "../../session/session-context-for-llm.js";
5
4
  import { getActiveConnectionWait, init_connection_wait_repository } from "../../storage/sqlite/connection-wait-repository.js";
6
5
  import { getSessionMetadata } from "../../storage/sqlite/session-read-repository.js";
7
6
  import { getCurrentTranscriptId, init_session_repository } from "../../storage/sqlite/session-repository.js";
7
+ import { getActiveClarification } from "../../storage/sqlite/clarification-wait-repository.js";
8
8
  import { createHash } from "node:crypto";
9
9
  //#region src/gateway/next-turn-suggestions/snapshot.ts
10
10
  init_session_repository();
@@ -132,7 +132,7 @@ function listPortListenersViaNetstat(port) {
132
132
  "TCP"
133
133
  ], {
134
134
  encoding: "utf-8",
135
- shell: true,
135
+ windowsHide: true,
136
136
  timeout: 5e3
137
137
  });
138
138
  } catch {
@@ -171,6 +171,11 @@ async function forceFreePortAndWait(port, opts = {}) {
171
171
  const sigtermTimeoutMs = Math.min(Math.max(opts.sigtermTimeoutMs ?? 700, 0), timeoutMs);
172
172
  const listeners = listPortListeners(port);
173
173
  const killed = [...listeners];
174
+ if (listeners.length === 0) return {
175
+ killed,
176
+ waitedMs: 0,
177
+ escalatedToSigkill: false
178
+ };
174
179
  for (const proc of listeners) try {
175
180
  process.kill(proc.pid, "SIGTERM");
176
181
  log.info({ pid: proc.pid }, "Sent SIGTERM");
@@ -1,5 +1,4 @@
1
1
  import { loadConfig } from "../config/loader.js";
2
- import "../config/index.js";
3
2
  import { isRestartEnabled } from "../config/commands.flags.js";
4
3
  import { restartGatewayProcessWithFreshPid } from "./respawn.js";
5
4
  import { acquireGatewayLock } from "./lock.js";
@@ -3,10 +3,10 @@ import { init_logger } from "../../utils/logger.js";
3
3
  import { init_transaction, runSqliteWriteTransaction } from "../../storage/sqlite/transaction.js";
4
4
  import { readClarificationPresentation } from "../../../packages/gateway-contract/src/clarifications.js";
5
5
  import { init_src } from "../../../packages/gateway-contract/src/index.js";
6
- import { listActiveSessionInputExecutions, listActiveSessionInputRuns } from "../../storage/sqlite/session-input-repository.js";
6
+ import { findSessionInputByRunId, init_session_input_repository, listActiveSessionInputExecutions, listActiveSessionInputRuns } from "../../storage/sqlite/session-input-repository.js";
7
7
  import { TaskRepository, init_task_repository } from "../../tasks/task-repository.js";
8
- import { createClarificationWait, getClarification, getClarificationSnapshot, resolveClarification, supersedeActiveClarification } from "../../storage/sqlite/clarification-wait-repository.js";
9
8
  import { init_connection_wait_repository, onConnectionWaitChanged } from "../../storage/sqlite/connection-wait-repository.js";
9
+ import { createClarificationWait, getClarification, getClarificationSnapshot, resolveClarification, supersedeActiveClarification } from "../../storage/sqlite/clarification-wait-repository.js";
10
10
  import "../../storage/sqlite/index.js";
11
11
  import { AgentRunCancelledError } from "../../agent/orchestration/run-termination.js";
12
12
  import { isPersonalConversation } from "../../personal-agent/repository.js";
@@ -24,6 +24,7 @@ import { SessionInputCoordinator } from "./session-input-coordinator.js";
24
24
  import crypto from "node:crypto";
25
25
  //#region src/gateway/service/agent-runner.ts
26
26
  init_src();
27
+ init_session_input_repository();
27
28
  init_connection_wait_repository();
28
29
  init_logger();
29
30
  init_transaction();
@@ -325,7 +326,7 @@ var GatewayAgentRunner = class {
325
326
  }
326
327
  answerClarificationText(conversationId, text, idempotencyKey) {
327
328
  const wait = getClarificationSnapshot(conversationId)?.clarification;
328
- if (!wait || wait.kind === "approval" || wait.status !== "open" || !text.trim()) return false;
329
+ if (!wait || wait.schemaVersion === 2 || wait.kind === "approval" || wait.status !== "open" || !text.trim()) return false;
329
330
  return this.resolveClarificationResponse({
330
331
  id: wait.id,
331
332
  expectedVersion: wait.version,
@@ -376,6 +377,10 @@ var GatewayAgentRunner = class {
376
377
  */
377
378
  async requestClarification(opts) {
378
379
  const { conversationId, request, publishStreamFor } = opts;
380
+ if (request.schemaVersion === 2) {
381
+ const capable = findSessionInputByRunId(conversationId, opts.runId)?.contextSnapshots?.some((context) => context.kind === "device_context" && context.interactionCapabilities?.clarificationVersions.includes(2));
382
+ if (process.env.XOPC_CLARIFY_MULTI_QUESTION === "false" || !capable || this.externalStreamBySession.has(conversationId) || new TaskConversationRepository().resolveActiveExecutionSession(conversationId)) throw new Error("CLARIFICATION_VERSION_UNSUPPORTED: use single-question clarify in this environment");
383
+ }
379
384
  const taskSession = request.kind !== "approval" ? new TaskConversationRepository().resolveActiveExecutionSession(conversationId) : void 0;
380
385
  if (taskSession?.runId) return {
381
386
  status: "waiting",
@@ -5,9 +5,9 @@ import { parseTurnOutcome } from "../../../packages/gateway-contract/src/turn-ou
5
5
  import { init_src } from "../../../packages/gateway-contract/src/index.js";
6
6
  import { findSessionInputByRunId, init_session_input_repository, listTaskUpdateTriggers } from "../../storage/sqlite/session-input-repository.js";
7
7
  import { TaskRunRepository, init_task_run_repository } from "../../tasks/task-run-repository.js";
8
+ import { getConnectionResumeInput, init_connection_wait_repository, isConnectionSuspended } from "../../storage/sqlite/connection-wait-repository.js";
8
9
  import { isClarificationSuspended } from "../../storage/sqlite/clarification-wait-repository.js";
9
10
  import { updateInteractionStateFromMessage } from "../../storage/sqlite/interaction-state-repository.js";
10
- import { getConnectionResumeInput, init_connection_wait_repository, isConnectionSuspended } from "../../storage/sqlite/connection-wait-repository.js";
11
11
  import "../../storage/sqlite/index.js";
12
12
  import { getConversationRouting } from "../../storage/sqlite/conversation-repository.js";
13
13
  import { init_session_key } from "../../routing/session-key.js";
@@ -4,10 +4,10 @@ import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "
4
4
  import { init_session_instance_repository, readCurrentTranscriptId } from "../../storage/sqlite/session-instance-repository.js";
5
5
  import { SessionInstanceChangedError, cancelQueuedSessionInput, claimNextSessionInput, findSessionInput, findSessionInputByRunId, finishSessionInputRun, getSessionInputById, getSessionInputState, init_session_input_repository, insertSessionInput, mutateQueuedSessionInput, recoverSessionInputState, setSessionInputStatus } from "../../storage/sqlite/session-input-repository.js";
6
6
  import { TaskRunRepository, init_task_run_repository } from "../../tasks/task-run-repository.js";
7
- import { consumeClarificationResume, getActiveClarification, supersedeActiveClarification } from "../../storage/sqlite/clarification-wait-repository.js";
8
- import { replaceLatestSessionTurnAndQueueInput, validateLatestSessionTurnTarget } from "../../storage/sqlite/session-turn-replace-repository.js";
9
7
  import { cancelConnectionObjective, consumeConnectionResume, getActiveConnectionWait, getConnectionWait, hasPendingConnectionMessages, init_connection_wait_repository, interruptedConnectionMessage, publishConnectionWait, reconcileConnectionWaits } from "../../storage/sqlite/connection-wait-repository.js";
10
8
  import { appendTranscriptEntry } from "../../storage/sqlite/transcript-repository.js";
9
+ import { consumeClarificationResume, getActiveClarification, supersedeActiveClarification } from "../../storage/sqlite/clarification-wait-repository.js";
10
+ import { replaceLatestSessionTurnAndQueueInput, validateLatestSessionTurnTarget } from "../../storage/sqlite/session-turn-replace-repository.js";
11
11
  import "../../storage/sqlite/index.js";
12
12
  import { emitSessionTranscriptUpdate } from "../../session/transcript-events.js";
13
13
  import { consumePhoneAssistance, finishPhoneAssistance, phoneAssistance, queuePhoneAssistance, reconcilePhoneAssistance } from "../../phone/assistance.js";
@@ -50,9 +50,10 @@ function connectionInputPayload(wait, control) {
50
50
  };
51
51
  }
52
52
  function sameAppContext(input, existing) {
53
- const identity = (sources) => sources?.filter((source) => source.kind === "app_context").map((source) => ({
53
+ const identity = (sources) => sources?.filter((source) => source.kind === "app_context" || source.kind === "device_context").map((source) => ({
54
54
  snapshot: source.appContext,
55
- principal: source.appContextGrant?.principal.principalId
55
+ principal: source.appContextGrant?.principal.principalId,
56
+ interactionCapabilities: source.interactionCapabilities
56
57
  })) ?? [];
57
58
  return isDeepStrictEqual(input.origin, existing.origin) && isDeepStrictEqual(identity(input.sourceContexts), identity(existing.contextSnapshots));
58
59
  }
@@ -251,6 +251,9 @@ function phoneAssistanceReport(wait) {
251
251
  return {
252
252
  ...wait.checkpoint.report,
253
253
  assistanceId: wait.id,
254
+ assistanceVersion: wait.version,
255
+ transcriptId: wait.transcriptId,
256
+ hasPendingTask: true,
254
257
  reconnectRequired: true,
255
258
  mock: false,
256
259
  mode: "control",
@@ -376,6 +376,10 @@ export type PhoneReading = {
376
376
  };
377
377
  export type PhoneReport = {
378
378
  assistanceId?: string;
379
+ assistanceVersion?: number;
380
+ transcriptId?: string;
381
+ revision?: number;
382
+ hasPendingTask?: boolean;
379
383
  reconnectRequired?: boolean;
380
384
  sessionId: string;
381
385
  deviceId: string;
@@ -92,6 +92,10 @@ export declare class PhoneRuntime {
92
92
  report: {
93
93
  nextExecutionMode: "collaborative" | "direct";
94
94
  assistanceId?: string;
95
+ assistanceVersion?: number;
96
+ transcriptId?: string;
97
+ revision?: number;
98
+ hasPendingTask?: boolean;
95
99
  reconnectRequired?: boolean;
96
100
  sessionId: string;
97
101
  deviceId: string;
@@ -159,7 +163,9 @@ export declare class PhoneRuntime {
159
163
  };
160
164
  liveVideo(owner: string, id: string, context: ExecutionContext): Promise<PhoneInteractiveSession>;
161
165
  private openLiveVideo;
162
- disconnectVideo(owner: string, id: string, client: string, epoch?: number): Promise<void>;
166
+ disconnectVideo(owner: string, id: string, _client: string, _epoch?: number): Promise<void>;
167
+ private clearExpiredHuman;
168
+ private expireHuman;
163
169
  liveFrame(owner: string, id: string, context: ExecutionContext, signal: AbortSignal): Promise<{
164
170
  frame: Buffer<ArrayBuffer>;
165
171
  height: number;
@@ -330,6 +330,8 @@ var PhoneRuntime = class {
330
330
  modelRequests: session.report.modelRequests - session.segmentUsage.modelRequests,
331
331
  activeDurationMs: session.segmentUsage.activeDurationMs + (session.budget?.elapsedMs ?? 0)
332
332
  }, session.report.feedback);
333
+ session.report.revision = (session.report.revision ?? 0) + 1;
334
+ session.report.hasPendingTask = Boolean(session.taskPending);
333
335
  session.report.updatedAt = Date.now();
334
336
  if (session.report.task) updatePhoneCheckpoint(session.report.owner, this.checkpoint(session));
335
337
  this.repository.report(session.report);
@@ -1665,15 +1667,7 @@ var PhoneRuntime = class {
1665
1667
  this.stopDevice(session.device.id);
1666
1668
  continue;
1667
1669
  }
1668
- if (session.human && Date.now() > (session.humanExpiresAt ?? 0)) {
1669
- session.human = void 0;
1670
- session.report.controlOwner = "none";
1671
- session.report.controlEpoch++;
1672
- session.report.status = "paused";
1673
- session.report.stopReason = "control_disconnected";
1674
- this.publish(session);
1675
- session.stream?.revoke().catch(() => this.stop(session.report.owner, "cancel"));
1676
- }
1670
+ if (session.human && Date.now() > (session.humanExpiresAt ?? 0)) this.expireHuman(session).catch(() => this.stop(session.report.owner, "cancel"));
1677
1671
  if (Date.now() - session.viewedAt > 3e4) session.frames.clear();
1678
1672
  } catch {
1679
1673
  session.frames.clear();
@@ -1776,28 +1770,39 @@ var PhoneRuntime = class {
1776
1770
  throw error;
1777
1771
  }
1778
1772
  }
1779
- async disconnectVideo(owner, id, client, epoch) {
1773
+ async disconnectVideo(owner, id, _client, _epoch) {
1780
1774
  const session = this.sessions.get(owner);
1781
1775
  if (!session || session.report.sessionId !== id) return;
1782
- if (session.human === client && (epoch === void 0 || session.report.controlEpoch === epoch)) {
1783
- session.human = void 0;
1784
- session.report.controlOwner = "none";
1785
- session.report.controlEpoch++;
1786
- session.report.status = "paused";
1787
- session.report.stopReason = "control_disconnected";
1788
- this.publish(session);
1789
- try {
1790
- await session.stream?.revoke();
1791
- } catch {
1792
- await this.stop(owner, "cancel");
1793
- }
1794
- }
1795
1776
  if (session.stream?.viewerCount === 0) {
1796
1777
  const stream = session.stream;
1797
1778
  session.stream = void 0;
1798
1779
  await stream.close();
1799
1780
  }
1800
1781
  }
1782
+ async clearExpiredHuman(session) {
1783
+ if (!session.human || Date.now() <= (session.humanExpiresAt ?? 0)) return;
1784
+ session.human = void 0;
1785
+ session.report.controlOwner = "none";
1786
+ session.report.controlEpoch++;
1787
+ session.report.status = "paused";
1788
+ session.report.stopReason = "control_disconnected";
1789
+ session.report.handoff = "acquiring";
1790
+ this.publish(session);
1791
+ try {
1792
+ await session.stream?.revoke();
1793
+ } catch (error) {
1794
+ await this.stop(session.report.owner, "cancel");
1795
+ throw error;
1796
+ } finally {
1797
+ session.report.handoff = "idle";
1798
+ this.publish(session);
1799
+ }
1800
+ }
1801
+ expireHuman(session) {
1802
+ const work = session.commands.catch(() => {}).then(() => this.clearExpiredHuman(session));
1803
+ session.commands = work.catch(() => {});
1804
+ return work;
1805
+ }
1801
1806
  async liveFrame(owner, id, context, signal) {
1802
1807
  const session = this.liveSession(owner, id, context);
1803
1808
  if (terminal.has(session.report.status)) {
@@ -1857,6 +1862,7 @@ var PhoneRuntime = class {
1857
1862
  if (terminal.has(session.report.status)) throw new PhoneError("PHONE_OPEN_REQUIRED", "Phone session ended", 409);
1858
1863
  this.guard(session, context, input.op === "handback");
1859
1864
  if (session.switching) throw new PhoneError("PHONE_SESSION_BUSY", "Phone execution mode is changing", 409);
1865
+ await this.clearExpiredHuman(session);
1860
1866
  if (input.epoch !== session.report.controlEpoch) throw new PhoneError("PHONE_CONTROL_CHANGED", "Control changed. Refresh before trying again.", 409);
1861
1867
  if (session.human && session.human !== client) throw new PhoneError("PHONE_CONTROL_BUSY", "Another browser window controls this phone", 409);
1862
1868
  if (input.op === "cancel") {
@@ -1992,7 +1998,8 @@ var PhoneRuntime = class {
1992
1998
  if (!session) throw new PhoneError("PHONE_OPEN_REQUIRED", "Reconnect the phone before continuing", 409);
1993
1999
  this.guard(session, context);
1994
2000
  if (session.report.controlOwner === "agent" && session.report.status === "ready") return;
1995
- await this.liveControl(owner, session.report.sessionId, context, session.human ?? `phone-user:${owner}`, {
2001
+ if (session.human) throw new PhoneError("PHONE_CONTROL_BUSY", "Another client is operating the phone. End manual control before continuing.", 409);
2002
+ await this.liveControl(owner, session.report.sessionId, context, `phone-user:${owner}`, {
1996
2003
  op: "handback",
1997
2004
  epoch: session.report.controlEpoch,
1998
2005
  operationId: randomUUID()
@@ -1,9 +1,9 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
2
  import { validateConversationId } from "../../packages/gateway-contract/src/conversation-identity.js";
3
3
  import { init_src } from "../../packages/gateway-contract/src/index.js";
4
+ import { init_string_coerce, normalizeLowercaseStringOrEmpty } from "../utils/string-coerce.js";
4
5
  import { DEFAULT_ACCOUNT_ID, init_account_id, normalizeAccountId, normalizeOptionalAccountId } from "./account-id.js";
5
6
  import { init_conversation_repository, requireConversation, resolveRoutedConversation } from "../storage/sqlite/conversation-repository.js";
6
- import { init_string_coerce, normalizeLowercaseStringOrEmpty } from "../utils/string-coerce.js";
7
7
  //#region src/routing/agent-session-key.ts
8
8
  function normalizeMainKey(value) {
9
9
  return normalizeLowercaseStringOrEmpty(value) || "main";
@@ -298,6 +298,7 @@ function buildSessionContextForLlm(rows) {
298
298
  continue;
299
299
  }
300
300
  if (isTranscriptCustomMessageEntry(r)) {
301
+ if (r.customType === "clarification_answers") continue;
301
302
  if (r.customType === "task_allocation_status" && isRoutineTaskAllocationStatus(r.details)) continue;
302
303
  if (r.customType === "personal_request_status" || r.customType === "connection_control_status") continue;
303
304
  if (r.customType === "personal_proactive_message") {
@@ -1,12 +1,12 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
+ import { readAgentMessageContent } from "../agent/memory/agent-message-access.js";
3
4
  import { getConversationRouting } from "../storage/sqlite/conversation-repository.js";
4
5
  import { isCronConversationId } from "../routing/agent-session-key.js";
5
6
  import { init_session_key } from "../routing/session-key.js";
6
7
  import { init_providers, resolveModel } from "../providers/index.js";
7
8
  import { completeWithResolvedCredentials } from "../providers/model-call.js";
8
9
  import { stripRuntimeContextFromUserMessage } from "./user-message-display.js";
9
- import { readAgentMessageContent } from "../agent/memory/agent-message-access.js";
10
10
  //#region src/session/session-title.ts
11
11
  init_session_key();
12
12
  init_providers();
@@ -5,6 +5,8 @@ import { init_src } from "../../../packages/gateway-contract/src/index.js";
5
5
  import { init_session_instance_repository, readCurrentTranscriptId } from "./session-instance-repository.js";
6
6
  import { bumpSessionInputRevision, getSessionInputById, getSessionInputState, init_session_input_repository, insertSessionInput } from "./session-input-repository.js";
7
7
  import { TaskRunRepository, init_task_run_repository } from "../../tasks/task-run-repository.js";
8
+ import { appendTranscriptEntry } from "./transcript-repository.js";
9
+ import { estimateTextTokens } from "../../agent/memory/context-budget.js";
8
10
  import { randomUUID } from "node:crypto";
9
11
  //#region src/storage/sqlite/clarification-wait-repository.ts
10
12
  init_src();
@@ -16,7 +18,8 @@ init_transaction();
16
18
  const APPROVAL_TTL_MS = 10 * 6e4;
17
19
  const STALE_CONTEXT_MS = 1440 * 6e4;
18
20
  function rowToWait(row) {
19
- return JSON.parse(row.data_json);
21
+ const wait = JSON.parse(row.data_json);
22
+ return wait.schemaVersion === 2 ? normalizeClarificationQuestion(wait) : wait;
20
23
  }
21
24
  function getRow(id) {
22
25
  return getSqliteDatabase().prepare(`SELECT id, conversation_id, transcript_id, status, version, data_json
@@ -176,6 +179,8 @@ function createClarificationWait(input) {
176
179
  kind: input.kind,
177
180
  status: "open",
178
181
  question: input.question.trim(),
182
+ schemaVersion: input.schemaVersion,
183
+ questions: input.questions,
179
184
  interactionMode: input.interactionMode,
180
185
  choiceDetails: input.choiceDetails,
181
186
  recommendedChoiceId: input.recommendedChoiceId,
@@ -232,10 +237,12 @@ function resolveClarification(input) {
232
237
  let normalized;
233
238
  try {
234
239
  if (input.action === "answer") normalized = normalizeClarificationSubmission(wait, {
240
+ schemaVersion: input.schemaVersion,
241
+ answers: input.answers,
235
242
  response: input.response,
236
243
  decision: input.decision
237
244
  });
238
- else if (input.response !== void 0 || input.decision !== void 0) return {
245
+ else if (input.response !== void 0 || input.decision !== void 0 || input.answers !== void 0) return {
239
246
  ok: false,
240
247
  code: "INVALID"
241
248
  };
@@ -245,13 +252,28 @@ function resolveClarification(input) {
245
252
  code: "INVALID"
246
253
  };
247
254
  }
255
+ if (wait.schemaVersion === 2 && normalized && estimateTextTokens(normalized.answer) > 2e3) return {
256
+ ok: false,
257
+ code: "INVALID"
258
+ };
259
+ if (wait.schemaVersion === 2 !== (input.schemaVersion === 2)) return {
260
+ ok: false,
261
+ code: "INVALID"
262
+ };
263
+ const responseIdentity = JSON.stringify({
264
+ schemaVersion: wait.schemaVersion ?? 1,
265
+ action: input.action,
266
+ answers: normalized?.answers,
267
+ response: normalized?.response,
268
+ decision: normalized?.decision
269
+ });
248
270
  if (input.action === "agent_decide" && wait.kind === "approval") return {
249
271
  ok: false,
250
272
  code: "INVALID"
251
273
  };
252
274
  const resolution = input.action === "answer" ? "answered" : input.action === "agent_decide" ? "agent_decide" : "cancelled";
253
275
  if (wait.responseIdempotencyKey === input.idempotencyKey) {
254
- if (wait.resolution !== resolution || normalized && wait.answer !== normalized.answer) return {
276
+ if (wait.resolution !== resolution || (wait.schemaVersion === 2 ? wait.responseIdentity !== responseIdentity : normalized && wait.answer !== normalized.answer)) return {
255
277
  ok: false,
256
278
  code: "CONFLICT",
257
279
  clarification: wait
@@ -279,6 +301,7 @@ function resolveClarification(input) {
279
301
  status: "cancelled",
280
302
  resolution,
281
303
  responseIdempotencyKey: input.idempotencyKey,
304
+ responseIdentity,
282
305
  resolvedAt: now,
283
306
  updatedAt: now
284
307
  }, wait.version);
@@ -298,10 +321,14 @@ function resolveClarification(input) {
298
321
  };
299
322
  }
300
323
  const answer = input.action === "agent_decide" ? "Use your best judgment and continue without additional user input." : normalized.answer;
324
+ const resumeInputId = randomUUID();
301
325
  const queued = writeWait({
302
326
  ...wait,
303
327
  status: "queued",
304
328
  response: normalized?.response,
329
+ answers: normalized?.answers,
330
+ responseIdentity,
331
+ resumeInputId,
305
332
  decision: normalized?.decision,
306
333
  answer,
307
334
  resolution,
@@ -324,7 +351,7 @@ function resolveClarification(input) {
324
351
  ].filter(Boolean).join("\n");
325
352
  const origin = getSessionInputById(wait.conversationId, wait.originInputId);
326
353
  insertSessionInput({
327
- id: randomUUID(),
354
+ id: resumeInputId,
328
355
  conversationId: wait.conversationId,
329
356
  expectedTranscriptId: wait.transcriptId,
330
357
  clientMessageId: input.idempotencyKey,
@@ -347,6 +374,20 @@ function resolveClarification(input) {
347
374
  source: "internal"
348
375
  }
349
376
  });
377
+ if (wait.schemaVersion === 2) appendTranscriptEntry(wait.conversationId, {
378
+ role: "custom",
379
+ customType: "clarification_answers",
380
+ display: true,
381
+ content: answer,
382
+ details: {
383
+ waitId: wait.id,
384
+ schemaVersion: 2,
385
+ questions: wait.questions,
386
+ answers: normalized?.answers,
387
+ resolution
388
+ },
389
+ timestamp: now
390
+ }, { transcriptId: wait.transcriptId });
350
391
  return {
351
392
  ok: true,
352
393
  clarification: queued,
@@ -15,9 +15,14 @@ import { createCollaborationRule, getCollaborationRule, listCollaborationRules,
15
15
  import { createContextEvidence } from "./context-evidence-repository.js";
16
16
  import { getUserPeopleIndexState, getUserPerson, listUserPeople, mergeUserPeople, replaceUserPeopleIndex, summarizeUserPeople, updateUserPerson } from "./user-people-repository.js";
17
17
  import { cancelQueuedSessionInput, claimNextSessionInput, findSessionInput, finishSessionInputRun, getSessionInputById, getSessionInputState, init_session_input_repository, insertSessionInput, listActiveSessionInputExecutions, listActiveSessionInputRuns, listTaskUpdateRunIds, listTaskUpdateTriggers, mutateQueuedSessionInput, recoverSessionInputState, setSessionInputStatus } from "./session-input-repository.js";
18
- import { consumeClarificationApproval, consumeClarificationResume, createClarificationWait, getActiveClarification, getClarification, getClarificationResumeInput, getClarificationSnapshot, isClarificationSuspended, resolveClarification, supersedeActiveClarification } from "./clarification-wait-repository.js";
19
18
  import { buildDefaultSessionMetadata, init_session_metadata } from "./session-metadata.js";
20
19
  import { buildGlobalSessionStats, classifyStoredRow, estimateTokensFromMessages, extractFtsContent, init_row_mappers, metadataToSessionInsert, sessionConfigRowToConfig, sessionRowToMetadata, transcriptEntryRowToStoredRow } from "./row-mappers.js";
20
+ import { getConnectorAccount, init_connector_account_repository, listConnectorAccounts, reconcileConnectorAccount, refreshConnectorAccountCurrent } from "./connector-account-repository.js";
21
+ import { appendConnectorExecutionAudit, claimConnectorWebhookDelivery, completeConnectorWebhookDelivery, consumeConnectorApproval, createConnectorApproval, decideConnectorApproval, deleteConnectorConnection, deleteConnectorInstallation, getCachedConnectorCatalogEntry, getConnectorApproval, getConnectorConnection, getConnectorInstallation, init_connector_repository, listCachedConnectorCatalogEntries, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation } from "./connector-repository.js";
22
+ import { getSessionMetadata } from "./session-read-repository.js";
23
+ import { deleteSessionRecord, ensureSessionRecord, findConversationIdByTranscriptId, getCurrentTranscriptId, getGlobalSessionStats, incrementSessionStatsOnAppend, init_session_repository, listSessionMetadata, listSessionsByAgent, patchSessionMetadata, resetSessionRecord, resolveSessionAgentId, updateSessionStats } from "./session-repository.js";
24
+ import { appendCompactionBoundaryIfUnchanged, appendMediaToAssistantTranscriptEntry, appendTranscriptEntry, findLatestAssistantTranscriptEntryId, listCompactionBoundaries, loadCompactionSourceSnapshot, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, paginateTranscriptMessages, replaceTranscriptRows, restoreBeforeCompactionBoundary, searchSessionTranscript } from "./transcript-repository.js";
25
+ import { consumeClarificationApproval, consumeClarificationResume, createClarificationWait, getActiveClarification, getClarification, getClarificationResumeInput, getClarificationSnapshot, isClarificationSuspended, resolveClarification, supersedeActiveClarification } from "./clarification-wait-repository.js";
21
26
  import { replaceLatestSessionTurnAndQueueInput, validateLatestSessionTurnTarget } from "./session-turn-replace-repository.js";
22
27
  import { acknowledgeHomeAttention, isHomeAttentionAcknowledged } from "./home-attention-repository.js";
23
28
  import { claimNextConnectorLearningJob, enqueueConnectorLearningJob, listConnectorLearningJobs, recoverStaleConnectorLearningJobs, setConnectorLearningPaused, updateConnectorLearningJob } from "./connector-learning-repository.js";
@@ -25,13 +30,8 @@ import { COMPOSER_INPUT_HISTORY_LIMIT, appendComposerInputHistory, clearComposer
25
30
  import { bindEndpointPrincipal, createEndpointPrincipal, getEndpointPrincipal, listEndpointPrincipals, revokeEndpointPrincipal, touchEndpointPrincipal } from "./endpoint-principal-repository.js";
26
31
  import { finishEndpointToolInvocationAudit, listEndpointToolInvocationAuditPage, startEndpointToolInvocationAudit } from "./endpoint-tool-invocation-repository.js";
27
32
  import { getInteractionState, setInteractionState, updateInteractionStateFromMessage } from "./interaction-state-repository.js";
28
- import { getConnectorAccount, init_connector_account_repository, listConnectorAccounts, reconcileConnectorAccount, refreshConnectorAccountCurrent } from "./connector-account-repository.js";
29
- import { appendConnectorExecutionAudit, claimConnectorWebhookDelivery, completeConnectorWebhookDelivery, consumeConnectorApproval, createConnectorApproval, decideConnectorApproval, deleteConnectorConnection, deleteConnectorInstallation, getCachedConnectorCatalogEntry, getConnectorApproval, getConnectorConnection, getConnectorInstallation, init_connector_repository, listCachedConnectorCatalogEntries, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation } from "./connector-repository.js";
30
- import { getSessionMetadata } from "./session-read-repository.js";
31
- import { deleteSessionRecord, ensureSessionRecord, findConversationIdByTranscriptId, getCurrentTranscriptId, getGlobalSessionStats, incrementSessionStatsOnAppend, init_session_repository, listSessionMetadata, listSessionsByAgent, patchSessionMetadata, resetSessionRecord, resolveSessionAgentId, updateSessionStats } from "./session-repository.js";
32
33
  import { getSessionTaskPlan, setSessionTaskPlan } from "./session-task-plan-repository.js";
33
34
  import { SidebarLayoutConflictError, getSidebarLayout, replaceSidebarLayout, sortBySidebarLayout } from "./sidebar-layout-repository.js";
34
- import { appendCompactionBoundaryIfUnchanged, appendMediaToAssistantTranscriptEntry, appendTranscriptEntry, findLatestAssistantTranscriptEntryId, listCompactionBoundaries, loadCompactionSourceSnapshot, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, paginateTranscriptMessages, replaceTranscriptRows, restoreBeforeCompactionBoundary, searchSessionTranscript } from "./transcript-repository.js";
35
35
  import { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord } from "./notes-repository.js";
36
36
  import { deleteNoteAgentContextRecord, getNoteAgentContextRecord, upsertNoteAgentContextRecord } from "./note-agent-context-repository.js";
37
37
  import { claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, countKnowledgeSourceItems, deleteKnowledgeSourceItems, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, pruneBoundedKnowledgeSourceItems, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, startKnowledgeSyncRun, upsertKnowledgeSourceItems } from "./knowledge-repository.js";
@@ -2,10 +2,10 @@ import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "
2
2
  import { sessionCommandIdentity } from "../../../packages/gateway-contract/src/session-input-command.js";
3
3
  import { init_src } from "../../../packages/gateway-contract/src/index.js";
4
4
  import { init_session_input_repository, insertSessionInput } from "./session-input-repository.js";
5
- import { supersedeActiveClarification } from "./clarification-wait-repository.js";
6
5
  import { cancelConnectionObjective, init_connection_wait_repository } from "./connection-wait-repository.js";
7
6
  import { getSessionMetadata } from "./session-read-repository.js";
8
7
  import { init_session_repository } from "./session-repository.js";
8
+ import { supersedeActiveClarification } from "./clarification-wait-repository.js";
9
9
  import { setSessionConfig } from "./config-repository.js";
10
10
  import { createConversation, init_conversation_repository } from "./conversation-repository.js";
11
11
  import { createHash, randomUUID } from "node:crypto";
@@ -3,10 +3,10 @@ import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "
3
3
  import { validateConversationId, validateTranscriptId } from "../../../packages/gateway-contract/src/conversation-identity.js";
4
4
  import { init_src } from "../../../packages/gateway-contract/src/index.js";
5
5
  import { init_session_instance_repository, readCurrentTranscriptId } from "./session-instance-repository.js";
6
- import { TaskRunRepository, init_task_run_repository } from "../../tasks/task-run-repository.js";
7
6
  import { buildDefaultSessionMetadata, init_session_metadata } from "./session-metadata.js";
8
7
  import { init_timestamps, optionalTimestampToMs } from "./timestamps.js";
9
8
  import { buildGlobalSessionStats, init_row_mappers, metadataToSessionInsert, sessionRowToMetadata } from "./row-mappers.js";
9
+ import { TaskRunRepository, init_task_run_repository } from "../../tasks/task-run-repository.js";
10
10
  import { cancelConnectionObjective, init_connection_wait_repository } from "./connection-wait-repository.js";
11
11
  import { init_changes, notifyUserContextChange } from "../../user-context/changes.js";
12
12
  import { SESSION_PURPOSE_SQL, SESSION_SOURCE_SQL, init_session_identity_sql } from "./session-identity-sql.js";
@@ -1,7 +1,7 @@
1
1
  import { TaskRepository, init_task_repository } from "./task-repository.js";
2
2
  import { TaskRunRepository, init_task_run_repository } from "./task-run-repository.js";
3
- import { isHomeAttentionAcknowledged } from "../storage/sqlite/home-attention-repository.js";
4
3
  import { listConnectorApprovals } from "../storage/sqlite/connector-repository.js";
4
+ import { isHomeAttentionAcknowledged } from "../storage/sqlite/home-attention-repository.js";
5
5
  import "../storage/sqlite/index.js";
6
6
  import { TaskReadModelProjector } from "./task-read-model-projector.js";
7
7
  import "../automations/domain/defaults.js";
@@ -1,6 +1,6 @@
1
1
  import { afterSqliteCommit, getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
2
- import { enqueueTaskChangedEvent, init_task_change_events } from "./task-change-events.js";
3
2
  import { init_task_allocation_status, isRoutineTaskAllocationStatus } from "../session/task-allocation-status.js";
3
+ import { enqueueTaskChangedEvent, init_task_change_events } from "./task-change-events.js";
4
4
  import { appendTranscriptEntry } from "../storage/sqlite/transcript-repository.js";
5
5
  import { emitSessionTranscriptUpdate } from "../session/transcript-events.js";
6
6
  import { resolveTaskLocale } from "./task-language.js";
@@ -5,8 +5,8 @@ import { openXopcDatabase } from "../../storage/sqlite/connection.js";
5
5
  import { canonicalSessionCommand, sessionInputCommandSchema } from "../../../packages/gateway-contract/src/session-input-command.js";
6
6
  import { init_src } from "../../../packages/gateway-contract/src/index.js";
7
7
  import { cancelQueuedSessionInput, claimNextSessionInput, finishSessionInputRun, getSessionInputById, getSessionInputState, init_session_input_repository, setSessionInputStatus } from "../../storage/sqlite/session-input-repository.js";
8
- import { appendComposerInputHistory, listComposerInputHistory } from "../../storage/sqlite/composer-input-history-repository.js";
9
8
  import { getSessionMetadata } from "../../storage/sqlite/session-read-repository.js";
9
+ import { appendComposerInputHistory, listComposerInputHistory } from "../../storage/sqlite/composer-input-history-repository.js";
10
10
  import "../../storage/sqlite/index.js";
11
11
  import { normalizeAgentId } from "../../agent-catalog/id.js";
12
12
  import { init_agent_scope, listAgentEntries } from "../../agent/agent-scope.js";
@@ -24,6 +24,9 @@ export declare class TunnelBrokerClient {
24
24
  constructor(baseUrl: string);
25
25
  private apiUrl;
26
26
  register(input: BrokerRegisterInput): Promise<TunnelRegistration>;
27
+ /** Explicit takeover requires a separately signed recovery audience. */
28
+ recover(input: BrokerRegisterInput): Promise<TunnelRegistration>;
29
+ private requestRegistration;
27
30
  heartbeat(tunnelId: string, tunnelToken: string): Promise<void>;
28
31
  deregister(tunnelId: string, tunnelToken: string): Promise<void>;
29
32
  }
@@ -50,7 +50,14 @@ var TunnelBrokerClient = class {
50
50
  return `${this.baseUrl.replace(/\/+$/, "")}${path.startsWith("/") ? path : `/${path}`}`;
51
51
  }
52
52
  async register(input) {
53
- const url = this.apiUrl("/tunnels/register");
53
+ return this.requestRegistration(input, false);
54
+ }
55
+ /** Explicit takeover requires a separately signed recovery audience. */
56
+ async recover(input) {
57
+ return this.requestRegistration(input, true);
58
+ }
59
+ async requestRegistration(input, recovering) {
60
+ const url = this.apiUrl(recovering ? "/tunnels/recover" : "/tunnels/register");
54
61
  const res = await fetch(url, {
55
62
  redirect: "error",
56
63
  signal: AbortSignal.timeout(15e3),
@@ -59,7 +66,10 @@ var TunnelBrokerClient = class {
59
66
  "Content-Type": "application/json",
60
67
  "X-Registration-Secret": input.registrationSecret
61
68
  },
62
- body: JSON.stringify(createTunnelRegistrationProof(input))
69
+ body: JSON.stringify(createTunnelRegistrationProof({
70
+ ...input,
71
+ brokerUrl: recovering ? url : this.baseUrl
72
+ }))
63
73
  });
64
74
  if (!res.ok) {
65
75
  log.error({
@@ -68,6 +78,7 @@ var TunnelBrokerClient = class {
68
78
  }, "Tunnel register failed");
69
79
  const body = await res.json().catch(() => null);
70
80
  if (res.status === 403 && body?.code === "REGISTRATION_DENIED" && body.error === "Active lease ownership proof required") throw new TunnelRecoveryProofRejectedError();
81
+ if (recovering && res.status === 404) throw new TunnelBrokerError(404, "Immediate recovery requires an updated cloud tunnel broker");
71
82
  if (res.status === 401) throw new TunnelRegistrationKeyRejectedError();
72
83
  throw new TunnelBrokerError(res.status, `Tunnel register failed: ${res.status}`);
73
84
  }
@@ -92,10 +103,7 @@ var TunnelBrokerClient = class {
92
103
  method: "DELETE",
93
104
  headers: { "X-Tunnel-Token": tunnelToken }
94
105
  });
95
- if (!res.ok && res.status !== 404) log.warn({
96
- tunnelId,
97
- status: res.status
98
- }, "Tunnel deregister returned non-OK");
106
+ if (!res.ok) throw new TunnelBrokerError(res.status, `Tunnel deregister failed: ${res.status}`);
99
107
  }
100
108
  };
101
109
  function resolveBrokerApiBase(brokerUrl) {