@xopcai/xopc 0.0.29 → 0.0.31
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/extensions/telegram/src/adapters/config-surface.js +3 -1
- package/dist/extensions/telegram/src/adapters/config-surface.js.map +1 -1
- package/dist/extensions/telegram/src/adapters/onboard-cli.js +23 -21
- package/dist/extensions/telegram/src/adapters/onboard-cli.js.map +1 -1
- package/dist/extensions/telegram/src/adapters/setup-wizard.js +3 -4
- package/dist/extensions/telegram/src/adapters/setup-wizard.js.map +1 -1
- package/dist/extensions/telegram/src/config-schema.d.ts +0 -1
- package/dist/extensions/telegram/src/config-schema.js +17 -4
- package/dist/extensions/telegram/src/config-schema.js.map +1 -1
- package/dist/extensions/telegram/src/plugin.js +4 -17
- package/dist/extensions/telegram/src/plugin.js.map +1 -1
- package/dist/extensions/telegram/xopc.extension.json +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/process-message.js +1 -1
- package/dist/gateway/static/root/assets/agents-3u63Fw2Y.js +216 -0
- package/dist/gateway/static/root/assets/agents-3u63Fw2Y.js.map +1 -0
- package/dist/gateway/static/root/assets/{apps-page-Bmq19MS-.js → apps-page-CWegY6Kp.js} +2 -2
- package/dist/gateway/static/root/assets/{apps-page-Bmq19MS-.js.map → apps-page-CWegY6Kp.js.map} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-CiyeXcTK.js +9 -0
- package/dist/gateway/static/root/assets/channels-settings-CiyeXcTK.js.map +1 -0
- package/dist/gateway/static/root/assets/cron-api-_j_79Zf5.js +3 -0
- package/dist/gateway/static/root/assets/cron-api-_j_79Zf5.js.map +1 -0
- package/dist/gateway/static/root/assets/cron-page-S86YNTtI.js +2 -0
- package/dist/gateway/static/root/assets/cron-page-S86YNTtI.js.map +1 -0
- package/dist/gateway/static/root/assets/dist-D0jxbvuz.js +2 -0
- package/dist/gateway/static/root/assets/{dist--p2HQ2QF.js.map → dist-D0jxbvuz.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DwHCB_6T.js → extension-debug-page-DB630cW8.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-debug-page-DwHCB_6T.js.map → extension-debug-page-DB630cW8.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-BsYwQIex.js → extension-page-CnoPUBul.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-page-BsYwQIex.js.map → extension-page-CnoPUBul.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-nsisEgjB.js → extension-settings-page-BsiOkvBe.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-settings-page-nsisEgjB.js.map → extension-settings-page-BsiOkvBe.js.map} +1 -1
- package/dist/gateway/static/root/assets/{index-CR8zUHGR.js → index-DHLmAIQl.js} +63 -63
- package/dist/gateway/static/root/assets/{index-CR8zUHGR.js.map → index-DHLmAIQl.js.map} +1 -1
- package/dist/gateway/static/root/assets/index-DoPwy4aU.css +1 -0
- package/dist/gateway/static/root/assets/logs-page-Bndhenn2.js +2 -0
- package/dist/gateway/static/root/assets/logs-page-Bndhenn2.js.map +1 -0
- package/dist/gateway/static/root/assets/sessions-page-Q201-_lP.js +2 -0
- package/dist/gateway/static/root/assets/{sessions-page-Be5kIGl_.js.map → sessions-page-Q201-_lP.js.map} +1 -1
- package/dist/gateway/static/root/assets/settings-page-Cw75fpc6.js +2 -0
- package/dist/gateway/static/root/assets/settings-page-Cw75fpc6.js.map +1 -0
- package/dist/gateway/static/root/assets/skills-page-CVwEzD_J.js +3 -0
- package/dist/gateway/static/root/assets/skills-page-CVwEzD_J.js.map +1 -0
- package/dist/gateway/static/root/index.html +2 -2
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +5 -7
- package/dist/src/agent/agent-manager.js +21 -19
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/ipc/inbox.js +4 -2
- package/dist/src/agent/ipc/inbox.js.map +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/orchestration/agent-orchestrator.js +1 -1
- package/dist/src/agent/prompt/service-prompt-builder.js +0 -2
- package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
- package/dist/src/agent/prompt/system-prompt.d.ts +0 -2
- package/dist/src/agent/prompt/system-prompt.js +3 -17
- package/dist/src/agent/prompt/system-prompt.js.map +1 -1
- package/dist/src/agent/service/btw-query.d.ts +16 -0
- package/dist/src/agent/service/btw-query.js +88 -0
- package/dist/src/agent/service/btw-query.js.map +1 -0
- package/dist/src/agent/service/build-direct-message-content.d.ts +30 -0
- package/dist/src/agent/service/build-direct-message-content.js +75 -0
- package/dist/src/agent/service/build-direct-message-content.js.map +1 -0
- package/dist/src/agent/service/parse-outbound-session-key.d.ts +8 -0
- package/dist/src/agent/service/parse-outbound-session-key.js +41 -0
- package/dist/src/agent/service/parse-outbound-session-key.js.map +1 -0
- package/dist/src/agent/service/process-direct-one-shot.d.ts +34 -0
- package/dist/src/agent/service/process-direct-one-shot.js +67 -0
- package/dist/src/agent/service/process-direct-one-shot.js.map +1 -0
- package/dist/src/agent/service/process-direct-streaming.js +12 -1
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service/reconcile-dreaming-cron.d.ts +6 -0
- package/dist/src/agent/service/reconcile-dreaming-cron.js +70 -0
- package/dist/src/agent/service/reconcile-dreaming-cron.js.map +1 -0
- package/dist/src/agent/service/session-context-report.d.ts +19 -0
- package/dist/src/agent/service/session-context-report.js +47 -0
- package/dist/src/agent/service/session-context-report.js.map +1 -0
- package/dist/src/agent/service/webchat-tts.d.ts +28 -0
- package/dist/src/agent/service/webchat-tts.js +73 -0
- package/dist/src/agent/service/webchat-tts.js.map +1 -0
- package/dist/src/agent/service.d.ts +8 -12
- package/dist/src/agent/service.js +74 -379
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/skills/config.js +4 -3
- package/dist/src/agent/skills/config.js.map +1 -1
- package/dist/src/agent/skills/format-skills-prompt.d.ts +0 -2
- package/dist/src/agent/skills/format-skills-prompt.js +3 -24
- package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
- package/dist/src/agent/skills/hub-lock.js +4 -5
- package/dist/src/agent/skills/hub-lock.js.map +1 -1
- package/dist/src/agent/skills/index.js +9 -21
- package/dist/src/agent/skills/index.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapter.types.d.ts +17 -0
- package/dist/src/agent/skills/marketplace/adapter.types.js +1 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.d.ts +2 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +292 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/ecosystem-client.d.ts +73 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/ecosystem-client.js +200 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/ecosystem-client.js.map +1 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/registry-client.d.ts +137 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/registry-client.js +217 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/registry-client.js.map +1 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/skillhub-fetch-cache.d.ts +12 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/skillhub-fetch-cache.js +90 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/skillhub-fetch-cache.js.map +1 -0
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.d.ts +2 -0
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +35 -0
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -0
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +124 -0
- package/dist/src/agent/skills/{skills-store-client.js → marketplace/adapters/store/store-api-client.js} +4 -3
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -0
- package/dist/src/agent/skills/marketplace/resolve-adapter.d.ts +6 -0
- package/dist/src/agent/skills/marketplace/resolve-adapter.js +26 -0
- package/dist/src/agent/skills/marketplace/resolve-adapter.js.map +1 -0
- package/dist/src/agent/skills/parse-skill-metadata.d.ts +5 -0
- package/dist/src/agent/skills/parse-skill-metadata.js +27 -0
- package/dist/src/agent/skills/parse-skill-metadata.js.map +1 -0
- package/dist/src/agent/skills/skill-markdown-preview-from-raw.d.ts +6 -0
- package/dist/src/agent/skills/skill-markdown-preview-from-raw.js +64 -0
- package/dist/src/agent/skills/skill-markdown-preview-from-raw.js.map +1 -0
- package/dist/src/agent/skills/skill-view-path.d.ts +17 -1
- package/dist/src/agent/skills/skill-view-path.js +66 -3
- package/dist/src/agent/skills/skill-view-path.js.map +1 -1
- package/dist/src/agent/skills/skills-marketplace.d.ts +21 -0
- package/dist/src/agent/skills/skills-marketplace.js +18 -0
- package/dist/src/agent/skills/skills-marketplace.js.map +1 -0
- package/dist/src/agent/skills/test-framework.d.ts +0 -1
- package/dist/src/agent/skills/test-framework.js +2 -20
- package/dist/src/agent/skills/test-framework.js.map +1 -1
- package/dist/src/agent/skills/types.d.ts +12 -6
- package/dist/src/agent/tools/dreaming-tool.js +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +2 -2
- package/dist/src/auth/credentials.js +8 -6
- package/dist/src/auth/credentials.js.map +1 -1
- package/dist/src/auth/profiles/store.js +5 -3
- package/dist/src/auth/profiles/store.js.map +1 -1
- package/dist/src/channels/manager.js +1 -1
- package/dist/src/channels/outbound/persist-store.js +4 -4
- package/dist/src/channels/outbound/persist-store.js.map +1 -1
- package/dist/src/cli/commands/config.js +8 -6
- package/dist/src/cli/commands/config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js +3 -4
- package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
- package/dist/src/cli/commands/init.js +4 -2
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/config/loader.js +3 -1
- package/dist/src/config/loader.js.map +1 -1
- package/dist/src/config/models-json.js +4 -5
- package/dist/src/config/models-json.js.map +1 -1
- package/dist/src/config/schema.d.ts +12 -4
- package/dist/src/config/schema.js +31 -5
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/cron/persistence.d.ts +1 -3
- package/dist/src/cron/persistence.js +6 -17
- package/dist/src/cron/persistence.js.map +1 -1
- package/dist/src/cron/validation.js +1 -1
- package/dist/src/cron/validation.js.map +1 -1
- package/dist/src/extensions/activation-context.js +0 -1
- package/dist/src/extensions/activation-context.js.map +1 -1
- package/dist/src/extensions/lockfile.js +4 -2
- package/dist/src/extensions/lockfile.js.map +1 -1
- package/dist/src/gateway/auth.d.ts +0 -9
- package/dist/src/gateway/auth.js +1 -12
- package/dist/src/gateway/auth.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +1 -1
- package/dist/src/gateway/hono/lib/extension-store.js +4 -4
- package/dist/src/gateway/hono/lib/extension-store.js.map +1 -1
- package/dist/src/gateway/hono/routes/channels.js +5 -3
- package/dist/src/gateway/hono/routes/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/commands-skills.js +28 -3
- package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
- package/dist/src/gateway/hono/routes/config.js +23 -2
- package/dist/src/gateway/hono/routes/config.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +124 -2
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/sse.js +9 -2
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/index.js +2 -2
- package/dist/src/gateway/lock.js +1 -1
- package/dist/src/gateway/service/run-gateway-agent.d.ts +37 -0
- package/dist/src/gateway/service/run-gateway-agent.js +163 -0
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -0
- package/dist/src/gateway/service/save-webchat-user-message.d.ts +9 -0
- package/dist/src/gateway/service/save-webchat-user-message.js +34 -0
- package/dist/src/gateway/service/save-webchat-user-message.js.map +1 -0
- package/dist/src/gateway/service/session-chat-ids.d.ts +9 -0
- package/dist/src/gateway/service/session-chat-ids.js +33 -0
- package/dist/src/gateway/service/session-chat-ids.js.map +1 -0
- package/dist/src/gateway/service/sse-hub.d.ts +10 -0
- package/dist/src/gateway/service/sse-hub.js +55 -0
- package/dist/src/gateway/service/sse-hub.js.map +1 -0
- package/dist/src/gateway/service/types.d.ts +9 -0
- package/dist/src/gateway/service/types.js +1 -0
- package/dist/src/gateway/service.d.ts +42 -33
- package/dist/src/gateway/service.js +92 -246
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/infra/update-lock.js +4 -2
- package/dist/src/infra/update-lock.js.map +1 -1
- package/dist/src/infra/update-startup.js +5 -14
- package/dist/src/infra/update-startup.js.map +1 -1
- package/dist/src/infra/write-file-atomic.d.ts +18 -0
- package/dist/src/infra/write-file-atomic.js +115 -0
- package/dist/src/infra/write-file-atomic.js.map +1 -0
- package/dist/src/session/abort-cutoff.d.ts +6 -0
- package/dist/src/session/abort-cutoff.js +10 -0
- package/dist/src/session/abort-cutoff.js.map +1 -0
- package/dist/src/session/compaction-checkpoints.d.ts +8 -0
- package/dist/src/session/compaction-checkpoints.js +21 -0
- package/dist/src/session/compaction-checkpoints.js.map +1 -0
- package/dist/src/session/config-store.js +4 -2
- package/dist/src/session/config-store.js.map +1 -1
- package/dist/src/session/index.d.ts +8 -1
- package/dist/src/session/index.js +7 -1
- package/dist/src/session/manager.d.ts +26 -1
- package/dist/src/session/manager.js +39 -2
- package/dist/src/session/manager.js.map +1 -1
- package/dist/src/session/patch-metadata.d.ts +12 -0
- package/dist/src/session/patch-metadata.js +23 -0
- package/dist/src/session/patch-metadata.js.map +1 -0
- package/dist/src/session/search-index.d.ts +2 -0
- package/dist/src/session/search-index.js +30 -2
- package/dist/src/session/search-index.js.map +1 -1
- package/dist/src/session/session-context-for-llm.d.ts +32 -0
- package/dist/src/session/session-context-for-llm.js +60 -0
- package/dist/src/session/session-context-for-llm.js.map +1 -0
- package/dist/src/session/store.d.ts +53 -2
- package/dist/src/session/store.js +427 -145
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/strip-webchat-early-save.d.ts +5 -0
- package/dist/src/session/strip-webchat-early-save.js +17 -0
- package/dist/src/session/strip-webchat-early-save.js.map +1 -0
- package/dist/src/session/transcript-format.d.ts +46 -0
- package/dist/src/session/transcript-format.js +88 -0
- package/dist/src/session/transcript-format.js.map +1 -0
- package/dist/src/session/types.d.ts +37 -0
- package/dist/src/session/types.js.map +1 -1
- package/dist/src/utils/logger/log-store.js +4 -3
- package/dist/src/utils/logger/log-store.js.map +1 -1
- package/dist/src/voice/tts/merge-config.js +0 -1
- package/dist/src/voice/tts/merge-config.js.map +1 -1
- package/dist/src/voice/tts/service.js +1 -2
- package/dist/src/voice/tts/service.js.map +1 -1
- package/package.json +1 -1
- package/skills/business/company-values/SKILL-zh.md +80 -0
- package/skills/business/company-values/SKILL.md +80 -0
- package/skills/business/find-community/SKILL-zh.md +50 -0
- package/skills/business/find-community/SKILL.md +50 -0
- package/skills/business/first-customers/SKILL-zh.md +76 -0
- package/skills/business/first-customers/SKILL.md +76 -0
- package/skills/business/grow-sustainably/SKILL-zh.md +92 -0
- package/skills/business/grow-sustainably/SKILL.md +92 -0
- package/skills/business/marketing-plan/SKILL-zh.md +100 -0
- package/skills/business/marketing-plan/SKILL.md +100 -0
- package/skills/business/minimalist-review/SKILL-zh.md +82 -0
- package/skills/business/minimalist-review/SKILL.md +82 -0
- package/skills/business/mvp/SKILL-zh.md +81 -0
- package/skills/business/mvp/SKILL.md +81 -0
- package/skills/business/pricing/SKILL-zh.md +64 -0
- package/skills/business/pricing/SKILL.md +64 -0
- package/skills/business/processize/SKILL-zh.md +91 -0
- package/skills/business/processize/SKILL.md +91 -0
- package/skills/business/validate-idea/SKILL-zh.md +68 -0
- package/skills/business/validate-idea/SKILL.md +68 -0
- package/skills/{skill-creator → creative/algorithmic-art}/LICENSE.txt +1 -1
- package/skills/creative/algorithmic-art/SKILL-zh.md +405 -0
- package/skills/creative/algorithmic-art/SKILL.md +405 -0
- package/skills/creative/algorithmic-art/templates/generator_template.js +223 -0
- package/skills/creative/algorithmic-art/templates/viewer.html +599 -0
- package/skills/creative/canvas-design/LICENSE.txt +202 -0
- package/skills/creative/canvas-design/SKILL-zh.md +130 -0
- package/skills/creative/canvas-design/SKILL.md +130 -0
- package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/creative/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/creative/frontend-design/LICENSE.txt +177 -0
- package/skills/creative/frontend-design/SKILL-zh.md +42 -0
- package/skills/creative/frontend-design/SKILL.md +42 -0
- package/skills/creative/theme-factory/LICENSE.txt +202 -0
- package/skills/creative/theme-factory/SKILL-zh.md +59 -0
- package/skills/creative/theme-factory/SKILL.md +59 -0
- package/skills/creative/theme-factory/theme-showcase.pdf +0 -0
- package/skills/creative/theme-factory/themes/arctic-frost.md +19 -0
- package/skills/creative/theme-factory/themes/botanical-garden.md +19 -0
- package/skills/creative/theme-factory/themes/desert-rose.md +19 -0
- package/skills/creative/theme-factory/themes/forest-canopy.md +19 -0
- package/skills/creative/theme-factory/themes/golden-hour.md +19 -0
- package/skills/creative/theme-factory/themes/midnight-galaxy.md +19 -0
- package/skills/creative/theme-factory/themes/modern-minimalist.md +19 -0
- package/skills/creative/theme-factory/themes/ocean-depths.md +19 -0
- package/skills/creative/theme-factory/themes/sunset-boulevard.md +19 -0
- package/skills/creative/theme-factory/themes/tech-innovation.md +19 -0
- package/skills/creative/web-artifacts-builder/LICENSE.txt +202 -0
- package/skills/creative/web-artifacts-builder/SKILL-zh.md +74 -0
- package/skills/creative/web-artifacts-builder/SKILL.md +74 -0
- package/skills/creative/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/skills/creative/web-artifacts-builder/scripts/init-artifact.sh +322 -0
- package/skills/creative/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/skills/documents/doc-coauthoring/SKILL-zh.md +375 -0
- package/skills/documents/doc-coauthoring/SKILL.md +375 -0
- package/skills/documents/docx/SKILL-zh.md +590 -0
- package/skills/{docx → documents/docx}/SKILL.md +11 -11
- package/skills/{docx → documents/docx}/scripts/comment.py +2 -2
- package/skills/{docx → documents/docx}/scripts/office/helpers/simplify_redlines.py +1 -1
- package/skills/{docx → documents/docx}/scripts/office/pack.py +2 -2
- package/skills/{xlsx → documents/docx}/scripts/office/validate.py +2 -2
- package/skills/{xlsx → documents/docx}/scripts/office/validators/redlining.py +1 -1
- package/skills/documents/pdf/SKILL-zh.md +314 -0
- package/skills/documents/pptx/SKILL-zh.md +232 -0
- package/skills/{pptx → documents/pptx}/editing.md +3 -3
- package/skills/{pptx → documents/pptx}/scripts/office/helpers/simplify_redlines.py +1 -1
- package/skills/{xlsx → documents/pptx}/scripts/office/pack.py +2 -2
- package/skills/{pptx → documents/pptx}/scripts/office/validate.py +2 -2
- package/skills/{docx → documents/pptx}/scripts/office/validators/redlining.py +1 -1
- package/skills/documents/xlsx/SKILL-zh.md +292 -0
- package/skills/{xlsx → documents/xlsx}/scripts/office/helpers/simplify_redlines.py +1 -1
- package/skills/{pptx → documents/xlsx}/scripts/office/pack.py +2 -2
- package/skills/{docx → documents/xlsx}/scripts/office/validate.py +2 -2
- package/skills/{pptx → documents/xlsx}/scripts/office/validators/redlining.py +1 -1
- package/skills/meta/skill-creator/LICENSE.txt +202 -0
- package/skills/meta/skill-creator/SKILL-zh.md +483 -0
- package/skills/{skill-creator → meta/skill-creator}/SKILL.md +0 -1
- package/skills/tools/find-skills/SKILL-zh.md +440 -0
- package/skills/tools/github/SKILL-zh.md +48 -0
- package/skills/tools/internal-comms/LICENSE.txt +202 -0
- package/skills/tools/internal-comms/SKILL-zh.md +32 -0
- package/skills/tools/internal-comms/SKILL.md +32 -0
- package/skills/tools/internal-comms/examples/3p-updates.md +47 -0
- package/skills/tools/internal-comms/examples/company-newsletter.md +65 -0
- package/skills/tools/internal-comms/examples/faq-answers.md +30 -0
- package/skills/tools/internal-comms/examples/general-comms.md +16 -0
- package/skills/tools/summarize/SKILL-zh.md +47 -0
- package/skills/tools/weather/SKILL-zh.md +46 -0
- package/skills/tools/webapp-testing/LICENSE.txt +202 -0
- package/skills/tools/webapp-testing/SKILL-zh.md +96 -0
- package/skills/tools/webapp-testing/SKILL.md +96 -0
- package/skills/tools/webapp-testing/examples/console_logging.py +35 -0
- package/skills/tools/webapp-testing/examples/element_discovery.py +40 -0
- package/skills/tools/webapp-testing/examples/static_html_automation.py +33 -0
- package/skills/tools/webapp-testing/scripts/with_server.py +106 -0
- package/dist/gateway/static/root/assets/agents-CkgFSiCY.js +0 -216
- package/dist/gateway/static/root/assets/agents-CkgFSiCY.js.map +0 -1
- package/dist/gateway/static/root/assets/channels-settings-CE7jrdkO.js +0 -9
- package/dist/gateway/static/root/assets/channels-settings-CE7jrdkO.js.map +0 -1
- package/dist/gateway/static/root/assets/cron-page-BpPPcykJ.js +0 -2
- package/dist/gateway/static/root/assets/cron-page-BpPPcykJ.js.map +0 -1
- package/dist/gateway/static/root/assets/cron-utils-N1PqD2DB.js +0 -3
- package/dist/gateway/static/root/assets/cron-utils-N1PqD2DB.js.map +0 -1
- package/dist/gateway/static/root/assets/dist--p2HQ2QF.js +0 -2
- package/dist/gateway/static/root/assets/index-Dnfha4O2.css +0 -1
- package/dist/gateway/static/root/assets/logs-page-CQwdV_Xw.js +0 -2
- package/dist/gateway/static/root/assets/logs-page-CQwdV_Xw.js.map +0 -1
- package/dist/gateway/static/root/assets/sessions-page-Be5kIGl_.js +0 -2
- package/dist/gateway/static/root/assets/settings-page-PodSlNwr.js +0 -2
- package/dist/gateway/static/root/assets/settings-page-PodSlNwr.js.map +0 -1
- package/dist/gateway/static/root/assets/skills-page-Clg8deH0.js +0 -3
- package/dist/gateway/static/root/assets/skills-page-Clg8deH0.js.map +0 -1
- package/dist/src/agent/skills/skills-store-client.d.ts +0 -66
- package/dist/src/agent/skills/skills-store-client.js.map +0 -1
- package/dist/src/stt/index.d.ts +0 -1
- package/dist/src/stt/index.js +0 -8
- /package/skills/{docx → documents/docx}/LICENSE.txt +0 -0
- /package/skills/{docx → documents/docx}/scripts/__init__.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/accept_changes.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/helpers/__init__.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/helpers/merge_runs.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/mce/mc.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-2010.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-2012.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-2018.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/soffice.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/unpack.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/validators/__init__.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/validators/base.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/validators/docx.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/validators/pptx.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/templates/comments.xml +0 -0
- /package/skills/{docx → documents/docx}/scripts/templates/commentsExtended.xml +0 -0
- /package/skills/{docx → documents/docx}/scripts/templates/commentsExtensible.xml +0 -0
- /package/skills/{docx → documents/docx}/scripts/templates/commentsIds.xml +0 -0
- /package/skills/{docx → documents/docx}/scripts/templates/people.xml +0 -0
- /package/skills/{pdf → documents/pdf}/LICENSE.txt +0 -0
- /package/skills/{pdf → documents/pdf}/SKILL.md +0 -0
- /package/skills/{pdf → documents/pdf}/forms.md +0 -0
- /package/skills/{pdf → documents/pdf}/reference.md +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/check_bounding_boxes.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/check_fillable_fields.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/convert_pdf_to_images.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/create_validation_image.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/extract_form_field_info.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/extract_form_structure.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/fill_fillable_fields.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/fill_pdf_form_with_annotations.py +0 -0
- /package/skills/{pptx → documents/pptx}/LICENSE.txt +0 -0
- /package/skills/{pptx → documents/pptx}/SKILL.md +0 -0
- /package/skills/{pptx → documents/pptx}/pptxgenjs.md +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/__init__.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/add_slide.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/clean.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/helpers/__init__.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/helpers/merge_runs.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/mce/mc.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-2010.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-2012.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-2018.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/soffice.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/unpack.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/validators/__init__.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/validators/base.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/validators/docx.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/validators/pptx.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/thumbnail.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/LICENSE.txt +0 -0
- /package/skills/{xlsx → documents/xlsx}/SKILL.md +0 -0
- /package/skills/{skill-creator/scripts → documents/xlsx/scripts/office/helpers}/__init__.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/helpers/merge_runs.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/mce/mc.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-2010.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-2012.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-2018.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/soffice.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/unpack.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/__init__.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/base.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/docx.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/pptx.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/recalc.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/agents/analyzer.md +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/agents/comparator.md +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/agents/grader.md +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/assets/eval_review.html +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/eval-viewer/generate_review.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/eval-viewer/viewer.html +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/references/schemas.md +0 -0
- /package/skills/{xlsx/scripts/office/helpers → meta/skill-creator/scripts}/__init__.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/aggregate_benchmark.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/generate_report.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/improve_description.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/package_skill.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/quick_validate.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/run_eval.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/run_loop.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/utils.py +0 -0
- /package/skills/{find-skills → tools/find-skills}/SKILL.md +0 -0
- /package/skills/{github → tools/github}/SKILL.md +0 -0
- /package/skills/{summarize → tools/summarize}/SKILL.md +0 -0
- /package/skills/{weather → tools/weather}/SKILL.md +0 -0
|
@@ -570,6 +570,10 @@ export declare const GatewayConfigSchema: z.ZodDefault<z.ZodObject<{
|
|
|
570
570
|
}, z.core.$strip>>>;
|
|
571
571
|
maxSseConnections: z.ZodOptional<z.ZodNumber>;
|
|
572
572
|
corsOrigins: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
573
|
+
skillsMarketplaceProvider: z.ZodOptional<z.ZodEnum<{
|
|
574
|
+
store: "store";
|
|
575
|
+
skillhub: "skillhub";
|
|
576
|
+
}>>;
|
|
573
577
|
skillsStoreBaseUrl: z.ZodOptional<z.ZodString>;
|
|
574
578
|
}, z.core.$strip>>;
|
|
575
579
|
export declare const CronConfigSchema: z.ZodDefault<z.ZodObject<{
|
|
@@ -664,12 +668,12 @@ export declare const TTSConfigSchema: z.ZodObject<{
|
|
|
664
668
|
edge: "edge";
|
|
665
669
|
minimax: "minimax";
|
|
666
670
|
}>>;
|
|
667
|
-
trigger: z.
|
|
671
|
+
trigger: z.ZodDefault<z.ZodEnum<{
|
|
668
672
|
off: "off";
|
|
669
673
|
always: "always";
|
|
670
674
|
inbound: "inbound";
|
|
671
675
|
tagged: "tagged";
|
|
672
|
-
}
|
|
676
|
+
}>>;
|
|
673
677
|
fallback: z.ZodOptional<z.ZodObject<{
|
|
674
678
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
675
679
|
order: z.ZodDefault<z.ZodArray<z.ZodEnum<{
|
|
@@ -1004,6 +1008,10 @@ export declare const ConfigSchema: z.ZodDefault<z.ZodObject<{
|
|
|
1004
1008
|
}, z.core.$strip>>>;
|
|
1005
1009
|
maxSseConnections: z.ZodOptional<z.ZodNumber>;
|
|
1006
1010
|
corsOrigins: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
1011
|
+
skillsMarketplaceProvider: z.ZodOptional<z.ZodEnum<{
|
|
1012
|
+
store: "store";
|
|
1013
|
+
skillhub: "skillhub";
|
|
1014
|
+
}>>;
|
|
1007
1015
|
skillsStoreBaseUrl: z.ZodOptional<z.ZodString>;
|
|
1008
1016
|
}, z.core.$strip>>;
|
|
1009
1017
|
tools: z.ZodDefault<z.ZodObject<{
|
|
@@ -1069,12 +1077,12 @@ export declare const ConfigSchema: z.ZodDefault<z.ZodObject<{
|
|
|
1069
1077
|
edge: "edge";
|
|
1070
1078
|
minimax: "minimax";
|
|
1071
1079
|
}>>;
|
|
1072
|
-
trigger: z.
|
|
1080
|
+
trigger: z.ZodDefault<z.ZodEnum<{
|
|
1073
1081
|
off: "off";
|
|
1074
1082
|
always: "always";
|
|
1075
1083
|
inbound: "inbound";
|
|
1076
1084
|
tagged: "tagged";
|
|
1077
|
-
}
|
|
1085
|
+
}>>;
|
|
1078
1086
|
fallback: z.ZodOptional<z.ZodObject<{
|
|
1079
1087
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
1080
1088
|
order: z.ZodDefault<z.ZodArray<z.ZodEnum<{
|
|
@@ -126,7 +126,7 @@ var init_schema = __esmMin((() => {
|
|
|
126
126
|
*/
|
|
127
127
|
dreaming: z.object({
|
|
128
128
|
enabled: z.boolean().optional(),
|
|
129
|
-
/**
|
|
129
|
+
/** Default deep-phase cron when `phases.deep.cron` is omitted. */
|
|
130
130
|
frequency: z.string().optional(),
|
|
131
131
|
timezone: z.string().optional(),
|
|
132
132
|
phases: z.object({
|
|
@@ -313,10 +313,21 @@ summaryModel: z.string().optional() }).optional(),
|
|
|
313
313
|
}).default({ dmScope: "main" });
|
|
314
314
|
ChannelsConfigSchema = z.record(z.string(), z.unknown()).default({ telegram: {
|
|
315
315
|
enabled: false,
|
|
316
|
-
botToken: "",
|
|
317
316
|
allowFrom: [],
|
|
318
317
|
groupAllowFrom: [],
|
|
319
318
|
debug: false,
|
|
319
|
+
accounts: { default: {
|
|
320
|
+
accountId: "default",
|
|
321
|
+
enabled: true,
|
|
322
|
+
botToken: "",
|
|
323
|
+
allowFrom: [],
|
|
324
|
+
dmPolicy: "pairing",
|
|
325
|
+
groupPolicy: "open",
|
|
326
|
+
replyToMode: "off",
|
|
327
|
+
historyLimit: 50,
|
|
328
|
+
textChunkLimit: 4e3,
|
|
329
|
+
streamMode: "partial"
|
|
330
|
+
} },
|
|
320
331
|
dmPolicy: "pairing",
|
|
321
332
|
groupPolicy: "open",
|
|
322
333
|
replyToMode: "off",
|
|
@@ -392,6 +403,8 @@ summaryModel: z.string().optional() }).optional(),
|
|
|
392
403
|
heartbeat: HeartbeatConfigSchema.optional(),
|
|
393
404
|
maxSseConnections: z.number().optional(),
|
|
394
405
|
corsOrigins: z.array(z.string()).optional(),
|
|
406
|
+
/** Skills marketplace provider: `store` (store.xopc.ai) or `skillhub` (skillhub.cn). */
|
|
407
|
+
skillsMarketplaceProvider: z.enum(["store", "skillhub"]).optional(),
|
|
395
408
|
/** Base URL for the xopc skills marketplace (public REST API). */
|
|
396
409
|
skillsStoreBaseUrl: z.string().url().optional()
|
|
397
410
|
}).default({
|
|
@@ -405,6 +418,7 @@ summaryModel: z.string().optional() }).optional(),
|
|
|
405
418
|
},
|
|
406
419
|
maxSseConnections: 100,
|
|
407
420
|
corsOrigins: [],
|
|
421
|
+
skillsMarketplaceProvider: "skillhub",
|
|
408
422
|
skillsStoreBaseUrl: "https://store.xopc.ai"
|
|
409
423
|
});
|
|
410
424
|
CronConfigSchema = z.object({
|
|
@@ -490,12 +504,12 @@ summaryModel: z.string().optional() }).optional(),
|
|
|
490
504
|
"edge",
|
|
491
505
|
"minimax"
|
|
492
506
|
]).default("openai"),
|
|
493
|
-
trigger: z.
|
|
507
|
+
trigger: z.enum([
|
|
494
508
|
"off",
|
|
495
509
|
"always",
|
|
496
510
|
"inbound",
|
|
497
511
|
"tagged"
|
|
498
|
-
]).default("always")
|
|
512
|
+
]).default("always"),
|
|
499
513
|
fallback: TTSFallbackConfigSchema.optional(),
|
|
500
514
|
maxTextLength: z.number().int().min(1).default(512),
|
|
501
515
|
timeoutMs: z.number().int().min(1e3).max(18e4).default(6e4),
|
|
@@ -588,10 +602,21 @@ summaryModel: z.string().optional() }).optional(),
|
|
|
588
602
|
session: { dmScope: "main" },
|
|
589
603
|
channels: { telegram: {
|
|
590
604
|
enabled: false,
|
|
591
|
-
botToken: "",
|
|
592
605
|
allowFrom: [],
|
|
593
606
|
groupAllowFrom: [],
|
|
594
607
|
debug: false,
|
|
608
|
+
accounts: { default: {
|
|
609
|
+
accountId: "default",
|
|
610
|
+
enabled: true,
|
|
611
|
+
botToken: "",
|
|
612
|
+
allowFrom: [],
|
|
613
|
+
dmPolicy: "pairing",
|
|
614
|
+
groupPolicy: "open",
|
|
615
|
+
replyToMode: "off",
|
|
616
|
+
historyLimit: 50,
|
|
617
|
+
textChunkLimit: 4e3,
|
|
618
|
+
streamMode: "partial"
|
|
619
|
+
} },
|
|
595
620
|
dmPolicy: "pairing",
|
|
596
621
|
groupPolicy: "open",
|
|
597
622
|
replyToMode: "off",
|
|
@@ -609,6 +634,7 @@ summaryModel: z.string().optional() }).optional(),
|
|
|
609
634
|
},
|
|
610
635
|
maxSseConnections: 100,
|
|
611
636
|
corsOrigins: [],
|
|
637
|
+
skillsMarketplaceProvider: "skillhub",
|
|
612
638
|
skillsStoreBaseUrl: "https://store.xopc.ai"
|
|
613
639
|
},
|
|
614
640
|
tools: { web: { search: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":[],"sources":["../../../src/config/schema.ts"],"sourcesContent":["import { z } from 'zod';\n\nimport { getDefaultWorkspacePath } from '../agent/agent-scope.js';\n\n// ============================================\n// Agent Configs\n// ============================================\n\nexport const AgentModelRefSchema = z.union([\n z.string(),\n z\n .object({\n primary: z.string().optional(),\n fallbacks: z.array(z.string()).optional(),\n })\n .strict(),\n]);\n\nexport type AgentModelConfig = z.infer<typeof AgentModelRefSchema>;\n\nexport const AgentDefaultsSchema = z.object({\n /** Parent directory: each agent’s Markdown root is `<expanded>/<agentId>/` (e.g. `.../workspace/main`). */\n workspace: z.string().default('~/.xopc/workspace'),\n model: z.union([\n z.string(),\n z.object({\n primary: z.string().optional(),\n fallbacks: z.array(z.string()).optional(),\n }).strict(),\n ]).default(''), // Empty default - will be resolved dynamically at runtime\n /** Vision / image understanding model (provider/model). Falls back to heuristics when unset. */\n imageModel: AgentModelRefSchema.optional(),\n /** Image generation model (provider/model), e.g. openai/gpt-image-1. Thin REST wrapper; OpenAI supported. */\n imageGenerationModel: AgentModelRefSchema.optional(),\n /** Max image size for image tool loads (MB). */\n mediaMaxMb: z.number().positive().optional(),\n maxTokens: z.number().default(8192),\n temperature: z.number().default(0.7),\n maxToolIterations: z.number().default(20),\n // Wall-clock limit for one user turn (LLM + tools). Default 30m if unset; cap 4h.\n maxTaskDurationMs: z.number().min(60000).max(14_400_000).optional(),\n // Reliability settings\n maxRequestsPerTurn: z.number().min(10).max(200).default(50),\n maxToolFailuresPerTurn: z.number().min(1).max(20).default(3),\n // Thinking ability settings\n thinkingDefault: z.enum(['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'adaptive']).optional(),\n reasoningDefault: z.enum(['off', 'on', 'stream']).optional(),\n verboseDefault: z.enum(['off', 'on', 'full']).optional(),\n compaction: z.object({\n enabled: z.boolean().default(true),\n mode: z.enum(['default', 'safeguard']).default('default'),\n reserveTokens: z.number().default(8000),\n triggerThreshold: z.number().min(0.5).max(0.95).default(0.8),\n minMessagesBeforeCompact: z.number().default(10),\n keepRecentMessages: z.number().default(5),\n // Dual-strategy compaction\n evictionWindow: z.number().min(0.1).max(0.5).default(0.2),\n retentionWindow: z.number().min(3).max(20).default(6),\n }).optional(),\n pruning: z.object({\n enabled: z.boolean().default(true),\n maxToolResultChars: z.number().default(10000),\n headKeepRatio: z.number().default(0.3),\n tailKeepRatio: z.number().default(0.3),\n }).optional(),\n /**\n * Curated memory (`agents/<id>/memories/`) + pluggable external provider.\n * Only one external provider at a time.\n */\n memory: z\n .object({\n /** Master switch: curated snapshot, `curated_memory`, prefetch, and external provider. Default true. */\n enabled: z.boolean().optional(),\n /** When false, use workspace bootstrap only (no curated snapshot / tool). Default true. */\n useEnhancedSystem: z.boolean().optional(),\n /** Include USER.md in snapshot. Default true. */\n userProfileEnabled: z.boolean().optional(),\n memoryCharLimit: z.number().positive().optional(),\n userCharLimit: z.number().positive().optional(),\n provider: z.enum(['none', 'stub']).optional(),\n /** How often prefetched external memory is injected into the user message. */\n injectionFrequency: z.enum(['every-turn', 'first-turn']).optional(),\n /** Inject prefetch on turns 1, 1+N, 1+2N, … (only when injectionFrequency is every-turn). Min 1. */\n contextCadence: z.number().int().min(1).optional(),\n /** Reserved for future external “dialectic” sync cadence (not wired yet). */\n dialecticCadence: z.number().int().min(1).optional(),\n /**\n * Background memory consolidation (\"dreaming\"): three-phase sleep model that\n * promotes short-term recall signals into long-term memory (`MEMORY.md`).\n *\n * Phases:\n * - **light** — fast, frequent sweep (default every 6 h): dedup + signal collection.\n * - **deep** — daily deep promotion (default 3 AM): score-gated write to MEMORY.md.\n * - **rem** — weekly pattern discovery (default Sun 5 AM): cross-session insight mining.\n */\n dreaming: z\n .object({\n enabled: z.boolean().optional(),\n /** Legacy top-level cron; prefer per-phase `cron` instead. */\n frequency: z.string().optional(),\n timezone: z.string().optional(),\n phases: z\n .object({\n light: z\n .object({\n enabled: z.boolean().optional(),\n cron: z.string().optional(),\n lookbackDays: z.number().int().min(1).optional(),\n limit: z.number().int().min(0).optional(),\n dedupeSimilarity: z.number().min(0).max(1).optional(),\n })\n .optional(),\n deep: z\n .object({\n enabled: z.boolean().optional(),\n cron: z.string().optional(),\n minScore: z.number().min(0).max(1).optional(),\n minRecallCount: z.number().int().min(1).optional(),\n minUniqueQueries: z.number().int().min(1).optional(),\n limit: z.number().int().min(0).optional(),\n recencyHalfLifeDays: z.number().min(1).optional(),\n maxAgeDays: z.number().int().min(1).optional(),\n })\n .optional(),\n rem: z\n .object({\n enabled: z.boolean().optional(),\n cron: z.string().optional(),\n lookbackDays: z.number().int().min(1).optional(),\n limit: z.number().int().min(0).optional(),\n minPatternStrength: z.number().min(0).max(1).optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .optional(),\n /** Cross-session transcript search (`session_search` tool). */\n sessionSearch: z\n .object({\n /** Model ref for per-session summaries (e.g. openai/gpt-4o-mini). */\n summaryModel: z.string().optional(),\n })\n .optional(),\n /**\n * Post-turn background review (Hermes-style): optional quiet follow-up that may call\n * `curated_memory` / `skill_manage` so durable facts and reusable workflows persist\n * without bloating the main user-visible turn.\n */\n backgroundReview: z\n .object({\n /** When true, nudges may run after successful turns. Default false (opt-in). */\n enabled: z.boolean().optional(),\n /** User-turn cadence for memory review. 0 disables the memory channel. Default 10. */\n memoryNudgeInterval: z.number().int().min(0).optional(),\n /** LLM rounds without `skill_manage` before a skill review. 0 disables the skill channel. Default 10. */\n skillNudgeInterval: z.number().int().min(0).optional(),\n /** Max tool executions for the review agent. Default 8. */\n maxToolRounds: z.number().int().min(1).max(32).optional(),\n /** Max prior messages passed into the review context (tail). Default 80. */\n maxHistoryMessages: z.number().int().min(10).max(200).optional(),\n /** Wall-clock cap for the review run (ms). Default 120000. */\n maxDurationMs: z.number().int().min(30_000).max(600_000).optional(),\n })\n .optional(),\n /** LLM pass for `web_extract` (markdown-focused extraction). */\n webExtract: z\n .object({\n model: z.string().optional(),\n maxLength: z.number().positive().optional(),\n })\n .optional(),\n /**\n * Headless Playwright tools (`browser_*`). Opt-in. Install browsers once: `npx playwright install chromium`.\n */\n browser: z\n .object({\n enabled: z.boolean().optional(),\n /** Default true when browser tools are enabled. */\n headless: z.boolean().optional(),\n })\n .optional(),\n /** Sub-agent delegation (`delegate_task`). Opt-in. */\n delegate: z\n .object({\n enabled: z.boolean().optional(),\n })\n .optional(),\n /** Sandboxed `execute_code` (programmatic tool calls). Opt-in. */\n executeCode: z\n .object({\n enabled: z.boolean().optional(),\n })\n .optional(),\n /** Optional full system prompt replacement (merged with per-agent entry; entry wins). */\n systemPromptOverride: z.string().optional(),\n /** Optional allowlist of skill names for `<available_skills>`; when set, replaces unfiltered list. */\n skills: z.array(z.string()).optional(),\n /** Disable built-in tools by name (e.g. `shell`, `web_search`). */\n tools: z\n .object({\n disable: z.array(z.string()).optional(),\n })\n .optional(),\n /** Opaque per-process params (reserved for extensions / future use). */\n params: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const AgentConfigSchema = z.object({\n id: z.string(),\n /** When true, this entry is the default routing agent. */\n default: z.boolean().optional(),\n name: z.string().optional(),\n /** Short human-readable summary for UIs (gateway console, pickers). */\n description: z.string().max(4000).optional(),\n enabled: z.boolean().default(true),\n /** Per-agent workspace root (`~` expanded at runtime). */\n workspace: z.string().optional(),\n /**\n * Internal agent state directory (`…/credentials`, `agent.json`, pid, inbox).\n * Default: `<stateDir>/agents/<id>/agent`.\n */\n agentDir: z.string().optional(),\n model: AgentModelRefSchema.optional(),\n thinkingDefault: z.enum(['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'adaptive']).optional(),\n reasoningDefault: z.enum(['off', 'on', 'stream']).optional(),\n verboseDefault: z.enum(['off', 'on', 'full']).optional(),\n systemPromptOverride: z.string().optional(),\n skills: z.array(z.string()).optional(),\n tools: z\n .object({\n disable: z.array(z.string()).optional(),\n })\n .optional(),\n params: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const AgentsConfigSchema = z.object({\n /** Default agent id when not specified (routing / session creation). */\n default: z.string().optional(),\n defaults: AgentDefaultsSchema.optional(),\n list: z.array(AgentConfigSchema).optional(),\n}).default({\n defaults: {\n workspace: '~/.xopc/workspace',\n model: '', // Empty default - will be resolved dynamically at runtime\n maxTokens: 8192,\n temperature: 0.7,\n maxToolIterations: 20,\n maxRequestsPerTurn: 50,\n maxToolFailuresPerTurn: 3,\n thinkingDefault: 'medium',\n reasoningDefault: 'stream',\n verboseDefault: 'full',\n compaction: {\n enabled: true,\n mode: 'default',\n reserveTokens: 8000,\n triggerThreshold: 0.8,\n minMessagesBeforeCompact: 10,\n keepRecentMessages: 5,\n evictionWindow: 0.2,\n retentionWindow: 6,\n },\n pruning: {\n enabled: true,\n maxToolResultChars: 10000,\n headKeepRatio: 0.3,\n tailKeepRatio: 0.3,\n },\n },\n} as any);\n\n// ============================================\n// Channel Configs (per-channel Zod lives in bundled extensions; root schema is open)\n// ============================================\n\nexport {\n TelegramTopicConfigSchema,\n TelegramGroupConfigSchema,\n TelegramAccountConfigSchema,\n TelegramConfigSchema,\n} from '../../extensions/telegram/src/config-schema.js';\nexport type { TelegramConfig } from '../../extensions/telegram/src/config-schema.js';\nexport { WeixinAccountConfigSchema, WeixinConfigSchema } from '../../extensions/weixin/src/config-schema.js';\nexport type { WeixinConfig } from '../../extensions/weixin/src/config-schema.js';\n\n// ============================================\n// Session Routing Configuration\n// ============================================\n\nexport const BindingMatchSchema = z.object({\n channel: z.string(),\n accountId: z.string().optional(),\n peerKind: z.string().optional(),\n peerId: z.string().optional(),\n guildId: z.string().optional(),\n teamId: z.string().optional(),\n memberRoleIds: z.array(z.string()).optional(),\n});\n\nexport const BindingRuleSchema = z.object({\n id: z.string().optional(),\n agentId: z.string(),\n priority: z.number().default(100),\n match: BindingMatchSchema,\n enabled: z.boolean().default(true),\n});\n\nexport const BindingsConfigSchema = z.array(BindingRuleSchema).default([]);\n\nexport const SessionDmScopeSchema = z.enum([\n 'main',\n 'per-peer',\n 'per-channel-peer',\n 'per-account-channel-peer',\n]);\n\nexport const SessionStorageConfigSchema = z.object({\n pruneAfterMs: z.number().optional(),\n maxEntries: z.number().optional(),\n});\n\nexport const SessionConfigSchema = z.object({\n dmScope: SessionDmScopeSchema.default('main'),\n identityLinks: z.record(z.string(), z.array(z.string())).optional(),\n storage: SessionStorageConfigSchema.optional(),\n}).default({\n dmScope: 'main',\n});\n\n/** Channel buckets — shapes validated post-parse by registered channel plugins. */\nexport const ChannelsConfigSchema = z.record(z.string(), z.unknown()).default({\n telegram: {\n enabled: false,\n botToken: '',\n allowFrom: [],\n groupAllowFrom: [],\n debug: false,\n dmPolicy: 'pairing' as const,\n groupPolicy: 'open' as const,\n replyToMode: 'off' as const,\n historyLimit: 50,\n textChunkLimit: 4000,\n },\n});\n\nexport const SearchProviderEntrySchema = z.object({\n type: z.enum(['brave', 'tavily', 'bing', 'searxng']),\n apiKey: z.string().optional(),\n /** SearXNG instance base URL (e.g. http://localhost:8080) */\n url: z.string().optional(),\n disabled: z.boolean().optional(),\n});\n\nexport type SearchProviderEntry = z.infer<typeof SearchProviderEntrySchema>;\n\nexport const WebSearchConfigSchema = z.object({\n maxResults: z.number().default(5),\n /** Ordered API providers; empty → HTML fallback only */\n providers: z.array(SearchProviderEntrySchema).default([]),\n});\n\nexport type WebSearchConfig = z.infer<typeof WebSearchConfigSchema>;\n\nexport const WebToolsConfigSchema = z.object({\n /** Search result HTML fallback: cn → Bing, otherwise DuckDuckGo */\n region: z.enum(['cn', 'global']).optional(),\n search: WebSearchConfigSchema.optional(),\n});\n\nexport type WebToolsConfig = z.infer<typeof WebToolsConfigSchema>;\n\nexport const ToolsConfigSchema = z.object({\n web: WebToolsConfigSchema.optional(),\n}).default({\n web: {\n search: {\n maxResults: 5,\n providers: [],\n },\n },\n});\n\n// ============================================\n// Gateway Configuration\n// ============================================\n\nexport const GatewayAuthRateLimitSchema = z\n .object({\n enabled: z.boolean().default(true),\n maxAttempts: z.number().int().min(1).default(5),\n windowMs: z.number().default(900_000),\n blockDurationMs: z.number().default(300_000),\n })\n .optional();\n\nexport const GatewayAuthSchema = z\n .object({\n mode: z.enum(['none', 'token', 'password']).default('token'),\n token: z.string().optional(),\n password: z.string().optional(),\n rateLimit: GatewayAuthRateLimitSchema,\n })\n .default({\n mode: 'token',\n });\n\nexport const HeartbeatConfigSchema = z\n .object({\n enabled: z.boolean(),\n intervalMs: z.number(),\n /** When false, heartbeat instructions are only sent during heartbeat polling turns (not in every chat system prompt). */\n includeSystemPromptSection: z.boolean().optional().default(false),\n target: z.string().optional(),\n targetChatId: z.string().optional(),\n prompt: z.string().optional(),\n ackMaxChars: z.number().optional(),\n isolatedSession: z.boolean().optional(),\n activeHours: z\n .object({\n start: z.string(),\n end: z.string(),\n timezone: z.string().optional(),\n })\n .optional(),\n })\n .default({\n enabled: true,\n intervalMs: 1_800_000,\n includeSystemPromptSection: false,\n });\n\nexport const GatewayConfigSchema = z.object({\n host: z.string().optional(),\n port: z.number().optional(),\n auth: GatewayAuthSchema.optional(),\n heartbeat: HeartbeatConfigSchema.optional(),\n maxSseConnections: z.number().optional(),\n corsOrigins: z.array(z.string()).optional(),\n /** Base URL for the xopc skills marketplace (public REST API). */\n skillsStoreBaseUrl: z.string().url().optional(),\n}).default({\n host: '127.0.0.1',\n port: 18790,\n auth: {\n mode: 'token',\n },\n heartbeat: {\n enabled: true,\n intervalMs: 1_800_000,\n includeSystemPromptSection: false,\n },\n maxSseConnections: 100,\n corsOrigins: [],\n skillsStoreBaseUrl: 'https://store.xopc.ai',\n});\n\nexport const CronConfigSchema = z.object({\n enabled: z.boolean().optional(),\n maxConcurrentJobs: z.number().optional(),\n defaultTimezone: z.string().optional(),\n historyRetentionDays: z.number().optional(),\n enableMetrics: z.boolean().optional(),\n}).default({\n enabled: true,\n maxConcurrentJobs: 5,\n defaultTimezone: 'UTC',\n historyRetentionDays: 7,\n enableMetrics: true,\n});\n\nexport const ModelsDevConfigSchema = z.object({\n enabled: z.boolean().default(true),\n}).default({\n enabled: true,\n});\n\n// ============================================\n// STT (Speech-to-Text) Config\n// ============================================\n\nexport const STTProviderConfigSchema = z.object({\n apiKey: z.string().optional(),\n model: z.string().optional(),\n});\n\nexport const STTFallbackConfigSchema = z.object({\n enabled: z.boolean().default(true),\n order: z.array(z.enum(['alibaba', 'openai'])).default(['alibaba', 'openai']),\n});\n\nexport const STTConfigSchema = z.object({\n enabled: z.boolean().default(false),\n provider: z.enum(['alibaba', 'openai']).default('alibaba'),\n alibaba: STTProviderConfigSchema.optional(),\n openai: STTProviderConfigSchema.optional(),\n fallback: STTFallbackConfigSchema.optional(),\n});\n\n// ============================================\n// TTS (Text-to-Speech) Config\n// ============================================\n\nexport const TTSProviderConfigSchema = z.object({\n apiKey: z.string().optional(),\n model: z.string().optional(),\n voice: z.string().optional(),\n});\n\nexport const TTSFallbackConfigSchema = z.object({\n enabled: z.boolean().default(true),\n order: z\n .array(z.enum(['openai', 'alibaba', 'edge', 'minimax']))\n .default(['openai', 'alibaba', 'minimax', 'edge']),\n});\n\nexport const TTSModelOverridesConfigSchema = z.object({\n enabled: z.boolean().default(true),\n allowText: z.boolean().default(true),\n allowProvider: z.boolean().default(false),\n allowVoice: z.boolean().default(true),\n allowModelId: z.boolean().default(true),\n allowVoiceSettings: z.boolean().default(false),\n allowNormalization: z.boolean().default(false),\n allowSeed: z.boolean().default(false),\n});\n\nexport const TTSEdgeConfigSchema = z.object({\n enabled: z.boolean().default(true),\n voice: z.string().optional(),\n lang: z.string().optional(),\n outputFormat: z.string().optional(),\n pitch: z.string().optional(),\n rate: z.string().optional(),\n volume: z.string().optional(),\n proxy: z.string().optional(),\n timeoutMs: z.number().int().min(1000).max(120000).optional(),\n});\n\nexport const TTSSummarizationConfigSchema = z.object({\n enabled: z.boolean().optional(),\n targetLength: z.number().int().min(1).optional(),\n threshold: z.number().int().min(1).optional(),\n model: z.string().optional(),\n});\n\nexport const TTSConfigSchema = z.object({\n enabled: z.boolean().default(false),\n provider: z.enum(['openai', 'alibaba', 'edge', 'minimax']).default('openai'),\n trigger: z\n .preprocess(\n (v) => (v === 'auto' ? 'inbound' : v),\n z.enum(['off', 'always', 'inbound', 'tagged']).default('always'),\n ),\n fallback: TTSFallbackConfigSchema.optional(),\n maxTextLength: z.number().int().min(1).default(512), // Conservative default to accommodate all providers (Alibaba limit is 512)\n timeoutMs: z.number().int().min(1000).max(180000).default(60000),\n summarization: TTSSummarizationConfigSchema.optional(),\n modelOverrides: TTSModelOverridesConfigSchema.optional(),\n alibaba: TTSProviderConfigSchema.optional(),\n openai: TTSProviderConfigSchema.optional(),\n edge: TTSEdgeConfigSchema.optional(),\n minimax: TTSProviderConfigSchema.optional(),\n});\n\n// ============================================\n// Extension Configs \n// ============================================\n\n// Security config for extensions \nexport const ExtensionSecurityConfigSchema = z.object({\n checkPermissions: z.boolean().default(true),\n allowUntrusted: z.boolean().default(false),\n allow: z.array(z.string()).default([]),\n trackProvenance: z.boolean().default(true),\n allowPromptInjection: z.boolean().default(false),\n});\n\n// Slot config for extensions \nexport const ExtensionSlotsConfigSchema = z.object({\n memory: z.string().optional(),\n tts: z.string().optional(),\n imageGeneration: z.string().optional(),\n webSearch: z.string().optional(),\n});\n\n// Complete extensions config\n// Extension config allows both known fields AND arbitrary extension-specific config\n// Known fields: enabled (array), allow (array), security (object), slots (object)\n// Arbitrary: any other key is extension-specific config (e.g., extensions.hello.greeting)\nexport const ExtensionsConfigSchema: z.ZodType<Record<string, unknown>> = z.record(z.string(), z.unknown());\n\n// ============================================\n// Update Config\n// ============================================\n\nexport const UpdateAutoConfigSchema = z\n .object({\n /** Enable automatic update installation. Default false. */\n enabled: z.boolean().default(false),\n /** Hours to wait before applying a stable update after first detection. */\n stableDelayHours: z.number().min(0).default(6),\n /** Additional random jitter hours for stable rollout (avoids thundering herd). */\n stableJitterHours: z.number().min(0).default(12),\n /** How often to re-check for beta updates (hours). Min 0.25. */\n betaCheckIntervalHours: z.number().min(0.25).default(1),\n })\n .strict()\n .optional();\n\nexport const UpdateConfigSchema = z\n .object({\n /** Check for updates on gateway startup. Default true. */\n checkOnStart: z.boolean().default(true),\n /** Update channel: stable (default), beta, or dev. */\n channel: z.enum(['stable', 'beta', 'dev']).default('stable'),\n /** Automatic update policy. */\n auto: UpdateAutoConfigSchema,\n })\n .strict()\n .optional();\n\nexport type UpdateConfig = z.infer<typeof UpdateConfigSchema>;\n\n// ============================================\n// Root Config\n// ============================================\n\nexport const ConfigSchema = z.object({\n agents: AgentsConfigSchema,\n bindings: BindingsConfigSchema,\n session: SessionConfigSchema,\n channels: ChannelsConfigSchema,\n gateway: GatewayConfigSchema,\n tools: ToolsConfigSchema,\n cron: CronConfigSchema,\n extensions: ExtensionsConfigSchema.default({}),\n modelsDev: ModelsDevConfigSchema,\n stt: STTConfigSchema.optional(),\n tts: TTSConfigSchema.optional(),\n update: UpdateConfigSchema,\n}).default({\n agents: {\n defaults: {\n workspace: '~/.xopc/workspace',\n model: '', // Empty default - will be resolved dynamically at runtime\n maxTokens: 8192,\n temperature: 0.7,\n maxToolIterations: 20,\n maxRequestsPerTurn: 50,\n maxToolFailuresPerTurn: 3,\n thinkingDefault: 'medium',\n reasoningDefault: 'stream',\n verboseDefault: 'full',\n compaction: {\n enabled: true,\n mode: 'default',\n reserveTokens: 8000,\n triggerThreshold: 0.8,\n minMessagesBeforeCompact: 10,\n keepRecentMessages: 5,\n evictionWindow: 0.2,\n retentionWindow: 6,\n },\n pruning: {\n enabled: true,\n maxToolResultChars: 10000,\n headKeepRatio: 0.3,\n tailKeepRatio: 0.3,\n },\n },\n },\n bindings: [],\n session: {\n dmScope: 'main' as const,\n },\n channels: {\n telegram: {\n enabled: false,\n botToken: '',\n allowFrom: [],\n groupAllowFrom: [],\n debug: false,\n dmPolicy: 'pairing' as const,\n groupPolicy: 'open' as const,\n replyToMode: 'off' as const,\n historyLimit: 50,\n textChunkLimit: 4000,\n },\n },\n gateway: {\n host: '127.0.0.1',\n port: 18790,\n auth: {\n mode: 'token',\n },\n heartbeat: {\n enabled: true,\n intervalMs: 1_800_000,\n includeSystemPromptSection: false,\n },\n maxSseConnections: 100,\n corsOrigins: [],\n skillsStoreBaseUrl: 'https://store.xopc.ai',\n },\n tools: {\n web: {\n search: {\n maxResults: 5,\n providers: [],\n },\n },\n },\n cron: {\n enabled: true,\n maxConcurrentJobs: 5,\n defaultTimezone: 'UTC',\n historyRetentionDays: 7,\n enableMetrics: true,\n },\n extensions: {\n allow: [],\n security: {\n checkPermissions: true,\n allowUntrusted: false,\n allow: [],\n trackProvenance: true,\n allowPromptInjection: false,\n },\n slots: {},\n },\n modelsDev: {\n enabled: true,\n },\n stt: {\n enabled: false,\n provider: 'alibaba',\n alibaba: {\n model: 'paraformer-v2',\n },\n openai: {\n model: 'whisper-1',\n },\n fallback: {\n enabled: true,\n order: ['alibaba', 'openai'],\n },\n },\n tts: {\n enabled: false,\n provider: 'openai',\n trigger: 'always',\n fallback: {\n enabled: true,\n order: ['openai', 'alibaba', 'minimax', 'edge'],\n },\n maxTextLength: 4096,\n timeoutMs: 30000,\n modelOverrides: {\n enabled: true,\n allowText: true,\n allowProvider: false,\n allowVoice: true,\n allowModelId: true,\n allowVoiceSettings: false,\n allowNormalization: false,\n allowSeed: false,\n },\n alibaba: {\n model: 'qwen-tts',\n voice: 'Cherry',\n },\n openai: {\n model: 'tts-1',\n voice: 'alloy',\n },\n edge: {\n enabled: true,\n voice: 'en-US-MichelleNeural',\n lang: 'en-US',\n outputFormat: 'audio-24khz-48kbitrate-mono-mp3',\n },\n minimax: {\n model: 'speech-2.8-hd',\n voice: 'male-qn-qingse',\n },\n },\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\nexport type AgentDefaults = z.infer<typeof AgentDefaultsSchema>;\nexport type GatewayAuthConfig = z.infer<typeof GatewayAuthSchema>;\nexport type GatewayAuthRateLimitConfig = z.infer<typeof GatewayAuthRateLimitSchema>;\nexport type STTConfig = z.infer<typeof STTConfigSchema>;\nexport type TTSConfig = z.infer<typeof TTSConfigSchema>;\n\n// ============================================\n// Helper Functions\n// ============================================\n\n/**\n * Parse a model reference string.\n */\nexport interface ParsedModelRef {\n provider: string;\n model: string;\n}\n\n/**\n * Default agent’s resolved Markdown workspace root (`resolveAgentWorkspaceDir` for the default agent id).\n */\nexport function getWorkspacePath(config: Config): string {\n return getDefaultWorkspacePath(config);\n}\n\n/**\n * Primary model ref from `agents.defaults.model` (string or `{ primary }`).\n * Returns undefined when unset or empty.\n */\nexport function getAgentDefaultModelRef(config: Config): string | undefined {\n const raw = config.agents?.defaults?.model;\n if (raw === undefined || raw === null) return undefined;\n const ref = typeof raw === 'string' ? raw : raw.primary;\n if (ref === undefined || ref === null) return undefined;\n const s = String(ref).trim();\n return s ? s : undefined;\n}\n\n/** `provider/model` or null when invalid. */\nexport function parseModelRef(ref: string): ParsedModelRef | null {\n const trimmed = ref.trim();\n const idx = trimmed.indexOf('/');\n if (idx <= 0 || idx === trimmed.length - 1) {\n return null;\n }\n return { provider: trimmed.slice(0, idx).trim(), model: trimmed.slice(idx + 1).trim() };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema.js","names":[],"sources":["../../../src/config/schema.ts"],"sourcesContent":["import { z } from 'zod';\n\nimport { getDefaultWorkspacePath } from '../agent/agent-scope.js';\n\n// ============================================\n// Agent Configs\n// ============================================\n\nexport const AgentModelRefSchema = z.union([\n z.string(),\n z\n .object({\n primary: z.string().optional(),\n fallbacks: z.array(z.string()).optional(),\n })\n .strict(),\n]);\n\nexport type AgentModelConfig = z.infer<typeof AgentModelRefSchema>;\n\nexport const AgentDefaultsSchema = z.object({\n /** Parent directory: each agent’s Markdown root is `<expanded>/<agentId>/` (e.g. `.../workspace/main`). */\n workspace: z.string().default('~/.xopc/workspace'),\n model: z.union([\n z.string(),\n z.object({\n primary: z.string().optional(),\n fallbacks: z.array(z.string()).optional(),\n }).strict(),\n ]).default(''), // Empty default - will be resolved dynamically at runtime\n /** Vision / image understanding model (provider/model). Falls back to heuristics when unset. */\n imageModel: AgentModelRefSchema.optional(),\n /** Image generation model (provider/model), e.g. openai/gpt-image-1. Thin REST wrapper; OpenAI supported. */\n imageGenerationModel: AgentModelRefSchema.optional(),\n /** Max image size for image tool loads (MB). */\n mediaMaxMb: z.number().positive().optional(),\n maxTokens: z.number().default(8192),\n temperature: z.number().default(0.7),\n maxToolIterations: z.number().default(20),\n // Wall-clock limit for one user turn (LLM + tools). Default 30m if unset; cap 4h.\n maxTaskDurationMs: z.number().min(60000).max(14_400_000).optional(),\n // Reliability settings\n maxRequestsPerTurn: z.number().min(10).max(200).default(50),\n maxToolFailuresPerTurn: z.number().min(1).max(20).default(3),\n // Thinking ability settings\n thinkingDefault: z.enum(['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'adaptive']).optional(),\n reasoningDefault: z.enum(['off', 'on', 'stream']).optional(),\n verboseDefault: z.enum(['off', 'on', 'full']).optional(),\n compaction: z.object({\n enabled: z.boolean().default(true),\n mode: z.enum(['default', 'safeguard']).default('default'),\n reserveTokens: z.number().default(8000),\n triggerThreshold: z.number().min(0.5).max(0.95).default(0.8),\n minMessagesBeforeCompact: z.number().default(10),\n keepRecentMessages: z.number().default(5),\n // Dual-strategy compaction\n evictionWindow: z.number().min(0.1).max(0.5).default(0.2),\n retentionWindow: z.number().min(3).max(20).default(6),\n }).optional(),\n pruning: z.object({\n enabled: z.boolean().default(true),\n maxToolResultChars: z.number().default(10000),\n headKeepRatio: z.number().default(0.3),\n tailKeepRatio: z.number().default(0.3),\n }).optional(),\n /**\n * Curated memory (`agents/<id>/memories/`) + pluggable external provider.\n * Only one external provider at a time.\n */\n memory: z\n .object({\n /** Master switch: curated snapshot, `curated_memory`, prefetch, and external provider. Default true. */\n enabled: z.boolean().optional(),\n /** When false, use workspace bootstrap only (no curated snapshot / tool). Default true. */\n useEnhancedSystem: z.boolean().optional(),\n /** Include USER.md in snapshot. Default true. */\n userProfileEnabled: z.boolean().optional(),\n memoryCharLimit: z.number().positive().optional(),\n userCharLimit: z.number().positive().optional(),\n provider: z.enum(['none', 'stub']).optional(),\n /** How often prefetched external memory is injected into the user message. */\n injectionFrequency: z.enum(['every-turn', 'first-turn']).optional(),\n /** Inject prefetch on turns 1, 1+N, 1+2N, … (only when injectionFrequency is every-turn). Min 1. */\n contextCadence: z.number().int().min(1).optional(),\n /** Reserved for future external “dialectic” sync cadence (not wired yet). */\n dialecticCadence: z.number().int().min(1).optional(),\n /**\n * Background memory consolidation (\"dreaming\"): three-phase sleep model that\n * promotes short-term recall signals into long-term memory (`MEMORY.md`).\n *\n * Phases:\n * - **light** — fast, frequent sweep (default every 6 h): dedup + signal collection.\n * - **deep** — daily deep promotion (default 3 AM): score-gated write to MEMORY.md.\n * - **rem** — weekly pattern discovery (default Sun 5 AM): cross-session insight mining.\n */\n dreaming: z\n .object({\n enabled: z.boolean().optional(),\n /** Default deep-phase cron when `phases.deep.cron` is omitted. */\n frequency: z.string().optional(),\n timezone: z.string().optional(),\n phases: z\n .object({\n light: z\n .object({\n enabled: z.boolean().optional(),\n cron: z.string().optional(),\n lookbackDays: z.number().int().min(1).optional(),\n limit: z.number().int().min(0).optional(),\n dedupeSimilarity: z.number().min(0).max(1).optional(),\n })\n .optional(),\n deep: z\n .object({\n enabled: z.boolean().optional(),\n cron: z.string().optional(),\n minScore: z.number().min(0).max(1).optional(),\n minRecallCount: z.number().int().min(1).optional(),\n minUniqueQueries: z.number().int().min(1).optional(),\n limit: z.number().int().min(0).optional(),\n recencyHalfLifeDays: z.number().min(1).optional(),\n maxAgeDays: z.number().int().min(1).optional(),\n })\n .optional(),\n rem: z\n .object({\n enabled: z.boolean().optional(),\n cron: z.string().optional(),\n lookbackDays: z.number().int().min(1).optional(),\n limit: z.number().int().min(0).optional(),\n minPatternStrength: z.number().min(0).max(1).optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .optional(),\n /** Cross-session transcript search (`session_search` tool). */\n sessionSearch: z\n .object({\n /** Model ref for per-session summaries (e.g. openai/gpt-4o-mini). */\n summaryModel: z.string().optional(),\n })\n .optional(),\n /**\n * Post-turn background review (Hermes-style): optional quiet follow-up that may call\n * `curated_memory` / `skill_manage` so durable facts and reusable workflows persist\n * without bloating the main user-visible turn.\n */\n backgroundReview: z\n .object({\n /** When true, nudges may run after successful turns. Default false (opt-in). */\n enabled: z.boolean().optional(),\n /** User-turn cadence for memory review. 0 disables the memory channel. Default 10. */\n memoryNudgeInterval: z.number().int().min(0).optional(),\n /** LLM rounds without `skill_manage` before a skill review. 0 disables the skill channel. Default 10. */\n skillNudgeInterval: z.number().int().min(0).optional(),\n /** Max tool executions for the review agent. Default 8. */\n maxToolRounds: z.number().int().min(1).max(32).optional(),\n /** Max prior messages passed into the review context (tail). Default 80. */\n maxHistoryMessages: z.number().int().min(10).max(200).optional(),\n /** Wall-clock cap for the review run (ms). Default 120000. */\n maxDurationMs: z.number().int().min(30_000).max(600_000).optional(),\n })\n .optional(),\n /** LLM pass for `web_extract` (markdown-focused extraction). */\n webExtract: z\n .object({\n model: z.string().optional(),\n maxLength: z.number().positive().optional(),\n })\n .optional(),\n /**\n * Headless Playwright tools (`browser_*`). Opt-in. Install browsers once: `npx playwright install chromium`.\n */\n browser: z\n .object({\n enabled: z.boolean().optional(),\n /** Default true when browser tools are enabled. */\n headless: z.boolean().optional(),\n })\n .optional(),\n /** Sub-agent delegation (`delegate_task`). Opt-in. */\n delegate: z\n .object({\n enabled: z.boolean().optional(),\n })\n .optional(),\n /** Sandboxed `execute_code` (programmatic tool calls). Opt-in. */\n executeCode: z\n .object({\n enabled: z.boolean().optional(),\n })\n .optional(),\n /** Optional full system prompt replacement (merged with per-agent entry; entry wins). */\n systemPromptOverride: z.string().optional(),\n /** Optional allowlist of skill names for `<available_skills>`; when set, replaces unfiltered list. */\n skills: z.array(z.string()).optional(),\n /** Disable built-in tools by name (e.g. `shell`, `web_search`). */\n tools: z\n .object({\n disable: z.array(z.string()).optional(),\n })\n .optional(),\n /** Opaque per-process params (reserved for extensions / future use). */\n params: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const AgentConfigSchema = z.object({\n id: z.string(),\n /** When true, this entry is the default routing agent. */\n default: z.boolean().optional(),\n name: z.string().optional(),\n /** Short human-readable summary for UIs (gateway console, pickers). */\n description: z.string().max(4000).optional(),\n enabled: z.boolean().default(true),\n /** Per-agent workspace root (`~` expanded at runtime). */\n workspace: z.string().optional(),\n /**\n * Internal agent state directory (`…/credentials`, `agent.json`, pid, inbox).\n * Default: `<stateDir>/agents/<id>/agent`.\n */\n agentDir: z.string().optional(),\n model: AgentModelRefSchema.optional(),\n thinkingDefault: z.enum(['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'adaptive']).optional(),\n reasoningDefault: z.enum(['off', 'on', 'stream']).optional(),\n verboseDefault: z.enum(['off', 'on', 'full']).optional(),\n systemPromptOverride: z.string().optional(),\n skills: z.array(z.string()).optional(),\n tools: z\n .object({\n disable: z.array(z.string()).optional(),\n })\n .optional(),\n params: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const AgentsConfigSchema = z.object({\n /** Default agent id when not specified (routing / session creation). */\n default: z.string().optional(),\n defaults: AgentDefaultsSchema.optional(),\n list: z.array(AgentConfigSchema).optional(),\n}).default({\n defaults: {\n workspace: '~/.xopc/workspace',\n model: '', // Empty default - will be resolved dynamically at runtime\n maxTokens: 8192,\n temperature: 0.7,\n maxToolIterations: 20,\n maxRequestsPerTurn: 50,\n maxToolFailuresPerTurn: 3,\n thinkingDefault: 'medium',\n reasoningDefault: 'stream',\n verboseDefault: 'full',\n compaction: {\n enabled: true,\n mode: 'default',\n reserveTokens: 8000,\n triggerThreshold: 0.8,\n minMessagesBeforeCompact: 10,\n keepRecentMessages: 5,\n evictionWindow: 0.2,\n retentionWindow: 6,\n },\n pruning: {\n enabled: true,\n maxToolResultChars: 10000,\n headKeepRatio: 0.3,\n tailKeepRatio: 0.3,\n },\n },\n} as any);\n\n// ============================================\n// Channel Configs (per-channel Zod lives in bundled extensions; root schema is open)\n// ============================================\n\nexport {\n TelegramTopicConfigSchema,\n TelegramGroupConfigSchema,\n TelegramAccountConfigSchema,\n TelegramConfigSchema,\n} from '../../extensions/telegram/src/config-schema.js';\nexport type { TelegramConfig } from '../../extensions/telegram/src/config-schema.js';\nexport { WeixinAccountConfigSchema, WeixinConfigSchema } from '../../extensions/weixin/src/config-schema.js';\nexport type { WeixinConfig } from '../../extensions/weixin/src/config-schema.js';\n\n// ============================================\n// Session Routing Configuration\n// ============================================\n\nexport const BindingMatchSchema = z.object({\n channel: z.string(),\n accountId: z.string().optional(),\n peerKind: z.string().optional(),\n peerId: z.string().optional(),\n guildId: z.string().optional(),\n teamId: z.string().optional(),\n memberRoleIds: z.array(z.string()).optional(),\n});\n\nexport const BindingRuleSchema = z.object({\n id: z.string().optional(),\n agentId: z.string(),\n priority: z.number().default(100),\n match: BindingMatchSchema,\n enabled: z.boolean().default(true),\n});\n\nexport const BindingsConfigSchema = z.array(BindingRuleSchema).default([]);\n\nexport const SessionDmScopeSchema = z.enum([\n 'main',\n 'per-peer',\n 'per-channel-peer',\n 'per-account-channel-peer',\n]);\n\nexport const SessionStorageConfigSchema = z.object({\n pruneAfterMs: z.number().optional(),\n maxEntries: z.number().optional(),\n});\n\nexport const SessionConfigSchema = z.object({\n dmScope: SessionDmScopeSchema.default('main'),\n identityLinks: z.record(z.string(), z.array(z.string())).optional(),\n storage: SessionStorageConfigSchema.optional(),\n}).default({\n dmScope: 'main',\n});\n\n/** Channel buckets — shapes validated post-parse by registered channel plugins. */\nexport const ChannelsConfigSchema = z.record(z.string(), z.unknown()).default({\n telegram: {\n enabled: false,\n allowFrom: [],\n groupAllowFrom: [],\n debug: false,\n accounts: {\n default: {\n accountId: 'default',\n enabled: true,\n botToken: '',\n allowFrom: [],\n dmPolicy: 'pairing' as const,\n groupPolicy: 'open' as const,\n replyToMode: 'off' as const,\n historyLimit: 50,\n textChunkLimit: 4000,\n streamMode: 'partial' as const,\n },\n },\n dmPolicy: 'pairing' as const,\n groupPolicy: 'open' as const,\n replyToMode: 'off' as const,\n historyLimit: 50,\n textChunkLimit: 4000,\n },\n});\n\nexport const SearchProviderEntrySchema = z.object({\n type: z.enum(['brave', 'tavily', 'bing', 'searxng']),\n apiKey: z.string().optional(),\n /** SearXNG instance base URL (e.g. http://localhost:8080) */\n url: z.string().optional(),\n disabled: z.boolean().optional(),\n});\n\nexport type SearchProviderEntry = z.infer<typeof SearchProviderEntrySchema>;\n\nexport const WebSearchConfigSchema = z.object({\n maxResults: z.number().default(5),\n /** Ordered API providers; empty → HTML fallback only */\n providers: z.array(SearchProviderEntrySchema).default([]),\n});\n\nexport type WebSearchConfig = z.infer<typeof WebSearchConfigSchema>;\n\nexport const WebToolsConfigSchema = z.object({\n /** Search result HTML fallback: cn → Bing, otherwise DuckDuckGo */\n region: z.enum(['cn', 'global']).optional(),\n search: WebSearchConfigSchema.optional(),\n});\n\nexport type WebToolsConfig = z.infer<typeof WebToolsConfigSchema>;\n\nexport const ToolsConfigSchema = z.object({\n web: WebToolsConfigSchema.optional(),\n}).default({\n web: {\n search: {\n maxResults: 5,\n providers: [],\n },\n },\n});\n\n// ============================================\n// Gateway Configuration\n// ============================================\n\nexport const GatewayAuthRateLimitSchema = z\n .object({\n enabled: z.boolean().default(true),\n maxAttempts: z.number().int().min(1).default(5),\n windowMs: z.number().default(900_000),\n blockDurationMs: z.number().default(300_000),\n })\n .optional();\n\nexport const GatewayAuthSchema = z\n .object({\n mode: z.enum(['none', 'token', 'password']).default('token'),\n token: z.string().optional(),\n password: z.string().optional(),\n rateLimit: GatewayAuthRateLimitSchema,\n })\n .default({\n mode: 'token',\n });\n\nexport const HeartbeatConfigSchema = z\n .object({\n enabled: z.boolean(),\n intervalMs: z.number(),\n /** When false, heartbeat instructions are only sent during heartbeat polling turns (not in every chat system prompt). */\n includeSystemPromptSection: z.boolean().optional().default(false),\n target: z.string().optional(),\n targetChatId: z.string().optional(),\n prompt: z.string().optional(),\n ackMaxChars: z.number().optional(),\n isolatedSession: z.boolean().optional(),\n activeHours: z\n .object({\n start: z.string(),\n end: z.string(),\n timezone: z.string().optional(),\n })\n .optional(),\n })\n .default({\n enabled: true,\n intervalMs: 1_800_000,\n includeSystemPromptSection: false,\n });\n\nexport const GatewayConfigSchema = z.object({\n host: z.string().optional(),\n port: z.number().optional(),\n auth: GatewayAuthSchema.optional(),\n heartbeat: HeartbeatConfigSchema.optional(),\n maxSseConnections: z.number().optional(),\n corsOrigins: z.array(z.string()).optional(),\n /** Skills marketplace provider: `store` (store.xopc.ai) or `skillhub` (skillhub.cn). */\n skillsMarketplaceProvider: z.enum(['store', 'skillhub']).optional(),\n /** Base URL for the xopc skills marketplace (public REST API). */\n skillsStoreBaseUrl: z.string().url().optional(),\n}).default({\n host: '127.0.0.1',\n port: 18790,\n auth: {\n mode: 'token',\n },\n heartbeat: {\n enabled: true,\n intervalMs: 1_800_000,\n includeSystemPromptSection: false,\n },\n maxSseConnections: 100,\n corsOrigins: [],\n skillsMarketplaceProvider: 'skillhub',\n skillsStoreBaseUrl: 'https://store.xopc.ai',\n});\n\nexport const CronConfigSchema = z.object({\n enabled: z.boolean().optional(),\n maxConcurrentJobs: z.number().optional(),\n defaultTimezone: z.string().optional(),\n historyRetentionDays: z.number().optional(),\n enableMetrics: z.boolean().optional(),\n}).default({\n enabled: true,\n maxConcurrentJobs: 5,\n defaultTimezone: 'UTC',\n historyRetentionDays: 7,\n enableMetrics: true,\n});\n\nexport const ModelsDevConfigSchema = z.object({\n enabled: z.boolean().default(true),\n}).default({\n enabled: true,\n});\n\n// ============================================\n// STT (Speech-to-Text) Config\n// ============================================\n\nexport const STTProviderConfigSchema = z.object({\n apiKey: z.string().optional(),\n model: z.string().optional(),\n});\n\nexport const STTFallbackConfigSchema = z.object({\n enabled: z.boolean().default(true),\n order: z.array(z.enum(['alibaba', 'openai'])).default(['alibaba', 'openai']),\n});\n\nexport const STTConfigSchema = z.object({\n enabled: z.boolean().default(false),\n provider: z.enum(['alibaba', 'openai']).default('alibaba'),\n alibaba: STTProviderConfigSchema.optional(),\n openai: STTProviderConfigSchema.optional(),\n fallback: STTFallbackConfigSchema.optional(),\n});\n\n// ============================================\n// TTS (Text-to-Speech) Config\n// ============================================\n\nexport const TTSProviderConfigSchema = z.object({\n apiKey: z.string().optional(),\n model: z.string().optional(),\n voice: z.string().optional(),\n});\n\nexport const TTSFallbackConfigSchema = z.object({\n enabled: z.boolean().default(true),\n order: z\n .array(z.enum(['openai', 'alibaba', 'edge', 'minimax']))\n .default(['openai', 'alibaba', 'minimax', 'edge']),\n});\n\nexport const TTSModelOverridesConfigSchema = z.object({\n enabled: z.boolean().default(true),\n allowText: z.boolean().default(true),\n allowProvider: z.boolean().default(false),\n allowVoice: z.boolean().default(true),\n allowModelId: z.boolean().default(true),\n allowVoiceSettings: z.boolean().default(false),\n allowNormalization: z.boolean().default(false),\n allowSeed: z.boolean().default(false),\n});\n\nexport const TTSEdgeConfigSchema = z.object({\n enabled: z.boolean().default(true),\n voice: z.string().optional(),\n lang: z.string().optional(),\n outputFormat: z.string().optional(),\n pitch: z.string().optional(),\n rate: z.string().optional(),\n volume: z.string().optional(),\n proxy: z.string().optional(),\n timeoutMs: z.number().int().min(1000).max(120000).optional(),\n});\n\nexport const TTSSummarizationConfigSchema = z.object({\n enabled: z.boolean().optional(),\n targetLength: z.number().int().min(1).optional(),\n threshold: z.number().int().min(1).optional(),\n model: z.string().optional(),\n});\n\nexport const TTSConfigSchema = z.object({\n enabled: z.boolean().default(false),\n provider: z.enum(['openai', 'alibaba', 'edge', 'minimax']).default('openai'),\n trigger: z.enum(['off', 'always', 'inbound', 'tagged']).default('always'),\n fallback: TTSFallbackConfigSchema.optional(),\n maxTextLength: z.number().int().min(1).default(512), // Conservative default to accommodate all providers (Alibaba limit is 512)\n timeoutMs: z.number().int().min(1000).max(180000).default(60000),\n summarization: TTSSummarizationConfigSchema.optional(),\n modelOverrides: TTSModelOverridesConfigSchema.optional(),\n alibaba: TTSProviderConfigSchema.optional(),\n openai: TTSProviderConfigSchema.optional(),\n edge: TTSEdgeConfigSchema.optional(),\n minimax: TTSProviderConfigSchema.optional(),\n});\n\n// ============================================\n// Extension Configs \n// ============================================\n\n// Security config for extensions \nexport const ExtensionSecurityConfigSchema = z.object({\n checkPermissions: z.boolean().default(true),\n allowUntrusted: z.boolean().default(false),\n allow: z.array(z.string()).default([]),\n trackProvenance: z.boolean().default(true),\n allowPromptInjection: z.boolean().default(false),\n});\n\n// Slot config for extensions \nexport const ExtensionSlotsConfigSchema = z.object({\n memory: z.string().optional(),\n tts: z.string().optional(),\n imageGeneration: z.string().optional(),\n webSearch: z.string().optional(),\n});\n\n// Complete extensions config\n// Extension config allows both known fields AND arbitrary extension-specific config\n// Known fields: enabled (array), allow (array), security (object), slots (object)\n// Arbitrary: any other key is extension-specific config (e.g., extensions.hello.greeting)\nexport const ExtensionsConfigSchema: z.ZodType<Record<string, unknown>> = z.record(z.string(), z.unknown());\n\n// ============================================\n// Update Config\n// ============================================\n\nexport const UpdateAutoConfigSchema = z\n .object({\n /** Enable automatic update installation. Default false. */\n enabled: z.boolean().default(false),\n /** Hours to wait before applying a stable update after first detection. */\n stableDelayHours: z.number().min(0).default(6),\n /** Additional random jitter hours for stable rollout (avoids thundering herd). */\n stableJitterHours: z.number().min(0).default(12),\n /** How often to re-check for beta updates (hours). Min 0.25. */\n betaCheckIntervalHours: z.number().min(0.25).default(1),\n })\n .strict()\n .optional();\n\nexport const UpdateConfigSchema = z\n .object({\n /** Check for updates on gateway startup. Default true. */\n checkOnStart: z.boolean().default(true),\n /** Update channel: stable (default), beta, or dev. */\n channel: z.enum(['stable', 'beta', 'dev']).default('stable'),\n /** Automatic update policy. */\n auto: UpdateAutoConfigSchema,\n })\n .strict()\n .optional();\n\nexport type UpdateConfig = z.infer<typeof UpdateConfigSchema>;\n\n// ============================================\n// Root Config\n// ============================================\n\nexport const ConfigSchema = z.object({\n agents: AgentsConfigSchema,\n bindings: BindingsConfigSchema,\n session: SessionConfigSchema,\n channels: ChannelsConfigSchema,\n gateway: GatewayConfigSchema,\n tools: ToolsConfigSchema,\n cron: CronConfigSchema,\n extensions: ExtensionsConfigSchema.default({}),\n modelsDev: ModelsDevConfigSchema,\n stt: STTConfigSchema.optional(),\n tts: TTSConfigSchema.optional(),\n update: UpdateConfigSchema,\n}).default({\n agents: {\n defaults: {\n workspace: '~/.xopc/workspace',\n model: '', // Empty default - will be resolved dynamically at runtime\n maxTokens: 8192,\n temperature: 0.7,\n maxToolIterations: 20,\n maxRequestsPerTurn: 50,\n maxToolFailuresPerTurn: 3,\n thinkingDefault: 'medium',\n reasoningDefault: 'stream',\n verboseDefault: 'full',\n compaction: {\n enabled: true,\n mode: 'default',\n reserveTokens: 8000,\n triggerThreshold: 0.8,\n minMessagesBeforeCompact: 10,\n keepRecentMessages: 5,\n evictionWindow: 0.2,\n retentionWindow: 6,\n },\n pruning: {\n enabled: true,\n maxToolResultChars: 10000,\n headKeepRatio: 0.3,\n tailKeepRatio: 0.3,\n },\n },\n },\n bindings: [],\n session: {\n dmScope: 'main' as const,\n },\n channels: {\n telegram: {\n enabled: false,\n allowFrom: [],\n groupAllowFrom: [],\n debug: false,\n accounts: {\n default: {\n accountId: 'default',\n enabled: true,\n botToken: '',\n allowFrom: [],\n dmPolicy: 'pairing' as const,\n groupPolicy: 'open' as const,\n replyToMode: 'off' as const,\n historyLimit: 50,\n textChunkLimit: 4000,\n streamMode: 'partial' as const,\n },\n },\n dmPolicy: 'pairing' as const,\n groupPolicy: 'open' as const,\n replyToMode: 'off' as const,\n historyLimit: 50,\n textChunkLimit: 4000,\n },\n },\n gateway: {\n host: '127.0.0.1',\n port: 18790,\n auth: {\n mode: 'token',\n },\n heartbeat: {\n enabled: true,\n intervalMs: 1_800_000,\n includeSystemPromptSection: false,\n },\n maxSseConnections: 100,\n corsOrigins: [],\n skillsMarketplaceProvider: 'skillhub' as const,\n skillsStoreBaseUrl: 'https://store.xopc.ai',\n },\n tools: {\n web: {\n search: {\n maxResults: 5,\n providers: [],\n },\n },\n },\n cron: {\n enabled: true,\n maxConcurrentJobs: 5,\n defaultTimezone: 'UTC',\n historyRetentionDays: 7,\n enableMetrics: true,\n },\n extensions: {\n allow: [],\n security: {\n checkPermissions: true,\n allowUntrusted: false,\n allow: [],\n trackProvenance: true,\n allowPromptInjection: false,\n },\n slots: {},\n },\n modelsDev: {\n enabled: true,\n },\n stt: {\n enabled: false,\n provider: 'alibaba',\n alibaba: {\n model: 'paraformer-v2',\n },\n openai: {\n model: 'whisper-1',\n },\n fallback: {\n enabled: true,\n order: ['alibaba', 'openai'],\n },\n },\n tts: {\n enabled: false,\n provider: 'openai',\n trigger: 'always',\n fallback: {\n enabled: true,\n order: ['openai', 'alibaba', 'minimax', 'edge'],\n },\n maxTextLength: 4096,\n timeoutMs: 30000,\n modelOverrides: {\n enabled: true,\n allowText: true,\n allowProvider: false,\n allowVoice: true,\n allowModelId: true,\n allowVoiceSettings: false,\n allowNormalization: false,\n allowSeed: false,\n },\n alibaba: {\n model: 'qwen-tts',\n voice: 'Cherry',\n },\n openai: {\n model: 'tts-1',\n voice: 'alloy',\n },\n edge: {\n enabled: true,\n voice: 'en-US-MichelleNeural',\n lang: 'en-US',\n outputFormat: 'audio-24khz-48kbitrate-mono-mp3',\n },\n minimax: {\n model: 'speech-2.8-hd',\n voice: 'male-qn-qingse',\n },\n },\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\nexport type AgentDefaults = z.infer<typeof AgentDefaultsSchema>;\nexport type GatewayAuthConfig = z.infer<typeof GatewayAuthSchema>;\nexport type GatewayAuthRateLimitConfig = z.infer<typeof GatewayAuthRateLimitSchema>;\nexport type STTConfig = z.infer<typeof STTConfigSchema>;\nexport type TTSConfig = z.infer<typeof TTSConfigSchema>;\n\n// ============================================\n// Helper Functions\n// ============================================\n\n/**\n * Parse a model reference string.\n */\nexport interface ParsedModelRef {\n provider: string;\n model: string;\n}\n\n/**\n * Default agent’s resolved Markdown workspace root (`resolveAgentWorkspaceDir` for the default agent id).\n */\nexport function getWorkspacePath(config: Config): string {\n return getDefaultWorkspacePath(config);\n}\n\n/**\n * Primary model ref from `agents.defaults.model` (string or `{ primary }`).\n * Returns undefined when unset or empty.\n */\nexport function getAgentDefaultModelRef(config: Config): string | undefined {\n const raw = config.agents?.defaults?.model;\n if (raw === undefined || raw === null) return undefined;\n const ref = typeof raw === 'string' ? raw : raw.primary;\n if (ref === undefined || ref === null) return undefined;\n const s = String(ref).trim();\n return s ? s : undefined;\n}\n\n/** `provider/model` or null when invalid. */\nexport function parseModelRef(ref: string): ParsedModelRef | null {\n const trimmed = ref.trim();\n const idx = trimmed.indexOf('/');\n if (idx <= 0 || idx === trimmed.length - 1) {\n return null;\n }\n return { provider: trimmed.slice(0, idx).trim(), model: trimmed.slice(idx + 1).trim() };\n}\n"],"mappings":"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"}
|
|
@@ -49,9 +49,7 @@ export declare class CronPersistence {
|
|
|
49
49
|
* Remove a job
|
|
50
50
|
*/
|
|
51
51
|
removeJob(id: string): Promise<boolean>;
|
|
52
|
-
/**
|
|
53
|
-
* Atomic write to disk (write to temp file, then rename)
|
|
54
|
-
*/
|
|
52
|
+
/** Atomic write (fsync + rename) via shared helper. */
|
|
55
53
|
private writeToDisk;
|
|
56
54
|
/**
|
|
57
55
|
* Mark cache as dirty and schedule debounced save
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
+
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
3
4
|
import { JobDataSchema } from "./validation.js";
|
|
4
|
-
import {
|
|
5
|
-
import { access, mkdir, readFile, rename, unlink, writeFile } from "fs/promises";
|
|
5
|
+
import { access, readFile } from "fs/promises";
|
|
6
6
|
//#region src/cron/persistence.ts
|
|
7
|
+
init_write_file_atomic();
|
|
7
8
|
init_logger();
|
|
8
9
|
const log = createLogger("CronPersistence");
|
|
9
10
|
const DEFAULT_JOBS_FILE = {
|
|
@@ -147,22 +148,10 @@ var CronPersistence = class {
|
|
|
147
148
|
await this.save(data);
|
|
148
149
|
return true;
|
|
149
150
|
}
|
|
150
|
-
/**
|
|
151
|
-
* Atomic write to disk (write to temp file, then rename)
|
|
152
|
-
*/
|
|
151
|
+
/** Atomic write (fsync + rename) via shared helper. */
|
|
153
152
|
async writeToDisk(data) {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
await mkdir(dirname(this.filePath), { recursive: true });
|
|
157
|
-
await writeFile(tempPath, JSON.stringify(data, null, 2), "utf-8");
|
|
158
|
-
await rename(tempPath, this.filePath);
|
|
159
|
-
log.debug({ jobCount: data.jobs.length }, "Jobs saved to disk");
|
|
160
|
-
} catch (error) {
|
|
161
|
-
try {
|
|
162
|
-
await unlink(tempPath);
|
|
163
|
-
} catch {}
|
|
164
|
-
throw error;
|
|
165
|
-
}
|
|
153
|
+
await writeTextAtomic(this.filePath, JSON.stringify(data, null, 2));
|
|
154
|
+
log.debug({ jobCount: data.jobs.length }, "Jobs saved to disk");
|
|
166
155
|
}
|
|
167
156
|
/**
|
|
168
157
|
* Mark cache as dirty and schedule debounced save
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.js","names":[],"sources":["../../../src/cron/persistence.ts"],"sourcesContent":["// Cron persistence layer with atomic writes and caching\nimport {
|
|
1
|
+
{"version":3,"file":"persistence.js","names":[],"sources":["../../../src/cron/persistence.ts"],"sourcesContent":["// Cron persistence layer with atomic writes and caching\nimport { readFile, access } from 'fs/promises';\nimport { writeTextAtomic } from '../infra/write-file-atomic.js';\nimport { createLogger } from '../utils/logger.js';\nimport type { JobData } from './types.js';\nimport { JobDataSchema } from './validation.js';\n\nconst log = createLogger('CronPersistence');\n\nexport interface JobsFile {\n jobs: JobData[];\n version: number;\n}\n\nconst DEFAULT_JOBS_FILE: JobsFile = {\n jobs: [],\n version: 1,\n};\n\nexport class CronPersistence {\n private filePath: string;\n private cache: JobsFile | null = null;\n private dirty = false;\n private saveTimeout: ReturnType<typeof setTimeout> | null = null;\n private readonly debounceMs = 500; // Debounce saves\n\n constructor(filePath: string) {\n this.filePath = filePath;\n }\n\n /**\n * Initialize the storage file\n */\n async initialize(): Promise<void> {\n try {\n await access(this.filePath);\n // File exists, load it\n await this.load();\n } catch {\n // File doesn't exist, create it\n await this.save(DEFAULT_JOBS_FILE);\n log.info({ path: this.filePath }, 'Created new jobs file');\n }\n }\n\n /**\n * Load jobs from disk (with caching)\n */\n async load(): Promise<JobsFile> {\n // Return cache if available\n if (this.cache) {\n return this.cache;\n }\n\n try {\n const content = await readFile(this.filePath, 'utf-8');\n const data = JSON.parse(content) as JobsFile;\n \n // Validate basic structure\n if (!data.jobs || !Array.isArray(data.jobs)) {\n log.warn({ path: this.filePath }, 'Cron jobs file invalid (missing jobs[]), resetting to empty');\n this.cache = DEFAULT_JOBS_FILE;\n return this.cache;\n }\n\n const valid: JobData[] = [];\n for (const j of data.jobs) {\n const r = JobDataSchema.safeParse(j);\n if (r.success) {\n valid.push(r.data as JobData);\n } else {\n log.warn(\n { jobId: (j as { id?: string }).id, issues: r.error.flatten() },\n 'Dropped invalid cron job'\n );\n }\n }\n\n if (valid.length !== data.jobs.length) {\n data.jobs = valid;\n data.version = (data.version ?? 1) + 1;\n this.cache = data;\n await this.writeToDisk(data);\n this.dirty = false;\n log.info({ count: valid.length }, 'Persisted cron jobs after validation');\n return data;\n }\n\n this.cache = data;\n log.debug({ jobCount: data.jobs.length }, 'Loaded jobs from disk');\n return data;\n } catch (error) {\n const em = error instanceof Error ? error.message : String(error);\n log.error({ err: error, path: this.filePath, errorMessage: em }, `Failed to load cron jobs file: ${em}`);\n this.cache = DEFAULT_JOBS_FILE;\n return this.cache;\n }\n }\n\n /**\n * Save jobs to disk (debounced)\n */\n async save(data: JobsFile): Promise<void> {\n this.cache = data;\n this.markDirty();\n }\n\n /**\n * Force immediate save (sync to disk)\n */\n async flush(): Promise<void> {\n if (!this.dirty || !this.cache) {\n return;\n }\n\n // Clear any pending debounced save\n if (this.saveTimeout) {\n clearTimeout(this.saveTimeout);\n this.saveTimeout = null;\n }\n\n await this.writeToDisk(this.cache);\n this.dirty = false;\n }\n\n /**\n * Get all jobs\n */\n async getJobs(): Promise<JobData[]> {\n const data = await this.load();\n return data.jobs;\n }\n\n /**\n * Get a single job by ID\n */\n async getJob(id: string): Promise<JobData | null> {\n const jobs = await this.getJobs();\n return jobs.find((j) => j.id === id) || null;\n }\n\n /**\n * Add a new job\n */\n async addJob(job: JobData): Promise<void> {\n const data = await this.load();\n data.jobs.push(job);\n data.version++;\n await this.save(data);\n }\n\n /**\n * Update an existing job\n */\n async updateJob(\n id: string,\n updates: Partial<JobData>,\n options?: { clearAgentId?: boolean; clearWorkingDirectory?: boolean },\n ): Promise<boolean> {\n const data = await this.load();\n const index = data.jobs.findIndex((j) => j.id === id);\n \n if (index === -1) return false;\n\n const merged: JobData = {\n ...data.jobs[index],\n ...updates,\n updated_at: new Date().toISOString(),\n };\n if (options?.clearAgentId) {\n delete merged.agentId;\n }\n if (options?.clearWorkingDirectory) {\n delete merged.workingDirectory;\n }\n data.jobs[index] = merged;\n data.version++;\n await this.save(data);\n return true;\n }\n\n /**\n * Remove a job\n */\n async removeJob(id: string): Promise<boolean> {\n const data = await this.load();\n const initialLength = data.jobs.length;\n data.jobs = data.jobs.filter((j) => j.id !== id);\n \n if (data.jobs.length === initialLength) return false;\n\n data.version++;\n await this.save(data);\n return true;\n }\n\n /** Atomic write (fsync + rename) via shared helper. */\n private async writeToDisk(data: JobsFile): Promise<void> {\n await writeTextAtomic(this.filePath, JSON.stringify(data, null, 2));\n log.debug({ jobCount: data.jobs.length }, 'Jobs saved to disk');\n }\n\n /**\n * Mark cache as dirty and schedule debounced save\n */\n private markDirty(): void {\n this.dirty = true;\n\n // Debounce saves\n if (this.saveTimeout) {\n clearTimeout(this.saveTimeout);\n }\n\n this.saveTimeout = setTimeout(() => {\n this.flush().catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.error({ err, path: this.filePath, errorMessage: em }, `Failed to save cron jobs file: ${em}`);\n });\n }, this.debounceMs);\n }\n\n /**\n * Clear cache (useful for testing)\n */\n clearCache(): void {\n this.cache = null;\n this.dirty = false;\n if (this.saveTimeout) {\n clearTimeout(this.saveTimeout);\n this.saveTimeout = null;\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -95,7 +95,7 @@ const JobDataSchema = z.object({
|
|
|
95
95
|
});
|
|
96
96
|
}).optional(),
|
|
97
97
|
maxRetries: z.number().int().min(0).max(10).default(3),
|
|
98
|
-
timeout: z.number().int().min(1e3).max(3e5).default(
|
|
98
|
+
timeout: z.number().int().min(1e3).max(3e5).default(18e4),
|
|
99
99
|
created_at: z.string().datetime(),
|
|
100
100
|
updated_at: z.string().datetime(),
|
|
101
101
|
sessionTarget: z.enum(["main", "isolated"]).optional(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","names":[],"sources":["../../../src/cron/validation.ts"],"sourcesContent":["// Cron input validation using Zod\nimport { z } from 'zod';\nimport nodeCron from 'node-cron';\n\n// Custom cron validation\nconst cronExpression = z.string().superRefine((val, ctx) => {\n if (!nodeCron.validate(val)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Invalid cron expression: ${val}`,\n });\n }\n});\n\n// Valid timezones (subset of IANA timezones)\nconst validTimezones = [\n 'UTC',\n 'America/New_York',\n 'America/Chicago',\n 'America/Denver',\n 'America/Los_Angeles',\n 'America/Toronto',\n 'Europe/London',\n 'Europe/Paris',\n 'Europe/Berlin',\n 'Europe/Moscow',\n 'Asia/Tokyo',\n 'Asia/Shanghai',\n 'Asia/Hong_Kong',\n 'Asia/Singapore',\n 'Asia/Seoul',\n 'Asia/Dubai',\n 'Asia/Mumbai',\n 'Australia/Sydney',\n 'Pacific/Auckland',\n];\n\nconst CronDeliveryMode = z.enum(['none', 'announce', 'direct']);\n\n/** Treat `''` / `null` / whitespace-only as absent so optional fields do not fail `.min(1)` */\nfunction optionalTrimmedString(max: number, min = 1) {\n return z.preprocess((v) => {\n if (v === null || v === undefined) return undefined;\n if (typeof v !== 'string') return v;\n const t = v.trim();\n return t.length === 0 ? undefined : t;\n }, z.string().min(min).max(max).optional());\n}\n\n/** Optional agent id on create; empty string → undefined. */\nconst optionalJobAgentId = optionalTrimmedString(64, 1);\n\n/** Optional absolute workspace path on create; empty string → undefined. */\nconst optionalJobWorkingDirectory = optionalTrimmedString(4096, 1);\n\n/**\n * PATCH: set string, or `null` / empty to clear `workingDirectory` on the job.\n */\nconst patchJobWorkingDirectory = z.preprocess((v) => {\n if (v === null) return null;\n if (v === undefined) return undefined;\n if (typeof v !== 'string') return v;\n const t = v.trim();\n return t.length === 0 ? null : t;\n}, z.union([z.string().min(1).max(4096), z.null()]).optional());\n\n/**\n * PATCH: set string, or `null` / empty to clear `agentId` on the job.\n */\nconst patchJobAgentId = z.preprocess((v) => {\n if (v === null) return null;\n if (v === undefined) return undefined;\n if (typeof v !== 'string') return v;\n const t = v.trim();\n return t.length === 0 ? null : t;\n}, z.union([z.string().min(1).max(64), z.null()]).optional());\n\n// CronPayload validation\nconst CronSystemEventPayloadSchema = z.object({\n kind: z.literal('systemEvent'),\n text: z.string().min(1).max(50000),\n});\n\nconst CronAgentTurnPayloadSchema = z.object({\n kind: z.literal('agentTurn'),\n message: z.string().min(1).max(50000),\n model: optionalTrimmedString(100, 1),\n timeoutSeconds: z.number().int().min(10).max(3600).optional(),\n});\n\nconst CronPayloadSchema = z.union([\n CronSystemEventPayloadSchema,\n CronAgentTurnPayloadSchema,\n]);\n\n// CronDelivery validation — channel must match gateway UI / message bus ids (telegram, weixin, cli, local, …)\nconst CronDeliverySchema = z.object({\n mode: CronDeliveryMode.default('none'),\n channel: optionalTrimmedString(32, 1),\n to: z.preprocess(\n (v) => (v === '' || v === null || v === undefined ? undefined : v),\n z.string().max(100).optional(),\n ),\n bestEffort: z.boolean().optional(),\n});\n\nexport const JobDataSchema = z\n .object({\n id: z.string().min(1).max(32),\n name: z.string().max(100).optional(),\n schedule: cronExpression,\n enabled: z.boolean(),\n timezone: z.string().superRefine((val, ctx) => {\n if (val && !validTimezones.includes(val)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Invalid timezone: ${val}. Use IANA timezone names.`,\n });\n }\n }).optional(),\n maxRetries: z.number().int().min(0).max(10).default(3),\n timeout: z.number().int().min(1000).max(300000).default(
|
|
1
|
+
{"version":3,"file":"validation.js","names":[],"sources":["../../../src/cron/validation.ts"],"sourcesContent":["// Cron input validation using Zod\nimport { z } from 'zod';\nimport nodeCron from 'node-cron';\n\n// Custom cron validation\nconst cronExpression = z.string().superRefine((val, ctx) => {\n if (!nodeCron.validate(val)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Invalid cron expression: ${val}`,\n });\n }\n});\n\n// Valid timezones (subset of IANA timezones)\nconst validTimezones = [\n 'UTC',\n 'America/New_York',\n 'America/Chicago',\n 'America/Denver',\n 'America/Los_Angeles',\n 'America/Toronto',\n 'Europe/London',\n 'Europe/Paris',\n 'Europe/Berlin',\n 'Europe/Moscow',\n 'Asia/Tokyo',\n 'Asia/Shanghai',\n 'Asia/Hong_Kong',\n 'Asia/Singapore',\n 'Asia/Seoul',\n 'Asia/Dubai',\n 'Asia/Mumbai',\n 'Australia/Sydney',\n 'Pacific/Auckland',\n];\n\nconst CronDeliveryMode = z.enum(['none', 'announce', 'direct']);\n\n/** Treat `''` / `null` / whitespace-only as absent so optional fields do not fail `.min(1)` */\nfunction optionalTrimmedString(max: number, min = 1) {\n return z.preprocess((v) => {\n if (v === null || v === undefined) return undefined;\n if (typeof v !== 'string') return v;\n const t = v.trim();\n return t.length === 0 ? undefined : t;\n }, z.string().min(min).max(max).optional());\n}\n\n/** Optional agent id on create; empty string → undefined. */\nconst optionalJobAgentId = optionalTrimmedString(64, 1);\n\n/** Optional absolute workspace path on create; empty string → undefined. */\nconst optionalJobWorkingDirectory = optionalTrimmedString(4096, 1);\n\n/**\n * PATCH: set string, or `null` / empty to clear `workingDirectory` on the job.\n */\nconst patchJobWorkingDirectory = z.preprocess((v) => {\n if (v === null) return null;\n if (v === undefined) return undefined;\n if (typeof v !== 'string') return v;\n const t = v.trim();\n return t.length === 0 ? null : t;\n}, z.union([z.string().min(1).max(4096), z.null()]).optional());\n\n/**\n * PATCH: set string, or `null` / empty to clear `agentId` on the job.\n */\nconst patchJobAgentId = z.preprocess((v) => {\n if (v === null) return null;\n if (v === undefined) return undefined;\n if (typeof v !== 'string') return v;\n const t = v.trim();\n return t.length === 0 ? null : t;\n}, z.union([z.string().min(1).max(64), z.null()]).optional());\n\n// CronPayload validation\nconst CronSystemEventPayloadSchema = z.object({\n kind: z.literal('systemEvent'),\n text: z.string().min(1).max(50000),\n});\n\nconst CronAgentTurnPayloadSchema = z.object({\n kind: z.literal('agentTurn'),\n message: z.string().min(1).max(50000),\n model: optionalTrimmedString(100, 1),\n timeoutSeconds: z.number().int().min(10).max(3600).optional(),\n});\n\nconst CronPayloadSchema = z.union([\n CronSystemEventPayloadSchema,\n CronAgentTurnPayloadSchema,\n]);\n\n// CronDelivery validation — channel must match gateway UI / message bus ids (telegram, weixin, cli, local, …)\nconst CronDeliverySchema = z.object({\n mode: CronDeliveryMode.default('none'),\n channel: optionalTrimmedString(32, 1),\n to: z.preprocess(\n (v) => (v === '' || v === null || v === undefined ? undefined : v),\n z.string().max(100).optional(),\n ),\n bestEffort: z.boolean().optional(),\n});\n\nexport const JobDataSchema = z\n .object({\n id: z.string().min(1).max(32),\n name: z.string().max(100).optional(),\n schedule: cronExpression,\n enabled: z.boolean(),\n timezone: z.string().superRefine((val, ctx) => {\n if (val && !validTimezones.includes(val)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Invalid timezone: ${val}. Use IANA timezone names.`,\n });\n }\n }).optional(),\n maxRetries: z.number().int().min(0).max(10).default(3),\n timeout: z.number().int().min(1000).max(300000).default(180000),\n created_at: z.string().datetime(),\n updated_at: z.string().datetime(),\n sessionTarget: z.enum(['main', 'isolated']).optional(),\n agentId: optionalTrimmedString(64, 1),\n workingDirectory: optionalJobWorkingDirectory,\n payload: CronPayloadSchema,\n delivery: CronDeliverySchema.optional(),\n model: optionalTrimmedString(100, 1),\n state: z.any().optional(),\n })\n .strict();\n\nexport const AddJobRequestSchema = z.object({\n schedule: cronExpression,\n name: z.string().max(100).optional(),\n timezone: z.string().optional(),\n maxRetries: z.number().int().min(0).max(10).optional(),\n timeout: z.number().int().min(1000).max(300000).optional(),\n sessionTarget: z.enum(['main', 'isolated']).optional(),\n agentId: optionalJobAgentId,\n workingDirectory: optionalJobWorkingDirectory,\n payload: CronPayloadSchema,\n delivery: CronDeliverySchema.optional(),\n model: optionalTrimmedString(100, 1),\n});\n\nexport const UpdateJobRequestSchema = z.object({\n name: z.string().max(100).optional(),\n schedule: cronExpression.optional(),\n timezone: z.string().optional(),\n maxRetries: z.number().int().min(0).max(10).optional(),\n timeout: z.number().int().min(1000).max(300000).optional(),\n enabled: z.boolean().optional(),\n sessionTarget: z.enum(['main', 'isolated']).optional(),\n agentId: patchJobAgentId,\n workingDirectory: patchJobWorkingDirectory,\n payload: CronPayloadSchema.optional(),\n delivery: CronDeliverySchema.optional(),\n model: optionalTrimmedString(100, 1),\n}).refine(\n (data) => Object.keys(data).length > 0,\n { message: 'At least one field must be provided for update' }\n);\n\nexport type ValidatedJobData = z.infer<typeof JobDataSchema>;\nexport type ValidatedAddJobRequest = z.infer<typeof AddJobRequestSchema>;\nexport type ValidatedUpdateJobRequest = z.infer<typeof UpdateJobRequestSchema>;\nexport type ValidatedCronPayload = z.infer<typeof CronPayloadSchema>;\nexport type ValidatedCronDelivery = z.infer<typeof CronDeliverySchema>;\n\n// Re-export common validation helpers\nexport { cronExpression };\n"],"mappings":"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"}
|
|
@@ -5,7 +5,6 @@ function isRecord(x) {
|
|
|
5
5
|
function telegramConfigured(ch) {
|
|
6
6
|
if (!ch) return false;
|
|
7
7
|
if (ch.enabled === true) return true;
|
|
8
|
-
if (typeof ch.botToken === "string" && ch.botToken.trim().length > 0) return true;
|
|
9
8
|
const accounts = ch.accounts;
|
|
10
9
|
if (isRecord(accounts)) for (const acc of Object.values(accounts)) {
|
|
11
10
|
if (!isRecord(acc)) continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activation-context.js","names":["root"],"sources":["../../../src/extensions/activation-context.ts"],"sourcesContent":["/**\n * Build ActivationContext from app config + optional overrides.\n */\n\nimport type { Config } from '../config/config-surface.js';\nimport type { ActivationContext } from './activation-planner.js';\n\nfunction isRecord(x: unknown): x is Record<string, unknown> {\n return typeof x === 'object' && x !== null && !Array.isArray(x);\n}\n\nfunction telegramConfigured(ch: Record<string, unknown> | undefined): boolean {\n if (!ch) return false;\n if (ch.enabled === true) return true;\n
|
|
1
|
+
{"version":3,"file":"activation-context.js","names":["root"],"sources":["../../../src/extensions/activation-context.ts"],"sourcesContent":["/**\n * Build ActivationContext from app config + optional overrides.\n */\n\nimport type { Config } from '../config/config-surface.js';\nimport type { ActivationContext } from './activation-planner.js';\n\nfunction isRecord(x: unknown): x is Record<string, unknown> {\n return typeof x === 'object' && x !== null && !Array.isArray(x);\n}\n\nfunction telegramConfigured(ch: Record<string, unknown> | undefined): boolean {\n if (!ch) return false;\n if (ch.enabled === true) return true;\n const accounts = ch.accounts;\n if (isRecord(accounts)) {\n for (const acc of Object.values(accounts)) {\n if (!isRecord(acc)) continue;\n if (acc.enabled === false) continue;\n if (typeof acc.botToken === 'string' && acc.botToken.trim().length > 0) return true;\n }\n }\n return false;\n}\n\nfunction weixinConfigured(ch: Record<string, unknown> | undefined): boolean {\n if (!ch) return false;\n if (ch.enabled === true) return true;\n const accounts = ch.accounts;\n if (isRecord(accounts) && Object.keys(accounts).length > 0) {\n for (const acc of Object.values(accounts)) {\n if (isRecord(acc) && acc.enabled === false) continue;\n return true;\n }\n }\n return false;\n}\n\n/**\n * Derive configured channel plugin ids from `channels.*` config.\n */\nexport function collectConfiguredChannelIds(config: unknown): string[] | undefined {\n const root = config as Record<string, unknown> | undefined;\n const channels = root?.channels;\n if (!isRecord(channels)) return undefined;\n\n const ids: string[] = [];\n\n if (telegramConfigured(channels.telegram as Record<string, unknown> | undefined)) {\n ids.push('telegram');\n }\n if (weixinConfigured(channels.weixin as Record<string, unknown> | undefined)) {\n ids.push('weixin');\n }\n\n for (const [key, value] of Object.entries(channels)) {\n if (key === 'telegram' || key === 'weixin') continue;\n if (isRecord(value) && value.enabled === true && !ids.includes(key)) {\n ids.push(key);\n }\n }\n\n return ids.length ? ids : undefined;\n}\n\n/**\n * Derive configured LLM provider ids when present on config (e.g. custom keys block).\n */\nexport function collectConfiguredProviderIds(config: unknown): string[] | undefined {\n const root = config as Record<string, unknown> | undefined;\n const providers = root?.providers;\n if (!isRecord(providers)) return undefined;\n const ids = Object.keys(providers).filter((k) => {\n const v = providers[k];\n if (!isRecord(v)) return false;\n return (\n (typeof v.apiKey === 'string' && v.apiKey.length > 0) ||\n (typeof v.api_key === 'string' && v.api_key.length > 0) ||\n v.enabled === true\n );\n });\n return ids.length ? ids : undefined;\n}\n\nfunction defaultModelId(config: unknown): string | undefined {\n const root = config as Record<string, unknown> | undefined;\n const agents = root?.agents;\n if (!isRecord(agents)) return undefined;\n const defaults = agents.defaults;\n if (!isRecord(defaults)) return undefined;\n const model = defaults.model;\n if (typeof model === 'string' && model.trim().length > 0) return model;\n if (isRecord(model)) {\n const primary = model.primary;\n if (typeof primary === 'string' && primary.trim().length > 0) return primary;\n }\n return undefined;\n}\n\n/**\n * Merge partial activation context over values inferred from loaded app config.\n */\nexport function mergeActivationContext(\n appConfig: Config | Record<string, unknown> | undefined,\n partial?: Partial<ActivationContext>,\n): ActivationContext {\n const ext = appConfig && isRecord((appConfig as Record<string, unknown>).extensions)\n ? ((appConfig as Record<string, unknown>).extensions as Record<string, unknown>)\n : undefined;\n\n const base: ActivationContext = {\n enabledIds: Array.isArray(ext?.enabled)\n ? ext!.enabled.filter((x): x is string => typeof x === 'string')\n : undefined,\n disabledIds: Array.isArray(ext?.disabled)\n ? ext!.disabled.filter((x): x is string => typeof x === 'string')\n : undefined,\n requestedModelId: defaultModelId(appConfig),\n configuredProviderIds: collectConfiguredProviderIds(appConfig),\n configuredChannelIds: collectConfiguredChannelIds(appConfig),\n env: process.env,\n };\n\n return {\n env: partial?.env ?? base.env,\n enabledIds: partial?.enabledIds !== undefined ? partial.enabledIds : base.enabledIds,\n disabledIds: partial?.disabledIds !== undefined ? partial.disabledIds : base.disabledIds,\n requestedModelId:\n partial?.requestedModelId !== undefined ? partial.requestedModelId : base.requestedModelId,\n configuredProviderIds:\n partial?.configuredProviderIds !== undefined\n ? partial.configuredProviderIds\n : base.configuredProviderIds,\n configuredChannelIds:\n partial?.configuredChannelIds !== undefined\n ? partial.configuredChannelIds\n : base.configuredChannelIds,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
3
|
import { init_paths, resolveExtensionsDir, resolveExtensionsLockPath } from "../config/paths.js";
|
|
4
|
+
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
4
5
|
import { dirname, join } from "path";
|
|
5
6
|
import { existsSync } from "fs";
|
|
6
|
-
import { mkdir, readFile
|
|
7
|
+
import { mkdir, readFile } from "fs/promises";
|
|
7
8
|
import { createHash } from "crypto";
|
|
8
9
|
//#region src/extensions/lockfile.ts
|
|
10
|
+
init_write_file_atomic();
|
|
9
11
|
init_logger();
|
|
10
12
|
init_paths();
|
|
11
13
|
const log = createLogger("ExtensionLockfile");
|
|
@@ -47,7 +49,7 @@ var ExtensionLockfileManager = class {
|
|
|
47
49
|
async save(data) {
|
|
48
50
|
data.lastUpdated = (/* @__PURE__ */ new Date()).toISOString();
|
|
49
51
|
await mkdir(dirname(this.lockfilePath), { recursive: true });
|
|
50
|
-
await
|
|
52
|
+
await writeTextAtomic(this.lockfilePath, JSON.stringify(data, null, 2));
|
|
51
53
|
log.debug("Lockfile saved");
|
|
52
54
|
}
|
|
53
55
|
/**
|