@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-direct-streaming.js","names":["msgEvent"],"sources":["../../../../src/agent/service/process-direct-streaming.ts"],"sourcesContent":["import type { AgentEvent, AgentMessage } from '@mariozechner/pi-agent-core';\n\nimport type { Config } from '../../config/schema.js';\nimport type { InternalAttachmentRoots } from '../../channels/attachments/inbound-persist.js';\nimport { commandRegistry } from '../../chat-commands/index.js';\nimport { parseSlashCommand } from '../../chat-commands/command-parse.js';\nimport {\n mergeVoiceTranscriptsIntoUserText,\n mergeSttConfigFromAppConfig,\n} from '../../channels/attachments/voice-stt-webchat.js';\nimport {\n resolveEffectiveReasoningLevel,\n type SessionConfigStore,\n type SessionStore,\n} from '../../session/index.js';\nimport type { SessionContext } from '../session/index.js';\nimport {\n extractTextContent,\n extractThinkingContent,\n extractThinkingFromAssistantMessage,\n} from '../context/workspace.js';\nimport { extractAgentUserPlainText } from '../memory/user-message-text.js';\nimport { runAgentTurnWithModelFallbacks } from '../orchestration/run-agent-turn-with-fallbacks.js';\nimport { applyReasoningVisibilityToSseEvent } from '../streaming/reasoning-visibility-sse.js';\nimport type { ReasoningLevel } from '../transcript/thinking-types.js';\nimport { serializeAgentToolResultForSse } from '../service-inbound-utils.js';\nimport type { AgentManager } from '../agent-manager.js';\nimport type { AgentEventHandler } from '../orchestration/agent-event-handler.js';\nimport type { AgentOrchestrator } from '../orchestration/agent-orchestrator.js';\nimport type { CommandHandler } from '../messaging/command-handler.js';\nimport type { ModelManager } from '../models/index.js';\n\nexport type DirectStreamInboundAttachment = {\n type: string;\n mimeType?: string;\n data?: string;\n name?: string;\n size?: number;\n workspaceRelativePath?: string;\n};\n\n/** Logger shape expected by {@link runAgentTurnWithModelFallbacks}. */\nexport type ProcessDirectStreamLog = {\n info: (obj: Record<string, unknown>, msg: string) => void;\n warn: (obj: Record<string, unknown>, msg: string) => void;\n debug?: (obj: Record<string, unknown>, msg: string) => void;\n};\n\n/**\n * Explicit collaborators for {@link runProcessDirectStreaming} (gateway webchat / CLI direct stream).\n * Bound by `AgentService` from its private fields and methods.\n */\nexport interface ProcessDirectStreamingDeps {\n log: ProcessDirectStreamLog;\n parseSessionKey: (sessionKey: string) => { channel: string; chatId: string };\n initDirectStreamingSession: (\n sessionKey: string,\n channel: string,\n chatId: string,\n ) => SessionContext;\n registerWebchatSsePublisher: (\n sessionKey: string,\n publisher: (event: { type: string; [key: string]: unknown }) => void,\n ) => void;\n unregisterWebchatSsePublisher: (sessionKey: string) => void;\n agentManager: AgentManager;\n hydrateSessionWorkspaceFromStore: (sessionKey: string) => Promise<void>;\n hydrateSessionModelFromStore: (sessionKey: string) => Promise<void>;\n agentEventHandler: AgentEventHandler;\n sessionStore: SessionStore;\n prepareLoadedSessionMessages: (sessionKey: string, messages: AgentMessage[]) => AgentMessage[];\n modelManager: ModelManager;\n applyResolvedThinkingLevel: (sessionKey: string, thinking?: string | null) => Promise<void>;\n getConfig: () => Config | undefined;\n sessionConfigStore: SessionConfigStore;\n attachmentRootsForSession: (sessionKey: string) => InternalAttachmentRoots;\n agentOrchestrator: Pick<AgentOrchestrator, 'abort'>;\n commandHandler: Pick<CommandHandler, 'executeCommandAndAggregateReply'>;\n prepareInboundAttachments: (\n sessionKey: string,\n attachments?: DirectStreamInboundAttachment[],\n ) => Promise<DirectStreamInboundAttachment[] | undefined>;\n buildMessageContent: (\n content: string,\n attachments: DirectStreamInboundAttachment[] | undefined,\n sessionKey: string,\n ) => Promise<Array<{ type: 'text'; text: string } | { type: 'image'; data: string; mimeType: string }>>;\n persistAgentSessionMessages: (sessionKey: string) => Promise<void>;\n maybeEmitWebchatTts: (\n sessionKey: string,\n hadInboundVoice: boolean,\n ) => Promise<{ type: 'tts_audio'; workspaceRelativePath: string; mimeType: string; name: string } | null>;\n endDirectRequestContext: () => void;\n}\n\nexport interface ProcessDirectStreamingInput {\n content: string;\n sessionKey?: string;\n attachments?: DirectStreamInboundAttachment[];\n thinking?: string;\n signal?: AbortSignal;\n}\n\nexport type ProcessDirectStreamingSseEvent = { type: string; [key: string]: unknown };\n\nexport async function* runProcessDirectStreaming(\n deps: ProcessDirectStreamingDeps,\n input: ProcessDirectStreamingInput,\n): AsyncGenerator<ProcessDirectStreamingSseEvent, void, unknown> {\n const {\n log,\n parseSessionKey,\n initDirectStreamingSession,\n registerWebchatSsePublisher,\n unregisterWebchatSsePublisher,\n agentManager,\n hydrateSessionWorkspaceFromStore,\n hydrateSessionModelFromStore,\n agentEventHandler,\n sessionStore,\n prepareLoadedSessionMessages,\n modelManager,\n applyResolvedThinkingLevel,\n getConfig,\n sessionConfigStore,\n attachmentRootsForSession,\n agentOrchestrator,\n commandHandler,\n prepareInboundAttachments,\n buildMessageContent,\n persistAgentSessionMessages,\n maybeEmitWebchatTts,\n endDirectRequestContext,\n } = deps;\n\n const sessionKey = input.sessionKey ?? 'cli:direct';\n const { channel, chatId } = parseSessionKey(sessionKey);\n const context = initDirectStreamingSession(sessionKey, channel, chatId);\n\n const eventQueue: ProcessDirectStreamingSseEvent[] = [];\n let resolveWaiting: (() => void) | null = null;\n let agentDone = false;\n\n let lastSentContent = '';\n let lastSentThinking = '';\n let reasoningLevel: ReasoningLevel = 'stream';\n\n const enqueueSseEvent = (event: ProcessDirectStreamingSseEvent) => {\n eventQueue.push(event);\n if (resolveWaiting) {\n resolveWaiting();\n resolveWaiting = null;\n }\n };\n\n const pushEvent = (event: ProcessDirectStreamingSseEvent) => {\n const visible = applyReasoningVisibilityToSseEvent(event, reasoningLevel);\n if (visible !== null) {\n enqueueSseEvent(visible);\n }\n };\n\n if (channel === 'webchat') {\n registerWebchatSsePublisher(sessionKey, (e) => pushEvent(e));\n }\n\n const signal = input.signal;\n let userAborted = false;\n let abortHandled = false;\n\n await hydrateSessionWorkspaceFromStore(sessionKey);\n const agent = agentManager.getOrCreateAgent(sessionKey);\n await hydrateSessionModelFromStore(sessionKey);\n const unsubscribeStreaming = agent.subscribe((event: AgentEvent) => {\n agentEventHandler.handle(event, context);\n\n switch (event.type) {\n case 'tool_execution_start': {\n const toolEvent = event as Extract<AgentEvent, { type: 'tool_execution_start' }>;\n const toolName =\n typeof toolEvent.toolName === 'string' && toolEvent.toolName.trim()\n ? toolEvent.toolName.trim()\n : 'unknown';\n pushEvent({\n type: 'tool_start',\n toolCallId: toolEvent.toolCallId,\n toolName,\n args: toolEvent.args,\n });\n break;\n }\n case 'tool_execution_end': {\n const toolEvent = event as Extract<AgentEvent, { type: 'tool_execution_end' }>;\n const toolName =\n typeof toolEvent.toolName === 'string' && toolEvent.toolName.trim()\n ? toolEvent.toolName.trim()\n : 'unknown';\n pushEvent({\n type: 'tool_end',\n toolCallId: toolEvent.toolCallId,\n toolName,\n isError: toolEvent.isError,\n result: serializeAgentToolResultForSse(toolEvent.result),\n });\n break;\n }\n case 'message_update': {\n const msgEvent = event as Extract<AgentEvent, { type: 'message_update' }>;\n if (msgEvent.message?.role === 'assistant') {\n const msgContent = msgEvent.message.content;\n const blocks = Array.isArray(msgContent)\n ? (msgContent as Array<{ type: string; text?: string }>)\n : undefined;\n const fullText = blocks ? extractTextContent(blocks) : String(msgContent);\n const thinkingFromBlocks = blocks ? extractThinkingContent(blocks) : '';\n const thinkingFromReasoning = extractThinkingFromAssistantMessage(msgEvent.message);\n const thinkingText =\n thinkingFromReasoning.length >= thinkingFromBlocks.length\n ? thinkingFromReasoning\n : thinkingFromBlocks;\n\n if (fullText.length > lastSentContent.length) {\n const delta = fullText.slice(lastSentContent.length);\n if (delta) {\n pushEvent({ type: 'token', content: delta });\n lastSentContent = fullText;\n }\n } else if (fullText.length < lastSentContent.length) {\n pushEvent({ type: 'token', content: fullText });\n lastSentContent = fullText;\n }\n\n if (thinkingText.length > lastSentThinking.length) {\n const thDelta = thinkingText.slice(lastSentThinking.length);\n if (thDelta) {\n pushEvent({ type: 'thinking', content: thDelta, delta: true });\n lastSentThinking = thinkingText;\n }\n } else if (thinkingText.length < lastSentThinking.length) {\n pushEvent({ type: 'thinking', content: thinkingText, delta: false });\n lastSentThinking = thinkingText;\n }\n }\n break;\n }\n case 'message_start': {\n const msgEvent = event as Extract<AgentEvent, { type: 'message_start' }>;\n if (msgEvent.message?.role === 'assistant') {\n lastSentContent = '';\n lastSentThinking = '';\n pushEvent({ type: 'thinking', status: 'started' });\n }\n break;\n }\n case 'message_end': {\n pushEvent({ type: 'message_end' });\n break;\n }\n case 'agent_start': {\n pushEvent({ type: 'progress', stage: 'thinking', message: 'Thinking...' });\n break;\n }\n case 'agent_end': {\n pushEvent({ type: 'progress', stage: 'idle', message: 'Done' });\n break;\n }\n default:\n break;\n }\n });\n\n try {\n const prepared = await prepareInboundAttachments(sessionKey, input.attachments);\n let loaded = await sessionStore.load(sessionKey);\n const lastMsg = loaded[loaded.length - 1] as { role?: string; webchatEarlySave?: boolean } | undefined;\n if (lastMsg?.role === 'user' && lastMsg.webchatEarlySave === true) {\n loaded = loaded.slice(0, -1);\n }\n agent.state.messages = prepareLoadedSessionMessages(sessionKey, loaded);\n\n await modelManager.applyModelForSession(agent, sessionKey);\n await applyResolvedThinkingLevel(sessionKey, input.thinking);\n {\n const defReason = (getConfig()?.agents?.defaults?.reasoningDefault ?? 'stream') as ReasoningLevel;\n reasoningLevel = await resolveEffectiveReasoningLevel(sessionConfigStore, sessionKey, defReason);\n }\n\n const sttCfg = mergeSttConfigFromAppConfig(getConfig()?.stt);\n const { text: mergedUserText, inboundVoice } = await mergeVoiceTranscriptsIntoUserText(\n attachmentRootsForSession(sessionKey),\n prepared,\n input.content,\n sttCfg,\n );\n\n const armAbort = () => {\n if (abortHandled) {\n return;\n }\n abortHandled = true;\n userAborted = true;\n agentOrchestrator.abort(sessionKey);\n agentDone = true;\n pushEvent({ type: '__done__' });\n };\n if (signal) {\n if (signal.aborted) {\n armAbort();\n } else {\n signal.addEventListener('abort', armAbort, { once: true });\n }\n }\n\n const commandInfo = parseSlashCommand(mergedUserText);\n let ranSlashCommand = false;\n /** Plain text to persist for webchat slash turns (SSE can be dropped by the UI; disk is source of truth). */\n let webchatSlashReceipt: string | undefined;\n if (!abortHandled && commandInfo) {\n if (commandRegistry.has(commandInfo.command)) {\n ranSlashCommand = true;\n try {\n const { aggregatedText } = await commandHandler.executeCommandAndAggregateReply(\n commandInfo.command,\n commandInfo.args,\n {\n sessionKey,\n channel,\n chatId,\n senderId: context.senderId,\n isGroup: context.isGroup,\n },\n );\n if (aggregatedText?.trim()) {\n webchatSlashReceipt = aggregatedText.trim();\n pushEvent({ type: 'token', content: webchatSlashReceipt });\n } else if (channel === 'webchat') {\n webchatSlashReceipt =\n 'Command finished with no assistant text. For `/goal`, that usually means the goal was saved; the assistant will not run until your next normal message (or an auto-continuation after an assistant reply).';\n pushEvent({ type: 'token', content: webchatSlashReceipt });\n }\n } catch (cmdErr) {\n const em = cmdErr instanceof Error ? cmdErr.message : String(cmdErr);\n log.warn({ err: cmdErr, sessionKey, command: commandInfo.command }, `Slash command failed: ${em}`);\n webchatSlashReceipt = `Command error: ${em}`;\n pushEvent({ type: 'token', content: webchatSlashReceipt });\n }\n pushEvent({ type: '__done__' });\n agentDone = true;\n } else if (commandInfo.command === 'goal') {\n // `/goal` is provided by the `standing-goal` bundled extension; avoid silent LLM fallback.\n ranSlashCommand = true;\n webchatSlashReceipt =\n 'The /goal command is not available: the `standing-goal` extension is not loaded.\\n\\n' +\n 'Fix: add `\"standing-goal\"` to `extensions.enabled` in your xopc config (or remove it from `extensions.disabled`), then restart the gateway. ' +\n 'If you use a strict allowlist, include `standing-goal` in `extensions.enabled`.';\n pushEvent({\n type: 'token',\n content: webchatSlashReceipt,\n });\n pushEvent({ type: '__done__' });\n agentDone = true;\n }\n }\n\n let messageContent:\n | Array<{ type: 'text'; text: string } | { type: 'image'; data: string; mimeType: string }>\n | undefined;\n if (!abortHandled && !ranSlashCommand) {\n const textForAgent = mergedUserText.trimStart().startsWith('/skill:')\n ? agentManager.expandSkillUserText(mergedUserText)\n : mergedUserText;\n messageContent = await buildMessageContent(textForAgent, prepared, sessionKey);\n }\n\n if (!abortHandled && !ranSlashCommand && messageContent !== undefined) {\n const agentPromise = (async () => {\n const userMessage = {\n role: 'user' as const,\n content: messageContent,\n timestamp: Date.now(),\n };\n const userPlain = extractAgentUserPlainText(userMessage);\n const userMessageForModel = await agentManager.applyMemoryPrefetchToUserMessage(\n userMessage,\n sessionKey,\n );\n await runAgentTurnWithModelFallbacks({\n agent,\n sessionKey,\n modelManager,\n userMessage: userMessageForModel,\n log,\n getConfig,\n beforeUserPrompt: () => agentManager.beginBackgroundReviewUserTurn(sessionKey),\n });\n agentManager.afterAgentTurn(sessionKey, userPlain);\n agentManager.scheduleBackgroundReviewAfterUserTurn(sessionKey);\n })();\n\n agentPromise\n .then(() => {\n if (abortHandled) {\n return;\n }\n agentDone = true;\n pushEvent({ type: '__done__' });\n })\n .catch((err) => {\n if (abortHandled) {\n return;\n }\n agentDone = true;\n pushEvent({ type: 'error', content: err instanceof Error ? err.message : String(err) });\n pushEvent({ type: '__done__' });\n });\n }\n\n while (true) {\n if (eventQueue.length > 0) {\n const event = eventQueue.shift()!;\n if (event.type === '__done__') break;\n yield event;\n } else if (agentDone) {\n break;\n } else {\n await new Promise<void>((resolve) => {\n resolveWaiting = resolve;\n });\n }\n }\n\n while (eventQueue.length > 0) {\n const event = eventQueue.shift()!;\n if (event.type === '__done__') continue;\n yield event;\n }\n\n // Persist slash command text to the session file so the gateway console can show a receipt even when\n // the browser drops SSE tokens (e.g. session key mismatch during hydration).\n if (channel === 'webchat' && ranSlashCommand && webchatSlashReceipt?.trim()) {\n try {\n const loaded = await sessionStore.load(sessionKey);\n const text = webchatSlashReceipt.trim();\n // Minimal assistant row for session JSON; full AssistantMessage metadata is LLM-turn specific.\n const assistantMsg = {\n role: 'assistant' as const,\n content: [{ type: 'text' as const, text }],\n timestamp: Date.now(),\n } as AgentMessage;\n await sessionStore.save(sessionKey, [...loaded, assistantMsg]);\n } catch (err) {\n log.warn({ err, sessionKey }, 'Failed to persist webchat slash command receipt');\n }\n }\n\n // Slash-only turns never hydrate the early-saved user row into pi-agent state; persisting here would\n // write an empty/stale transcript over the gateway `SessionManager` copy (and break e.g. `/goal`).\n if (!ranSlashCommand) {\n await persistAgentSessionMessages(sessionKey);\n }\n\n if (!userAborted) {\n const ttsAudioEvent = await maybeEmitWebchatTts(sessionKey, inboundVoice);\n if (ttsAudioEvent) {\n yield ttsAudioEvent;\n }\n }\n } finally {\n if (channel === 'webchat') {\n unregisterWebchatSsePublisher(sessionKey);\n }\n unsubscribeStreaming();\n endDirectRequestContext();\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"process-direct-streaming.js","names":["msgEvent"],"sources":["../../../../src/agent/service/process-direct-streaming.ts"],"sourcesContent":["import type { AgentEvent, AgentMessage } from '@mariozechner/pi-agent-core';\n\nimport type { Config } from '../../config/schema.js';\nimport type { InternalAttachmentRoots } from '../../channels/attachments/inbound-persist.js';\nimport { commandRegistry } from '../../chat-commands/index.js';\nimport { parseSlashCommand } from '../../chat-commands/command-parse.js';\nimport {\n mergeVoiceTranscriptsIntoUserText,\n mergeSttConfigFromAppConfig,\n} from '../../channels/attachments/voice-stt-webchat.js';\nimport {\n resolveEffectiveReasoningLevel,\n stripTrailingWebchatEarlySaveUserIfPresent,\n type SessionConfigStore,\n type SessionStore,\n} from '../../session/index.js';\nimport type { SessionContext } from '../session/index.js';\nimport {\n extractTextContent,\n extractThinkingContent,\n extractThinkingFromAssistantMessage,\n} from '../context/workspace.js';\nimport { extractAgentUserPlainText } from '../memory/user-message-text.js';\nimport { runAgentTurnWithModelFallbacks } from '../orchestration/run-agent-turn-with-fallbacks.js';\nimport { applyReasoningVisibilityToSseEvent } from '../streaming/reasoning-visibility-sse.js';\nimport type { ReasoningLevel } from '../transcript/thinking-types.js';\nimport { serializeAgentToolResultForSse } from '../service-inbound-utils.js';\nimport type { AgentManager } from '../agent-manager.js';\nimport type { AgentEventHandler } from '../orchestration/agent-event-handler.js';\nimport type { AgentOrchestrator } from '../orchestration/agent-orchestrator.js';\nimport type { CommandHandler } from '../messaging/command-handler.js';\nimport type { ModelManager } from '../models/index.js';\n\nexport type DirectStreamInboundAttachment = {\n type: string;\n mimeType?: string;\n data?: string;\n name?: string;\n size?: number;\n workspaceRelativePath?: string;\n};\n\n/** Logger shape expected by {@link runAgentTurnWithModelFallbacks}. */\nexport type ProcessDirectStreamLog = {\n info: (obj: Record<string, unknown>, msg: string) => void;\n warn: (obj: Record<string, unknown>, msg: string) => void;\n debug?: (obj: Record<string, unknown>, msg: string) => void;\n};\n\n/**\n * Explicit collaborators for {@link runProcessDirectStreaming} (gateway webchat / CLI direct stream).\n * Bound by `AgentService` from its private fields and methods.\n */\nexport interface ProcessDirectStreamingDeps {\n log: ProcessDirectStreamLog;\n parseSessionKey: (sessionKey: string) => { channel: string; chatId: string };\n initDirectStreamingSession: (\n sessionKey: string,\n channel: string,\n chatId: string,\n ) => SessionContext;\n registerWebchatSsePublisher: (\n sessionKey: string,\n publisher: (event: { type: string; [key: string]: unknown }) => void,\n ) => void;\n unregisterWebchatSsePublisher: (sessionKey: string) => void;\n agentManager: AgentManager;\n hydrateSessionWorkspaceFromStore: (sessionKey: string) => Promise<void>;\n hydrateSessionModelFromStore: (sessionKey: string) => Promise<void>;\n agentEventHandler: AgentEventHandler;\n sessionStore: SessionStore;\n prepareLoadedSessionMessages: (sessionKey: string, messages: AgentMessage[]) => AgentMessage[];\n modelManager: ModelManager;\n applyResolvedThinkingLevel: (sessionKey: string, thinking?: string | null) => Promise<void>;\n getConfig: () => Config | undefined;\n sessionConfigStore: SessionConfigStore;\n attachmentRootsForSession: (sessionKey: string) => InternalAttachmentRoots;\n agentOrchestrator: Pick<AgentOrchestrator, 'abort'>;\n commandHandler: Pick<CommandHandler, 'executeCommandAndAggregateReply'>;\n prepareInboundAttachments: (\n sessionKey: string,\n attachments?: DirectStreamInboundAttachment[],\n ) => Promise<DirectStreamInboundAttachment[] | undefined>;\n buildMessageContent: (\n content: string,\n attachments: DirectStreamInboundAttachment[] | undefined,\n sessionKey: string,\n ) => Promise<Array<{ type: 'text'; text: string } | { type: 'image'; data: string; mimeType: string }>>;\n persistAgentSessionMessages: (sessionKey: string) => Promise<void>;\n maybeEmitWebchatTts: (\n sessionKey: string,\n hadInboundVoice: boolean,\n ) => Promise<{ type: 'tts_audio'; workspaceRelativePath: string; mimeType: string; name: string } | null>;\n endDirectRequestContext: () => void;\n}\n\nexport interface ProcessDirectStreamingInput {\n content: string;\n sessionKey?: string;\n attachments?: DirectStreamInboundAttachment[];\n thinking?: string;\n signal?: AbortSignal;\n}\n\nexport type ProcessDirectStreamingSseEvent = { type: string; [key: string]: unknown };\n\nexport async function* runProcessDirectStreaming(\n deps: ProcessDirectStreamingDeps,\n input: ProcessDirectStreamingInput,\n): AsyncGenerator<ProcessDirectStreamingSseEvent, void, unknown> {\n const {\n log,\n parseSessionKey,\n initDirectStreamingSession,\n registerWebchatSsePublisher,\n unregisterWebchatSsePublisher,\n agentManager,\n hydrateSessionWorkspaceFromStore,\n hydrateSessionModelFromStore,\n agentEventHandler,\n sessionStore,\n prepareLoadedSessionMessages,\n modelManager,\n applyResolvedThinkingLevel,\n getConfig,\n sessionConfigStore,\n attachmentRootsForSession,\n agentOrchestrator,\n commandHandler,\n prepareInboundAttachments,\n buildMessageContent,\n persistAgentSessionMessages,\n maybeEmitWebchatTts,\n endDirectRequestContext,\n } = deps;\n\n const sessionKey = input.sessionKey ?? 'cli:direct';\n const { channel, chatId } = parseSessionKey(sessionKey);\n const context = initDirectStreamingSession(sessionKey, channel, chatId);\n\n const eventQueue: ProcessDirectStreamingSseEvent[] = [];\n let resolveWaiting: (() => void) | null = null;\n let agentDone = false;\n\n let lastSentContent = '';\n let lastSentThinking = '';\n let reasoningLevel: ReasoningLevel = 'stream';\n\n const enqueueSseEvent = (event: ProcessDirectStreamingSseEvent) => {\n eventQueue.push(event);\n if (resolveWaiting) {\n resolveWaiting();\n resolveWaiting = null;\n }\n };\n\n const pushEvent = (event: ProcessDirectStreamingSseEvent) => {\n const visible = applyReasoningVisibilityToSseEvent(event, reasoningLevel);\n if (visible !== null) {\n enqueueSseEvent(visible);\n }\n };\n\n if (channel === 'webchat') {\n registerWebchatSsePublisher(sessionKey, (e) => pushEvent(e));\n }\n\n const signal = input.signal;\n let userAborted = false;\n let abortHandled = false;\n\n await hydrateSessionWorkspaceFromStore(sessionKey);\n const agent = agentManager.getOrCreateAgent(sessionKey);\n await hydrateSessionModelFromStore(sessionKey);\n const unsubscribeStreaming = agent.subscribe((event: AgentEvent) => {\n agentEventHandler.handle(event, context);\n\n switch (event.type) {\n case 'tool_execution_start': {\n const toolEvent = event as Extract<AgentEvent, { type: 'tool_execution_start' }>;\n const toolName =\n typeof toolEvent.toolName === 'string' && toolEvent.toolName.trim()\n ? toolEvent.toolName.trim()\n : 'unknown';\n pushEvent({\n type: 'tool_start',\n toolCallId: toolEvent.toolCallId,\n toolName,\n args: toolEvent.args,\n });\n break;\n }\n case 'tool_execution_end': {\n const toolEvent = event as Extract<AgentEvent, { type: 'tool_execution_end' }>;\n const toolName =\n typeof toolEvent.toolName === 'string' && toolEvent.toolName.trim()\n ? toolEvent.toolName.trim()\n : 'unknown';\n pushEvent({\n type: 'tool_end',\n toolCallId: toolEvent.toolCallId,\n toolName,\n isError: toolEvent.isError,\n result: serializeAgentToolResultForSse(toolEvent.result),\n });\n break;\n }\n case 'message_update': {\n const msgEvent = event as Extract<AgentEvent, { type: 'message_update' }>;\n if (msgEvent.message?.role === 'assistant') {\n const msgContent = msgEvent.message.content;\n const blocks = Array.isArray(msgContent)\n ? (msgContent as Array<{ type: string; text?: string }>)\n : undefined;\n const fullText = blocks ? extractTextContent(blocks) : String(msgContent);\n const thinkingFromBlocks = blocks ? extractThinkingContent(blocks) : '';\n const thinkingFromReasoning = extractThinkingFromAssistantMessage(msgEvent.message);\n const thinkingText =\n thinkingFromReasoning.length >= thinkingFromBlocks.length\n ? thinkingFromReasoning\n : thinkingFromBlocks;\n\n if (fullText.length > lastSentContent.length) {\n const delta = fullText.slice(lastSentContent.length);\n if (delta) {\n pushEvent({ type: 'token', content: delta });\n lastSentContent = fullText;\n }\n } else if (fullText.length < lastSentContent.length) {\n pushEvent({ type: 'token', content: fullText });\n lastSentContent = fullText;\n }\n\n if (thinkingText.length > lastSentThinking.length) {\n const thDelta = thinkingText.slice(lastSentThinking.length);\n if (thDelta) {\n pushEvent({ type: 'thinking', content: thDelta, delta: true });\n lastSentThinking = thinkingText;\n }\n } else if (thinkingText.length < lastSentThinking.length) {\n pushEvent({ type: 'thinking', content: thinkingText, delta: false });\n lastSentThinking = thinkingText;\n }\n }\n break;\n }\n case 'message_start': {\n const msgEvent = event as Extract<AgentEvent, { type: 'message_start' }>;\n if (msgEvent.message?.role === 'assistant') {\n lastSentContent = '';\n lastSentThinking = '';\n pushEvent({ type: 'thinking', status: 'started' });\n }\n break;\n }\n case 'message_end': {\n pushEvent({ type: 'message_end' });\n break;\n }\n case 'agent_start': {\n pushEvent({ type: 'progress', stage: 'thinking', message: 'Thinking...' });\n break;\n }\n case 'agent_end': {\n pushEvent({ type: 'progress', stage: 'idle', message: 'Done' });\n break;\n }\n default:\n break;\n }\n });\n\n try {\n const prepared = await prepareInboundAttachments(sessionKey, input.attachments);\n let loaded = await sessionStore.load(sessionKey);\n const lastMsg = loaded[loaded.length - 1] as { role?: string; webchatEarlySave?: boolean } | undefined;\n if (lastMsg?.role === 'user' && lastMsg.webchatEarlySave === true) {\n loaded = loaded.slice(0, -1);\n }\n agent.state.messages = prepareLoadedSessionMessages(sessionKey, loaded);\n\n await modelManager.applyModelForSession(agent, sessionKey);\n await applyResolvedThinkingLevel(sessionKey, input.thinking);\n {\n const defReason = (getConfig()?.agents?.defaults?.reasoningDefault ?? 'stream') as ReasoningLevel;\n reasoningLevel = await resolveEffectiveReasoningLevel(sessionConfigStore, sessionKey, defReason);\n }\n\n const sttCfg = mergeSttConfigFromAppConfig(getConfig()?.stt);\n const { text: mergedUserText, inboundVoice } = await mergeVoiceTranscriptsIntoUserText(\n attachmentRootsForSession(sessionKey),\n prepared,\n input.content,\n sttCfg,\n );\n\n const armAbort = () => {\n if (abortHandled) {\n return;\n }\n abortHandled = true;\n userAborted = true;\n agentOrchestrator.abort(sessionKey);\n agentDone = true;\n pushEvent({ type: '__done__' });\n };\n if (signal) {\n if (signal.aborted) {\n armAbort();\n } else {\n signal.addEventListener('abort', armAbort, { once: true });\n }\n }\n\n const commandInfo = parseSlashCommand(mergedUserText);\n let ranSlashCommand = false;\n /** Plain text to persist for webchat slash turns (SSE can be dropped by the UI; disk is source of truth). */\n let webchatSlashReceipt: string | undefined;\n if (!abortHandled && commandInfo) {\n if (commandRegistry.has(commandInfo.command)) {\n ranSlashCommand = true;\n try {\n const { aggregatedText } = await commandHandler.executeCommandAndAggregateReply(\n commandInfo.command,\n commandInfo.args,\n {\n sessionKey,\n channel,\n chatId,\n senderId: context.senderId,\n isGroup: context.isGroup,\n },\n );\n if (aggregatedText?.trim()) {\n webchatSlashReceipt = aggregatedText.trim();\n pushEvent({ type: 'token', content: webchatSlashReceipt });\n } else if (channel === 'webchat') {\n webchatSlashReceipt =\n 'Command finished with no assistant text. For `/goal`, that usually means the goal was saved; the assistant will not run until your next normal message (or an auto-continuation after an assistant reply).';\n pushEvent({ type: 'token', content: webchatSlashReceipt });\n }\n } catch (cmdErr) {\n const em = cmdErr instanceof Error ? cmdErr.message : String(cmdErr);\n log.warn({ err: cmdErr, sessionKey, command: commandInfo.command }, `Slash command failed: ${em}`);\n webchatSlashReceipt = `Command error: ${em}`;\n pushEvent({ type: 'token', content: webchatSlashReceipt });\n }\n pushEvent({ type: '__done__' });\n agentDone = true;\n } else if (commandInfo.command === 'goal') {\n // `/goal` is provided by the `standing-goal` bundled extension; avoid silent LLM fallback.\n ranSlashCommand = true;\n webchatSlashReceipt =\n 'The /goal command is not available: the `standing-goal` extension is not loaded.\\n\\n' +\n 'Fix: add `\"standing-goal\"` to `extensions.enabled` in your xopc config (or remove it from `extensions.disabled`), then restart the gateway. ' +\n 'If you use a strict allowlist, include `standing-goal` in `extensions.enabled`.';\n pushEvent({\n type: 'token',\n content: webchatSlashReceipt,\n });\n pushEvent({ type: '__done__' });\n agentDone = true;\n }\n }\n\n let messageContent:\n | Array<{ type: 'text'; text: string } | { type: 'image'; data: string; mimeType: string }>\n | undefined;\n if (!abortHandled && !ranSlashCommand) {\n const textForAgent = mergedUserText.trimStart().startsWith('/skill:')\n ? agentManager.expandSkillUserText(mergedUserText)\n : mergedUserText;\n messageContent = await buildMessageContent(textForAgent, prepared, sessionKey);\n }\n\n if (!abortHandled && !ranSlashCommand && messageContent !== undefined) {\n const agentPromise = (async () => {\n const userMessage = {\n role: 'user' as const,\n content: messageContent,\n timestamp: Date.now(),\n };\n const userPlain = extractAgentUserPlainText(userMessage);\n const userMessageForModel = await agentManager.applyMemoryPrefetchToUserMessage(\n userMessage,\n sessionKey,\n );\n await runAgentTurnWithModelFallbacks({\n agent,\n sessionKey,\n modelManager,\n userMessage: userMessageForModel,\n log,\n getConfig,\n beforeUserPrompt: () => agentManager.beginBackgroundReviewUserTurn(sessionKey),\n });\n agentManager.afterAgentTurn(sessionKey, userPlain);\n agentManager.scheduleBackgroundReviewAfterUserTurn(sessionKey);\n })();\n\n agentPromise\n .then(() => {\n if (abortHandled) {\n return;\n }\n agentDone = true;\n pushEvent({ type: '__done__' });\n })\n .catch((err) => {\n if (abortHandled) {\n return;\n }\n agentDone = true;\n pushEvent({ type: 'error', content: err instanceof Error ? err.message : String(err) });\n pushEvent({ type: '__done__' });\n });\n }\n\n while (true) {\n if (eventQueue.length > 0) {\n const event = eventQueue.shift()!;\n if (event.type === '__done__') break;\n yield event;\n } else if (agentDone) {\n break;\n } else {\n await new Promise<void>((resolve) => {\n resolveWaiting = resolve;\n });\n }\n }\n\n while (eventQueue.length > 0) {\n const event = eventQueue.shift()!;\n if (event.type === '__done__') continue;\n yield event;\n }\n\n // Persist slash command text to the session file so the gateway console can show a receipt even when\n // the browser drops SSE tokens (e.g. session key mismatch during hydration).\n if (channel === 'webchat' && ranSlashCommand && webchatSlashReceipt?.trim()) {\n try {\n const loaded = await sessionStore.load(sessionKey);\n const text = webchatSlashReceipt.trim();\n // Minimal assistant row for session JSON; full AssistantMessage metadata is LLM-turn specific.\n const assistantMsg = {\n role: 'assistant' as const,\n content: [{ type: 'text' as const, text }],\n timestamp: Date.now(),\n } as AgentMessage;\n await sessionStore.save(sessionKey, [...loaded, assistantMsg]);\n } catch (err) {\n log.warn({ err, sessionKey }, 'Failed to persist webchat slash command receipt');\n }\n }\n\n // Slash-only turns never hydrate the early-saved user row into pi-agent state; persisting here would\n // write an empty/stale transcript over the gateway `SessionManager` copy (and break e.g. `/goal`).\n if (!ranSlashCommand) {\n if (userAborted && channel === 'webchat') {\n try {\n await stripTrailingWebchatEarlySaveUserIfPresent(sessionStore, sessionKey);\n } catch (stripErr) {\n log.warn({ err: stripErr, sessionKey }, 'Failed to strip trailing webchat early-save after abort');\n }\n }\n await persistAgentSessionMessages(sessionKey);\n }\n\n if (!userAborted) {\n const ttsAudioEvent = await maybeEmitWebchatTts(sessionKey, inboundVoice);\n if (ttsAudioEvent) {\n yield ttsAudioEvent;\n }\n }\n } finally {\n if (channel === 'webchat') {\n unregisterWebchatSsePublisher(sessionKey);\n }\n unsubscribeStreaming();\n endDirectRequestContext();\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Config } from '../../config/schema.js';
|
|
2
|
+
import type { CronService } from '../../cron/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Reconcile managed Dreaming cron jobs against the current effective config.
|
|
5
|
+
*/
|
|
6
|
+
export declare function reconcileManagedDreamingCronJobs(cron: CronService, effectiveConfig: Config | undefined): Promise<void>;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { DREAMING_CRON_NAME, DREAMING_LIGHT_CRON_NAME, DREAMING_LIGHT_SWEEP_TOKEN, DREAMING_REM_CRON_NAME, DREAMING_REM_SWEEP_TOKEN, DREAMING_SWEEP_TOKEN } from "../memory/dreaming/constants.js";
|
|
2
|
+
import { resolveDreamingConfig } from "../memory/dreaming/config.js";
|
|
3
|
+
//#region src/agent/service/reconcile-dreaming-cron.ts
|
|
4
|
+
/**
|
|
5
|
+
* Reconcile managed Dreaming cron jobs against the current effective config.
|
|
6
|
+
*/
|
|
7
|
+
async function reconcileManagedDreamingCronJobs(cron, effectiveConfig) {
|
|
8
|
+
const dreaming = resolveDreamingConfig(effectiveConfig);
|
|
9
|
+
const managed = (await cron.listJobs()).filter((job) => job.name?.includes?.("[managed-by=xopc.memory.dreaming]") ?? false);
|
|
10
|
+
const phaseSpecs = [
|
|
11
|
+
{
|
|
12
|
+
cronName: DREAMING_LIGHT_CRON_NAME,
|
|
13
|
+
token: DREAMING_LIGHT_SWEEP_TOKEN,
|
|
14
|
+
schedule: dreaming.phases.light.cron,
|
|
15
|
+
phaseEnabled: dreaming.phases.light.enabled
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
cronName: DREAMING_CRON_NAME,
|
|
19
|
+
token: DREAMING_SWEEP_TOKEN,
|
|
20
|
+
schedule: dreaming.phases.deep.cron,
|
|
21
|
+
phaseEnabled: dreaming.phases.deep.enabled
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
cronName: DREAMING_REM_CRON_NAME,
|
|
25
|
+
token: DREAMING_REM_SWEEP_TOKEN,
|
|
26
|
+
schedule: dreaming.phases.rem.cron,
|
|
27
|
+
phaseEnabled: dreaming.phases.rem.enabled
|
|
28
|
+
}
|
|
29
|
+
];
|
|
30
|
+
if (!dreaming.enabled) {
|
|
31
|
+
for (const job of managed) await cron.removeJob(job.id).catch(() => {});
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
for (const spec of phaseSpecs) {
|
|
35
|
+
const phaseJobs = managed.filter((job) => job.name === spec.cronName);
|
|
36
|
+
if (!spec.phaseEnabled) {
|
|
37
|
+
for (const job of phaseJobs) await cron.removeJob(job.id).catch(() => {});
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const desiredPayload = {
|
|
41
|
+
kind: "agentTurn",
|
|
42
|
+
message: spec.token
|
|
43
|
+
};
|
|
44
|
+
if (phaseJobs.length === 0) {
|
|
45
|
+
await cron.addJob(spec.schedule, {
|
|
46
|
+
name: spec.cronName,
|
|
47
|
+
timezone: dreaming.timezone,
|
|
48
|
+
sessionTarget: "isolated",
|
|
49
|
+
payload: desiredPayload,
|
|
50
|
+
enabled: true
|
|
51
|
+
});
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const primary = phaseJobs[0];
|
|
55
|
+
for (const dup of phaseJobs.slice(1)) await cron.removeJob(dup.id).catch(() => {});
|
|
56
|
+
const payloadMessage = primary.payload?.kind === "agentTurn" ? primary.payload.message : primary.payload?.text;
|
|
57
|
+
if (primary.schedule !== spec.schedule || (dreaming.timezone ?? null) !== (primary.timezone ?? null) || primary.sessionTarget !== "isolated" || payloadMessage !== spec.token || primary.enabled !== true || primary.name !== spec.cronName) await cron.updateJob(primary.id, {
|
|
58
|
+
schedule: spec.schedule,
|
|
59
|
+
timezone: dreaming.timezone ?? void 0,
|
|
60
|
+
sessionTarget: "isolated",
|
|
61
|
+
name: spec.cronName,
|
|
62
|
+
payload: desiredPayload,
|
|
63
|
+
enabled: true
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//#endregion
|
|
68
|
+
export { reconcileManagedDreamingCronJobs };
|
|
69
|
+
|
|
70
|
+
//# sourceMappingURL=reconcile-dreaming-cron.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile-dreaming-cron.js","names":[],"sources":["../../../../src/agent/service/reconcile-dreaming-cron.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport type { CronService } from '../../cron/index.js';\nimport {\n DREAMING_CRON_TAG,\n DREAMING_SWEEP_TOKEN,\n DREAMING_LIGHT_CRON_NAME,\n DREAMING_LIGHT_SWEEP_TOKEN,\n DREAMING_CRON_NAME,\n DREAMING_REM_CRON_NAME,\n DREAMING_REM_SWEEP_TOKEN,\n} from '../memory/dreaming/constants.js';\nimport { resolveDreamingConfig } from '../memory/dreaming/config.js';\n\n/**\n * Reconcile managed Dreaming cron jobs against the current effective config.\n */\nexport async function reconcileManagedDreamingCronJobs(\n cron: CronService,\n effectiveConfig: Config | undefined,\n): Promise<void> {\n const dreaming = resolveDreamingConfig(effectiveConfig);\n const jobs = await cron.listJobs();\n const managed = jobs.filter((job) => job.name?.includes?.(DREAMING_CRON_TAG) ?? false);\n\n const phaseSpecs: Array<{\n cronName: string;\n token: string;\n schedule: string;\n phaseEnabled: boolean;\n }> = [\n {\n cronName: DREAMING_LIGHT_CRON_NAME,\n token: DREAMING_LIGHT_SWEEP_TOKEN,\n schedule: dreaming.phases.light.cron,\n phaseEnabled: dreaming.phases.light.enabled,\n },\n {\n cronName: DREAMING_CRON_NAME,\n token: DREAMING_SWEEP_TOKEN,\n schedule: dreaming.phases.deep.cron,\n phaseEnabled: dreaming.phases.deep.enabled,\n },\n {\n cronName: DREAMING_REM_CRON_NAME,\n token: DREAMING_REM_SWEEP_TOKEN,\n schedule: dreaming.phases.rem.cron,\n phaseEnabled: dreaming.phases.rem.enabled,\n },\n ];\n\n if (!dreaming.enabled) {\n for (const job of managed) {\n await cron.removeJob(job.id).catch(() => {});\n }\n return;\n }\n\n for (const spec of phaseSpecs) {\n const phaseJobs = managed.filter((job) => job.name === spec.cronName);\n\n if (!spec.phaseEnabled) {\n for (const job of phaseJobs) {\n await cron.removeJob(job.id).catch(() => {});\n }\n continue;\n }\n\n const desiredPayload = { kind: 'agentTurn' as const, message: spec.token };\n\n if (phaseJobs.length === 0) {\n await cron.addJob(spec.schedule, {\n name: spec.cronName,\n timezone: dreaming.timezone,\n sessionTarget: 'isolated' as const,\n payload: desiredPayload,\n enabled: true,\n } as any);\n continue;\n }\n\n const primary = phaseJobs[0]!;\n for (const dup of phaseJobs.slice(1)) {\n await cron.removeJob(dup.id).catch(() => {});\n }\n\n const payloadMessage =\n primary.payload?.kind === 'agentTurn'\n ? primary.payload.message\n : (primary.payload as any)?.text;\n const needsUpdate =\n primary.schedule !== spec.schedule ||\n (dreaming.timezone ?? null) !== (primary.timezone ?? null) ||\n primary.sessionTarget !== 'isolated' ||\n payloadMessage !== spec.token ||\n primary.enabled !== true ||\n primary.name !== spec.cronName;\n\n if (needsUpdate) {\n await cron.updateJob(primary.id, {\n schedule: spec.schedule,\n timezone: dreaming.timezone ?? undefined,\n sessionTarget: 'isolated',\n name: spec.cronName,\n payload: desiredPayload,\n enabled: true,\n } as any);\n }\n }\n}\n"],"mappings":";;;;;;AAgBA,eAAsB,iCACpB,MACA,iBACe;CACf,MAAM,WAAW,sBAAsB,gBAAgB;CAEvD,MAAM,WAAU,MADG,KAAK,UAAU,EACb,QAAQ,QAAQ,IAAI,MAAM,WAAA,oCAA6B,IAAI,MAAM;CAEtF,MAAM,aAKD;EACH;GACE,UAAU;GACV,OAAO;GACP,UAAU,SAAS,OAAO,MAAM;GAChC,cAAc,SAAS,OAAO,MAAM;GACrC;EACD;GACE,UAAU;GACV,OAAO;GACP,UAAU,SAAS,OAAO,KAAK;GAC/B,cAAc,SAAS,OAAO,KAAK;GACpC;EACD;GACE,UAAU;GACV,OAAO;GACP,UAAU,SAAS,OAAO,IAAI;GAC9B,cAAc,SAAS,OAAO,IAAI;GACnC;EACF;AAED,KAAI,CAAC,SAAS,SAAS;AACrB,OAAK,MAAM,OAAO,QAChB,OAAM,KAAK,UAAU,IAAI,GAAG,CAAC,YAAY,GAAG;AAE9C;;AAGF,MAAK,MAAM,QAAQ,YAAY;EAC7B,MAAM,YAAY,QAAQ,QAAQ,QAAQ,IAAI,SAAS,KAAK,SAAS;AAErE,MAAI,CAAC,KAAK,cAAc;AACtB,QAAK,MAAM,OAAO,UAChB,OAAM,KAAK,UAAU,IAAI,GAAG,CAAC,YAAY,GAAG;AAE9C;;EAGF,MAAM,iBAAiB;GAAE,MAAM;GAAsB,SAAS,KAAK;GAAO;AAE1E,MAAI,UAAU,WAAW,GAAG;AAC1B,SAAM,KAAK,OAAO,KAAK,UAAU;IAC/B,MAAM,KAAK;IACX,UAAU,SAAS;IACnB,eAAe;IACf,SAAS;IACT,SAAS;IACV,CAAQ;AACT;;EAGF,MAAM,UAAU,UAAU;AAC1B,OAAK,MAAM,OAAO,UAAU,MAAM,EAAE,CAClC,OAAM,KAAK,UAAU,IAAI,GAAG,CAAC,YAAY,GAAG;EAG9C,MAAM,iBACJ,QAAQ,SAAS,SAAS,cACtB,QAAQ,QAAQ,UACf,QAAQ,SAAiB;AAShC,MAPE,QAAQ,aAAa,KAAK,aACzB,SAAS,YAAY,WAAW,QAAQ,YAAY,SACrD,QAAQ,kBAAkB,cAC1B,mBAAmB,KAAK,SACxB,QAAQ,YAAY,QACpB,QAAQ,SAAS,KAAK,SAGtB,OAAM,KAAK,UAAU,QAAQ,IAAI;GAC/B,UAAU,KAAK;GACf,UAAU,SAAS,YAAY,KAAA;GAC/B,eAAe;GACf,MAAM,KAAK;GACX,SAAS;GACT,SAAS;GACV,CAAQ"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Assembled snapshot for `/context` (list, detail markdown, or JSON). */
|
|
2
|
+
export type SessionContextReportInput = {
|
|
3
|
+
sessionKey: string;
|
|
4
|
+
mode: 'list' | 'detail' | 'json';
|
|
5
|
+
model: string;
|
|
6
|
+
workspacePath: string;
|
|
7
|
+
agentId: string;
|
|
8
|
+
messageCount: number;
|
|
9
|
+
contextWindowNominal: number;
|
|
10
|
+
estimatedTranscriptTokens: number;
|
|
11
|
+
thinkingDefault?: string;
|
|
12
|
+
reasoningDefault?: string;
|
|
13
|
+
verboseDefault?: string;
|
|
14
|
+
compaction: unknown;
|
|
15
|
+
toolsFlagsSummary: string;
|
|
16
|
+
windowStats: unknown;
|
|
17
|
+
compactionRunStats: unknown;
|
|
18
|
+
};
|
|
19
|
+
export declare function formatSessionContextReport(input: SessionContextReportInput): string;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
//#region src/agent/service/session-context-report.ts
|
|
2
|
+
function formatSessionContextReport(input) {
|
|
3
|
+
const { sessionKey, mode, model, workspacePath, agentId, messageCount, contextWindowNominal: cw, estimatedTranscriptTokens: estTokens, thinkingDefault, reasoningDefault, verboseDefault, compaction, toolsFlagsSummary, windowStats, compactionRunStats } = input;
|
|
4
|
+
const payload = {
|
|
5
|
+
sessionKey,
|
|
6
|
+
model,
|
|
7
|
+
workspacePath,
|
|
8
|
+
agentId,
|
|
9
|
+
messageCount,
|
|
10
|
+
contextWindowNominal: cw,
|
|
11
|
+
estimatedTranscriptTokens: estTokens,
|
|
12
|
+
approxWindowUsage: cw > 0 ? estTokens / cw : null,
|
|
13
|
+
thinkingDefault,
|
|
14
|
+
reasoningDefault,
|
|
15
|
+
verboseDefault,
|
|
16
|
+
compaction,
|
|
17
|
+
toolsFlagsOn: toolsFlagsSummary,
|
|
18
|
+
windowStats,
|
|
19
|
+
compactionRunStats
|
|
20
|
+
};
|
|
21
|
+
if (mode === "json") return JSON.stringify(payload, null, 2);
|
|
22
|
+
const lines = [
|
|
23
|
+
"📎 *Context overview*",
|
|
24
|
+
"",
|
|
25
|
+
`• Session: \`${sessionKey}\``,
|
|
26
|
+
`• Model: \`${model}\``,
|
|
27
|
+
`• Agent profile: \`${agentId}\``,
|
|
28
|
+
`• Workspace: \`${workspacePath}\``,
|
|
29
|
+
`• Messages: ${messageCount}`,
|
|
30
|
+
`• Est. transcript tokens (rough): ${estTokens}`,
|
|
31
|
+
`• Nominal context budget (4× maxTokens): ${cw}`
|
|
32
|
+
];
|
|
33
|
+
if (cw > 0) lines.push(`• Approx. usage vs budget: ${(estTokens / cw * 100).toFixed(1)}%`);
|
|
34
|
+
lines.push(`• Thinking / reasoning / verbose defaults: ${thinkingDefault ?? "—"} / ${reasoningDefault ?? "—"} / ${verboseDefault ?? "—"}`, `• Tools (true flags): ${toolsFlagsSummary}`, "", "_Full system prompt, skills, and memory blocks are assembled at agent runtime; use Web settings or logs for deep inspection._");
|
|
35
|
+
if (mode === "detail") {
|
|
36
|
+
lines.push("", "*Compaction config (agents.defaults.compaction):*", "```json");
|
|
37
|
+
lines.push(JSON.stringify(compaction ?? {}, null, 2));
|
|
38
|
+
lines.push("```", "", "*Window stats:*", "```json");
|
|
39
|
+
lines.push(JSON.stringify(windowStats ?? {}, null, 2));
|
|
40
|
+
lines.push("```");
|
|
41
|
+
}
|
|
42
|
+
return lines.join("\n");
|
|
43
|
+
}
|
|
44
|
+
//#endregion
|
|
45
|
+
export { formatSessionContextReport };
|
|
46
|
+
|
|
47
|
+
//# sourceMappingURL=session-context-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-context-report.js","names":[],"sources":["../../../../src/agent/service/session-context-report.ts"],"sourcesContent":["/** Assembled snapshot for `/context` (list, detail markdown, or JSON). */\nexport type SessionContextReportInput = {\n sessionKey: string;\n mode: 'list' | 'detail' | 'json';\n model: string;\n workspacePath: string;\n agentId: string;\n messageCount: number;\n contextWindowNominal: number;\n estimatedTranscriptTokens: number;\n thinkingDefault?: string;\n reasoningDefault?: string;\n verboseDefault?: string;\n compaction: unknown;\n toolsFlagsSummary: string;\n windowStats: unknown;\n compactionRunStats: unknown;\n};\n\nexport function formatSessionContextReport(input: SessionContextReportInput): string {\n const {\n sessionKey,\n mode,\n model,\n workspacePath,\n agentId,\n messageCount,\n contextWindowNominal: cw,\n estimatedTranscriptTokens: estTokens,\n thinkingDefault,\n reasoningDefault,\n verboseDefault,\n compaction,\n toolsFlagsSummary,\n windowStats,\n compactionRunStats,\n } = input;\n\n const payload: Record<string, unknown> = {\n sessionKey,\n model,\n workspacePath,\n agentId,\n messageCount,\n contextWindowNominal: cw,\n estimatedTranscriptTokens: estTokens,\n approxWindowUsage: cw > 0 ? estTokens / cw : null,\n thinkingDefault,\n reasoningDefault,\n verboseDefault,\n compaction,\n toolsFlagsOn: toolsFlagsSummary,\n windowStats,\n compactionRunStats: compactionRunStats,\n };\n\n if (mode === 'json') {\n return JSON.stringify(payload, null, 2);\n }\n\n const lines: string[] = [\n '📎 *Context overview*',\n '',\n `• Session: \\`${sessionKey}\\``,\n `• Model: \\`${model}\\``,\n `• Agent profile: \\`${agentId}\\``,\n `• Workspace: \\`${workspacePath}\\``,\n `• Messages: ${messageCount}`,\n `• Est. transcript tokens (rough): ${estTokens}`,\n `• Nominal context budget (4× maxTokens): ${cw}`,\n ];\n if (cw > 0) {\n lines.push(`• Approx. usage vs budget: ${((estTokens / cw) * 100).toFixed(1)}%`);\n }\n lines.push(\n `• Thinking / reasoning / verbose defaults: ${thinkingDefault ?? '—'} / ${reasoningDefault ?? '—'} / ${verboseDefault ?? '—'}`,\n `• Tools (true flags): ${toolsFlagsSummary}`,\n '',\n '_Full system prompt, skills, and memory blocks are assembled at agent runtime; use Web settings or logs for deep inspection._',\n );\n\n if (mode === 'detail') {\n lines.push('', '*Compaction config (agents.defaults.compaction):*', '```json');\n lines.push(JSON.stringify(compaction ?? {}, null, 2));\n lines.push('```', '', '*Window stats:*', '```json');\n lines.push(JSON.stringify(windowStats ?? {}, null, 2));\n lines.push('```');\n }\n\n return lines.join('\\n');\n}\n"],"mappings":";AAmBA,SAAgB,2BAA2B,OAA0C;CACnF,MAAM,EACJ,YACA,MACA,OACA,eACA,SACA,cACA,sBAAsB,IACtB,2BAA2B,WAC3B,iBACA,kBACA,gBACA,YACA,mBACA,aACA,uBACE;CAEJ,MAAM,UAAmC;EACvC;EACA;EACA;EACA;EACA;EACA,sBAAsB;EACtB,2BAA2B;EAC3B,mBAAmB,KAAK,IAAI,YAAY,KAAK;EAC7C;EACA;EACA;EACA;EACA,cAAc;EACd;EACoB;EACrB;AAED,KAAI,SAAS,OACX,QAAO,KAAK,UAAU,SAAS,MAAM,EAAE;CAGzC,MAAM,QAAkB;EACtB;EACA;EACA,gBAAgB,WAAW;EAC3B,cAAc,MAAM;EACpB,sBAAsB,QAAQ;EAC9B,kBAAkB,cAAc;EAChC,eAAe;EACf,qCAAqC;EACrC,4CAA4C;EAC7C;AACD,KAAI,KAAK,EACP,OAAM,KAAK,+BAAgC,YAAY,KAAM,KAAK,QAAQ,EAAE,CAAC,GAAG;AAElF,OAAM,KACJ,8CAA8C,mBAAmB,IAAI,KAAK,oBAAoB,IAAI,KAAK,kBAAkB,OACzH,yBAAyB,qBACzB,IACA,gIACD;AAED,KAAI,SAAS,UAAU;AACrB,QAAM,KAAK,IAAI,qDAAqD,UAAU;AAC9E,QAAM,KAAK,KAAK,UAAU,cAAc,EAAE,EAAE,MAAM,EAAE,CAAC;AACrD,QAAM,KAAK,OAAO,IAAI,mBAAmB,UAAU;AACnD,QAAM,KAAK,KAAK,UAAU,eAAe,EAAE,EAAE,MAAM,EAAE,CAAC;AACtD,QAAM,KAAK,MAAM;;AAGnB,QAAO,MAAM,KAAK,KAAK"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Config } from '../../config/schema.js';
|
|
2
|
+
import type { AgentManager } from '../agent-manager.js';
|
|
3
|
+
import type { SessionStore } from '../../session/index.js';
|
|
4
|
+
export type WebchatTtsResult = {
|
|
5
|
+
type: 'tts_audio';
|
|
6
|
+
workspaceRelativePath: string;
|
|
7
|
+
mimeType: string;
|
|
8
|
+
name: string;
|
|
9
|
+
};
|
|
10
|
+
export type WebchatTtsDeps = {
|
|
11
|
+
config: Config | undefined;
|
|
12
|
+
agentManager: AgentManager;
|
|
13
|
+
sessionStore: SessionStore;
|
|
14
|
+
log: {
|
|
15
|
+
warn: (obj: Record<string, unknown>, msg: string) => void;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Generate TTS for webchat when config allows; persist under agent home `tts/`.
|
|
20
|
+
*/
|
|
21
|
+
export declare function maybeEmitWebchatTts(deps: WebchatTtsDeps, sessionKey: string, hadInboundVoice: boolean): Promise<WebchatTtsResult | null>;
|
|
22
|
+
export declare function appendAttachmentToLastAssistant(sessionStore: SessionStore, sessionKey: string, att: {
|
|
23
|
+
type: string;
|
|
24
|
+
mimeType: string;
|
|
25
|
+
name: string;
|
|
26
|
+
size: number;
|
|
27
|
+
workspaceRelativePath: string;
|
|
28
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { init_agent_scope, resolveAgentHomeDir } from "../agent-scope.js";
|
|
2
|
+
import { extractProfileAgentId } from "../../config/agent-profile.js";
|
|
3
|
+
import { isTTSAvailable } from "../../voice/tts/factory.js";
|
|
4
|
+
import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
|
|
5
|
+
import { speak } from "../../voice/tts/speak-core.js";
|
|
6
|
+
import { getChannelOutputFormat, shouldUseTTS } from "../../voice/tts/service.js";
|
|
7
|
+
import { compressAudio } from "../../voice/tts/audio.js";
|
|
8
|
+
import "../../voice/tts/index.js";
|
|
9
|
+
import { persistOutboundTtsAudio } from "../../channels/attachments/outbound-tts-persist.js";
|
|
10
|
+
//#region src/agent/service/webchat-tts.ts
|
|
11
|
+
init_agent_scope();
|
|
12
|
+
/**
|
|
13
|
+
* Generate TTS for webchat when config allows; persist under agent home `tts/`.
|
|
14
|
+
*/
|
|
15
|
+
async function maybeEmitWebchatTts(deps, sessionKey, hadInboundVoice) {
|
|
16
|
+
const ttsConfig = mergeTtsConfigFromAppConfig(deps.config?.tts);
|
|
17
|
+
if (!isTTSAvailable(ttsConfig)) return null;
|
|
18
|
+
if (!shouldUseTTS(ttsConfig, hadInboundVoice).useTTS) return null;
|
|
19
|
+
const text = deps.agentManager.getLastAssistantContent(sessionKey)?.trim();
|
|
20
|
+
if (!text) return null;
|
|
21
|
+
try {
|
|
22
|
+
const webOut = getChannelOutputFormat("webchat");
|
|
23
|
+
const fmt = webOut.format;
|
|
24
|
+
const ttsResult = await speak(text, ttsConfig, {
|
|
25
|
+
appConfig: deps.config,
|
|
26
|
+
tts: { format: fmt }
|
|
27
|
+
});
|
|
28
|
+
const { buffer, format } = await compressAudio(Buffer.from(ttsResult.audio), ttsResult.format, webOut.format === "mp3" ? "mp3" : "opus");
|
|
29
|
+
const normalizedMime = format === "opus" || format === "ogg" ? "audio/ogg" : format === "mp3" || format === "mpeg" ? "audio/mpeg" : format === "wav" ? "audio/wav" : `audio/${format}`;
|
|
30
|
+
const cfg = deps.config;
|
|
31
|
+
const persisted = await persistOutboundTtsAudio(resolveAgentHomeDir(cfg, extractProfileAgentId(sessionKey, cfg)), sessionKey, buffer, format);
|
|
32
|
+
await appendAttachmentToLastAssistant(deps.sessionStore, sessionKey, {
|
|
33
|
+
type: "audio",
|
|
34
|
+
mimeType: normalizedMime,
|
|
35
|
+
name: persisted.name,
|
|
36
|
+
size: persisted.size,
|
|
37
|
+
workspaceRelativePath: persisted.workspaceRelativePath
|
|
38
|
+
});
|
|
39
|
+
return {
|
|
40
|
+
type: "tts_audio",
|
|
41
|
+
workspaceRelativePath: persisted.workspaceRelativePath,
|
|
42
|
+
mimeType: normalizedMime,
|
|
43
|
+
name: persisted.name
|
|
44
|
+
};
|
|
45
|
+
} catch (err) {
|
|
46
|
+
deps.log.warn({
|
|
47
|
+
err,
|
|
48
|
+
sessionKey
|
|
49
|
+
}, "Webchat TTS failed");
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async function appendAttachmentToLastAssistant(sessionStore, sessionKey, att) {
|
|
54
|
+
const loaded = await sessionStore.load(sessionKey);
|
|
55
|
+
for (let i = loaded.length - 1; i >= 0; i--) {
|
|
56
|
+
const m = loaded[i];
|
|
57
|
+
if (m.role === "assistant") {
|
|
58
|
+
const prev = m.attachments ?? [];
|
|
59
|
+
if (prev.some((x) => x.workspaceRelativePath === att.workspaceRelativePath)) return;
|
|
60
|
+
const next = [...prev, att];
|
|
61
|
+
loaded[i] = {
|
|
62
|
+
...m,
|
|
63
|
+
attachments: next
|
|
64
|
+
};
|
|
65
|
+
await sessionStore.save(sessionKey, loaded);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//#endregion
|
|
71
|
+
export { appendAttachmentToLastAssistant, maybeEmitWebchatTts };
|
|
72
|
+
|
|
73
|
+
//# sourceMappingURL=webchat-tts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webchat-tts.js","names":[],"sources":["../../../../src/agent/service/webchat-tts.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport { persistOutboundTtsAudio } from '../../channels/attachments/outbound-tts-persist.js';\nimport { compressAudio } from '../../voice/tts/audio.js';\nimport { speak } from '../../voice/tts/index.js';\nimport { mergeTtsConfigFromAppConfig } from '../../voice/tts/merge-config.js';\nimport { shouldUseTTS, getChannelOutputFormat } from '../../voice/tts/service.js';\nimport { isTTSAvailable } from '../../voice/tts/factory.js';\nimport { resolveAgentHomeDir } from '../agent-scope.js';\nimport { extractProfileAgentId } from '../../config/agent-profile.js';\nimport type { AgentManager } from '../agent-manager.js';\nimport type { SessionStore } from '../../session/index.js';\nimport type { AgentMessage } from '@mariozechner/pi-agent-core';\n\nexport type WebchatTtsResult = {\n type: 'tts_audio';\n workspaceRelativePath: string;\n mimeType: string;\n name: string;\n};\n\nexport type WebchatTtsDeps = {\n config: Config | undefined;\n agentManager: AgentManager;\n sessionStore: SessionStore;\n log: { warn: (obj: Record<string, unknown>, msg: string) => void };\n};\n\n/**\n * Generate TTS for webchat when config allows; persist under agent home `tts/`.\n */\nexport async function maybeEmitWebchatTts(\n deps: WebchatTtsDeps,\n sessionKey: string,\n hadInboundVoice: boolean,\n): Promise<WebchatTtsResult | null> {\n const ttsConfig = mergeTtsConfigFromAppConfig(deps.config?.tts);\n if (!isTTSAvailable(ttsConfig)) {\n return null;\n }\n const decision = shouldUseTTS(ttsConfig, hadInboundVoice);\n if (!decision.useTTS) {\n return null;\n }\n const text = deps.agentManager.getLastAssistantContent(sessionKey)?.trim();\n if (!text) {\n return null;\n }\n try {\n const webOut = getChannelOutputFormat('webchat');\n const fmt = webOut.format as 'opus' | 'mp3' | 'wav';\n const ttsResult = await speak(text, ttsConfig, {\n appConfig: deps.config,\n tts: { format: fmt },\n });\n const { buffer, format } = await compressAudio(\n Buffer.from(ttsResult.audio),\n ttsResult.format,\n webOut.format === 'mp3' ? 'mp3' : 'opus',\n );\n const normalizedMime =\n format === 'opus' || format === 'ogg'\n ? 'audio/ogg'\n : format === 'mp3' || format === 'mpeg'\n ? 'audio/mpeg'\n : format === 'wav'\n ? 'audio/wav'\n : `audio/${format}`;\n const cfg = deps.config!;\n const persisted = await persistOutboundTtsAudio(\n resolveAgentHomeDir(cfg, extractProfileAgentId(sessionKey, cfg)),\n sessionKey,\n buffer,\n format,\n );\n await appendAttachmentToLastAssistant(deps.sessionStore, sessionKey, {\n type: 'audio',\n mimeType: normalizedMime,\n name: persisted.name,\n size: persisted.size,\n workspaceRelativePath: persisted.workspaceRelativePath,\n });\n return {\n type: 'tts_audio',\n workspaceRelativePath: persisted.workspaceRelativePath,\n mimeType: normalizedMime,\n name: persisted.name,\n };\n } catch (err) {\n deps.log.warn({ err, sessionKey }, 'Webchat TTS failed');\n return null;\n }\n}\n\nexport async function appendAttachmentToLastAssistant(\n sessionStore: SessionStore,\n sessionKey: string,\n att: {\n type: string;\n mimeType: string;\n name: string;\n size: number;\n workspaceRelativePath: string;\n },\n): Promise<void> {\n const loaded = await sessionStore.load(sessionKey);\n for (let i = loaded.length - 1; i >= 0; i--) {\n const m = loaded[i] as { role?: string; attachments?: unknown[] };\n if (m.role === 'assistant') {\n const prev = (m.attachments ?? []) as Array<{ workspaceRelativePath?: string }>;\n if (prev.some((x) => x.workspaceRelativePath === att.workspaceRelativePath)) {\n return;\n }\n const next = [...prev, att];\n loaded[i] = { ...m, attachments: next } as unknown as AgentMessage;\n await sessionStore.save(sessionKey, loaded);\n return;\n }\n }\n}\n"],"mappings":";;;;;;;;;;kBAOwD;;;;AAuBxD,eAAsB,oBACpB,MACA,YACA,iBACkC;CAClC,MAAM,YAAY,4BAA4B,KAAK,QAAQ,IAAI;AAC/D,KAAI,CAAC,eAAe,UAAU,CAC5B,QAAO;AAGT,KAAI,CADa,aAAa,WAAW,gBAC5B,CAAC,OACZ,QAAO;CAET,MAAM,OAAO,KAAK,aAAa,wBAAwB,WAAW,EAAE,MAAM;AAC1E,KAAI,CAAC,KACH,QAAO;AAET,KAAI;EACF,MAAM,SAAS,uBAAuB,UAAU;EAChD,MAAM,MAAM,OAAO;EACnB,MAAM,YAAY,MAAM,MAAM,MAAM,WAAW;GAC7C,WAAW,KAAK;GAChB,KAAK,EAAE,QAAQ,KAAK;GACrB,CAAC;EACF,MAAM,EAAE,QAAQ,WAAW,MAAM,cAC/B,OAAO,KAAK,UAAU,MAAM,EAC5B,UAAU,QACV,OAAO,WAAW,QAAQ,QAAQ,OACnC;EACD,MAAM,iBACJ,WAAW,UAAU,WAAW,QAC5B,cACA,WAAW,SAAS,WAAW,SAC7B,eACA,WAAW,QACT,cACA,SAAS;EACnB,MAAM,MAAM,KAAK;EACjB,MAAM,YAAY,MAAM,wBACtB,oBAAoB,KAAK,sBAAsB,YAAY,IAAI,CAAC,EAChE,YACA,QACA,OACD;AACD,QAAM,gCAAgC,KAAK,cAAc,YAAY;GACnE,MAAM;GACN,UAAU;GACV,MAAM,UAAU;GAChB,MAAM,UAAU;GAChB,uBAAuB,UAAU;GAClC,CAAC;AACF,SAAO;GACL,MAAM;GACN,uBAAuB,UAAU;GACjC,UAAU;GACV,MAAM,UAAU;GACjB;UACM,KAAK;AACZ,OAAK,IAAI,KAAK;GAAE;GAAK;GAAY,EAAE,qBAAqB;AACxD,SAAO;;;AAIX,eAAsB,gCACpB,cACA,YACA,KAOe;CACf,MAAM,SAAS,MAAM,aAAa,KAAK,WAAW;AAClD,MAAK,IAAI,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,KAAK;EAC3C,MAAM,IAAI,OAAO;AACjB,MAAI,EAAE,SAAS,aAAa;GAC1B,MAAM,OAAQ,EAAE,eAAe,EAAE;AACjC,OAAI,KAAK,MAAM,MAAM,EAAE,0BAA0B,IAAI,sBAAsB,CACzE;GAEF,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI;AAC3B,UAAO,KAAK;IAAE,GAAG;IAAG,aAAa;IAAM;AACvC,SAAM,aAAa,KAAK,YAAY,OAAO;AAC3C"}
|
|
@@ -5,6 +5,7 @@ import type { ChannelManager } from '../channels/manager.js';
|
|
|
5
5
|
import type { SessionDetail } from '../session/types.js';
|
|
6
6
|
import { type ReasoningLevel } from './transcript/thinking-types.js';
|
|
7
7
|
import { type SkillCatalogEntry } from './agent-manager.js';
|
|
8
|
+
import type { SkillMarkdownPreviewPayload } from './skills/types.js';
|
|
8
9
|
import type { AgentServiceConfig, StreamHandle } from './service.types.js';
|
|
9
10
|
import type { CompactionResult } from './memory/compaction.js';
|
|
10
11
|
export type { AgentServiceConfig, AgentContext, StreamHandle } from './service.types.js';
|
|
@@ -57,11 +58,8 @@ export declare class AgentService {
|
|
|
57
58
|
* Apply config after save or hot reload so the default model updates without restarting the gateway.
|
|
58
59
|
*/
|
|
59
60
|
applyAgentDefaultsFromConfig(config: Config): void;
|
|
60
|
-
getSkillCatalog(): SkillCatalogEntry[];
|
|
61
|
-
getSkillMarkdownSource(skillName: string):
|
|
62
|
-
name: string;
|
|
63
|
-
markdown: string;
|
|
64
|
-
} | null;
|
|
61
|
+
getSkillCatalog(lang?: string): SkillCatalogEntry[];
|
|
62
|
+
getSkillMarkdownSource(skillName: string, lang?: string): SkillMarkdownPreviewPayload | null;
|
|
65
63
|
refreshSkillsAfterDiskChange(): void;
|
|
66
64
|
refreshSkillsAfterSkillConfigChange(): void;
|
|
67
65
|
getModelForSession(sessionKey: string): string;
|
|
@@ -108,7 +106,6 @@ export declare class AgentService {
|
|
|
108
106
|
private prepareLoadedSessionMessages;
|
|
109
107
|
private parseSessionKey;
|
|
110
108
|
private initSessionContext;
|
|
111
|
-
private buildMessageContent;
|
|
112
109
|
/**
|
|
113
110
|
* Persist inbound file attachments under agent home `inbound/` (non-images with data).
|
|
114
111
|
* Idempotent if `workspaceRelativePath` is already set on an attachment.
|
|
@@ -135,6 +132,10 @@ export declare class AgentService {
|
|
|
135
132
|
instructions?: string;
|
|
136
133
|
force?: boolean;
|
|
137
134
|
}): Promise<CompactionResult>;
|
|
135
|
+
/**
|
|
136
|
+
* Drop in-memory agent so the next turn reloads transcript from disk (e.g. after checkpoint restore).
|
|
137
|
+
*/
|
|
138
|
+
evictSessionAgent(sessionKey: string): void;
|
|
138
139
|
/**
|
|
139
140
|
* One-shot LLM answer for /btw: uses transcript as background only; does not persist to session.
|
|
140
141
|
*/
|
|
@@ -142,7 +143,6 @@ export declare class AgentService {
|
|
|
142
143
|
text: string;
|
|
143
144
|
error?: string;
|
|
144
145
|
}>;
|
|
145
|
-
private formatMessagesForBtw;
|
|
146
146
|
/** Markdown or JSON summary for /context (prompt assembly is approximated from config + transcript stats). */
|
|
147
147
|
getSessionContextReport(sessionKey: string, mode: 'list' | 'detail' | 'json'): Promise<string>;
|
|
148
148
|
getSessionStats(sessionKey: string, messages: AgentMessage[]): {
|
|
@@ -224,11 +224,7 @@ export declare class AgentService {
|
|
|
224
224
|
* See `Agent.steer` in `@mariozechner/pi-agent-core`.
|
|
225
225
|
*/
|
|
226
226
|
steerWebchatSession(sessionKey: string, text: string): Promise<boolean>;
|
|
227
|
-
|
|
228
|
-
* Generate TTS for webchat when config allows, persist under agent home `tts/`, attach to last assistant turn.
|
|
229
|
-
*/
|
|
230
|
-
private maybeEmitWebchatTts;
|
|
231
|
-
private appendAttachmentToLastAssistant;
|
|
227
|
+
private createRunProcessDirectDeps;
|
|
232
228
|
processDirect(content: string, sessionKey?: string, attachments?: Array<{
|
|
233
229
|
type: string;
|
|
234
230
|
mimeType?: string;
|