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