@xopcai/xopc 0.0.98 → 0.0.100
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/manifest.json +1 -1
- package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
- package/dist/extensions/feishu/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/src/account-manager.d.ts +3 -3
- package/dist/extensions/telegram/src/account-manager.js +8 -8
- package/dist/extensions/telegram/src/account-manager.js.map +1 -1
- package/dist/extensions/telegram/src/actions/message-actions.d.ts +4 -0
- package/dist/extensions/telegram/src/actions/message-actions.js +71 -0
- package/dist/extensions/telegram/src/actions/message-actions.js.map +1 -0
- package/dist/extensions/telegram/src/adapters/config-adapter.js +9 -1
- package/dist/extensions/telegram/src/adapters/config-adapter.js.map +1 -1
- package/dist/extensions/telegram/src/adapters/config-surface.js +1 -1
- package/dist/extensions/telegram/src/adapters/config-surface.js.map +1 -1
- package/dist/extensions/telegram/src/adapters/outbound-adapter.d.ts +2 -1
- package/dist/extensions/telegram/src/adapters/outbound-adapter.js +18 -4
- package/dist/extensions/telegram/src/adapters/outbound-adapter.js.map +1 -1
- package/dist/extensions/telegram/src/adapters/security-adapter.js +2 -1
- package/dist/extensions/telegram/src/adapters/security-adapter.js.map +1 -1
- package/dist/extensions/telegram/src/adapters/streaming-adapter.js +90 -6
- package/dist/extensions/telegram/src/adapters/streaming-adapter.js.map +1 -1
- package/dist/extensions/telegram/src/adapters/types.d.ts +9 -1
- package/dist/extensions/telegram/src/api-root.d.ts +4 -0
- package/dist/extensions/telegram/src/api-root.js +42 -0
- package/dist/extensions/telegram/src/api-root.js.map +1 -0
- package/dist/extensions/telegram/src/approval-delivery.d.ts +9 -0
- package/dist/extensions/telegram/src/approval-delivery.js +36 -0
- package/dist/extensions/telegram/src/approval-delivery.js.map +1 -0
- package/dist/extensions/telegram/src/approval-store.d.ts +25 -0
- package/dist/extensions/telegram/src/approval-store.js +61 -0
- package/dist/extensions/telegram/src/approval-store.js.map +1 -0
- package/dist/extensions/telegram/src/config-schema.d.ts +185 -35
- package/dist/extensions/telegram/src/config-schema.js +67 -45
- package/dist/extensions/telegram/src/config-schema.js.map +1 -1
- package/dist/extensions/telegram/src/conversation-id.d.ts +6 -0
- package/dist/extensions/telegram/src/conversation-id.js +18 -0
- package/dist/extensions/telegram/src/conversation-id.js.map +1 -0
- package/dist/extensions/telegram/src/doctor.d.ts +5 -0
- package/dist/extensions/telegram/src/doctor.js +80 -0
- package/dist/extensions/telegram/src/doctor.js.map +1 -0
- package/dist/extensions/telegram/src/exec-approval-handler.d.ts +7 -0
- package/dist/extensions/telegram/src/exec-approval-handler.js +36 -0
- package/dist/extensions/telegram/src/exec-approval-handler.js.map +1 -0
- package/dist/extensions/telegram/src/exec-approvals.d.ts +8 -0
- package/dist/extensions/telegram/src/exec-approvals.js +20 -0
- package/dist/extensions/telegram/src/exec-approvals.js.map +1 -0
- package/dist/extensions/telegram/src/focus-handler.d.ts +12 -0
- package/dist/extensions/telegram/src/focus-handler.js +55 -0
- package/dist/extensions/telegram/src/focus-handler.js.map +1 -0
- package/dist/extensions/telegram/src/group-config-resolver.d.ts +12 -0
- package/dist/extensions/telegram/src/group-config-resolver.js +17 -0
- package/dist/extensions/telegram/src/group-config-resolver.js.map +1 -0
- package/dist/extensions/telegram/src/inbound-coalescer.d.ts +15 -0
- package/dist/extensions/telegram/src/inbound-coalescer.js +107 -0
- package/dist/extensions/telegram/src/inbound-coalescer.js.map +1 -0
- package/dist/extensions/telegram/src/inbound-processor.d.ts +1 -0
- package/dist/extensions/telegram/src/inbound-processor.js +41 -4
- package/dist/extensions/telegram/src/inbound-processor.js.map +1 -1
- package/dist/extensions/telegram/src/network-errors.d.ts +2 -0
- package/dist/extensions/telegram/src/network-errors.js +23 -0
- package/dist/extensions/telegram/src/network-errors.js.map +1 -0
- package/dist/extensions/telegram/src/plugin.d.ts +11 -0
- package/dist/extensions/telegram/src/plugin.js +192 -58
- package/dist/extensions/telegram/src/plugin.js.map +1 -1
- package/dist/extensions/telegram/src/polling-session.d.ts +17 -0
- package/dist/extensions/telegram/src/polling-session.js +112 -0
- package/dist/extensions/telegram/src/polling-session.js.map +1 -0
- package/dist/extensions/telegram/src/proxy-fetch.d.ts +2 -0
- package/dist/extensions/telegram/src/proxy-fetch.js +14 -0
- package/dist/extensions/telegram/src/proxy-fetch.js.map +1 -0
- package/dist/extensions/telegram/src/reactions.d.ts +14 -0
- package/dist/extensions/telegram/src/reactions.js +48 -0
- package/dist/extensions/telegram/src/reactions.js.map +1 -0
- package/dist/extensions/telegram/src/reply-params.d.ts +15 -0
- package/dist/extensions/telegram/src/reply-params.js +28 -0
- package/dist/extensions/telegram/src/reply-params.js.map +1 -0
- package/dist/extensions/telegram/src/routing-integration.js +2 -2
- package/dist/extensions/telegram/src/startup-errors.d.ts +3 -0
- package/dist/extensions/telegram/src/startup-errors.js +27 -0
- package/dist/extensions/telegram/src/startup-errors.js.map +1 -0
- package/dist/extensions/telegram/src/telegram-actions.d.ts +25 -0
- package/dist/extensions/telegram/src/telegram-actions.js +65 -0
- package/dist/extensions/telegram/src/telegram-actions.js.map +1 -0
- package/dist/extensions/telegram/src/thread-bindings.d.ts +15 -0
- package/dist/extensions/telegram/src/thread-bindings.js +22 -0
- package/dist/extensions/telegram/src/thread-bindings.js.map +1 -0
- package/dist/extensions/telegram/src/token-resolver.d.ts +8 -0
- package/dist/extensions/telegram/src/token-resolver.js +34 -0
- package/dist/extensions/telegram/src/token-resolver.js.map +1 -0
- package/dist/extensions/telegram/src/update-offset-store.d.ts +9 -0
- package/dist/extensions/telegram/src/update-offset-store.js +66 -0
- package/dist/extensions/telegram/src/update-offset-store.js.map +1 -0
- package/dist/extensions/telegram/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/api/api.js +2 -2
- package/dist/extensions/weixin/src/auth/accounts.js +1 -1
- package/dist/extensions/weixin/src/cdn/upload.js +1 -1
- package/dist/extensions/weixin/src/media/data-url.js +1 -1
- package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
- package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/extensions/weixin/src/plugin.js +1 -1
- package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js +1 -1
- package/dist/gateway/static/root/assets/{agents-NI7FFR-h.js → agents-C5jtBK-H.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-BB4iSCrJ.js → apps-page-smJl-qf_.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-CH6KgFK6.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-CV70xvY7.js +8 -0
- package/dist/gateway/static/root/assets/{cron-api-1dHoVFEA.js → cron-api-CgBO8B7I.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-CVX6FPfb.js → cron-page-Be0cW1cR.js} +1 -1
- package/dist/gateway/static/root/assets/{dist-BZnl4G4p.js → dist-P8HRGUuh.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DwQp_4Qv.js → extension-debug-page-BowuycYu.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-l9crxSvM.js → extension-page-27-Zpv8O.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-CXzLbq9B.js → extension-settings-page-DDFa_rIq.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-BLLOP2CM.js → fetch-drJUxxKP.js} +1 -1
- package/dist/gateway/static/root/assets/{field-primitives-BRnEyxSl.js → field-primitives-BWLssxEb.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-eMo0k381.js → heartbeat-config-api-BVuYNYT_.js} +1 -1
- package/dist/gateway/static/root/assets/index-CRDAmr3W.js +4840 -0
- package/dist/gateway/static/root/assets/index-DjNDHzwG.css +1 -0
- package/dist/gateway/static/root/assets/{logs-page-BvTEevBZ.js → logs-page-BDX8IrDQ.js} +1 -1
- package/dist/gateway/static/root/assets/{note-detail-page-Dl3jhcWg.js → note-detail-page-BmQ9KeiA.js} +1 -1
- package/dist/gateway/static/root/assets/{note-time-D8Tlyotb.js → note-time-14I9Sgqh.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-page-BWILOitx.js → notes-page-BMfP0FFf.js} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-3EJRugZg.js → sessions-page-C3scyChq.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-advanced-gate-CZ5wlM_q.js → settings-advanced-gate-2ODuCjHP.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-C6RYGnKK.js → settings-form-section-DUoGKAiW.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-0egNvAMr.js → settings-page-CttAfOWV.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-BVJtaSoK.js → share-preview-page-B77xqiiI.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page-DVnRQ5Mo.js → skills-page-B_bAZGzB.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-e2q2yjs4.js → theme-store-BgCPrmxU.js} +1 -1
- package/dist/gateway/static/root/assets/url-q28QhI7l.js +3 -0
- package/dist/gateway/static/root/assets/{utils-Bl-94YzI.js → utils-CCGejlcX.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-B53JA8qW.js → voice-api-key-field-DZzzihcY.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-page.utils-ontUT7yL.js → workflow-page.utils-D5RMAmT4.js} +1 -1
- package/dist/gateway/static/root/assets/{workflows-page-Bz7YRTdp.js → workflows-page-DEYpC6Bv.js} +1 -1
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +4 -0
- package/dist/src/agent/agent-manager.js +75 -11
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/agent-scope.js +1 -1
- package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
- package/dist/src/agent/child-agent-factory.d.ts +1 -0
- package/dist/src/agent/child-agent-factory.js +13 -10
- package/dist/src/agent/child-agent-factory.js.map +1 -1
- package/dist/src/agent/context/workspace-seed.js +2 -2
- package/dist/src/agent/context/workspace-state.js +1 -1
- package/dist/src/agent/embedded/run-for-session.d.ts +1 -0
- package/dist/src/agent/embedded/run-for-session.js +1 -0
- package/dist/src/agent/embedded/run-for-session.js.map +1 -1
- package/dist/src/agent/embedded/run-turn.js +1 -17
- package/dist/src/agent/embedded/run-turn.js.map +1 -1
- package/dist/src/agent/embedded/session-runner.js +3 -1
- package/dist/src/agent/embedded/session-runner.js.map +1 -1
- package/dist/src/agent/embedded/session-tool-result-guard.d.ts +1 -0
- package/dist/src/agent/embedded/session-tool-result-guard.js +1 -0
- package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
- package/dist/src/agent/goals/goal-run-store.js +4 -4
- package/dist/src/agent/goals/persistent-goal-service.js +1 -1
- package/dist/src/agent/goals/post-turn.js +2 -2
- package/dist/src/agent/image/load-image-media.js +2 -2
- package/dist/src/agent/inbound/attachment-pipeline.d.ts +37 -0
- package/dist/src/agent/inbound/attachment-pipeline.js +169 -0
- package/dist/src/agent/inbound/attachment-pipeline.js.map +1 -0
- package/dist/src/agent/inbound/turn-dispatcher.d.ts +3 -5
- package/dist/src/agent/inbound/turn-dispatcher.js +1 -2
- package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
- package/dist/src/agent/ipc/bus.js +1 -1
- package/dist/src/agent/ipc/inbox.js +2 -2
- package/dist/src/agent/ipc/socket.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
- package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
- package/dist/src/agent/mcp/mcp-transport.js +1 -1
- package/dist/src/agent/memory/builtin-memory-store.js +1 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
- package/dist/src/agent/memory/dreaming/events.js +1 -1
- package/dist/src/agent/memory/dreaming/last-run.js +1 -1
- package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
- package/dist/src/agent/memory/dreaming/preview.js +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
- package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
- package/dist/src/agent/memory/dreaming/utils.js +1 -1
- package/dist/src/agent/memory/index.d.ts +2 -0
- package/dist/src/agent/memory/index.js +2 -1
- package/dist/src/agent/memory/memory-flush.d.ts +27 -0
- package/dist/src/agent/memory/memory-flush.js +124 -0
- package/dist/src/agent/memory/memory-flush.js.map +1 -0
- package/dist/src/agent/memory/plugin-discovery.js +1 -1
- package/dist/src/agent/messaging/outbound-coordinator.js +2 -1
- package/dist/src/agent/messaging/outbound-coordinator.js.map +1 -1
- package/dist/src/agent/messaging/stream-manager.d.ts +2 -0
- package/dist/src/agent/messaging/stream-manager.js +3 -0
- package/dist/src/agent/messaging/stream-manager.js.map +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.d.ts +0 -4
- package/dist/src/agent/orchestration/agent-orchestrator.js +40 -107
- package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
- package/dist/src/agent/prompt/contribution.d.ts +9 -0
- package/dist/src/agent/prompt/contribution.js +1 -0
- package/dist/src/agent/prompt/safety.js +0 -10
- package/dist/src/agent/prompt/safety.js.map +1 -1
- package/dist/src/agent/prompt/sanitize-for-prompt.d.ts +6 -0
- package/dist/src/agent/prompt/sanitize-for-prompt.js +13 -0
- package/dist/src/agent/prompt/sanitize-for-prompt.js.map +1 -0
- package/dist/src/agent/prompt/sections/behavior.d.ts +5 -0
- package/dist/src/agent/prompt/sections/behavior.js +50 -0
- package/dist/src/agent/prompt/sections/behavior.js.map +1 -0
- package/dist/src/agent/prompt/sections/memory-skills.d.ts +9 -0
- package/dist/src/agent/prompt/sections/memory-skills.js +59 -0
- package/dist/src/agent/prompt/sections/memory-skills.js.map +1 -0
- package/dist/src/agent/prompt/sections/messaging-runtime.d.ts +16 -0
- package/dist/src/agent/prompt/sections/messaging-runtime.js +69 -0
- package/dist/src/agent/prompt/sections/messaging-runtime.js.map +1 -0
- package/dist/src/agent/prompt/sections/project-context.d.ts +16 -0
- package/dist/src/agent/prompt/sections/project-context.js +58 -0
- package/dist/src/agent/prompt/sections/project-context.js.map +1 -0
- package/dist/src/agent/prompt/sections/tooling.d.ts +5 -0
- package/dist/src/agent/prompt/sections/tooling.js +119 -0
- package/dist/src/agent/prompt/sections/tooling.js.map +1 -0
- package/dist/src/agent/prompt/sections/workspace-runtime.d.ts +11 -0
- package/dist/src/agent/prompt/sections/workspace-runtime.js +32 -0
- package/dist/src/agent/prompt/sections/workspace-runtime.js.map +1 -0
- package/dist/src/agent/prompt/service-prompt-builder.d.ts +13 -0
- package/dist/src/agent/prompt/service-prompt-builder.js +56 -15
- package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
- package/dist/src/agent/prompt/subagent-context.d.ts +15 -0
- package/dist/src/agent/prompt/subagent-context.js +68 -0
- package/dist/src/agent/prompt/subagent-context.js.map +1 -0
- package/dist/src/agent/prompt/system-prompt-params.d.ts +53 -0
- package/dist/src/agent/prompt/system-prompt-params.js +74 -0
- package/dist/src/agent/prompt/system-prompt-params.js.map +1 -0
- package/dist/src/agent/prompt/system-prompt.d.ts +22 -11
- package/dist/src/agent/prompt/system-prompt.js +79 -193
- package/dist/src/agent/prompt/system-prompt.js.map +1 -1
- package/dist/src/agent/prompt/types.d.ts +3 -0
- package/dist/src/agent/reply/post-compaction-context.js +1 -1
- package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
- package/dist/src/agent/sandbox/path-policy.js +2 -2
- package/dist/src/agent/service/build-direct-message-content.d.ts +5 -21
- package/dist/src/agent/service/build-direct-message-content.js +11 -64
- package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
- package/dist/src/agent/service/direct-turn-helpers.d.ts +1 -1
- package/dist/src/agent/service/direct-turn-helpers.js +7 -0
- package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
- package/dist/src/agent/service/process-direct-one-shot.d.ts +3 -3
- package/dist/src/agent/service/process-direct-one-shot.js +22 -17
- package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.d.ts +6 -20
- package/dist/src/agent/service/process-direct-streaming.js +39 -40
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service/webchat-tts.d.ts +4 -9
- package/dist/src/agent/service/webchat-tts.js +9 -20
- package/dist/src/agent/service/webchat-tts.js.map +1 -1
- package/dist/src/agent/service.d.ts +8 -19
- package/dist/src/agent/service.js +57 -15
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/session/session-inspector.js +1 -1
- package/dist/src/agent/skills/config.js +1 -1
- package/dist/src/agent/skills/hub-hash.js +2 -2
- package/dist/src/agent/skills/hub-lock.js +1 -1
- package/dist/src/agent/skills/hub-pull.js +2 -2
- package/dist/src/agent/skills/index.js +1 -1
- package/dist/src/agent/skills/managed-store.js +1 -1
- package/dist/src/agent/skills/scanner.js +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js +1 -1
- package/dist/src/agent/skills/skill-manager.js +1 -1
- package/dist/src/agent/tools/dreaming-tool.js +1 -1
- package/dist/src/agent/tools/factory.js +3 -1
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +1 -1
- package/dist/src/agent/tools/index.d.ts +1 -0
- package/dist/src/agent/tools/index.js +2 -1
- package/dist/src/agent/tools/media-read-tool.d.ts +2 -0
- package/dist/src/agent/tools/media-read-tool.js +89 -0
- package/dist/src/agent/tools/media-read-tool.js.map +1 -0
- package/dist/src/agent/tools/send-media.js +1 -1
- package/dist/src/agent/tools/skill-manage-tool.js +1 -1
- package/dist/src/agent/tools/workflow-tool.js +1 -1
- package/dist/src/agent/tools/write.js +1 -1
- package/dist/src/agent/workflow/catalog.js +1 -1
- package/dist/src/auth/credentials.js +3 -3
- package/dist/src/auth/profiles/store.js +1 -1
- package/dist/src/auth/sync-provider-auth.js +1 -1
- package/dist/src/browser/cache-dir-policy.js +1 -1
- package/dist/src/browser/cdp-local-launcher.js +2 -2
- package/dist/src/browser/providers/browser-ext-install.js +3 -3
- package/dist/src/browser/providers/cloakbrowser.js +4 -4
- package/dist/src/browser/providers/playwright-doctor.js +1 -1
- package/dist/src/browser/stealth.js +1 -1
- package/dist/src/channels/attachments/attachment-classifiers.d.ts +8 -0
- package/dist/src/channels/attachments/attachment-classifiers.js +11 -0
- package/dist/src/channels/attachments/attachment-classifiers.js.map +1 -0
- package/dist/src/channels/attachments/inbound-persist.d.ts +13 -34
- package/dist/src/channels/attachments/inbound-persist.js +34 -102
- package/dist/src/channels/attachments/inbound-persist.js.map +1 -1
- package/dist/src/channels/attachments/inbound-types.d.ts +13 -0
- package/dist/src/channels/attachments/inbound-types.js +30 -0
- package/dist/src/channels/attachments/inbound-types.js.map +1 -0
- package/dist/src/channels/attachments/outbound-tts-persist.d.ts +3 -12
- package/dist/src/channels/attachments/outbound-tts-persist.js +28 -48
- package/dist/src/channels/attachments/outbound-tts-persist.js.map +1 -1
- package/dist/src/channels/attachments/voice-stt-webchat.d.ts +3 -3
- package/dist/src/channels/attachments/voice-stt-webchat.js +8 -14
- package/dist/src/channels/attachments/voice-stt-webchat.js.map +1 -1
- package/dist/src/channels/channel-domain.d.ts +30 -2
- package/dist/src/channels/exec-approval-runtime.d.ts +29 -0
- package/dist/src/channels/exec-approval-runtime.js +30 -0
- package/dist/src/channels/exec-approval-runtime.js.map +1 -0
- package/dist/src/channels/index.js +1 -1
- package/dist/src/channels/outbound/persist-store.js +1 -1
- package/dist/src/channels/pairing/allow-from-file.js +1 -1
- package/dist/src/channels/pairing/pairing-store.js +2 -2
- package/dist/src/channels/plugin-types.d.ts +1 -0
- package/dist/src/channels/transport-types.d.ts +2 -2
- package/dist/src/chat-commands/agent-edit.js +2 -2
- package/dist/src/chat-commands/builtins/config.js +2 -2
- package/dist/src/chat-commands/context.js +1 -1
- package/dist/src/cli/commands/channels.js +1 -1
- package/dist/src/cli/commands/config.js +1 -1
- package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/database-schema.js +62 -0
- package/dist/src/cli/commands/doctor/checks/database-schema.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
- package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
- package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
- package/dist/src/cli/commands/doctor/flow.js +2 -0
- package/dist/src/cli/commands/doctor/flow.js.map +1 -1
- package/dist/src/cli/commands/extension-dev.js +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +1 -1
- package/dist/src/cli/commands/extension-pack.js +1 -1
- package/dist/src/cli/commands/gateway/logs.js +1 -1
- package/dist/src/cli/commands/image.js +1 -1
- package/dist/src/cli/commands/init.js +5 -60
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/onboard/channels/registry.js +1 -1
- package/dist/src/cli/commands/setup.js +6 -5
- package/dist/src/cli/commands/setup.js.map +1 -1
- package/dist/src/cli/utils/init-workspace-core.js +2 -3
- package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
- package/dist/src/commands/agents.config.js +1 -1
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/gateway-bind.js +1 -1
- package/dist/src/config/index.js +7 -7
- package/dist/src/config/loader.js +2 -2
- package/dist/src/config/models-json.js +2 -2
- package/dist/src/config/paths-state.js +1 -1
- package/dist/src/config/paths.d.ts +0 -13
- package/dist/src/config/paths.js +1 -20
- package/dist/src/config/paths.js.map +1 -1
- package/dist/src/config/profile.js +2 -2
- package/dist/src/config/rules.js +1 -1
- package/dist/src/config/schema.d.ts +24 -0
- package/dist/src/config/schema.js +33 -2
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/workspace-path.js +1 -1
- package/dist/src/cron/executor.js +4 -4
- package/dist/src/cron/persistence.js +1 -1
- package/dist/src/daemon/constants.js +1 -1
- package/dist/src/daemon/install-plan.js +2 -2
- package/dist/src/daemon/launchd.js +2 -2
- package/dist/src/daemon/schtasks.js +2 -2
- package/dist/src/daemon/systemd.js +2 -2
- package/dist/src/extensions/bundle-mcp.js +1 -1
- package/dist/src/extensions/discover-extensions.js +1 -1
- package/dist/src/extensions/health.js +1 -1
- package/dist/src/extensions/loader.js +1 -1
- package/dist/src/extensions/lockfile.js +2 -2
- package/dist/src/extensions/update.js +1 -1
- package/dist/src/gateway/agents-admin.js +3 -3
- package/dist/src/gateway/file-path-classifier.js +2 -2
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/lib/config-payload.js +2 -2
- package/dist/src/gateway/hono/lib/extension-store.js +2 -2
- package/dist/src/gateway/hono/lib/static-ui.js +2 -2
- package/dist/src/gateway/hono/oauth.js +1 -1
- package/dist/src/gateway/hono/routes/agents.js +1 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
- package/dist/src/gateway/hono/routes/config-patch/channels.js +3 -3
- package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +1 -1
- package/dist/src/gateway/hono/routes/host-fs.js +2 -2
- package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/media.d.ts +3 -0
- package/dist/src/gateway/hono/routes/media.js +50 -0
- package/dist/src/gateway/hono/routes/media.js.map +1 -0
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +6 -0
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/shares.js +1 -1
- package/dist/src/gateway/hono/routes/workspace.js +3 -89
- package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
- package/dist/src/gateway/lock.js +3 -3
- package/dist/src/gateway/ports.js +1 -1
- package/dist/src/gateway/service/agent-runner.js +2 -2
- package/dist/src/gateway/service/marketplace-service.js +2 -2
- package/dist/src/gateway/service/sessions-api.js +3 -0
- package/dist/src/gateway/service/sessions-api.js.map +1 -1
- package/dist/src/gateway/service.js +1 -1
- package/dist/src/gateway/workspace-fs-file-list.js +1 -1
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/infra/brew.js +1 -1
- package/dist/src/infra/package-json.js +1 -1
- package/dist/src/infra/package-update-steps.js +1 -1
- package/dist/src/infra/path-env.js +2 -2
- package/dist/src/infra/restart.js +2 -2
- package/dist/src/infra/stable-node-path.js +1 -1
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/infra/update-global.js +1 -1
- package/dist/src/infra/update-lock.js +3 -3
- package/dist/src/infra/update-runner.js +1 -1
- package/dist/src/infra/update-startup.js +2 -2
- package/dist/src/infra/write-file-atomic.js +2 -2
- package/dist/src/media/index.d.ts +5 -0
- package/dist/src/media/index.js +5 -0
- package/dist/src/media/media-reference.d.ts +23 -0
- package/dist/src/media/media-reference.js +34 -0
- package/dist/src/media/media-reference.js.map +1 -0
- package/dist/src/media/paths.d.ts +5 -0
- package/dist/src/media/paths.js +20 -0
- package/dist/src/media/paths.js.map +1 -0
- package/dist/src/media/session-references.d.ts +8 -0
- package/dist/src/media/session-references.js +45 -0
- package/dist/src/media/session-references.js.map +1 -0
- package/dist/src/media/store.d.ts +19 -0
- package/dist/src/media/store.js +131 -0
- package/dist/src/media/store.js.map +1 -0
- package/dist/src/media/types.d.ts +34 -0
- package/dist/src/media/types.js +1 -0
- package/dist/src/media/uri.d.ts +15 -0
- package/dist/src/media/uri.js +51 -0
- package/dist/src/media/uri.js.map +1 -0
- package/dist/src/notes/store.js +2 -2
- package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
- package/dist/src/providers/index.js +2 -2
- package/dist/src/providers/model-registry.js +1 -1
- package/dist/src/session/init-session-turn.js +2 -2
- package/dist/src/session/resolve-session.js +3 -3
- package/dist/src/session/session-title.js +8 -5
- package/dist/src/session/session-title.js.map +1 -1
- package/dist/src/session/store.js +3 -3
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/types.d.ts +12 -7
- package/dist/src/session/types.js.map +1 -1
- package/dist/src/share/share-auto.js +2 -2
- package/dist/src/share/share-store.js +3 -3
- package/dist/src/share/share-thumbnail.js +2 -2
- package/dist/src/share/share-zip.js +1 -1
- package/dist/src/share/site-share-store.js +3 -3
- package/dist/src/share/site-static-serve.js +1 -1
- package/dist/src/storage/sqlite/connection.js +2 -2
- package/dist/src/storage/sqlite/index.d.ts +4 -1
- package/dist/src/storage/sqlite/index.js +6 -2
- package/dist/src/storage/sqlite/memory-index-repository.js +2 -2
- package/dist/src/storage/sqlite/migrations/002_add_flush_columns.sql +3 -0
- package/dist/src/storage/sqlite/migrations/discover.d.ts +4 -0
- package/dist/src/storage/sqlite/migrations/discover.js +38 -0
- package/dist/src/storage/sqlite/migrations/discover.js.map +1 -0
- package/dist/src/storage/sqlite/migrations/discover.ts +52 -0
- package/dist/src/storage/sqlite/migrations/errors.d.ts +11 -0
- package/dist/src/storage/sqlite/migrations/errors.js +27 -0
- package/dist/src/storage/sqlite/migrations/errors.js.map +1 -0
- package/dist/src/storage/sqlite/migrations/errors.ts +32 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +22 -0
- package/dist/src/storage/sqlite/migrations/runner.js +97 -0
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -0
- package/dist/src/storage/sqlite/migrations/runner.ts +153 -0
- package/dist/src/storage/sqlite/migrations/types.d.ts +12 -0
- package/dist/src/storage/sqlite/migrations/types.js +1 -0
- package/dist/src/storage/sqlite/migrations/types.ts +13 -0
- package/dist/src/storage/sqlite/row-mappers.d.ts +4 -0
- package/dist/src/storage/sqlite/row-mappers.js +4 -0
- package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
- package/dist/src/storage/sqlite/schema-version.d.ts +6 -0
- package/dist/src/storage/sqlite/schema-version.js +29 -0
- package/dist/src/storage/sqlite/schema-version.js.map +1 -0
- package/dist/src/storage/sqlite/schema.d.ts +5 -3
- package/dist/src/storage/sqlite/schema.js +25 -29
- package/dist/src/storage/sqlite/schema.js.map +1 -1
- package/dist/src/storage/sqlite/schema.sql +2 -0
- package/dist/src/storage/sqlite/session-metadata.js +1 -0
- package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
- package/dist/src/storage/sqlite/session-repository.js +7 -3
- package/dist/src/storage/sqlite/session-repository.js.map +1 -1
- package/dist/src/tui/clipboard-image.js +3 -3
- package/dist/src/tui/theme-manager.js +1 -1
- package/dist/src/tui/tui-keybindings-file.js +1 -1
- package/dist/src/tui/tui-scoped-models.js +2 -2
- package/dist/src/tui/tui-settings.js +1 -1
- package/dist/src/tui/tui.js +3 -3
- package/dist/src/tunnel/frpc-binary.js +3 -3
- package/dist/src/tunnel/frpc-config.js +1 -1
- package/dist/src/tunnel/frpc-extract.js +1 -1
- package/dist/src/tunnel/tunnel-state.js +1 -1
- package/dist/src/utils/logger/audit.js +1 -1
- package/dist/src/utils/logger/log-store.js +1 -1
- package/dist/src/utils/logger/rotation.js +1 -1
- package/dist/src/voice/tts/audio.js +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +2 -2
- package/dist/src/workflows/store/event-store.js +1 -1
- package/dist/src/workflows/store/run-store.js +1 -1
- package/package.json +1 -1
- package/dist/gateway/static/root/assets/channels-settings-BmN5udFV.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-LXGc1lXo.js +0 -8
- package/dist/gateway/static/root/assets/index-BJDmBCSl.css +0 -1
- package/dist/gateway/static/root/assets/index-DsmZjtSc.js +0 -4707
- package/dist/gateway/static/root/assets/url-DpFBIyN9.js +0 -3
- package/dist/src/cli/commands/onboard/workspace.d.ts +0 -14
- package/dist/src/cli/commands/onboard/workspace.js +0 -33
- package/dist/src/cli/commands/onboard/workspace.js.map +0 -1
- package/dist/src/cli/utils/workspace.d.ts +0 -35
- package/dist/src/cli/utils/workspace.js +0 -72
- package/dist/src/cli/utils/workspace.js.map +0 -1
|
@@ -1,39 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Persist inbound
|
|
3
|
-
* workspace stays user-visible; session transcripts reference stable relative paths.
|
|
2
|
+
* Persist inbound uploads to the global media store (`{stateDir}/media/inbound/`).
|
|
4
3
|
*/
|
|
5
|
-
|
|
6
|
-
export
|
|
7
|
-
export
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
data?: string;
|
|
11
|
-
name?: string;
|
|
12
|
-
size?: number;
|
|
13
|
-
/** Set after persist (relative to agent home). */
|
|
14
|
-
workspaceRelativePath?: string;
|
|
15
|
-
}
|
|
16
|
-
export type InternalAttachmentRoots = {
|
|
17
|
-
/** `…/agents/<id>/` — primary storage */
|
|
18
|
-
agentHome: string;
|
|
19
|
-
};
|
|
20
|
-
/** Decode base64 or data-URL payload for inbound attachments (also used by voice STT). */
|
|
4
|
+
import type { InboundAttachmentInput, MediaRef } from '../../media/types.js';
|
|
5
|
+
export type { InboundAttachmentInput, MediaRef } from '../../media/types.js';
|
|
6
|
+
export { isImageInboundAttachment, isVoiceInboundAttachment } from './attachment-classifiers.js';
|
|
7
|
+
export { toMediaRef, mediaRefFromUri } from './inbound-types.js';
|
|
8
|
+
/** Decode base64 or data-URL payload (composer wire + voice STT). */
|
|
21
9
|
export declare function decodeInboundAttachmentBase64(data: string): Buffer;
|
|
22
10
|
/**
|
|
23
|
-
* Write
|
|
24
|
-
* of each attachment with `workspaceRelativePath` set (POSIX-style, `/` separators).
|
|
11
|
+
* Write attachments with binary `data` to the media store; returns metadata-only refs.
|
|
25
12
|
*/
|
|
26
|
-
export declare function
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
*/
|
|
30
|
-
export declare function
|
|
31
|
-
|
|
32
|
-
* Remove inbound file transcript blocks from a string (e.g. auto session titles).
|
|
33
|
-
* Matches Web UI `stripInboundFileMachineText`, plus bare `[File: …]` lines when paths are absent.
|
|
34
|
-
*/
|
|
35
|
-
export declare function stripInboundFileMetadataFromText(text: string): string;
|
|
36
|
-
/**
|
|
37
|
-
* Resolve a stored relative path under `inbound/`.
|
|
38
|
-
*/
|
|
39
|
-
export declare function resolveSafeInboundFilePath(roots: InternalAttachmentRoots, relRaw: string): string | null;
|
|
13
|
+
export declare function persistInboundAttachments(attachments: InboundAttachmentInput[] | undefined, opts?: {
|
|
14
|
+
maxBytes?: number;
|
|
15
|
+
}): Promise<MediaRef[] | undefined>;
|
|
16
|
+
/** Read attachment bytes by media URI (voice STT, tools). */
|
|
17
|
+
export declare function readInboundAttachmentBuffer(uri: string): Promise<Buffer>;
|
|
18
|
+
export declare function assertMediaUri(uri: string): void;
|
|
@@ -1,125 +1,57 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { parseMediaUri } from "../../media/uri.js";
|
|
4
|
+
import { saveMediaBuffer } from "../../media/store.js";
|
|
5
|
+
import { readMediaReference, resolveMediaReference } from "../../media/media-reference.js";
|
|
6
|
+
import { isImageInboundAttachment, isVoiceInboundAttachment } from "./attachment-classifiers.js";
|
|
7
|
+
import { mediaRefFromUri, toMediaRef } from "./inbound-types.js";
|
|
6
8
|
//#region src/channels/attachments/inbound-persist.ts
|
|
7
|
-
/**
|
|
8
|
-
* Persist inbound channel / Web UI uploads under the agent home dir so the markdown
|
|
9
|
-
* workspace stays user-visible; session transcripts reference stable relative paths.
|
|
10
|
-
*/
|
|
11
9
|
init_logger();
|
|
12
10
|
const log = createLogger("InboundPersist");
|
|
13
|
-
/**
|
|
14
|
-
const INBOUND_REL_ROOT = "inbound";
|
|
15
|
-
function sanitizeSessionSegment(sessionKey) {
|
|
16
|
-
return sessionKey.replace(/[^a-zA-Z0-9_.-]+/g, "_").slice(0, 180) || "session";
|
|
17
|
-
}
|
|
18
|
-
function sanitizeFilename(name) {
|
|
19
|
-
return (name.replace(/[/\\?%*:|"<>]/g, "_").trim() || "file").slice(0, 200);
|
|
20
|
-
}
|
|
21
|
-
function isImageAttachment(att) {
|
|
22
|
-
return att.type === "image" || att.type === "photo" || att.mimeType?.startsWith("image/") === true;
|
|
23
|
-
}
|
|
24
|
-
/** Decode base64 or data-URL payload for inbound attachments (also used by voice STT). */
|
|
11
|
+
/** Decode base64 or data-URL payload (composer wire + voice STT). */
|
|
25
12
|
function decodeInboundAttachmentBase64(data) {
|
|
26
13
|
const trimmed = data.trim();
|
|
27
14
|
const b64 = trimmed.startsWith("data:") ? trimmed.split(/base64,/)[1] ?? trimmed : trimmed;
|
|
28
15
|
return Buffer.from(b64.replace(/\s/g, ""), "base64");
|
|
29
16
|
}
|
|
30
|
-
function resolveUnderRoot(root, rel, requiredPrefix) {
|
|
31
|
-
const normalized = rel.replace(/\\/g, "/").replace(/^\/+/, "");
|
|
32
|
-
if (normalized.includes("..") || !normalized.startsWith(requiredPrefix)) return null;
|
|
33
|
-
const abs = resolve(root, ...normalized.split("/"));
|
|
34
|
-
const rootResolved = resolve(root);
|
|
35
|
-
if (!abs.startsWith(rootResolved)) return null;
|
|
36
|
-
return abs;
|
|
37
|
-
}
|
|
38
17
|
/**
|
|
39
|
-
* Write
|
|
40
|
-
* of each attachment with `workspaceRelativePath` set (POSIX-style, `/` separators).
|
|
18
|
+
* Write attachments with binary `data` to the media store; returns metadata-only refs.
|
|
41
19
|
*/
|
|
42
|
-
async function
|
|
43
|
-
if (!attachments?.length) return
|
|
44
|
-
const
|
|
45
|
-
const inboundAbs = resolve(agentHomeRoot, INBOUND_REL_ROOT, sessionSeg);
|
|
46
|
-
await mkdir(inboundAbs, { recursive: true });
|
|
20
|
+
async function persistInboundAttachments(attachments, opts) {
|
|
21
|
+
if (!attachments?.length) return void 0;
|
|
22
|
+
const maxBytes = opts?.maxBytes ?? 5242880;
|
|
47
23
|
const out = [];
|
|
48
24
|
for (const att of attachments) {
|
|
49
|
-
if (att.
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
if (isImageAttachment(att)) {
|
|
54
|
-
out.push({ ...att });
|
|
55
|
-
continue;
|
|
56
|
-
}
|
|
57
|
-
if (!att.data || att.data.length === 0) {
|
|
58
|
-
out.push({ ...att });
|
|
25
|
+
if (att.uri?.trim()) {
|
|
26
|
+
const resolved = await resolveMediaReference(att.uri.trim());
|
|
27
|
+
out.push(mediaRefFromUri(att, resolved.uri, resolved.path, resolved.bucket, resolved.id));
|
|
59
28
|
continue;
|
|
60
29
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}, "Inbound file persisted");
|
|
75
|
-
out.push({
|
|
76
|
-
...att,
|
|
77
|
-
workspaceRelativePath,
|
|
78
|
-
size: att.size ?? buf.length
|
|
79
|
-
});
|
|
80
|
-
} catch (err) {
|
|
81
|
-
log.warn({
|
|
82
|
-
err,
|
|
83
|
-
sessionKey,
|
|
84
|
-
name: att.name
|
|
85
|
-
}, "Failed to persist inbound attachment");
|
|
86
|
-
out.push({ ...att });
|
|
87
|
-
}
|
|
30
|
+
if (!att.data || att.data.length === 0) throw new Error(`Inbound attachment "${att.name ?? "file"}" is missing data and uri`);
|
|
31
|
+
const saved = await saveMediaBuffer(decodeInboundAttachmentBase64(att.data), {
|
|
32
|
+
contentType: att.mimeType,
|
|
33
|
+
bucket: "inbound",
|
|
34
|
+
maxBytes,
|
|
35
|
+
originalFilename: att.name
|
|
36
|
+
});
|
|
37
|
+
log.debug({
|
|
38
|
+
uri: saved.uri,
|
|
39
|
+
bytes: saved.size,
|
|
40
|
+
name: att.name
|
|
41
|
+
}, "Inbound attachment persisted");
|
|
42
|
+
out.push(toMediaRef(att, saved));
|
|
88
43
|
}
|
|
89
|
-
return out;
|
|
44
|
+
return out.length ? out : void 0;
|
|
90
45
|
}
|
|
91
|
-
/**
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const head = `[File: ${att.name || "unknown"} (${att.mimeType || "unknown type"}, ${att.size ?? 0} bytes)]`;
|
|
96
|
-
if (!att.workspaceRelativePath) return head;
|
|
97
|
-
const rel = att.workspaceRelativePath.replace(/\\/g, "/");
|
|
98
|
-
return `${head}\nxopc-path:rel:${rel}\nxopc-path:abs:${resolve(storageRootAbs, ...rel.split("/").filter(Boolean))}`;
|
|
46
|
+
/** Read attachment bytes by media URI (voice STT, tools). */
|
|
47
|
+
async function readInboundAttachmentBuffer(uri) {
|
|
48
|
+
const { buffer } = await readMediaReference(uri);
|
|
49
|
+
return buffer;
|
|
99
50
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
* Matches Web UI `stripInboundFileMachineText`, plus bare `[File: …]` lines when paths are absent.
|
|
103
|
-
*/
|
|
104
|
-
function stripInboundFileMetadataFromText(text) {
|
|
105
|
-
if (!text.includes("[File:") && !text.includes("xopc-path:")) return text;
|
|
106
|
-
let out = text;
|
|
107
|
-
out = out.replace(/\s*\[File:[^\]]+\]\s*\r?\nxopc-path:rel:[^\r\n]+\r?\n\s*xopc-path:abs:[^\r\n]+/g, "");
|
|
108
|
-
out = out.replace(/\s*\[File:[^\]]+\]\s+xopc-path:rel:\S+\s+xopc-path:abs:\S+/g, "");
|
|
109
|
-
out = out.replace(/\s*\[File:[^\]]+\]\s*xopc-path:rel:\S+\s*xopc-path:abs:\S+/g, "");
|
|
110
|
-
out = out.replace(/\s*\[File:[^\]]+\]\s*/g, " ");
|
|
111
|
-
return out.replace(/\n{3,}/g, "\n\n").replace(/\s{2,}/g, " ").trim();
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Resolve a stored relative path under `inbound/`.
|
|
115
|
-
*/
|
|
116
|
-
function resolveSafeInboundFilePath(roots, relRaw) {
|
|
117
|
-
const rel = relRaw.replace(/\\/g, "/").replace(/^\/+/, "");
|
|
118
|
-
if (rel.includes("..")) return null;
|
|
119
|
-
if (rel.startsWith(`inbound/`)) return resolveUnderRoot(roots.agentHome, rel, `${INBOUND_REL_ROOT}/`);
|
|
120
|
-
return null;
|
|
51
|
+
function assertMediaUri(uri) {
|
|
52
|
+
parseMediaUri(uri);
|
|
121
53
|
}
|
|
122
54
|
//#endregion
|
|
123
|
-
export {
|
|
55
|
+
export { assertMediaUri, decodeInboundAttachmentBase64, isImageInboundAttachment, isVoiceInboundAttachment, mediaRefFromUri, persistInboundAttachments, readInboundAttachmentBuffer, toMediaRef };
|
|
124
56
|
|
|
125
57
|
//# sourceMappingURL=inbound-persist.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbound-persist.js","names":[],"sources":["../../../../src/channels/attachments/inbound-persist.ts"],"sourcesContent":["/**\n * Persist inbound
|
|
1
|
+
{"version":3,"file":"inbound-persist.js","names":[],"sources":["../../../../src/channels/attachments/inbound-persist.ts"],"sourcesContent":["/**\n * Persist inbound uploads to the global media store (`{stateDir}/media/inbound/`).\n */\n\nimport { createLogger } from '../../utils/logger.js';\nimport {\n MEDIA_MAX_BYTES,\n parseMediaUri,\n readMediaReference,\n resolveMediaReference,\n saveMediaBuffer,\n} from '../../media/index.js';\nimport type { InboundAttachmentInput, MediaRef } from '../../media/types.js';\nimport { mediaRefFromUri, toMediaRef } from './inbound-types.js';\n\nconst log = createLogger('InboundPersist');\n\nexport type { InboundAttachmentInput, MediaRef } from '../../media/types.js';\nexport { isImageInboundAttachment, isVoiceInboundAttachment } from './attachment-classifiers.js';\nexport { toMediaRef, mediaRefFromUri } from './inbound-types.js';\n\n/** Decode base64 or data-URL payload (composer wire + voice STT). */\nexport function decodeInboundAttachmentBase64(data: string): Buffer {\n const trimmed = data.trim();\n const b64 = trimmed.startsWith('data:') ? (trimmed.split(/base64,/)[1] ?? trimmed) : trimmed;\n return Buffer.from(b64.replace(/\\s/g, ''), 'base64');\n}\n\n/**\n * Write attachments with binary `data` to the media store; returns metadata-only refs.\n */\nexport async function persistInboundAttachments(\n attachments: InboundAttachmentInput[] | undefined,\n opts?: { maxBytes?: number },\n): Promise<MediaRef[] | undefined> {\n if (!attachments?.length) return undefined;\n\n const maxBytes = opts?.maxBytes ?? MEDIA_MAX_BYTES;\n const out: MediaRef[] = [];\n\n for (const att of attachments) {\n if (att.uri?.trim()) {\n const resolved = await resolveMediaReference(att.uri.trim());\n out.push(\n mediaRefFromUri(att, resolved.uri, resolved.path, resolved.bucket, resolved.id),\n );\n continue;\n }\n\n if (!att.data || att.data.length === 0) {\n throw new Error(`Inbound attachment \"${att.name ?? 'file'}\" is missing data and uri`);\n }\n\n const buf = decodeInboundAttachmentBase64(att.data);\n const saved = await saveMediaBuffer(buf, {\n contentType: att.mimeType,\n bucket: 'inbound',\n maxBytes,\n originalFilename: att.name,\n });\n\n log.debug({ uri: saved.uri, bytes: saved.size, name: att.name }, 'Inbound attachment persisted');\n\n out.push(toMediaRef(att, saved));\n }\n\n return out.length ? out : undefined;\n}\n\n/** Read attachment bytes by media URI (voice STT, tools). */\nexport async function readInboundAttachmentBuffer(uri: string): Promise<Buffer> {\n const { buffer } = await readMediaReference(uri);\n return buffer;\n}\n\nexport function assertMediaUri(uri: string): void {\n parseMediaUri(uri);\n}\n"],"mappings":";;;;;;;;aAIqD;AAWrD,MAAM,MAAM,aAAa,iBAAiB;;AAO1C,SAAgB,8BAA8B,MAAsB;CAClE,MAAM,UAAU,KAAK,MAAM;CAC3B,MAAM,MAAM,QAAQ,WAAW,QAAQ,GAAI,QAAQ,MAAM,UAAU,CAAC,MAAM,UAAW;AACrF,QAAO,OAAO,KAAK,IAAI,QAAQ,OAAO,GAAG,EAAE,SAAS;;;;;AAMtD,eAAsB,0BACpB,aACA,MACiC;AACjC,KAAI,CAAC,aAAa,OAAQ,QAAO,KAAA;CAEjC,MAAM,WAAW,MAAM,YAAA;CACvB,MAAM,MAAkB,EAAE;AAE1B,MAAK,MAAM,OAAO,aAAa;AAC7B,MAAI,IAAI,KAAK,MAAM,EAAE;GACnB,MAAM,WAAW,MAAM,sBAAsB,IAAI,IAAI,MAAM,CAAC;AAC5D,OAAI,KACF,gBAAgB,KAAK,SAAS,KAAK,SAAS,MAAM,SAAS,QAAQ,SAAS,GAAG,CAChF;AACD;;AAGF,MAAI,CAAC,IAAI,QAAQ,IAAI,KAAK,WAAW,EACnC,OAAM,IAAI,MAAM,uBAAuB,IAAI,QAAQ,OAAO,2BAA2B;EAIvF,MAAM,QAAQ,MAAM,gBADR,8BAA8B,IAAI,KACP,EAAE;GACvC,aAAa,IAAI;GACjB,QAAQ;GACR;GACA,kBAAkB,IAAI;GACvB,CAAC;AAEF,MAAI,MAAM;GAAE,KAAK,MAAM;GAAK,OAAO,MAAM;GAAM,MAAM,IAAI;GAAM,EAAE,+BAA+B;AAEhG,MAAI,KAAK,WAAW,KAAK,MAAM,CAAC;;AAGlC,QAAO,IAAI,SAAS,MAAM,KAAA;;;AAI5B,eAAsB,4BAA4B,KAA8B;CAC9E,MAAM,EAAE,WAAW,MAAM,mBAAmB,IAAI;AAChD,QAAO;;AAGT,SAAgB,eAAe,KAAmB;AAChD,eAAc,IAAI"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { InboundAttachmentInput, MediaRef } from '../../media/types.js';
|
|
2
|
+
import { isImageInboundAttachment, isVoiceInboundAttachment } from './attachment-classifiers.js';
|
|
3
|
+
export type { InboundAttachmentInput, MediaRef } from '../../media/types.js';
|
|
4
|
+
export { isImageInboundAttachment, isVoiceInboundAttachment };
|
|
5
|
+
export declare function toMediaRef(att: InboundAttachmentInput, saved: {
|
|
6
|
+
id: string;
|
|
7
|
+
bucket: MediaRef['bucket'];
|
|
8
|
+
uri: string;
|
|
9
|
+
path: string;
|
|
10
|
+
size: number;
|
|
11
|
+
contentType: string;
|
|
12
|
+
}): MediaRef;
|
|
13
|
+
export declare function mediaRefFromUri(att: InboundAttachmentInput, uri: string, path: string, bucket: MediaRef['bucket'], id: string): MediaRef;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { isImageInboundAttachment, isVoiceInboundAttachment } from "./attachment-classifiers.js";
|
|
2
|
+
//#region src/channels/attachments/inbound-types.ts
|
|
3
|
+
function toMediaRef(att, saved) {
|
|
4
|
+
return {
|
|
5
|
+
id: saved.id,
|
|
6
|
+
bucket: saved.bucket,
|
|
7
|
+
type: att.type,
|
|
8
|
+
mimeType: att.mimeType?.trim() || saved.contentType,
|
|
9
|
+
name: att.name?.trim() || "file",
|
|
10
|
+
size: att.size ?? saved.size,
|
|
11
|
+
uri: saved.uri,
|
|
12
|
+
path: saved.path
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function mediaRefFromUri(att, uri, path, bucket, id) {
|
|
16
|
+
return {
|
|
17
|
+
id,
|
|
18
|
+
bucket,
|
|
19
|
+
type: att.type,
|
|
20
|
+
mimeType: att.mimeType?.trim() || "application/octet-stream",
|
|
21
|
+
name: att.name?.trim() || "file",
|
|
22
|
+
size: att.size ?? 0,
|
|
23
|
+
uri,
|
|
24
|
+
path
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
export { isImageInboundAttachment, isVoiceInboundAttachment, mediaRefFromUri, toMediaRef };
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=inbound-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbound-types.js","names":[],"sources":["../../../../src/channels/attachments/inbound-types.ts"],"sourcesContent":["import type { InboundAttachmentInput, MediaRef } from '../../media/types.js';\nimport {\n isImageInboundAttachment,\n isVoiceInboundAttachment,\n} from './attachment-classifiers.js';\n\nexport type { InboundAttachmentInput, MediaRef } from '../../media/types.js';\nexport { isImageInboundAttachment, isVoiceInboundAttachment };\n\nexport function toMediaRef(\n att: InboundAttachmentInput,\n saved: { id: string; bucket: MediaRef['bucket']; uri: string; path: string; size: number; contentType: string },\n): MediaRef {\n return {\n id: saved.id,\n bucket: saved.bucket,\n type: att.type,\n mimeType: att.mimeType?.trim() || saved.contentType,\n name: att.name?.trim() || 'file',\n size: att.size ?? saved.size,\n uri: saved.uri,\n path: saved.path,\n };\n}\n\nexport function mediaRefFromUri(\n att: InboundAttachmentInput,\n uri: string,\n path: string,\n bucket: MediaRef['bucket'],\n id: string,\n): MediaRef {\n return {\n id,\n bucket,\n type: att.type,\n mimeType: att.mimeType?.trim() || 'application/octet-stream',\n name: att.name?.trim() || 'file',\n size: att.size ?? 0,\n uri,\n path,\n };\n}\n"],"mappings":";;AASA,SAAgB,WACd,KACA,OACU;AACV,QAAO;EACL,IAAI,MAAM;EACV,QAAQ,MAAM;EACd,MAAM,IAAI;EACV,UAAU,IAAI,UAAU,MAAM,IAAI,MAAM;EACxC,MAAM,IAAI,MAAM,MAAM,IAAI;EAC1B,MAAM,IAAI,QAAQ,MAAM;EACxB,KAAK,MAAM;EACX,MAAM,MAAM;EACb;;AAGH,SAAgB,gBACd,KACA,KACA,MACA,QACA,IACU;AACV,QAAO;EACL;EACA;EACA,MAAM,IAAI;EACV,UAAU,IAAI,UAAU,MAAM,IAAI;EAClC,MAAM,IAAI,MAAM,MAAM,IAAI;EAC1B,MAAM,IAAI,QAAQ;EAClB;EACA;EACD"}
|
|
@@ -1,14 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Persist outbound TTS audio
|
|
2
|
+
* Persist outbound TTS audio to `{stateDir}/media/tts/`.
|
|
3
3
|
*/
|
|
4
|
-
import type {
|
|
5
|
-
export declare
|
|
6
|
-
export declare function persistOutboundTtsAudio(agentHomeRoot: string, sessionKey: string, audioBuffer: Buffer, format: string): Promise<{
|
|
7
|
-
workspaceRelativePath: string;
|
|
8
|
-
name: string;
|
|
9
|
-
size: number;
|
|
10
|
-
}>;
|
|
11
|
-
/**
|
|
12
|
-
* Resolve a stored relative path under `tts/`.
|
|
13
|
-
*/
|
|
14
|
-
export declare function resolveSafeTtsFilePath(roots: InternalAttachmentRoots, relRaw: string): string | null;
|
|
4
|
+
import type { MediaRef } from '../../media/types.js';
|
|
5
|
+
export declare function persistOutboundTtsAudio(audioBuffer: Buffer, format: string): Promise<MediaRef>;
|
|
@@ -1,66 +1,46 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import {
|
|
4
|
-
import { join, resolve } from "path";
|
|
5
|
-
import { randomBytes } from "crypto";
|
|
3
|
+
import { saveMediaBuffer } from "../../media/store.js";
|
|
6
4
|
//#region src/channels/attachments/outbound-tts-persist.ts
|
|
7
|
-
/**
|
|
8
|
-
* Persist outbound TTS audio under `<agentHome>/tts/<session>/`.
|
|
9
|
-
*/
|
|
10
5
|
init_logger();
|
|
11
6
|
const log = createLogger("OutboundTtsPersist");
|
|
12
|
-
const TTS_REL_ROOT = "tts";
|
|
13
|
-
function sanitizeSessionSegment(sessionKey) {
|
|
14
|
-
return sessionKey.replace(/[^a-zA-Z0-9_.-]+/g, "_").slice(0, 180) || "session";
|
|
15
|
-
}
|
|
16
7
|
function extForFormat(format) {
|
|
17
8
|
const f = format.toLowerCase();
|
|
18
|
-
if (f === "opus" || f === "ogg") return "ogg";
|
|
19
|
-
if (f === "mp3" || f === "mpeg") return "mp3";
|
|
20
|
-
if (f === "wav") return "wav";
|
|
21
|
-
return "bin";
|
|
9
|
+
if (f === "opus" || f === "ogg") return ".ogg";
|
|
10
|
+
if (f === "mp3" || f === "mpeg") return ".mp3";
|
|
11
|
+
if (f === "wav") return ".wav";
|
|
12
|
+
return ".bin";
|
|
22
13
|
}
|
|
23
|
-
function
|
|
24
|
-
const
|
|
25
|
-
if (
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
return abs;
|
|
14
|
+
function mimeForFormat(format) {
|
|
15
|
+
const f = format.toLowerCase();
|
|
16
|
+
if (f === "opus" || f === "ogg") return "audio/ogg";
|
|
17
|
+
if (f === "mp3" || f === "mpeg") return "audio/mpeg";
|
|
18
|
+
if (f === "wav") return "audio/wav";
|
|
19
|
+
return "application/octet-stream";
|
|
30
20
|
}
|
|
31
|
-
async function persistOutboundTtsAudio(
|
|
32
|
-
const sessionSeg = sanitizeSessionSegment(sessionKey);
|
|
33
|
-
const dirAbs = resolve(agentHomeRoot, "tts", sessionSeg);
|
|
34
|
-
await mkdir(dirAbs, { recursive: true });
|
|
21
|
+
async function persistOutboundTtsAudio(audioBuffer, format) {
|
|
35
22
|
const ext = extForFormat(format);
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
fname
|
|
42
|
-
].join("/");
|
|
23
|
+
const saved = await saveMediaBuffer(audioBuffer, {
|
|
24
|
+
contentType: mimeForFormat(format),
|
|
25
|
+
bucket: "tts",
|
|
26
|
+
originalFilename: `assist${ext}`
|
|
27
|
+
});
|
|
43
28
|
log.debug({
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
bytes: audioBuffer.length
|
|
29
|
+
uri: saved.uri,
|
|
30
|
+
bytes: saved.size
|
|
47
31
|
}, "TTS audio persisted");
|
|
48
32
|
return {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
33
|
+
id: saved.id,
|
|
34
|
+
bucket: "tts",
|
|
35
|
+
type: "voice",
|
|
36
|
+
mimeType: saved.contentType,
|
|
37
|
+
name: saved.id,
|
|
38
|
+
size: saved.size,
|
|
39
|
+
uri: saved.uri,
|
|
40
|
+
path: saved.path
|
|
52
41
|
};
|
|
53
42
|
}
|
|
54
|
-
/**
|
|
55
|
-
* Resolve a stored relative path under `tts/`.
|
|
56
|
-
*/
|
|
57
|
-
function resolveSafeTtsFilePath(roots, relRaw) {
|
|
58
|
-
const rel = relRaw.replace(/\\/g, "/").replace(/^\/+/, "");
|
|
59
|
-
if (rel.includes("..")) return null;
|
|
60
|
-
if (rel.startsWith(`tts/`)) return resolveUnderRoot(roots.agentHome, rel, `tts/`);
|
|
61
|
-
return null;
|
|
62
|
-
}
|
|
63
43
|
//#endregion
|
|
64
|
-
export {
|
|
44
|
+
export { persistOutboundTtsAudio };
|
|
65
45
|
|
|
66
46
|
//# sourceMappingURL=outbound-tts-persist.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbound-tts-persist.js","names":[],"sources":["../../../../src/channels/attachments/outbound-tts-persist.ts"],"sourcesContent":["/**\n * Persist outbound TTS audio
|
|
1
|
+
{"version":3,"file":"outbound-tts-persist.js","names":[],"sources":["../../../../src/channels/attachments/outbound-tts-persist.ts"],"sourcesContent":["/**\n * Persist outbound TTS audio to `{stateDir}/media/tts/`.\n */\n\nimport { createLogger } from '../../utils/logger.js';\nimport { saveMediaBuffer } from '../../media/index.js';\nimport type { MediaRef } from '../../media/types.js';\n\nconst log = createLogger('OutboundTtsPersist');\n\nfunction extForFormat(format: string): string {\n const f = format.toLowerCase();\n if (f === 'opus' || f === 'ogg') return '.ogg';\n if (f === 'mp3' || f === 'mpeg') return '.mp3';\n if (f === 'wav') return '.wav';\n return '.bin';\n}\n\nfunction mimeForFormat(format: string): string {\n const f = format.toLowerCase();\n if (f === 'opus' || f === 'ogg') return 'audio/ogg';\n if (f === 'mp3' || f === 'mpeg') return 'audio/mpeg';\n if (f === 'wav') return 'audio/wav';\n return 'application/octet-stream';\n}\n\nexport async function persistOutboundTtsAudio(\n audioBuffer: Buffer,\n format: string,\n): Promise<MediaRef> {\n const ext = extForFormat(format);\n const saved = await saveMediaBuffer(audioBuffer, {\n contentType: mimeForFormat(format),\n bucket: 'tts',\n originalFilename: `assist${ext}`,\n });\n\n log.debug({ uri: saved.uri, bytes: saved.size }, 'TTS audio persisted');\n\n return {\n id: saved.id,\n bucket: 'tts',\n type: 'voice',\n mimeType: saved.contentType,\n name: saved.id,\n size: saved.size,\n uri: saved.uri,\n path: saved.path,\n };\n}\n"],"mappings":";;;;aAIqD;AAIrD,MAAM,MAAM,aAAa,qBAAqB;AAE9C,SAAS,aAAa,QAAwB;CAC5C,MAAM,IAAI,OAAO,aAAa;AAC9B,KAAI,MAAM,UAAU,MAAM,MAAO,QAAO;AACxC,KAAI,MAAM,SAAS,MAAM,OAAQ,QAAO;AACxC,KAAI,MAAM,MAAO,QAAO;AACxB,QAAO;;AAGT,SAAS,cAAc,QAAwB;CAC7C,MAAM,IAAI,OAAO,aAAa;AAC9B,KAAI,MAAM,UAAU,MAAM,MAAO,QAAO;AACxC,KAAI,MAAM,SAAS,MAAM,OAAQ,QAAO;AACxC,KAAI,MAAM,MAAO,QAAO;AACxB,QAAO;;AAGT,eAAsB,wBACpB,aACA,QACmB;CACnB,MAAM,MAAM,aAAa,OAAO;CAChC,MAAM,QAAQ,MAAM,gBAAgB,aAAa;EAC/C,aAAa,cAAc,OAAO;EAClC,QAAQ;EACR,kBAAkB,SAAS;EAC5B,CAAC;AAEF,KAAI,MAAM;EAAE,KAAK,MAAM;EAAK,OAAO,MAAM;EAAM,EAAE,sBAAsB;AAEvE,QAAO;EACL,IAAI,MAAM;EACV,QAAQ;EACR,MAAM;EACN,UAAU,MAAM;EAChB,MAAM,MAAM;EACZ,MAAM,MAAM;EACZ,KAAK,MAAM;EACX,MAAM,MAAM;EACb"}
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
* STT for webchat voice attachments: merge transcripts into user text and track inbound voice for TTS trigger.
|
|
3
3
|
*/
|
|
4
4
|
import type { STTConfig } from '../../voice/stt/types.js';
|
|
5
|
-
import { type InboundAttachmentInput, type
|
|
5
|
+
import { type InboundAttachmentInput, type MediaRef } from './inbound-persist.js';
|
|
6
6
|
export declare function mergeSttConfigFromAppConfig(stt: Partial<STTConfig> | undefined, toolsMedia?: {
|
|
7
7
|
models?: STTConfig['sharedModels'];
|
|
8
8
|
}): STTConfig;
|
|
9
|
-
export declare function isVoiceLikeAttachment(att: InboundAttachmentInput): boolean;
|
|
10
|
-
export declare function mergeVoiceTranscriptsIntoUserText(
|
|
9
|
+
export declare function isVoiceLikeAttachment(att: InboundAttachmentInput | MediaRef): boolean;
|
|
10
|
+
export declare function mergeVoiceTranscriptsIntoUserText(prepared: (InboundAttachmentInput | MediaRef)[] | undefined, userText: string, sttConfig: STTConfig, opts?: {
|
|
11
11
|
skipVoiceTranscription?: boolean;
|
|
12
12
|
}): Promise<{
|
|
13
13
|
text: string;
|
|
@@ -1,13 +1,9 @@
|
|
|
1
|
-
import { decodeInboundAttachmentBase64,
|
|
1
|
+
import { decodeInboundAttachmentBase64, readInboundAttachmentBuffer } from "./inbound-persist.js";
|
|
2
2
|
import { DEFAULT_STT_CONFIG } from "../../voice/stt/types.js";
|
|
3
3
|
import { transcribe } from "../../voice/stt/transcribe-core.js";
|
|
4
4
|
import { isSTTAvailable } from "../../voice/stt/availability.js";
|
|
5
5
|
import "../../voice/stt/index.js";
|
|
6
|
-
import { readFile } from "fs/promises";
|
|
7
6
|
//#region src/channels/attachments/voice-stt-webchat.ts
|
|
8
|
-
/**
|
|
9
|
-
* STT for webchat voice attachments: merge transcripts into user text and track inbound voice for TTS trigger.
|
|
10
|
-
*/
|
|
11
7
|
const STT_MAX_BYTES = 25 * 1024 * 1024;
|
|
12
8
|
function mergeSttProviders(base, patch) {
|
|
13
9
|
if (!base && !patch) return void 0;
|
|
@@ -35,7 +31,7 @@ function isVoiceLikeAttachment(att) {
|
|
|
35
31
|
if (att.type === "voice") return true;
|
|
36
32
|
return (att.mimeType?.toLowerCase() ?? "").startsWith("audio/");
|
|
37
33
|
}
|
|
38
|
-
async function mergeVoiceTranscriptsIntoUserText(
|
|
34
|
+
async function mergeVoiceTranscriptsIntoUserText(prepared, userText, sttConfig, opts) {
|
|
39
35
|
if (!prepared?.length) return {
|
|
40
36
|
text: userText,
|
|
41
37
|
inboundVoice: false,
|
|
@@ -60,14 +56,12 @@ async function mergeVoiceTranscriptsIntoUserText(attachmentRoots, prepared, user
|
|
|
60
56
|
for (const att of prepared) {
|
|
61
57
|
if (!isVoiceLikeAttachment(att)) continue;
|
|
62
58
|
let buf = null;
|
|
63
|
-
if (att.
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
} else if (att.data) try {
|
|
59
|
+
if ("uri" in att && att.uri?.trim()) try {
|
|
60
|
+
buf = await readInboundAttachmentBuffer(att.uri.trim());
|
|
61
|
+
} catch {
|
|
62
|
+
buf = null;
|
|
63
|
+
}
|
|
64
|
+
else if ("data" in att && att.data) try {
|
|
71
65
|
buf = decodeInboundAttachmentBase64(att.data);
|
|
72
66
|
} catch {
|
|
73
67
|
buf = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"voice-stt-webchat.js","names":[],"sources":["../../../../src/channels/attachments/voice-stt-webchat.ts"],"sourcesContent":["/**\n * STT for webchat voice attachments: merge transcripts into user text and track inbound voice for TTS trigger.\n */\n\nimport
|
|
1
|
+
{"version":3,"file":"voice-stt-webchat.js","names":[],"sources":["../../../../src/channels/attachments/voice-stt-webchat.ts"],"sourcesContent":["/**\n * STT for webchat voice attachments: merge transcripts into user text and track inbound voice for TTS trigger.\n */\n\nimport type { STTConfig } from '../../voice/stt/types.js';\nimport { DEFAULT_STT_CONFIG } from '../../voice/stt/types.js';\nimport { isSTTAvailable, transcribe } from '../../voice/stt/index.js';\nimport {\n decodeInboundAttachmentBase64,\n readInboundAttachmentBuffer,\n type InboundAttachmentInput,\n type MediaRef,\n} from './inbound-persist.js';\n\nconst STT_MAX_BYTES = 25 * 1024 * 1024;\n\nfunction mergeSttProviders(\n base: STTConfig['providers'],\n patch: STTConfig['providers'],\n): STTConfig['providers'] {\n if (!base && !patch) return undefined;\n const merged: Record<string, Record<string, unknown>> = { ...(base ?? {}) };\n for (const [id, slice] of Object.entries(patch ?? {})) {\n merged[id] = { ...(merged[id] ?? {}), ...slice };\n }\n return merged;\n}\n\nexport function mergeSttConfigFromAppConfig(\n stt: Partial<STTConfig> | undefined,\n toolsMedia?: { models?: STTConfig['sharedModels'] },\n): STTConfig {\n const p = stt ?? {};\n return {\n ...DEFAULT_STT_CONFIG,\n ...p,\n providers: mergeSttProviders(DEFAULT_STT_CONFIG.providers, p.providers),\n fallback: { ...DEFAULT_STT_CONFIG.fallback!, ...p.fallback },\n ...(toolsMedia?.models?.length ? { sharedModels: toolsMedia.models } : {}),\n };\n}\n\nexport function isVoiceLikeAttachment(att: InboundAttachmentInput | MediaRef): boolean {\n if (att.type === 'voice') return true;\n const m = att.mimeType?.toLowerCase() ?? '';\n return m.startsWith('audio/');\n}\n\nexport async function mergeVoiceTranscriptsIntoUserText(\n prepared: (InboundAttachmentInput | MediaRef)[] | undefined,\n userText: string,\n sttConfig: STTConfig,\n opts?: { skipVoiceTranscription?: boolean },\n): Promise<{ text: string; inboundVoice: boolean; voiceTranscripts: string[] }> {\n if (!prepared?.length) {\n return { text: userText, inboundVoice: false, voiceTranscripts: [] };\n }\n\n const hasVoice = prepared.some(isVoiceLikeAttachment);\n if (!hasVoice) {\n return { text: userText, inboundVoice: false, voiceTranscripts: [] };\n }\n\n if (opts?.skipVoiceTranscription === true) {\n return { text: userText, inboundVoice: true, voiceTranscripts: [] };\n }\n\n if (!isSTTAvailable(sttConfig)) {\n return { text: userText, inboundVoice: true, voiceTranscripts: [] };\n }\n\n const transcripts: string[] = [];\n\n for (const att of prepared) {\n if (!isVoiceLikeAttachment(att)) continue;\n\n let buf: Buffer | null = null;\n if ('uri' in att && att.uri?.trim()) {\n try {\n buf = await readInboundAttachmentBuffer(att.uri.trim());\n } catch {\n buf = null;\n }\n } else if ('data' in att && att.data) {\n try {\n buf = decodeInboundAttachmentBase64(att.data);\n } catch {\n buf = null;\n }\n }\n\n if (!buf || buf.length === 0) {\n transcripts.push('[Voice: empty]');\n continue;\n }\n if (buf.length > STT_MAX_BYTES) {\n transcripts.push('[Voice: file too large]');\n continue;\n }\n\n try {\n const r = await transcribe(buf, sttConfig, {\n language: sttConfig.provider === 'alibaba' ? 'zh' : undefined,\n });\n transcripts.push(r.text.trim() || '[Voice: no speech detected]');\n } catch {\n transcripts.push('[STT failed]');\n }\n }\n\n const merged = [transcripts.filter(Boolean).join('\\n'), userText.trim()].filter(Boolean).join('\\n\\n');\n return { text: merged || userText, inboundVoice: true, voiceTranscripts: transcripts };\n}\n"],"mappings":";;;;;;AAcA,MAAM,gBAAgB,KAAK,OAAO;AAElC,SAAS,kBACP,MACA,OACwB;AACxB,KAAI,CAAC,QAAQ,CAAC,MAAO,QAAO,KAAA;CAC5B,MAAM,SAAkD,EAAE,GAAI,QAAQ,EAAE,EAAG;AAC3E,MAAK,MAAM,CAAC,IAAI,UAAU,OAAO,QAAQ,SAAS,EAAE,CAAC,CACnD,QAAO,MAAM;EAAE,GAAI,OAAO,OAAO,EAAE;EAAG,GAAG;EAAO;AAElD,QAAO;;AAGT,SAAgB,4BACd,KACA,YACW;CACX,MAAM,IAAI,OAAO,EAAE;AACnB,QAAO;EACL,GAAG;EACH,GAAG;EACH,WAAW,kBAAkB,mBAAmB,WAAW,EAAE,UAAU;EACvE,UAAU;GAAE,GAAG,mBAAmB;GAAW,GAAG,EAAE;GAAU;EAC5D,GAAI,YAAY,QAAQ,SAAS,EAAE,cAAc,WAAW,QAAQ,GAAG,EAAE;EAC1E;;AAGH,SAAgB,sBAAsB,KAAiD;AACrF,KAAI,IAAI,SAAS,QAAS,QAAO;AAEjC,SADU,IAAI,UAAU,aAAa,IAAI,IAChC,WAAW,SAAS;;AAG/B,eAAsB,kCACpB,UACA,UACA,WACA,MAC8E;AAC9E,KAAI,CAAC,UAAU,OACb,QAAO;EAAE,MAAM;EAAU,cAAc;EAAO,kBAAkB,EAAE;EAAE;AAItE,KAAI,CADa,SAAS,KAAK,sBAClB,CACX,QAAO;EAAE,MAAM;EAAU,cAAc;EAAO,kBAAkB,EAAE;EAAE;AAGtE,KAAI,MAAM,2BAA2B,KACnC,QAAO;EAAE,MAAM;EAAU,cAAc;EAAM,kBAAkB,EAAE;EAAE;AAGrE,KAAI,CAAC,eAAe,UAAU,CAC5B,QAAO;EAAE,MAAM;EAAU,cAAc;EAAM,kBAAkB,EAAE;EAAE;CAGrE,MAAM,cAAwB,EAAE;AAEhC,MAAK,MAAM,OAAO,UAAU;AAC1B,MAAI,CAAC,sBAAsB,IAAI,CAAE;EAEjC,IAAI,MAAqB;AACzB,MAAI,SAAS,OAAO,IAAI,KAAK,MAAM,CACjC,KAAI;AACF,SAAM,MAAM,4BAA4B,IAAI,IAAI,MAAM,CAAC;UACjD;AACN,SAAM;;WAEC,UAAU,OAAO,IAAI,KAC9B,KAAI;AACF,SAAM,8BAA8B,IAAI,KAAK;UACvC;AACN,SAAM;;AAIV,MAAI,CAAC,OAAO,IAAI,WAAW,GAAG;AAC5B,eAAY,KAAK,iBAAiB;AAClC;;AAEF,MAAI,IAAI,SAAS,eAAe;AAC9B,eAAY,KAAK,0BAA0B;AAC3C;;AAGF,MAAI;GACF,MAAM,IAAI,MAAM,WAAW,KAAK,WAAW,EACzC,UAAU,UAAU,aAAa,YAAY,OAAO,KAAA,GACrD,CAAC;AACF,eAAY,KAAK,EAAE,KAAK,MAAM,IAAI,8BAA8B;UAC1D;AACN,eAAY,KAAK,eAAe;;;AAKpC,QAAO;EAAE,MADM,CAAC,YAAY,OAAO,QAAQ,CAAC,KAAK,KAAK,EAAE,SAAS,MAAM,CAAC,CAAC,OAAO,QAAQ,CAAC,KAAK,OACzE,IAAI;EAAU,cAAc;EAAM,kBAAkB;EAAa"}
|
|
@@ -13,6 +13,7 @@ export interface TelegramTopicConfig {
|
|
|
13
13
|
enabled?: boolean;
|
|
14
14
|
allowFrom?: Array<string | number>;
|
|
15
15
|
systemPrompt?: string;
|
|
16
|
+
agentId?: string;
|
|
16
17
|
groupPolicy?: GroupPolicy;
|
|
17
18
|
}
|
|
18
19
|
export type DmPolicy = 'pairing' | 'allowlist' | 'open' | 'disabled';
|
|
@@ -25,6 +26,7 @@ export interface TelegramGroupConfig {
|
|
|
25
26
|
enabled?: boolean;
|
|
26
27
|
allowFrom?: Array<string | number>;
|
|
27
28
|
systemPrompt?: string;
|
|
29
|
+
agentId?: string;
|
|
28
30
|
topics?: Record<string, TelegramTopicConfig>;
|
|
29
31
|
}
|
|
30
32
|
export interface TelegramAccountConfig {
|
|
@@ -41,9 +43,24 @@ export interface TelegramAccountConfig {
|
|
|
41
43
|
groups?: Record<string, TelegramGroupConfig>;
|
|
42
44
|
historyLimit?: number;
|
|
43
45
|
textChunkLimit?: number;
|
|
44
|
-
|
|
46
|
+
streaming?: {
|
|
47
|
+
mode?: 'off' | 'partial' | 'block';
|
|
48
|
+
preview?: {
|
|
49
|
+
toolProgress?: boolean;
|
|
50
|
+
};
|
|
51
|
+
block?: {
|
|
52
|
+
coalesce?: {
|
|
53
|
+
minChars?: number;
|
|
54
|
+
idleMs?: number;
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
};
|
|
45
58
|
proxy?: string;
|
|
46
59
|
apiRoot?: string;
|
|
60
|
+
pollingStallThresholdMs?: number;
|
|
61
|
+
reactionLevel?: 'off' | 'ack' | 'minimal' | 'extensive';
|
|
62
|
+
reactionNotifications?: 'off' | 'own' | 'all';
|
|
63
|
+
ackReaction?: string;
|
|
47
64
|
}
|
|
48
65
|
export interface TelegramChannelConfig {
|
|
49
66
|
enabled?: boolean;
|
|
@@ -54,7 +71,18 @@ export interface TelegramChannelConfig {
|
|
|
54
71
|
dmPolicy?: DmPolicy;
|
|
55
72
|
groupPolicy?: GroupPolicy;
|
|
56
73
|
replyToMode?: ReplyToMode;
|
|
57
|
-
|
|
74
|
+
streaming?: {
|
|
75
|
+
mode?: 'off' | 'partial' | 'block';
|
|
76
|
+
preview?: {
|
|
77
|
+
toolProgress?: boolean;
|
|
78
|
+
};
|
|
79
|
+
block?: {
|
|
80
|
+
coalesce?: {
|
|
81
|
+
minChars?: number;
|
|
82
|
+
idleMs?: number;
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
};
|
|
58
86
|
historyLimit?: number;
|
|
59
87
|
textChunkLimit?: number;
|
|
60
88
|
proxy?: string;
|