@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":"agent-manager.js","names":[],"sources":["../../../src/agent/agent-manager.ts"],"sourcesContent":["/**\n * Agent Manager - Manages Agent instances per session\n *\n * Each session gets its own Agent instance for true isolation\n * and concurrent processing across sessions.\n */\n\nimport {\n Agent,\n type AgentMessage,\n type AgentEvent,\n type ThinkingLevel,\n} from '@mariozechner/pi-agent-core';\nimport type { Model, Api } from '@mariozechner/pi-ai';\nimport { type Config, getAgentDefaultModelRef } from '../config/schema.js';\nimport { applyConfigOverrides } from '../config/runtime-overrides.js';\nimport {\n type EffectiveAgentProfile,\n resolveAgentBootstrapDir,\n resolveEffectiveAgentProfileForSession,\n} from '../config/agent-profile.js';\nimport { expandWorkspacePathString } from '../config/workspace-path.js';\nimport type { ModelManager } from './models/manager.js';\nimport { createLogger } from '../utils/logger.js';\nimport { resolveProviderApiKeySync } from '../auth/sync-provider-auth.js';\nimport { resolveModel, getDefaultModelSync, getApiKeySync } from '../providers/index.js';\nimport { createExtensionAwareStreamFn } from '../providers/extension-stream-bridge.js';\nimport { CredentialResolver } from '../auth/credentials.js';\nimport { resolveBundledSkillsDir, resolveStateDir } from '../config/paths.js';\nimport { loadBootstrapFiles, extractTextContent, type BootstrapFile } from './context/workspace.js';\nimport { SkillManager } from './skills/index.js';\nimport { SystemPromptBuilder } from './prompt/service-prompt-builder.js';\nimport { AgentToolsFactory } from './tools/factory.js';\nimport type { GatewayClarifyRequestFn } from './tools/clarify-tool.js';\nimport type { ExtensionRegistryImpl as ExtensionRegistry } from '../extensions/index.js';\nimport type { MessageBus } from '../infra/bus/index.js';\nimport type { CronService } from '../cron/index.js';\nimport type { SessionStore } from '../session/store.js';\nimport { isValidSkillEnvVarName } from './skills/required-env-vars.js';\nimport type { SessionContext } from './session/session-context.js';\nimport type { Skill } from './skills/types.js';\nimport { createSkillConfigManager } from './skills/config.js';\nimport { isUnderManagedSkillsDir } from './skills/managed-store.js';\nimport { loadSkillsLock, type SkillHubLockEntry } from './skills/hub-lock.js';\nimport { readFileSync } from 'node:fs';\nimport { basename, resolve, sep } from 'node:path';\n\nimport { BuiltinMemoryStore } from './memory/builtin-memory-store.js';\nimport { createMemoryManagerFromConfig } from './memory/create-memory-manager.js';\nimport { injectPrefetchIntoUserMessage } from './memory/inject-prefetch.js';\nimport {\n isCuratedMemoryInPrompt,\n isMemorySubsystemEnabled,\n resolveBuiltinMemoryStoreConfig,\n shouldInjectMemoryPrefetchThisTurn,\n} from './memory/memory-config.js';\nimport type { MemoryManager } from './memory/manager.js';\nimport type { MemorySnapshot } from './memory/types.js';\nimport { extractAgentUserPlainText } from './memory/user-message-text.js';\nimport { resolveBackgroundReviewSettings } from './background-review/settings.js';\nimport { runBackgroundReviewTurn } from './background-review/run-background-review.js';\nimport {\n isAssistantTurnAborted,\n isAssistantTurnFailed,\n} from './orchestration/llm-turn-retry.js';\n\nconst log = createLogger('AgentManager');\n\n/** Counters for optional post-turn memory/skill review (see `agents.defaults.backgroundReview`). */\nexport interface BackgroundNudgeState {\n turnsSinceMemory: number;\n itersSinceSkill: number;\n pendingMemoryReview: boolean;\n unsubscribe?: () => void;\n}\n\nexport interface SkillCatalogEntry {\n directoryId: string;\n name: string;\n description: string;\n source: Skill['source'];\n path: string;\n managed: boolean;\n /** User toggle in ~/.xopc/skills.json (`entries[name].enabled`). Default true. */\n enabled: boolean;\n /** When true, skill is never injected into `<available_skills>` (SKILL.md frontmatter). */\n disableModelInvocation: boolean;\n /** Hub install provenance when under ~/.xopc/skills and listed in skills-lock.json. */\n hub?: SkillHubLockEntry;\n}\n\nexport interface AgentManagerConfig {\n workspace: string;\n model?: string;\n config?: Config;\n extensionRegistry?: ExtensionRegistry;\n hookRunner?: import('../extensions/index.js').ExtensionHookRunner;\n bus: MessageBus;\n getCurrentContext: () => SessionContext | null;\n /** Session persistence (enables `session_search` when set). */\n getSessionStore?: () => SessionStore;\n /** Clears per-session profile default on teardown. */\n getModelManager?: () => ModelManager;\n // Thinking configuration\n thinkingLevel?: ThinkingLevel;\n reasoningLevel?: 'off' | 'on' | 'stream';\n verboseLevel?: 'off' | 'on' | 'full';\n gatewayClarify?: { requestClarification: GatewayClarifyRequestFn };\n /** Gateway: exposes CronService for the `cronjob` tool. */\n getCronService?: () => CronService | undefined;\n}\n\nexport interface AgentInstance {\n agent: Agent;\n sessionKey: string;\n createdAt: number;\n lastUsedAt: number;\n /** Curated agent-home `memories/` snapshot frozen at agent creation (prefix cache). */\n curatedMemorySnapshot: MemorySnapshot;\n effectiveProfile: EffectiveAgentProfile;\n resolvedWorkspacePath: string;\n /** Tool names registered on this agent (for skill indexing / tool gating). */\n registeredToolNames: string[];\n /** Declared env var names from skill_view; shell reads values from process.env at spawn time. */\n skillEnvPassthroughKeys: Set<string>;\n backgroundNudge: BackgroundNudgeState;\n}\n\ninterface WorkspaceRuntime {\n skillManager: SkillManager;\n systemPromptBuilder: SystemPromptBuilder;\n builtinMemoryStore: BuiltinMemoryStore;\n memoryManager: MemoryManager;\n}\n\nexport class AgentManager {\n private agents = new Map<string, AgentInstance>();\n private config: AgentManagerConfig;\n private toolsFactory: AgentToolsFactory;\n\n private mergedConfig(): Config | undefined {\n const base = this.config.config;\n return base ? applyConfigOverrides(base) : undefined;\n }\n /** Default agent workspace (effective profile for `getDefaultAgentId`). */\n private baseWorkspacePath: string;\n /** Per-session absolute markdown workspace when `SessionAgentConfig.workingDirectoryOverride` is set. */\n private sessionWorkspaceOverrides = new Map<string, string>();\n private defaultModel: string;\n private credentialCache = new Map<string, string>();\n private credentialResolver: CredentialResolver;\n private workspaceRuntimes = new Map<string, WorkspaceRuntime>();\n /** Per-session user-message index for prefetch injection cadence. */\n private memoryPrefetchUserTurn = new Map<string, number>();\n\n constructor(config: AgentManagerConfig) {\n this.config = config;\n this.baseWorkspacePath = this.computeBaseWorkspacePath();\n const baseRt = this.getWorkspaceRuntime(this.baseWorkspacePath);\n\n this.toolsFactory = new AgentToolsFactory({\n workspace: this.baseWorkspacePath,\n extensionRegistry: config.extensionRegistry,\n getCurrentContext: config.getCurrentContext,\n hookRunner: config.hookRunner,\n bus: config.bus,\n getConfig: () => this.mergedConfig(),\n getPrimaryModel: () => this.resolveModelStringToModel(this.pickDefaultModelRef()),\n getBuiltinMemoryStore: () => baseRt.builtinMemoryStore,\n getMemoryManager: () => baseRt.memoryManager,\n getSessionStore: config.getSessionStore,\n gatewayClarify: config.gatewayClarify,\n getCronService: config.getCronService,\n getSkillIndexingContext: () => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return undefined;\n const inst = this.agents.get(ctx.sessionKey);\n if (!inst) return undefined;\n return {\n registeredToolNames: inst.registeredToolNames,\n skillAllowlist: inst.effectiveProfile.skillsAllowlist,\n };\n },\n onSkillsFilesystemMutate: () => {\n this.refreshSkillsAfterDiskChange();\n },\n getSkillPassthroughEnvVarNames: () => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return [];\n return [...(this.agents.get(ctx.sessionKey)?.skillEnvPassthroughKeys ?? [])];\n },\n registerSkillEnvPassthrough: (names: string[]) => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return;\n const inst = this.agents.get(ctx.sessionKey);\n if (!inst) return;\n for (const n of names) {\n if (isValidSkillEnvVarName(n)) {\n inst.skillEnvPassthroughKeys.add(n.trim());\n }\n }\n },\n });\n\n this.defaultModel = config.model || getDefaultModelSync(config.config);\n\n this.credentialResolver = new CredentialResolver();\n this.warmCredentialCache().catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.warn({ err, errorMessage: em }, `Credential cache pre-warm failed: ${em}`);\n });\n }\n\n private computeBaseWorkspacePath(): string {\n const cfg = this.config.config;\n if (!cfg) {\n return expandWorkspacePathString(this.config.workspace);\n }\n return resolveEffectiveAgentProfileForSession(cfg, null).resolvedWorkspacePath;\n }\n\n /**\n * Workspace root for inbound attachments / side effects for this session's agent id.\n * Uses in-memory session workspace overrides when the session has a persisted `workingDirectoryOverride`.\n */\n getResolvedWorkspaceForSession(sessionKey: string): string {\n const cfg = this.config.config!;\n const fromMap = this.sessionWorkspaceOverrides.get(sessionKey);\n if (fromMap !== undefined) {\n return fromMap;\n }\n return resolveEffectiveAgentProfileForSession(cfg, sessionKey).resolvedWorkspacePath;\n }\n\n /**\n * Sync in-memory workspace override from session config (after load or PATCH).\n * Pass `null` to clear when the session has no `workingDirectoryOverride` on disk.\n */\n setSessionWorkspaceOverride(sessionKey: string, absolutePath: string | null): void {\n if (absolutePath === null || absolutePath === '') {\n this.sessionWorkspaceOverrides.delete(sessionKey);\n } else {\n this.sessionWorkspaceOverrides.set(sessionKey, absolutePath);\n }\n }\n\n /** Merged `thinkingDefault` for this session's agent id (defaults + `agents.list`). */\n getThinkingDefaultForSession(\n sessionKey: string,\n ): import('./transcript/thinking-types.js').ThinkLevel | undefined {\n const cfg = this.mergedConfig();\n if (!cfg) {\n return undefined;\n }\n return resolveEffectiveAgentProfileForSession(cfg, sessionKey).thinkingDefault;\n }\n\n private getWorkspaceRuntime(resolvedPath: string): WorkspaceRuntime {\n const existing = this.workspaceRuntimes.get(resolvedPath);\n if (existing) {\n return existing;\n }\n\n const builtinMemoryStore = new BuiltinMemoryStore(\n resolveBuiltinMemoryStoreConfig(resolvedPath, this.config.config),\n );\n const memoryManager = createMemoryManagerFromConfig(\n resolvedPath,\n builtinMemoryStore,\n this.config.config,\n );\n const skillManager = new SkillManager(resolvedPath, resolveBundledSkillsDir());\n const systemPromptBuilder = new SystemPromptBuilder({\n workspace: resolvedPath,\n config: this.config.config!,\n skillManager,\n });\n\n const rt: WorkspaceRuntime = {\n skillManager,\n systemPromptBuilder,\n builtinMemoryStore,\n memoryManager,\n };\n this.workspaceRuntimes.set(resolvedPath, rt);\n return rt;\n }\n\n private pickDefaultModelRef(): string {\n const cfg = this.mergedConfig();\n const ref = getAgentDefaultModelRef(cfg);\n return ref?.trim() || getDefaultModelSync(cfg);\n }\n\n private resolveModelStringToModel(modelRef: string): Model<Api> {\n try {\n return resolveModel(modelRef);\n } catch {\n const fallback = getDefaultModelSync(this.mergedConfig());\n log.warn({ modelRef, fallback }, 'Model not found, using default');\n return resolveModel(fallback);\n }\n }\n\n /**\n * Keep defaults in sync when config is hot-reloaded or saved from the UI.\n */\n updateAgentDefaults(config: Config): void {\n this.config.config = config;\n const ref = getAgentDefaultModelRef(config);\n this.config.model = ref;\n this.defaultModel = ref || getDefaultModelSync(config);\n this.baseWorkspacePath = this.computeBaseWorkspacePath();\n void this.toolsFactory.shutdownBrowser();\n for (const rt of this.workspaceRuntimes.values()) {\n void rt.memoryManager.shutdownAll().catch(() => {});\n }\n this.workspaceRuntimes.clear();\n this.toolsFactory = new AgentToolsFactory({\n workspace: this.baseWorkspacePath,\n extensionRegistry: this.config.extensionRegistry,\n getCurrentContext: this.config.getCurrentContext,\n bus: this.config.bus,\n getConfig: () => this.mergedConfig(),\n getPrimaryModel: () => this.resolveModelStringToModel(this.pickDefaultModelRef()),\n getBuiltinMemoryStore: () => this.getWorkspaceRuntime(this.baseWorkspacePath).builtinMemoryStore,\n getMemoryManager: () => this.getWorkspaceRuntime(this.baseWorkspacePath).memoryManager,\n getSessionStore: this.config.getSessionStore,\n gatewayClarify: this.config.gatewayClarify,\n getCronService: this.config.getCronService,\n getSkillIndexingContext: () => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return undefined;\n const inst = this.agents.get(ctx.sessionKey);\n if (!inst) return undefined;\n return {\n registeredToolNames: inst.registeredToolNames,\n skillAllowlist: inst.effectiveProfile.skillsAllowlist,\n };\n },\n onSkillsFilesystemMutate: () => {\n this.refreshSkillsAfterDiskChange();\n },\n getSkillPassthroughEnvVarNames: () => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return [];\n return [...(this.agents.get(ctx.sessionKey)?.skillEnvPassthroughKeys ?? [])];\n },\n registerSkillEnvPassthrough: (names: string[]) => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return;\n const inst = this.agents.get(ctx.sessionKey);\n if (!inst) return;\n for (const n of names) {\n if (isValidSkillEnvVarName(n)) {\n inst.skillEnvPassthroughKeys.add(n.trim());\n }\n }\n },\n });\n }\n\n getMemoryManager(): MemoryManager {\n return this.getWorkspaceRuntime(this.baseWorkspacePath).memoryManager;\n }\n\n private getMemoryManagerForSession(sessionKey: string): MemoryManager {\n const path = this.getResolvedWorkspaceForSession(sessionKey);\n return this.getWorkspaceRuntime(path).memoryManager;\n }\n\n /**\n * Prefix the user turn with fenced prefetched memory (external providers).\n */\n async applyMemoryPrefetchToUserMessage(\n userMessage: AgentMessage,\n sessionKey: string,\n ): Promise<AgentMessage> {\n if (!isMemorySubsystemEnabled(this.config.config)) {\n return userMessage;\n }\n const plain = extractAgentUserPlainText(userMessage);\n const turn = (this.memoryPrefetchUserTurn.get(sessionKey) ?? 0) + 1;\n this.memoryPrefetchUserTurn.set(sessionKey, turn);\n if (!shouldInjectMemoryPrefetchThisTurn(this.config.config, turn)) {\n return userMessage;\n }\n return injectPrefetchIntoUserMessage(\n this.getMemoryManagerForSession(sessionKey),\n sessionKey,\n userMessage,\n plain,\n );\n }\n\n /**\n * After a completed turn: sync external providers and queue next-turn prefetch.\n */\n afterAgentTurn(sessionKey: string, userPlainText: string): void {\n if (!isMemorySubsystemEnabled(this.config.config)) {\n return;\n }\n const assistant = this.getLastAssistantContent(sessionKey) ?? '';\n const mm = this.getMemoryManagerForSession(sessionKey);\n mm.syncAll(userPlainText, assistant, { sessionId: sessionKey });\n mm.queuePrefetchAll(userPlainText, { sessionId: sessionKey });\n }\n\n /**\n * Call once per user turn before the main `agent.prompt` (via {@link runAgentTurnWithModelFallbacks} `beforeUserPrompt`).\n */\n beginBackgroundReviewUserTurn(sessionKey: string): void {\n const inst = this.agents.get(sessionKey);\n if (!inst?.backgroundNudge) return;\n const cfg = resolveBackgroundReviewSettings(this.config.config);\n if (!cfg.enabled || cfg.memoryNudgeInterval <= 0) return;\n if (!inst.registeredToolNames.includes('curated_memory')) return;\n inst.backgroundNudge.turnsSinceMemory += 1;\n if (inst.backgroundNudge.turnsSinceMemory >= cfg.memoryNudgeInterval) {\n inst.backgroundNudge.pendingMemoryReview = true;\n inst.backgroundNudge.turnsSinceMemory = 0;\n }\n }\n\n /**\n * After a successful main turn (after memory sync via `afterAgentTurn`), may run a quiet follow-up for memory/skills.\n */\n scheduleBackgroundReviewAfterUserTurn(sessionKey: string): void {\n void this.runBackgroundReviewIfNeeded(sessionKey).catch((err) => {\n log.warn({ err, sessionKey }, 'Background review failed');\n });\n }\n\n private async runBackgroundReviewIfNeeded(sessionKey: string): Promise<void> {\n const inst = this.agents.get(sessionKey);\n if (!inst?.backgroundNudge) return;\n const settings = resolveBackgroundReviewSettings(this.config.config);\n if (!settings.enabled) return;\n if (isAssistantTurnAborted(inst.agent) || isAssistantTurnFailed(inst.agent)) return;\n const last = this.getLastAssistantContent(sessionKey);\n if (!last?.trim()) return;\n\n const reviewMemory = inst.backgroundNudge.pendingMemoryReview;\n inst.backgroundNudge.pendingMemoryReview = false;\n\n let reviewSkills = false;\n if (settings.skillNudgeInterval > 0 && inst.registeredToolNames.includes('skill_manage')) {\n if (inst.backgroundNudge.itersSinceSkill >= settings.skillNudgeInterval) {\n reviewSkills = true;\n inst.backgroundNudge.itersSinceSkill = 0;\n }\n }\n\n if (!reviewMemory && !reviewSkills) return;\n\n const rt = this.getWorkspaceRuntime(inst.resolvedWorkspacePath);\n await runBackgroundReviewTurn({\n sessionKey,\n mainAgent: inst.agent,\n settings,\n reviewMemory,\n reviewSkills,\n registeredToolNames: inst.registeredToolNames,\n skillAllowlist: inst.effectiveProfile.skillsAllowlist,\n workspacePath: inst.resolvedWorkspacePath,\n skillManager: rt.skillManager,\n builtinMemoryStore: rt.builtinMemoryStore,\n memoryManager: rt.memoryManager,\n getConfig: () => this.mergedConfig(),\n onSkillsFilesystemMutate: () => this.refreshSkillsAfterDiskChange(),\n });\n }\n\n private attachBackgroundNudgeListeners(sessionKey: string): void {\n const inst = this.agents.get(sessionKey);\n if (!inst?.backgroundNudge) return;\n inst.backgroundNudge.unsubscribe?.();\n const unsub = inst.agent.subscribe((ev: AgentEvent) => {\n const cfg = resolveBackgroundReviewSettings(this.config.config);\n if (!cfg.enabled || cfg.skillNudgeInterval <= 0) return;\n if (!inst.registeredToolNames.includes('skill_manage')) return;\n if (ev.type === 'turn_start') {\n inst.backgroundNudge.itersSinceSkill += 1;\n }\n if (ev.type === 'tool_execution_end') {\n const te = ev as Extract<AgentEvent, { type: 'tool_execution_end' }>;\n if (\n !te.isError &&\n typeof te.toolName === 'string' &&\n te.toolName.trim() === 'skill_manage'\n ) {\n inst.backgroundNudge.itersSinceSkill = 0;\n }\n }\n });\n inst.backgroundNudge.unsubscribe = unsub;\n }\n\n /**\n * Expand `/skill:name` user text into the full skill block for the current turn (WebChat, channels).\n */\n expandSkillUserText(text: string): string {\n const ctx = this.config.getCurrentContext?.();\n const path = ctx?.sessionKey\n ? this.getResolvedWorkspaceForSession(ctx.sessionKey)\n : this.baseWorkspacePath;\n return this.getWorkspaceRuntime(path).skillManager.expandCommand(text);\n }\n\n /**\n * Read raw SKILL.md from disk (including frontmatter) for UI preview.\n */\n getSkillMarkdownSource(skillName: string): { name: string; markdown: string } | null {\n const skill = this.getWorkspaceRuntime(this.baseWorkspacePath).skillManager.findSkill(skillName);\n if (!skill) return null;\n try {\n const markdown = readFileSync(skill.filePath, 'utf-8');\n return { name: skill.name, markdown };\n } catch (err) {\n log.warn({ err, skillName, path: skill.filePath }, 'Failed to read SKILL.md');\n return null;\n }\n }\n\n private loadBootstrapForProfile(profile: EffectiveAgentProfile): BootstrapFile[] {\n const cfg = this.config.config!;\n const bootstrapDir = resolveAgentBootstrapDir(cfg, profile.agentId);\n return loadBootstrapFiles(bootstrapDir);\n }\n\n getSkillCatalog(): SkillCatalogEntry[] {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n const lock = loadSkillsLock();\n return this.getWorkspaceRuntime(this.baseWorkspacePath).skillManager.getSkills().map((s) => {\n const base = resolve(s.baseDir);\n const managed = isUnderManagedSkillsDir(s.baseDir);\n const directoryId = base.split(sep).filter(Boolean).pop() || s.name;\n const enabled = !(skillsConfig.entries?.[s.name]?.enabled === false);\n const hubKey = managed ? basename(base) : '';\n const hub = managed && hubKey ? lock.entries[hubKey] : undefined;\n return {\n directoryId,\n name: s.name,\n description: s.description,\n source: s.source,\n path: s.baseDir,\n managed,\n enabled,\n disableModelInvocation: s.disableModelInvocation,\n ...(hub ? { hub } : {}),\n };\n });\n }\n\n /**\n * After ~/.xopc/skills.json changes (enable/disable), refresh `<available_skills>` on active agents.\n */\n refreshSkillsAfterSkillConfigChange(): void {\n const touched = new Set<string>();\n for (const instance of this.agents.values()) {\n const rt = this.getWorkspaceRuntime(instance.resolvedWorkspacePath);\n if (!touched.has(instance.resolvedWorkspacePath)) {\n rt.skillManager.refreshPromptFromConfig();\n touched.add(instance.resolvedWorkspacePath);\n }\n const bootstrapFiles = this.loadBootstrapForProfile(instance.effectiveProfile);\n const newPrompt = rt.systemPromptBuilder.build(bootstrapFiles, {\n curatedMemorySnapshot: instance.curatedMemorySnapshot,\n externalMemoryInstructions: rt.memoryManager.buildExternalSystemPrompt(),\n workspaceOverride: instance.resolvedWorkspacePath,\n systemPromptOverride: instance.effectiveProfile.systemPromptOverride,\n skillAllowlist: instance.effectiveProfile.skillsAllowlist,\n registeredToolNames: instance.registeredToolNames,\n });\n instance.agent.state.systemPrompt = newPrompt;\n }\n log.info({ agents: this.agents.size }, 'Skill toggles applied; system prompt updated');\n }\n\n /**\n * Reload skills from disk and refresh system prompt on all active Agent instances.\n */\n refreshSkillsAfterDiskChange(): void {\n // Reload every workspace SkillManager first. When there are no active agent sessions\n // (e.g. gateway UI only), the loop below runs zero times — without this, `getSkillCatalog()`\n // and delete flows still see stale in-memory skills after ~/.xopc/skills changes.\n for (const rt of this.workspaceRuntimes.values()) {\n rt.skillManager.reload();\n }\n\n const touched = new Set<string>();\n for (const instance of this.agents.values()) {\n const rt = this.getWorkspaceRuntime(instance.resolvedWorkspacePath);\n if (!touched.has(instance.resolvedWorkspacePath)) {\n touched.add(instance.resolvedWorkspacePath);\n }\n const bootstrapFiles = this.loadBootstrapForProfile(instance.effectiveProfile);\n const newPrompt = rt.systemPromptBuilder.rebuild(bootstrapFiles, {\n curatedMemorySnapshot: instance.curatedMemorySnapshot,\n externalMemoryInstructions: rt.memoryManager.buildExternalSystemPrompt(),\n workspaceOverride: instance.resolvedWorkspacePath,\n systemPromptOverride: instance.effectiveProfile.systemPromptOverride,\n skillAllowlist: instance.effectiveProfile.skillsAllowlist,\n registeredToolNames: instance.registeredToolNames,\n });\n instance.agent.state.systemPrompt = newPrompt;\n }\n log.info({ agents: this.agents.size }, 'Skills refreshed; system prompt updated');\n }\n\n /**\n * Get or create an Agent instance for a session\n */\n getOrCreateAgent(sessionKey: string): Agent {\n const cfg = this.config.config!;\n const targetPath = this.getResolvedWorkspaceForSession(sessionKey);\n const existing = this.agents.get(sessionKey);\n if (existing) {\n if (existing.resolvedWorkspacePath !== targetPath) {\n this.removeAgent(sessionKey);\n } else {\n existing.lastUsedAt = Date.now();\n if (!existing.backgroundNudge) {\n existing.backgroundNudge = {\n turnsSinceMemory: 0,\n itersSinceSkill: 0,\n pendingMemoryReview: false,\n };\n this.attachBackgroundNudgeListeners(sessionKey);\n }\n log.debug({ sessionKey }, 'Reusing existing agent instance');\n return existing.agent;\n }\n }\n\n const profile = resolveEffectiveAgentProfileForSession(cfg, sessionKey);\n const resolvedPath = targetPath;\n const rt = this.getWorkspaceRuntime(resolvedPath);\n\n if (isMemorySubsystemEnabled(cfg)) {\n void rt.memoryManager\n .initializeAll(sessionKey, { workspace: resolvedPath })\n .catch((err) => log.warn({ err, sessionKey }, 'memory initializeAll failed'));\n }\n\n const curatedOn = isCuratedMemoryInPrompt(cfg);\n if (curatedOn) {\n rt.builtinMemoryStore.loadFromDiskSync();\n }\n const snap = curatedOn ? rt.builtinMemoryStore.getSnapshot() : { memory: '', user: '' };\n const curatedMemorySnapshot: MemorySnapshot = { memory: snap.memory, user: snap.user };\n\n const { agent, registeredToolNames } = this.createAgentForProfile(\n sessionKey,\n profile,\n resolvedPath,\n rt,\n curatedMemorySnapshot,\n );\n\n this.agents.set(sessionKey, {\n agent,\n sessionKey,\n createdAt: Date.now(),\n lastUsedAt: Date.now(),\n curatedMemorySnapshot,\n effectiveProfile: profile,\n resolvedWorkspacePath: resolvedPath,\n registeredToolNames,\n skillEnvPassthroughKeys: new Set<string>(),\n backgroundNudge: {\n turnsSinceMemory: 0,\n itersSinceSkill: 0,\n pendingMemoryReview: false,\n },\n });\n\n this.attachBackgroundNudgeListeners(sessionKey);\n\n const modelRef = profile.primaryModelRef?.trim() || this.defaultModel;\n this.config.getModelManager?.().setSessionProfileDefault(sessionKey, modelRef);\n\n log.debug({ sessionKey, totalAgents: this.agents.size, agentId: profile.agentId }, 'Created new agent instance');\n return agent;\n }\n\n /**\n * Get existing agent for a session (if any)\n */\n getAgent(sessionKey: string): Agent | undefined {\n return this.agents.get(sessionKey)?.agent;\n }\n\n /**\n * Check if an agent exists for a session\n */\n hasAgent(sessionKey: string): boolean {\n return this.agents.has(sessionKey);\n }\n\n /**\n * Remove an agent instance\n */\n removeAgent(sessionKey: string): boolean {\n const instance = this.agents.get(sessionKey);\n if (instance) {\n instance.backgroundNudge?.unsubscribe?.();\n void this.toolsFactory.closeBrowserPageForSession(sessionKey);\n instance.agent.abort();\n this.agents.delete(sessionKey);\n this.memoryPrefetchUserTurn.delete(sessionKey);\n this.config.getModelManager?.().clearSessionProfileDefault(sessionKey);\n log.info({ sessionKey, totalAgents: this.agents.size }, 'Removed agent instance');\n return true;\n }\n return false;\n }\n\n /**\n * Get all active session keys\n */\n getActiveSessions(): string[] {\n return Array.from(this.agents.keys());\n }\n\n /**\n * Get agent count\n */\n getAgentCount(): number {\n return this.agents.size;\n }\n\n /**\n * Set thinking level for a session's agent\n */\n setThinkingLevel(sessionKey: string, level: ThinkingLevel): void {\n const instance = this.agents.get(sessionKey);\n if (instance) {\n instance.agent.state.thinkingLevel = level;\n log.debug({ sessionKey, thinkingLevel: level }, 'Set thinking level for agent');\n }\n }\n\n /**\n * Dispose all agents\n */\n dispose(): void {\n void this.toolsFactory.shutdownBrowser();\n for (const instance of this.agents.values()) {\n instance.backgroundNudge?.unsubscribe?.();\n instance.agent.abort();\n }\n this.agents.clear();\n this.memoryPrefetchUserTurn.clear();\n this.sessionWorkspaceOverrides.clear();\n for (const rt of this.workspaceRuntimes.values()) {\n void rt.memoryManager.shutdownAll().catch(() => {});\n }\n this.workspaceRuntimes.clear();\n log.debug('All agent instances disposed');\n }\n\n async warmCredentialCache(): Promise<void> {\n const profiles = await this.credentialResolver.listProfiles();\n for (const profile of profiles) {\n const secret = profile.key?.trim()\n ? profile.key.trim()\n : profile.envVar\n ? process.env[profile.envVar]?.trim()\n : undefined;\n if (secret) {\n this.credentialCache.set(profile.provider.toLowerCase(), secret);\n }\n }\n log.debug({ count: this.credentialCache.size }, 'Credential cache warmed');\n }\n\n async refreshCredentials(): Promise<void> {\n this.credentialCache.clear();\n await this.warmCredentialCache();\n }\n\n private resolveApiKeyWithCache(provider: string): string | undefined {\n const key = provider.toLowerCase();\n const cached = this.credentialCache.get(key);\n if (cached) return cached;\n\n const fromDisk = resolveProviderApiKeySync(provider);\n if (fromDisk) {\n this.credentialCache.set(key, fromDisk);\n return fromDisk;\n }\n\n const fromRegistryOrEnv = getApiKeySync(provider);\n if (fromRegistryOrEnv) {\n this.credentialCache.set(key, fromRegistryOrEnv);\n return fromRegistryOrEnv;\n }\n return undefined;\n }\n\n private createAgentForProfile(\n _sessionKey: string,\n profile: EffectiveAgentProfile,\n resolvedWorkspacePath: string,\n rt: WorkspaceRuntime,\n curatedMemorySnapshot: MemorySnapshot,\n ): { agent: Agent; registeredToolNames: string[] } {\n const modelRef = profile.primaryModelRef?.trim() || this.defaultModel;\n const model = this.resolveModelStringToModel(modelRef);\n\n const bootstrapFiles = this.loadBootstrapForProfile(profile);\n const tools = this.toolsFactory.createAllTools({\n workspace: resolvedWorkspacePath,\n bootstrapDir: resolveAgentBootstrapDir(this.config.config!, profile.agentId),\n disabledTools: profile.tools.disable,\n getPrimaryModel: () => this.resolveModelStringToModel(modelRef),\n getBuiltinMemoryStore: () => rt.builtinMemoryStore,\n getMemoryManager: () => rt.memoryManager,\n getSkillManager: () => rt.skillManager,\n });\n const registeredToolNames = tools.map((t) => t.name);\n\n const thinkingLevel =\n (profile.thinkingDefault as ThinkingLevel | undefined) ?? this.config.thinkingLevel ?? 'medium';\n\n const agent = new Agent({\n initialState: {\n systemPrompt: rt.systemPromptBuilder.build(bootstrapFiles, {\n curatedMemorySnapshot,\n externalMemoryInstructions: rt.memoryManager.buildExternalSystemPrompt(),\n workspaceOverride: resolvedWorkspacePath,\n systemPromptOverride: profile.systemPromptOverride,\n skillAllowlist: profile.skillsAllowlist,\n registeredToolNames,\n }),\n model,\n thinkingLevel,\n tools,\n messages: [],\n },\n streamFn: createExtensionAwareStreamFn(),\n getApiKey: (provider: string) => this.resolveApiKeyWithCache(provider),\n });\n return { agent, registeredToolNames };\n }\n\n /**\n * Set model for a specific session\n */\n setModelForSession(sessionKey: string, modelId: string): boolean {\n const instance = this.agents.get(sessionKey);\n if (!instance) {\n log.warn(\n { sessionKey, modelId, activeSessionCount: this.agents.size },\n `setModelForSession: no agent instance for session (create session / run turn first); modelId=${modelId}`,\n );\n return false;\n }\n\n try {\n const model = resolveModel(modelId);\n instance.agent.state.model = model;\n log.info({ sessionKey, modelId }, 'Model set for session');\n return true;\n } catch (err) {\n log.error({ err, sessionKey, modelId }, 'Failed to set model for session');\n return false;\n }\n }\n\n /**\n * Get last assistant content from a session's agent\n */\n getLastAssistantContent(sessionKey: string): string | null {\n const instance = this.agents.get(sessionKey);\n if (!instance) {\n return null;\n }\n\n const messages = instance.agent.state.messages;\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg.role === 'assistant') {\n const content = msg.content;\n if (Array.isArray(content)) {\n return extractTextContent(content as Array<{ type: string; text?: string }>);\n }\n return String(content);\n }\n }\n return null;\n }\n\n /**\n * Replace messages for a session's agent\n */\n replaceMessages(sessionKey: string, messages: AgentMessage[]): boolean {\n const instance = this.agents.get(sessionKey);\n if (!instance) {\n return false;\n }\n\n instance.agent.state.messages = messages;\n return true;\n }\n\n /**\n * Get messages for a session's agent\n */\n getMessages(sessionKey: string): AgentMessage[] | null {\n const instance = this.agents.get(sessionKey);\n if (!instance) {\n return null;\n }\n\n return instance.agent.state.messages;\n }\n\n /**\n * Subscribe to agent events for a session\n */\n subscribeToSession(sessionKey: string, callback: (event: AgentEvent) => void): (() => void) | null {\n const instance = this.agents.get(sessionKey);\n if (!instance) {\n return null;\n }\n\n return instance.agent.subscribe(callback);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent-manager.js","names":[],"sources":["../../../src/agent/agent-manager.ts"],"sourcesContent":["/**\n * Agent Manager - Manages Agent instances per session\n *\n * Each session gets its own Agent instance for true isolation\n * and concurrent processing across sessions.\n */\n\nimport {\n Agent,\n type AgentMessage,\n type AgentEvent,\n type ThinkingLevel,\n} from '@mariozechner/pi-agent-core';\nimport type { Model, Api } from '@mariozechner/pi-ai';\nimport { type Config, getAgentDefaultModelRef } from '../config/schema.js';\nimport { applyConfigOverrides } from '../config/runtime-overrides.js';\nimport {\n type EffectiveAgentProfile,\n resolveAgentBootstrapDir,\n resolveEffectiveAgentProfileForSession,\n} from '../config/agent-profile.js';\nimport { expandWorkspacePathString } from '../config/workspace-path.js';\nimport type { ModelManager } from './models/manager.js';\nimport { createLogger } from '../utils/logger.js';\nimport { resolveProviderApiKeySync } from '../auth/sync-provider-auth.js';\nimport { resolveModel, getDefaultModelSync, getApiKeySync } from '../providers/index.js';\nimport { createExtensionAwareStreamFn } from '../providers/extension-stream-bridge.js';\nimport { CredentialResolver } from '../auth/credentials.js';\nimport { resolveBundledSkillsDir, resolveStateDir } from '../config/paths.js';\nimport { loadBootstrapFiles, extractTextContent, type BootstrapFile } from './context/workspace.js';\nimport { SkillManager } from './skills/index.js';\nimport { SystemPromptBuilder } from './prompt/service-prompt-builder.js';\nimport { AgentToolsFactory } from './tools/factory.js';\nimport type { GatewayClarifyRequestFn } from './tools/clarify-tool.js';\nimport type { ExtensionRegistryImpl as ExtensionRegistry } from '../extensions/index.js';\nimport type { MessageBus } from '../infra/bus/index.js';\nimport type { CronService } from '../cron/index.js';\nimport type { SessionStore } from '../session/store.js';\nimport { isValidSkillEnvVarName } from './skills/required-env-vars.js';\nimport type { SessionContext } from './session/session-context.js';\nimport type { Skill, SkillMarkdownPreviewPayload } from './skills/types.js';\nimport { resolveLocalizedSkillMarkdown, resolveLocalizedSkillMeta } from './skills/skill-view-path.js';\nimport { createSkillConfigManager } from './skills/config.js';\nimport { isUnderManagedSkillsDir } from './skills/managed-store.js';\nimport { loadSkillsLock, type SkillHubLockEntry } from './skills/hub-lock.js';\nimport { basename, resolve, sep } from 'node:path';\n\nimport { BuiltinMemoryStore } from './memory/builtin-memory-store.js';\nimport { createMemoryManagerFromConfig } from './memory/create-memory-manager.js';\nimport { injectPrefetchIntoUserMessage } from './memory/inject-prefetch.js';\nimport {\n isCuratedMemoryInPrompt,\n isMemorySubsystemEnabled,\n resolveBuiltinMemoryStoreConfig,\n shouldInjectMemoryPrefetchThisTurn,\n} from './memory/memory-config.js';\nimport type { MemoryManager } from './memory/manager.js';\nimport type { MemorySnapshot } from './memory/types.js';\nimport { extractAgentUserPlainText } from './memory/user-message-text.js';\nimport { resolveBackgroundReviewSettings } from './background-review/settings.js';\nimport { runBackgroundReviewTurn } from './background-review/run-background-review.js';\nimport {\n isAssistantTurnAborted,\n isAssistantTurnFailed,\n} from './orchestration/llm-turn-retry.js';\n\nconst log = createLogger('AgentManager');\n\n/** Counters for optional post-turn memory/skill review (see `agents.defaults.backgroundReview`). */\nexport interface BackgroundNudgeState {\n turnsSinceMemory: number;\n itersSinceSkill: number;\n pendingMemoryReview: boolean;\n unsubscribe?: () => void;\n}\n\nexport interface SkillCatalogEntry {\n directoryId: string;\n name: string;\n description: string;\n source: Skill['source'];\n path: string;\n managed: boolean;\n /** User toggle in ~/.xopc/skills.json (`entries[name].enabled`). Default true. */\n enabled: boolean;\n /** When true, skill is never injected into `<available_skills>` (SKILL.md frontmatter). */\n disableModelInvocation: boolean;\n /** Hub install provenance when under ~/.xopc/skills and listed in skills-lock.json. */\n hub?: SkillHubLockEntry;\n}\n\nexport interface AgentManagerConfig {\n workspace: string;\n model?: string;\n config?: Config;\n extensionRegistry?: ExtensionRegistry;\n hookRunner?: import('../extensions/index.js').ExtensionHookRunner;\n bus: MessageBus;\n getCurrentContext: () => SessionContext | null;\n /** Session persistence (enables `session_search` when set). */\n getSessionStore?: () => SessionStore;\n /** Clears per-session profile default on teardown. */\n getModelManager?: () => ModelManager;\n // Thinking configuration\n thinkingLevel?: ThinkingLevel;\n reasoningLevel?: 'off' | 'on' | 'stream';\n verboseLevel?: 'off' | 'on' | 'full';\n gatewayClarify?: { requestClarification: GatewayClarifyRequestFn };\n /** Gateway: exposes CronService for the `cronjob` tool. */\n getCronService?: () => CronService | undefined;\n}\n\nexport interface AgentInstance {\n agent: Agent;\n sessionKey: string;\n createdAt: number;\n lastUsedAt: number;\n /** Curated agent-home `memories/` snapshot frozen at agent creation (prefix cache). */\n curatedMemorySnapshot: MemorySnapshot;\n effectiveProfile: EffectiveAgentProfile;\n resolvedWorkspacePath: string;\n /** Tool names registered on this agent (for skill indexing / tool gating). */\n registeredToolNames: string[];\n /** Declared env var names from skill_view; shell reads values from process.env at spawn time. */\n skillEnvPassthroughKeys: Set<string>;\n backgroundNudge: BackgroundNudgeState;\n}\n\ninterface WorkspaceRuntime {\n skillManager: SkillManager;\n systemPromptBuilder: SystemPromptBuilder;\n builtinMemoryStore: BuiltinMemoryStore;\n memoryManager: MemoryManager;\n}\n\nexport class AgentManager {\n private agents = new Map<string, AgentInstance>();\n private config: AgentManagerConfig;\n private toolsFactory: AgentToolsFactory;\n\n private mergedConfig(): Config | undefined {\n const base = this.config.config;\n return base ? applyConfigOverrides(base) : undefined;\n }\n /** Default agent workspace (effective profile for `getDefaultAgentId`). */\n private baseWorkspacePath: string;\n /** Per-session absolute markdown workspace when `SessionAgentConfig.workingDirectoryOverride` is set. */\n private sessionWorkspaceOverrides = new Map<string, string>();\n private defaultModel: string;\n private credentialCache = new Map<string, string>();\n private credentialResolver: CredentialResolver;\n private workspaceRuntimes = new Map<string, WorkspaceRuntime>();\n /** Per-session user-message index for prefetch injection cadence. */\n private memoryPrefetchUserTurn = new Map<string, number>();\n\n constructor(config: AgentManagerConfig) {\n this.config = config;\n this.baseWorkspacePath = this.computeBaseWorkspacePath();\n const baseRt = this.getWorkspaceRuntime(this.baseWorkspacePath);\n\n this.toolsFactory = new AgentToolsFactory({\n workspace: this.baseWorkspacePath,\n extensionRegistry: config.extensionRegistry,\n getCurrentContext: config.getCurrentContext,\n hookRunner: config.hookRunner,\n bus: config.bus,\n getConfig: () => this.mergedConfig(),\n getPrimaryModel: () => this.resolveModelStringToModel(this.pickDefaultModelRef()),\n getBuiltinMemoryStore: () => baseRt.builtinMemoryStore,\n getMemoryManager: () => baseRt.memoryManager,\n getSessionStore: config.getSessionStore,\n gatewayClarify: config.gatewayClarify,\n getCronService: config.getCronService,\n getSkillIndexingContext: () => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return undefined;\n const inst = this.agents.get(ctx.sessionKey);\n if (!inst) return undefined;\n return {\n registeredToolNames: inst.registeredToolNames,\n skillAllowlist: inst.effectiveProfile.skillsAllowlist,\n };\n },\n onSkillsFilesystemMutate: () => {\n this.refreshSkillsAfterDiskChange();\n },\n getSkillPassthroughEnvVarNames: () => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return [];\n return [...(this.agents.get(ctx.sessionKey)?.skillEnvPassthroughKeys ?? [])];\n },\n registerSkillEnvPassthrough: (names: string[]) => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return;\n const inst = this.agents.get(ctx.sessionKey);\n if (!inst) return;\n for (const n of names) {\n if (isValidSkillEnvVarName(n)) {\n inst.skillEnvPassthroughKeys.add(n.trim());\n }\n }\n },\n });\n\n this.defaultModel = config.model || getDefaultModelSync(config.config);\n\n this.credentialResolver = new CredentialResolver();\n this.warmCredentialCache().catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.warn({ err, errorMessage: em }, `Credential cache pre-warm failed: ${em}`);\n });\n }\n\n private computeBaseWorkspacePath(): string {\n const cfg = this.config.config;\n if (!cfg) {\n return expandWorkspacePathString(this.config.workspace);\n }\n return resolveEffectiveAgentProfileForSession(cfg, null).resolvedWorkspacePath;\n }\n\n /**\n * Workspace root for inbound attachments / side effects for this session's agent id.\n * Uses in-memory session workspace overrides when the session has a persisted `workingDirectoryOverride`.\n */\n getResolvedWorkspaceForSession(sessionKey: string): string {\n const cfg = this.config.config!;\n const fromMap = this.sessionWorkspaceOverrides.get(sessionKey);\n if (fromMap !== undefined) {\n return fromMap;\n }\n return resolveEffectiveAgentProfileForSession(cfg, sessionKey).resolvedWorkspacePath;\n }\n\n /**\n * Sync in-memory workspace override from session config (after load or PATCH).\n * Pass `null` to clear when the session has no `workingDirectoryOverride` on disk.\n */\n setSessionWorkspaceOverride(sessionKey: string, absolutePath: string | null): void {\n if (absolutePath === null || absolutePath === '') {\n this.sessionWorkspaceOverrides.delete(sessionKey);\n } else {\n this.sessionWorkspaceOverrides.set(sessionKey, absolutePath);\n }\n }\n\n /** Merged `thinkingDefault` for this session's agent id (defaults + `agents.list`). */\n getThinkingDefaultForSession(\n sessionKey: string,\n ): import('./transcript/thinking-types.js').ThinkLevel | undefined {\n const cfg = this.mergedConfig();\n if (!cfg) {\n return undefined;\n }\n return resolveEffectiveAgentProfileForSession(cfg, sessionKey).thinkingDefault;\n }\n\n private getWorkspaceRuntime(resolvedPath: string): WorkspaceRuntime {\n const existing = this.workspaceRuntimes.get(resolvedPath);\n if (existing) {\n return existing;\n }\n\n const builtinMemoryStore = new BuiltinMemoryStore(\n resolveBuiltinMemoryStoreConfig(resolvedPath, this.config.config),\n );\n const memoryManager = createMemoryManagerFromConfig(\n resolvedPath,\n builtinMemoryStore,\n this.config.config,\n );\n const skillManager = new SkillManager(resolvedPath, resolveBundledSkillsDir());\n const systemPromptBuilder = new SystemPromptBuilder({\n workspace: resolvedPath,\n config: this.config.config!,\n skillManager,\n });\n\n const rt: WorkspaceRuntime = {\n skillManager,\n systemPromptBuilder,\n builtinMemoryStore,\n memoryManager,\n };\n this.workspaceRuntimes.set(resolvedPath, rt);\n return rt;\n }\n\n private pickDefaultModelRef(): string {\n const cfg = this.mergedConfig();\n const ref = getAgentDefaultModelRef(cfg);\n return ref?.trim() || getDefaultModelSync(cfg);\n }\n\n private resolveModelStringToModel(modelRef: string): Model<Api> {\n try {\n return resolveModel(modelRef);\n } catch {\n const fallback = getDefaultModelSync(this.mergedConfig());\n log.warn({ modelRef, fallback }, 'Model not found, using default');\n return resolveModel(fallback);\n }\n }\n\n /**\n * Keep defaults in sync when config is hot-reloaded or saved from the UI.\n */\n updateAgentDefaults(config: Config): void {\n this.config.config = config;\n const ref = getAgentDefaultModelRef(config);\n this.config.model = ref;\n this.defaultModel = ref || getDefaultModelSync(config);\n this.baseWorkspacePath = this.computeBaseWorkspacePath();\n void this.toolsFactory.shutdownBrowser();\n for (const rt of this.workspaceRuntimes.values()) {\n void rt.memoryManager.shutdownAll().catch(() => {});\n }\n this.workspaceRuntimes.clear();\n this.toolsFactory = new AgentToolsFactory({\n workspace: this.baseWorkspacePath,\n extensionRegistry: this.config.extensionRegistry,\n getCurrentContext: this.config.getCurrentContext,\n bus: this.config.bus,\n getConfig: () => this.mergedConfig(),\n getPrimaryModel: () => this.resolveModelStringToModel(this.pickDefaultModelRef()),\n getBuiltinMemoryStore: () => this.getWorkspaceRuntime(this.baseWorkspacePath).builtinMemoryStore,\n getMemoryManager: () => this.getWorkspaceRuntime(this.baseWorkspacePath).memoryManager,\n getSessionStore: this.config.getSessionStore,\n gatewayClarify: this.config.gatewayClarify,\n getCronService: this.config.getCronService,\n getSkillIndexingContext: () => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return undefined;\n const inst = this.agents.get(ctx.sessionKey);\n if (!inst) return undefined;\n return {\n registeredToolNames: inst.registeredToolNames,\n skillAllowlist: inst.effectiveProfile.skillsAllowlist,\n };\n },\n onSkillsFilesystemMutate: () => {\n this.refreshSkillsAfterDiskChange();\n },\n getSkillPassthroughEnvVarNames: () => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return [];\n return [...(this.agents.get(ctx.sessionKey)?.skillEnvPassthroughKeys ?? [])];\n },\n registerSkillEnvPassthrough: (names: string[]) => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return;\n const inst = this.agents.get(ctx.sessionKey);\n if (!inst) return;\n for (const n of names) {\n if (isValidSkillEnvVarName(n)) {\n inst.skillEnvPassthroughKeys.add(n.trim());\n }\n }\n },\n });\n }\n\n getMemoryManager(): MemoryManager {\n return this.getWorkspaceRuntime(this.baseWorkspacePath).memoryManager;\n }\n\n private getMemoryManagerForSession(sessionKey: string): MemoryManager {\n const path = this.getResolvedWorkspaceForSession(sessionKey);\n return this.getWorkspaceRuntime(path).memoryManager;\n }\n\n /**\n * Prefix the user turn with fenced prefetched memory (external providers).\n */\n async applyMemoryPrefetchToUserMessage(\n userMessage: AgentMessage,\n sessionKey: string,\n ): Promise<AgentMessage> {\n if (!isMemorySubsystemEnabled(this.config.config)) {\n return userMessage;\n }\n const plain = extractAgentUserPlainText(userMessage);\n const turn = (this.memoryPrefetchUserTurn.get(sessionKey) ?? 0) + 1;\n this.memoryPrefetchUserTurn.set(sessionKey, turn);\n if (!shouldInjectMemoryPrefetchThisTurn(this.config.config, turn)) {\n return userMessage;\n }\n return injectPrefetchIntoUserMessage(\n this.getMemoryManagerForSession(sessionKey),\n sessionKey,\n userMessage,\n plain,\n );\n }\n\n /**\n * After a completed turn: sync external providers and queue next-turn prefetch.\n */\n afterAgentTurn(sessionKey: string, userPlainText: string): void {\n if (!isMemorySubsystemEnabled(this.config.config)) {\n return;\n }\n const assistant = this.getLastAssistantContent(sessionKey) ?? '';\n const mm = this.getMemoryManagerForSession(sessionKey);\n mm.syncAll(userPlainText, assistant, { sessionId: sessionKey });\n mm.queuePrefetchAll(userPlainText, { sessionId: sessionKey });\n }\n\n /**\n * Call once per user turn before the main `agent.prompt` (via {@link runAgentTurnWithModelFallbacks} `beforeUserPrompt`).\n */\n beginBackgroundReviewUserTurn(sessionKey: string): void {\n const inst = this.agents.get(sessionKey);\n if (!inst?.backgroundNudge) return;\n const cfg = resolveBackgroundReviewSettings(this.config.config);\n if (!cfg.enabled || cfg.memoryNudgeInterval <= 0) return;\n if (!inst.registeredToolNames.includes('curated_memory')) return;\n inst.backgroundNudge.turnsSinceMemory += 1;\n if (inst.backgroundNudge.turnsSinceMemory >= cfg.memoryNudgeInterval) {\n inst.backgroundNudge.pendingMemoryReview = true;\n inst.backgroundNudge.turnsSinceMemory = 0;\n }\n }\n\n /**\n * After a successful main turn (after memory sync via `afterAgentTurn`), may run a quiet follow-up for memory/skills.\n */\n scheduleBackgroundReviewAfterUserTurn(sessionKey: string): void {\n void this.runBackgroundReviewIfNeeded(sessionKey).catch((err) => {\n log.warn({ err, sessionKey }, 'Background review failed');\n });\n }\n\n private async runBackgroundReviewIfNeeded(sessionKey: string): Promise<void> {\n const inst = this.agents.get(sessionKey);\n if (!inst?.backgroundNudge) return;\n const settings = resolveBackgroundReviewSettings(this.config.config);\n if (!settings.enabled) return;\n if (isAssistantTurnAborted(inst.agent) || isAssistantTurnFailed(inst.agent)) return;\n const last = this.getLastAssistantContent(sessionKey);\n if (!last?.trim()) return;\n\n const reviewMemory = inst.backgroundNudge.pendingMemoryReview;\n inst.backgroundNudge.pendingMemoryReview = false;\n\n let reviewSkills = false;\n if (settings.skillNudgeInterval > 0 && inst.registeredToolNames.includes('skill_manage')) {\n if (inst.backgroundNudge.itersSinceSkill >= settings.skillNudgeInterval) {\n reviewSkills = true;\n inst.backgroundNudge.itersSinceSkill = 0;\n }\n }\n\n if (!reviewMemory && !reviewSkills) return;\n\n const rt = this.getWorkspaceRuntime(inst.resolvedWorkspacePath);\n await runBackgroundReviewTurn({\n sessionKey,\n mainAgent: inst.agent,\n settings,\n reviewMemory,\n reviewSkills,\n registeredToolNames: inst.registeredToolNames,\n skillAllowlist: inst.effectiveProfile.skillsAllowlist,\n workspacePath: inst.resolvedWorkspacePath,\n skillManager: rt.skillManager,\n builtinMemoryStore: rt.builtinMemoryStore,\n memoryManager: rt.memoryManager,\n getConfig: () => this.mergedConfig(),\n onSkillsFilesystemMutate: () => this.refreshSkillsAfterDiskChange(),\n });\n }\n\n private attachBackgroundNudgeListeners(sessionKey: string): void {\n const inst = this.agents.get(sessionKey);\n if (!inst?.backgroundNudge) return;\n inst.backgroundNudge.unsubscribe?.();\n const unsub = inst.agent.subscribe((ev: AgentEvent) => {\n const cfg = resolveBackgroundReviewSettings(this.config.config);\n if (!cfg.enabled || cfg.skillNudgeInterval <= 0) return;\n if (!inst.registeredToolNames.includes('skill_manage')) return;\n if (ev.type === 'turn_start') {\n inst.backgroundNudge.itersSinceSkill += 1;\n }\n if (ev.type === 'tool_execution_end') {\n const te = ev as Extract<AgentEvent, { type: 'tool_execution_end' }>;\n if (\n !te.isError &&\n typeof te.toolName === 'string' &&\n te.toolName.trim() === 'skill_manage'\n ) {\n inst.backgroundNudge.itersSinceSkill = 0;\n }\n }\n });\n inst.backgroundNudge.unsubscribe = unsub;\n }\n\n /**\n * Expand `/skill:name` user text into the full skill block for the current turn (WebChat, channels).\n */\n expandSkillUserText(text: string): string {\n const ctx = this.config.getCurrentContext?.();\n const path = ctx?.sessionKey\n ? this.getResolvedWorkspaceForSession(ctx.sessionKey)\n : this.baseWorkspacePath;\n return this.getWorkspaceRuntime(path).skillManager.expandCommand(text);\n }\n\n /**\n * Structured SKILL.md preview for the gateway console.\n * When `lang` is provided (e.g. \"zh\"), tries SKILL-{lang}.md first; falls back to SKILL.md.\n */\n getSkillMarkdownSource(skillName: string, lang?: string): SkillMarkdownPreviewPayload | null {\n const skill = this.getWorkspaceRuntime(this.baseWorkspacePath).skillManager.findSkill(skillName);\n if (!skill) return null;\n\n // Try localized file for display\n if (lang) {\n const localized = resolveLocalizedSkillMarkdown(skill, lang);\n if (localized) return localized;\n }\n\n return {\n name: skill.name,\n description: skill.description,\n bodyMarkdown: skill.content,\n disableModelInvocation: skill.disableModelInvocation,\n metadata: skill.metadata,\n toolConditions: skill.toolConditions,\n requiredEnvVarNames: skill.requiredEnvVarNames,\n };\n }\n\n private loadBootstrapForProfile(profile: EffectiveAgentProfile): BootstrapFile[] {\n const cfg = this.config.config!;\n const bootstrapDir = resolveAgentBootstrapDir(cfg, profile.agentId);\n return loadBootstrapFiles(bootstrapDir);\n }\n\n getSkillCatalog(lang?: string): SkillCatalogEntry[] {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n const lock = loadSkillsLock();\n return this.getWorkspaceRuntime(this.baseWorkspacePath).skillManager.getSkills().map((s) => {\n const base = resolve(s.baseDir);\n const managed = isUnderManagedSkillsDir(s.baseDir);\n const directoryId = base.split(sep).filter(Boolean).pop() || s.name;\n const enabled = !(skillsConfig.entries?.[s.name]?.enabled === false);\n const hubKey = managed ? basename(base) : '';\n const hub = managed && hubKey ? lock.entries[hubKey] : undefined;\n\n // Attempt localized name/description for display\n const localized = lang ? resolveLocalizedSkillMeta(s, lang) : null;\n\n return {\n directoryId,\n name: localized?.name ?? s.name,\n description: localized?.description ?? s.description,\n category: s.category,\n source: s.source,\n path: s.baseDir,\n managed,\n enabled,\n disableModelInvocation: s.disableModelInvocation,\n ...(hub ? { hub } : {}),\n };\n });\n }\n\n /**\n * After ~/.xopc/skills.json changes (enable/disable), refresh `<available_skills>` on active agents.\n */\n refreshSkillsAfterSkillConfigChange(): void {\n const touched = new Set<string>();\n for (const instance of this.agents.values()) {\n const rt = this.getWorkspaceRuntime(instance.resolvedWorkspacePath);\n if (!touched.has(instance.resolvedWorkspacePath)) {\n rt.skillManager.refreshPromptFromConfig();\n touched.add(instance.resolvedWorkspacePath);\n }\n const bootstrapFiles = this.loadBootstrapForProfile(instance.effectiveProfile);\n const newPrompt = rt.systemPromptBuilder.build(bootstrapFiles, {\n curatedMemorySnapshot: instance.curatedMemorySnapshot,\n externalMemoryInstructions: rt.memoryManager.buildExternalSystemPrompt(),\n workspaceOverride: instance.resolvedWorkspacePath,\n systemPromptOverride: instance.effectiveProfile.systemPromptOverride,\n skillAllowlist: instance.effectiveProfile.skillsAllowlist,\n registeredToolNames: instance.registeredToolNames,\n });\n instance.agent.state.systemPrompt = newPrompt;\n }\n log.info({ agents: this.agents.size }, 'Skill toggles applied; system prompt updated');\n }\n\n /**\n * Reload skills from disk and refresh system prompt on all active Agent instances.\n */\n refreshSkillsAfterDiskChange(): void {\n // Reload every workspace SkillManager first. When there are no active agent sessions\n // (e.g. gateway UI only), the loop below runs zero times — without this, `getSkillCatalog()`\n // and delete flows still see stale in-memory skills after ~/.xopc/skills changes.\n for (const rt of this.workspaceRuntimes.values()) {\n rt.skillManager.reload();\n }\n\n const touched = new Set<string>();\n for (const instance of this.agents.values()) {\n const rt = this.getWorkspaceRuntime(instance.resolvedWorkspacePath);\n if (!touched.has(instance.resolvedWorkspacePath)) {\n touched.add(instance.resolvedWorkspacePath);\n }\n const bootstrapFiles = this.loadBootstrapForProfile(instance.effectiveProfile);\n const newPrompt = rt.systemPromptBuilder.rebuild(bootstrapFiles, {\n curatedMemorySnapshot: instance.curatedMemorySnapshot,\n externalMemoryInstructions: rt.memoryManager.buildExternalSystemPrompt(),\n workspaceOverride: instance.resolvedWorkspacePath,\n systemPromptOverride: instance.effectiveProfile.systemPromptOverride,\n skillAllowlist: instance.effectiveProfile.skillsAllowlist,\n registeredToolNames: instance.registeredToolNames,\n });\n instance.agent.state.systemPrompt = newPrompt;\n }\n log.info({ agents: this.agents.size }, 'Skills refreshed; system prompt updated');\n }\n\n /**\n * Get or create an Agent instance for a session\n */\n getOrCreateAgent(sessionKey: string): Agent {\n const cfg = this.config.config!;\n const targetPath = this.getResolvedWorkspaceForSession(sessionKey);\n const existing = this.agents.get(sessionKey);\n if (existing) {\n if (existing.resolvedWorkspacePath !== targetPath) {\n this.removeAgent(sessionKey);\n } else {\n existing.lastUsedAt = Date.now();\n if (!existing.backgroundNudge) {\n existing.backgroundNudge = {\n turnsSinceMemory: 0,\n itersSinceSkill: 0,\n pendingMemoryReview: false,\n };\n this.attachBackgroundNudgeListeners(sessionKey);\n }\n log.debug({ sessionKey }, 'Reusing existing agent instance');\n return existing.agent;\n }\n }\n\n const profile = resolveEffectiveAgentProfileForSession(cfg, sessionKey);\n const resolvedPath = targetPath;\n const rt = this.getWorkspaceRuntime(resolvedPath);\n\n if (isMemorySubsystemEnabled(cfg)) {\n void rt.memoryManager\n .initializeAll(sessionKey, { workspace: resolvedPath })\n .catch((err) => log.warn({ err, sessionKey }, 'memory initializeAll failed'));\n }\n\n const curatedOn = isCuratedMemoryInPrompt(cfg);\n if (curatedOn) {\n rt.builtinMemoryStore.loadFromDiskSync();\n }\n const snap = curatedOn ? rt.builtinMemoryStore.getSnapshot() : { memory: '', user: '' };\n const curatedMemorySnapshot: MemorySnapshot = { memory: snap.memory, user: snap.user };\n\n const { agent, registeredToolNames } = this.createAgentForProfile(\n sessionKey,\n profile,\n resolvedPath,\n rt,\n curatedMemorySnapshot,\n );\n\n this.agents.set(sessionKey, {\n agent,\n sessionKey,\n createdAt: Date.now(),\n lastUsedAt: Date.now(),\n curatedMemorySnapshot,\n effectiveProfile: profile,\n resolvedWorkspacePath: resolvedPath,\n registeredToolNames,\n skillEnvPassthroughKeys: new Set<string>(),\n backgroundNudge: {\n turnsSinceMemory: 0,\n itersSinceSkill: 0,\n pendingMemoryReview: false,\n },\n });\n\n this.attachBackgroundNudgeListeners(sessionKey);\n\n const modelRef = profile.primaryModelRef?.trim() || this.defaultModel;\n this.config.getModelManager?.().setSessionProfileDefault(sessionKey, modelRef);\n\n log.debug({ sessionKey, totalAgents: this.agents.size, agentId: profile.agentId }, 'Created new agent instance');\n return agent;\n }\n\n /**\n * Get existing agent for a session (if any)\n */\n getAgent(sessionKey: string): Agent | undefined {\n return this.agents.get(sessionKey)?.agent;\n }\n\n /**\n * Check if an agent exists for a session\n */\n hasAgent(sessionKey: string): boolean {\n return this.agents.has(sessionKey);\n }\n\n /**\n * Remove an agent instance\n */\n removeAgent(sessionKey: string): boolean {\n const instance = this.agents.get(sessionKey);\n if (instance) {\n instance.backgroundNudge?.unsubscribe?.();\n void this.toolsFactory.closeBrowserPageForSession(sessionKey);\n instance.agent.abort();\n this.agents.delete(sessionKey);\n this.memoryPrefetchUserTurn.delete(sessionKey);\n this.config.getModelManager?.().clearSessionProfileDefault(sessionKey);\n log.info({ sessionKey, totalAgents: this.agents.size }, 'Removed agent instance');\n return true;\n }\n return false;\n }\n\n /**\n * Get all active session keys\n */\n getActiveSessions(): string[] {\n return Array.from(this.agents.keys());\n }\n\n /**\n * Get agent count\n */\n getAgentCount(): number {\n return this.agents.size;\n }\n\n /**\n * Set thinking level for a session's agent\n */\n setThinkingLevel(sessionKey: string, level: ThinkingLevel): void {\n const instance = this.agents.get(sessionKey);\n if (instance) {\n instance.agent.state.thinkingLevel = level;\n log.debug({ sessionKey, thinkingLevel: level }, 'Set thinking level for agent');\n }\n }\n\n /**\n * Dispose all agents\n */\n dispose(): void {\n void this.toolsFactory.shutdownBrowser();\n for (const instance of this.agents.values()) {\n instance.backgroundNudge?.unsubscribe?.();\n instance.agent.abort();\n }\n this.agents.clear();\n this.memoryPrefetchUserTurn.clear();\n this.sessionWorkspaceOverrides.clear();\n for (const rt of this.workspaceRuntimes.values()) {\n void rt.memoryManager.shutdownAll().catch(() => {});\n }\n this.workspaceRuntimes.clear();\n log.debug('All agent instances disposed');\n }\n\n async warmCredentialCache(): Promise<void> {\n const profiles = await this.credentialResolver.listProfiles();\n for (const profile of profiles) {\n const secret = profile.key?.trim()\n ? profile.key.trim()\n : profile.envVar\n ? process.env[profile.envVar]?.trim()\n : undefined;\n if (secret) {\n this.credentialCache.set(profile.provider.toLowerCase(), secret);\n }\n }\n log.debug({ count: this.credentialCache.size }, 'Credential cache warmed');\n }\n\n async refreshCredentials(): Promise<void> {\n this.credentialCache.clear();\n await this.warmCredentialCache();\n }\n\n private resolveApiKeyWithCache(provider: string): string | undefined {\n const key = provider.toLowerCase();\n const cached = this.credentialCache.get(key);\n if (cached) return cached;\n\n const fromDisk = resolveProviderApiKeySync(provider);\n if (fromDisk) {\n this.credentialCache.set(key, fromDisk);\n return fromDisk;\n }\n\n const fromRegistryOrEnv = getApiKeySync(provider);\n if (fromRegistryOrEnv) {\n this.credentialCache.set(key, fromRegistryOrEnv);\n return fromRegistryOrEnv;\n }\n return undefined;\n }\n\n private createAgentForProfile(\n _sessionKey: string,\n profile: EffectiveAgentProfile,\n resolvedWorkspacePath: string,\n rt: WorkspaceRuntime,\n curatedMemorySnapshot: MemorySnapshot,\n ): { agent: Agent; registeredToolNames: string[] } {\n const modelRef = profile.primaryModelRef?.trim() || this.defaultModel;\n const model = this.resolveModelStringToModel(modelRef);\n\n const bootstrapFiles = this.loadBootstrapForProfile(profile);\n const tools = this.toolsFactory.createAllTools({\n workspace: resolvedWorkspacePath,\n bootstrapDir: resolveAgentBootstrapDir(this.config.config!, profile.agentId),\n disabledTools: profile.tools.disable,\n getPrimaryModel: () => this.resolveModelStringToModel(modelRef),\n getBuiltinMemoryStore: () => rt.builtinMemoryStore,\n getMemoryManager: () => rt.memoryManager,\n getSkillManager: () => rt.skillManager,\n });\n const registeredToolNames = tools.map((t) => t.name);\n\n const thinkingLevel =\n (profile.thinkingDefault as ThinkingLevel | undefined) ?? this.config.thinkingLevel ?? 'medium';\n\n const agent = new Agent({\n initialState: {\n systemPrompt: rt.systemPromptBuilder.build(bootstrapFiles, {\n curatedMemorySnapshot,\n externalMemoryInstructions: rt.memoryManager.buildExternalSystemPrompt(),\n workspaceOverride: resolvedWorkspacePath,\n systemPromptOverride: profile.systemPromptOverride,\n skillAllowlist: profile.skillsAllowlist,\n registeredToolNames,\n }),\n model,\n thinkingLevel,\n tools,\n messages: [],\n },\n streamFn: createExtensionAwareStreamFn(),\n getApiKey: (provider: string) => this.resolveApiKeyWithCache(provider),\n });\n return { agent, registeredToolNames };\n }\n\n /**\n * Set model for a specific session\n */\n setModelForSession(sessionKey: string, modelId: string): boolean {\n const instance = this.agents.get(sessionKey);\n if (!instance) {\n log.warn(\n { sessionKey, modelId, activeSessionCount: this.agents.size },\n `setModelForSession: no agent instance for session (create session / run turn first); modelId=${modelId}`,\n );\n return false;\n }\n\n try {\n const model = resolveModel(modelId);\n instance.agent.state.model = model;\n log.info({ sessionKey, modelId }, 'Model set for session');\n return true;\n } catch (err) {\n log.error({ err, sessionKey, modelId }, 'Failed to set model for session');\n return false;\n }\n }\n\n /**\n * Get last assistant content from a session's agent\n */\n getLastAssistantContent(sessionKey: string): string | null {\n const instance = this.agents.get(sessionKey);\n if (!instance) {\n return null;\n }\n\n const messages = instance.agent.state.messages;\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg.role === 'assistant') {\n const content = msg.content;\n if (Array.isArray(content)) {\n return extractTextContent(content as Array<{ type: string; text?: string }>);\n }\n return String(content);\n }\n }\n return null;\n }\n\n /**\n * Replace messages for a session's agent\n */\n replaceMessages(sessionKey: string, messages: AgentMessage[]): boolean {\n const instance = this.agents.get(sessionKey);\n if (!instance) {\n return false;\n }\n\n instance.agent.state.messages = messages;\n return true;\n }\n\n /**\n * Get messages for a session's agent\n */\n getMessages(sessionKey: string): AgentMessage[] | null {\n const instance = this.agents.get(sessionKey);\n if (!instance) {\n return null;\n }\n\n return instance.agent.state.messages;\n }\n\n /**\n * Subscribe to agent events for a session\n */\n subscribeToSession(sessionKey: string, callback: (event: AgentEvent) => void): (() => void) | null {\n const instance = this.agents.get(sessionKey);\n if (!instance) {\n return null;\n }\n\n return instance.agent.subscribe(callback);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
3
|
import { init_paths, resolveAgentDir } from "../../config/paths.js";
|
|
4
|
+
import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
|
|
4
5
|
import { join } from "path";
|
|
5
6
|
import { existsSync, watch } from "fs";
|
|
6
|
-
import { mkdir, readFile, readdir, rename
|
|
7
|
+
import { mkdir, readFile, readdir, rename } from "fs/promises";
|
|
7
8
|
//#region src/agent/ipc/inbox.ts
|
|
9
|
+
init_write_file_atomic();
|
|
8
10
|
init_logger();
|
|
9
11
|
init_paths();
|
|
10
12
|
const log = createLogger("AgentInbox");
|
|
@@ -27,7 +29,7 @@ var AgentInbox = class AgentInbox {
|
|
|
27
29
|
*/
|
|
28
30
|
async enqueue(message) {
|
|
29
31
|
await mkdir(this.pendingDir, { recursive: true });
|
|
30
|
-
await
|
|
32
|
+
await writeTextAtomic(join(this.pendingDir, `${message.id}.json`), JSON.stringify(message, null, 2));
|
|
31
33
|
log.debug({
|
|
32
34
|
messageId: message.id,
|
|
33
35
|
to: message.to
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbox.js","names":[],"sources":["../../../../src/agent/ipc/inbox.ts"],"sourcesContent":["import { readFile,
|
|
1
|
+
{"version":3,"file":"inbox.js","names":[],"sources":["../../../../src/agent/ipc/inbox.ts"],"sourcesContent":["import { readFile, readdir, rename, mkdir } from 'fs/promises';\nimport { writeTextAtomic } from '../../infra/write-file-atomic.js';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { watch, type FSWatcher } from 'fs';\nimport { createLogger } from '../../utils/logger.js';\nimport type { Config } from '../../config/schema.js';\nimport { resolveAgentDir } from '../../config/paths.js';\nimport type { AgentIPCMessage } from './types.js';\n\nconst log = createLogger('AgentInbox');\n\n// ============================================\n// Agent Inbox (File-based IPC)\n// ============================================\n\nexport class AgentInbox {\n private readonly pendingDir: string;\n private readonly processedDir: string;\n private watcher?: FSWatcher;\n\n constructor(agentDir: string) {\n this.pendingDir = join(agentDir, 'inbox', 'pending');\n this.processedDir = join(agentDir, 'inbox', 'processed');\n }\n\n /**\n * Static factory using agent ID (paths from config).\n */\n static forAgent(config: Config, agentId: string): AgentInbox {\n return new AgentInbox(resolveAgentDir(config, agentId));\n }\n\n /**\n * Enqueue a message\n */\n async enqueue(message: AgentIPCMessage): Promise<void> {\n await mkdir(this.pendingDir, { recursive: true });\n\n const filePath = join(this.pendingDir, `${message.id}.json`);\n await writeTextAtomic(filePath, JSON.stringify(message, null, 2));\n\n log.debug({ messageId: message.id, to: message.to }, 'Enqueued message');\n }\n\n /**\n * Dequeue the oldest pending message\n */\n async dequeue(): Promise<AgentIPCMessage | null> {\n await mkdir(this.pendingDir, { recursive: true });\n await mkdir(this.processedDir, { recursive: true });\n\n const files = await readdir(this.pendingDir).catch(() => [] as string[]);\n if (files.length === 0) return null;\n\n // Sort by filename (timestamp-based IDs)\n const sorted = files.filter((f) => f.endsWith('.json')).sort();\n if (sorted.length === 0) return null;\n\n const fileName = sorted[0];\n const filePath = join(this.pendingDir, fileName);\n\n try {\n const content = await readFile(filePath, 'utf-8');\n const message = JSON.parse(content) as AgentIPCMessage;\n\n // Move to processed\n const processedPath = join(this.processedDir, fileName);\n await rename(filePath, processedPath);\n\n log.debug({ messageId: message.id, from: message.from }, 'Dequeued message');\n return message;\n } catch (error) {\n log.warn({ fileName, error }, 'Failed to dequeue message');\n return null;\n }\n }\n\n /**\n * Peek at pending messages without removing them\n */\n async peek(limit: number = 10): Promise<AgentIPCMessage[]> {\n await mkdir(this.pendingDir, { recursive: true });\n\n const files = await readdir(this.pendingDir).catch(() => [] as string[]);\n const jsonFiles = files.filter((f) => f.endsWith('.json')).sort();\n\n const messages: AgentIPCMessage[] = [];\n\n for (const fileName of jsonFiles.slice(0, limit)) {\n try {\n const filePath = join(this.pendingDir, fileName);\n const content = await readFile(filePath, 'utf-8');\n const message = JSON.parse(content) as AgentIPCMessage;\n messages.push(message);\n } catch (error) {\n log.warn({ fileName, error }, 'Failed to read message');\n }\n }\n\n return messages;\n }\n\n /**\n * Count pending messages\n */\n async count(): Promise<number> {\n if (!existsSync(this.pendingDir)) return 0;\n\n const files = await readdir(this.pendingDir).catch(() => [] as string[]);\n return files.filter((f) => f.endsWith('.json')).length;\n }\n\n /**\n * Watch for new messages\n */\n async watch(handler: (msg: AgentIPCMessage) => Promise<void>): Promise<() => void> {\n await mkdir(this.pendingDir, { recursive: true });\n\n // Initial processing of any existing messages\n await this.processPending(handler);\n\n // Set up watcher\n this.watcher = watch(this.pendingDir, async (eventType, filename) => {\n if (eventType === 'rename' && filename?.endsWith('.json')) {\n await this.processPending(handler);\n }\n });\n\n // Return cleanup function\n return () => {\n this.watcher?.close();\n this.watcher = undefined;\n };\n }\n\n /**\n * Stop watching\n */\n stopWatching(): void {\n this.watcher?.close();\n this.watcher = undefined;\n }\n\n /**\n * Clear all processed messages\n */\n async clearProcessed(olderThanMs?: number): Promise<number> {\n if (!existsSync(this.processedDir)) return 0;\n\n const files = await readdir(this.processedDir).catch(() => [] as string[]);\n const cutoff = olderThanMs ? Date.now() - olderThanMs : 0;\n\n let cleared = 0;\n\n for (const fileName of files) {\n if (!fileName.endsWith('.json')) continue;\n\n const filePath = join(this.processedDir, fileName);\n\n try {\n if (olderThanMs) {\n const stats = await import('fs/promises').then((fs) => fs.stat(filePath));\n if (stats.mtimeMs < cutoff) {\n await import('fs/promises').then((fs) => fs.unlink(filePath));\n cleared++;\n }\n } else {\n await import('fs/promises').then((fs) => fs.unlink(filePath));\n cleared++;\n }\n } catch (error) {\n log.warn({ fileName, error }, 'Failed to clear processed message');\n }\n }\n\n return cleared;\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private async processPending(\n handler: (msg: AgentIPCMessage) => Promise<void>\n ): Promise<void> {\n while (true) {\n const msg = await this.dequeue();\n if (!msg) break;\n\n try {\n await handler(msg);\n } catch (error) {\n log.error({ messageId: msg.id, error }, 'Error processing message');\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -3,8 +3,8 @@ import { init_logger } from "../../../utils/logger.js";
|
|
|
3
3
|
import { SHORT_TERM_PROMOTION_LOCK_RELATIVE, SHORT_TERM_RECALL_STORE_RELATIVE } from "./constants.js";
|
|
4
4
|
import { buildEntryKey, clamp01, isoDay, normalizeMemoryPath } from "./utils.js";
|
|
5
5
|
import path from "node:path";
|
|
6
|
-
import fs from "node:fs/promises";
|
|
7
6
|
import { createHash, randomUUID } from "node:crypto";
|
|
7
|
+
import fs from "node:fs/promises";
|
|
8
8
|
//#region src/agent/memory/dreaming/short-term-store.ts
|
|
9
9
|
init_logger();
|
|
10
10
|
const log = createLogger("Dreaming:Store");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DEFAULT_DEEP_CRON, DIVERSITY_WEIGHT, MS_PER_DAY, REINFORCEMENT_WEIGHT } from "./constants.js";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import fs from "node:fs/promises";
|
|
4
3
|
import { createHash } from "node:crypto";
|
|
4
|
+
import fs from "node:fs/promises";
|
|
5
5
|
//#region src/agent/memory/dreaming/utils.ts
|
|
6
6
|
/** Normalize a workspace-relative memory path: forward slashes, no odd ../ escapes at start. */
|
|
7
7
|
function normalizeMemoryPath(rel) {
|
|
@@ -4,8 +4,8 @@ import "../memory/dreaming/constants.js";
|
|
|
4
4
|
import { resolveDreamingConfig } from "../memory/dreaming/config.js";
|
|
5
5
|
import { extractAgentUserPlainText } from "../memory/user-message-text.js";
|
|
6
6
|
import { formatInboundFileTextBlock, persistInboundAttachmentsToWorkspace } from "../../channels/attachments/inbound-persist.js";
|
|
7
|
-
import { cleanTrailingErrors, sanitizeMessages } from "../memory/message-sanitizer.js";
|
|
8
7
|
import { resolveEffectiveThinkingLevel } from "../../session/thinking-resolve.js";
|
|
8
|
+
import { cleanTrailingErrors, sanitizeMessages } from "../memory/message-sanitizer.js";
|
|
9
9
|
import { tryApplySessionTranscriptHygiene, tryApplySessionTranscriptHygieneForPersistence } from "../transcript/transcript-hygiene.js";
|
|
10
10
|
import { runAgentTurnWithModelFallbacks } from "./run-agent-turn-with-fallbacks.js";
|
|
11
11
|
import { expandAtFileMentionsInPlainText } from "../context/expand-at-file-mentions.js";
|
|
@@ -67,7 +67,6 @@ var SystemPromptBuilder = class {
|
|
|
67
67
|
const externalMemoryInstructions = options?.externalMemoryInstructions;
|
|
68
68
|
const userTimezone = this.extractTimezone(bootstrapFiles, curatedMemorySnapshot?.user, ws);
|
|
69
69
|
const workspaceBootstrapFiles = bootstrapFiles.map((f) => toWorkspaceBootstrapFile(f, ws));
|
|
70
|
-
const skillsPromptMode = createSkillConfigManager(resolveStateDir()).load().promptStyle === "legacy-with-paths" ? "legacy-with-paths" : "metadata-only";
|
|
71
70
|
const ttsMerged = mergeTtsConfigFromAppConfig(this.config.tts);
|
|
72
71
|
const reg = options?.registeredToolNames ?? [];
|
|
73
72
|
const ttsSystemHint = buildTtsSystemPromptHint({
|
|
@@ -87,7 +86,6 @@ var SystemPromptBuilder = class {
|
|
|
87
86
|
userTimezone,
|
|
88
87
|
curatedMemorySnapshot,
|
|
89
88
|
externalMemoryInstructions,
|
|
90
|
-
skillsPromptMode,
|
|
91
89
|
ttsSystemHint
|
|
92
90
|
});
|
|
93
91
|
const skillPrompt = options?.skillPromptText !== void 0 ? options.skillPromptText : this.skillManager.getPromptForSkillAllowlist(options?.skillAllowlist, options?.registeredToolNames);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-prompt-builder.js","names":["buildBaseSystemPrompt"],"sources":["../../../../src/agent/prompt/service-prompt-builder.ts"],"sourcesContent":["/**\n * System Prompt Builder - Builds the complete system prompt\n *\n * Combines base system prompt with skill prompts and bootstrap files.\n * This is the refactored version for AgentService modularization.\n */\n\nimport { readFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport type { Config } from '../../config/schema.js';\nimport type { SkillManager } from '../skills/skill-manager.js';\nimport { createSkillConfigManager } from '../skills/config.js';\nimport { selectSkillsVisibleInPrompt } from '../skills/format-skills-prompt.js';\nimport { resolveStateDir } from '../../config/paths.js';\nimport type { BootstrapFile } from '../context/workspace.js';\nimport { buildSystemPrompt as buildBaseSystemPrompt } from './system-prompt.js';\nimport { mergeTtsConfigFromAppConfig } from '../../voice/tts/merge-config.js';\nimport { buildTtsSystemPromptHint } from '../../voice/tts/directives.js';\nimport { toWorkspaceBootstrapFile, DEFAULT_USER_FILENAME } from '../context/workspace.js';\nimport type { MemorySnapshot } from '../memory/types.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('SystemPromptBuilder');\n\nexport interface SystemPromptBuildOptions {\n curatedMemorySnapshot?: MemorySnapshot;\n externalMemoryInstructions?: string;\n /** Per-agent workspace (bootstrap paths and base prompt). */\n workspaceOverride?: string;\n /** When set, replaces the default base system prompt (skills still appended unless empty). */\n systemPromptOverride?: string;\n /** Explicit skill XML block; wins over {@link skillAllowlist}. */\n skillPromptText?: string;\n /** Restrict `<available_skills>` to these names (merged with skills.json toggles). */\n skillAllowlist?: string[];\n /** Registered tool names for this agent session (enables skill tool gating). */\n registeredToolNames?: string[];\n}\n\nexport interface SystemPromptBuilderConfig {\n workspace: string;\n config: Config;\n skillManager: SkillManager;\n}\n\n/**\n * System Prompt Builder - Refactored for AgentService\n * \n * This class builds the complete system prompt by combining:\n * 1. Base system prompt (from buildSystemPrompt)\n * 2. Skill prompts (from SkillManager)\n */\nexport class SystemPromptBuilder {\n private workspace: string;\n private config: Config;\n private skillManager: SkillManager;\n\n constructor(config: SystemPromptBuilderConfig) {\n this.workspace = config.workspace;\n this.config = config.config;\n this.skillManager = config.skillManager;\n }\n\n /**\n * Build the complete system prompt with all components\n */\n build(bootstrapFiles: BootstrapFile[], options?: SystemPromptBuildOptions): string {\n const ws = options?.workspaceOverride ?? this.workspace;\n\n if (options?.systemPromptOverride?.trim()) {\n const skillPrompt =\n options.skillPromptText !== undefined\n ? options.skillPromptText\n : this.skillManager.getPromptForSkillAllowlist(\n options.skillAllowlist,\n options.registeredToolNames,\n );\n const trimmed = options.systemPromptOverride.trim();\n let fullPrompt = skillPrompt.trim() ? `${trimmed}\\n\\n${skillPrompt}` : trimmed;\n const ttsMerged = mergeTtsConfigFromAppConfig(this.config.tts);\n const reg = options.registeredToolNames ?? [];\n const ttsHint = buildTtsSystemPromptHint({\n enabled: ttsMerged.enabled,\n trigger: ttsMerged.trigger,\n maxTextLength: ttsMerged.maxTextLength,\n modelOverrides: ttsMerged.modelOverrides,\n textToSpeechTool: ttsMerged.enabled && reg.includes('text_to_speech'),\n });\n if (ttsHint?.trim()) {\n fullPrompt = `${fullPrompt}\\n\\n## Voice (TTS)\\n\\n${ttsHint.trim()}`;\n }\n log.debug({ baseLength: trimmed.length, skillLength: skillPrompt.length, totalLength: fullPrompt.length }, 'System prompt built (override)');\n return fullPrompt;\n }\n\n const heartbeatEnabled = this.config.gateway?.heartbeat?.includeSystemPromptSection ?? false;\n\n const curatedMemorySnapshot = options?.curatedMemorySnapshot;\n const externalMemoryInstructions = options?.externalMemoryInstructions;\n const userTimezone = this.extractTimezone(bootstrapFiles, curatedMemorySnapshot?.user, ws);\n\n const workspaceBootstrapFiles = bootstrapFiles.map((f) => toWorkspaceBootstrapFile(f, ws));\n\n const skillsCfg = createSkillConfigManager(resolveStateDir()).load();\n const skillsPromptMode =\n skillsCfg.promptStyle === 'legacy-with-paths' ? 'legacy-with-paths' : 'metadata-only';\n\n const ttsMerged = mergeTtsConfigFromAppConfig(this.config.tts);\n const reg = options?.registeredToolNames ?? [];\n const ttsSystemHint = buildTtsSystemPromptHint({\n enabled: ttsMerged.enabled,\n trigger: ttsMerged.trigger,\n maxTextLength: ttsMerged.maxTextLength,\n modelOverrides: ttsMerged.modelOverrides,\n textToSpeechTool: ttsMerged.enabled && reg.includes('text_to_speech'),\n });\n\n const basePrompt = buildBaseSystemPrompt(ws, {\n bootstrapFiles: workspaceBootstrapFiles,\n heartbeatEnabled,\n availableTools: this.getSkillNamesForSkillsSection({\n skillAllowlist: options?.skillAllowlist,\n registeredToolNames: options?.registeredToolNames,\n }),\n userTimezone,\n curatedMemorySnapshot,\n externalMemoryInstructions,\n skillsPromptMode,\n ttsSystemHint,\n });\n\n const skillPrompt =\n options?.skillPromptText !== undefined\n ? options.skillPromptText\n : this.skillManager.getPromptForSkillAllowlist(\n options?.skillAllowlist,\n options?.registeredToolNames,\n );\n\n const fullPrompt = skillPrompt ? `${basePrompt}\\n\\n${skillPrompt}` : basePrompt;\n\n log.debug(\n {\n baseLength: basePrompt.length,\n skillLength: skillPrompt?.length || 0,\n totalLength: fullPrompt.length,\n },\n 'System prompt built',\n );\n\n return fullPrompt;\n }\n\n /**\n * Rebuild the system prompt with current skills\n */\n rebuild(bootstrapFiles: BootstrapFile[], options?: SystemPromptBuildOptions): string {\n this.skillManager.reload();\n return this.build(bootstrapFiles, options);\n }\n\n /**\n * Extract user timezone from curated snapshot, bootstrap USER.md, or workspace file.\n */\n private extractTimezone(\n bootstrapFiles: BootstrapFile[],\n curatedUserBlock?: string,\n workspaceDir?: string,\n ): string | undefined {\n const ws = workspaceDir ?? this.workspace;\n if (curatedUserBlock?.trim()) {\n const m = curatedUserBlock.match(/Timezone:\\s*(.+)/i);\n if (m) {\n return m[1].trim();\n }\n }\n\n const userFile = bootstrapFiles.find(f => f.name === DEFAULT_USER_FILENAME);\n if (userFile && !userFile.missing && userFile.content) {\n const match = userFile.content.match(/Timezone:\\s*(.+)/i);\n if (match) {\n return match[1].trim();\n }\n }\n\n const path = join(ws, DEFAULT_USER_FILENAME);\n if (existsSync(path)) {\n try {\n const raw = readFileSync(path, 'utf-8');\n const match = raw.match(/Timezone:\\s*(.+)/i);\n if (match) {\n return match[1].trim();\n }\n } catch {\n /* ignore */\n }\n }\n\n return undefined;\n }\n\n /** Skill names driving the \"## Skills\" section (aligned with `<available_skills>` indexing). */\n private getSkillNamesForSkillsSection(options?: {\n skillAllowlist?: string[];\n registeredToolNames?: string[];\n }): string[] {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n return selectSkillsVisibleInPrompt(this.skillManager.getSkills(), skillsConfig, {\n skillAllowlist: options?.skillAllowlist,\n registeredToolNames: options?.registeredToolNames,\n }).map((s) => s.name);\n }\n\n /**\n * Get just the skill prompt portion\n */\n getSkillPrompt(): string {\n return this.skillManager.getPrompt();\n }\n\n /**\n * Get the base system prompt without skills\n */\n getBasePrompt(\n bootstrapFiles: BootstrapFile[],\n options?: { curatedMemorySnapshot?: MemorySnapshot; externalMemoryInstructions?: string; workspaceOverride?: string },\n ): string {\n const ws = options?.workspaceOverride ?? this.workspace;\n const workspaceBootstrapFiles = bootstrapFiles.map((f) => toWorkspaceBootstrapFile(f, ws));\n\n const snap = options?.curatedMemorySnapshot;\n return buildBaseSystemPrompt(ws, {\n bootstrapFiles: workspaceBootstrapFiles,\n heartbeatEnabled: this.config.gateway?.heartbeat?.includeSystemPromptSection ?? false,\n userTimezone: this.extractTimezone(bootstrapFiles, snap?.user, ws),\n curatedMemorySnapshot: snap,\n externalMemoryInstructions: options?.externalMemoryInstructions,\n });\n }\n}\n\nexport { buildBaseSystemPrompt as buildSystemPrompt };\n\n// Factory function for creating SystemPromptBuilder\nexport function createSystemPromptBuilder(config: SystemPromptBuilderConfig): SystemPromptBuilder {\n return new SystemPromptBuilder(config);\n}\n\n// Export config types\nexport type { SystemPromptBuilderConfig as SystemPromptConfig };\nexport type { SystemPromptBuilderConfig as SystemPromptBuilderOptions };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"service-prompt-builder.js","names":["buildBaseSystemPrompt"],"sources":["../../../../src/agent/prompt/service-prompt-builder.ts"],"sourcesContent":["/**\n * System Prompt Builder - Builds the complete system prompt\n *\n * Combines base system prompt with skill prompts and bootstrap files.\n * This is the refactored version for AgentService modularization.\n */\n\nimport { readFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport type { Config } from '../../config/schema.js';\nimport type { SkillManager } from '../skills/skill-manager.js';\nimport { createSkillConfigManager } from '../skills/config.js';\nimport { selectSkillsVisibleInPrompt } from '../skills/format-skills-prompt.js';\nimport { resolveStateDir } from '../../config/paths.js';\nimport type { BootstrapFile } from '../context/workspace.js';\nimport { buildSystemPrompt as buildBaseSystemPrompt } from './system-prompt.js';\nimport { mergeTtsConfigFromAppConfig } from '../../voice/tts/merge-config.js';\nimport { buildTtsSystemPromptHint } from '../../voice/tts/directives.js';\nimport { toWorkspaceBootstrapFile, DEFAULT_USER_FILENAME } from '../context/workspace.js';\nimport type { MemorySnapshot } from '../memory/types.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('SystemPromptBuilder');\n\nexport interface SystemPromptBuildOptions {\n curatedMemorySnapshot?: MemorySnapshot;\n externalMemoryInstructions?: string;\n /** Per-agent workspace (bootstrap paths and base prompt). */\n workspaceOverride?: string;\n /** When set, replaces the default base system prompt (skills still appended unless empty). */\n systemPromptOverride?: string;\n /** Explicit skill XML block; wins over {@link skillAllowlist}. */\n skillPromptText?: string;\n /** Restrict `<available_skills>` to these names (merged with skills.json toggles). */\n skillAllowlist?: string[];\n /** Registered tool names for this agent session (enables skill tool gating). */\n registeredToolNames?: string[];\n}\n\nexport interface SystemPromptBuilderConfig {\n workspace: string;\n config: Config;\n skillManager: SkillManager;\n}\n\n/**\n * System Prompt Builder - Refactored for AgentService\n * \n * This class builds the complete system prompt by combining:\n * 1. Base system prompt (from buildSystemPrompt)\n * 2. Skill prompts (from SkillManager)\n */\nexport class SystemPromptBuilder {\n private workspace: string;\n private config: Config;\n private skillManager: SkillManager;\n\n constructor(config: SystemPromptBuilderConfig) {\n this.workspace = config.workspace;\n this.config = config.config;\n this.skillManager = config.skillManager;\n }\n\n /**\n * Build the complete system prompt with all components\n */\n build(bootstrapFiles: BootstrapFile[], options?: SystemPromptBuildOptions): string {\n const ws = options?.workspaceOverride ?? this.workspace;\n\n if (options?.systemPromptOverride?.trim()) {\n const skillPrompt =\n options.skillPromptText !== undefined\n ? options.skillPromptText\n : this.skillManager.getPromptForSkillAllowlist(\n options.skillAllowlist,\n options.registeredToolNames,\n );\n const trimmed = options.systemPromptOverride.trim();\n let fullPrompt = skillPrompt.trim() ? `${trimmed}\\n\\n${skillPrompt}` : trimmed;\n const ttsMerged = mergeTtsConfigFromAppConfig(this.config.tts);\n const reg = options.registeredToolNames ?? [];\n const ttsHint = buildTtsSystemPromptHint({\n enabled: ttsMerged.enabled,\n trigger: ttsMerged.trigger,\n maxTextLength: ttsMerged.maxTextLength,\n modelOverrides: ttsMerged.modelOverrides,\n textToSpeechTool: ttsMerged.enabled && reg.includes('text_to_speech'),\n });\n if (ttsHint?.trim()) {\n fullPrompt = `${fullPrompt}\\n\\n## Voice (TTS)\\n\\n${ttsHint.trim()}`;\n }\n log.debug({ baseLength: trimmed.length, skillLength: skillPrompt.length, totalLength: fullPrompt.length }, 'System prompt built (override)');\n return fullPrompt;\n }\n\n const heartbeatEnabled = this.config.gateway?.heartbeat?.includeSystemPromptSection ?? false;\n\n const curatedMemorySnapshot = options?.curatedMemorySnapshot;\n const externalMemoryInstructions = options?.externalMemoryInstructions;\n const userTimezone = this.extractTimezone(bootstrapFiles, curatedMemorySnapshot?.user, ws);\n\n const workspaceBootstrapFiles = bootstrapFiles.map((f) => toWorkspaceBootstrapFile(f, ws));\n\n const ttsMerged = mergeTtsConfigFromAppConfig(this.config.tts);\n const reg = options?.registeredToolNames ?? [];\n const ttsSystemHint = buildTtsSystemPromptHint({\n enabled: ttsMerged.enabled,\n trigger: ttsMerged.trigger,\n maxTextLength: ttsMerged.maxTextLength,\n modelOverrides: ttsMerged.modelOverrides,\n textToSpeechTool: ttsMerged.enabled && reg.includes('text_to_speech'),\n });\n\n const basePrompt = buildBaseSystemPrompt(ws, {\n bootstrapFiles: workspaceBootstrapFiles,\n heartbeatEnabled,\n availableTools: this.getSkillNamesForSkillsSection({\n skillAllowlist: options?.skillAllowlist,\n registeredToolNames: options?.registeredToolNames,\n }),\n userTimezone,\n curatedMemorySnapshot,\n externalMemoryInstructions,\n ttsSystemHint,\n });\n\n const skillPrompt =\n options?.skillPromptText !== undefined\n ? options.skillPromptText\n : this.skillManager.getPromptForSkillAllowlist(\n options?.skillAllowlist,\n options?.registeredToolNames,\n );\n\n const fullPrompt = skillPrompt ? `${basePrompt}\\n\\n${skillPrompt}` : basePrompt;\n\n log.debug(\n {\n baseLength: basePrompt.length,\n skillLength: skillPrompt?.length || 0,\n totalLength: fullPrompt.length,\n },\n 'System prompt built',\n );\n\n return fullPrompt;\n }\n\n /**\n * Rebuild the system prompt with current skills\n */\n rebuild(bootstrapFiles: BootstrapFile[], options?: SystemPromptBuildOptions): string {\n this.skillManager.reload();\n return this.build(bootstrapFiles, options);\n }\n\n /**\n * Extract user timezone from curated snapshot, bootstrap USER.md, or workspace file.\n */\n private extractTimezone(\n bootstrapFiles: BootstrapFile[],\n curatedUserBlock?: string,\n workspaceDir?: string,\n ): string | undefined {\n const ws = workspaceDir ?? this.workspace;\n if (curatedUserBlock?.trim()) {\n const m = curatedUserBlock.match(/Timezone:\\s*(.+)/i);\n if (m) {\n return m[1].trim();\n }\n }\n\n const userFile = bootstrapFiles.find(f => f.name === DEFAULT_USER_FILENAME);\n if (userFile && !userFile.missing && userFile.content) {\n const match = userFile.content.match(/Timezone:\\s*(.+)/i);\n if (match) {\n return match[1].trim();\n }\n }\n\n const path = join(ws, DEFAULT_USER_FILENAME);\n if (existsSync(path)) {\n try {\n const raw = readFileSync(path, 'utf-8');\n const match = raw.match(/Timezone:\\s*(.+)/i);\n if (match) {\n return match[1].trim();\n }\n } catch {\n /* ignore */\n }\n }\n\n return undefined;\n }\n\n /** Skill names driving the \"## Skills\" section (aligned with `<available_skills>` indexing). */\n private getSkillNamesForSkillsSection(options?: {\n skillAllowlist?: string[];\n registeredToolNames?: string[];\n }): string[] {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n return selectSkillsVisibleInPrompt(this.skillManager.getSkills(), skillsConfig, {\n skillAllowlist: options?.skillAllowlist,\n registeredToolNames: options?.registeredToolNames,\n }).map((s) => s.name);\n }\n\n /**\n * Get just the skill prompt portion\n */\n getSkillPrompt(): string {\n return this.skillManager.getPrompt();\n }\n\n /**\n * Get the base system prompt without skills\n */\n getBasePrompt(\n bootstrapFiles: BootstrapFile[],\n options?: { curatedMemorySnapshot?: MemorySnapshot; externalMemoryInstructions?: string; workspaceOverride?: string },\n ): string {\n const ws = options?.workspaceOverride ?? this.workspace;\n const workspaceBootstrapFiles = bootstrapFiles.map((f) => toWorkspaceBootstrapFile(f, ws));\n\n const snap = options?.curatedMemorySnapshot;\n return buildBaseSystemPrompt(ws, {\n bootstrapFiles: workspaceBootstrapFiles,\n heartbeatEnabled: this.config.gateway?.heartbeat?.includeSystemPromptSection ?? false,\n userTimezone: this.extractTimezone(bootstrapFiles, snap?.user, ws),\n curatedMemorySnapshot: snap,\n externalMemoryInstructions: options?.externalMemoryInstructions,\n });\n }\n}\n\nexport { buildBaseSystemPrompt as buildSystemPrompt };\n\n// Factory function for creating SystemPromptBuilder\nexport function createSystemPromptBuilder(config: SystemPromptBuilderConfig): SystemPromptBuilder {\n return new SystemPromptBuilder(config);\n}\n\n// Export config types\nexport type { SystemPromptBuilderConfig as SystemPromptConfig };\nexport type { SystemPromptBuilderConfig as SystemPromptBuilderOptions };\n"],"mappings":"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"}
|
|
@@ -41,8 +41,6 @@ export interface SystemPromptOptions {
|
|
|
41
41
|
curatedMemorySnapshot?: MemorySnapshot;
|
|
42
42
|
/** External memory provider static instructions. */
|
|
43
43
|
externalMemoryInstructions?: string;
|
|
44
|
-
/** How skill instructions are surfaced (metadata-only → use skills_list / skill_view). */
|
|
45
|
-
skillsPromptMode?: 'metadata-only' | 'legacy-with-paths';
|
|
46
44
|
/** Optional TTS / voice output guidance (when TTS is enabled). */
|
|
47
45
|
ttsSystemHint?: string;
|
|
48
46
|
}
|
|
@@ -160,22 +160,8 @@ Before answering anything about prior work, decisions, dates, people, preference
|
|
|
160
160
|
/**
|
|
161
161
|
* Build Skills section - skill matching guidelines
|
|
162
162
|
*/
|
|
163
|
-
function buildSkillsSection(availableTools = []
|
|
163
|
+
function buildSkillsSection(availableTools = []) {
|
|
164
164
|
if (availableTools.length === 0) return "";
|
|
165
|
-
if (skillsPromptMode === "legacy-with-paths") return `## Skills
|
|
166
|
-
|
|
167
|
-
When a solution already exists, do not reinvent the wheel.
|
|
168
|
-
|
|
169
|
-
**How to use:**
|
|
170
|
-
1. Skim <available_skills> — is anything clearly relevant?
|
|
171
|
-
2. Only one match? → Use read_file on its SKILL.md (see location) and follow it.
|
|
172
|
-
3. Several plausible matches? → Pick the most specific one.
|
|
173
|
-
4. No match? → Solve it yourself; do not force-fit a skill.
|
|
174
|
-
|
|
175
|
-
**Principle:** Skills are tools, not shackles. If after reading one it does not fit, set it aside and proceed on your own.
|
|
176
|
-
|
|
177
|
-
**Division of labor with memory:** Skills = **procedural** workflows (how to do a class of tasks); memory / \`curated_memory\` = **declarative** facts and preferences. After a complex task succeeds, you may codify it as a skill; user-profile-style information belongs in memory.
|
|
178
|
-
`;
|
|
179
165
|
return `## Skills
|
|
180
166
|
|
|
181
167
|
When a solution already exists, do not reinvent the wheel.
|
|
@@ -298,7 +284,7 @@ function truncateForPrompt(content, maxChars) {
|
|
|
298
284
|
* Injects workspace files at appropriate positions in the system prompt.
|
|
299
285
|
*/
|
|
300
286
|
function buildSystemPrompt(workspaceDir, options) {
|
|
301
|
-
const { bootstrapFiles, promptMode = "full", heartbeatEnabled = false, heartbeatPrompt, availableTools = [], memoryCitationsMode = "on", userTimezone, runtime, channels = [], curatedMemorySnapshot, externalMemoryInstructions,
|
|
287
|
+
const { bootstrapFiles, promptMode = "full", heartbeatEnabled = false, heartbeatPrompt, availableTools = [], memoryCitationsMode = "on", userTimezone, runtime, channels = [], curatedMemorySnapshot, externalMemoryInstructions, ttsSystemHint } = options;
|
|
302
288
|
if (promptMode === "none") return "You are a personal AI assistant running inside xopc.";
|
|
303
289
|
const isMinimal = promptMode === "minimal";
|
|
304
290
|
const curatedUserFrozen = !!curatedMemorySnapshot?.user?.trim();
|
|
@@ -313,7 +299,7 @@ function buildSystemPrompt(workspaceDir, options) {
|
|
|
313
299
|
if (!isMinimal && !curatedUserFrozen) sections.push(buildUserSection(bootstrapFiles));
|
|
314
300
|
if (!isMinimal) sections.push(buildTimeSection(userTimezone));
|
|
315
301
|
if (!isMinimal) sections.push(buildMemorySection(bootstrapFiles, memoryCitationsMode, hasCuratedSnapshot));
|
|
316
|
-
sections.push(buildSkillsSection(availableTools
|
|
302
|
+
sections.push(buildSkillsSection(availableTools));
|
|
317
303
|
if (!isMinimal) sections.push(buildSafetySection());
|
|
318
304
|
if (!isMinimal) sections.push(buildProblemSolvingSection());
|
|
319
305
|
if (!isMinimal) sections.push(buildAestheticSection());
|