@xopcai/xopc 0.0.303 → 0.0.306
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/README.md +4 -4
- package/README.zh-CN.md +4 -4
- package/dist/browser-ext/dist/assets/{auth-B_9ZuGDx.js → auth-C3yV1y_l.js} +67 -22
- package/dist/browser-ext/dist/background.js +4 -4
- package/dist/browser-ext/dist/sidepanel.html +1 -1
- package/dist/browser-ext/dist/sidepanel.js +3 -3
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/xopc.extension.json +0 -3
- package/dist/extensions/telegram/xopc.extension.json +1 -4
- package/dist/extensions/weixin/xopc.extension.json +0 -3
- package/dist/gateway/static/root/assets/{activity-store-DCi5rh4e.js → activity-store-DLtim-_I.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Ch3DzUvP.js → agent-avatar-dicebear-iQXtiilH.js} +1 -1
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-CxOv4ivK.js +1 -0
- package/dist/gateway/static/root/assets/agents-DzKx7z3k.js +1 -0
- package/dist/gateway/static/root/assets/{api-CAV9PN9i.js → api-DfSU0-lD.js} +1 -1
- package/dist/gateway/static/root/assets/api-gpHh07OL.js +1 -0
- package/dist/gateway/static/root/assets/app-management-settings-panel-BpYFKz7B.js +1 -0
- package/dist/gateway/static/root/assets/{appearance-settings-izNAyDhW.js → appearance-settings-BQfR5vrq.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-BceB7JHZ.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-BKGzaVvM.js → archive-plugin-BxOvZ-ZX.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-8bARdLnp.js → attachment-load-B0FzTMAJ.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-BAEenyzx.js → automations-page-BpXuPaPg.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-Cn_p8zY_.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-Cv3GS9Eo.js → binary-plugins-BP7wfpqy.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-D4ZIVQbk.css → block-editor-BdOTO0Yo.css} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-DUeb92LG.js → block-editor-oMLvdnOQ.js} +3 -3
- package/dist/gateway/static/root/assets/{browser-automation-inputs-BGT0xoTv.js → browser-automation-inputs-DTxSZ00u.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automations-page-D1O22WIf.js → browser-automations-page-IbJnwEY4.js} +2 -2
- package/dist/gateway/static/root/assets/browser-settings-page-CCUO3G23.js +3 -0
- package/dist/gateway/static/root/assets/button-CS04eWY9.js +1 -0
- package/dist/gateway/static/root/assets/capabilities-settings-panel-BjMb5H2_.js +8 -0
- package/dist/gateway/static/root/assets/channels-settings-P22-_i13.js +1 -0
- package/dist/gateway/static/root/assets/{channels-status-swr-C_icwbWj.js → channels-status-swr-D2AmAoty.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-terminal-dock-D-JYPVYl.js → chat-terminal-dock-B-yI3Mi1.js} +2 -2
- package/dist/gateway/static/root/assets/{computer-settings-page-Bcfp948A.js → computer-settings-page-CWx_jnng.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-BLgPORmH.js +2 -0
- package/dist/gateway/static/root/assets/cron-expression-DMRRL4Zg.js +2 -0
- package/dist/gateway/static/root/assets/date-picker-BSwL0e6E.js +1 -0
- package/dist/gateway/static/root/assets/{dependency-picker-UtoUm57Q.js → dependency-picker-BQTspLzC.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-Bryx7gRM.js → desktop-pet-C3lFxDF6.js} +1 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-Y8pjpXFE.js +1 -0
- package/dist/gateway/static/root/assets/device-pairing-wizard-DM4_GMzo.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-DQlFTVBx.js → extension-debug-page-CVGiGVcR.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-BSsqRDXh.js → extension-page-g3JtCP_y.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DbVZv9ve.js → extension-settings-page-CjpoKV1f.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-D5AM8cyQ.js → gateway-config-swr-BSvXXpKM.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-realtime-BDCpS7U1.js +1 -0
- package/dist/gateway/static/root/assets/gateway-realtime-store-BGmP1obI.js +1 -0
- package/dist/gateway/static/root/assets/gateway-settings-CYG9WCZn.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-CSJWdnFs.js → gateway-startup-retry-Caf8g3sC.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-Cxowc29b.js → heartbeat-settings-Cl834-SS.js} +1 -1
- package/dist/gateway/static/root/assets/home-page-CB_XVtIM.js +1 -0
- package/dist/gateway/static/root/assets/{image-generation-api-BNh604hw.js → image-generation-api-BwEWBUVC.js} +1 -1
- package/dist/gateway/static/root/assets/imports-page-CoMlgSIA.js +1 -0
- package/dist/gateway/static/root/assets/index-CI37dTAn.css +1 -0
- package/dist/gateway/static/root/assets/index-Do9MltC4.js +79 -0
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-CNq5D4pe.js +1 -0
- package/dist/gateway/static/root/assets/local-app-workbench-page-BxQlEje6.js +2 -0
- package/dist/gateway/static/root/assets/{local-apps-page-CXPaPDGm.js → local-apps-page-DQnRA598.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-DLK05Y1a.js → locale-store-D16nmbaN.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-CT5GrcMs.js +2 -0
- package/dist/gateway/static/root/assets/management-settings-DKcO5fQ-.js +1 -0
- package/dist/gateway/static/root/assets/{markdown-view-B8maDRWh.js → markdown-view-DCp4BlZP.js} +2 -2
- package/dist/gateway/static/root/assets/{media-plugins-tSJ0CvcX.js → media-plugins-Cy64sn_C.js} +1 -1
- package/dist/gateway/static/root/assets/messages-C-9oo69N.js +3 -0
- package/dist/gateway/static/root/assets/note-detail-panel-5dc3LKTL.js +5 -0
- package/dist/gateway/static/root/assets/notes-page-AbwxgXuG.js +8 -0
- package/dist/gateway/static/root/assets/{page-tabs-CQx6H-GS.js → page-tabs-CgEoHSVT.js} +1 -1
- package/dist/gateway/static/root/assets/{popover-select-DldSX8GX.js → popover-select-9i-ZtHXL.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-A3-bVtdy.js → preview-open-alternatives-Ck2uKTbf.js} +1 -1
- package/dist/gateway/static/root/assets/{proactive-page-D46cR3sf.js → proactive-page-Dr1mCJhZ.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-CujZXOea.js → product-open-page-DbZvJ5GE.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-DnE1zI1c.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-BD0nLYxk.js +1 -0
- package/dist/gateway/static/root/assets/{registry-api-BMFL4vis.js → registry-api-DcQdwpPu.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-TYuE6A3S.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-CR0qvq9C.js → runtime-tools-settings-panel-CPwdgWKo.js} +2 -2
- package/dist/gateway/static/root/assets/{schema-form-BUD9lLEE.js → schema-form-8psK4cFO.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-BcWDQQFX.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-DzGQX6Hq.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-BZPCUH6a.js → settings-form-section-D_Gsz5rl.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-XoHmqIdm.js → settings-page-C_Tj_mkZ.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-CE2X89qN.js +1 -0
- package/dist/gateway/static/root/assets/share-preview-page-B_M_oPsT.js +2 -0
- package/dist/gateway/static/root/assets/shares-settings-BL4H9Iym.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-WMKIgUOp.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-DYgwzl5B.js +2 -0
- package/dist/gateway/static/root/assets/{skills-page.utils-CH-quGxZ.js → skills-page.utils-Cuh6s2HM.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-CGC7eBso.js → system-settings-panel-aassGyNb.js} +1 -1
- package/dist/gateway/static/root/assets/task-detail-page-BjeRslap.js +1 -0
- package/dist/gateway/static/root/assets/theme-store-RUBQBsFP.js +1 -0
- package/dist/gateway/static/root/assets/tunnel-api-DJYcPWIV.js +1 -0
- package/dist/gateway/static/root/assets/{use-autosave-BydB6x2K.js → use-autosave-QGYG7oMZ.js} +1 -1
- package/dist/gateway/static/root/assets/user-model-page-PrRsd4go.js +2 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-CPUDBcag.js → voice-api-key-field-D1s0gIRW.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-bZqN8-UF.js → voice-config-api-D2goEn5e.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-D_FmJbGH.js → work-discovery-overlay-DkFW9aJ6.js} +1 -1
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-BYToUPUY.js +3 -0
- package/dist/gateway/static/root/assets/workflows-page-Z8iZe9YP.js +6 -0
- package/dist/gateway/static/root/index.html +14 -12
- package/dist/package.js +1 -1
- package/dist/packages/gateway-contract/src/device-pairing.js +100 -7
- package/dist/packages/gateway-contract/src/gateway-scopes.js +53 -0
- package/dist/packages/gateway-contract/src/index.js +2 -0
- package/dist/packages/realtime-client/src/index.js +14 -2
- package/dist/packages/realtime-protocol/src/index.js +18 -14
- package/dist/src/agent/agent-instance-gateway.d.ts +2 -0
- package/dist/src/agent/agent-manager.d.ts +2 -0
- package/dist/src/agent/agent-manager.js +40 -12
- package/dist/src/agent/agent-scope.d.ts +4 -1
- package/dist/src/agent/agent-scope.js +19 -3
- package/dist/src/agent/commands/command-isolation.js +11 -9
- package/dist/src/agent/commands/command-registry.js +18 -33
- package/dist/src/agent/context/audit.js +12 -2
- package/dist/src/agent/context/coordinator.d.ts +13 -3
- package/dist/src/agent/context/coordinator.js +27 -11
- package/dist/src/agent/context/execution-context.js +42 -22
- package/dist/src/agent/context/execution-context.types.d.ts +4 -2
- package/dist/src/agent/context/execution-scope.d.ts +2 -2
- package/dist/src/agent/context/execution-scope.js +1 -1
- package/dist/src/agent/context/project-context.d.ts +2 -2
- package/dist/src/agent/context/project-context.js +3 -3
- package/dist/src/agent/embedded/run-for-session.d.ts +1 -0
- package/dist/src/agent/embedded/run-for-session.js +7 -1
- package/dist/src/agent/inbound/attachment-pipeline.d.ts +2 -0
- package/dist/src/agent/inbound/attachment-pipeline.js +3 -3
- package/dist/src/agent/inbound/inbound-loop.js +1 -0
- package/dist/src/agent/inbound/turn-dispatcher.js +3 -3
- package/dist/src/agent/mcp/mcp-stdio-transport.js +5 -2
- package/dist/src/agent/memory/compaction-promotion.js +7 -2
- package/dist/src/agent/memory/create-memory-manager.js +1 -0
- package/dist/src/agent/memory/manager.d.ts +6 -0
- package/dist/src/agent/memory/manager.js +74 -39
- package/dist/src/agent/memory/runtime.d.ts +3 -3
- package/dist/src/agent/memory/runtime.js +11 -4
- package/dist/src/agent/orchestration/agent-orchestrator.js +4 -1
- package/dist/src/agent/prompt/cache-boundary.d.ts +2 -0
- package/dist/src/agent/prompt/cache-boundary.js +10 -1
- package/dist/src/agent/service/build-direct-message-content.d.ts +1 -0
- package/dist/src/agent/service/build-direct-message-content.js +2 -1
- package/dist/src/agent/service/direct-turn-helpers.js +3 -2
- package/dist/src/agent/service/process-direct-streaming.d.ts +3 -1
- package/dist/src/agent/service/process-direct-streaming.js +3 -2
- package/dist/src/agent/service/webchat-tts.d.ts +0 -4
- package/dist/src/agent/service/webchat-tts.js +20 -19
- package/dist/src/agent/tools/factory.js +3 -3
- package/dist/src/agent/tools/knowledge-memory-tool.d.ts +2 -2
- package/dist/src/agent/tools/knowledge-memory-tool.js +7 -7
- package/dist/src/browser/native-messaging-host.js +2 -2
- package/dist/src/channels/attachments/voice-stt-webchat.d.ts +3 -0
- package/dist/src/channels/attachments/voice-stt-webchat.js +22 -9
- package/dist/src/cli/commands/agent.js +2 -0
- package/dist/src/cli/commands/config.js +8 -9
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +69 -44
- package/dist/src/cli/commands/extension-pack.js +0 -2
- package/dist/src/cli/commands/extension.js +4 -25
- package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
- package/dist/src/cli/commands/onboard/gateway.js +2 -1
- package/dist/src/cli/commands/update.js +1 -1
- package/dist/src/cli/utils/init-workspace-core.js +5 -2
- package/dist/src/config/index.js +2 -2
- package/dist/src/config/loader.d.ts +1 -0
- package/dist/src/config/loader.js +14 -1
- package/dist/src/config/schema.d.ts +10 -3
- package/dist/src/config/schema.js +9 -1
- package/dist/src/execution-environments/local-worktree-manager.js +17 -15
- package/dist/src/execution-environments/store.js +4 -2
- package/dist/src/execution-environments/types.d.ts +3 -0
- package/dist/src/execution-environments/types.js +2 -1
- package/dist/src/execution-environments/worktree-safety.d.ts +8 -0
- package/dist/src/execution-environments/worktree-safety.js +43 -0
- package/dist/src/extensions/activation-planner.d.ts +1 -1
- package/dist/src/extensions/activation-planner.js +1 -1
- package/dist/src/extensions/api-version.d.ts +4 -0
- package/dist/src/extensions/api-version.js +15 -0
- package/dist/src/extensions/api.d.ts +3 -9
- package/dist/src/extensions/api.js +26 -32
- package/dist/src/extensions/config-validation.d.ts +8 -0
- package/dist/src/extensions/config-validation.js +25 -0
- package/dist/src/extensions/extension-registry-impl.d.ts +20 -9
- package/dist/src/extensions/extension-registry-impl.js +79 -11
- package/dist/src/extensions/hooks.d.ts +1 -1
- package/dist/src/extensions/index.d.ts +2 -1
- package/dist/src/extensions/install-transaction.d.ts +2 -0
- package/dist/src/extensions/install-transaction.js +32 -21
- package/dist/src/extensions/install.js +18 -1
- package/dist/src/extensions/loader.d.ts +5 -5
- package/dist/src/extensions/loader.js +109 -47
- package/dist/src/extensions/lockfile.d.ts +3 -5
- package/dist/src/extensions/lockfile.js +41 -14
- package/dist/src/extensions/normalize-manifest.js +6 -60
- package/dist/src/extensions/sdk/index.d.ts +3 -2
- package/dist/src/extensions/sdk/index.js +2 -2
- package/dist/src/extensions/sdk/testing.js +0 -4
- package/dist/src/extensions/security.js +5 -7
- package/dist/src/extensions/types/core.d.ts +0 -5
- package/dist/src/extensions/types/index.d.ts +1 -1
- package/dist/src/extensions/types/manifest.d.ts +1 -25
- package/dist/src/extensions/types/providers.d.ts +1 -1
- package/dist/src/extensions/types/registration.d.ts +0 -12
- package/dist/src/extensions/update.js +71 -30
- package/dist/src/gateway/heartbeat/service.js +2 -2
- package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +47 -10
- package/dist/src/gateway/hono/routes/devices.js +10 -7
- package/dist/src/gateway/hono/routes/endpoint-compatibility.js +6 -0
- package/dist/src/gateway/hono/routes/extension-gateway.js +0 -33
- package/dist/src/gateway/hono/routes/imports.js +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +0 -1
- package/dist/src/gateway/hono/routes/local-apps.js +1 -1
- package/dist/src/gateway/hono/routes/realtime.js +30 -8
- package/dist/src/gateway/hono/routes/update.js +2 -2
- package/dist/src/gateway/hono/routes/user-model.js +25 -6
- package/dist/src/gateway/index.js +5 -2
- package/dist/src/gateway/lock.d.ts +2 -0
- package/dist/src/gateway/lock.js +31 -14
- package/dist/src/gateway/run-loop.js +3 -2
- package/dist/src/gateway/security/gateway-scopes.d.ts +2 -5
- package/dist/src/gateway/security/gateway-scopes.js +3 -45
- package/dist/src/gateway/security/index.js +2 -1
- package/dist/src/gateway/service.js +11 -7
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/imports/importService.d.ts +1 -1
- package/dist/src/imports/inventory.js +16 -2
- package/dist/src/imports/productImport.js +5 -5
- package/dist/src/imports/types.d.ts +3 -3
- package/dist/src/infra/exec.d.ts +2 -2
- package/dist/src/infra/exec.js +32 -27
- package/dist/src/infra/gateway-processes.js +1 -1
- package/dist/src/infra/run-command.js +15 -50
- package/dist/src/infra/update-restart.js +1 -1
- package/dist/src/infra/update-runner.js +2 -2
- package/dist/src/infra/update-startup.js +1 -1
- package/dist/src/knowledge/connected-knowledge-pipeline.js +13 -3
- package/dist/src/knowledge-memory/domain.d.ts +17 -1
- package/dist/src/knowledge-memory/index.js +2 -2
- package/dist/src/knowledge-memory/repository.d.ts +26 -4
- package/dist/src/knowledge-memory/repository.js +171 -36
- package/dist/src/mcp/channel-bridge.js +7 -3
- package/dist/src/media-understanding/registry.js +6 -1
- package/dist/src/migrations/knowledge-memory-read-policy-config.d.ts +2 -0
- package/dist/src/migrations/knowledge-memory-read-policy-config.js +48 -0
- package/dist/src/migrations/runner.js +2 -1
- package/dist/src/process/bounded-output.d.ts +10 -0
- package/dist/src/process/bounded-output.js +41 -0
- package/dist/src/process/kill-tree.d.ts +6 -17
- package/dist/src/process/kill-tree.js +43 -75
- package/dist/src/process/process-spec.d.ts +39 -0
- package/dist/src/process/process-spec.js +13 -0
- package/dist/src/process/run-process.d.ts +4 -0
- package/dist/src/process/run-process.js +97 -0
- package/dist/src/providers/plugin-registry.d.ts +1 -1
- package/dist/src/providers/plugin-registry.js +6 -0
- package/dist/src/realtime/runtime.js +3 -1
- package/dist/src/session/store.js +1 -1
- package/dist/src/storage/sqlite/device-pairing-approval.js +1 -1
- package/dist/src/storage/sqlite/index.d.ts +1 -1
- package/dist/src/storage/sqlite/index.js +2 -2
- package/dist/src/storage/sqlite/migrations/180_execution_environment_ownership.sql +7 -0
- package/dist/src/storage/sqlite/migrations/181_knowledge_item_status_events.sql +12 -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/schema.sql +13 -0
- package/dist/src/storage/sqlite/transcript-repository.d.ts +4 -0
- package/dist/src/storage/sqlite/transcript-repository.js +36 -1
- package/dist/src/tui/backends/embedded-backend.d.ts +24 -8
- package/dist/src/tui/backends/embedded-backend.js +114 -10
- package/dist/src/tui/backends/gateway-realtime-backend.d.ts +18 -0
- package/dist/src/tui/backends/gateway-realtime-backend.js +32 -5
- package/dist/src/tui/components/assistant-message.d.ts +4 -1
- package/dist/src/tui/components/assistant-message.js +10 -2
- package/dist/src/tui/components/cell-render-mode.d.ts +4 -0
- package/dist/src/tui/components/cell-render-mode.js +1 -0
- package/dist/src/tui/components/chat-log.d.ts +17 -4
- package/dist/src/tui/components/chat-log.js +68 -50
- package/dist/src/tui/components/custom-editor.d.ts +2 -2
- package/dist/src/tui/components/custom-editor.js +5 -1
- package/dist/src/tui/components/pending-input-preview.d.ts +9 -0
- package/dist/src/tui/components/pending-input-preview.js +33 -0
- package/dist/src/tui/components/semantic-cell.d.ts +17 -0
- package/dist/src/tui/components/semantic-cell.js +29 -0
- package/dist/src/tui/components/tool-execution.d.ts +5 -1
- package/dist/src/tui/components/tool-execution.js +33 -10
- package/dist/src/tui/components/transcript-overlay.d.ts +29 -0
- package/dist/src/tui/components/transcript-overlay.js +114 -0
- package/dist/src/tui/components/tui-bottom-bar.js +3 -1
- package/dist/src/tui/components/user-message.d.ts +5 -1
- package/dist/src/tui/components/user-message.js +12 -1
- package/dist/src/tui/extension-host/load-extensions.d.ts +1 -1
- package/dist/src/tui/extension-host/runtime-context.js +2 -1
- package/dist/src/tui/extension-host/runtime.d.ts +1 -1
- package/dist/src/tui/format-tui-hotkeys.js +8 -1
- package/dist/src/tui/tui-agent-events.js +31 -0
- package/dist/src/tui/tui-backend.d.ts +23 -11
- package/dist/src/tui/tui-backend.js +1 -9
- package/dist/src/tui/tui-chat-input-state.d.ts +25 -0
- package/dist/src/tui/tui-chat-input-state.js +36 -0
- package/dist/src/tui/tui-command-formatters.js +2 -1
- package/dist/src/tui/tui-commands.js +1 -1
- package/dist/src/tui/tui-types.d.ts +2 -1
- package/dist/src/tui/tui-types.js +2 -1
- package/dist/src/tui/tui.js +122 -30
- package/dist/src/tui/xopc-tui-keybindings.d.ts +23 -3
- package/dist/src/tui/xopc-tui-keybindings.js +22 -2
- package/dist/src/user-context/access-policy.d.ts +2 -2
- package/dist/src/user-context/access-policy.js +10 -2
- package/dist/src/user-context/config.d.ts +23 -6
- package/dist/src/user-context/config.js +54 -7
- package/dist/src/voice/platform-streams.js +11 -1
- package/dist/src/voice/realtime/omniEngine.js +13 -1
- package/dist/src/voice/realtime/runtime.js +2 -1
- package/dist/src/voice/tts/audio.js +1 -1
- package/dist/src/voice/tts/speech-registry.js +6 -1
- package/package.json +7 -5
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-4oGrNj3m.js +0 -1
- package/dist/gateway/static/root/assets/agents-DXHD-ST3.js +0 -1
- package/dist/gateway/static/root/assets/api-fPapljyb.js +0 -1
- package/dist/gateway/static/root/assets/app-management-settings-panel-CdXnNtTg.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-BQb3RCga.js +0 -1
- package/dist/gateway/static/root/assets/automations-workspace-5vTl4x0h.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-CH9prS-f.js +0 -3
- package/dist/gateway/static/root/assets/button-CGlRPNzi.js +0 -1
- package/dist/gateway/static/root/assets/capabilities-settings-panel-DMURlZbj.js +0 -8
- package/dist/gateway/static/root/assets/channels-settings-CFBS3Yqy.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-DI1c3BMz.js +0 -2
- package/dist/gateway/static/root/assets/cron-expression-BJMBFKCh.js +0 -2
- package/dist/gateway/static/root/assets/date-picker-BFRIn5y9.js +0 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-DFsyEJUr.js +0 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-C3TQVPRy.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-DUqVsB3X.js +0 -1
- package/dist/gateway/static/root/assets/home-page-CLkumXdN.js +0 -1
- package/dist/gateway/static/root/assets/imports-page-DXNfRmk9.js +0 -1
- package/dist/gateway/static/root/assets/index-BLRIcVQa.css +0 -1
- package/dist/gateway/static/root/assets/index-gheM453N.js +0 -79
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-5Hcec8Xf.js +0 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-BDg1-fcw.js +0 -2
- package/dist/gateway/static/root/assets/logs-page-BWZc5jwO.js +0 -2
- package/dist/gateway/static/root/assets/management-settings-COa3PhMs.js +0 -1
- package/dist/gateway/static/root/assets/messages-C9h8SImu.js +0 -3
- package/dist/gateway/static/root/assets/note-detail-panel-D_YGzNcR.js +0 -5
- package/dist/gateway/static/root/assets/notes-page-D1f2oI2-.js +0 -8
- package/dist/gateway/static/root/assets/project-detail-page-CRlD_Rwv.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-mmX0SavY.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-Cqr3K6T5.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-CPkvbdJP.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-Cu0DAbeH.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-D8fQF1jZ.js +0 -1
- package/dist/gateway/static/root/assets/share-preview-page-BgHqwTuT.js +0 -2
- package/dist/gateway/static/root/assets/shares-settings-Id4vRHzI.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-BB2Fj_di.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-BAwF4LpS.js +0 -2
- package/dist/gateway/static/root/assets/task-detail-page-BVjw812D.js +0 -1
- package/dist/gateway/static/root/assets/theme-store-KfFEGMlp.js +0 -1
- package/dist/gateway/static/root/assets/tunnel-api-Do98Xk05.js +0 -1
- package/dist/gateway/static/root/assets/user-model-page-Nv68a4ak.js +0 -2
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-1lZ_btki.js +0 -3
- package/dist/gateway/static/root/assets/workflows-page-DFOhccm3.js +0 -6
- package/dist/src/extensions/when-context.d.ts +0 -6
- package/dist/src/extensions/when-context.js +0 -26
- package/dist/src/extensions/when-expression.d.ts +0 -11
- package/dist/src/extensions/when-expression.js +0 -213
|
@@ -11,7 +11,10 @@ var MemoryManager = class {
|
|
|
11
11
|
loadProviders;
|
|
12
12
|
writePolicy;
|
|
13
13
|
pluginProvidersLoaded = false;
|
|
14
|
+
pluginProvidersPromise;
|
|
15
|
+
sessionInitializations = /* @__PURE__ */ new Map();
|
|
14
16
|
memoryRuntime;
|
|
17
|
+
searchTimeoutMs;
|
|
15
18
|
sessionContexts = /* @__PURE__ */ new Map();
|
|
16
19
|
constructor(options = {}) {
|
|
17
20
|
this.routing = {
|
|
@@ -21,6 +24,7 @@ var MemoryManager = class {
|
|
|
21
24
|
};
|
|
22
25
|
this.loadProviders = options.loadProviders;
|
|
23
26
|
this.memoryRuntime = options.memoryRuntime;
|
|
27
|
+
this.searchTimeoutMs = options.searchTimeoutMs ?? 2e3;
|
|
24
28
|
this.writePolicy = {
|
|
25
29
|
allowExternalWrites: options.writePolicy?.allowExternalWrites ?? false,
|
|
26
30
|
allowedProviderIds: options.writePolicy?.allowedProviderIds,
|
|
@@ -142,21 +146,29 @@ var MemoryManager = class {
|
|
|
142
146
|
return provider.handleToolCall(toolName, args);
|
|
143
147
|
}
|
|
144
148
|
async search(request) {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
+
return this.searchProviders(this.providersForSearch(), request);
|
|
150
|
+
}
|
|
151
|
+
async searchExternal(request) {
|
|
152
|
+
return this.searchProviders(this.providersForSearch().filter((provider) => !provider.capabilities.local), request);
|
|
153
|
+
}
|
|
154
|
+
async searchProviders(providers, request) {
|
|
155
|
+
const searchProvider = async (p) => {
|
|
156
|
+
if (!p.capabilities.search || !p.search) return [];
|
|
149
157
|
const started = Date.now();
|
|
150
158
|
try {
|
|
151
|
-
|
|
159
|
+
let timeout;
|
|
160
|
+
const providerResults = await Promise.race([p.search(request), new Promise((_resolve, reject) => {
|
|
161
|
+
timeout = setTimeout(() => reject(/* @__PURE__ */ new Error(`Memory search timed out after ${this.searchTimeoutMs}ms`)), this.searchTimeoutMs);
|
|
162
|
+
})]).finally(() => {
|
|
163
|
+
if (timeout) clearTimeout(timeout);
|
|
164
|
+
});
|
|
152
165
|
this.trace("search", p.id, request, {
|
|
153
166
|
resultCount: providerResults.length,
|
|
154
167
|
selectedRecordIds: providerResults.map((result) => result.record.id),
|
|
155
168
|
durationMs: Date.now() - started,
|
|
156
169
|
conversationId: request.scope?.conversationId
|
|
157
170
|
});
|
|
158
|
-
|
|
159
|
-
if (providerResults.length > 0 && this.routing.searchStrategy !== "fanout") break;
|
|
171
|
+
return providerResults;
|
|
160
172
|
} catch (err) {
|
|
161
173
|
this.trace("search", p.id, request, {
|
|
162
174
|
error: err instanceof Error ? err.message : String(err),
|
|
@@ -167,7 +179,16 @@ var MemoryManager = class {
|
|
|
167
179
|
err,
|
|
168
180
|
id: p.id
|
|
169
181
|
}, "memory search failed");
|
|
182
|
+
return [];
|
|
170
183
|
}
|
|
184
|
+
};
|
|
185
|
+
const searchable = providers.filter((provider) => provider.capabilities.search && provider.search);
|
|
186
|
+
const results = [];
|
|
187
|
+
if (this.routing.searchStrategy === "fanout") results.push(...(await Promise.all(searchable.map(searchProvider))).flat());
|
|
188
|
+
else for (const provider of searchable) {
|
|
189
|
+
const providerResults = await searchProvider(provider);
|
|
190
|
+
results.push(...providerResults);
|
|
191
|
+
if (providerResults.length > 0) break;
|
|
171
192
|
}
|
|
172
193
|
const seen = /* @__PURE__ */ new Set();
|
|
173
194
|
return results.sort((a, b) => b.score - a.score).filter((result) => this.canReadRecord(result.record, request.scope)).filter((result) => !request.trustedOnly || (result.record.provenance?.originClass === "owner" || result.record.provenance?.originClass === "agent") && result.record.provenance?.derivedFromRecalledContext === false).filter((result) => {
|
|
@@ -245,12 +266,14 @@ var MemoryManager = class {
|
|
|
245
266
|
return this.writeWithStrategy("delete", request);
|
|
246
267
|
}
|
|
247
268
|
canReadRecord(record, scope) {
|
|
248
|
-
if (
|
|
249
|
-
|
|
269
|
+
if (this.memoryRuntime) {
|
|
270
|
+
const { scope, source } = memoryAccessForRecord(record);
|
|
271
|
+
if (!this.memoryRuntime.canRead(scope, source)) return false;
|
|
272
|
+
}
|
|
250
273
|
if (record.scope.userId && scope?.userId && record.scope.userId !== scope.userId) return false;
|
|
251
|
-
if (record.scope.conversationId && record.scope.conversationId !== scope
|
|
252
|
-
if (record.scope.projectId && record.scope.projectId !== scope
|
|
253
|
-
if (record.scope.workspaceId && record.scope.workspaceId !== scope
|
|
274
|
+
if (record.scope.conversationId && scope?.conversationId && record.scope.conversationId !== scope.conversationId) return false;
|
|
275
|
+
if (record.scope.projectId && scope?.projectId && record.scope.projectId !== scope.projectId) return false;
|
|
276
|
+
if (record.scope.workspaceId && scope?.workspaceId && record.scope.workspaceId !== scope.workspaceId) return false;
|
|
254
277
|
return true;
|
|
255
278
|
}
|
|
256
279
|
recordSignal(signal) {
|
|
@@ -286,36 +309,48 @@ var MemoryManager = class {
|
|
|
286
309
|
}
|
|
287
310
|
async initializeAll(sessionId, options) {
|
|
288
311
|
if (options) this.sessionContexts.set(sessionId, { ...options });
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
312
|
+
const existing = this.sessionInitializations.get(sessionId);
|
|
313
|
+
if (existing) return existing;
|
|
314
|
+
const initialization = (async () => {
|
|
315
|
+
await this.loadPluginProvidersOnce();
|
|
316
|
+
for (const p of this.providers) try {
|
|
317
|
+
await p.initialize(sessionId, options);
|
|
318
|
+
} catch (err) {
|
|
319
|
+
log.warn({
|
|
320
|
+
err,
|
|
321
|
+
id: p.id,
|
|
322
|
+
sessionId
|
|
323
|
+
}, "Memory provider initialization failed");
|
|
324
|
+
}
|
|
325
|
+
})();
|
|
326
|
+
this.sessionInitializations.set(sessionId, initialization);
|
|
327
|
+
return initialization;
|
|
298
328
|
}
|
|
299
329
|
async loadPluginProvidersOnce() {
|
|
300
330
|
if (this.pluginProvidersLoaded || !this.loadProviders) return;
|
|
301
|
-
this.
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
331
|
+
if (!this.pluginProvidersPromise) this.pluginProvidersPromise = (async () => {
|
|
332
|
+
try {
|
|
333
|
+
const providers = await this.loadProviders();
|
|
334
|
+
const existingIds = new Set(this.providers.map((p) => p.id));
|
|
335
|
+
for (const provider of providers) {
|
|
336
|
+
if (existingIds.has(provider.id)) {
|
|
337
|
+
log.warn({ id: provider.id }, "Skipped duplicate memory provider");
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
this.addProvider(provider);
|
|
341
|
+
existingIds.add(provider.id);
|
|
309
342
|
}
|
|
310
|
-
|
|
311
|
-
|
|
343
|
+
} catch (err) {
|
|
344
|
+
log.warn({ err }, "Memory provider plugin loading failed");
|
|
345
|
+
} finally {
|
|
346
|
+
this.pluginProvidersLoaded = true;
|
|
312
347
|
}
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
}
|
|
348
|
+
})();
|
|
349
|
+
await this.pluginProvidersPromise;
|
|
316
350
|
}
|
|
317
351
|
async shutdownAll() {
|
|
318
352
|
this.sessionContexts.clear();
|
|
353
|
+
this.sessionInitializations.clear();
|
|
319
354
|
for (const p of [...this.providers].reverse()) try {
|
|
320
355
|
await p.shutdown();
|
|
321
356
|
} catch (err) {
|
|
@@ -425,11 +460,11 @@ var MemoryManager = class {
|
|
|
425
460
|
}, "External memory provider operation");
|
|
426
461
|
}
|
|
427
462
|
};
|
|
428
|
-
function
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
463
|
+
function memoryAccessForRecord(record) {
|
|
464
|
+
return {
|
|
465
|
+
scope: record.scope.conversationId ? "session" : record.scope.projectId ? "project" : record.scope.workspaceId ? "workspace" : "global",
|
|
466
|
+
source: record.source.provider === "builtin" ? "memory" : "connector"
|
|
467
|
+
};
|
|
433
468
|
}
|
|
434
469
|
function writeTargetForRecord(_request) {
|
|
435
470
|
return "knowledge";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { UserContextConfig } from '../../user-context/config.js';
|
|
2
|
-
|
|
2
|
+
import type { KnowledgeContentSource, KnowledgeReadPolicy, KnowledgeVisibilityScope } from '../../knowledge-memory/domain.js';
|
|
3
3
|
export type MemoryWriteTarget = 'knowledge';
|
|
4
4
|
export type MemoryWriteDecision = 'allow' | 'confirm' | 'deny';
|
|
5
5
|
export interface MemoryCandidate {
|
|
@@ -14,8 +14,8 @@ export interface MemoryWriteCheckResult {
|
|
|
14
14
|
reason: string;
|
|
15
15
|
}
|
|
16
16
|
export interface MemoryRuntime {
|
|
17
|
-
|
|
18
|
-
canRead: (source:
|
|
17
|
+
readPolicy: KnowledgeReadPolicy;
|
|
18
|
+
canRead: (scope: KnowledgeVisibilityScope, source: KnowledgeContentSource) => boolean;
|
|
19
19
|
checkWrite: (candidate: MemoryCandidate) => MemoryWriteCheckResult;
|
|
20
20
|
}
|
|
21
21
|
export declare function buildMemoryRuntime(userContext: UserContextConfig): MemoryRuntime;
|
|
@@ -5,11 +5,18 @@ function normalizeConfidence(value) {
|
|
|
5
5
|
}
|
|
6
6
|
function buildMemoryRuntime(userContext) {
|
|
7
7
|
const memory = userContext.knowledgeMemory;
|
|
8
|
-
const
|
|
9
|
-
|
|
8
|
+
const readPolicy = !userContext.enabled || !memory.enabled ? {
|
|
9
|
+
scopes: [],
|
|
10
|
+
contentSources: []
|
|
11
|
+
} : {
|
|
12
|
+
scopes: memory.readScopes,
|
|
13
|
+
contentSources: memory.contentSources
|
|
14
|
+
};
|
|
15
|
+
const scopes = new Set(readPolicy.scopes);
|
|
16
|
+
const contentSources = new Set(readPolicy.contentSources);
|
|
10
17
|
return {
|
|
11
|
-
|
|
12
|
-
canRead: (source) =>
|
|
18
|
+
readPolicy,
|
|
19
|
+
canRead: (scope, source) => scopes.has(scope) && contentSources.has(source),
|
|
13
20
|
checkWrite: (candidate) => {
|
|
14
21
|
if (!userContext.enabled || !memory.enabled) return {
|
|
15
22
|
decision: "deny",
|
|
@@ -71,6 +71,7 @@ var AgentOrchestrator = class {
|
|
|
71
71
|
await this.sessionHydrator.model(conversationId);
|
|
72
72
|
const channelSystemPrompt = typeof context.metadata?.channelSystemPrompt === "string" ? context.metadata.channelSystemPrompt.trim() : "";
|
|
73
73
|
if (channelSystemPrompt) {
|
|
74
|
+
await this.agentManager.ensureMemoryReadyForSession?.(conversationId);
|
|
74
75
|
this.agentManager.getOrCreateAgent(conversationId);
|
|
75
76
|
this.agentManager.applyTurnChannelSystemPrompt(conversationId, channelSystemPrompt);
|
|
76
77
|
}
|
|
@@ -90,7 +91,8 @@ var AgentOrchestrator = class {
|
|
|
90
91
|
setPendingTranscriptUserMessage(conversationId, userMessage);
|
|
91
92
|
const userPlainForMemory = extractAgentUserPlainText(userMessage);
|
|
92
93
|
const turnId = randomUUID();
|
|
93
|
-
const
|
|
94
|
+
const userContext = await this.agentManager.prepareUserTurnContext(userMessage, conversationId, turnId);
|
|
95
|
+
const userMessageForModel = userMessage;
|
|
94
96
|
const llmTurn = await hydrateUserTurnForLlm({
|
|
95
97
|
message: userMessage,
|
|
96
98
|
modelRef
|
|
@@ -101,6 +103,7 @@ var AgentOrchestrator = class {
|
|
|
101
103
|
conversationId,
|
|
102
104
|
runId: turnId,
|
|
103
105
|
userMessage: userMessageForModel,
|
|
106
|
+
dynamicSystemContext: userContext.dynamicSystemContext,
|
|
104
107
|
llmImages: llmTurn.images,
|
|
105
108
|
sessionStore: this.sessionStore,
|
|
106
109
|
agentManager: this.agentManager,
|
|
@@ -24,3 +24,5 @@ export declare function splitPromptCacheBoundary(text: string): {
|
|
|
24
24
|
export declare function normalizePromptSection(text: string): string;
|
|
25
25
|
/** Add stable content immediately before the cache boundary. */
|
|
26
26
|
export declare function appendStablePromptSection(systemPrompt: string, section: string): string;
|
|
27
|
+
/** Add per-turn context after the cache boundary so the stable prefix remains reusable. */
|
|
28
|
+
export declare function appendDynamicPromptSection(systemPrompt: string, section: string): string;
|
|
@@ -40,5 +40,14 @@ function appendStablePromptSection(systemPrompt, section) {
|
|
|
40
40
|
const stablePrefix = [split.stablePrefix, normalizedSection].filter(Boolean).join("\n\n");
|
|
41
41
|
return split.dynamicSuffix ? `${stablePrefix}${PROMPT_CACHE_BOUNDARY}${split.dynamicSuffix}` : `${stablePrefix}${PROMPT_CACHE_BOUNDARY}`;
|
|
42
42
|
}
|
|
43
|
+
/** Add per-turn context after the cache boundary so the stable prefix remains reusable. */
|
|
44
|
+
function appendDynamicPromptSection(systemPrompt, section) {
|
|
45
|
+
const normalizedSection = normalizePromptSection(section);
|
|
46
|
+
if (!normalizedSection) return systemPrompt;
|
|
47
|
+
const split = splitPromptCacheBoundary(systemPrompt);
|
|
48
|
+
if (!split) return `${normalizePromptSection(systemPrompt)}${PROMPT_CACHE_BOUNDARY}${normalizedSection}`;
|
|
49
|
+
const dynamicSuffix = [split.dynamicSuffix, normalizedSection].filter(Boolean).join("\n\n");
|
|
50
|
+
return `${split.stablePrefix}${PROMPT_CACHE_BOUNDARY}${dynamicSuffix}`;
|
|
51
|
+
}
|
|
43
52
|
//#endregion
|
|
44
|
-
export { PROMPT_CACHE_BOUNDARY, appendStablePromptSection, normalizePromptSection, splitPromptCacheBoundary, stripPromptCacheBoundary };
|
|
53
|
+
export { PROMPT_CACHE_BOUNDARY, appendDynamicPromptSection, appendStablePromptSection, normalizePromptSection, splitPromptCacheBoundary, stripPromptCacheBoundary };
|
|
@@ -11,4 +11,5 @@ export declare function buildDirectUserMessageContent(opts: {
|
|
|
11
11
|
config: Config;
|
|
12
12
|
agentManager: AgentInstanceGateway;
|
|
13
13
|
modelManager: ModelManager;
|
|
14
|
+
suppressMediaPromptUris?: ReadonlySet<string>;
|
|
14
15
|
}): Promise<import("../inbound/attachment-pipeline.js").TranscriptUserMessage>;
|
|
@@ -13,7 +13,8 @@ async function buildDirectUserMessageContent(opts) {
|
|
|
13
13
|
conversationId: sk,
|
|
14
14
|
modelRef: modelRef || getDefaultModelSync(opts.config),
|
|
15
15
|
config: opts.config,
|
|
16
|
-
agentManager: opts.agentManager
|
|
16
|
+
agentManager: opts.agentManager,
|
|
17
|
+
suppressMediaPromptUris: opts.suppressMediaPromptUris
|
|
17
18
|
});
|
|
18
19
|
}
|
|
19
20
|
//#endregion
|
|
@@ -3,7 +3,6 @@ import { getConnectionResumeInput, init_connection_wait_repository } from "../..
|
|
|
3
3
|
import { resolveImageHandlingStrategy } from "../image/vision-detection.js";
|
|
4
4
|
import { hydrateUserTurnForLlm } from "../inbound/attachment-pipeline.js";
|
|
5
5
|
import { buildTaskExecutionDirective } from "../../tasks/task-context-assembler.js";
|
|
6
|
-
import { prependAgentContext } from "../context/prepend.js";
|
|
7
6
|
import { extractAgentUserPlainText } from "../memory/user-message-text.js";
|
|
8
7
|
import { shouldSkipResetOverlapCommand } from "../../session/reset-triggers.js";
|
|
9
8
|
import { parseSlashCommand } from "../../chat-commands/command-parse.js";
|
|
@@ -11,6 +10,7 @@ import { commandRegistry } from "../../chat-commands/registry.js";
|
|
|
11
10
|
import "../../chat-commands/index.js";
|
|
12
11
|
import { runEmbeddedTurnForSession } from "../embedded/run-for-session.js";
|
|
13
12
|
import { injectSourceContextsIntoUserMessage } from "../source-context/injector.js";
|
|
13
|
+
import { prependAgentContext } from "../context/prepend.js";
|
|
14
14
|
import crypto from "node:crypto";
|
|
15
15
|
//#region src/agent/service/direct-turn-helpers.ts
|
|
16
16
|
/**
|
|
@@ -101,7 +101,7 @@ async function runDirectAgentTurn(deps, input) {
|
|
|
101
101
|
const userPlain = extractAgentUserPlainText(input.userMessage);
|
|
102
102
|
const userContext = await deps.agentManager.prepareUserTurnContext(input.userMessage, input.conversationId, turnId);
|
|
103
103
|
const sourceContexts = input.sourceContexts ?? [];
|
|
104
|
-
const userMessageForModel = prependAgentContext(injectSourceContextsIntoUserMessage(
|
|
104
|
+
const userMessageForModel = prependAgentContext(injectSourceContextsIntoUserMessage(input.userMessage, sourceContexts), buildTaskExecutionDirective(input.conversationId));
|
|
105
105
|
const modelRef = deps.modelManager.getModelForSession(input.conversationId);
|
|
106
106
|
const llmTurn = await hydrateUserTurnForLlm({
|
|
107
107
|
message: input.userMessage,
|
|
@@ -114,6 +114,7 @@ async function runDirectAgentTurn(deps, input) {
|
|
|
114
114
|
conversationId: input.conversationId,
|
|
115
115
|
runId: turnId,
|
|
116
116
|
userMessage: userMessageForModel,
|
|
117
|
+
dynamicSystemContext: userContext.dynamicSystemContext,
|
|
117
118
|
llmImages,
|
|
118
119
|
presentation: input.presentation,
|
|
119
120
|
sessionStore: deps.sessionStore,
|
|
@@ -36,7 +36,9 @@ export interface ProcessDirectStreamingDeps {
|
|
|
36
36
|
sessionConfigStore: SessionConfigStore;
|
|
37
37
|
commandHandler: Pick<CommandHandler, 'executeCommandAndAggregateReply'>;
|
|
38
38
|
prepareInboundAttachments: (conversationId: string, attachments?: DirectStreamInboundAttachment[]) => Promise<MediaRef[] | undefined>;
|
|
39
|
-
buildTranscriptUserMessage: (content: string, prepared: MediaRef[] | undefined, conversationId: string
|
|
39
|
+
buildTranscriptUserMessage: (content: string, prepared: MediaRef[] | undefined, conversationId: string, options?: {
|
|
40
|
+
suppressMediaPromptUris?: ReadonlySet<string>;
|
|
41
|
+
}) => Promise<TranscriptUserMessage>;
|
|
40
42
|
recordTaskReviewStreamHint?: (conversationId: string, task: {
|
|
41
43
|
skipTaskReview: boolean;
|
|
42
44
|
}) => void;
|
|
@@ -11,7 +11,7 @@ import { initSessionTurn } from "../../session/init-session-turn.js";
|
|
|
11
11
|
import "../../session/index.js";
|
|
12
12
|
import { mergeSttConfigFromAppConfig } from "../../voice/stt/config.js";
|
|
13
13
|
import "../../voice/stt/index.js";
|
|
14
|
-
import { isVoiceLikeAttachment, mergeVoiceTranscriptsIntoUserText } from "../../channels/attachments/voice-stt-webchat.js";
|
|
14
|
+
import { isVoiceLikeAttachment, mergeVoiceTranscriptsIntoUserText, requestsOriginalVoiceInspection } from "../../channels/attachments/voice-stt-webchat.js";
|
|
15
15
|
import { applyReasoningVisibility } from "../streaming/reasoning-visibility.js";
|
|
16
16
|
import { isSessionSourceBinding, summarizeSourceContext } from "../source-context/types.js";
|
|
17
17
|
import { injectSourceContextsIntoUserMessage } from "../source-context/injector.js";
|
|
@@ -207,6 +207,7 @@ async function* runProcessDirectStreaming(deps, input) {
|
|
|
207
207
|
const voiceMerge = await mergeVoiceTranscriptsIntoUserText(prepared, turnBody, sttCfg);
|
|
208
208
|
mergedUserText = voiceMerge.text;
|
|
209
209
|
inboundVoice = voiceMerge.inboundVoice;
|
|
210
|
+
const suppressMediaPromptUris = requestsOriginalVoiceInspection(mergedUserText) ? void 0 : new Set(voiceMerge.transcribedMediaUris ?? []);
|
|
210
211
|
if (inboundVoice) {
|
|
211
212
|
const transcriptParts = [voiceMerge.voiceTranscripts.filter(Boolean).join("\n"), turnBody.trim()].filter(Boolean);
|
|
212
213
|
const voiceMedia = (prepared ?? []).filter(isVoiceLikeAttachment).map((att) => ({
|
|
@@ -275,7 +276,7 @@ async function* runProcessDirectStreaming(deps, input) {
|
|
|
275
276
|
}
|
|
276
277
|
const skillTurn = deps.agentManager.prepareSkillTurn(conversationId, mergedUserText);
|
|
277
278
|
const textForAgent = skillTurn.text;
|
|
278
|
-
const userMessage = await deps.buildTranscriptUserMessage(textForAgent, prepared, conversationId);
|
|
279
|
+
const userMessage = await deps.buildTranscriptUserMessage(textForAgent, prepared, conversationId, { suppressMediaPromptUris });
|
|
279
280
|
const sourceContexts = [...input.sourceContexts ?? []];
|
|
280
281
|
if (deps.sourceContextResolver) {
|
|
281
282
|
const metadata = await deps.sessionStore.getMetadata(conversationId).catch(() => null);
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import type { Config } from '../../config/schema.js';
|
|
2
|
-
import type { MediaRef } from '../../media/types.js';
|
|
3
|
-
import type { SessionStore } from '../../session/index.js';
|
|
4
2
|
export type WebchatTtsResult = {
|
|
5
3
|
type: 'tts_audio';
|
|
6
4
|
uri: string;
|
|
@@ -9,7 +7,6 @@ export type WebchatTtsResult = {
|
|
|
9
7
|
};
|
|
10
8
|
export type WebchatTtsDeps = {
|
|
11
9
|
config: Config | undefined;
|
|
12
|
-
sessionStore: SessionStore;
|
|
13
10
|
getLastAssistantPlainText: (conversationId: string) => string;
|
|
14
11
|
log: {
|
|
15
12
|
warn: (obj: Record<string, unknown>, msg: string) => void;
|
|
@@ -21,4 +18,3 @@ export declare function isSuccessfulWebchatTtsToolEvent(event: unknown): boolean
|
|
|
21
18
|
* Generate TTS for webchat when config allows; persist under `{stateDir}/media/tts/`.
|
|
22
19
|
*/
|
|
23
20
|
export declare function maybeEmitWebchatTts(deps: WebchatTtsDeps, conversationId: string, hadInboundVoice: boolean): Promise<WebchatTtsResult | null>;
|
|
24
|
-
export declare function appendMediaToLastAssistant(sessionStore: SessionStore, conversationId: string, ref: MediaRef): Promise<void>;
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { appendMediaToAssistantTranscriptEntry, findLatestAssistantTranscriptEntryId } from "../../storage/sqlite/transcript-repository.js";
|
|
2
|
+
import "../../storage/sqlite/index.js";
|
|
1
3
|
import { isTTSAvailable } from "../../voice/tts/factory.js";
|
|
2
4
|
import { speak } from "../../voice/tts/speak-core.js";
|
|
3
5
|
import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
|
|
@@ -5,6 +7,7 @@ import { getChannelOutputFormat, shouldUseTTS } from "../../voice/tts/service.js
|
|
|
5
7
|
import { compressAudio } from "../../voice/tts/audio.js";
|
|
6
8
|
import { persistOutboundTtsAudio } from "../../channels/attachments/outbound-tts-persist.js";
|
|
7
9
|
import "../../voice/tts/index.js";
|
|
10
|
+
import { deleteMediaUris } from "../../media/session-references.js";
|
|
8
11
|
//#region src/agent/service/webchat-tts.ts
|
|
9
12
|
/** True when the explicit TTS tool already produced durable Webchat audio. */
|
|
10
13
|
function isSuccessfulWebchatTtsToolEvent(event) {
|
|
@@ -28,6 +31,12 @@ async function maybeEmitWebchatTts(deps, conversationId, hadInboundVoice) {
|
|
|
28
31
|
if (!shouldUseTTS(ttsConfig, hadInboundVoice).useTTS) return null;
|
|
29
32
|
const text = deps.getLastAssistantPlainText(conversationId).trim();
|
|
30
33
|
if (!text) return null;
|
|
34
|
+
const assistantEntryId = findLatestAssistantTranscriptEntryId(conversationId);
|
|
35
|
+
if (!assistantEntryId) {
|
|
36
|
+
deps.log.warn({ conversationId }, "Webchat TTS skipped because the assistant transcript is unavailable");
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
let persisted;
|
|
31
40
|
try {
|
|
32
41
|
const webOut = getChannelOutputFormat("webchat");
|
|
33
42
|
const fmt = webOut.format;
|
|
@@ -37,8 +46,15 @@ async function maybeEmitWebchatTts(deps, conversationId, hadInboundVoice) {
|
|
|
37
46
|
});
|
|
38
47
|
const { buffer, format } = await compressAudio(Buffer.from(ttsResult.audio), ttsResult.format, webOut.format === "mp3" ? "mp3" : "opus");
|
|
39
48
|
const normalizedMime = format === "opus" || format === "ogg" ? "audio/ogg" : format === "mp3" || format === "mpeg" ? "audio/mpeg" : format === "wav" ? "audio/wav" : `audio/${format}`;
|
|
40
|
-
|
|
41
|
-
|
|
49
|
+
persisted = await persistOutboundTtsAudio(buffer, format);
|
|
50
|
+
if (!appendMediaToAssistantTranscriptEntry(conversationId, assistantEntryId, persisted)) {
|
|
51
|
+
await deleteMediaUris([persisted.uri]);
|
|
52
|
+
deps.log.warn({
|
|
53
|
+
conversationId,
|
|
54
|
+
assistantEntryId
|
|
55
|
+
}, "Webchat TTS discarded because its assistant transcript changed");
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
42
58
|
return {
|
|
43
59
|
type: "tts_audio",
|
|
44
60
|
uri: persisted.uri,
|
|
@@ -46,6 +62,7 @@ async function maybeEmitWebchatTts(deps, conversationId, hadInboundVoice) {
|
|
|
46
62
|
name: persisted.name
|
|
47
63
|
};
|
|
48
64
|
} catch (err) {
|
|
65
|
+
if (persisted) await deleteMediaUris([persisted.uri]);
|
|
49
66
|
deps.log.warn({
|
|
50
67
|
err,
|
|
51
68
|
conversationId
|
|
@@ -53,21 +70,5 @@ async function maybeEmitWebchatTts(deps, conversationId, hadInboundVoice) {
|
|
|
53
70
|
return null;
|
|
54
71
|
}
|
|
55
72
|
}
|
|
56
|
-
async function appendMediaToLastAssistant(sessionStore, conversationId, ref) {
|
|
57
|
-
const loaded = await sessionStore.load(conversationId);
|
|
58
|
-
for (let i = loaded.length - 1; i >= 0; i--) {
|
|
59
|
-
const m = loaded[i];
|
|
60
|
-
if (m.role === "assistant") {
|
|
61
|
-
const prev = m.media ?? [];
|
|
62
|
-
if (prev.some((x) => x.uri === ref.uri)) return;
|
|
63
|
-
loaded[i] = {
|
|
64
|
-
...m,
|
|
65
|
-
media: [...prev, ref]
|
|
66
|
-
};
|
|
67
|
-
await sessionStore.saveMessages(conversationId, loaded);
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
73
|
//#endregion
|
|
73
|
-
export {
|
|
74
|
+
export { isSuccessfulWebchatTtsToolEvent, maybeEmitWebchatTts };
|
|
@@ -389,7 +389,7 @@ var AgentToolsFactory = class AgentToolsFactory {
|
|
|
389
389
|
canRead: () => currentAccess().knowledge,
|
|
390
390
|
canWrite: () => currentAccess().knowledge,
|
|
391
391
|
getWritePolicy: knowledgeWritePolicy,
|
|
392
|
-
|
|
392
|
+
getReadPolicy: () => currentAccess().knowledgePolicy
|
|
393
393
|
}),
|
|
394
394
|
createKnowledgeGetTool({
|
|
395
395
|
agentId: resolvedAgentId,
|
|
@@ -399,7 +399,7 @@ var AgentToolsFactory = class AgentToolsFactory {
|
|
|
399
399
|
canRead: () => currentAccess().knowledge,
|
|
400
400
|
canWrite: () => currentAccess().knowledge,
|
|
401
401
|
getWritePolicy: knowledgeWritePolicy,
|
|
402
|
-
|
|
402
|
+
getReadPolicy: () => currentAccess().knowledgePolicy
|
|
403
403
|
}),
|
|
404
404
|
createKnowledgeWriteTool({
|
|
405
405
|
agentId: resolvedAgentId,
|
|
@@ -409,7 +409,7 @@ var AgentToolsFactory = class AgentToolsFactory {
|
|
|
409
409
|
canRead: () => currentAccess().knowledge,
|
|
410
410
|
canWrite: () => currentAccess().knowledge,
|
|
411
411
|
getWritePolicy: knowledgeWritePolicy,
|
|
412
|
-
|
|
412
|
+
getReadPolicy: () => currentAccess().knowledgePolicy
|
|
413
413
|
}),
|
|
414
414
|
...this.deps.getSessionStore ? [createSessionRecallTool({
|
|
415
415
|
getSessionStore: this.deps.getSessionStore,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { AgentTool } from '@earendil-works/pi-agent-core';
|
|
2
|
-
import { type
|
|
2
|
+
import { type KnowledgeReadPolicy } from '../../knowledge-memory/index.js';
|
|
3
3
|
export interface KnowledgeToolOptions {
|
|
4
4
|
agentId: string;
|
|
5
5
|
workspaceId: string;
|
|
@@ -8,7 +8,7 @@ export interface KnowledgeToolOptions {
|
|
|
8
8
|
canRead: () => boolean;
|
|
9
9
|
canWrite: () => boolean;
|
|
10
10
|
getWritePolicy: () => 'deny' | 'confirm' | 'allow';
|
|
11
|
-
|
|
11
|
+
getReadPolicy: () => KnowledgeReadPolicy;
|
|
12
12
|
}
|
|
13
13
|
export declare function createKnowledgeSearchTool(options: KnowledgeToolOptions): AgentTool;
|
|
14
14
|
export declare function createKnowledgeGetTool(options: KnowledgeToolOptions): AgentTool;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getKnowledgeItem,
|
|
1
|
+
import { getKnowledgeItem, knowledgeItemAllowed, searchKnowledgeItems, writeKnowledgeItem } from "../../knowledge-memory/repository.js";
|
|
2
2
|
import "../../knowledge-memory/index.js";
|
|
3
3
|
import { Type } from "@sinclair/typebox";
|
|
4
4
|
//#region src/agent/tools/knowledge-memory-tool.ts
|
|
@@ -60,7 +60,7 @@ function createKnowledgeSearchTool(options) {
|
|
|
60
60
|
const results = searchKnowledgeItems({
|
|
61
61
|
query: input.query,
|
|
62
62
|
context: visibility(options),
|
|
63
|
-
|
|
63
|
+
policy: options.getReadPolicy(),
|
|
64
64
|
limit: input.maxResults ?? 12
|
|
65
65
|
});
|
|
66
66
|
return {
|
|
@@ -92,7 +92,7 @@ function createKnowledgeGetTool(options) {
|
|
|
92
92
|
};
|
|
93
93
|
const id = raw.id;
|
|
94
94
|
const item = getKnowledgeItem(id);
|
|
95
|
-
return item && visibleItem(options, item) &&
|
|
95
|
+
return item && visibleItem(options, item) && knowledgeItemAllowed(item, options.getReadPolicy()) ? {
|
|
96
96
|
content: [{
|
|
97
97
|
type: "text",
|
|
98
98
|
text: JSON.stringify(item, null, 2)
|
|
@@ -131,14 +131,14 @@ function createKnowledgeWriteTool(options) {
|
|
|
131
131
|
details: { error: "knowledge_write_denied" }
|
|
132
132
|
};
|
|
133
133
|
const input = raw;
|
|
134
|
-
if (!options.
|
|
134
|
+
if (!options.getReadPolicy().scopes.includes(input.scope) || !options.getReadPolicy().contentSources.includes("memory")) return {
|
|
135
135
|
content: [{
|
|
136
136
|
type: "text",
|
|
137
|
-
text: `Knowledge
|
|
137
|
+
text: `Knowledge memory writes are disabled for scope: ${input.scope}`
|
|
138
138
|
}],
|
|
139
139
|
details: {
|
|
140
|
-
error: "
|
|
141
|
-
|
|
140
|
+
error: "knowledge_scope_disabled",
|
|
141
|
+
scope: input.scope
|
|
142
142
|
}
|
|
143
143
|
};
|
|
144
144
|
const sessionId = options.getSessionId();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { closeXopcDatabase, init_connection, openXopcDatabase } from "../storage/sqlite/connection.js";
|
|
2
|
-
import {
|
|
2
|
+
import { browserPairingInvitationPayloadSchema, formatBrowserPairingInvitation } from "../../packages/gateway-contract/src/device-pairing.js";
|
|
3
3
|
import { init_src } from "../../packages/gateway-contract/src/index.js";
|
|
4
4
|
import { getGatewayIdentityPublicKeyRaw, getOrCreateGatewayIdentity } from "../storage/sqlite/gateway-identity-repository.js";
|
|
5
5
|
import { createDevicePairingSetup } from "../storage/sqlite/device-pairing-repository.js";
|
|
@@ -53,7 +53,7 @@ function createBrowserNativeBootstrap(configPath, request) {
|
|
|
53
53
|
return {
|
|
54
54
|
ok: true,
|
|
55
55
|
gatewayUrl,
|
|
56
|
-
invitation: formatBrowserPairingInvitation(Buffer.from(JSON.stringify(
|
|
56
|
+
invitation: formatBrowserPairingInvitation(Buffer.from(JSON.stringify(browserPairingInvitationPayloadSchema.parse({
|
|
57
57
|
version: 3,
|
|
58
58
|
pairingToken: setup.token,
|
|
59
59
|
gatewayId: identity.id,
|
|
@@ -4,10 +4,13 @@
|
|
|
4
4
|
import type { STTConfig } from '../../voice/stt/types.js';
|
|
5
5
|
import { type InboundAttachmentInput, type MediaRef } from './inbound-persist.js';
|
|
6
6
|
export declare function isVoiceLikeAttachment(att: InboundAttachmentInput | MediaRef): boolean;
|
|
7
|
+
/** True when the user explicitly asks the agent to inspect the original recording. */
|
|
8
|
+
export declare function requestsOriginalVoiceInspection(text: string): boolean;
|
|
7
9
|
export declare function mergeVoiceTranscriptsIntoUserText(prepared: (InboundAttachmentInput | MediaRef)[] | undefined, userText: string, sttConfig: STTConfig, opts?: {
|
|
8
10
|
skipVoiceTranscription?: boolean;
|
|
9
11
|
}): Promise<{
|
|
10
12
|
text: string;
|
|
11
13
|
inboundVoice: boolean;
|
|
12
14
|
voiceTranscripts: string[];
|
|
15
|
+
transcribedMediaUris: string[];
|
|
13
16
|
}>;
|