@xopcai/xopc 0.0.99 → 0.0.101
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/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 +191 -57
- 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/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/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/api/api.js +5 -3
- package/dist/extensions/weixin/src/api/api.js.map +1 -1
- package/dist/gateway/static/root/assets/{agents-4KTK-Ku7.js → agents-u8cmUfGQ.js} +2 -2
- package/dist/gateway/static/root/assets/{apps-page-DkgInY2w.js → apps-page-DF8m9cUE.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-preview-renderer-DBAxQXb-.js → attachment-preview-renderer-CybMSIoS.js} +2 -2
- package/dist/gateway/static/root/assets/{attachment-process-heavy-Csq3TrrP.js → attachment-process-heavy-RnGYy9bC.js} +2 -2
- package/dist/gateway/static/root/assets/channels-settings-BM3doRvi.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-ah4zWEIP.js +8 -0
- package/dist/gateway/static/root/assets/{cron-api-BRDli2Mm.js → cron-api-DgMuL_2b.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-BzEr5Za8.js → cron-page-COfUPKfq.js} +1 -1
- package/dist/gateway/static/root/assets/{dist-BsHh1vX0.js → dist-Dzy3Q0ZH.js} +1 -1
- package/dist/gateway/static/root/assets/{docx-preview-Dxj1EkCO.js → docx-preview-CajIk2FR.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-TWt5q_ef.js → extension-debug-page-kyxxefKh.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-C3kV8ZvZ.js → extension-page-BVbCBHoI.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-Csy9LNC6.js → extension-settings-page-t1lb2A7v.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-MXbM8HvY.js → field-primitives-6Vo1Yga4.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-CkoyqfRx.js → heartbeat-config-api-BF3psu4O.js} +1 -1
- package/dist/gateway/static/root/assets/index-DjNDHzwG.css +1 -0
- package/dist/gateway/static/root/assets/index-WAyKAilR.js +4840 -0
- package/dist/gateway/static/root/assets/{logs-page-B2vY41ph.js → logs-page-BTVPXcHV.js} +1 -1
- package/dist/gateway/static/root/assets/{note-detail-page-B7qE5pkO.js → note-detail-page-DqSAg_5Z.js} +1 -1
- package/dist/gateway/static/root/assets/{note-time-NBBReVR4.js → note-time-FSOjchic.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-page-CsWYaqYM.js → notes-page-DkRX7BE2.js} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-BPGY3SCT.js → sessions-page-Khdw35Zk.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-advanced-gate-DtA451RM.js → settings-advanced-gate-DspC8oEm.js} +2 -2
- package/dist/gateway/static/root/assets/{settings-form-section-DYR_SPlX.js → settings-form-section-DuxvUuur.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-BJUgZQzN.js → settings-page-DN8JBZ8F.js} +2 -2
- package/dist/gateway/static/root/assets/{share-preview-page-3u8VFmdo.js → share-preview-page-UNAcbiMb.js} +2 -2
- package/dist/gateway/static/root/assets/{skills-page-DuyhcH4U.js → skills-page-ByYT0fXZ.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-e2q2yjs4.js → theme-store-B6KXPHgK.js} +1 -1
- package/dist/gateway/static/root/assets/url-q28QhI7l.js +3 -0
- package/dist/gateway/static/root/assets/{utils-B4Vw3fnc.js → utils-DK_1H47k.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-BFY67Hhp.js → voice-api-key-field-BYN2EIMs.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-page.utils-yUJ5jexd.js → workflow-page.utils-Bi19YNTr.js} +1 -1
- package/dist/gateway/static/root/assets/{workflows-page-DIMHCpNt.js → workflows-page-DP57FEKW.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 +84 -4
- package/dist/src/agent/agent-manager.js.map +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/embedded/run-for-session.d.ts +1 -0
- package/dist/src/agent/embedded/run-for-session.js +2 -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/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/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/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/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 +54 -13
- 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/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 +53 -11
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/tools/factory.js +2 -0
- package/dist/src/agent/tools/factory.js.map +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/auth/credentials.js +0 -1
- package/dist/src/auth/credentials.js.map +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/plugin-types.d.ts +1 -0
- package/dist/src/channels/transport-types.d.ts +2 -2
- package/dist/src/cli/bin.d.ts +1 -0
- package/dist/src/cli/bin.js +1 -0
- package/dist/src/cli/bin.js.map +1 -1
- package/dist/src/cli/commands/channels.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/flow.js +2 -0
- package/dist/src/cli/commands/doctor/flow.js.map +1 -1
- package/dist/src/cli/commands/init.js +2 -57
- 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 +1 -2
- package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
- package/dist/src/config/index.js +2 -2
- 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/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/cron/executor.js +2 -2
- package/dist/src/gateway/hono/lib/config-payload.js +1 -1
- package/dist/src/gateway/hono/oauth-async.js +36 -3
- package/dist/src/gateway/hono/oauth-async.js.map +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/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/sessions.js +6 -0
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/workspace.js +1 -87
- package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
- package/dist/src/gateway/service/sessions-api.js +3 -0
- package/dist/src/gateway/service/sessions-api.js.map +1 -1
- package/dist/src/infra/http-proxy-env.d.ts +4 -0
- package/dist/src/infra/http-proxy-env.js +23 -0
- package/dist/src/infra/http-proxy-env.js.map +1 -0
- 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/session/session-title.js +6 -3
- package/dist/src/session/session-title.js.map +1 -1
- package/dist/src/session/store.js +1 -1
- 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/storage/sqlite/index.d.ts +4 -1
- package/dist/src/storage/sqlite/index.js +6 -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 +24 -28
- 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/package.json +3 -3
- package/dist/gateway/static/root/assets/channels-settings-BxW1Xio4.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-Cxm6AvQO.js +0 -8
- package/dist/gateway/static/root/assets/index-BJDmBCSl.css +0 -1
- package/dist/gateway/static/root/assets/index-Cbg5TS5m.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,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 { mkdir, writeFile } from "fs/promises";
|
|
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;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Channel exec-approval gate — plugins register handlers; agent runtime invokes before risky tools.
|
|
3
|
+
*/
|
|
4
|
+
import type { Config } from '../config/schema.js';
|
|
5
|
+
export interface ExecApprovalRequestPayload {
|
|
6
|
+
sessionKey: string;
|
|
7
|
+
channel: string;
|
|
8
|
+
chatId: string;
|
|
9
|
+
accountId?: string;
|
|
10
|
+
toolName: string;
|
|
11
|
+
summary: string;
|
|
12
|
+
details?: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
export interface ExecApprovalHandler {
|
|
15
|
+
isEnabled(cfg: Config, params: {
|
|
16
|
+
channel: string;
|
|
17
|
+
accountId?: string;
|
|
18
|
+
}): boolean;
|
|
19
|
+
requestApproval(cfg: Config, payload: ExecApprovalRequestPayload): Promise<boolean>;
|
|
20
|
+
}
|
|
21
|
+
export declare function registerChannelExecApprovalHandler(channelId: string, handler: ExecApprovalHandler): () => void;
|
|
22
|
+
export declare function maybeRequestChannelExecApproval(params: {
|
|
23
|
+
cfg: Config;
|
|
24
|
+
payload: ExecApprovalRequestPayload;
|
|
25
|
+
}): Promise<{
|
|
26
|
+
required: boolean;
|
|
27
|
+
approved: boolean;
|
|
28
|
+
reason?: string;
|
|
29
|
+
}>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
//#region src/channels/exec-approval-runtime.ts
|
|
2
|
+
const handlers = /* @__PURE__ */ new Map();
|
|
3
|
+
function registerChannelExecApprovalHandler(channelId, handler) {
|
|
4
|
+
handlers.set(channelId, handler);
|
|
5
|
+
return () => handlers.delete(channelId);
|
|
6
|
+
}
|
|
7
|
+
async function maybeRequestChannelExecApproval(params) {
|
|
8
|
+
const handler = handlers.get(params.payload.channel);
|
|
9
|
+
if (!handler) return {
|
|
10
|
+
required: false,
|
|
11
|
+
approved: true
|
|
12
|
+
};
|
|
13
|
+
if (!handler.isEnabled(params.cfg, {
|
|
14
|
+
channel: params.payload.channel,
|
|
15
|
+
accountId: params.payload.accountId
|
|
16
|
+
})) return {
|
|
17
|
+
required: false,
|
|
18
|
+
approved: true
|
|
19
|
+
};
|
|
20
|
+
const approved = await handler.requestApproval(params.cfg, params.payload);
|
|
21
|
+
return {
|
|
22
|
+
required: true,
|
|
23
|
+
approved,
|
|
24
|
+
reason: approved ? void 0 : "Exec approval denied or timed out"
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
export { maybeRequestChannelExecApproval, registerChannelExecApprovalHandler };
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=exec-approval-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec-approval-runtime.js","names":[],"sources":["../../../src/channels/exec-approval-runtime.ts"],"sourcesContent":["/**\n * Channel exec-approval gate — plugins register handlers; agent runtime invokes before risky tools.\n */\n\nimport type { Config } from '../config/schema.js';\n\nexport interface ExecApprovalRequestPayload {\n sessionKey: string;\n channel: string;\n chatId: string;\n accountId?: string;\n toolName: string;\n summary: string;\n details?: Record<string, unknown>;\n}\n\nexport interface ExecApprovalHandler {\n isEnabled(cfg: Config, params: { channel: string; accountId?: string }): boolean;\n requestApproval(cfg: Config, payload: ExecApprovalRequestPayload): Promise<boolean>;\n}\n\nconst handlers = new Map<string, ExecApprovalHandler>();\n\nexport function registerChannelExecApprovalHandler(channelId: string, handler: ExecApprovalHandler): () => void {\n handlers.set(channelId, handler);\n return () => handlers.delete(channelId);\n}\n\nexport async function maybeRequestChannelExecApproval(params: {\n cfg: Config;\n payload: ExecApprovalRequestPayload;\n}): Promise<{ required: boolean; approved: boolean; reason?: string }> {\n const handler = handlers.get(params.payload.channel);\n if (!handler) {\n return { required: false, approved: true };\n }\n if (!handler.isEnabled(params.cfg, { channel: params.payload.channel, accountId: params.payload.accountId })) {\n return { required: false, approved: true };\n }\n const approved = await handler.requestApproval(params.cfg, params.payload);\n return {\n required: true,\n approved,\n reason: approved ? undefined : 'Exec approval denied or timed out',\n };\n}\n"],"mappings":";AAqBA,MAAM,2BAAW,IAAI,KAAkC;AAEvD,SAAgB,mCAAmC,WAAmB,SAA0C;AAC9G,UAAS,IAAI,WAAW,QAAQ;AAChC,cAAa,SAAS,OAAO,UAAU;;AAGzC,eAAsB,gCAAgC,QAGiB;CACrE,MAAM,UAAU,SAAS,IAAI,OAAO,QAAQ,QAAQ;AACpD,KAAI,CAAC,QACH,QAAO;EAAE,UAAU;EAAO,UAAU;EAAM;AAE5C,KAAI,CAAC,QAAQ,UAAU,OAAO,KAAK;EAAE,SAAS,OAAO,QAAQ;EAAS,WAAW,OAAO,QAAQ;EAAW,CAAC,CAC1G,QAAO;EAAE,UAAU;EAAO,UAAU;EAAM;CAE5C,MAAM,WAAW,MAAM,QAAQ,gBAAgB,OAAO,KAAK,OAAO,QAAQ;AAC1E,QAAO;EACL,UAAU;EACV;EACA,QAAQ,WAAW,KAAA,IAAY;EAChC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { parseFrontmatterBlock } from "../markdown/frontmatter.js";
|
|
2
|
+
import { getChannelPlugin, getChannelRegistryVersion, listChannelPlugins, syncChannelPluginsFromManager } from "./plugins/registry.js";
|
|
2
3
|
import { compileAllowlist, evaluateAccess, hasBotMention, removeBotMention, resolveAllowlistMatch, resolveAllowlistMatchSimple, resolveDmPolicy, resolveGroupPolicy } from "./security.js";
|
|
3
4
|
import { CHAT_CHANNEL_ORDER, getChatChannelMeta, isChatChannelId, listChatChannelMeta } from "./registry.js";
|
|
4
5
|
import { findFenceSpanAt, isSafeFenceBreak, parseFenceSpans } from "../markdown/fences.js";
|
|
@@ -12,7 +13,6 @@ import "./plugins/bundled.js";
|
|
|
12
13
|
import { getChannelDock, getDockForBuiltinChannel } from "./dock.js";
|
|
13
14
|
import "./format.js";
|
|
14
15
|
import { MessagePipeline, createEnvelopeTimestampHandler, createFilterCommandsHandler, createFilterEmptyHandler, createFilterSelfHandler, createPipeline, standardPreflightHandlers, standardProcessHandlers } from "./pipeline.js";
|
|
15
|
-
import { getChannelPlugin, getChannelRegistryVersion, listChannelPlugins, syncChannelPluginsFromManager } from "./plugins/registry.js";
|
|
16
16
|
import { ChannelManager, createChannelManager } from "./manager.js";
|
|
17
17
|
import { collectSetupWizardChannels } from "./setup-wizard-discovery.js";
|
|
18
18
|
export { CHAT_CHANNEL_ORDER, ChannelManager, MessagePipeline, buildCodeSpanIndex, bundledChannelPlugins, chunkMarkdownIR, chunkText, collectSetupWizardChannels, compileAllowlist, convertMarkdownTables, createChannelManager, createEnvelopeTimestampHandler, createFilterCommandsHandler, createFilterEmptyHandler, createFilterSelfHandler, createInlineCodeState, createPipeline, evaluateAccess, findFenceSpanAt, getChannelDock, getChannelPlugin, getChannelRegistryVersion, getChatChannelMeta, getDockForBuiltinChannel, hasBotMention, isChatChannelId, isSafeFenceBreak, listChannelPlugins, listChatChannelMeta, markdownToIR, markdownToIRWithMeta, parseFenceSpans, parseFrontmatterBlock, removeBotMention, renderMarkdownWithMarkers, resolveAllowlistMatch, resolveAllowlistMatchSimple, resolveDmPolicy, resolveGroupPolicy, standardPreflightHandlers, standardProcessHandlers, syncChannelPluginsFromManager };
|
|
@@ -290,6 +290,7 @@ export interface ChannelPollResult {
|
|
|
290
290
|
}
|
|
291
291
|
export interface ChannelStreamHandle {
|
|
292
292
|
update: (text: string) => void;
|
|
293
|
+
updateReasoning?: (text: string) => void;
|
|
293
294
|
updateProgress?: (text: string, stage: string, detail?: string) => void;
|
|
294
295
|
setProgress?: (stage: string, detail?: string) => void;
|
|
295
296
|
end: () => Promise<void>;
|
|
@@ -14,8 +14,8 @@ export interface InboundMessage {
|
|
|
14
14
|
data?: string;
|
|
15
15
|
name?: string;
|
|
16
16
|
size?: number;
|
|
17
|
-
/**
|
|
18
|
-
|
|
17
|
+
/** Already persisted — pass-through by URI. */
|
|
18
|
+
uri?: string;
|
|
19
19
|
}>;
|
|
20
20
|
metadata?: Record<string, unknown>;
|
|
21
21
|
}
|
package/dist/src/cli/bin.d.ts
CHANGED
package/dist/src/cli/bin.js
CHANGED
package/dist/src/cli/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","names":["pkg.version"],"sources":["../../../src/cli/bin.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * CLI entry: log-level preset must run before any module that initializes the logger.\n * (Bundlers may reorder imports in `index.ts`; this file stays dependency-minimal.)\n */\nimport './cli-log-level-preset.js';\n\nimport pkg from '../../package.json' with { type: 'json' };\nimport { ensureXopcCliOnPath } from '../infra/path-env.js';\nimport { formatRootHelp } from './command-manifest.js';\n\nensureXopcCliOnPath();\n\nfunction printRootHelp(): void {\n console.log(formatRootHelp());\n}\n\nconst rootArgs = process.argv.slice(2).filter((arg) => arg !== '--');\nif (rootArgs.length === 1 && (rootArgs[0] === '--version' || rootArgs[0] === '-V')) {\n console.log(pkg.version);\n process.exit(0);\n}\nif (rootArgs.length === 1 && (rootArgs[0] === '--help' || rootArgs[0] === '-h' || rootArgs[0] === 'help')) {\n printRootHelp();\n process.exit(0);\n}\n\nconst filteredArgv = process.argv.filter((arg, index) => {\n if (arg !== '--') return true;\n return index < 2;\n});\n\nconst { tryRunGatewayRunFastPath } = await import('./gateway-run-fast-path.js');\nif (await tryRunGatewayRunFastPath(filteredArgv)) {\n process.exit(typeof process.exitCode === 'number' ? process.exitCode : 0);\n}\n\nconst { runCli } = await import('./index.js');\nawait runCli(process.argv);\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"bin.js","names":["pkg.version"],"sources":["../../../src/cli/bin.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * CLI entry: log-level preset must run before any module that initializes the logger.\n * (Bundlers may reorder imports in `index.ts`; this file stays dependency-minimal.)\n */\nimport './cli-log-level-preset.js';\nimport '../infra/http-proxy-env.js';\n\nimport pkg from '../../package.json' with { type: 'json' };\nimport { ensureXopcCliOnPath } from '../infra/path-env.js';\nimport { formatRootHelp } from './command-manifest.js';\n\nensureXopcCliOnPath();\n\nfunction printRootHelp(): void {\n console.log(formatRootHelp());\n}\n\nconst rootArgs = process.argv.slice(2).filter((arg) => arg !== '--');\nif (rootArgs.length === 1 && (rootArgs[0] === '--version' || rootArgs[0] === '-V')) {\n console.log(pkg.version);\n process.exit(0);\n}\nif (rootArgs.length === 1 && (rootArgs[0] === '--help' || rootArgs[0] === '-h' || rootArgs[0] === 'help')) {\n printRootHelp();\n process.exit(0);\n}\n\nconst filteredArgv = process.argv.filter((arg, index) => {\n if (arg !== '--') return true;\n return index < 2;\n});\n\nconst { tryRunGatewayRunFastPath } = await import('./gateway-run-fast-path.js');\nif (await tryRunGatewayRunFastPath(filteredArgv)) {\n process.exit(typeof process.exitCode === 'number' ? process.exitCode : 0);\n}\n\nconst { runCli } = await import('./index.js');\nawait runCli(process.argv);\n"],"mappings":";;;;;;;AAYA,qBAAqB;AAErB,SAAS,gBAAsB;AAC7B,SAAQ,IAAI,gBAAgB,CAAC;;AAG/B,MAAM,WAAW,QAAQ,KAAK,MAAM,EAAE,CAAC,QAAQ,QAAQ,QAAQ,KAAK;AACpE,IAAI,SAAS,WAAW,MAAM,SAAS,OAAO,eAAe,SAAS,OAAO,OAAO;AAClF,SAAQ,IAAIA,QAAY;AACxB,SAAQ,KAAK,EAAE;;AAEjB,IAAI,SAAS,WAAW,MAAM,SAAS,OAAO,YAAY,SAAS,OAAO,QAAQ,SAAS,OAAO,SAAS;AACzG,gBAAe;AACf,SAAQ,KAAK,EAAE;;AAGjB,MAAM,eAAe,QAAQ,KAAK,QAAQ,KAAK,UAAU;AACvD,KAAI,QAAQ,KAAM,QAAO;AACzB,QAAO,QAAQ;EACf;AAEF,MAAM,EAAE,6BAA6B,MAAM,OAAO;AAClD,IAAI,MAAM,yBAAyB,aAAa,CAC9C,SAAQ,KAAK,OAAO,QAAQ,aAAa,WAAW,QAAQ,WAAW,EAAE;AAG3E,MAAM,EAAE,WAAW,MAAM,OAAO;AAChC,MAAM,OAAO,QAAQ,KAAK"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { init_paths, resolveConfigPath } from "../../config/paths.js";
|
|
2
2
|
import { init_loader, loadConfig } from "../../config/loader.js";
|
|
3
|
+
import { getChannelPlugin, listChannelPlugins, syncChannelPluginsFromManager } from "../../channels/plugins/registry.js";
|
|
3
4
|
import { approveChannelPairingFromCli } from "../../channels/pairing/approve-cli.js";
|
|
4
5
|
import { bundledChannelPlugins } from "../../generated/bundled-channel-plugins.js";
|
|
5
|
-
import { getChannelPlugin, listChannelPlugins, syncChannelPluginsFromManager } from "../../channels/plugins/registry.js";
|
|
6
6
|
import { formatExamples, register } from "../registry.js";
|
|
7
7
|
import { colors } from "../utils/colors.js";
|
|
8
8
|
import { SETUP_EXIT } from "./setup-shared/types.js";
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { init_loader, loadConfig } from "../../../../config/loader.js";
|
|
2
|
+
import { inspectSchemaMigrationStatus } from "../../../../storage/sqlite/migrations/runner.js";
|
|
3
|
+
import { requireXopcDatabase } from "../../../../storage/sqlite/connection.js";
|
|
4
|
+
import { getSqliteDatabase } from "../../../../storage/sqlite/transaction.js";
|
|
5
|
+
import "../../../../storage/sqlite/index.js";
|
|
6
|
+
import { existsSync } from "node:fs";
|
|
7
|
+
//#region src/cli/commands/doctor/checks/database-schema.ts
|
|
8
|
+
init_loader();
|
|
9
|
+
async function checkDatabaseSchema(ctx) {
|
|
10
|
+
if (!existsSync(ctx.configPath)) return {
|
|
11
|
+
id: "database-schema",
|
|
12
|
+
label: "Database schema",
|
|
13
|
+
status: "skip",
|
|
14
|
+
message: "No config file; skipped.",
|
|
15
|
+
hints: []
|
|
16
|
+
};
|
|
17
|
+
try {
|
|
18
|
+
loadConfig(ctx.configPath);
|
|
19
|
+
} catch {
|
|
20
|
+
return {
|
|
21
|
+
id: "database-schema",
|
|
22
|
+
label: "Database schema",
|
|
23
|
+
status: "warn",
|
|
24
|
+
message: "Config invalid; database schema check skipped.",
|
|
25
|
+
hints: ["Fix xopc.json before running database checks."]
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
requireXopcDatabase();
|
|
29
|
+
const status = inspectSchemaMigrationStatus(getSqliteDatabase());
|
|
30
|
+
if (status.isTooNew) return {
|
|
31
|
+
id: "database-schema",
|
|
32
|
+
label: "Database schema",
|
|
33
|
+
status: "fail",
|
|
34
|
+
message: `Database schema v${status.dbVersion} is newer than this app (v${status.appVersion}).`,
|
|
35
|
+
hints: ["Upgrade xopc to a newer release that supports this database version.", "Or restore xopc.db from a backup taken before the upgrade."]
|
|
36
|
+
};
|
|
37
|
+
if (status.hasMigrationGap) return {
|
|
38
|
+
id: "database-schema",
|
|
39
|
+
label: "Database schema",
|
|
40
|
+
status: "fail",
|
|
41
|
+
message: `Database schema v${status.dbVersion} is missing migration to v${status.missingVersion}.`,
|
|
42
|
+
hints: [`This app supports schema v${status.appVersion} but is missing migration file ${String(status.missingVersion).padStart(3, "0")}_*.sql.`, "Upgrade xopc to a release that bundles the required migration."]
|
|
43
|
+
};
|
|
44
|
+
if (status.pendingVersions.length > 0) return {
|
|
45
|
+
id: "database-schema",
|
|
46
|
+
label: "Database schema",
|
|
47
|
+
status: "warn",
|
|
48
|
+
message: `Database schema v${status.dbVersion}; pending migration to v${status.appVersion} on next gateway start.`,
|
|
49
|
+
hints: [`Pending steps: v${status.pendingVersions.join(", v")}`, "Restart the gateway (or open the Electron app) to apply migrations automatically."]
|
|
50
|
+
};
|
|
51
|
+
return {
|
|
52
|
+
id: "database-schema",
|
|
53
|
+
label: "Database schema",
|
|
54
|
+
status: "pass",
|
|
55
|
+
message: `SQLite schema v${status.dbVersion} (current release v2).`,
|
|
56
|
+
hints: []
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//#endregion
|
|
60
|
+
export { checkDatabaseSchema };
|
|
61
|
+
|
|
62
|
+
//# sourceMappingURL=database-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-schema.js","names":[],"sources":["../../../../../../src/cli/commands/doctor/checks/database-schema.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\n\nimport { loadConfig } from '../../../../config/loader.js';\nimport {\n inspectSchemaMigrationStatus,\n XOPC_DB_SCHEMA_VERSION,\n} from '../../../../storage/sqlite/migrations/runner.js';\nimport {\n getSqliteDatabase,\n requireXopcDatabase,\n} from '../../../../storage/sqlite/index.js';\nimport type { CheckResult, DoctorContext } from '../types.js';\n\nexport async function checkDatabaseSchema(ctx: DoctorContext): Promise<CheckResult> {\n if (!existsSync(ctx.configPath)) {\n return {\n id: 'database-schema',\n label: 'Database schema',\n status: 'skip',\n message: 'No config file; skipped.',\n hints: [],\n };\n }\n\n try {\n loadConfig(ctx.configPath);\n } catch {\n return {\n id: 'database-schema',\n label: 'Database schema',\n status: 'warn',\n message: 'Config invalid; database schema check skipped.',\n hints: ['Fix xopc.json before running database checks.'],\n };\n }\n\n requireXopcDatabase();\n const status = inspectSchemaMigrationStatus(getSqliteDatabase());\n\n if (status.isTooNew) {\n return {\n id: 'database-schema',\n label: 'Database schema',\n status: 'fail',\n message: `Database schema v${status.dbVersion} is newer than this app (v${status.appVersion}).`,\n hints: [\n 'Upgrade xopc to a newer release that supports this database version.',\n 'Or restore xopc.db from a backup taken before the upgrade.',\n ],\n };\n }\n\n if (status.hasMigrationGap) {\n return {\n id: 'database-schema',\n label: 'Database schema',\n status: 'fail',\n message: `Database schema v${status.dbVersion} is missing migration to v${status.missingVersion}.`,\n hints: [\n `This app supports schema v${status.appVersion} but is missing migration file ${String(status.missingVersion).padStart(3, '0')}_*.sql.`,\n 'Upgrade xopc to a release that bundles the required migration.',\n ],\n };\n }\n\n if (status.pendingVersions.length > 0) {\n return {\n id: 'database-schema',\n label: 'Database schema',\n status: 'warn',\n message: `Database schema v${status.dbVersion}; pending migration to v${status.appVersion} on next gateway start.`,\n hints: [\n `Pending steps: v${status.pendingVersions.join(', v')}`,\n 'Restart the gateway (or open the Electron app) to apply migrations automatically.',\n ],\n };\n }\n\n return {\n id: 'database-schema',\n label: 'Database schema',\n status: 'pass',\n message: `SQLite schema v${status.dbVersion} (current release v${XOPC_DB_SCHEMA_VERSION}).`,\n hints: [],\n };\n}\n"],"mappings":";;;;;;;aAE0D;AAW1D,eAAsB,oBAAoB,KAA0C;AAClF,KAAI,CAAC,WAAW,IAAI,WAAW,CAC7B,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;AAGH,KAAI;AACF,aAAW,IAAI,WAAW;SACpB;AACN,SAAO;GACL,IAAI;GACJ,OAAO;GACP,QAAQ;GACR,SAAS;GACT,OAAO,CAAC,gDAAgD;GACzD;;AAGH,sBAAqB;CACrB,MAAM,SAAS,6BAA6B,mBAAmB,CAAC;AAEhE,KAAI,OAAO,SACT,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS,oBAAoB,OAAO,UAAU,4BAA4B,OAAO,WAAW;EAC5F,OAAO,CACL,wEACA,6DACD;EACF;AAGH,KAAI,OAAO,gBACT,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS,oBAAoB,OAAO,UAAU,4BAA4B,OAAO,eAAe;EAChG,OAAO,CACL,6BAA6B,OAAO,WAAW,iCAAiC,OAAO,OAAO,eAAe,CAAC,SAAS,GAAG,IAAI,CAAC,UAC/H,iEACD;EACF;AAGH,KAAI,OAAO,gBAAgB,SAAS,EAClC,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS,oBAAoB,OAAO,UAAU,0BAA0B,OAAO,WAAW;EAC1F,OAAO,CACL,mBAAmB,OAAO,gBAAgB,KAAK,MAAM,IACrD,oFACD;EACF;AAGH,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS,kBAAkB,OAAO,UAAU;EAC5C,OAAO,EAAE;EACV"}
|
|
@@ -2,6 +2,7 @@ import { printJsonResults, printResults } from "./format.js";
|
|
|
2
2
|
import { checkNodeVersion } from "./checks/node-version.js";
|
|
3
3
|
import { checkConfigHealth } from "./checks/config-health.js";
|
|
4
4
|
import { checkStateIntegrity } from "./checks/state-integrity.js";
|
|
5
|
+
import { checkDatabaseSchema } from "./checks/database-schema.js";
|
|
5
6
|
import { checkProviderAuth } from "./checks/provider-auth.js";
|
|
6
7
|
import { checkChannelConfig } from "./checks/channel-config.js";
|
|
7
8
|
import { checkChannelPairingPending } from "./checks/channel-pairing-pending.js";
|
|
@@ -19,6 +20,7 @@ const DOCTOR_CHECKS = [
|
|
|
19
20
|
checkNodeVersion,
|
|
20
21
|
checkConfigHealth,
|
|
21
22
|
checkStateIntegrity,
|
|
23
|
+
checkDatabaseSchema,
|
|
22
24
|
checkProviderAuth,
|
|
23
25
|
checkChannelConfig,
|
|
24
26
|
checkChannelPairingPending,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow.js","names":[],"sources":["../../../../../src/cli/commands/doctor/flow.ts"],"sourcesContent":["import { printJsonResults, printResults } from './format.js';\nimport type { CheckResult, DoctorCheck, DoctorContext } from './types.js';\nimport { checkNodeVersion } from './checks/node-version.js';\nimport { checkConfigHealth } from './checks/config-health.js';\nimport { checkStateIntegrity } from './checks/state-integrity.js';\nimport { checkProviderAuth } from './checks/provider-auth.js';\nimport { checkChannelConfig } from './checks/channel-config.js';\nimport { checkChannelPairingPending } from './checks/channel-pairing-pending.js';\nimport { checkGatewayHealth } from './checks/gateway-health.js';\nimport { checkSessionIntegrity } from './checks/session-integrity.js';\nimport { checkGatewayService } from './checks/gateway-service.js';\nimport { checkSecurityAudit } from './checks/security-audit.js';\nimport { checkWorkspaceStatus } from './checks/workspace-status.js';\nimport { checkCronHealth } from './checks/cron-health.js';\nimport { checkVersionUpdate } from './checks/version-check.js';\nimport { checkChannelPlugins } from './checks/channel-plugins.js';\n\nconst DOCTOR_CHECKS: DoctorCheck[] = [\n checkVersionUpdate,\n checkNodeVersion,\n checkConfigHealth,\n checkStateIntegrity,\n checkProviderAuth,\n checkChannelConfig,\n checkChannelPairingPending,\n checkSecurityAudit,\n checkWorkspaceStatus,\n checkGatewayService,\n checkGatewayHealth,\n checkCronHealth,\n checkSessionIntegrity,\n];\n\n/**\n * Headless data collection — used by both CLI and gateway API.\n */\nexport async function collectDoctorResults(ctx: DoctorContext): Promise<CheckResult[]> {\n if (ctx.options.security) {\n return [await checkSecurityAudit(ctx)];\n }\n\n const results: CheckResult[] = [];\n\n for (const check of DOCTOR_CHECKS) {\n results.push(await check(ctx));\n }\n\n results.push(...(await checkChannelPlugins(ctx)));\n\n return results;\n}\n\n/**\n * CLI entry point — collect and print.\n */\nexport async function runDoctor(ctx: DoctorContext): Promise<CheckResult[]> {\n const results = await collectDoctorResults(ctx);\n\n if (ctx.options.json) {\n printJsonResults(results);\n } else {\n printResults(results, { security: ctx.options.security });\n }\n\n return results;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"flow.js","names":[],"sources":["../../../../../src/cli/commands/doctor/flow.ts"],"sourcesContent":["import { printJsonResults, printResults } from './format.js';\nimport type { CheckResult, DoctorCheck, DoctorContext } from './types.js';\nimport { checkNodeVersion } from './checks/node-version.js';\nimport { checkConfigHealth } from './checks/config-health.js';\nimport { checkStateIntegrity } from './checks/state-integrity.js';\nimport { checkDatabaseSchema } from './checks/database-schema.js';\nimport { checkProviderAuth } from './checks/provider-auth.js';\nimport { checkChannelConfig } from './checks/channel-config.js';\nimport { checkChannelPairingPending } from './checks/channel-pairing-pending.js';\nimport { checkGatewayHealth } from './checks/gateway-health.js';\nimport { checkSessionIntegrity } from './checks/session-integrity.js';\nimport { checkGatewayService } from './checks/gateway-service.js';\nimport { checkSecurityAudit } from './checks/security-audit.js';\nimport { checkWorkspaceStatus } from './checks/workspace-status.js';\nimport { checkCronHealth } from './checks/cron-health.js';\nimport { checkVersionUpdate } from './checks/version-check.js';\nimport { checkChannelPlugins } from './checks/channel-plugins.js';\n\nconst DOCTOR_CHECKS: DoctorCheck[] = [\n checkVersionUpdate,\n checkNodeVersion,\n checkConfigHealth,\n checkStateIntegrity,\n checkDatabaseSchema,\n checkProviderAuth,\n checkChannelConfig,\n checkChannelPairingPending,\n checkSecurityAudit,\n checkWorkspaceStatus,\n checkGatewayService,\n checkGatewayHealth,\n checkCronHealth,\n checkSessionIntegrity,\n];\n\n/**\n * Headless data collection — used by both CLI and gateway API.\n */\nexport async function collectDoctorResults(ctx: DoctorContext): Promise<CheckResult[]> {\n if (ctx.options.security) {\n return [await checkSecurityAudit(ctx)];\n }\n\n const results: CheckResult[] = [];\n\n for (const check of DOCTOR_CHECKS) {\n results.push(await check(ctx));\n }\n\n results.push(...(await checkChannelPlugins(ctx)));\n\n return results;\n}\n\n/**\n * CLI entry point — collect and print.\n */\nexport async function runDoctor(ctx: DoctorContext): Promise<CheckResult[]> {\n const results = await collectDoctorResults(ctx);\n\n if (ctx.options.json) {\n printJsonResults(results);\n } else {\n printResults(results, { security: ctx.options.security });\n }\n\n return results;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,MAAM,gBAA+B;CACnC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;AAKD,eAAsB,qBAAqB,KAA4C;AACrF,KAAI,IAAI,QAAQ,SACd,QAAO,CAAC,MAAM,mBAAmB,IAAI,CAAC;CAGxC,MAAM,UAAyB,EAAE;AAEjC,MAAK,MAAM,SAAS,cAClB,SAAQ,KAAK,MAAM,MAAM,IAAI,CAAC;AAGhC,SAAQ,KAAK,GAAI,MAAM,oBAAoB,IAAI,CAAE;AAEjD,QAAO;;;;;AAMT,eAAsB,UAAU,KAA4C;CAC1E,MAAM,UAAU,MAAM,qBAAqB,IAAI;AAE/C,KAAI,IAAI,QAAQ,KACd,kBAAiB,QAAQ;KAEzB,cAAa,SAAS,EAAE,UAAU,IAAI,QAAQ,UAAU,CAAC;AAG3D,QAAO"}
|
|
@@ -2,8 +2,7 @@ import { resolveStateDir } from "../../config/paths-state.js";
|
|
|
2
2
|
import { resolveAgentWorkspaceDir } from "../../agent/agent-scope.js";
|
|
3
3
|
import { createLogger } from "../../utils/logger/index.js";
|
|
4
4
|
import { init_logger } from "../../utils/logger.js";
|
|
5
|
-
import { WORKSPACE_FILES, init_paths, resolveAgentDir, resolveAgentHomeDir,
|
|
6
|
-
import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
|
|
5
|
+
import { WORKSPACE_FILES, init_paths, resolveAgentDir, resolveAgentHomeDir, resolveAgentProfileDir, resolveConfigPath } from "../../config/paths.js";
|
|
7
6
|
import { init_loader, loadConfig, saveConfig } from "../../config/loader.js";
|
|
8
7
|
import { formatExamples, register } from "../registry.js";
|
|
9
8
|
import { join } from "path";
|
|
@@ -11,7 +10,6 @@ import { existsSync } from "fs";
|
|
|
11
10
|
import { mkdir, writeFile } from "fs/promises";
|
|
12
11
|
import { Command } from "commander";
|
|
13
12
|
//#region src/cli/commands/init.ts
|
|
14
|
-
init_write_file_atomic();
|
|
15
13
|
init_logger();
|
|
16
14
|
init_paths();
|
|
17
15
|
init_loader();
|
|
@@ -34,59 +32,16 @@ async function initCommand(options = {}) {
|
|
|
34
32
|
}
|
|
35
33
|
}
|
|
36
34
|
await mkdir(stateDir, { recursive: true });
|
|
37
|
-
await mkdir(resolveCredentialsDir(), { recursive: true });
|
|
38
|
-
await mkdir(join(resolveCredentialsDir(), "oauth"), { recursive: true });
|
|
39
|
-
await mkdir(resolveExtensionsDir(), { recursive: true });
|
|
40
|
-
await mkdir(resolveSkillsDir(), { recursive: true });
|
|
41
|
-
await mkdir(resolveCronDir(), { recursive: true });
|
|
42
|
-
await mkdir(join(resolveCronDir(), "logs"), { recursive: true });
|
|
43
|
-
await mkdir(resolveLogsDir(), { recursive: true });
|
|
44
|
-
await mkdir(resolveBinDir(), { recursive: true });
|
|
45
|
-
await mkdir(resolveToolsDir(), { recursive: true });
|
|
46
35
|
const configPath = resolveConfigPath();
|
|
47
36
|
const cfg = loadConfig(configPath);
|
|
48
37
|
await mkdir(resolveAgentHomeDir(cfg, agentId), { recursive: true });
|
|
49
38
|
await mkdir(resolveAgentProfileDir(cfg, agentId), { recursive: true });
|
|
50
39
|
await mkdir(resolveAgentDir(cfg, agentId), { recursive: true });
|
|
51
|
-
await mkdir(
|
|
52
|
-
const wsRoot = resolveAgentWorkspaceDir(cfg, agentId);
|
|
53
|
-
await mkdir(wsRoot, { recursive: true });
|
|
54
|
-
await mkdir(resolveWorkspaceStateDir(cfg, agentId), { recursive: true });
|
|
55
|
-
await mkdir(join(wsRoot, "memory"), { recursive: true });
|
|
56
|
-
await mkdir(resolveInboxDir(cfg, agentId), { recursive: true });
|
|
57
|
-
await mkdir(resolveInboxPendingDir(cfg, agentId), { recursive: true });
|
|
58
|
-
await mkdir(resolveInboxProcessedDir(cfg, agentId), { recursive: true });
|
|
40
|
+
await mkdir(resolveAgentWorkspaceDir(cfg, agentId), { recursive: true });
|
|
59
41
|
if (!existsSync(configPath) || options.force) {
|
|
60
42
|
await saveConfig(cfg, configPath);
|
|
61
43
|
log.info({ configPath }, "Created initial configuration");
|
|
62
44
|
}
|
|
63
|
-
const agentMetadataPath = resolveAgentMetadataPath(cfg, agentId);
|
|
64
|
-
if (!existsSync(agentMetadataPath) || options.force) {
|
|
65
|
-
const agentMetadata = {
|
|
66
|
-
version: 1,
|
|
67
|
-
id: agentId,
|
|
68
|
-
name: agentId === "main" ? "Main Agent" : `Agent ${agentId}`,
|
|
69
|
-
description: agentId === "main" ? "Primary agent for daily tasks" : `Specialized agent for ${agentId}`,
|
|
70
|
-
model: "anthropic/claude-sonnet-4-5",
|
|
71
|
-
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
72
|
-
lastActiveAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
73
|
-
config: {
|
|
74
|
-
maxTokens: 8192,
|
|
75
|
-
temperature: .7,
|
|
76
|
-
compaction: {
|
|
77
|
-
enabled: true,
|
|
78
|
-
mode: "default"
|
|
79
|
-
}
|
|
80
|
-
},
|
|
81
|
-
channels: ["gateway"],
|
|
82
|
-
tags: agentId === "main" ? ["personal", "primary"] : []
|
|
83
|
-
};
|
|
84
|
-
await writeTextAtomic(agentMetadataPath, JSON.stringify(agentMetadata, null, 2));
|
|
85
|
-
log.info({
|
|
86
|
-
agentId,
|
|
87
|
-
agentMetadataPath
|
|
88
|
-
}, "Created agent metadata");
|
|
89
|
-
}
|
|
90
45
|
if (!options.skipWorkspace) await createWorkspaceFiles(cfg, agentId);
|
|
91
46
|
log.info({
|
|
92
47
|
stateDir,
|
|
@@ -263,16 +218,6 @@ _Review and update this periodically from daily memory files._
|
|
|
263
218
|
`, "utf-8");
|
|
264
219
|
log.info({ path: memoryPath }, "Created MEMORY.md");
|
|
265
220
|
}
|
|
266
|
-
const workspaceStatePath = resolveWorkspaceStatePath(cfg, agentId);
|
|
267
|
-
if (!existsSync(workspaceStatePath)) {
|
|
268
|
-
const workspaceState = {
|
|
269
|
-
version: 1,
|
|
270
|
-
agentId,
|
|
271
|
-
profileMarkdownSeededAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
272
|
-
};
|
|
273
|
-
await writeTextAtomic(workspaceStatePath, JSON.stringify(workspaceState, null, 2));
|
|
274
|
-
log.info({ path: workspaceStatePath }, "Created workspace state");
|
|
275
|
-
}
|
|
276
221
|
}
|
|
277
222
|
function createInitCommand(_ctx) {
|
|
278
223
|
return new Command("init").description("Initialize xopc state directories, config, and agent workspace").addHelpText("after", formatExamples([
|