@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.
- package/dist/browser-ext/dist/assets/{page-context-BKnEwsOO.js → page-context-b-rB5vJC.js} +1 -1
- package/dist/browser-ext/dist/background.js +1 -1
- package/dist/browser-ext/dist/sidepanel.html +1 -1
- package/dist/browser-ext/dist/sidepanel.js +29 -1
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-CvJ9rdwP.js → activity-store-AI081rxe.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CFP6g4w7.js → agent-avatar-dicebear-DupnTbL7.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-display-BHBe88Gu.js → agent-avatar-display-CmEj6Uqy.js} +2 -2
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-IEV5yKuu.js +1 -0
- package/dist/gateway/static/root/assets/{agent-plugin-dialog-C_Dm-u6_.js → agent-plugin-dialog-D_njOuFA.js} +1 -1
- package/dist/gateway/static/root/assets/{agents-BdVJHOiK.js → agents-B_yg9nA3.js} +4 -4
- package/dist/gateway/static/root/assets/{agents-admin-api-Do1Pza0R.js → agents-admin-api-CUZUolwG.js} +1 -1
- package/dist/gateway/static/root/assets/{api-ONg37_fH.js → api-CWWEVThO.js} +1 -1
- package/dist/gateway/static/root/assets/{api-BQv5dLcH.js → api-bpQ7yR10.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-B4Wqhf4J.js → app-management-settings-panel-C0_hxwgg.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-Dm1kRzKL.js → appearance-settings-CLh-qnCC.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-D1MMk1P7.js → apps-page-Bjtm3Rgi.js} +1 -1
- package/dist/gateway/static/root/assets/{archive-plugin-p_yLkyaC.js → archive-plugin-dGnstkhB.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-api-DQaWBR03.js → automation-api-MB2xCoFF.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-result-state-CO_243JM.js → automation-result-state-DJQflY78.js} +1 -1
- package/dist/gateway/static/root/assets/automation-task-card-DXgBxVE2.js +3 -0
- package/dist/gateway/static/root/assets/{automations-page-Ba64H37d.js → automations-page-D3O7M2FH.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-Dk3FVWoX.js +9 -0
- package/dist/gateway/static/root/assets/{binary-plugins-B-6kyqtt.js → binary-plugins-BrVJXmYf.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-B5ysJ96n.js → block-editor-Dok4sfT3.js} +2 -2
- package/dist/gateway/static/root/assets/{browser-automation-inputs-C2A3NIt3.js → browser-automation-inputs-PJbT3CxW.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automations-page-CnbXFw1_.js → browser-automations-page-kkpX1Q7K.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-control-api-Aj_seKE9.js → browser-control-api-Bg4wnkeA.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-settings-page-C7fxPq_z.js → browser-settings-page-BrgX_Yb2.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-DOTgaSgA.js → capabilities-BMaJizw4.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-BgtCwC_E.js → capabilities-Cs6Jt5Gl.js} +1 -1
- package/dist/gateway/static/root/assets/capabilities-page-D5hvAG6D.js +2 -0
- package/dist/gateway/static/root/assets/{capabilities-settings-panel-pYWZtPeU.js → capabilities-settings-panel-BrEvm4IH.js} +3 -3
- package/dist/gateway/static/root/assets/{channels-DGpRM6pj.js → channels-1jQgGVc9.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-agents-api-EvJ_Wvuc.js → chat-agents-api-BAOWaUJf.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-chart-block-BQDbHLcw.js → chat-chart-block-DeWrb9XR.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-page-GF9NIuZN.js → chat-page-CafkCKOj.js} +30 -30
- package/dist/gateway/static/root/assets/{chat-terminal-dock-DHFTGoEp.js → chat-terminal-dock-C544n0-R.js} +1 -1
- package/dist/gateway/static/root/assets/{command-palette-api-DPA_yEuy.js → command-palette-api-D9PXzY8b.js} +1 -1
- package/dist/gateway/static/root/assets/{composer-payload-handoff-BTjauSNp.js → composer-payload-handoff-CYXfjpem.js} +1 -1
- package/dist/gateway/static/root/assets/{computer-settings-page-BFSSQfcx.js → computer-settings-page-DJmod8-w.js} +1 -1
- package/dist/gateway/static/root/assets/connected-providers-grid-b46VH4uy.js +1 -0
- package/dist/gateway/static/root/assets/{connector-service-page-CFvg58qa.js → connector-service-page-BqDbTOTp.js} +1 -1
- package/dist/gateway/static/root/assets/{connectors-api-CbC6Yht5.js → connectors-api-CwRuUnH4.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-Mq9Bvoax.js +1 -0
- package/dist/gateway/static/root/assets/{date-picker-Dd3MbG0x.js → date-picker-DWaT0IC0.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-DcsHg2ml.js → dependency-picker-DV9XAt6F.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-DldzQT2h.js → desktop-pet-Dffq2NxL.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-CYdI4KxB.js → desktop-pet-settings-CrB1ICax.js} +1 -1
- package/dist/gateway/static/root/assets/{dev-view-store-JiJv585f.js → dev-view-store-liRgSkcT.js} +1 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-1du1hfi5.js +1 -0
- package/dist/gateway/static/root/assets/{directory-picker-path-field-8WOXv8zw.js → directory-picker-path-field-EKqQLQrE.js} +1 -1
- package/dist/gateway/static/root/assets/{discussion-annotation-sync-B-grSe0w.js → discussion-annotation-sync-D-b1X6ro.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-EEQkTNEu.js → extension-debug-page-wD97GeG0.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-iframe-host-vlZVeMCY.js → extension-iframe-host-B4Q1CjvW.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-marketplace-api-_o2In_al.js → extension-marketplace-api-ak1_K3u8.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CPrT111s.js → extension-page-DWFI4iIh.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-provider-B2Mf3FBu.js → extension-provider-BZwcaU5Y.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-CznJEgWV.js → extension-settings-page-cn4KS42C.js} +1 -1
- package/dist/gateway/static/root/assets/{file-preview-surface-7h8_fZul.js → file-preview-surface-c3gDD9sM.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-DbbNEOKj.js → gateway-config-swr-Dmt5JhZU.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-realtime-D20ZrAuM.js → gateway-realtime-CJtDXQCt.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-DcsZyYEa.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-restart-5ut-lhJm.js → gateway-restart-DInvvT5u.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-BCf_cibp.js → gateway-settings-BZXdv2FE.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-DlHL0DpH.js → gateway-startup-retry-s2KcWekp.js} +1 -1
- package/dist/gateway/static/root/assets/{global-defaults-api-CmODomcV.js → global-defaults-api-DtnmDd87.js} +1 -1
- package/dist/gateway/static/root/assets/{home-page-uz22TRB-.js → home-page-CAVjA5rO.js} +2 -2
- package/dist/gateway/static/root/assets/{image-generation-api-dzPnpUFu.js → image-generation-api-RQQokgE9.js} +1 -1
- package/dist/gateway/static/root/assets/{imports-page-ChBoNMyE.js → imports-page-BP_4TubV.js} +1 -1
- package/dist/gateway/static/root/assets/index-BS9mjvSL.js +11 -0
- package/dist/gateway/static/root/assets/index-pT-m6l6b.css +1 -0
- package/dist/gateway/static/root/assets/{install-connector-dialog-CNcdQDX0.js → install-connector-dialog-BNzNuXJ8.js} +1 -1
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CRbYq2_g.js → keyboard-shortcuts-settings-DNRQFepg.js} +1 -1
- package/dist/gateway/static/root/assets/{local-app-workbench-page-04cX5TJu.js → local-app-workbench-page-CvY5XxbX.js} +1 -1
- package/dist/gateway/static/root/assets/{local-apps-page-fWM0FEhN.js → local-apps-page-DfwEvd8G.js} +1 -1
- package/dist/gateway/static/root/assets/local-session-drafts-CuDdIyxR.js +4 -0
- package/dist/gateway/static/root/assets/{locale-store-VNjH18Dj.js → locale-store-TQcz_Vjt.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-6GanGLrm.js → logs-page-eq49F1Rt.js} +1 -1
- package/dist/gateway/static/root/assets/{management-settings-BxD_lc4E.js → management-settings-BaYXDMOJ.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-view-DLCBYWtx.js → markdown-view-D4nII6Zv.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-BvtNwKFb.js → media-plugins-MvlAY405.js} +1 -1
- package/dist/gateway/static/root/assets/messages-DaLmc4W1.js +3 -0
- package/dist/gateway/static/root/assets/model-selector-nsoNHqif.js +1 -0
- package/dist/gateway/static/root/assets/{models-hub-cache-_qE7L-_H.js → models-hub-cache-CFIazNIF.js} +1 -1
- package/dist/gateway/static/root/assets/note-detail-panel-KPzbHiEW.js +5 -0
- package/dist/gateway/static/root/assets/note-image-lightbox-DticJxxh.js +1 -0
- package/dist/gateway/static/root/assets/{notes-api-Bxa11X3a.js → notes-api-HVxR5bRD.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-page-D2QpJ3WZ.js → notes-page-yShJeR3i.js} +1 -1
- package/dist/gateway/static/root/assets/{oauth-api-DIE4UpP7.js → oauth-api-CfKjRVnb.js} +1 -1
- package/dist/gateway/static/root/assets/{oauth-provider-connect-B95tiddN.js → oauth-provider-connect-D4uqONWr.js} +1 -1
- package/dist/gateway/static/root/assets/{page-context-capture-button-C-QbbwmN.js → page-context-capture-button-B98nlKTc.js} +1 -1
- package/dist/gateway/static/root/assets/{page-context-draft-BHmOfksL.js → page-context-draft-HcuK45iu.js} +1 -1
- package/dist/gateway/static/root/assets/page-header-store-D6SzJ9Ch.js +1 -0
- package/dist/gateway/static/root/assets/{personal-avatar-nXrmMfrV.js → personal-avatar-_d72UP_d.js} +1 -1
- package/dist/gateway/static/root/assets/{personal-page-BCwlYT3F.js → personal-page-B19h_3WQ.js} +1 -1
- package/dist/gateway/static/root/assets/{personal-settings-panel-vkYmXK8h.js → personal-settings-panel-CfwtGyue.js} +1 -1
- package/dist/gateway/static/root/assets/{phone-dependencies-card-CZDAxTWv.js → phone-dependencies-card-D8bqsDk_.js} +1 -1
- package/dist/gateway/static/root/assets/{phone-model-picker-4Snfs8Hq.js → phone-model-picker-CL_Zn6Xd.js} +1 -1
- package/dist/gateway/static/root/assets/{phone-settings-page-D8HperfA.js → phone-settings-page-C5Jia8eQ.js} +1 -1
- package/dist/gateway/static/root/assets/{phone-workspace-store-Di9R9Ux5.js → phone-workspace-store-FBfrfkYq.js} +1 -1
- package/dist/gateway/static/root/assets/plugin-details-dialog-gAq2KPzK.js +1 -0
- package/dist/gateway/static/root/assets/{preference-select-fields-C6abaM3k.js → preference-select-fields-Ck8GAX_y.js} +1 -1
- package/dist/gateway/static/root/assets/{product-automation-feedback-C74s9Mjz.js → product-automation-feedback-BJ9oTnNs.js} +2 -2
- package/dist/gateway/static/root/assets/{product-open-page-AbDP5w1c.js → product-open-page-Dw9hUdxP.js} +1 -1
- package/dist/gateway/static/root/assets/{product-preview-content-CktjvFbc.js → product-preview-content-C0iPzmSm.js} +1 -1
- package/dist/gateway/static/root/assets/{product-preview-modal-CzsqLwB4.js → product-preview-modal-COFtHoh6.js} +2 -2
- package/dist/gateway/static/root/assets/{project-detail-page-Cf3tggGP.js → project-detail-page-C5Amjah-.js} +3 -3
- package/dist/gateway/static/root/assets/{project-understanding-jmhFbHch.js → project-understanding-DpL9ADQU.js} +1 -1
- package/dist/gateway/static/root/assets/{projects-page-jMgZiFnO.js → projects-page-gGg9nM2t.js} +1 -1
- package/dist/gateway/static/root/assets/{providers-api-CJBYFKAK.js → providers-api-D6JJRlJb.js} +1 -1
- package/dist/gateway/static/root/assets/{recording-upload-Dl9a5yOV.js → recording-upload-DxX1xKyt.js} +1 -1
- package/dist/gateway/static/root/assets/{registry-api-BwkbPUYu.js → registry-api-BfXzBR1D.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BZA4StwC.js +1 -0
- package/dist/gateway/static/root/assets/{resource-unavailable-35wBZxmz.js → resource-unavailable-X-SIrZYI.js} +1 -1
- package/dist/gateway/static/root/assets/route-preload-CWRb0UCt.js +2 -0
- package/dist/gateway/static/root/assets/{runtime-tools-api-BF28JDAO.js → runtime-tools-api-1DjsPyQ5.js} +1 -1
- package/dist/gateway/static/root/assets/runtime-tools-settings-panel-BnCtyORj.js +1 -0
- package/dist/gateway/static/root/assets/{service-recommendation-list-CdaS4MPF.js → service-recommendation-list-ChSOfHHh.js} +1 -1
- package/dist/gateway/static/root/assets/{session-api-zJXYlRPt.js → session-api-rvY5aWw8.js} +1 -1
- package/dist/gateway/static/root/assets/session-manager-D2rbRfX3.js +23 -0
- package/dist/gateway/static/root/assets/sessions-page-DAS2IUGT.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-CYDQybNF.js +1 -0
- package/dist/gateway/static/root/assets/{settings-advanced-section-C84IghdL.js → settings-advanced-section-ZKRIuk7h.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-mode-store-CtQBJvbO.js → settings-mode-store-CtJ8pEfm.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-eEIz9InP.js → settings-page-B3pUce-_.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-header-CsPAYlqV.js → settings-page-header-DuNCn8i-.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-layout-lPLeJQoV.js → settings-page-layout-DeNC8YHJ.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-Fc3vuz_h.js +1 -0
- package/dist/gateway/static/root/assets/{share-link-dialog-NaM6jvIz.js → share-link-dialog-B3hwjVAx.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-CHjZn27s.js → share-preview-page-D_9oFzGS.js} +1 -1
- package/dist/gateway/static/root/assets/{shares-api-B9rVcV1y.js → shares-api-BoUpXmxq.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-Drfuvepz.js +1 -0
- package/dist/gateway/static/root/assets/{skill-api-D6zVfEuK.js → skill-api-By2HhJ9O.js} +1 -1
- package/dist/gateway/static/root/assets/{skill-list-api-SLmTBYF5.js → skill-list-api-TaUCzS8Y.js} +1 -1
- package/dist/gateway/static/root/assets/{skill-reload-api-UQkq2orI.js → skill-reload-api-CN2fpS1n.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page-Ca0pYZ4i.js → skills-page-LzGLique.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-BARWbjRN.js → system-settings-panel-Cuyg8Ml3.js} +1 -1
- package/dist/gateway/static/root/assets/{task-detail-page-roqAsGue.js → task-detail-page-6A9337pK.js} +2 -2
- package/dist/gateway/static/root/assets/{task-result-evidence-Bb1F7nAM.js → task-result-evidence-DDubAU_5.js} +1 -1
- package/dist/gateway/static/root/assets/{terminal-panel-store-DYDeXXAg.js → terminal-panel-store-BNs75Wdr.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-DbStcH89.js → theme-store-DB1ZfBUm.js} +1 -1
- package/dist/gateway/static/root/assets/tracing-settings-page-TvtX4Goh.js +1 -0
- package/dist/gateway/static/root/assets/{tunnel-api-BK_ivyIb.js → tunnel-api-COoVEdV9.js} +1 -1
- package/dist/gateway/static/root/assets/{understanding-activity-store-p7Z7oq8z.js → understanding-activity-store-Dr_MLgYe.js} +1 -1
- package/dist/gateway/static/root/assets/{understanding-refresh-store-D-U6rcwZ.js → understanding-refresh-store-DGmLGEqw.js} +1 -1
- package/dist/gateway/static/root/assets/{usage-page-URFSiswS.js → usage-page-DP6eb6ed.js} +1 -1
- package/dist/gateway/static/root/assets/{use-autosave-B7cbumro.js → use-autosave-itwjDYUb.js} +1 -1
- package/dist/gateway/static/root/assets/{use-composer-attachments-DAtiwLsE.js → use-composer-attachments-hjIGlI_2.js} +1 -1
- package/dist/gateway/static/root/assets/{use-file-preview-expanded-B8erpWsX.js → use-file-preview-expanded-ClLa0g8D.js} +2 -2
- package/dist/gateway/static/root/assets/{use-personal-profile-DDW29nm-.js → use-personal-profile-vhWk6tTU.js} +1 -1
- package/dist/gateway/static/root/assets/{use-workspace-tree-DCoTf22f.js → use-workspace-tree-dfXXjA2-.js} +1 -1
- package/dist/gateway/static/root/assets/user-model-page-D8dswPWd.js +2 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-DzYdJZN4.js → voice-api-key-field-BIfBySnN.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-wotvT6Hw.js → voice-config-api-J4o59ICE.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-input-shortcut-events-BI6PuiIB.js → voice-input-shortcut-events-B1mlpUdC.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-transcribe-api-DAK9eLRr.js → voice-transcribe-api-xxaSOOmq.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-BzmB9Rub.js → work-discovery-overlay-DqwT1E5u.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-page-CmGjxUIT.js → work-discovery-page-BzYQmPLT.js} +1 -1
- package/dist/gateway/static/root/assets/{working-directory-picker-modal-B-EHm52-.js → working-directory-picker-modal-D2Zf3GOG.js} +1 -1
- package/dist/gateway/static/root/assets/{workspace-api-uhiEMPpK.js → workspace-api-Bnx3eS2M.js} +2 -2
- package/dist/gateway/static/root/assets/workspace-editor-agent-store-COUVwj-p.js +1 -0
- package/dist/gateway/static/root/assets/{workspace-file-preview-dialog-BDm06MZm.js → workspace-file-preview-dialog-D13qHzVr.js} +1 -1
- package/dist/gateway/static/root/assets/{workspace-open-location-menu-Bv83uoqu.js → workspace-open-location-menu-Cou-ig1H.js} +1 -1
- package/dist/gateway/static/root/assets/{xopc-cloud-account-card-Cd5GdpGL.js → xopc-cloud-account-card-DQGPKxHA.js} +1 -1
- package/dist/gateway/static/root/index.html +80 -80
- package/dist/package.js +1 -1
- package/dist/packages/gateway-contract/src/clarification-questions.js +86 -0
- package/dist/packages/gateway-contract/src/clarifications.js +19 -0
- package/dist/packages/gateway-contract/src/index.js +1 -0
- package/dist/packages/gateway-contract/src/session-input-command.js +3 -0
- package/dist/src/agent/agent-manager.js +1 -1
- package/dist/src/agent/background-review/run-background-review.js +1 -1
- package/dist/src/agent/coding/repository-instructions.js +1 -1
- package/dist/src/agent/embedded/index.js +1 -1
- package/dist/src/agent/embedded/run-for-session.js +1 -1
- package/dist/src/agent/embedded/run-turn.js +3 -3
- package/dist/src/agent/embedded/session-tool-result-guard.js +2 -2
- package/dist/src/agent/embedded/tool-result-truncation.js +1 -1
- package/dist/src/agent/inbound/attachment-pipeline.js +1 -1
- package/dist/src/agent/memory/compaction.js +1 -1
- package/dist/src/agent/memory/context-budget.js +1 -1
- package/dist/src/agent/memory/context-recovery.js +1 -1
- package/dist/src/agent/memory/user-message-text.js +1 -1
- package/dist/src/agent/service/btw-query.js +1 -1
- package/dist/src/agent/service/direct-turn-helpers.js +1 -1
- package/dist/src/agent/service/process-direct-streaming.js +2 -2
- package/dist/src/agent/source-context/types.d.ts +1 -0
- package/dist/src/agent/tools/clarify-tool.js +43 -5
- package/dist/src/agent/tools/cli-clarify.js +1 -0
- package/dist/src/agent/tools/dataBatch.js +1 -1
- package/dist/src/agent/tools/personal-task-tool.d.ts +1 -1
- package/dist/src/agent/tools/phone-use-tool.js +2 -2
- package/dist/src/agent/tools/session-search-tool.js +1 -1
- package/dist/src/bootstrap/application-state.js +2 -2
- package/dist/src/cli/commands/gateway/run-foreground.js +2 -2
- package/dist/src/computer/diagnostics.d.ts +3 -3
- package/dist/src/computer/evaluation.d.ts +2 -2
- package/dist/src/connectors/learning-coordinator.js +1 -1
- package/dist/src/gateway/ephemeral-clarification-waiter.js +1 -0
- package/dist/src/gateway/hono/routes/composer-history.js +1 -1
- package/dist/src/gateway/hono/routes/connectors.js +1 -1
- package/dist/src/gateway/hono/routes/home.js +1 -1
- package/dist/src/gateway/hono/routes/phone.js +31 -6
- package/dist/src/gateway/hono/routes/public-gateway.js +2 -1
- package/dist/src/gateway/hono/routes/session-command-handler.js +1 -0
- package/dist/src/gateway/hono/routes/session-input-handler.d.ts +6 -0
- package/dist/src/gateway/hono/routes/tunnel.js +8 -1
- package/dist/src/gateway/hono/routes/user-model-refresh.js +1 -1
- package/dist/src/gateway/next-turn-suggestions/snapshot.js +1 -1
- package/dist/src/gateway/ports.js +6 -1
- package/dist/src/gateway/run-loop.js +0 -1
- package/dist/src/gateway/service/agent-runner.js +8 -3
- package/dist/src/gateway/service/run-gateway-agent.js +1 -1
- package/dist/src/gateway/service/session-input-coordinator.js +5 -4
- package/dist/src/phone/assistance.js +3 -0
- package/dist/src/phone/contracts.d.ts +4 -0
- package/dist/src/phone/runtime.d.ts +7 -1
- package/dist/src/phone/runtime.js +31 -24
- package/dist/src/routing/agent-session-key.js +1 -1
- package/dist/src/session/session-context-for-llm.js +1 -0
- package/dist/src/session/session-title.js +1 -1
- package/dist/src/storage/sqlite/clarification-wait-repository.js +45 -4
- package/dist/src/storage/sqlite/index.js +6 -6
- package/dist/src/storage/sqlite/session-creation-repository.js +1 -1
- package/dist/src/storage/sqlite/session-repository.js +1 -1
- package/dist/src/tasks/home-query-service.js +1 -1
- package/dist/src/tasks/task-allocation-repository.js +1 -1
- package/dist/src/tui/backends/embedded-backend.js +1 -1
- package/dist/src/tunnel/broker-client.d.ts +3 -0
- package/dist/src/tunnel/broker-client.js +14 -6
- package/dist/src/tunnel/frpc-process.js +54 -33
- package/dist/src/tunnel/tunnel-service.d.ts +5 -1
- package/dist/src/tunnel/tunnel-service.js +42 -17
- package/package.json +5 -4
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-DlGRuKMv.js +0 -1
- package/dist/gateway/static/root/assets/automation-task-card-D2p9qlYE.js +0 -3
- package/dist/gateway/static/root/assets/automations-workspace-BkzC3oIM.js +0 -9
- package/dist/gateway/static/root/assets/capabilities-page-m3b9sLFG.js +0 -2
- package/dist/gateway/static/root/assets/connected-providers-grid-DM2glQN3.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-D7pipFHA.js +0 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-D8cLc41G.js +0 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-C6sMzYDT.js +0 -1
- package/dist/gateway/static/root/assets/index-CSIg7V1A.js +0 -11
- package/dist/gateway/static/root/assets/index-Dv8mUlNN.css +0 -1
- package/dist/gateway/static/root/assets/local-session-drafts-ClrSe5mH.js +0 -1
- package/dist/gateway/static/root/assets/messages-Btr7C0hF.js +0 -3
- package/dist/gateway/static/root/assets/model-selector-DYUnp917.js +0 -1
- package/dist/gateway/static/root/assets/note-detail-panel-bjRZesmS.js +0 -5
- package/dist/gateway/static/root/assets/note-image-lightbox-D7Jqb75C.js +0 -1
- package/dist/gateway/static/root/assets/page-header-store-bPV8_tKL.js +0 -1
- package/dist/gateway/static/root/assets/plugin-details-dialog-DJsDu-_8.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CBQ_bOy9.js +0 -1
- package/dist/gateway/static/root/assets/route-preload-BcA6SPeC.js +0 -2
- package/dist/gateway/static/root/assets/runtime-impact-DbySfhdp.js +0 -1
- package/dist/gateway/static/root/assets/runtime-tools-settings-panel-Bq2xQ2qd.js +0 -1
- package/dist/gateway/static/root/assets/session-manager-wWxpzSo0.js +0 -23
- package/dist/gateway/static/root/assets/sessions-page-BkjD_dUD.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-BUMCEtA_.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-BSU5WpaE.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-5sB15V5v.js +0 -1
- package/dist/gateway/static/root/assets/tracing-settings-page-YfkNCxbP.js +0 -1
- package/dist/gateway/static/root/assets/user-model-page-DSV5NkNj.js +0 -2
- 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
|
-
|
|
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");
|
|
@@ -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,
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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(
|
|
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
|
|
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) {
|