@xopcai/xopc 0.0.105 → 0.0.107
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/dashscope/xopc.extension.json +7 -2
- package/dist/extensions/fal/xopc.extension.json +7 -2
- package/dist/extensions/feishu/src/adapters/gateway-setup.js +22 -26
- package/dist/extensions/feishu/src/adapters/gateway-setup.js.map +1 -1
- package/dist/extensions/feishu/src/directory/directory-adapter.js +1 -1
- package/dist/extensions/feishu/src/directory/directory-adapter.js.map +1 -1
- package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
- package/dist/extensions/feishu/src/outbound/outbound-adapter.js +4 -3
- package/dist/extensions/feishu/src/outbound/outbound-adapter.js.map +1 -1
- package/dist/extensions/feishu/src/plugin.d.ts +6 -3
- package/dist/extensions/feishu/src/plugin.js +59 -40
- package/dist/extensions/feishu/src/plugin.js.map +1 -1
- package/dist/extensions/feishu/src/streaming/streaming-adapter.js +20 -16
- package/dist/extensions/feishu/src/streaming/streaming-adapter.js.map +1 -1
- package/dist/extensions/feishu/src/transport/socket-mode/monitor.js +1 -1
- package/dist/extensions/feishu/src/transport/webhook/monitor.js +1 -1
- package/dist/extensions/feishu/src/workflow-progress.d.ts +1 -1
- package/dist/extensions/feishu/src/workflow-progress.js +3 -3
- package/dist/extensions/feishu/src/workflow-progress.js.map +1 -1
- package/dist/extensions/feishu/xopc.extension.json +458 -26
- package/dist/extensions/google/xopc.extension.json +7 -2
- package/dist/extensions/minimax/xopc.extension.json +8 -2
- package/dist/extensions/openai/xopc.extension.json +7 -2
- package/dist/extensions/telegram/src/adapters/gateway-setup.js +8 -6
- package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -1
- package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
- package/dist/extensions/telegram/src/command-handler.d.ts +1 -1
- package/dist/extensions/telegram/src/command-handler.js +11 -9
- package/dist/extensions/telegram/src/command-handler.js.map +1 -1
- package/dist/extensions/telegram/src/inbound-processor.js +2 -3
- package/dist/extensions/telegram/src/inbound-processor.js.map +1 -1
- package/dist/extensions/telegram/src/plugin.d.ts +1 -0
- package/dist/extensions/telegram/src/plugin.js +7 -7
- package/dist/extensions/telegram/src/plugin.js.map +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +2 -2
- package/dist/extensions/telegram/src/update-offset-store.js +1 -1
- package/dist/extensions/telegram/src/workflow-progress.d.ts +1 -1
- package/dist/extensions/telegram/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/src/workflow-progress.js.map +1 -1
- package/dist/extensions/telegram/xopc.extension.json +10 -2
- package/dist/extensions/weixin/src/api/api.js +2 -2
- package/dist/extensions/weixin/src/auth/accounts.js +1 -1
- package/dist/extensions/weixin/src/cdn/upload.js +1 -1
- package/dist/extensions/weixin/src/cli/gateway-qr-login.d.ts +4 -0
- package/dist/extensions/weixin/src/cli/gateway-qr-login.js +34 -5
- package/dist/extensions/weixin/src/cli/gateway-qr-login.js.map +1 -1
- package/dist/extensions/weixin/src/cli/qr-login.js +4 -3
- package/dist/extensions/weixin/src/cli/qr-login.js.map +1 -1
- package/dist/extensions/weixin/src/media/data-url.js +1 -1
- package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
- package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/extensions/weixin/src/plugin.d.ts +1 -0
- package/dist/extensions/weixin/src/plugin.js +8 -7
- package/dist/extensions/weixin/src/plugin.js.map +1 -1
- package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
- package/dist/extensions/weixin/src/workflow-progress.d.ts +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js.map +1 -1
- package/dist/extensions/weixin/xopc.extension.json +57 -14
- package/dist/gateway/static/root/apple-touch-icon.png +0 -0
- package/dist/gateway/static/root/assets/agents-BXg2_mE4.js +78 -0
- package/dist/gateway/static/root/assets/apps-page-CJqQ-7Ss.js +1 -0
- package/dist/gateway/static/root/assets/channels-settings-DvMZ6NAd.js +1 -0
- package/dist/gateway/static/root/assets/cron-page-BPBlvSl5.js +1 -0
- package/dist/gateway/static/root/assets/{dist-DJDkNhu5.js → dist-CZh0c-s8.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DI1XJTJi.js → extension-debug-page-DyJQR0SR.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-SuafGTT_.js → extension-page-CDTuUr9B.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-cKmGax9v.js → extension-settings-page-DszZ8zHD.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-CkvRO30i.js → fetch-CFdKBnE6.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-BkKyRDrF.js → gateway-startup-retry-DdngdObI.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-CRiDcxtt.js → heartbeat-config-api-U10wnPdc.js} +1 -1
- package/dist/gateway/static/root/assets/index-DBc-bVOQ.js +4845 -0
- package/dist/gateway/static/root/assets/index-DI5_GsZt.css +1 -0
- package/dist/gateway/static/root/assets/{logs-page-DM8o5-Bm.js → logs-page-B6js8Bfi.js} +2 -2
- package/dist/gateway/static/root/assets/{note-detail-page-j53jtvq9.js → note-detail-page-DFzAXR35.js} +4 -4
- package/dist/gateway/static/root/assets/{note-time-Ck2H2Qpw.js → note-time-DOiSU-10.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-DAuZJMT8.js +1 -0
- package/dist/gateway/static/root/assets/{schema-form-BvmGNxiJ.js → schema-form-zM36dvbY.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-CAsV03BY.js +1 -0
- package/dist/gateway/static/root/assets/{settings-advanced-gate-DRdayl8P.js → settings-advanced-gate-BCvObK1y.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-BlIYg2gZ.js → settings-form-section-Bvl-RInc.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-DuCJDd74.js +3 -0
- package/dist/gateway/static/root/assets/{share-preview-page-BlT6Akvk.js → share-preview-page-rpL4DDTO.js} +1 -1
- package/dist/gateway/static/root/assets/skills-page--BioR9J4.js +2 -0
- package/dist/gateway/static/root/assets/{theme-store-DYgVdRB4.js → theme-store-BZozwAeK.js} +1 -1
- package/dist/gateway/static/root/assets/url-DQRqHuL-.js +3 -0
- package/dist/gateway/static/root/assets/voice-api-key-field-D2RJaoj_.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-page.utils-_sjXCMvi.js → workflow-page.utils-BxacHYen.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-B1B-est-.js +18 -0
- package/dist/gateway/static/root/favicon-16.png +0 -0
- package/dist/gateway/static/root/favicon-32.png +0 -0
- package/dist/gateway/static/root/favicon.ico +0 -0
- package/dist/gateway/static/root/favicon.svg +18 -0
- package/dist/gateway/static/root/index.html +11 -10
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.js +7 -7
- package/dist/src/agent/agent-scope.js +1 -1
- package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
- package/dist/src/agent/context/workspace-seed.js +2 -2
- package/dist/src/agent/context/workspace-state.js +1 -1
- package/dist/src/agent/goals/goal-run-store.js +4 -4
- package/dist/src/agent/goals/persistent-goal-service.js +1 -1
- package/dist/src/agent/goals/post-turn.js +2 -2
- package/dist/src/agent/image/load-image-media.js +2 -2
- package/dist/src/agent/ipc/bus.js +1 -1
- package/dist/src/agent/ipc/inbox.js +2 -2
- package/dist/src/agent/ipc/socket.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-config.js +16 -8
- package/dist/src/agent/mcp/bundle-mcp-config.js.map +1 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-policy.js +2 -2
- package/dist/src/agent/mcp/bundle-mcp-policy.js.map +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +2 -2
- package/dist/src/agent/mcp/mcp-http.js +1 -1
- package/dist/src/agent/mcp/mcp-http.js.map +1 -1
- package/dist/src/agent/mcp/mcp-transport-config.js +3 -7
- package/dist/src/agent/mcp/mcp-transport-config.js.map +1 -1
- package/dist/src/agent/mcp/mcp-transport.js +1 -1
- package/dist/src/agent/memory/builtin-memory-store.js +1 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
- package/dist/src/agent/memory/dreaming/events.js +1 -1
- package/dist/src/agent/memory/dreaming/last-run.js +1 -1
- package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
- package/dist/src/agent/memory/dreaming/preview.js +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
- package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
- package/dist/src/agent/memory/dreaming/utils.js +1 -1
- package/dist/src/agent/memory/memory-flush.js +1 -1
- package/dist/src/agent/memory/plugin-discovery.js +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
- package/dist/src/agent/reply/post-compaction-context.js +1 -1
- package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
- package/dist/src/agent/sandbox/path-policy.js +2 -2
- package/dist/src/agent/service.js +4 -4
- package/dist/src/agent/session/session-inspector.js +1 -1
- package/dist/src/agent/skills/config.js +1 -1
- package/dist/src/agent/skills/hub-hash.js +2 -2
- package/dist/src/agent/skills/hub-lock.js +1 -1
- package/dist/src/agent/skills/hub-pull.js +2 -2
- package/dist/src/agent/skills/index.js +1 -1
- package/dist/src/agent/skills/managed-store.js +1 -1
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +4 -0
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +4 -2
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
- package/dist/src/agent/skills/scanner.js +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js +1 -1
- package/dist/src/agent/skills/skill-manager.js +1 -1
- package/dist/src/agent/starter-agents.d.ts +19 -0
- package/dist/src/agent/starter-agents.js +190 -0
- package/dist/src/agent/starter-agents.js.map +1 -0
- package/dist/src/agent/tools/dreaming-tool.js +1 -1
- package/dist/src/agent/tools/factory.js +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +1 -1
- package/dist/src/agent/tools/send-media.js +1 -1
- package/dist/src/agent/tools/skill-manage-tool.js +1 -1
- package/dist/src/agent/tools/workflow-tool.js +1 -1
- package/dist/src/agent/tools/write.js +1 -1
- package/dist/src/agent/workflow/catalog.js +1 -1
- package/dist/src/agent/workflow/index.js +2 -1
- package/dist/src/agent/workflow/runtime.d.ts +2 -2
- package/dist/src/agent/workflow/runtime.js +50 -29
- package/dist/src/agent/workflow/runtime.js.map +1 -1
- package/dist/src/agent/workflow/snapshot-empty.d.ts +2 -0
- package/dist/src/agent/workflow/snapshot-empty.js +19 -0
- package/dist/src/agent/workflow/snapshot-empty.js.map +1 -0
- package/dist/src/agent/workflow/snapshot.js +1 -1
- package/dist/src/agent/workflow/snapshot.js.map +1 -1
- package/dist/src/agent/workflow/types.d.ts +11 -0
- package/dist/src/auth/credentials.js +3 -3
- package/dist/src/auth/profiles/store.js +2 -2
- package/dist/src/auth/sync-provider-auth.js +1 -1
- package/dist/src/browser/cache-dir-policy.js +1 -1
- package/dist/src/browser/cdp-local-launcher.js +2 -2
- package/dist/src/browser/providers/browser-ext-install.js +3 -3
- package/dist/src/browser/providers/cloakbrowser.js +4 -4
- package/dist/src/browser/providers/playwright-doctor.js +1 -1
- package/dist/src/browser/stealth.js +1 -1
- package/dist/src/channels/catalog/channel-catalog-service.js +13 -0
- package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -1
- package/dist/src/channels/outbound/persist-store.js +1 -1
- package/dist/src/channels/pairing/allow-from-file.js +1 -1
- package/dist/src/channels/pairing/pairing-store.js +2 -2
- package/dist/src/channels/plugins/types.adapters.d.ts +2 -0
- package/dist/src/chat-commands/agent-edit.js +2 -2
- package/dist/src/chat-commands/builtins/config.js +2 -2
- package/dist/src/chat-commands/context.js +1 -1
- package/dist/src/cli/commands/config.js +1 -1
- package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
- package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
- package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
- package/dist/src/cli/commands/extension-create.d.ts +2 -0
- package/dist/src/cli/commands/extension-create.js +165 -0
- package/dist/src/cli/commands/extension-create.js.map +1 -0
- package/dist/src/cli/commands/extension-dev.js +1 -3
- package/dist/src/cli/commands/extension-dev.js.map +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +105 -81
- package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
- package/dist/src/cli/commands/extension-pack.d.ts +13 -0
- package/dist/src/cli/commands/extension-pack.js +159 -91
- package/dist/src/cli/commands/extension-pack.js.map +1 -1
- package/dist/src/cli/commands/extension.d.ts +2 -0
- package/dist/src/cli/commands/extension.js +375 -3
- package/dist/src/cli/commands/extension.js.map +1 -1
- package/dist/src/cli/commands/gateway/logs.js +1 -1
- package/dist/src/cli/commands/gateway/run-foreground.js +1 -2
- package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
- package/dist/src/cli/commands/image.js +1 -1
- package/dist/src/cli/commands/init.js +3 -3
- package/dist/src/cli/commands/models.js +1 -1
- package/dist/src/cli/commands/onboard/model.js +2 -2
- package/dist/src/cli/commands/onboard.js +0 -2
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/commands/setup.js +0 -2
- package/dist/src/cli/commands/setup.js.map +1 -1
- package/dist/src/cli/utils/init-workspace-core.js +10 -7
- package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/agent-typed-models.js +1 -1
- package/dist/src/config/gateway-bind.js +1 -1
- package/dist/src/config/index.js +5 -5
- package/dist/src/config/loader.js +2 -2
- package/dist/src/config/models-json.js +2 -2
- package/dist/src/config/paths-state.js +1 -1
- package/dist/src/config/paths.d.ts +2 -2
- package/dist/src/config/paths.js +6 -5
- package/dist/src/config/paths.js.map +1 -1
- package/dist/src/config/profile.js +2 -2
- package/dist/src/config/schema.d.ts +2 -0
- package/dist/src/config/schema.js +3 -1
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/workspace-path.js +1 -1
- package/dist/src/connectors/health.js +1 -1
- package/dist/src/connectors/install.js +1 -1
- package/dist/src/cron/executor.js +2 -2
- package/dist/src/cron/persistence.js +1 -1
- package/dist/src/daemon/constants.js +1 -1
- package/dist/src/daemon/install-plan.js +2 -2
- package/dist/src/daemon/launchd.js +2 -2
- package/dist/src/daemon/schtasks.js +2 -2
- package/dist/src/daemon/systemd.js +2 -2
- package/dist/src/extensions/api.d.ts +4 -2
- package/dist/src/extensions/api.js +31 -12
- package/dist/src/extensions/api.js.map +1 -1
- package/dist/src/extensions/bundle-mcp.js +1 -1
- package/dist/src/extensions/discover-extensions.js +2 -1
- package/dist/src/extensions/discover-extensions.js.map +1 -1
- package/dist/src/extensions/health.js +1 -1
- package/dist/src/extensions/install.d.ts +1 -0
- package/dist/src/extensions/install.js +51 -8
- package/dist/src/extensions/install.js.map +1 -1
- package/dist/src/extensions/loader.d.ts +0 -4
- package/dist/src/extensions/loader.js +55 -88
- package/dist/src/extensions/loader.js.map +1 -1
- package/dist/src/extensions/lockfile.d.ts +9 -1
- package/dist/src/extensions/lockfile.js +2 -2
- package/dist/src/extensions/lockfile.js.map +1 -1
- package/dist/src/extensions/normalize-manifest.js +20 -4
- package/dist/src/extensions/normalize-manifest.js.map +1 -1
- package/dist/src/extensions/package-contract.d.ts +12 -0
- package/dist/src/extensions/package-contract.js +59 -0
- package/dist/src/extensions/package-contract.js.map +1 -0
- package/dist/src/extensions/sdk/core.d.ts +1 -1
- package/dist/src/extensions/sdk/index.d.ts +1 -1
- package/dist/src/extensions/sdk/index.js.map +1 -1
- package/dist/src/extensions/types/manifest.d.ts +15 -0
- package/dist/src/extensions/update.js +1 -1
- package/dist/src/gateway/agents-admin.d.ts +0 -8
- package/dist/src/gateway/agents-admin.js +3 -28
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/file-path-classifier.js +2 -2
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/lib/config-payload.js +1 -1
- package/dist/src/gateway/hono/lib/extension-store.js +2 -2
- package/dist/src/gateway/hono/lib/static-ui.js +2 -2
- package/dist/src/gateway/hono/oauth-async.js +1 -1
- package/dist/src/gateway/hono/oauth.js +1 -1
- package/dist/src/gateway/hono/routes/agents.js +2 -56
- package/dist/src/gateway/hono/routes/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
- package/dist/src/gateway/hono/routes/channels.js +10 -1
- package/dist/src/gateway/hono/routes/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +1 -1
- package/dist/src/gateway/hono/routes/host-fs.js +2 -2
- package/dist/src/gateway/hono/routes/mcp.js +1 -1
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/shares.js +1 -1
- package/dist/src/gateway/hono/routes/workflows.js +130 -0
- package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
- package/dist/src/gateway/hono/routes/workspace.js +2 -2
- package/dist/src/gateway/lock.js +3 -3
- package/dist/src/gateway/ports.js +1 -1
- package/dist/src/gateway/service/agent-runner.js +2 -2
- package/dist/src/gateway/service/marketplace-service.js +2 -2
- package/dist/src/gateway/service.d.ts +2 -0
- package/dist/src/gateway/service.js +45 -1
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/gateway/workspace-fs-file-list.js +1 -1
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/infra/brew.js +1 -1
- package/dist/src/infra/package-json.js +1 -1
- package/dist/src/infra/package-update-steps.js +1 -1
- package/dist/src/infra/path-env.js +2 -2
- package/dist/src/infra/restart.js +2 -2
- package/dist/src/infra/stable-node-path.js +1 -1
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/infra/update-global.js +1 -1
- package/dist/src/infra/update-lock.js +3 -3
- package/dist/src/infra/update-runner.js +1 -1
- package/dist/src/infra/update-startup.js +2 -2
- package/dist/src/infra/write-file-atomic.js +2 -2
- package/dist/src/media/store.js +1 -1
- package/dist/src/notes/agent-context.d.ts +12 -4
- package/dist/src/notes/agent-context.js +1 -1
- package/dist/src/notes/agent-context.js.map +1 -1
- package/dist/src/notes/store.js +2 -2
- package/dist/src/project-trust/trust-store.js +2 -2
- package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
- package/dist/src/providers/index.js +2 -2
- package/dist/src/providers/model-registry.js +1 -1
- package/dist/src/session/init-session-turn.js +2 -2
- package/dist/src/session/resolve-session.js +3 -3
- package/dist/src/session/session-title.js +2 -2
- package/dist/src/session/store.js +2 -2
- package/dist/src/share/share-auto.js +2 -2
- package/dist/src/share/share-store.js +3 -3
- package/dist/src/share/share-thumbnail.js +2 -2
- package/dist/src/share/share-zip.js +1 -1
- package/dist/src/share/site-share-store.js +3 -3
- package/dist/src/share/site-static-serve.js +1 -1
- package/dist/src/storage/sqlite/connection.js +2 -2
- package/dist/src/storage/sqlite/memory-index-repository.js +2 -2
- package/dist/src/storage/sqlite/migrations/discover.js +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/tui/backends/embedded-backend.js +1 -8
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.js +0 -7
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/clipboard-image.js +3 -3
- package/dist/src/tui/theme-manager.js +1 -1
- package/dist/src/tui/tui-backend.d.ts +0 -1
- package/dist/src/tui/tui-command-formatters.js +3 -3
- package/dist/src/tui/tui-commands.js +3 -3
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/tui/tui-keybindings-file.js +1 -1
- package/dist/src/tui/tui-picker-overlay.js +1 -1
- package/dist/src/tui/tui-picker-overlay.js.map +1 -1
- package/dist/src/tui/tui-scoped-models.js +2 -2
- package/dist/src/tui/tui-settings.js +1 -1
- package/dist/src/tui/tui-startup-resources.js +2 -2
- package/dist/src/tui/tui.js +5 -5
- package/dist/src/tunnel/frpc-binary.js +3 -3
- package/dist/src/tunnel/frpc-config.js +1 -1
- package/dist/src/tunnel/frpc-extract.js +1 -1
- package/dist/src/tunnel/tunnel-state.js +1 -1
- package/dist/src/utils/logger/audit.js +1 -1
- package/dist/src/utils/logger/log-store.js +1 -1
- package/dist/src/utils/logger/rotation.js +1 -1
- package/dist/src/voice/stt/availability.d.ts +6 -0
- package/dist/src/voice/stt/availability.js +14 -6
- package/dist/src/voice/stt/availability.js.map +1 -1
- package/dist/src/voice/stt/index.js +2 -1
- package/dist/src/voice/stt/index.js.map +1 -1
- package/dist/src/voice/stt/mention.d.ts +2 -0
- package/dist/src/voice/stt/mention.js +20 -0
- package/dist/src/voice/stt/mention.js.map +1 -0
- package/dist/src/voice/stt/preflight.d.ts +1 -4
- package/dist/src/voice/stt/preflight.js +1 -18
- package/dist/src/voice/stt/preflight.js.map +1 -1
- package/dist/src/voice/tts/audio.js +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +2 -2
- package/dist/src/workflows/domain/definition-utils.d.ts +1 -0
- package/dist/src/workflows/domain/definition-utils.js +32 -2
- package/dist/src/workflows/domain/definition-utils.js.map +1 -1
- package/dist/src/workflows/domain/definition.d.ts +2 -0
- package/dist/src/workflows/domain/event.d.ts +2 -1
- package/dist/src/workflows/domain/index.d.ts +1 -0
- package/dist/src/workflows/domain/index.js +3 -2
- package/dist/src/workflows/domain/run.d.ts +27 -1
- package/dist/src/workflows/domain/run.js.map +1 -1
- package/dist/src/workflows/domain/schema-validation.d.ts +8 -0
- package/dist/src/workflows/domain/schema-validation.js +28 -0
- package/dist/src/workflows/domain/schema-validation.js.map +1 -0
- package/dist/src/workflows/draft/index.d.ts +3 -0
- package/dist/src/workflows/draft/index.js +3 -0
- package/dist/src/workflows/draft/workflow-draft-prompt.d.ts +23 -0
- package/dist/src/workflows/draft/workflow-draft-prompt.js +98 -0
- package/dist/src/workflows/draft/workflow-draft-prompt.js.map +1 -0
- package/dist/src/workflows/draft/workflow-draft-service.d.ts +12 -0
- package/dist/src/workflows/draft/workflow-draft-service.js +131 -0
- package/dist/src/workflows/draft/workflow-draft-service.js.map +1 -0
- package/dist/src/workflows/draft/workflow-draft-validator.d.ts +4 -0
- package/dist/src/workflows/draft/workflow-draft-validator.js +133 -0
- package/dist/src/workflows/draft/workflow-draft-validator.js.map +1 -0
- package/dist/src/workflows/draft/workflow-draft.types.d.ts +44 -0
- package/dist/src/workflows/draft/workflow-draft.types.js +1 -0
- package/dist/src/workflows/engine/projector.js +1 -0
- package/dist/src/workflows/engine/projector.js.map +1 -1
- package/dist/src/workflows/engine/workflow-engine.d.ts +18 -0
- package/dist/src/workflows/engine/workflow-engine.js +320 -11
- package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
- package/dist/src/workflows/index.js +4 -3
- package/dist/src/workflows/service/workflow-run-service.d.ts +14 -3
- package/dist/src/workflows/service/workflow-run-service.js +227 -6
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-run-service.types.d.ts +7 -2
- package/dist/src/workflows/store/event-store.js +1 -1
- package/dist/src/workflows/store/run-store.js +1 -1
- package/package.json +5 -3
- package/dist/gateway/static/root/assets/agents-XzgIVKcI.js +0 -396
- package/dist/gateway/static/root/assets/apps-page-B7Us3RMl.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-BgeV6fzw.js +0 -1
- package/dist/gateway/static/root/assets/cron-page-DKGHEeAU.js +0 -1
- package/dist/gateway/static/root/assets/index-50FVtgXU.js +0 -4845
- package/dist/gateway/static/root/assets/index-BPYKW7FB.css +0 -1
- package/dist/gateway/static/root/assets/notes-page-CsWIw35Q.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-CLPsbyOW.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-CRGHT_bm.js +0 -3
- package/dist/gateway/static/root/assets/skills-page-Ce-RIH2y.js +0 -2
- package/dist/gateway/static/root/assets/url-DPEStU4M.js +0 -3
- package/dist/gateway/static/root/assets/voice-api-key-field-CJGTidqc.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-o63aaARK.js +0 -27
- package/dist/src/agent/builtin-agent-ids.d.ts +0 -2
- package/dist/src/agent/builtin-agent-ids.js +0 -17
- package/dist/src/agent/builtin-agent-ids.js.map +0 -1
|
@@ -1,18 +1,26 @@
|
|
|
1
|
-
import { isManagedConnectorServer } from "../../connectors/materialize.js";
|
|
2
1
|
import { normalizeConfiguredMcpServers } from "../../config/mcp-config-normalize.js";
|
|
2
|
+
import { loadEnabledBundleMcpConfig } from "../../extensions/bundle-mcp.js";
|
|
3
3
|
//#region src/agent/mcp/bundle-mcp-config.ts
|
|
4
|
-
function
|
|
4
|
+
function listConfiguredMcpServers(params) {
|
|
5
5
|
const configuredMcp = normalizeConfiguredMcpServers(params.cfg?.mcp?.servers);
|
|
6
|
-
return Object.fromEntries(Object.entries(configuredMcp).
|
|
6
|
+
return Object.fromEntries(Object.entries(configuredMcp).map(([name, server]) => [name, params.mapConfiguredServer(server, name)]));
|
|
7
7
|
}
|
|
8
8
|
function loadMergedBundleMcpConfig(params) {
|
|
9
9
|
const mapConfiguredServer = params.mapConfiguredServer ?? ((server) => server);
|
|
10
|
+
const bundled = loadEnabledBundleMcpConfig({
|
|
11
|
+
workspaceDir: params.workspaceDir,
|
|
12
|
+
cfg: params.cfg
|
|
13
|
+
});
|
|
14
|
+
const configured = listConfiguredMcpServers({
|
|
15
|
+
cfg: params.cfg,
|
|
16
|
+
mapConfiguredServer
|
|
17
|
+
});
|
|
10
18
|
return {
|
|
11
|
-
config: { mcpServers:
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
diagnostics:
|
|
19
|
+
config: { mcpServers: {
|
|
20
|
+
...bundled.config.mcpServers,
|
|
21
|
+
...configured
|
|
22
|
+
} },
|
|
23
|
+
diagnostics: bundled.diagnostics
|
|
16
24
|
};
|
|
17
25
|
}
|
|
18
26
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundle-mcp-config.js","names":[],"sources":["../../../../src/agent/mcp/bundle-mcp-config.ts"],"sourcesContent":["import { normalizeConfiguredMcpServers } from '../../config/mcp-config-normalize.js';\nimport
|
|
1
|
+
{"version":3,"file":"bundle-mcp-config.js","names":[],"sources":["../../../../src/agent/mcp/bundle-mcp-config.ts"],"sourcesContent":["import { normalizeConfiguredMcpServers } from '../../config/mcp-config-normalize.js';\nimport type { Config } from '../../config/schema.js';\nimport {\n loadEnabledBundleMcpConfig,\n type BundleMcpConfig,\n type BundleMcpDiagnostic,\n type BundleMcpServerConfig,\n} from '../../extensions/bundle-mcp.js';\n\nexport type MergedBundleMcpConfig = {\n config: BundleMcpConfig;\n diagnostics: BundleMcpDiagnostic[];\n};\n\nexport type BundleMcpServerMapper = (\n server: BundleMcpServerConfig,\n name: string,\n) => BundleMcpServerConfig;\n\nfunction listConfiguredMcpServers(params: {\n cfg?: Config;\n mapConfiguredServer: BundleMcpServerMapper;\n}): BundleMcpConfig[\"mcpServers\"] {\n const configuredMcp = normalizeConfiguredMcpServers(params.cfg?.mcp?.servers);\n return Object.fromEntries(\n Object.entries(configuredMcp)\n .map(([name, server]) => [\n name,\n params.mapConfiguredServer(server as BundleMcpServerConfig, name),\n ]),\n ) satisfies BundleMcpConfig[\"mcpServers\"];\n}\n\nexport function loadMergedBundleMcpConfig(params: {\n workspaceDir: string;\n cfg?: Config;\n mapConfiguredServer?: BundleMcpServerMapper;\n}): MergedBundleMcpConfig {\n const mapConfiguredServer = params.mapConfiguredServer ?? ((server) => server);\n const bundled = loadEnabledBundleMcpConfig({\n workspaceDir: params.workspaceDir,\n cfg: params.cfg,\n });\n const configured = listConfiguredMcpServers({\n cfg: params.cfg,\n mapConfiguredServer,\n });\n\n return {\n config: {\n mcpServers: {\n ...bundled.config.mcpServers,\n ...configured,\n },\n },\n diagnostics: bundled.diagnostics,\n };\n}\n"],"mappings":";;;AAmBA,SAAS,yBAAyB,QAGA;CAChC,MAAM,gBAAgB,8BAA8B,OAAO,KAAK,KAAK,QAAQ;AAC7E,QAAO,OAAO,YACZ,OAAO,QAAQ,cAAc,CAC1B,KAAK,CAAC,MAAM,YAAY,CACvB,MACA,OAAO,oBAAoB,QAAiC,KAAK,CAClE,CAAC,CACL;;AAGH,SAAgB,0BAA0B,QAIhB;CACxB,MAAM,sBAAsB,OAAO,yBAAyB,WAAW;CACvE,MAAM,UAAU,2BAA2B;EACzC,cAAc,OAAO;EACrB,KAAK,OAAO;EACb,CAAC;CACF,MAAM,aAAa,yBAAyB;EAC1C,KAAK,OAAO;EACZ;EACD,CAAC;AAEF,QAAO;EACL,QAAQ,EACN,YAAY;GACV,GAAG,QAAQ,OAAO;GAClB,GAAG;GACJ,EACF;EACD,aAAa,QAAQ;EACtB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { init_string_coerce, normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "../../utils/string-coerce.js";
|
|
1
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { init_string_coerce, normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "../../utils/string-coerce.js";
|
|
4
4
|
import { buildSafeToolName, normalizeReservedToolNames } from "./bundle-mcp-names.js";
|
|
5
5
|
import { setPluginToolMeta } from "./mcp-tool-meta.js";
|
|
6
6
|
import crypto from "node:crypto";
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import "./bundle-mcp-names.js";
|
|
2
|
-
import {
|
|
2
|
+
import { hasAnyMcpServers } from "../../extensions/bundle-mcp.js";
|
|
3
3
|
//#region src/agent/mcp/bundle-mcp-policy.ts
|
|
4
4
|
function shouldCreateBundleMcpRuntimeForAttempt(params) {
|
|
5
5
|
if (params.toolsEnabled === false) return false;
|
|
6
6
|
if (params.disabledTools?.has("bundle-mcp")) return false;
|
|
7
|
-
return
|
|
7
|
+
return hasAnyMcpServers(params.cfg ?? {});
|
|
8
8
|
}
|
|
9
9
|
function isMcpToolName(toolName) {
|
|
10
10
|
return toolName.includes("__");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundle-mcp-policy.js","names":[],"sources":["../../../../src/agent/mcp/bundle-mcp-policy.ts"],"sourcesContent":["import { TOOL_NAME_SEPARATOR } from './bundle-mcp-names.js';\nimport {
|
|
1
|
+
{"version":3,"file":"bundle-mcp-policy.js","names":[],"sources":["../../../../src/agent/mcp/bundle-mcp-policy.ts"],"sourcesContent":["import { TOOL_NAME_SEPARATOR } from './bundle-mcp-names.js';\nimport { hasAnyMcpServers } from '../../extensions/bundle-mcp.js';\nimport type { Config } from '../../config/schema.js';\n\nexport function shouldCreateBundleMcpRuntimeForAttempt(params: {\n cfg?: Config;\n toolsEnabled?: boolean;\n disabledTools?: Set<string>;\n}): boolean {\n if (params.toolsEnabled === false) {\n return false;\n }\n if (params.disabledTools?.has('bundle-mcp')) {\n return false;\n }\n return hasAnyMcpServers(params.cfg ?? ({} as Config));\n}\n\nexport function isMcpToolName(toolName: string): boolean {\n return toolName.includes(TOOL_NAME_SEPARATOR);\n}\n\nexport function parseMcpToolName(toolName: string): { serverId: string; toolId: string } | null {\n const idx = toolName.indexOf(TOOL_NAME_SEPARATOR);\n if (idx <= 0) {\n return null;\n }\n return {\n serverId: toolName.slice(0, idx),\n toolId: toolName.slice(idx + TOOL_NAME_SEPARATOR.length),\n };\n}\n"],"mappings":";;;AAIA,SAAgB,uCAAuC,QAI3C;AACV,KAAI,OAAO,iBAAiB,MAC1B,QAAO;AAET,KAAI,OAAO,eAAe,IAAI,aAAa,CACzC,QAAO;AAET,QAAO,iBAAiB,OAAO,OAAQ,EAAE,CAAY;;AAGvD,SAAgB,cAAc,UAA2B;AACvD,QAAO,SAAS,SAAA,KAA6B;;AAG/C,SAAgB,iBAAiB,UAA+D;CAC9F,MAAM,MAAM,SAAS,QAAA,KAA4B;AACjD,KAAI,OAAO,EACT,QAAO;AAET,QAAO;EACL,UAAU,SAAS,MAAM,GAAG,IAAI;EAChC,QAAQ,SAAS,MAAM,MAAA,EAAiC;EACzD"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
+
import { init_string_coerce, normalizeOptionalString } from "../../utils/string-coerce.js";
|
|
1
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { init_string_coerce, normalizeOptionalString } from "../../utils/string-coerce.js";
|
|
4
4
|
import { resolveGlobalSingleton } from "../../utils/global-singleton.js";
|
|
5
5
|
import { sanitizeServerName } from "./bundle-mcp-names.js";
|
|
6
|
-
import { resolveConnectorSecretReferences } from "../../connectors/secret-store.js";
|
|
7
6
|
import { redactSensitiveUrlLikeString } from "../../utils/redact-sensitive-url.js";
|
|
8
7
|
import { loadEmbeddedMcpConfig } from "./embedded-mcp.js";
|
|
8
|
+
import { resolveConnectorSecretReferences } from "../../connectors/secret-store.js";
|
|
9
9
|
import { isMcpConfigRecord } from "./mcp-config-shared.js";
|
|
10
10
|
import { resolveMcpTransport } from "./mcp-transport.js";
|
|
11
11
|
import crypto from "node:crypto";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-http.js","names":[],"sources":["../../../../src/agent/mcp/mcp-http.ts"],"sourcesContent":["import {\n redactSensitiveUrl,\n redactSensitiveUrlLikeString,\n} from \"../../utils/redact-sensitive-url.js\";\nimport { isMcpConfigRecord, toMcpStringRecord } from \"./mcp-config-shared.js\";\n\nexport type HttpMcpTransportType = \"sse\" | \"streamable-http\";\n\nexport type HttpMcpServerLaunchConfig = {\n transportType: HttpMcpTransportType;\n url: string;\n headers?: Record<string, string>;\n};\n\nexport type HttpMcpServerLaunchResult =\n | { ok: true; config: HttpMcpServerLaunchConfig }\n | { ok: false; reason: string };\n\nexport function resolveHttpMcpServerLaunchConfig(\n raw: unknown,\n options?: {\n transportType?: HttpMcpTransportType;\n onDroppedHeader?: (key: string, value: unknown) => void;\n onMalformedHeaders?: (value: unknown) => void;\n },\n): HttpMcpServerLaunchResult {\n if (!isMcpConfigRecord(raw)) {\n return { ok: false, reason: \"server config must be an object\" };\n }\n if (typeof raw.url !== \"string\" || raw.url.trim().length === 0) {\n return { ok: false, reason: \"its url is missing\" };\n }\n const url = raw.url.trim();\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return {\n ok: false,\n reason: `its url is not a valid URL: ${redactSensitiveUrlLikeString(url)}`,\n };\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n return {\n ok: false,\n reason: `only http and https URLs are supported, got ${parsed.protocol}`,\n };\n }\n\n let headers: Record<string, string> | undefined;\n if (raw.headers !== undefined && raw.headers !== null) {\n if (!isMcpConfigRecord(raw.headers)) {\n options?.onMalformedHeaders?.(raw.headers);\n } else {\n headers = toMcpStringRecord(raw.headers, {\n onDroppedEntry: options?.onDroppedHeader,\n });\n }\n }\n\n return {\n ok: true,\n config: {\n transportType: options?.transportType ?? \"
|
|
1
|
+
{"version":3,"file":"mcp-http.js","names":[],"sources":["../../../../src/agent/mcp/mcp-http.ts"],"sourcesContent":["import {\n redactSensitiveUrl,\n redactSensitiveUrlLikeString,\n} from \"../../utils/redact-sensitive-url.js\";\nimport { isMcpConfigRecord, toMcpStringRecord } from \"./mcp-config-shared.js\";\n\nexport type HttpMcpTransportType = \"sse\" | \"streamable-http\";\n\nexport type HttpMcpServerLaunchConfig = {\n transportType: HttpMcpTransportType;\n url: string;\n headers?: Record<string, string>;\n};\n\nexport type HttpMcpServerLaunchResult =\n | { ok: true; config: HttpMcpServerLaunchConfig }\n | { ok: false; reason: string };\n\nexport function resolveHttpMcpServerLaunchConfig(\n raw: unknown,\n options?: {\n transportType?: HttpMcpTransportType;\n onDroppedHeader?: (key: string, value: unknown) => void;\n onMalformedHeaders?: (value: unknown) => void;\n },\n): HttpMcpServerLaunchResult {\n if (!isMcpConfigRecord(raw)) {\n return { ok: false, reason: \"server config must be an object\" };\n }\n if (typeof raw.url !== \"string\" || raw.url.trim().length === 0) {\n return { ok: false, reason: \"its url is missing\" };\n }\n const url = raw.url.trim();\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return {\n ok: false,\n reason: `its url is not a valid URL: ${redactSensitiveUrlLikeString(url)}`,\n };\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n return {\n ok: false,\n reason: `only http and https URLs are supported, got ${parsed.protocol}`,\n };\n }\n\n let headers: Record<string, string> | undefined;\n if (raw.headers !== undefined && raw.headers !== null) {\n if (!isMcpConfigRecord(raw.headers)) {\n options?.onMalformedHeaders?.(raw.headers);\n } else {\n headers = toMcpStringRecord(raw.headers, {\n onDroppedEntry: options?.onDroppedHeader,\n });\n }\n }\n\n return {\n ok: true,\n config: {\n transportType: options?.transportType ?? \"streamable-http\",\n url,\n headers,\n },\n };\n}\n\nexport function describeHttpMcpServerLaunchConfig(config: HttpMcpServerLaunchConfig): string {\n return redactSensitiveUrl(config.url);\n}\n"],"mappings":";;;AAkBA,SAAgB,iCACd,KACA,SAK2B;AAC3B,KAAI,CAAC,kBAAkB,IAAI,CACzB,QAAO;EAAE,IAAI;EAAO,QAAQ;EAAmC;AAEjE,KAAI,OAAO,IAAI,QAAQ,YAAY,IAAI,IAAI,MAAM,CAAC,WAAW,EAC3D,QAAO;EAAE,IAAI;EAAO,QAAQ;EAAsB;CAEpD,MAAM,MAAM,IAAI,IAAI,MAAM;CAC1B,IAAI;AACJ,KAAI;AACF,WAAS,IAAI,IAAI,IAAI;SACf;AACN,SAAO;GACL,IAAI;GACJ,QAAQ,+BAA+B,6BAA6B,IAAI;GACzE;;AAEH,KAAI,OAAO,aAAa,WAAW,OAAO,aAAa,SACrD,QAAO;EACL,IAAI;EACJ,QAAQ,+CAA+C,OAAO;EAC/D;CAGH,IAAI;AACJ,KAAI,IAAI,YAAY,KAAA,KAAa,IAAI,YAAY,KAC/C,KAAI,CAAC,kBAAkB,IAAI,QAAQ,CACjC,UAAS,qBAAqB,IAAI,QAAQ;KAE1C,WAAU,kBAAkB,IAAI,SAAS,EACvC,gBAAgB,SAAS,iBAC1B,CAAC;AAIN,QAAO;EACL,IAAI;EACJ,QAAQ;GACN,eAAe,SAAS,iBAAiB;GACzC;GACA;GACD;EACF;;AAGH,SAAgB,kCAAkC,QAA2C;AAC3F,QAAO,mBAAmB,OAAO,IAAI"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { init_string_coerce, normalizeLowercaseStringOrEmpty } from "../../utils/string-coerce.js";
|
|
1
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { init_string_coerce, normalizeLowercaseStringOrEmpty } from "../../utils/string-coerce.js";
|
|
4
4
|
import { resolveXopcMcpTransportAlias } from "../../config/mcp-config-normalize.js";
|
|
5
5
|
import { sanitizeForLog } from "../../utils/sanitize-log.js";
|
|
6
6
|
import { describeHttpMcpServerLaunchConfig, resolveHttpMcpServerLaunchConfig } from "./mcp-http.js";
|
|
@@ -71,12 +71,8 @@ function resolveMcpTransportConfig(serverName, rawServer) {
|
|
|
71
71
|
log.warn(`bundle-mcp: skipped server "${logServerName}" because transport "${sanitizeForLog(effectiveTransport)}" is not supported.`);
|
|
72
72
|
return null;
|
|
73
73
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
if (httpTransport) return httpTransport;
|
|
77
|
-
}
|
|
78
|
-
const sseTransport = resolveHttpTransportConfig(serverName, rawServer, "sse");
|
|
79
|
-
if (sseTransport) return sseTransport;
|
|
74
|
+
const httpTransport = resolveHttpTransportConfig(serverName, rawServer, effectiveTransport === "sse" ? "sse" : "streamable-http");
|
|
75
|
+
if (httpTransport) return httpTransport;
|
|
80
76
|
const stdioReason = stdioLaunch.ok === false ? stdioLaunch.reason : "not a stdio server";
|
|
81
77
|
const httpLaunch = resolveHttpMcpServerLaunchConfig(rawServer);
|
|
82
78
|
const httpReason = httpLaunch.ok === false ? httpLaunch.reason : "not an HTTP MCP server";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-transport-config.js","names":[],"sources":["../../../../src/agent/mcp/mcp-transport-config.ts"],"sourcesContent":["import { resolveXopcMcpTransportAlias } from \"../../config/mcp-config-normalize.js\";\nimport { createLogger } from \"../../utils/logger.js\";\nconst log = createLogger(\"Mcp:Bundle\");\nimport { normalizeLowercaseStringOrEmpty } from \"../../utils/string-coerce.js\";\nimport { sanitizeForLog } from \"../../utils/sanitize-log.js\";\nimport {\n describeHttpMcpServerLaunchConfig,\n resolveHttpMcpServerLaunchConfig,\n type HttpMcpTransportType,\n} from \"./mcp-http.js\";\nimport {\n describeStdioMcpServerLaunchConfig,\n resolveStdioMcpServerLaunchConfig,\n} from \"./mcp-stdio.js\";\n\ntype ResolvedBaseMcpTransportConfig = {\n description: string;\n connectionTimeoutMs: number;\n};\n\nexport type ResolvedStdioMcpTransportConfig = ResolvedBaseMcpTransportConfig & {\n kind: \"stdio\";\n transportType: \"stdio\";\n command: string;\n args?: string[];\n env?: Record<string, string>;\n cwd?: string;\n};\n\nexport type ResolvedHttpMcpTransportConfig = ResolvedBaseMcpTransportConfig & {\n kind: \"http\";\n transportType: HttpMcpTransportType;\n url: string;\n headers?: Record<string, string>;\n};\n\nexport type ResolvedMcpTransportConfig =\n | ResolvedStdioMcpTransportConfig\n | ResolvedHttpMcpTransportConfig;\n\nconst DEFAULT_CONNECTION_TIMEOUT_MS = 30_000;\n\nfunction getConnectionTimeoutMs(rawServer: unknown): number {\n if (\n rawServer &&\n typeof rawServer === \"object\" &&\n typeof (rawServer as { connectionTimeoutMs?: unknown }).connectionTimeoutMs === \"number\" &&\n (rawServer as { connectionTimeoutMs: number }).connectionTimeoutMs > 0\n ) {\n return (rawServer as { connectionTimeoutMs: number }).connectionTimeoutMs;\n }\n return DEFAULT_CONNECTION_TIMEOUT_MS;\n}\n\nfunction getRequestedTransport(rawServer: unknown): string {\n if (\n !rawServer ||\n typeof rawServer !== \"object\" ||\n typeof (rawServer as { transport?: unknown }).transport !== \"string\"\n ) {\n return \"\";\n }\n return normalizeLowercaseStringOrEmpty((rawServer as { transport?: string }).transport);\n}\n\nfunction getRequestedTransportAlias(rawServer: unknown): HttpMcpTransportType | \"\" {\n if (\n !rawServer ||\n typeof rawServer !== \"object\" ||\n typeof (rawServer as { type?: unknown }).type !== \"string\"\n ) {\n return \"\";\n }\n return resolveXopcMcpTransportAlias((rawServer as { type?: string }).type) ?? \"\";\n}\n\nfunction resolveHttpTransportConfig(\n serverName: string,\n rawServer: unknown,\n transportType: HttpMcpTransportType,\n): ResolvedHttpMcpTransportConfig | null {\n const launch = resolveHttpMcpServerLaunchConfig(rawServer, {\n transportType,\n onDroppedHeader: (key) => {\n log.warn(\n {\n phase: 'agent.mcp_connect',\n serverName,\n header: key,\n },\n `bundle-mcp: server \"${serverName}\": header \"${key}\" has an unsupported value type and was ignored`,\n );\n },\n onMalformedHeaders: () => {\n log.warn(\n { phase: 'agent.mcp_connect', serverName },\n `bundle-mcp: server \"${serverName}\": \"headers\" must be a JSON object; the value was ignored`,\n );\n },\n });\n if (!launch.ok) {\n return null;\n }\n return {\n kind: \"http\",\n transportType: launch.config.transportType,\n url: launch.config.url,\n headers: launch.config.headers,\n description: describeHttpMcpServerLaunchConfig(launch.config),\n connectionTimeoutMs: getConnectionTimeoutMs(rawServer),\n };\n}\n\nexport function resolveMcpTransportConfig(\n serverName: string,\n rawServer: unknown,\n): ResolvedMcpTransportConfig | null {\n const logServerName = sanitizeForLog(serverName);\n const requestedTransport = getRequestedTransport(rawServer);\n const requestedTransportAlias = requestedTransport ? \"\" : getRequestedTransportAlias(rawServer);\n const effectiveTransport = requestedTransport || requestedTransportAlias;\n const stdioLaunch = resolveStdioMcpServerLaunchConfig(rawServer, {\n onDroppedEnv: (key) => {\n log.warn(\n `bundle-mcp: server \"${logServerName}\": env \"${sanitizeForLog(key)}\" is blocked for stdio startup safety and was ignored.`,\n );\n },\n });\n if (stdioLaunch.ok) {\n return {\n kind: \"stdio\",\n transportType: \"stdio\",\n command: stdioLaunch.config.command,\n args: stdioLaunch.config.args,\n env: stdioLaunch.config.env,\n cwd: stdioLaunch.config.cwd,\n description: describeStdioMcpServerLaunchConfig(stdioLaunch.config),\n connectionTimeoutMs: getConnectionTimeoutMs(rawServer),\n };\n }\n\n if (\n effectiveTransport &&\n effectiveTransport !== \"sse\" &&\n effectiveTransport !== \"streamable-http\"\n ) {\n log.warn(\n `bundle-mcp: skipped server \"${logServerName}\" because transport \"${sanitizeForLog(effectiveTransport)}\" is not supported.`,\n );\n return null;\n }\n\n
|
|
1
|
+
{"version":3,"file":"mcp-transport-config.js","names":[],"sources":["../../../../src/agent/mcp/mcp-transport-config.ts"],"sourcesContent":["import { resolveXopcMcpTransportAlias } from \"../../config/mcp-config-normalize.js\";\nimport { createLogger } from \"../../utils/logger.js\";\nconst log = createLogger(\"Mcp:Bundle\");\nimport { normalizeLowercaseStringOrEmpty } from \"../../utils/string-coerce.js\";\nimport { sanitizeForLog } from \"../../utils/sanitize-log.js\";\nimport {\n describeHttpMcpServerLaunchConfig,\n resolveHttpMcpServerLaunchConfig,\n type HttpMcpTransportType,\n} from \"./mcp-http.js\";\nimport {\n describeStdioMcpServerLaunchConfig,\n resolveStdioMcpServerLaunchConfig,\n} from \"./mcp-stdio.js\";\n\ntype ResolvedBaseMcpTransportConfig = {\n description: string;\n connectionTimeoutMs: number;\n};\n\nexport type ResolvedStdioMcpTransportConfig = ResolvedBaseMcpTransportConfig & {\n kind: \"stdio\";\n transportType: \"stdio\";\n command: string;\n args?: string[];\n env?: Record<string, string>;\n cwd?: string;\n};\n\nexport type ResolvedHttpMcpTransportConfig = ResolvedBaseMcpTransportConfig & {\n kind: \"http\";\n transportType: HttpMcpTransportType;\n url: string;\n headers?: Record<string, string>;\n};\n\nexport type ResolvedMcpTransportConfig =\n | ResolvedStdioMcpTransportConfig\n | ResolvedHttpMcpTransportConfig;\n\nconst DEFAULT_CONNECTION_TIMEOUT_MS = 30_000;\n\nfunction getConnectionTimeoutMs(rawServer: unknown): number {\n if (\n rawServer &&\n typeof rawServer === \"object\" &&\n typeof (rawServer as { connectionTimeoutMs?: unknown }).connectionTimeoutMs === \"number\" &&\n (rawServer as { connectionTimeoutMs: number }).connectionTimeoutMs > 0\n ) {\n return (rawServer as { connectionTimeoutMs: number }).connectionTimeoutMs;\n }\n return DEFAULT_CONNECTION_TIMEOUT_MS;\n}\n\nfunction getRequestedTransport(rawServer: unknown): string {\n if (\n !rawServer ||\n typeof rawServer !== \"object\" ||\n typeof (rawServer as { transport?: unknown }).transport !== \"string\"\n ) {\n return \"\";\n }\n return normalizeLowercaseStringOrEmpty((rawServer as { transport?: string }).transport);\n}\n\nfunction getRequestedTransportAlias(rawServer: unknown): HttpMcpTransportType | \"\" {\n if (\n !rawServer ||\n typeof rawServer !== \"object\" ||\n typeof (rawServer as { type?: unknown }).type !== \"string\"\n ) {\n return \"\";\n }\n return resolveXopcMcpTransportAlias((rawServer as { type?: string }).type) ?? \"\";\n}\n\nfunction resolveHttpTransportConfig(\n serverName: string,\n rawServer: unknown,\n transportType: HttpMcpTransportType,\n): ResolvedHttpMcpTransportConfig | null {\n const launch = resolveHttpMcpServerLaunchConfig(rawServer, {\n transportType,\n onDroppedHeader: (key) => {\n log.warn(\n {\n phase: 'agent.mcp_connect',\n serverName,\n header: key,\n },\n `bundle-mcp: server \"${serverName}\": header \"${key}\" has an unsupported value type and was ignored`,\n );\n },\n onMalformedHeaders: () => {\n log.warn(\n { phase: 'agent.mcp_connect', serverName },\n `bundle-mcp: server \"${serverName}\": \"headers\" must be a JSON object; the value was ignored`,\n );\n },\n });\n if (!launch.ok) {\n return null;\n }\n return {\n kind: \"http\",\n transportType: launch.config.transportType,\n url: launch.config.url,\n headers: launch.config.headers,\n description: describeHttpMcpServerLaunchConfig(launch.config),\n connectionTimeoutMs: getConnectionTimeoutMs(rawServer),\n };\n}\n\nexport function resolveMcpTransportConfig(\n serverName: string,\n rawServer: unknown,\n): ResolvedMcpTransportConfig | null {\n const logServerName = sanitizeForLog(serverName);\n const requestedTransport = getRequestedTransport(rawServer);\n const requestedTransportAlias = requestedTransport ? \"\" : getRequestedTransportAlias(rawServer);\n const effectiveTransport = requestedTransport || requestedTransportAlias;\n const stdioLaunch = resolveStdioMcpServerLaunchConfig(rawServer, {\n onDroppedEnv: (key) => {\n log.warn(\n `bundle-mcp: server \"${logServerName}\": env \"${sanitizeForLog(key)}\" is blocked for stdio startup safety and was ignored.`,\n );\n },\n });\n if (stdioLaunch.ok) {\n return {\n kind: \"stdio\",\n transportType: \"stdio\",\n command: stdioLaunch.config.command,\n args: stdioLaunch.config.args,\n env: stdioLaunch.config.env,\n cwd: stdioLaunch.config.cwd,\n description: describeStdioMcpServerLaunchConfig(stdioLaunch.config),\n connectionTimeoutMs: getConnectionTimeoutMs(rawServer),\n };\n }\n\n if (\n effectiveTransport &&\n effectiveTransport !== \"sse\" &&\n effectiveTransport !== \"streamable-http\"\n ) {\n log.warn(\n `bundle-mcp: skipped server \"${logServerName}\" because transport \"${sanitizeForLog(effectiveTransport)}\" is not supported.`,\n );\n return null;\n }\n\n const httpTransport = resolveHttpTransportConfig(\n serverName,\n rawServer,\n effectiveTransport === \"sse\" ? \"sse\" : \"streamable-http\",\n );\n if (httpTransport) {\n return httpTransport;\n }\n\n const stdioReason =\n stdioLaunch.ok === false ? stdioLaunch.reason : 'not a stdio server';\n const httpLaunch = resolveHttpMcpServerLaunchConfig(rawServer);\n const httpReason =\n httpLaunch.ok === false ? httpLaunch.reason : 'not an HTTP MCP server';\n log.warn(\n `bundle-mcp: skipped server \"${logServerName}\" because ${stdioReason} and ${httpReason}.`,\n );\n return null;\n}\n"],"mappings":";;;;;;;;aACqD;oBAE0B;AAD/E,MAAM,MAAM,aAAa,aAAa;AAsCtC,MAAM,gCAAgC;AAEtC,SAAS,uBAAuB,WAA4B;AAC1D,KACE,aACA,OAAO,cAAc,YACrB,OAAQ,UAAgD,wBAAwB,YAC/E,UAA8C,sBAAsB,EAErE,QAAQ,UAA8C;AAExD,QAAO;;AAGT,SAAS,sBAAsB,WAA4B;AACzD,KACE,CAAC,aACD,OAAO,cAAc,YACrB,OAAQ,UAAsC,cAAc,SAE5D,QAAO;AAET,QAAO,gCAAiC,UAAqC,UAAU;;AAGzF,SAAS,2BAA2B,WAA+C;AACjF,KACE,CAAC,aACD,OAAO,cAAc,YACrB,OAAQ,UAAiC,SAAS,SAElD,QAAO;AAET,QAAO,6BAA8B,UAAgC,KAAK,IAAI;;AAGhF,SAAS,2BACP,YACA,WACA,eACuC;CACvC,MAAM,SAAS,iCAAiC,WAAW;EACzD;EACA,kBAAkB,QAAQ;AACxB,OAAI,KACF;IACE,OAAO;IACP;IACA,QAAQ;IACT,EACD,uBAAuB,WAAW,aAAa,IAAI,iDACpD;;EAEH,0BAA0B;AACxB,OAAI,KACF;IAAE,OAAO;IAAqB;IAAY,EAC1C,uBAAuB,WAAW,2DACnC;;EAEJ,CAAC;AACF,KAAI,CAAC,OAAO,GACV,QAAO;AAET,QAAO;EACL,MAAM;EACN,eAAe,OAAO,OAAO;EAC7B,KAAK,OAAO,OAAO;EACnB,SAAS,OAAO,OAAO;EACvB,aAAa,kCAAkC,OAAO,OAAO;EAC7D,qBAAqB,uBAAuB,UAAU;EACvD;;AAGH,SAAgB,0BACd,YACA,WACmC;CACnC,MAAM,gBAAgB,eAAe,WAAW;CAChD,MAAM,qBAAqB,sBAAsB,UAAU;CAC3D,MAAM,0BAA0B,qBAAqB,KAAK,2BAA2B,UAAU;CAC/F,MAAM,qBAAqB,sBAAsB;CACjD,MAAM,cAAc,kCAAkC,WAAW,EAC/D,eAAe,QAAQ;AACrB,MAAI,KACF,uBAAuB,cAAc,UAAU,eAAe,IAAI,CAAC,wDACpE;IAEJ,CAAC;AACF,KAAI,YAAY,GACd,QAAO;EACL,MAAM;EACN,eAAe;EACf,SAAS,YAAY,OAAO;EAC5B,MAAM,YAAY,OAAO;EACzB,KAAK,YAAY,OAAO;EACxB,KAAK,YAAY,OAAO;EACxB,aAAa,mCAAmC,YAAY,OAAO;EACnE,qBAAqB,uBAAuB,UAAU;EACvD;AAGH,KACE,sBACA,uBAAuB,SACvB,uBAAuB,mBACvB;AACA,MAAI,KACF,+BAA+B,cAAc,uBAAuB,eAAe,mBAAmB,CAAC,qBACxG;AACD,SAAO;;CAGT,MAAM,gBAAgB,2BACpB,YACA,WACA,uBAAuB,QAAQ,QAAQ,kBACxC;AACD,KAAI,cACF,QAAO;CAGT,MAAM,cACJ,YAAY,OAAO,QAAQ,YAAY,SAAS;CAClD,MAAM,aAAa,iCAAiC,UAAU;CAC9D,MAAM,aACJ,WAAW,OAAO,QAAQ,WAAW,SAAS;AAChD,KAAI,KACF,+BAA+B,cAAc,YAAY,YAAY,OAAO,WAAW,GACxF;AACD,QAAO"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { init_string_coerce, normalizeOptionalString } from "../../utils/string-coerce.js";
|
|
1
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { init_string_coerce, normalizeOptionalString } from "../../utils/string-coerce.js";
|
|
4
4
|
import { XopcStdioClientTransport } from "./mcp-stdio-transport.js";
|
|
5
5
|
import { resolveMcpTransportConfig } from "./mcp-transport-config.js";
|
|
6
6
|
import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
1
2
|
import { existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
2
3
|
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
3
|
-
import { join } from "node:path";
|
|
4
4
|
import lockfile from "proper-lockfile";
|
|
5
5
|
//#region src/agent/memory/builtin-memory-store.ts
|
|
6
6
|
/**
|
|
@@ -4,8 +4,8 @@ import { MEMORY_MD_FILENAME } from "./constants.js";
|
|
|
4
4
|
import { clamp01, compareCandidatesByScore, computeCandidateScore, extractPromotionMarkers, isContaminatedSnippet, isExpiredEntry, isoDay, readFileLines, resolveDeepDefaults, sliceRange, snippetHash } from "./utils.js";
|
|
5
5
|
import { loadDreamingStore, saveDreamingStore, withDreamingPromotionLock } from "./short-term-store.js";
|
|
6
6
|
import { emptyDeepPhaseSkipped, writeDreamingDeepLastRun } from "./last-run.js";
|
|
7
|
-
import fs from "node:fs/promises";
|
|
8
7
|
import path from "node:path";
|
|
8
|
+
import fs from "node:fs/promises";
|
|
9
9
|
//#region src/agent/memory/dreaming/deep-promotion.ts
|
|
10
10
|
init_logger();
|
|
11
11
|
const log = createLogger("Dreaming:Deep");
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DREAMING_DIR_RELATIVE, DREAMING_EVENTS_LOG_RELATIVE } from "./constants.js";
|
|
2
|
-
import fs from "node:fs/promises";
|
|
3
2
|
import path from "node:path";
|
|
3
|
+
import fs from "node:fs/promises";
|
|
4
4
|
//#region src/agent/memory/dreaming/events.ts
|
|
5
5
|
/**
|
|
6
6
|
* Append a single event line to `memory/.dreams/events.jsonl`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DREAMING_LAST_RUN_RELATIVE } from "./constants.js";
|
|
2
|
-
import fs from "node:fs/promises";
|
|
3
2
|
import path from "node:path";
|
|
3
|
+
import fs from "node:fs/promises";
|
|
4
4
|
//#region src/agent/memory/dreaming/last-run.ts
|
|
5
5
|
const DREAMING_LAST_RUN_FORMAT_VERSION = 2;
|
|
6
6
|
function isRecord(v) {
|
|
@@ -4,8 +4,8 @@ import { DREAMING_DIR_RELATIVE } from "./constants.js";
|
|
|
4
4
|
import { buildEntryKey, isoDay, normalizeMemoryPath, normalizeSnippetForHash, snippetHash } from "./utils.js";
|
|
5
5
|
import { bumpEntryPhaseSignal, loadDreamingStore, saveDreamingStore } from "./short-term-store.js";
|
|
6
6
|
import "./last-run.js";
|
|
7
|
-
import fs from "node:fs/promises";
|
|
8
7
|
import path from "node:path";
|
|
8
|
+
import fs from "node:fs/promises";
|
|
9
9
|
//#region src/agent/memory/dreaming/light-sweep.ts
|
|
10
10
|
init_logger();
|
|
11
11
|
const log = createLogger("Dreaming:Light");
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { MEMORY_MD_FILENAME } from "./constants.js";
|
|
2
2
|
import { clamp01, compareCandidatesByScore, computeCandidateScore, extractPromotionMarkers, isContaminatedSnippet, isExpiredEntry, readFileLines, resolveDeepDefaults, sliceRange, snippetHash } from "./utils.js";
|
|
3
3
|
import { loadDreamingStore } from "./short-term-store.js";
|
|
4
|
-
import fs from "node:fs/promises";
|
|
5
4
|
import path from "node:path";
|
|
5
|
+
import fs from "node:fs/promises";
|
|
6
6
|
//#region src/agent/memory/dreaming/preview.ts
|
|
7
7
|
async function previewDreamingDeepPromotion(params) {
|
|
8
8
|
const cfg = resolveDeepDefaults(params.config);
|
|
@@ -4,8 +4,8 @@ import { DREAMING_DIR_RELATIVE, DREAMS_MD_FILENAME, MS_PER_DAY } from "./constan
|
|
|
4
4
|
import { isoDay } from "./utils.js";
|
|
5
5
|
import { bumpEntryPhaseSignal, loadDreamingStore, saveDreamingStore } from "./short-term-store.js";
|
|
6
6
|
import "./last-run.js";
|
|
7
|
-
import fs from "node:fs/promises";
|
|
8
7
|
import path from "node:path";
|
|
8
|
+
import fs from "node:fs/promises";
|
|
9
9
|
//#region src/agent/memory/dreaming/rem-patterns.ts
|
|
10
10
|
init_logger();
|
|
11
11
|
const log = createLogger("Dreaming:REM");
|
|
@@ -2,9 +2,9 @@ import { createLogger } from "../../../utils/logger/index.js";
|
|
|
2
2
|
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
|
+
import path from "node:path";
|
|
5
6
|
import { createHash, randomUUID } from "node:crypto";
|
|
6
7
|
import fs from "node:fs/promises";
|
|
7
|
-
import path from "node:path";
|
|
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
|
+
import path from "node:path";
|
|
2
3
|
import { createHash } from "node:crypto";
|
|
3
4
|
import fs from "node:fs/promises";
|
|
4
|
-
import path from "node:path";
|
|
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) {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { join } from "node:path";
|
|
3
4
|
import { existsSync } from "node:fs";
|
|
4
5
|
import { appendFile, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
5
|
-
import { join } from "node:path";
|
|
6
6
|
//#region src/agent/memory/memory-flush.ts
|
|
7
7
|
init_logger();
|
|
8
8
|
const log = createLogger("MemoryFlush");
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { readdir, stat } from "node:fs/promises";
|
|
2
1
|
import { dirname, join } from "node:path";
|
|
2
|
+
import { readdir, stat } from "node:fs/promises";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
//#region src/agent/memory/plugin-discovery.ts
|
|
5
5
|
async function discoverMemoryPlugins() {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
|
|
1
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
|
|
4
4
|
import { getAllModels, getDefaultModelSync, init_providers, resolveModel } from "../../providers/index.js";
|
|
5
5
|
import { resolveAgentTurnTimeoutMs, runAgentTurnWithTimeout } from "../orchestration/run-agent-turn-with-timeout.js";
|
|
6
6
|
import { isAssistantTurnAborted, isAssistantTurnFailed, maybeRetryTurnAfterTransientLlmFailure } from "../orchestration/llm-turn-retry.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { resolveStateDir } from "../../config/paths-state.js";
|
|
1
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { resolveStateDir } from "../../config/paths-state.js";
|
|
4
4
|
import { init_paths } from "../../config/paths.js";
|
|
5
5
|
import { DEFAULT_USER_FILENAME } from "../context/workspace.js";
|
|
6
6
|
import { resolveSystemPromptBuildParams } from "./system-prompt-params.js";
|
|
@@ -9,8 +9,8 @@ import { createSkillConfigManager } from "../skills/config.js";
|
|
|
9
9
|
import { buildTtsSystemPromptHint } from "../../voice/tts/directives.js";
|
|
10
10
|
import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
|
|
11
11
|
import { selectSkillsVisibleInPrompt } from "../skills/format-skills-prompt.js";
|
|
12
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
13
12
|
import { join } from "node:path";
|
|
13
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
14
14
|
//#region src/agent/prompt/service-prompt-builder.ts
|
|
15
15
|
/**
|
|
16
16
|
* System Prompt Builder - Builds the complete system prompt
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { init_agent_scope, resolveAgentProfileDir } from "../agent-scope.js";
|
|
2
2
|
import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
|
|
3
|
-
import { readFileSync } from "node:fs";
|
|
4
3
|
import { join, resolve } from "node:path";
|
|
4
|
+
import { readFileSync } from "node:fs";
|
|
5
5
|
//#region src/agent/reply/post-compaction-context.ts
|
|
6
6
|
init_agent_scope();
|
|
7
7
|
const MAX_CONTEXT_CHARS = 1800;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { realpathSync } from "node:fs";
|
|
2
|
-
import { isAbsolute, normalize, resolve, sep } from "node:path";
|
|
3
1
|
import { homedir } from "node:os";
|
|
2
|
+
import { isAbsolute, normalize, resolve, sep } from "node:path";
|
|
3
|
+
import { realpathSync } from "node:fs";
|
|
4
4
|
//#region src/agent/sandbox/path-policy.ts
|
|
5
5
|
/**
|
|
6
6
|
* Path safety validation for sandbox isolation.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { createLogger } from "../utils/logger/index.js";
|
|
2
|
-
import { init_logger } from "../utils/logger.js";
|
|
3
|
-
import { init_agent_scope, resolveAgentHomeDir, resolveAgentProfileDir, resolveDefaultAgentId } from "./agent-scope.js";
|
|
4
1
|
import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
|
|
5
2
|
import { applyConfigOverrides } from "../config/runtime-overrides.js";
|
|
3
|
+
import { init_agent_scope, resolveAgentHomeDir, resolveAgentProfileDir, resolveDefaultAgentId } from "./agent-scope.js";
|
|
6
4
|
import { extractProfileAgentId, resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
|
|
5
|
+
import { createLogger } from "../utils/logger/index.js";
|
|
6
|
+
import { init_logger } from "../utils/logger.js";
|
|
7
7
|
import { extractTextContent } from "./context/workspace.js";
|
|
8
8
|
import { getWorkflowProgressBroker } from "./workflow/progress-broker.js";
|
|
9
9
|
import { onSessionTranscriptUpdate } from "../session/transcript-events.js";
|
|
@@ -60,8 +60,8 @@ import { parseOutboundSessionKey } from "./service/parse-outbound-session-key.js
|
|
|
60
60
|
import { cleanTrailingErrors } from "./memory/message-sanitizer.js";
|
|
61
61
|
import { MemoryFlushService } from "./memory/memory-flush.js";
|
|
62
62
|
import { tryApplySessionTranscriptHygiene } from "./transcript/transcript-hygiene.js";
|
|
63
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
64
63
|
import { join } from "node:path";
|
|
64
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
65
65
|
//#region src/agent/service.ts
|
|
66
66
|
init_schema();
|
|
67
67
|
init_logger();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
|
|
1
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
|
|
4
4
|
import { resolveVerboseLevel } from "../../session/config-store.js";
|
|
5
5
|
import { resolveEffectiveReasoningLevel, resolveEffectiveThinkingLevel } from "../../session/thinking-resolve.js";
|
|
6
6
|
import { effectiveWorkspacePathForSession } from "../../session/session-workspace.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
|
|
2
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
3
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
|
|
4
4
|
import { hasBinary } from "./installer.js";
|
|
5
5
|
import { join } from "path";
|
|
6
6
|
import { existsSync, readFileSync } from "fs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { createHash } from "node:crypto";
|
|
2
|
-
import { createReadStream, existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
3
1
|
import { join, relative } from "node:path";
|
|
2
|
+
import { createReadStream, existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
4
|
//#region src/agent/skills/hub-hash.ts
|
|
5
5
|
/**
|
|
6
6
|
* Deterministic content hash for a skill directory (for hub lock / drift detection).
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
|
|
2
1
|
import { init_paths, resolveSkillsLockPath } from "../../config/paths.js";
|
|
2
|
+
import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
|
|
3
3
|
import { existsSync, readFileSync } from "node:fs";
|
|
4
4
|
//#region src/agent/skills/hub-lock.ts
|
|
5
5
|
/**
|
|
@@ -4,9 +4,9 @@ import { formatScanSummary, scanSkillDirectory } from "./scanner.js";
|
|
|
4
4
|
import { getSkillsLockEntry, recordSkillsHubInstall } from "./hub-lock.js";
|
|
5
5
|
import { installSkillFromZip, isValidSkillId } from "./managed-store.js";
|
|
6
6
|
import { computeSkillTreeHashSync } from "./hub-hash.js";
|
|
7
|
-
import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
8
|
-
import { basename, join, normalize, resolve, sep } from "node:path";
|
|
9
7
|
import { tmpdir } from "node:os";
|
|
8
|
+
import { basename, join, normalize, resolve, sep } from "node:path";
|
|
9
|
+
import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
10
10
|
import { fileURLToPath } from "node:url";
|
|
11
11
|
import { execFileSync } from "node:child_process";
|
|
12
12
|
import { fetch } from "undici";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { resolveStateDir } from "../../config/paths-state.js";
|
|
1
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { resolveStateDir } from "../../config/paths-state.js";
|
|
4
4
|
import { init_paths } from "../../config/paths.js";
|
|
5
5
|
import { parseFrontmatter } from "../../markdown/frontmatter.js";
|
|
6
6
|
import { findInstallSpec, getDefaultInstallerPreferences, hasBinary, installSkill } from "./installer.js";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { init_paths, resolveSkillsDir } from "../../config/paths.js";
|
|
2
2
|
import { parseFrontmatter } from "../../markdown/frontmatter.js";
|
|
3
3
|
import { loadSkillsLock } from "./hub-lock.js";
|
|
4
|
-
import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
|
|
5
4
|
import { dirname, join, resolve, sep } from "node:path";
|
|
5
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
|
|
6
6
|
import AdmZip from "adm-zip";
|
|
7
7
|
//#region src/agent/skills/managed-store.ts
|
|
8
8
|
/**
|
|
@@ -101,11 +101,15 @@ export interface StorePublishedPackageHead {
|
|
|
101
101
|
latestVersion: {
|
|
102
102
|
version: string;
|
|
103
103
|
downloadUrl: string;
|
|
104
|
+
checksum?: string;
|
|
105
|
+
integrity?: string;
|
|
106
|
+
sha256?: string;
|
|
104
107
|
};
|
|
105
108
|
}
|
|
106
109
|
export declare function resolveExtensionZipDownloadUrl(storeBaseUrl: string, packageName: string, version?: string): Promise<{
|
|
107
110
|
downloadUrl: string;
|
|
108
111
|
version: string;
|
|
112
|
+
integrity?: string;
|
|
109
113
|
}>;
|
|
110
114
|
export declare function downloadExtensionStoreZipBuffer(storeBaseUrl: string, downloadUrl: string): Promise<Buffer>;
|
|
111
115
|
export declare function skillIdForMarketplaceInstall(packageName: string): string | undefined;
|
|
@@ -135,7 +135,8 @@ async function resolveExtensionZipDownloadUrl(storeBaseUrl, packageName, version
|
|
|
135
135
|
assertDownloadUrlAllowed(detail.downloadUrl, base);
|
|
136
136
|
return {
|
|
137
137
|
downloadUrl: detail.downloadUrl,
|
|
138
|
-
version: detail.version
|
|
138
|
+
version: detail.version,
|
|
139
|
+
integrity: detail.integrity ?? detail.checksum ?? detail.sha256
|
|
139
140
|
};
|
|
140
141
|
}
|
|
141
142
|
const lv = meta.latestVersion;
|
|
@@ -143,7 +144,8 @@ async function resolveExtensionZipDownloadUrl(storeBaseUrl, packageName, version
|
|
|
143
144
|
assertDownloadUrlAllowed(lv.downloadUrl, base);
|
|
144
145
|
return {
|
|
145
146
|
downloadUrl: lv.downloadUrl,
|
|
146
|
-
version: lv.version
|
|
147
|
+
version: lv.version,
|
|
148
|
+
integrity: lv.integrity ?? lv.checksum ?? lv.sha256
|
|
147
149
|
};
|
|
148
150
|
}
|
|
149
151
|
async function downloadExtensionStoreZipBuffer(storeBaseUrl, downloadUrl) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-api-client.js","names":[],"sources":["../../../../../../../src/agent/skills/marketplace/adapters/store/store-api-client.ts"],"sourcesContent":["/**\n * HTTP client for the public xopc-store-compatible REST API (packages list, detail, zip download).\n * Used by the store marketplace adapter and SSRF-safe download helpers.\n *\n * Facade: {@link ../../../skills-marketplace.js}.\n */\n\nimport type { Config } from '../../../../../config/schema.js';\nimport { MAX_EXTENSION_STORE_ZIP_BYTES } from '../../../../../extensions/store-zip-limits.js';\nimport { isValidSkillId, MAX_SKILL_ZIP_BYTES } from '../../../managed-store.js';\nimport type { SkillMarkdownPreviewPayload } from '../../../types.js';\n\nconst DEFAULT_STORE_BASE = 'https://store.xopc.ai';\n\n/**\n * Marketplace provider identifier. Dynamic — extensions can register additional providers\n * via `api.registerMarketplaceAdapter()`. Built-in values: 'store', 'skillhub', 'clawhub'.\n */\nexport type SkillsMarketplaceProvider = string;\n\nexport interface SkillsStoreListParams {\n q?: string;\n page?: number;\n pageSize?: number;\n sort?: 'downloads' | 'newest';\n /** Adapter-defined category id (exact match against package `categories`). */\n category?: string;\n}\n\n/** Category option for marketplace filter chips (from adapter). */\nexport interface MarketplaceCategoryOption {\n id: string;\n label: string;\n}\n\n/** Mirrors xopc-store GET /api/v1/packages list response (subset used by UI). */\nexport interface SkillsStorePackageListItem {\n id: string;\n name: string;\n type: string;\n description: string;\n downloads: number;\n author: { username: string; avatarUrl: string | null };\n latestVersion?: string;\n updatedAt: string;\n /** Taxonomy / tags from the marketplace (adapter-specific). */\n categories?: string[];\n tags?: string[];\n stars?: number;\n /** Short provenance label for the row (e.g. ClawHub). */\n sourceLabel?: string;\n}\n\n/** Unified marketplace package list item (works for all adapters). */\nexport type MarketplacePackageListItem = SkillsStorePackageListItem;\n\nexport interface SkillsStoreListResponse {\n items: SkillsStorePackageListItem[];\n meta: { page: number; pageSize: number; total: number; totalPages: number };\n}\n\nexport function resolveSkillsStoreBaseUrl(config: Config): string {\n const env = process.env.XOPC_SKILLS_STORE_URL?.trim();\n if (env) {\n try {\n return normalizeBaseUrl(new URL(env).toString());\n } catch {\n // fall through\n }\n }\n const fromConfig = config.gateway?.skillsStoreBaseUrl?.trim();\n if (fromConfig) {\n try {\n return normalizeBaseUrl(new URL(fromConfig).toString());\n } catch {\n return DEFAULT_STORE_BASE;\n }\n }\n return DEFAULT_STORE_BASE;\n}\n\nexport { MAX_EXTENSION_STORE_ZIP_BYTES };\n\n/**\n * Base URL for extension downloads (defaults to skills store host — usually store.xopc.ai).\n * Override with `XOPC_EXTENSIONS_STORE_URL`.\n */\nexport function resolveExtensionsStoreBaseUrl(config: Config): string {\n const env = process.env.XOPC_EXTENSIONS_STORE_URL?.trim();\n if (env) {\n try {\n return normalizeBaseUrl(new URL(env).toString());\n } catch {\n // fall through\n }\n }\n return resolveSkillsStoreBaseUrl(config);\n}\n\nfunction normalizeBaseUrl(url: string): string {\n return url.replace(/\\/$/, '');\n}\n\nexport function getStoreOrigin(baseUrl: string): string {\n const u = new URL(baseUrl);\n return `${u.protocol}//${u.host}`;\n}\n\n/**\n * Allow download URLs whose origin matches the configured store base (SSRF guard).\n * Production store is HTTPS-only; local dev (`http://localhost` / `127.0.0.1`) may use HTTP.\n */\nexport function assertDownloadUrlAllowed(downloadUrl: string, storeBaseUrl: string): URL {\n let u: URL;\n try {\n u = new URL(downloadUrl);\n } catch {\n throw new Error('Invalid download URL from store');\n }\n const allowed = new URL(storeBaseUrl);\n const localHttpDev =\n allowed.protocol === 'http:' &&\n (allowed.hostname === 'localhost' || allowed.hostname === '127.0.0.1');\n if (localHttpDev) {\n if (u.protocol !== 'http:' && u.protocol !== 'https:') {\n throw new Error('Download URL must use HTTP or HTTPS');\n }\n } else if (u.protocol !== 'https:') {\n throw new Error('Download URL must use HTTPS');\n }\n if (u.host !== allowed.host) {\n throw new Error('Download URL host does not match configured store host');\n }\n return u;\n}\n\nasync function fetchJson<T>(url: string, init?: RequestInit): Promise<T> {\n const res = await fetch(url, {\n ...init,\n headers: { Accept: 'application/json', ...init?.headers },\n });\n const text = await res.text();\n if (!res.ok) {\n let msg = `Store request failed (${res.status})`;\n try {\n const j = JSON.parse(text) as { error?: { message?: string } };\n if (j.error?.message) msg = j.error.message;\n } catch {\n if (text) msg = text.slice(0, 200);\n }\n throw new Error(msg);\n }\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new Error('Store returned invalid JSON');\n }\n}\n\nexport async function listSkillPackages(\n storeBaseUrl: string,\n params: SkillsStoreListParams,\n): Promise<SkillsStoreListResponse> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const sp = new URLSearchParams();\n sp.set('type', 'skill');\n if (params.q?.trim()) sp.set('q', params.q.trim());\n if (params.page != null) sp.set('page', String(params.page));\n if (params.pageSize != null) sp.set('pageSize', String(params.pageSize));\n if (params.sort) sp.set('sort', params.sort);\n if (params.category?.trim()) sp.set('category', params.category.trim());\n\n const url = `${base}/api/v1/packages?${sp.toString()}`;\n return fetchJson<SkillsStoreListResponse>(url);\n}\n\n/** GET /api/v1/packages/:name — published skill package (public). */\nexport interface MarketplacePackageDetail {\n id: string;\n name: string;\n type: string;\n description: string;\n readme: string | null;\n downloads: number;\n author: { username: string; avatarUrl: string | null };\n latestVersion: {\n version: string;\n changelog: string | null;\n publishedAt: string;\n };\n}\n\nexport async function fetchMarketplacePackageDetail(\n storeBaseUrl: string,\n packageName: string,\n): Promise<MarketplacePackageDetail> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const enc = encodeURIComponent(packageName.trim());\n return fetchJson<MarketplacePackageDetail>(`${base}/api/v1/packages/${enc}`);\n}\n\nexport async function resolveSkillZipDownloadUrl(\n storeBaseUrl: string,\n packageName: string,\n version?: string,\n): Promise<{ downloadUrl: string; version: string }> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const enc = encodeURIComponent(packageName);\n if (version?.trim()) {\n const v = encodeURIComponent(version.trim());\n const detail = await fetchJson<{\n downloadUrl: string;\n version: string;\n }>(`${base}/api/v1/packages/${enc}/versions/${v}`);\n if (!detail.downloadUrl) {\n throw new Error('Store version has no download URL');\n }\n assertDownloadUrlAllowed(detail.downloadUrl, base);\n return { downloadUrl: detail.downloadUrl, version: detail.version };\n }\n\n const pkg = await fetchJson<{\n name: string;\n latestVersion: { downloadUrl: string; version: string };\n }>(`${base}/api/v1/packages/${enc}`);\n if (!pkg.latestVersion?.downloadUrl) {\n throw new Error('Package has no published version');\n }\n assertDownloadUrlAllowed(pkg.latestVersion.downloadUrl, base);\n return {\n downloadUrl: pkg.latestVersion.downloadUrl,\n version: pkg.latestVersion.version,\n };\n}\n\nexport async function downloadSkillZipBuffer(\n storeBaseUrl: string,\n downloadUrl: string,\n): Promise<Buffer> {\n const base = normalizeBaseUrl(storeBaseUrl);\n assertDownloadUrlAllowed(downloadUrl, base);\n\n const res = await fetch(downloadUrl, { redirect: 'follow' });\n if (!res.ok) {\n throw new Error(`Failed to download skill archive (${res.status})`);\n }\n const len = res.headers.get('content-length');\n if (len) {\n const n = Number(len);\n if (Number.isFinite(n) && n > MAX_SKILL_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_SKILL_ZIP_BYTES} bytes)`);\n }\n }\n const ab = await res.arrayBuffer();\n const buf = Buffer.from(ab);\n if (buf.length > MAX_SKILL_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_SKILL_ZIP_BYTES} bytes)`);\n }\n return buf;\n}\n\n/** GET /api/v1/packages/:name — subset used for extension installs. */\nexport interface StorePublishedPackageHead {\n name: string;\n type: string;\n latestVersion: {\n version: string;\n downloadUrl: string;\n };\n}\n\nexport async function resolveExtensionZipDownloadUrl(\n storeBaseUrl: string,\n packageName: string,\n version?: string,\n): Promise<{ downloadUrl: string; version: string }> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const enc = encodeURIComponent(packageName.trim());\n const meta = await fetchJson<StorePublishedPackageHead>(`${base}/api/v1/packages/${enc}`);\n if (meta.type !== 'extension') {\n throw new Error(\n `Package \"${packageName}\" has type \"${meta.type}\" (expected extension). ` +\n 'Use `xopc skills install` for skills.',\n );\n }\n if (version?.trim()) {\n const v = encodeURIComponent(version.trim());\n const detail = await fetchJson<{ downloadUrl: string; version: string }>(\n `${base}/api/v1/packages/${enc}/versions/${v}`,\n );\n if (!detail.downloadUrl) {\n throw new Error('Store version has no download URL');\n }\n assertDownloadUrlAllowed(detail.downloadUrl, base);\n return { downloadUrl: detail.downloadUrl, version: detail.version };\n }\n const lv = meta.latestVersion;\n if (!lv?.downloadUrl) {\n throw new Error('Package has no published version');\n }\n assertDownloadUrlAllowed(lv.downloadUrl, base);\n return { downloadUrl: lv.downloadUrl, version: lv.version };\n}\n\nexport async function downloadExtensionStoreZipBuffer(\n storeBaseUrl: string,\n downloadUrl: string,\n): Promise<Buffer> {\n const base = normalizeBaseUrl(storeBaseUrl);\n assertDownloadUrlAllowed(downloadUrl, base);\n const res = await fetch(downloadUrl, { redirect: 'follow' });\n if (!res.ok) {\n throw new Error(`Failed to download extension archive (${res.status})`);\n }\n const len = res.headers.get('content-length');\n if (len) {\n const n = Number(len);\n if (Number.isFinite(n) && n > MAX_EXTENSION_STORE_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_EXTENSION_STORE_ZIP_BYTES} bytes)`);\n }\n }\n const ab = await res.arrayBuffer();\n const buf = Buffer.from(ab);\n if (buf.length > MAX_EXTENSION_STORE_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_EXTENSION_STORE_ZIP_BYTES} bytes)`);\n }\n return buf;\n}\n\nexport function skillIdForMarketplaceInstall(packageName: string): string | undefined {\n const trimmed = packageName.trim();\n if (!trimmed) return undefined;\n return isValidSkillId(trimmed) ? trimmed : undefined;\n}\n\n/**\n * Unified marketplace list response (adapter fills `provider`).\n */\nexport interface UnifiedMarketplaceListResponse {\n items: MarketplacePackageListItem[];\n meta: { page: number; pageSize: number; total: number; totalPages: number };\n provider: string;\n}\n\n/**\n * Unified marketplace package detail response.\n */\nexport interface UnifiedMarketplacePackageDetail extends MarketplacePackageDetail {\n provider: string;\n /** Gateway-normalized structured meta + body rendered by the console. */\n skillDocPreview: SkillMarkdownPreviewPayload;\n /** SkillHub-specific fields */\n skillHubInfo?: {\n category: string;\n installs: number;\n stars: number;\n securityReports?: {\n keen?: { status: string; statusText: string; reportUrl?: string };\n sanbu?: { status: string; statusText: string; reportUrl?: string };\n };\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"store-api-client.js","names":[],"sources":["../../../../../../../src/agent/skills/marketplace/adapters/store/store-api-client.ts"],"sourcesContent":["/**\n * HTTP client for the public xopc-store-compatible REST API (packages list, detail, zip download).\n * Used by the store marketplace adapter and SSRF-safe download helpers.\n *\n * Facade: {@link ../../../skills-marketplace.js}.\n */\n\nimport type { Config } from '../../../../../config/schema.js';\nimport { MAX_EXTENSION_STORE_ZIP_BYTES } from '../../../../../extensions/store-zip-limits.js';\nimport { isValidSkillId, MAX_SKILL_ZIP_BYTES } from '../../../managed-store.js';\nimport type { SkillMarkdownPreviewPayload } from '../../../types.js';\n\nconst DEFAULT_STORE_BASE = 'https://store.xopc.ai';\n\n/**\n * Marketplace provider identifier. Dynamic — extensions can register additional providers\n * via `api.registerMarketplaceAdapter()`. Built-in values: 'store', 'skillhub', 'clawhub'.\n */\nexport type SkillsMarketplaceProvider = string;\n\nexport interface SkillsStoreListParams {\n q?: string;\n page?: number;\n pageSize?: number;\n sort?: 'downloads' | 'newest';\n /** Adapter-defined category id (exact match against package `categories`). */\n category?: string;\n}\n\n/** Category option for marketplace filter chips (from adapter). */\nexport interface MarketplaceCategoryOption {\n id: string;\n label: string;\n}\n\n/** Mirrors xopc-store GET /api/v1/packages list response (subset used by UI). */\nexport interface SkillsStorePackageListItem {\n id: string;\n name: string;\n type: string;\n description: string;\n downloads: number;\n author: { username: string; avatarUrl: string | null };\n latestVersion?: string;\n updatedAt: string;\n /** Taxonomy / tags from the marketplace (adapter-specific). */\n categories?: string[];\n tags?: string[];\n stars?: number;\n /** Short provenance label for the row (e.g. ClawHub). */\n sourceLabel?: string;\n}\n\n/** Unified marketplace package list item (works for all adapters). */\nexport type MarketplacePackageListItem = SkillsStorePackageListItem;\n\nexport interface SkillsStoreListResponse {\n items: SkillsStorePackageListItem[];\n meta: { page: number; pageSize: number; total: number; totalPages: number };\n}\n\nexport function resolveSkillsStoreBaseUrl(config: Config): string {\n const env = process.env.XOPC_SKILLS_STORE_URL?.trim();\n if (env) {\n try {\n return normalizeBaseUrl(new URL(env).toString());\n } catch {\n // fall through\n }\n }\n const fromConfig = config.gateway?.skillsStoreBaseUrl?.trim();\n if (fromConfig) {\n try {\n return normalizeBaseUrl(new URL(fromConfig).toString());\n } catch {\n return DEFAULT_STORE_BASE;\n }\n }\n return DEFAULT_STORE_BASE;\n}\n\nexport { MAX_EXTENSION_STORE_ZIP_BYTES };\n\n/**\n * Base URL for extension downloads (defaults to skills store host — usually store.xopc.ai).\n * Override with `XOPC_EXTENSIONS_STORE_URL`.\n */\nexport function resolveExtensionsStoreBaseUrl(config: Config): string {\n const env = process.env.XOPC_EXTENSIONS_STORE_URL?.trim();\n if (env) {\n try {\n return normalizeBaseUrl(new URL(env).toString());\n } catch {\n // fall through\n }\n }\n return resolveSkillsStoreBaseUrl(config);\n}\n\nfunction normalizeBaseUrl(url: string): string {\n return url.replace(/\\/$/, '');\n}\n\nexport function getStoreOrigin(baseUrl: string): string {\n const u = new URL(baseUrl);\n return `${u.protocol}//${u.host}`;\n}\n\n/**\n * Allow download URLs whose origin matches the configured store base (SSRF guard).\n * Production store is HTTPS-only; local dev (`http://localhost` / `127.0.0.1`) may use HTTP.\n */\nexport function assertDownloadUrlAllowed(downloadUrl: string, storeBaseUrl: string): URL {\n let u: URL;\n try {\n u = new URL(downloadUrl);\n } catch {\n throw new Error('Invalid download URL from store');\n }\n const allowed = new URL(storeBaseUrl);\n const localHttpDev =\n allowed.protocol === 'http:' &&\n (allowed.hostname === 'localhost' || allowed.hostname === '127.0.0.1');\n if (localHttpDev) {\n if (u.protocol !== 'http:' && u.protocol !== 'https:') {\n throw new Error('Download URL must use HTTP or HTTPS');\n }\n } else if (u.protocol !== 'https:') {\n throw new Error('Download URL must use HTTPS');\n }\n if (u.host !== allowed.host) {\n throw new Error('Download URL host does not match configured store host');\n }\n return u;\n}\n\nasync function fetchJson<T>(url: string, init?: RequestInit): Promise<T> {\n const res = await fetch(url, {\n ...init,\n headers: { Accept: 'application/json', ...init?.headers },\n });\n const text = await res.text();\n if (!res.ok) {\n let msg = `Store request failed (${res.status})`;\n try {\n const j = JSON.parse(text) as { error?: { message?: string } };\n if (j.error?.message) msg = j.error.message;\n } catch {\n if (text) msg = text.slice(0, 200);\n }\n throw new Error(msg);\n }\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new Error('Store returned invalid JSON');\n }\n}\n\nexport async function listSkillPackages(\n storeBaseUrl: string,\n params: SkillsStoreListParams,\n): Promise<SkillsStoreListResponse> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const sp = new URLSearchParams();\n sp.set('type', 'skill');\n if (params.q?.trim()) sp.set('q', params.q.trim());\n if (params.page != null) sp.set('page', String(params.page));\n if (params.pageSize != null) sp.set('pageSize', String(params.pageSize));\n if (params.sort) sp.set('sort', params.sort);\n if (params.category?.trim()) sp.set('category', params.category.trim());\n\n const url = `${base}/api/v1/packages?${sp.toString()}`;\n return fetchJson<SkillsStoreListResponse>(url);\n}\n\n/** GET /api/v1/packages/:name — published skill package (public). */\nexport interface MarketplacePackageDetail {\n id: string;\n name: string;\n type: string;\n description: string;\n readme: string | null;\n downloads: number;\n author: { username: string; avatarUrl: string | null };\n latestVersion: {\n version: string;\n changelog: string | null;\n publishedAt: string;\n };\n}\n\nexport async function fetchMarketplacePackageDetail(\n storeBaseUrl: string,\n packageName: string,\n): Promise<MarketplacePackageDetail> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const enc = encodeURIComponent(packageName.trim());\n return fetchJson<MarketplacePackageDetail>(`${base}/api/v1/packages/${enc}`);\n}\n\nexport async function resolveSkillZipDownloadUrl(\n storeBaseUrl: string,\n packageName: string,\n version?: string,\n): Promise<{ downloadUrl: string; version: string }> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const enc = encodeURIComponent(packageName);\n if (version?.trim()) {\n const v = encodeURIComponent(version.trim());\n const detail = await fetchJson<{\n downloadUrl: string;\n version: string;\n }>(`${base}/api/v1/packages/${enc}/versions/${v}`);\n if (!detail.downloadUrl) {\n throw new Error('Store version has no download URL');\n }\n assertDownloadUrlAllowed(detail.downloadUrl, base);\n return { downloadUrl: detail.downloadUrl, version: detail.version };\n }\n\n const pkg = await fetchJson<{\n name: string;\n latestVersion: { downloadUrl: string; version: string };\n }>(`${base}/api/v1/packages/${enc}`);\n if (!pkg.latestVersion?.downloadUrl) {\n throw new Error('Package has no published version');\n }\n assertDownloadUrlAllowed(pkg.latestVersion.downloadUrl, base);\n return {\n downloadUrl: pkg.latestVersion.downloadUrl,\n version: pkg.latestVersion.version,\n };\n}\n\nexport async function downloadSkillZipBuffer(\n storeBaseUrl: string,\n downloadUrl: string,\n): Promise<Buffer> {\n const base = normalizeBaseUrl(storeBaseUrl);\n assertDownloadUrlAllowed(downloadUrl, base);\n\n const res = await fetch(downloadUrl, { redirect: 'follow' });\n if (!res.ok) {\n throw new Error(`Failed to download skill archive (${res.status})`);\n }\n const len = res.headers.get('content-length');\n if (len) {\n const n = Number(len);\n if (Number.isFinite(n) && n > MAX_SKILL_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_SKILL_ZIP_BYTES} bytes)`);\n }\n }\n const ab = await res.arrayBuffer();\n const buf = Buffer.from(ab);\n if (buf.length > MAX_SKILL_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_SKILL_ZIP_BYTES} bytes)`);\n }\n return buf;\n}\n\n/** GET /api/v1/packages/:name — subset used for extension installs. */\nexport interface StorePublishedPackageHead {\n name: string;\n type: string;\n latestVersion: {\n version: string;\n downloadUrl: string;\n checksum?: string;\n integrity?: string;\n sha256?: string;\n };\n}\n\nexport async function resolveExtensionZipDownloadUrl(\n storeBaseUrl: string,\n packageName: string,\n version?: string,\n): Promise<{ downloadUrl: string; version: string; integrity?: string }> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const enc = encodeURIComponent(packageName.trim());\n const meta = await fetchJson<StorePublishedPackageHead>(`${base}/api/v1/packages/${enc}`);\n if (meta.type !== 'extension') {\n throw new Error(\n `Package \"${packageName}\" has type \"${meta.type}\" (expected extension). ` +\n 'Use `xopc skills install` for skills.',\n );\n }\n if (version?.trim()) {\n const v = encodeURIComponent(version.trim());\n const detail = await fetchJson<{\n downloadUrl: string;\n version: string;\n checksum?: string;\n integrity?: string;\n sha256?: string;\n }>(`${base}/api/v1/packages/${enc}/versions/${v}`);\n if (!detail.downloadUrl) {\n throw new Error('Store version has no download URL');\n }\n assertDownloadUrlAllowed(detail.downloadUrl, base);\n return {\n downloadUrl: detail.downloadUrl,\n version: detail.version,\n integrity: detail.integrity ?? detail.checksum ?? detail.sha256,\n };\n }\n const lv = meta.latestVersion;\n if (!lv?.downloadUrl) {\n throw new Error('Package has no published version');\n }\n assertDownloadUrlAllowed(lv.downloadUrl, base);\n return {\n downloadUrl: lv.downloadUrl,\n version: lv.version,\n integrity: lv.integrity ?? lv.checksum ?? lv.sha256,\n };\n}\n\nexport async function downloadExtensionStoreZipBuffer(\n storeBaseUrl: string,\n downloadUrl: string,\n): Promise<Buffer> {\n const base = normalizeBaseUrl(storeBaseUrl);\n assertDownloadUrlAllowed(downloadUrl, base);\n const res = await fetch(downloadUrl, { redirect: 'follow' });\n if (!res.ok) {\n throw new Error(`Failed to download extension archive (${res.status})`);\n }\n const len = res.headers.get('content-length');\n if (len) {\n const n = Number(len);\n if (Number.isFinite(n) && n > MAX_EXTENSION_STORE_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_EXTENSION_STORE_ZIP_BYTES} bytes)`);\n }\n }\n const ab = await res.arrayBuffer();\n const buf = Buffer.from(ab);\n if (buf.length > MAX_EXTENSION_STORE_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_EXTENSION_STORE_ZIP_BYTES} bytes)`);\n }\n return buf;\n}\n\nexport function skillIdForMarketplaceInstall(packageName: string): string | undefined {\n const trimmed = packageName.trim();\n if (!trimmed) return undefined;\n return isValidSkillId(trimmed) ? trimmed : undefined;\n}\n\n/**\n * Unified marketplace list response (adapter fills `provider`).\n */\nexport interface UnifiedMarketplaceListResponse {\n items: MarketplacePackageListItem[];\n meta: { page: number; pageSize: number; total: number; totalPages: number };\n provider: string;\n}\n\n/**\n * Unified marketplace package detail response.\n */\nexport interface UnifiedMarketplacePackageDetail extends MarketplacePackageDetail {\n provider: string;\n /** Gateway-normalized structured meta + body rendered by the console. */\n skillDocPreview: SkillMarkdownPreviewPayload;\n /** SkillHub-specific fields */\n skillHubInfo?: {\n category: string;\n installs: number;\n stars: number;\n securityReports?: {\n keen?: { status: string; statusText: string; reportUrl?: string };\n sanbu?: { status: string; statusText: string; reportUrl?: string };\n };\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { readFile, readdir } from "fs/promises";
|
|
4
3
|
import { join } from "path";
|
|
4
|
+
import { readFile, readdir } from "fs/promises";
|
|
5
5
|
//#region src/agent/skills/scanner.ts
|
|
6
6
|
/**
|
|
7
7
|
* Skill security scanner — scans skill directories for potentially dangerous code patterns.
|