@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,10 +1,10 @@
|
|
|
1
|
-
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
2
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
3
2
|
import { init_logger } from "../utils/logger.js";
|
|
4
3
|
import { init_paths, resolveExtensionsDir, resolveExtensionsLockPath } from "../config/paths.js";
|
|
5
|
-
import {
|
|
4
|
+
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
6
5
|
import { dirname, join } from "path";
|
|
7
6
|
import { existsSync } from "fs";
|
|
7
|
+
import { mkdir, readFile } from "fs/promises";
|
|
8
8
|
import { createHash } from "crypto";
|
|
9
9
|
//#region src/extensions/lockfile.ts
|
|
10
10
|
init_write_file_atomic();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lockfile.js","names":[],"sources":["../../../src/extensions/lockfile.ts"],"sourcesContent":["import { readFile, mkdir } from 'fs/promises';\nimport { writeTextAtomic } from '../infra/write-file-atomic.js';\nimport { existsSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { createHash } from 'crypto';\nimport { createLogger } from '../utils/logger.js';\nimport { resolveExtensionsLockPath, resolveExtensionsDir } from '../config/paths.js';\n\nconst log = createLogger('ExtensionLockfile');\n\n// ============================================\n// Types\n// ============================================\n\nexport type ExtensionSource = 'npm' | 'local' | 'git' | 'store';\n\nexport interface ExtensionLockEntry {\n /** Extension ID */\n name: string;\n /** Installed version */\n version: string;\n /** Resolved URL or path */\n resolved: string;\n /** Integrity hash (for verification) */\n integrity?: string;\n /** Installation timestamp */\n installedAt: string;\n /** Source type */\n source: ExtensionSource;\n /** Local path (for local extensions) */\n localPath?: string;\n /** Git reference (for git extensions) */\n gitRef?: string;\n /** Dependencies */\n dependencies?: Record<string, string>;\n}\n\nexport interface ExtensionsLockfile {\n version: number;\n lockfileVersion: number;\n /** Installed extensions */\n extensions: Record<string, ExtensionLockEntry>;\n /** Last updated timestamp */\n lastUpdated?: string;\n}\n\n// ============================================\n// Extension Lockfile Manager\n// ============================================\n\nexport class ExtensionLockfileManager {\n private readonly lockfilePath: string;\n\n constructor(lockfilePath?: string) {\n this.lockfilePath = lockfilePath || resolveExtensionsLockPath();\n }\n\n /**\n * Load the lockfile\n */\n async load(): Promise<ExtensionsLockfile> {\n if (!existsSync(this.lockfilePath)) {\n return { version: 1, lockfileVersion: 1, extensions: {} };\n }\n\n try {\n const content = await readFile(this.lockfilePath, 'utf-8');\n const data = JSON.parse(content);\n return {\n version: data.version || 1,\n lockfileVersion: data.lockfileVersion || 1,\n extensions: data.extensions || {},\n lastUpdated: data.lastUpdated,\n };\n } catch (error) {\n log.warn({ error }, 'Failed to load lockfile, starting fresh');\n return { version: 1, lockfileVersion: 1, extensions: {} };\n }\n }\n\n /**\n * Save the lockfile\n */\n async save(data: ExtensionsLockfile): Promise<void> {\n data.lastUpdated = new Date().toISOString();\n\n await mkdir(dirname(this.lockfilePath), { recursive: true });\n await writeTextAtomic(this.lockfilePath, JSON.stringify(data, null, 2));\n\n log.debug('Lockfile saved');\n }\n\n /**\n * Add or update an extension entry\n */\n async upsert(\n extensionId: string,\n entry: Omit<ExtensionLockEntry, 'installedAt'>\n ): Promise<void> {\n const data = await this.load();\n\n data.extensions[extensionId] = {\n ...entry,\n installedAt: new Date().toISOString(),\n };\n\n await this.save(data);\n log.info({ extensionId, version: entry.version }, 'Extension locked');\n }\n\n /**\n * Remove an extension entry\n */\n async remove(extensionId: string): Promise<void> {\n const data = await this.load();\n\n if (data.extensions[extensionId]) {\n delete data.extensions[extensionId];\n await this.save(data);\n log.info({ extensionId }, 'Extension removed from lockfile');\n }\n }\n\n /**\n * Get a specific extension entry\n */\n async get(extensionId: string): Promise<ExtensionLockEntry | null> {\n const data = await this.load();\n return data.extensions[extensionId] || null;\n }\n\n /**\n * Check if an extension is locked\n */\n async has(extensionId: string): Promise<boolean> {\n const data = await this.load();\n return extensionId in data.extensions;\n }\n\n /**\n * List all locked extensions\n */\n async list(): Promise<ExtensionLockEntry[]> {\n const data = await this.load();\n return Object.values(data.extensions);\n }\n\n /**\n * Verify extension integrity\n */\n async verify(extensionId: string): Promise<{ valid: boolean; reason?: string }> {\n const entry = await this.get(extensionId);\n\n if (!entry) {\n return { valid: false, reason: 'Extension not in lockfile' };\n }\n\n const extDir = join(resolveExtensionsDir(), extensionId);\n\n if (!existsSync(extDir)) {\n return { valid: false, reason: 'Extension directory not found' };\n }\n\n // TODO: Verify integrity hash if available\n // This would require reading and hashing the extension files\n\n return { valid: true };\n }\n\n /**\n * Verify all locked extensions\n */\n async verifyAll(): Promise<\n Array<{ extensionId: string; valid: boolean; reason?: string }>\n > {\n const data = await this.load();\n const results: Array<{ extensionId: string; valid: boolean; reason?: string }> = [];\n\n for (const extensionId of Object.keys(data.extensions)) {\n results.push({\n extensionId,\n ...(await this.verify(extensionId)),\n });\n }\n\n return results;\n }\n\n /**\n * Freeze current state (save with validation)\n */\n async freeze(): Promise<ExtensionsLockfile> {\n const data = await this.load();\n\n // Validate all extensions exist\n for (const [extensionId] of Object.entries(data.extensions)) {\n const extDir = join(resolveExtensionsDir(), extensionId);\n\n if (!existsSync(extDir)) {\n log.warn({ extensionId }, 'Extension in lockfile but not installed');\n }\n }\n\n data.lastUpdated = new Date().toISOString();\n await this.save(data);\n\n log.info('Lockfile frozen');\n return data;\n }\n\n /**\n * Generate integrity hash for a file\n */\n static async generateIntegrity(filePath: string): Promise<string> {\n const { readFile } = await import('fs/promises');\n const content = await readFile(filePath);\n return 'sha512-' + createHash('sha512').update(content).digest('base64');\n }\n}\n\n// ============================================\n// Global Instance\n// ============================================\n\nlet globalManager: ExtensionLockfileManager | undefined;\n\nexport function getExtensionLockfileManager(\n lockfilePath?: string\n): ExtensionLockfileManager {\n if (!globalManager) {\n globalManager = new ExtensionLockfileManager(lockfilePath);\n }\n return globalManager;\n}\n\nexport function resetExtensionLockfileManager(): void {\n globalManager = undefined;\n}\n\n// ============================================\n// Convenience Functions\n// ============================================\n\nexport async function loadExtensionLockfile(\n lockfilePath?: string\n): Promise<ExtensionsLockfile> {\n const manager = getExtensionLockfileManager(lockfilePath);\n return manager.load();\n}\n\nexport async function saveExtensionLockfile(\n data: ExtensionsLockfile,\n lockfilePath?: string\n): Promise<void> {\n const manager = getExtensionLockfileManager(lockfilePath);\n return manager.save(data);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lockfile.js","names":[],"sources":["../../../src/extensions/lockfile.ts"],"sourcesContent":["import { readFile, mkdir } from 'fs/promises';\nimport { writeTextAtomic } from '../infra/write-file-atomic.js';\nimport { existsSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { createHash } from 'crypto';\nimport { createLogger } from '../utils/logger.js';\nimport { resolveExtensionsLockPath, resolveExtensionsDir } from '../config/paths.js';\n\nconst log = createLogger('ExtensionLockfile');\n\n// ============================================\n// Types\n// ============================================\n\nexport type ExtensionSource = 'npm' | 'local' | 'git' | 'store';\n\nexport interface ExtensionLockEntry {\n /** Extension ID */\n name: string;\n /** Installed version */\n version: string;\n /** Resolved URL or path */\n resolved: string;\n /** Download artifact integrity, formatted as sha256-<base64>. */\n integrity?: string;\n /** Deterministic hash of installed files, formatted as dir-sha256-<base64>. */\n installedIntegrity?: string;\n /** Immutable artifact URL used during install, when available. */\n artifactUrl?: string;\n /** Manifest snapshot captured at install time. */\n manifest?: Record<string, unknown>;\n /** package.json snapshot captured at install time. */\n packageJson?: Record<string, unknown>;\n /** Installation timestamp */\n installedAt: string;\n /** Source type */\n source: ExtensionSource;\n /** Local path (for local extensions) */\n localPath?: string;\n /** Git reference (for git extensions) */\n gitRef?: string;\n /** Dependencies */\n dependencies?: Record<string, string>;\n}\n\nexport interface ExtensionsLockfile {\n version: number;\n lockfileVersion: number;\n /** Installed extensions */\n extensions: Record<string, ExtensionLockEntry>;\n /** Last updated timestamp */\n lastUpdated?: string;\n}\n\n// ============================================\n// Extension Lockfile Manager\n// ============================================\n\nexport class ExtensionLockfileManager {\n private readonly lockfilePath: string;\n\n constructor(lockfilePath?: string) {\n this.lockfilePath = lockfilePath || resolveExtensionsLockPath();\n }\n\n /**\n * Load the lockfile\n */\n async load(): Promise<ExtensionsLockfile> {\n if (!existsSync(this.lockfilePath)) {\n return { version: 1, lockfileVersion: 1, extensions: {} };\n }\n\n try {\n const content = await readFile(this.lockfilePath, 'utf-8');\n const data = JSON.parse(content);\n return {\n version: data.version || 1,\n lockfileVersion: data.lockfileVersion || 1,\n extensions: data.extensions || {},\n lastUpdated: data.lastUpdated,\n };\n } catch (error) {\n log.warn({ error }, 'Failed to load lockfile, starting fresh');\n return { version: 1, lockfileVersion: 1, extensions: {} };\n }\n }\n\n /**\n * Save the lockfile\n */\n async save(data: ExtensionsLockfile): Promise<void> {\n data.lastUpdated = new Date().toISOString();\n\n await mkdir(dirname(this.lockfilePath), { recursive: true });\n await writeTextAtomic(this.lockfilePath, JSON.stringify(data, null, 2));\n\n log.debug('Lockfile saved');\n }\n\n /**\n * Add or update an extension entry\n */\n async upsert(\n extensionId: string,\n entry: Omit<ExtensionLockEntry, 'installedAt'>\n ): Promise<void> {\n const data = await this.load();\n\n data.extensions[extensionId] = {\n ...entry,\n installedAt: new Date().toISOString(),\n };\n\n await this.save(data);\n log.info({ extensionId, version: entry.version }, 'Extension locked');\n }\n\n /**\n * Remove an extension entry\n */\n async remove(extensionId: string): Promise<void> {\n const data = await this.load();\n\n if (data.extensions[extensionId]) {\n delete data.extensions[extensionId];\n await this.save(data);\n log.info({ extensionId }, 'Extension removed from lockfile');\n }\n }\n\n /**\n * Get a specific extension entry\n */\n async get(extensionId: string): Promise<ExtensionLockEntry | null> {\n const data = await this.load();\n return data.extensions[extensionId] || null;\n }\n\n /**\n * Check if an extension is locked\n */\n async has(extensionId: string): Promise<boolean> {\n const data = await this.load();\n return extensionId in data.extensions;\n }\n\n /**\n * List all locked extensions\n */\n async list(): Promise<ExtensionLockEntry[]> {\n const data = await this.load();\n return Object.values(data.extensions);\n }\n\n /**\n * Verify extension integrity\n */\n async verify(extensionId: string): Promise<{ valid: boolean; reason?: string }> {\n const entry = await this.get(extensionId);\n\n if (!entry) {\n return { valid: false, reason: 'Extension not in lockfile' };\n }\n\n const extDir = join(resolveExtensionsDir(), extensionId);\n\n if (!existsSync(extDir)) {\n return { valid: false, reason: 'Extension directory not found' };\n }\n\n // TODO: Verify integrity hash if available\n // This would require reading and hashing the extension files\n\n return { valid: true };\n }\n\n /**\n * Verify all locked extensions\n */\n async verifyAll(): Promise<\n Array<{ extensionId: string; valid: boolean; reason?: string }>\n > {\n const data = await this.load();\n const results: Array<{ extensionId: string; valid: boolean; reason?: string }> = [];\n\n for (const extensionId of Object.keys(data.extensions)) {\n results.push({\n extensionId,\n ...(await this.verify(extensionId)),\n });\n }\n\n return results;\n }\n\n /**\n * Freeze current state (save with validation)\n */\n async freeze(): Promise<ExtensionsLockfile> {\n const data = await this.load();\n\n // Validate all extensions exist\n for (const [extensionId] of Object.entries(data.extensions)) {\n const extDir = join(resolveExtensionsDir(), extensionId);\n\n if (!existsSync(extDir)) {\n log.warn({ extensionId }, 'Extension in lockfile but not installed');\n }\n }\n\n data.lastUpdated = new Date().toISOString();\n await this.save(data);\n\n log.info('Lockfile frozen');\n return data;\n }\n\n /**\n * Generate integrity hash for a file\n */\n static async generateIntegrity(filePath: string): Promise<string> {\n const { readFile } = await import('fs/promises');\n const content = await readFile(filePath);\n return 'sha512-' + createHash('sha512').update(content).digest('base64');\n }\n}\n\n// ============================================\n// Global Instance\n// ============================================\n\nlet globalManager: ExtensionLockfileManager | undefined;\n\nexport function getExtensionLockfileManager(\n lockfilePath?: string\n): ExtensionLockfileManager {\n if (!globalManager) {\n globalManager = new ExtensionLockfileManager(lockfilePath);\n }\n return globalManager;\n}\n\nexport function resetExtensionLockfileManager(): void {\n globalManager = undefined;\n}\n\n// ============================================\n// Convenience Functions\n// ============================================\n\nexport async function loadExtensionLockfile(\n lockfilePath?: string\n): Promise<ExtensionsLockfile> {\n const manager = getExtensionLockfileManager(lockfilePath);\n return manager.load();\n}\n\nexport async function saveExtensionLockfile(\n data: ExtensionsLockfile,\n lockfilePath?: string\n): Promise<void> {\n const manager = getExtensionLockfileManager(lockfilePath);\n return manager.save(data);\n}\n"],"mappings":"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"}
|
|
@@ -16,8 +16,14 @@ function normalizeReload(raw) {
|
|
|
16
16
|
function normalizeEngines(raw) {
|
|
17
17
|
if (!isRecord(raw)) return void 0;
|
|
18
18
|
const xopc = typeof raw.xopc === "string" && raw.xopc.length > 0 ? raw.xopc : void 0;
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
const extensionApi = typeof raw.extensionApi === "string" && raw.extensionApi.length > 0 ? raw.extensionApi : void 0;
|
|
20
|
+
const extensionUiApi = typeof raw.extensionUiApi === "string" && raw.extensionUiApi.length > 0 ? raw.extensionUiApi : void 0;
|
|
21
|
+
if (!xopc && !extensionApi && !extensionUiApi) return void 0;
|
|
22
|
+
return {
|
|
23
|
+
xopc,
|
|
24
|
+
extensionApi,
|
|
25
|
+
extensionUiApi
|
|
26
|
+
};
|
|
21
27
|
}
|
|
22
28
|
function normalizeManifestCommands(raw) {
|
|
23
29
|
if (!Array.isArray(raw)) return void 0;
|
|
@@ -380,14 +386,24 @@ function normalizeContracts(raw) {
|
|
|
380
386
|
if (!isRecord(raw)) return void 0;
|
|
381
387
|
const pick = (k) => Array.isArray(raw[k]) ? raw[k].filter((x) => typeof x === "string") : void 0;
|
|
382
388
|
const c = {
|
|
389
|
+
tools: pick("tools"),
|
|
390
|
+
hooks: pick("hooks"),
|
|
391
|
+
commands: pick("commands"),
|
|
392
|
+
cliCommands: pick("cliCommands"),
|
|
393
|
+
channels: pick("channels"),
|
|
394
|
+
httpRoutes: pick("httpRoutes"),
|
|
395
|
+
gatewayMethods: pick("gatewayMethods"),
|
|
396
|
+
services: pick("services"),
|
|
397
|
+
tui: pick("tui"),
|
|
398
|
+
providers: pick("providers"),
|
|
399
|
+
marketplaceAdapters: pick("marketplaceAdapters"),
|
|
383
400
|
mediaUnderstandingProviders: pick("mediaUnderstandingProviders"),
|
|
384
401
|
speechProviders: pick("speechProviders"),
|
|
385
402
|
imageGenerationProviders: pick("imageGenerationProviders"),
|
|
386
403
|
webSearchProviders: pick("webSearchProviders"),
|
|
387
404
|
memoryProviders: pick("memoryProviders")
|
|
388
405
|
};
|
|
389
|
-
|
|
390
|
-
return c;
|
|
406
|
+
return Object.values(c).some((value) => Array.isArray(value) && value.length > 0) ? c : void 0;
|
|
391
407
|
}
|
|
392
408
|
function normalizeSetup(raw) {
|
|
393
409
|
if (!isRecord(raw)) return void 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize-manifest.js","names":[],"sources":["../../../src/extensions/normalize-manifest.ts"],"sourcesContent":["import type {\n ActivationDeclaration,\n ChatWidgetContribution,\n ChatWidgetMatch,\n CommandContribution,\n ContractDeclaration,\n EnginesDeclaration,\n ExtensionManifest,\n ChannelContributionDeclaration,\n ChannelActionDescriptor,\n ChannelConfigUiHint,\n ExtensionManifestCommand,\n ExtensionUiContributions,\n ExtensionUiManifest,\n ExtensionUiPermission,\n ModelSupportDeclaration,\n PageContribution,\n ProviderAuthChoice,\n SettingsPanelContribution,\n SetupDeclaration,\n SidebarPanelContribution,\n StatusBarItemContribution,\n} from './types/manifest.js';\nimport type { ExtensionKind } from './types/core.js';\n\nfunction isRecord(x: unknown): x is Record<string, unknown> {\n return typeof x === 'object' && x !== null && !Array.isArray(x);\n}\n\nfunction normalizeReload(raw: unknown): ExtensionManifest['reload'] {\n if (!isRecord(raw)) return undefined;\n const configPrefixes = Array.isArray(raw.configPrefixes)\n ? raw.configPrefixes.filter((x): x is string => typeof x === 'string')\n : undefined;\n const supportsHotReload =\n typeof raw.supportsHotReload === 'boolean' ? raw.supportsHotReload : undefined;\n if (!configPrefixes?.length && supportsHotReload === undefined) return undefined;\n return {\n ...(configPrefixes?.length ? { configPrefixes } : {}),\n ...(supportsHotReload !== undefined ? { supportsHotReload } : {}),\n };\n}\n\nfunction normalizeEngines(raw: unknown): EnginesDeclaration | undefined {\n if (!isRecord(raw)) return undefined;\n const xopc = typeof raw.xopc === 'string' && raw.xopc.length > 0 ? raw.xopc : undefined;\n if (!xopc) return undefined;\n return { xopc };\n}\n\nfunction normalizeManifestCommands(raw: unknown): ExtensionManifestCommand[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const out: ExtensionManifestCommand[] = [];\n for (const item of raw) {\n if (!isRecord(item)) continue;\n const name = typeof item.name === 'string' ? item.name.trim() : '';\n const description = typeof item.description === 'string' ? item.description : '';\n if (!name || !description) continue;\n const aliases = Array.isArray(item.aliases)\n ? item.aliases.filter((x): x is string => typeof x === 'string')\n : undefined;\n const scope = Array.isArray(item.scope)\n ? item.scope.filter(\n (x): x is 'global' | 'private' | 'group' =>\n x === 'global' || x === 'private' || x === 'group',\n )\n : undefined;\n const examples = Array.isArray(item.examples)\n ? item.examples.filter((x): x is string => typeof x === 'string')\n : undefined;\n out.push({\n name,\n description,\n ...(aliases?.length ? { aliases } : {}),\n ...(scope?.length ? { scope } : {}),\n ...(examples?.length ? { examples } : {}),\n });\n }\n return out.length > 0 ? out : undefined;\n}\n\nfunction normalizeChannelContributions(raw: unknown): Record<string, ChannelContributionDeclaration> | undefined {\n if (!isRecord(raw)) return undefined;\n const out: Record<string, ChannelContributionDeclaration> = {};\n for (const [id, value] of Object.entries(raw)) {\n if (!isRecord(value)) continue;\n const label = typeof value.label === 'string' && value.label.trim() ? value.label.trim() : '';\n if (!id.trim() || !label) continue;\n out[id.trim()] = {\n label,\n description: typeof value.description === 'string' ? value.description : undefined,\n docsPath: typeof value.docsPath === 'string' ? value.docsPath : undefined,\n order: typeof value.order === 'number' && Number.isFinite(value.order) ? value.order : undefined,\n configPath: typeof value.configPath === 'string' ? value.configPath : undefined,\n capabilities: isRecord(value.capabilities) ? value.capabilities : undefined,\n configSchema: isRecord(value.configSchema) ? value.configSchema : undefined,\n uiHints: normalizeChannelUiHints(value.uiHints),\n actions: normalizeChannelActions(value.actions),\n i18n: normalizeChannelContributionI18n(value.i18n),\n };\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction normalizeChannelContributionI18n(raw: unknown): ChannelContributionDeclaration['i18n'] {\n if (!isRecord(raw)) return undefined;\n const out: NonNullable<ChannelContributionDeclaration['i18n']> = {};\n for (const [locale, value] of Object.entries(raw)) {\n if (!locale.trim() || !isRecord(value)) continue;\n const entry = {\n label: typeof value.label === 'string' ? value.label : undefined,\n description: typeof value.description === 'string' ? value.description : undefined,\n configSchema: isRecord(value.configSchema) ? value.configSchema : undefined,\n uiHints: normalizeChannelUiHints(value.uiHints),\n actions: normalizeChannelActions(value.actions),\n };\n if (entry.label || entry.description || entry.configSchema || entry.uiHints || entry.actions) {\n out[locale.trim().toLowerCase().replace('_', '-')] = entry;\n }\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction normalizeChannelUiHints(raw: unknown): Record<string, ChannelConfigUiHint> | undefined {\n if (!isRecord(raw)) return undefined;\n const out: Record<string, ChannelConfigUiHint> = {};\n for (const [key, value] of Object.entries(raw)) {\n if (!key.trim() || !isRecord(value)) continue;\n out[key.trim()] = {\n label: typeof value.label === 'string' ? value.label : undefined,\n help: typeof value.help === 'string' ? value.help : undefined,\n tags: Array.isArray(value.tags) ? value.tags.filter((x): x is string => typeof x === 'string') : undefined,\n advanced: typeof value.advanced === 'boolean' ? value.advanced : undefined,\n sensitive: typeof value.sensitive === 'boolean' ? value.sensitive : undefined,\n placeholder: typeof value.placeholder === 'string' ? value.placeholder : undefined,\n itemTemplate: value.itemTemplate,\n };\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction normalizeChannelActions(raw: unknown): Record<string, ChannelActionDescriptor> | undefined {\n if (!isRecord(raw)) return undefined;\n const out: Record<string, ChannelActionDescriptor> = {};\n for (const [key, value] of Object.entries(raw)) {\n if (!key.trim() || !isRecord(value)) continue;\n const result = value.result;\n out[key.trim()] = {\n label: typeof value.label === 'string' ? value.label : undefined,\n description: typeof value.description === 'string' ? value.description : undefined,\n result:\n result === 'ok' || result === 'qr' || result === 'poll' || result === 'diagnostics' || result === 'form'\n ? result\n : undefined,\n schema: isRecord(value.schema) ? value.schema : undefined,\n };\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\n/**\n * Normalize raw JSON manifest into ExtensionManifest with stable optional fields.\n */\nexport function normalizeExtensionManifest(raw: Record<string, unknown>): ExtensionManifest {\n const id = String(raw.id ?? '');\n return {\n id,\n name: typeof raw.name === 'string' && raw.name.length > 0 ? raw.name : id,\n description: typeof raw.description === 'string' ? raw.description : undefined,\n version: typeof raw.version === 'string' ? raw.version : undefined,\n kind: raw.kind as ExtensionKind | undefined,\n main: typeof raw.main === 'string' ? raw.main : undefined,\n configSchema: isRecord(raw.configSchema) ? (raw.configSchema as Record<string, unknown>) : undefined,\n dependencies: isRecord(raw.dependencies) ? (raw.dependencies as Record<string, string>) : undefined,\n\n enabledByDefault: typeof raw.enabledByDefault === 'boolean' ? raw.enabledByDefault : undefined,\n\n providers: Array.isArray(raw.providers)\n ? raw.providers.filter((x): x is string => typeof x === 'string')\n : undefined,\n speechProviders: Array.isArray(raw.speechProviders)\n ? raw.speechProviders.filter((x): x is string => typeof x === 'string')\n : undefined,\n mediaUnderstandingProviders: Array.isArray(raw.mediaUnderstandingProviders)\n ? raw.mediaUnderstandingProviders.filter((x): x is string => typeof x === 'string')\n : undefined,\n providerAuthEnvVars: normalizeStringArrayMap(raw.providerAuthEnvVars),\n providerAuthChoices: normalizeProviderAuthChoices(raw.providerAuthChoices),\n modelSupport: normalizeModelSupport(raw.modelSupport),\n autoEnableWhenConfiguredProviders: Array.isArray(raw.autoEnableWhenConfiguredProviders)\n ? raw.autoEnableWhenConfiguredProviders.filter((x): x is string => typeof x === 'string')\n : undefined,\n\n channels: Array.isArray(raw.channels)\n ? raw.channels.filter((x): x is string => typeof x === 'string')\n : undefined,\n channelEnvVars: normalizeStringArrayMap(raw.channelEnvVars),\n channelContributions: normalizeChannelContributions(raw.channelContributions),\n\n activation: normalizeActivation(raw.activation),\n contracts: normalizeContracts(raw.contracts),\n setup: normalizeSetup(raw.setup),\n reload: normalizeReload(raw.reload),\n engines: normalizeEngines(raw.engines),\n commands: normalizeManifestCommands(raw.commands),\n ui: normalizeUiManifest(raw.ui),\n };\n}\n\nconst VALID_UI_PERMISSIONS = new Set<ExtensionUiPermission>([\n 'agent.send',\n 'agent.subscribe',\n 'session.read',\n 'session.write',\n 'config.read',\n 'config.write',\n 'storage',\n 'notification',\n 'clipboard',\n 'theme',\n 'workspace.read',\n 'workspace.write',\n]);\n\nexport function normalizeUiManifest(raw: unknown): ExtensionUiManifest | undefined {\n if (raw === undefined || raw === null) return undefined;\n if (!isRecord(raw)) return undefined;\n const main = typeof raw.main === 'string' && raw.main.length > 0 ? raw.main : undefined;\n const icon = typeof raw.icon === 'string' && raw.icon.length > 0 ? raw.icon : undefined;\n let permissions: ExtensionUiPermission[] | undefined;\n if (Array.isArray(raw.permissions)) {\n const p = raw.permissions.filter(\n (x): x is ExtensionUiPermission =>\n typeof x === 'string' && VALID_UI_PERMISSIONS.has(x as ExtensionUiPermission),\n );\n permissions = p.length ? p : undefined;\n }\n const contributions = normalizeUiContributions(raw.contributions);\n if (!main && !icon && !permissions && !contributions) return undefined;\n return {\n ...(main !== undefined ? { main } : {}),\n ...(icon !== undefined ? { icon } : {}),\n ...(permissions !== undefined ? { permissions } : {}),\n ...(contributions !== undefined ? { contributions } : {}),\n };\n}\n\nfunction normalizeUiContributions(raw: unknown): ExtensionUiContributions | undefined {\n if (!isRecord(raw)) return undefined;\n const sidebarPanels = normalizeSidebarPanels(raw.sidebarPanels);\n const settingsPanels = normalizeSettingsPanels(raw.settingsPanels);\n const chatWidgets = normalizeChatWidgets(raw.chatWidgets);\n const pages = normalizePages(raw.pages);\n const commands = normalizeCommands(raw.commands);\n const statusBarItems = normalizeStatusBarItems(raw.statusBarItems);\n const out: ExtensionUiContributions = {\n ...(sidebarPanels ? { sidebarPanels } : {}),\n ...(settingsPanels ? { settingsPanels } : {}),\n ...(chatWidgets ? { chatWidgets } : {}),\n ...(pages ? { pages } : {}),\n ...(commands ? { commands } : {}),\n ...(statusBarItems ? { statusBarItems } : {}),\n };\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction normalizeSidebarPanels(raw: unknown): SidebarPanelContribution[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const out: SidebarPanelContribution[] = [];\n for (const item of raw) {\n if (!isRecord(item)) continue;\n const id = item.id;\n const title = item.title;\n const entrypoint = item.entrypoint;\n if (typeof id !== 'string' || typeof title !== 'string' || typeof entrypoint !== 'string') {\n continue;\n }\n out.push({\n id,\n title,\n entrypoint,\n icon: typeof item.icon === 'string' ? item.icon : undefined,\n defaultVisible: typeof item.defaultVisible === 'boolean' ? item.defaultVisible : undefined,\n when: typeof item.when === 'string' && item.when.length > 0 ? item.when : undefined,\n });\n }\n return out.length ? out : undefined;\n}\n\nfunction normalizeSettingsPanels(raw: unknown): SettingsPanelContribution[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const out: SettingsPanelContribution[] = [];\n for (const item of raw) {\n if (!isRecord(item)) continue;\n const id = item.id;\n const title = item.title;\n const entrypoint = item.entrypoint;\n if (typeof id !== 'string' || typeof title !== 'string' || typeof entrypoint !== 'string') {\n continue;\n }\n out.push({\n id,\n title,\n entrypoint,\n order: typeof item.order === 'number' ? item.order : undefined,\n });\n }\n return out.length ? out : undefined;\n}\n\nfunction normalizeChatWidgetMatch(raw: unknown): ChatWidgetMatch | undefined {\n if (!isRecord(raw)) return undefined;\n const toolName = typeof raw.toolName === 'string' ? raw.toolName : undefined;\n const contentType = typeof raw.contentType === 'string' ? raw.contentType : undefined;\n let metadata: Record<string, unknown> | undefined;\n if (isRecord(raw.metadata)) {\n metadata = { ...raw.metadata };\n }\n if (!toolName && !contentType && !metadata) return undefined;\n return { toolName, contentType, metadata };\n}\n\nfunction normalizeChatWidgets(raw: unknown): ChatWidgetContribution[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const out: ChatWidgetContribution[] = [];\n for (const item of raw) {\n if (!isRecord(item)) continue;\n const id = item.id;\n const title = item.title;\n const entrypoint = item.entrypoint;\n if (typeof id !== 'string' || typeof title !== 'string' || typeof entrypoint !== 'string') {\n continue;\n }\n const match = normalizeChatWidgetMatch(item.match);\n if (!match) continue;\n out.push({\n id,\n title,\n entrypoint,\n match,\n maxHeight: typeof item.maxHeight === 'number' ? item.maxHeight : undefined,\n interactive: typeof item.interactive === 'boolean' ? item.interactive : undefined,\n });\n }\n return out.length ? out : undefined;\n}\n\nfunction normalizePages(raw: unknown): PageContribution[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const out: PageContribution[] = [];\n for (const item of raw) {\n if (!isRecord(item)) continue;\n const id = item.id;\n const title = item.title;\n const path = item.path;\n const entrypoint = item.entrypoint;\n if (\n typeof id !== 'string' ||\n typeof title !== 'string' ||\n typeof path !== 'string' ||\n typeof entrypoint !== 'string'\n ) {\n continue;\n }\n out.push({\n id,\n title,\n path,\n entrypoint,\n showInNav: typeof item.showInNav === 'boolean' ? item.showInNav : undefined,\n navIcon: typeof item.navIcon === 'string' ? item.navIcon : undefined,\n when: typeof item.when === 'string' && item.when.length > 0 ? item.when : undefined,\n });\n }\n return out.length ? out : undefined;\n}\n\nfunction normalizeCommands(raw: unknown): CommandContribution[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const out: CommandContribution[] = [];\n for (const item of raw) {\n if (!isRecord(item)) continue;\n const id = item.id;\n const title = item.title;\n if (typeof id !== 'string' || typeof title !== 'string') continue;\n out.push({\n id,\n title,\n shortcut: typeof item.shortcut === 'string' ? item.shortcut : undefined,\n opensPanel: typeof item.opensPanel === 'string' ? item.opensPanel : undefined,\n chatAlias:\n typeof item.chatAlias === 'string' && item.chatAlias.length > 0 ? item.chatAlias : undefined,\n when: typeof item.when === 'string' && item.when.length > 0 ? item.when : undefined,\n });\n }\n return out.length ? out : undefined;\n}\n\nfunction normalizeStatusBarItems(raw: unknown): StatusBarItemContribution[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const out: StatusBarItemContribution[] = [];\n for (const item of raw) {\n if (!isRecord(item)) continue;\n const id = item.id;\n const entrypoint = item.entrypoint;\n if (typeof id !== 'string' || typeof entrypoint !== 'string') continue;\n const position = item.position;\n out.push({\n id,\n entrypoint,\n position: position === 'left' || position === 'right' ? position : undefined,\n width: typeof item.width === 'number' ? item.width : undefined,\n when: typeof item.when === 'string' && item.when.length > 0 ? item.when : undefined,\n });\n }\n return out.length ? out : undefined;\n}\n\nfunction normalizeStringArrayMap(\n raw: unknown,\n): Record<string, string[]> | undefined {\n if (!isRecord(raw)) return undefined;\n const out: Record<string, string[]> = {};\n for (const [k, v] of Object.entries(raw)) {\n if (Array.isArray(v)) {\n const arr = v.filter((x): x is string => typeof x === 'string');\n if (arr.length) out[k] = arr;\n }\n }\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction normalizeProviderAuthChoices(raw: unknown): ProviderAuthChoice[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const out: ProviderAuthChoice[] = [];\n for (const item of raw) {\n if (!isRecord(item)) continue;\n const provider = item.provider;\n const method = item.method;\n const choiceId = item.choiceId;\n const choiceLabel = item.choiceLabel;\n if (\n typeof provider !== 'string' ||\n typeof choiceId !== 'string' ||\n typeof choiceLabel !== 'string' ||\n (method !== 'api-key' && method !== 'oauth' && method !== 'cli' && method !== 'env')\n ) {\n continue;\n }\n out.push({\n provider,\n method,\n choiceId,\n choiceLabel,\n choiceHint: typeof item.choiceHint === 'string' ? item.choiceHint : undefined,\n groupId: typeof item.groupId === 'string' ? item.groupId : undefined,\n groupLabel: typeof item.groupLabel === 'string' ? item.groupLabel : undefined,\n groupHint: typeof item.groupHint === 'string' ? item.groupHint : undefined,\n cliFlag: typeof item.cliFlag === 'string' ? item.cliFlag : undefined,\n cliOption: typeof item.cliOption === 'string' ? item.cliOption : undefined,\n cliDescription: typeof item.cliDescription === 'string' ? item.cliDescription : undefined,\n });\n }\n return out.length ? out : undefined;\n}\n\nfunction normalizeModelSupport(raw: unknown): ModelSupportDeclaration | undefined {\n if (!isRecord(raw)) return undefined;\n const modelPrefixes = Array.isArray(raw.modelPrefixes)\n ? raw.modelPrefixes.filter((x): x is string => typeof x === 'string')\n : undefined;\n const modelPatterns = Array.isArray(raw.modelPatterns)\n ? raw.modelPatterns.filter((x): x is string => typeof x === 'string')\n : undefined;\n if (!modelPrefixes?.length && !modelPatterns?.length) return undefined;\n return { modelPrefixes, modelPatterns };\n}\n\nfunction normalizeActivation(raw: unknown): ActivationDeclaration | undefined {\n if (!isRecord(raw)) return undefined;\n const onStartup = typeof raw.onStartup === 'boolean' ? raw.onStartup : undefined;\n const onProviders = Array.isArray(raw.onProviders)\n ? raw.onProviders.filter((x): x is string => typeof x === 'string')\n : undefined;\n const onCommands = Array.isArray(raw.onCommands)\n ? raw.onCommands.filter((x): x is string => typeof x === 'string')\n : undefined;\n const onChannels = Array.isArray(raw.onChannels)\n ? raw.onChannels.filter((x): x is string => typeof x === 'string')\n : undefined;\n const capRaw = raw.onCapabilities;\n const onCapabilities = Array.isArray(capRaw)\n ? capRaw.filter(\n (x): x is 'provider' | 'channel' | 'tool' | 'hook' =>\n x === 'provider' || x === 'channel' || x === 'tool' || x === 'hook',\n )\n : undefined;\n if (\n onStartup === undefined &&\n !onProviders?.length &&\n !onCommands?.length &&\n !onChannels?.length &&\n !onCapabilities?.length\n ) {\n return undefined;\n }\n return { onStartup, onProviders, onCommands, onChannels, onCapabilities };\n}\n\nfunction normalizeContracts(raw: unknown): ContractDeclaration | undefined {\n if (!isRecord(raw)) return undefined;\n const pick = (k: string) =>\n Array.isArray(raw[k]) ? raw[k].filter((x: unknown): x is string => typeof x === 'string') : undefined;\n const c: ContractDeclaration = {\n mediaUnderstandingProviders: pick('mediaUnderstandingProviders'),\n speechProviders: pick('speechProviders'),\n imageGenerationProviders: pick('imageGenerationProviders'),\n webSearchProviders: pick('webSearchProviders'),\n memoryProviders: pick('memoryProviders'),\n };\n if (\n !c.mediaUnderstandingProviders?.length &&\n !c.speechProviders?.length &&\n !c.imageGenerationProviders?.length &&\n !c.webSearchProviders?.length &&\n !c.memoryProviders?.length\n ) {\n return undefined;\n }\n return c;\n}\n\nfunction normalizeSetup(raw: unknown): SetupDeclaration | undefined {\n if (!isRecord(raw)) return undefined;\n const requiresRuntime = typeof raw.requiresRuntime === 'boolean' ? raw.requiresRuntime : undefined;\n let providers: SetupDeclaration['providers'];\n if (Array.isArray(raw.providers)) {\n providers = [];\n for (const p of raw.providers) {\n if (!isRecord(p) || typeof p.id !== 'string') continue;\n providers.push({\n id: p.id,\n authMethods: Array.isArray(p.authMethods)\n ? p.authMethods.filter((x): x is string => typeof x === 'string')\n : undefined,\n envVars: Array.isArray(p.envVars)\n ? p.envVars.filter((x): x is string => typeof x === 'string')\n : undefined,\n });\n }\n if (providers.length === 0) providers = undefined;\n }\n if (!providers && requiresRuntime === undefined) return undefined;\n return { providers, requiresRuntime };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"normalize-manifest.js","names":[],"sources":["../../../src/extensions/normalize-manifest.ts"],"sourcesContent":["import type {\n ActivationDeclaration,\n ChatWidgetContribution,\n ChatWidgetMatch,\n CommandContribution,\n ContractDeclaration,\n EnginesDeclaration,\n ExtensionManifest,\n ChannelContributionDeclaration,\n ChannelActionDescriptor,\n ChannelConfigUiHint,\n ExtensionManifestCommand,\n ExtensionUiContributions,\n ExtensionUiManifest,\n ExtensionUiPermission,\n ModelSupportDeclaration,\n PageContribution,\n ProviderAuthChoice,\n SettingsPanelContribution,\n SetupDeclaration,\n SidebarPanelContribution,\n StatusBarItemContribution,\n} from './types/manifest.js';\nimport type { ExtensionKind } from './types/core.js';\n\nfunction isRecord(x: unknown): x is Record<string, unknown> {\n return typeof x === 'object' && x !== null && !Array.isArray(x);\n}\n\nfunction normalizeReload(raw: unknown): ExtensionManifest['reload'] {\n if (!isRecord(raw)) return undefined;\n const configPrefixes = Array.isArray(raw.configPrefixes)\n ? raw.configPrefixes.filter((x): x is string => typeof x === 'string')\n : undefined;\n const supportsHotReload =\n typeof raw.supportsHotReload === 'boolean' ? raw.supportsHotReload : undefined;\n if (!configPrefixes?.length && supportsHotReload === undefined) return undefined;\n return {\n ...(configPrefixes?.length ? { configPrefixes } : {}),\n ...(supportsHotReload !== undefined ? { supportsHotReload } : {}),\n };\n}\n\nfunction normalizeEngines(raw: unknown): EnginesDeclaration | undefined {\n if (!isRecord(raw)) return undefined;\n const xopc = typeof raw.xopc === 'string' && raw.xopc.length > 0 ? raw.xopc : undefined;\n const extensionApi =\n typeof raw.extensionApi === 'string' && raw.extensionApi.length > 0\n ? raw.extensionApi\n : undefined;\n const extensionUiApi =\n typeof raw.extensionUiApi === 'string' && raw.extensionUiApi.length > 0\n ? raw.extensionUiApi\n : undefined;\n if (!xopc && !extensionApi && !extensionUiApi) return undefined;\n return { xopc, extensionApi, extensionUiApi };\n}\n\nfunction normalizeManifestCommands(raw: unknown): ExtensionManifestCommand[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const out: ExtensionManifestCommand[] = [];\n for (const item of raw) {\n if (!isRecord(item)) continue;\n const name = typeof item.name === 'string' ? item.name.trim() : '';\n const description = typeof item.description === 'string' ? item.description : '';\n if (!name || !description) continue;\n const aliases = Array.isArray(item.aliases)\n ? item.aliases.filter((x): x is string => typeof x === 'string')\n : undefined;\n const scope = Array.isArray(item.scope)\n ? item.scope.filter(\n (x): x is 'global' | 'private' | 'group' =>\n x === 'global' || x === 'private' || x === 'group',\n )\n : undefined;\n const examples = Array.isArray(item.examples)\n ? item.examples.filter((x): x is string => typeof x === 'string')\n : undefined;\n out.push({\n name,\n description,\n ...(aliases?.length ? { aliases } : {}),\n ...(scope?.length ? { scope } : {}),\n ...(examples?.length ? { examples } : {}),\n });\n }\n return out.length > 0 ? out : undefined;\n}\n\nfunction normalizeChannelContributions(raw: unknown): Record<string, ChannelContributionDeclaration> | undefined {\n if (!isRecord(raw)) return undefined;\n const out: Record<string, ChannelContributionDeclaration> = {};\n for (const [id, value] of Object.entries(raw)) {\n if (!isRecord(value)) continue;\n const label = typeof value.label === 'string' && value.label.trim() ? value.label.trim() : '';\n if (!id.trim() || !label) continue;\n out[id.trim()] = {\n label,\n description: typeof value.description === 'string' ? value.description : undefined,\n docsPath: typeof value.docsPath === 'string' ? value.docsPath : undefined,\n order: typeof value.order === 'number' && Number.isFinite(value.order) ? value.order : undefined,\n configPath: typeof value.configPath === 'string' ? value.configPath : undefined,\n capabilities: isRecord(value.capabilities) ? value.capabilities : undefined,\n configSchema: isRecord(value.configSchema) ? value.configSchema : undefined,\n uiHints: normalizeChannelUiHints(value.uiHints),\n actions: normalizeChannelActions(value.actions),\n i18n: normalizeChannelContributionI18n(value.i18n),\n };\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction normalizeChannelContributionI18n(raw: unknown): ChannelContributionDeclaration['i18n'] {\n if (!isRecord(raw)) return undefined;\n const out: NonNullable<ChannelContributionDeclaration['i18n']> = {};\n for (const [locale, value] of Object.entries(raw)) {\n if (!locale.trim() || !isRecord(value)) continue;\n const entry = {\n label: typeof value.label === 'string' ? value.label : undefined,\n description: typeof value.description === 'string' ? value.description : undefined,\n configSchema: isRecord(value.configSchema) ? value.configSchema : undefined,\n uiHints: normalizeChannelUiHints(value.uiHints),\n actions: normalizeChannelActions(value.actions),\n };\n if (entry.label || entry.description || entry.configSchema || entry.uiHints || entry.actions) {\n out[locale.trim().toLowerCase().replace('_', '-')] = entry;\n }\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction normalizeChannelUiHints(raw: unknown): Record<string, ChannelConfigUiHint> | undefined {\n if (!isRecord(raw)) return undefined;\n const out: Record<string, ChannelConfigUiHint> = {};\n for (const [key, value] of Object.entries(raw)) {\n if (!key.trim() || !isRecord(value)) continue;\n out[key.trim()] = {\n label: typeof value.label === 'string' ? value.label : undefined,\n help: typeof value.help === 'string' ? value.help : undefined,\n tags: Array.isArray(value.tags) ? value.tags.filter((x): x is string => typeof x === 'string') : undefined,\n advanced: typeof value.advanced === 'boolean' ? value.advanced : undefined,\n sensitive: typeof value.sensitive === 'boolean' ? value.sensitive : undefined,\n placeholder: typeof value.placeholder === 'string' ? value.placeholder : undefined,\n itemTemplate: value.itemTemplate,\n };\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction normalizeChannelActions(raw: unknown): Record<string, ChannelActionDescriptor> | undefined {\n if (!isRecord(raw)) return undefined;\n const out: Record<string, ChannelActionDescriptor> = {};\n for (const [key, value] of Object.entries(raw)) {\n if (!key.trim() || !isRecord(value)) continue;\n const result = value.result;\n out[key.trim()] = {\n label: typeof value.label === 'string' ? value.label : undefined,\n description: typeof value.description === 'string' ? value.description : undefined,\n result:\n result === 'ok' || result === 'qr' || result === 'poll' || result === 'diagnostics' || result === 'form'\n ? result\n : undefined,\n schema: isRecord(value.schema) ? value.schema : undefined,\n };\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\n/**\n * Normalize raw JSON manifest into ExtensionManifest with stable optional fields.\n */\nexport function normalizeExtensionManifest(raw: Record<string, unknown>): ExtensionManifest {\n const id = String(raw.id ?? '');\n return {\n id,\n name: typeof raw.name === 'string' && raw.name.length > 0 ? raw.name : id,\n description: typeof raw.description === 'string' ? raw.description : undefined,\n version: typeof raw.version === 'string' ? raw.version : undefined,\n kind: raw.kind as ExtensionKind | undefined,\n main: typeof raw.main === 'string' ? raw.main : undefined,\n configSchema: isRecord(raw.configSchema) ? (raw.configSchema as Record<string, unknown>) : undefined,\n dependencies: isRecord(raw.dependencies) ? (raw.dependencies as Record<string, string>) : undefined,\n\n enabledByDefault: typeof raw.enabledByDefault === 'boolean' ? raw.enabledByDefault : undefined,\n\n providers: Array.isArray(raw.providers)\n ? raw.providers.filter((x): x is string => typeof x === 'string')\n : undefined,\n speechProviders: Array.isArray(raw.speechProviders)\n ? raw.speechProviders.filter((x): x is string => typeof x === 'string')\n : undefined,\n mediaUnderstandingProviders: Array.isArray(raw.mediaUnderstandingProviders)\n ? raw.mediaUnderstandingProviders.filter((x): x is string => typeof x === 'string')\n : undefined,\n providerAuthEnvVars: normalizeStringArrayMap(raw.providerAuthEnvVars),\n providerAuthChoices: normalizeProviderAuthChoices(raw.providerAuthChoices),\n modelSupport: normalizeModelSupport(raw.modelSupport),\n autoEnableWhenConfiguredProviders: Array.isArray(raw.autoEnableWhenConfiguredProviders)\n ? raw.autoEnableWhenConfiguredProviders.filter((x): x is string => typeof x === 'string')\n : undefined,\n\n channels: Array.isArray(raw.channels)\n ? raw.channels.filter((x): x is string => typeof x === 'string')\n : undefined,\n channelEnvVars: normalizeStringArrayMap(raw.channelEnvVars),\n channelContributions: normalizeChannelContributions(raw.channelContributions),\n\n activation: normalizeActivation(raw.activation),\n contracts: normalizeContracts(raw.contracts),\n setup: normalizeSetup(raw.setup),\n reload: normalizeReload(raw.reload),\n engines: normalizeEngines(raw.engines),\n commands: normalizeManifestCommands(raw.commands),\n ui: normalizeUiManifest(raw.ui),\n };\n}\n\nconst VALID_UI_PERMISSIONS = new Set<ExtensionUiPermission>([\n 'agent.send',\n 'agent.subscribe',\n 'session.read',\n 'session.write',\n 'config.read',\n 'config.write',\n 'storage',\n 'notification',\n 'clipboard',\n 'theme',\n 'workspace.read',\n 'workspace.write',\n]);\n\nexport function normalizeUiManifest(raw: unknown): ExtensionUiManifest | undefined {\n if (raw === undefined || raw === null) return undefined;\n if (!isRecord(raw)) return undefined;\n const main = typeof raw.main === 'string' && raw.main.length > 0 ? raw.main : undefined;\n const icon = typeof raw.icon === 'string' && raw.icon.length > 0 ? raw.icon : undefined;\n let permissions: ExtensionUiPermission[] | undefined;\n if (Array.isArray(raw.permissions)) {\n const p = raw.permissions.filter(\n (x): x is ExtensionUiPermission =>\n typeof x === 'string' && VALID_UI_PERMISSIONS.has(x as ExtensionUiPermission),\n );\n permissions = p.length ? p : undefined;\n }\n const contributions = normalizeUiContributions(raw.contributions);\n if (!main && !icon && !permissions && !contributions) return undefined;\n return {\n ...(main !== undefined ? { main } : {}),\n ...(icon !== undefined ? { icon } : {}),\n ...(permissions !== undefined ? { permissions } : {}),\n ...(contributions !== undefined ? { contributions } : {}),\n };\n}\n\nfunction normalizeUiContributions(raw: unknown): ExtensionUiContributions | undefined {\n if (!isRecord(raw)) return undefined;\n const sidebarPanels = normalizeSidebarPanels(raw.sidebarPanels);\n const settingsPanels = normalizeSettingsPanels(raw.settingsPanels);\n const chatWidgets = normalizeChatWidgets(raw.chatWidgets);\n const pages = normalizePages(raw.pages);\n const commands = normalizeCommands(raw.commands);\n const statusBarItems = normalizeStatusBarItems(raw.statusBarItems);\n const out: ExtensionUiContributions = {\n ...(sidebarPanels ? { sidebarPanels } : {}),\n ...(settingsPanels ? { settingsPanels } : {}),\n ...(chatWidgets ? { chatWidgets } : {}),\n ...(pages ? { pages } : {}),\n ...(commands ? { commands } : {}),\n ...(statusBarItems ? { statusBarItems } : {}),\n };\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction normalizeSidebarPanels(raw: unknown): SidebarPanelContribution[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const out: SidebarPanelContribution[] = [];\n for (const item of raw) {\n if (!isRecord(item)) continue;\n const id = item.id;\n const title = item.title;\n const entrypoint = item.entrypoint;\n if (typeof id !== 'string' || typeof title !== 'string' || typeof entrypoint !== 'string') {\n continue;\n }\n out.push({\n id,\n title,\n entrypoint,\n icon: typeof item.icon === 'string' ? item.icon : undefined,\n defaultVisible: typeof item.defaultVisible === 'boolean' ? item.defaultVisible : undefined,\n when: typeof item.when === 'string' && item.when.length > 0 ? item.when : undefined,\n });\n }\n return out.length ? out : undefined;\n}\n\nfunction normalizeSettingsPanels(raw: unknown): SettingsPanelContribution[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const out: SettingsPanelContribution[] = [];\n for (const item of raw) {\n if (!isRecord(item)) continue;\n const id = item.id;\n const title = item.title;\n const entrypoint = item.entrypoint;\n if (typeof id !== 'string' || typeof title !== 'string' || typeof entrypoint !== 'string') {\n continue;\n }\n out.push({\n id,\n title,\n entrypoint,\n order: typeof item.order === 'number' ? item.order : undefined,\n });\n }\n return out.length ? out : undefined;\n}\n\nfunction normalizeChatWidgetMatch(raw: unknown): ChatWidgetMatch | undefined {\n if (!isRecord(raw)) return undefined;\n const toolName = typeof raw.toolName === 'string' ? raw.toolName : undefined;\n const contentType = typeof raw.contentType === 'string' ? raw.contentType : undefined;\n let metadata: Record<string, unknown> | undefined;\n if (isRecord(raw.metadata)) {\n metadata = { ...raw.metadata };\n }\n if (!toolName && !contentType && !metadata) return undefined;\n return { toolName, contentType, metadata };\n}\n\nfunction normalizeChatWidgets(raw: unknown): ChatWidgetContribution[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const out: ChatWidgetContribution[] = [];\n for (const item of raw) {\n if (!isRecord(item)) continue;\n const id = item.id;\n const title = item.title;\n const entrypoint = item.entrypoint;\n if (typeof id !== 'string' || typeof title !== 'string' || typeof entrypoint !== 'string') {\n continue;\n }\n const match = normalizeChatWidgetMatch(item.match);\n if (!match) continue;\n out.push({\n id,\n title,\n entrypoint,\n match,\n maxHeight: typeof item.maxHeight === 'number' ? item.maxHeight : undefined,\n interactive: typeof item.interactive === 'boolean' ? item.interactive : undefined,\n });\n }\n return out.length ? out : undefined;\n}\n\nfunction normalizePages(raw: unknown): PageContribution[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const out: PageContribution[] = [];\n for (const item of raw) {\n if (!isRecord(item)) continue;\n const id = item.id;\n const title = item.title;\n const path = item.path;\n const entrypoint = item.entrypoint;\n if (\n typeof id !== 'string' ||\n typeof title !== 'string' ||\n typeof path !== 'string' ||\n typeof entrypoint !== 'string'\n ) {\n continue;\n }\n out.push({\n id,\n title,\n path,\n entrypoint,\n showInNav: typeof item.showInNav === 'boolean' ? item.showInNav : undefined,\n navIcon: typeof item.navIcon === 'string' ? item.navIcon : undefined,\n when: typeof item.when === 'string' && item.when.length > 0 ? item.when : undefined,\n });\n }\n return out.length ? out : undefined;\n}\n\nfunction normalizeCommands(raw: unknown): CommandContribution[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const out: CommandContribution[] = [];\n for (const item of raw) {\n if (!isRecord(item)) continue;\n const id = item.id;\n const title = item.title;\n if (typeof id !== 'string' || typeof title !== 'string') continue;\n out.push({\n id,\n title,\n shortcut: typeof item.shortcut === 'string' ? item.shortcut : undefined,\n opensPanel: typeof item.opensPanel === 'string' ? item.opensPanel : undefined,\n chatAlias:\n typeof item.chatAlias === 'string' && item.chatAlias.length > 0 ? item.chatAlias : undefined,\n when: typeof item.when === 'string' && item.when.length > 0 ? item.when : undefined,\n });\n }\n return out.length ? out : undefined;\n}\n\nfunction normalizeStatusBarItems(raw: unknown): StatusBarItemContribution[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const out: StatusBarItemContribution[] = [];\n for (const item of raw) {\n if (!isRecord(item)) continue;\n const id = item.id;\n const entrypoint = item.entrypoint;\n if (typeof id !== 'string' || typeof entrypoint !== 'string') continue;\n const position = item.position;\n out.push({\n id,\n entrypoint,\n position: position === 'left' || position === 'right' ? position : undefined,\n width: typeof item.width === 'number' ? item.width : undefined,\n when: typeof item.when === 'string' && item.when.length > 0 ? item.when : undefined,\n });\n }\n return out.length ? out : undefined;\n}\n\nfunction normalizeStringArrayMap(\n raw: unknown,\n): Record<string, string[]> | undefined {\n if (!isRecord(raw)) return undefined;\n const out: Record<string, string[]> = {};\n for (const [k, v] of Object.entries(raw)) {\n if (Array.isArray(v)) {\n const arr = v.filter((x): x is string => typeof x === 'string');\n if (arr.length) out[k] = arr;\n }\n }\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction normalizeProviderAuthChoices(raw: unknown): ProviderAuthChoice[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const out: ProviderAuthChoice[] = [];\n for (const item of raw) {\n if (!isRecord(item)) continue;\n const provider = item.provider;\n const method = item.method;\n const choiceId = item.choiceId;\n const choiceLabel = item.choiceLabel;\n if (\n typeof provider !== 'string' ||\n typeof choiceId !== 'string' ||\n typeof choiceLabel !== 'string' ||\n (method !== 'api-key' && method !== 'oauth' && method !== 'cli' && method !== 'env')\n ) {\n continue;\n }\n out.push({\n provider,\n method,\n choiceId,\n choiceLabel,\n choiceHint: typeof item.choiceHint === 'string' ? item.choiceHint : undefined,\n groupId: typeof item.groupId === 'string' ? item.groupId : undefined,\n groupLabel: typeof item.groupLabel === 'string' ? item.groupLabel : undefined,\n groupHint: typeof item.groupHint === 'string' ? item.groupHint : undefined,\n cliFlag: typeof item.cliFlag === 'string' ? item.cliFlag : undefined,\n cliOption: typeof item.cliOption === 'string' ? item.cliOption : undefined,\n cliDescription: typeof item.cliDescription === 'string' ? item.cliDescription : undefined,\n });\n }\n return out.length ? out : undefined;\n}\n\nfunction normalizeModelSupport(raw: unknown): ModelSupportDeclaration | undefined {\n if (!isRecord(raw)) return undefined;\n const modelPrefixes = Array.isArray(raw.modelPrefixes)\n ? raw.modelPrefixes.filter((x): x is string => typeof x === 'string')\n : undefined;\n const modelPatterns = Array.isArray(raw.modelPatterns)\n ? raw.modelPatterns.filter((x): x is string => typeof x === 'string')\n : undefined;\n if (!modelPrefixes?.length && !modelPatterns?.length) return undefined;\n return { modelPrefixes, modelPatterns };\n}\n\nfunction normalizeActivation(raw: unknown): ActivationDeclaration | undefined {\n if (!isRecord(raw)) return undefined;\n const onStartup = typeof raw.onStartup === 'boolean' ? raw.onStartup : undefined;\n const onProviders = Array.isArray(raw.onProviders)\n ? raw.onProviders.filter((x): x is string => typeof x === 'string')\n : undefined;\n const onCommands = Array.isArray(raw.onCommands)\n ? raw.onCommands.filter((x): x is string => typeof x === 'string')\n : undefined;\n const onChannels = Array.isArray(raw.onChannels)\n ? raw.onChannels.filter((x): x is string => typeof x === 'string')\n : undefined;\n const capRaw = raw.onCapabilities;\n const onCapabilities = Array.isArray(capRaw)\n ? capRaw.filter(\n (x): x is 'provider' | 'channel' | 'tool' | 'hook' =>\n x === 'provider' || x === 'channel' || x === 'tool' || x === 'hook',\n )\n : undefined;\n if (\n onStartup === undefined &&\n !onProviders?.length &&\n !onCommands?.length &&\n !onChannels?.length &&\n !onCapabilities?.length\n ) {\n return undefined;\n }\n return { onStartup, onProviders, onCommands, onChannels, onCapabilities };\n}\n\nfunction normalizeContracts(raw: unknown): ContractDeclaration | undefined {\n if (!isRecord(raw)) return undefined;\n const pick = (k: string) =>\n Array.isArray(raw[k]) ? raw[k].filter((x: unknown): x is string => typeof x === 'string') : undefined;\n const c: ContractDeclaration = {\n tools: pick('tools'),\n hooks: pick('hooks'),\n commands: pick('commands'),\n cliCommands: pick('cliCommands'),\n channels: pick('channels'),\n httpRoutes: pick('httpRoutes'),\n gatewayMethods: pick('gatewayMethods'),\n services: pick('services'),\n tui: pick('tui'),\n providers: pick('providers'),\n marketplaceAdapters: pick('marketplaceAdapters'),\n mediaUnderstandingProviders: pick('mediaUnderstandingProviders'),\n speechProviders: pick('speechProviders'),\n imageGenerationProviders: pick('imageGenerationProviders'),\n webSearchProviders: pick('webSearchProviders'),\n memoryProviders: pick('memoryProviders'),\n };\n return Object.values(c).some((value) => Array.isArray(value) && value.length > 0)\n ? c\n : undefined;\n}\n\nfunction normalizeSetup(raw: unknown): SetupDeclaration | undefined {\n if (!isRecord(raw)) return undefined;\n const requiresRuntime = typeof raw.requiresRuntime === 'boolean' ? raw.requiresRuntime : undefined;\n let providers: SetupDeclaration['providers'];\n if (Array.isArray(raw.providers)) {\n providers = [];\n for (const p of raw.providers) {\n if (!isRecord(p) || typeof p.id !== 'string') continue;\n providers.push({\n id: p.id,\n authMethods: Array.isArray(p.authMethods)\n ? p.authMethods.filter((x): x is string => typeof x === 'string')\n : undefined,\n envVars: Array.isArray(p.envVars)\n ? p.envVars.filter((x): x is string => typeof x === 'string')\n : undefined,\n });\n }\n if (providers.length === 0) providers = undefined;\n }\n if (!providers && requiresRuntime === undefined) return undefined;\n return { providers, requiresRuntime };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const PACKAGE_DEPENDENCY_SECTIONS: readonly ["dependencies", "devDependencies", "peerDependencies", "optionalDependencies"];
|
|
2
|
+
export interface PackageDependencyIssue {
|
|
3
|
+
section: (typeof PACKAGE_DEPENDENCY_SECTIONS)[number];
|
|
4
|
+
name: string;
|
|
5
|
+
version: string;
|
|
6
|
+
code: 'workspace_dependency' | 'host_sdk_runtime_dependency' | 'ui_sdk_runtime_dependency';
|
|
7
|
+
message: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function collectExtensionPackageDependencyIssues(pkg: Record<string, unknown>, options?: {
|
|
10
|
+
strictRuntimeSdkDeps?: boolean;
|
|
11
|
+
}): PackageDependencyIssue[];
|
|
12
|
+
export declare function hasWorkspaceProtocolDependencies(pkg: Record<string, unknown>): boolean;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
//#region src/extensions/package-contract.ts
|
|
2
|
+
const PACKAGE_DEPENDENCY_SECTIONS = [
|
|
3
|
+
"dependencies",
|
|
4
|
+
"devDependencies",
|
|
5
|
+
"peerDependencies",
|
|
6
|
+
"optionalDependencies"
|
|
7
|
+
];
|
|
8
|
+
function isRecord(x) {
|
|
9
|
+
return typeof x === "object" && x !== null && !Array.isArray(x);
|
|
10
|
+
}
|
|
11
|
+
function dependencyVersion(pkg, section, name) {
|
|
12
|
+
const deps = pkg[section];
|
|
13
|
+
if (!isRecord(deps)) return void 0;
|
|
14
|
+
const value = deps[name];
|
|
15
|
+
return typeof value === "string" ? value : void 0;
|
|
16
|
+
}
|
|
17
|
+
function collectExtensionPackageDependencyIssues(pkg, options = {}) {
|
|
18
|
+
const issues = [];
|
|
19
|
+
for (const section of PACKAGE_DEPENDENCY_SECTIONS) {
|
|
20
|
+
const deps = pkg[section];
|
|
21
|
+
if (!isRecord(deps)) continue;
|
|
22
|
+
for (const [name, rawVersion] of Object.entries(deps)) {
|
|
23
|
+
if (typeof rawVersion !== "string") continue;
|
|
24
|
+
if (rawVersion.startsWith("workspace:")) issues.push({
|
|
25
|
+
section,
|
|
26
|
+
name,
|
|
27
|
+
version: rawVersion,
|
|
28
|
+
code: "workspace_dependency",
|
|
29
|
+
message: `${section}.${name} uses ${rawVersion}; published extensions must not depend on workspace protocols.`
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (options.strictRuntimeSdkDeps) {
|
|
34
|
+
const hostRuntime = dependencyVersion(pkg, "dependencies", "@xopcai/xopc");
|
|
35
|
+
if (hostRuntime) issues.push({
|
|
36
|
+
section: "dependencies",
|
|
37
|
+
name: "@xopcai/xopc",
|
|
38
|
+
version: hostRuntime,
|
|
39
|
+
code: "host_sdk_runtime_dependency",
|
|
40
|
+
message: "@xopcai/xopc must not be a runtime dependency of an extension package; use devDependencies for types and optional peerDependencies for host compatibility."
|
|
41
|
+
});
|
|
42
|
+
const uiRuntime = dependencyVersion(pkg, "dependencies", "@xopcai/extension-ui-sdk");
|
|
43
|
+
if (uiRuntime) issues.push({
|
|
44
|
+
section: "dependencies",
|
|
45
|
+
name: "@xopcai/extension-ui-sdk",
|
|
46
|
+
version: uiRuntime,
|
|
47
|
+
code: "ui_sdk_runtime_dependency",
|
|
48
|
+
message: "@xopcai/extension-ui-sdk should be bundled into static UI assets and kept in devDependencies, not runtime dependencies."
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return issues;
|
|
52
|
+
}
|
|
53
|
+
function hasWorkspaceProtocolDependencies(pkg) {
|
|
54
|
+
return collectExtensionPackageDependencyIssues(pkg).some((x) => x.code === "workspace_dependency");
|
|
55
|
+
}
|
|
56
|
+
//#endregion
|
|
57
|
+
export { PACKAGE_DEPENDENCY_SECTIONS, collectExtensionPackageDependencyIssues, hasWorkspaceProtocolDependencies };
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=package-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-contract.js","names":[],"sources":["../../../src/extensions/package-contract.ts"],"sourcesContent":["export const PACKAGE_DEPENDENCY_SECTIONS = [\n 'dependencies',\n 'devDependencies',\n 'peerDependencies',\n 'optionalDependencies',\n] as const;\n\nexport interface PackageDependencyIssue {\n section: (typeof PACKAGE_DEPENDENCY_SECTIONS)[number];\n name: string;\n version: string;\n code: 'workspace_dependency' | 'host_sdk_runtime_dependency' | 'ui_sdk_runtime_dependency';\n message: string;\n}\n\nfunction isRecord(x: unknown): x is Record<string, unknown> {\n return typeof x === 'object' && x !== null && !Array.isArray(x);\n}\n\nfunction dependencyVersion(pkg: Record<string, unknown>, section: string, name: string): string | undefined {\n const deps = pkg[section];\n if (!isRecord(deps)) return undefined;\n const value = deps[name];\n return typeof value === 'string' ? value : undefined;\n}\n\nexport function collectExtensionPackageDependencyIssues(\n pkg: Record<string, unknown>,\n options: { strictRuntimeSdkDeps?: boolean } = {},\n): PackageDependencyIssue[] {\n const issues: PackageDependencyIssue[] = [];\n for (const section of PACKAGE_DEPENDENCY_SECTIONS) {\n const deps = pkg[section];\n if (!isRecord(deps)) continue;\n for (const [name, rawVersion] of Object.entries(deps)) {\n if (typeof rawVersion !== 'string') continue;\n if (rawVersion.startsWith('workspace:')) {\n issues.push({\n section,\n name,\n version: rawVersion,\n code: 'workspace_dependency',\n message: `${section}.${name} uses ${rawVersion}; published extensions must not depend on workspace protocols.`,\n });\n }\n }\n }\n\n if (options.strictRuntimeSdkDeps) {\n const hostRuntime = dependencyVersion(pkg, 'dependencies', '@xopcai/xopc');\n if (hostRuntime) {\n issues.push({\n section: 'dependencies',\n name: '@xopcai/xopc',\n version: hostRuntime,\n code: 'host_sdk_runtime_dependency',\n message:\n '@xopcai/xopc must not be a runtime dependency of an extension package; use devDependencies for types and optional peerDependencies for host compatibility.',\n });\n }\n const uiRuntime = dependencyVersion(pkg, 'dependencies', '@xopcai/extension-ui-sdk');\n if (uiRuntime) {\n issues.push({\n section: 'dependencies',\n name: '@xopcai/extension-ui-sdk',\n version: uiRuntime,\n code: 'ui_sdk_runtime_dependency',\n message:\n '@xopcai/extension-ui-sdk should be bundled into static UI assets and kept in devDependencies, not runtime dependencies.',\n });\n }\n }\n\n return issues;\n}\n\nexport function hasWorkspaceProtocolDependencies(pkg: Record<string, unknown>): boolean {\n return collectExtensionPackageDependencyIssues(pkg).some((x) => x.code === 'workspace_dependency');\n}\n"],"mappings":";AAAA,MAAa,8BAA8B;CACzC;CACA;CACA;CACA;CACD;AAUD,SAAS,SAAS,GAA0C;AAC1D,QAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,EAAE;;AAGjE,SAAS,kBAAkB,KAA8B,SAAiB,MAAkC;CAC1G,MAAM,OAAO,IAAI;AACjB,KAAI,CAAC,SAAS,KAAK,CAAE,QAAO,KAAA;CAC5B,MAAM,QAAQ,KAAK;AACnB,QAAO,OAAO,UAAU,WAAW,QAAQ,KAAA;;AAG7C,SAAgB,wCACd,KACA,UAA8C,EAAE,EACtB;CAC1B,MAAM,SAAmC,EAAE;AAC3C,MAAK,MAAM,WAAW,6BAA6B;EACjD,MAAM,OAAO,IAAI;AACjB,MAAI,CAAC,SAAS,KAAK,CAAE;AACrB,OAAK,MAAM,CAAC,MAAM,eAAe,OAAO,QAAQ,KAAK,EAAE;AACrD,OAAI,OAAO,eAAe,SAAU;AACpC,OAAI,WAAW,WAAW,aAAa,CACrC,QAAO,KAAK;IACV;IACA;IACA,SAAS;IACT,MAAM;IACN,SAAS,GAAG,QAAQ,GAAG,KAAK,QAAQ,WAAW;IAChD,CAAC;;;AAKR,KAAI,QAAQ,sBAAsB;EAChC,MAAM,cAAc,kBAAkB,KAAK,gBAAgB,eAAe;AAC1E,MAAI,YACF,QAAO,KAAK;GACV,SAAS;GACT,MAAM;GACN,SAAS;GACT,MAAM;GACN,SACE;GACH,CAAC;EAEJ,MAAM,YAAY,kBAAkB,KAAK,gBAAgB,2BAA2B;AACpF,MAAI,UACF,QAAO,KAAK;GACV,SAAS;GACT,MAAM;GACN,SAAS;GACT,MAAM;GACN,SACE;GACH,CAAC;;AAIN,QAAO;;AAGT,SAAgB,iCAAiC,KAAuC;AACtF,QAAO,wCAAwC,IAAI,CAAC,MAAM,MAAM,EAAE,SAAS,uBAAuB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Core extension types — prefer
|
|
2
|
+
* Core extension types — prefer `@xopcai/xopc/extension-sdk/core` over the full SDK barrel when tree-shaking.
|
|
3
3
|
*/
|
|
4
4
|
export type { ExtensionDefinition, ExtensionModule, ExtensionKind, ExtensionApi, ExtensionLogger, ExtensionRegistry, ExtensionRuntime, ExtensionCliRegistration, } from '../types/core.js';
|
|
5
5
|
export type { ExtensionRecord, ResolvedExtensionConfig } from '../types/loader.js';
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Import types and utilities from this module:
|
|
6
6
|
*
|
|
7
7
|
* @example
|
|
8
|
-
* import type { ExtensionApi, ExtensionDefinition } from 'xopc/extension-sdk';
|
|
8
|
+
* import type { ExtensionApi, ExtensionDefinition } from '@xopcai/xopc/extension-sdk';
|
|
9
9
|
*/
|
|
10
10
|
export type { ExtensionDefinition, ExtensionModule, ExtensionKind, ExtensionApi, ExtensionLogger, ExtensionManifest, ExtensionRecord, ExtensionRegistry, ResolvedExtensionConfig, ExtensionRuntime, ExtensionCliRegistration, } from '../types/index.js';
|
|
11
11
|
export type { AgentTool, AgentToolResult, AgentToolUpdateCallback, ToolExecutionStartEvent, ToolExecutionUpdateEvent, ToolExecutionEndEvent, } from '../types/index.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/extensions/sdk/index.ts"],"sourcesContent":["/**\n * xopc Extension SDK\n * \n * Official SDK for developing xopc extensions.\n * Import types and utilities from this module:\n * \n * @example\n * import type { ExtensionApi, ExtensionDefinition } from 'xopc/extension-sdk';\n */\n\n// ============================================================================\n// Core extension types\n// ============================================================================\n\nexport type {\n ExtensionDefinition,\n ExtensionModule,\n ExtensionKind,\n ExtensionApi,\n ExtensionLogger,\n ExtensionManifest,\n ExtensionRecord,\n ExtensionRegistry,\n ResolvedExtensionConfig,\n ExtensionRuntime,\n ExtensionCliRegistration,\n} from '../types/index.js';\n\n// ============================================================================\n// Tools (re-exported from @earendil-works/pi-agent-core)\n// ============================================================================\n\nexport type {\n AgentTool,\n AgentToolResult,\n AgentToolUpdateCallback,\n ToolExecutionStartEvent,\n ToolExecutionUpdateEvent,\n ToolExecutionEndEvent,\n} from '../types/index.js';\n\n// ============================================================================\n// Hooks ( Strongly Typed)\n// ============================================================================\n\nexport type {\n ExtensionHookEvent,\n ExtensionHookHandler,\n HookOptions,\n HookAgentContext,\n AgentMessage,\n ContextEvent,\n ContextResult,\n InputEvent,\n InputResult,\n TurnEvent,\n TurnResult,\n // New hook types\n HookHandlerMap,\n HookExecutionMode,\n // Note: HOOK_EXECUTION_MODES is exported as value below\n // LLM observation hooks\n HookBeforeModelResolveEvent,\n HookBeforeModelResolveResult,\n HookBeforePromptBuildEvent,\n HookBeforePromptBuildResult,\n HookLlmInputEvent,\n HookLlmOutputEvent,\n // Inbound claim\n HookInboundClaimEvent,\n HookInboundClaimResult,\n // Reset hook\n HookBeforeResetEvent,\n HookBeforeResetResult,\n // Message write hook\n HookBeforeMessageWriteEvent,\n HookBeforeMessageWriteResult,\n // Turn hooks\n HookTurnStartEvent,\n HookTurnEndEvent,\n // Tool execution hooks\n HookToolExecutionStartEvent,\n HookToolExecutionUpdateEvent,\n HookToolExecutionEndEvent,\n // Existing context types\n HookContext,\n BeforeAgentStartContext,\n BeforeAgentStartResult,\n AgentEndContext,\n WebchatTurnCompleteEvent,\n BeforeCompactionContext,\n AfterCompactionContext,\n MessageReceivedContext,\n MessageSendingContext,\n MessageSendingResult,\n MessageSentContext,\n BeforeToolCallContext,\n BeforeToolCallResult,\n AfterToolCallContext,\n SessionStartContext,\n SessionEndContext,\n GatewayStartContext,\n GatewayStopContext,\n} from '../types/index.js';\n\n// ============================================================================\n// Typed Event Bus\n// ============================================================================\n\nexport type {\n EventMap,\n RequestMap,\n EventHandler,\n EventHandlerMeta,\n RequestHandler,\n RequestHandlerMeta,\n WildcardEventHandler,\n WildcardHandlerMeta,\n TypedEventBusOptions,\n RequestOptions,\n} from '../types/index.js';\n\n// ============================================================================\n// Provider Types\n// ============================================================================\n\nexport type {\n ProviderPlugin,\n ProviderModelDefinition,\n ProviderCapabilities,\n ProviderStreamParams,\n ProviderStreamChunk,\n ProviderCompleteParams,\n ProviderResponse,\n ProviderRegistry,\n BUILTIN_PROVIDERS,\n BuiltinProviderId,\n} from '../types/index.js';\n\n// ============================================================================\n// Advanced Features\n// ============================================================================\n\nexport type {\n ProviderConfig,\n ModelConfig,\n OAuthConfig,\n OAuthCallbacks,\n OAuthCredentials,\n FlagConfig,\n FlagValue,\n ShortcutConfig,\n ShortcutHandler,\n} from '../types/index.js';\n\nexport type {\n TuiExtensionHostContract,\n TuiExtensionRegistrar,\n TuiAutocompleteProvider,\n TuiAutocompleteSuggestion,\n TuiToolRenderer,\n TuiToolRenderContext,\n TuiSlashCommandHandler,\n TuiNotifyLevel,\n} from '../types/index.js';\n\n// ============================================================================\n// Security Types\n// ============================================================================\n\nexport type {\n SafetyCheckResult,\n SecurityConfig,\n ExtensionSourceOrigin,\n ProvenanceInfo,\n} from '../security.js';\n\n// ============================================================================\n// Slot Types\n// ============================================================================\n\nexport type {\n SlotKey,\n SlotClaim,\n SlotConfig,\n} from '../slots.js';\n\n// ============================================================================\n// Diagnostics Types\n// ============================================================================\n\nexport type {\n DiagnosticLevel,\n ExtensionDiagnostic,\n ExtensionLoaderCache,\n} from '../diagnostics.js';\n\n// ============================================================================\n// Channels (ChannelPlugin registry)\n// ============================================================================\n\nexport type {\n ChannelPlugin,\n ChannelPluginInitOptions,\n ChannelPluginStartOptions,\n} from '../../channels/plugin-types.js';\n\n// ============================================================================\n// HTTP\n// ============================================================================\n\nexport type {\n HttpRequestHandler,\n HttpRequest,\n HttpResponse,\n} from '../types/index.js';\n\n// ============================================================================\n// Commands\n// ============================================================================\n\nexport type {\n ExtensionCommand,\n ExtensionCommandHandler,\n ExtensionCommandContext,\n ExtensionCommandResult,\n ExtensionReloadHandler,\n ExtensionReloadResult,\n ExtensionReloadRegistration,\n} from '../types/index.js';\n\n// ============================================================================\n// Services\n// ============================================================================\n\nexport type {\n ExtensionService,\n} from '../types/index.js';\n\n// ============================================================================\n// Gateway\n// ============================================================================\n\nexport type {\n GatewayMethodHandler,\n} from '../types/index.js';\n\n// ============================================================================\n// Export Classes\n// ============================================================================\n\nexport { TypedEventBus } from '../typed-event-bus.js';\nexport { ExtensionRegistryImpl } from '../loader.js';\nexport { ProviderPluginRegistry, getProviderRegistry } from '../../providers/plugin-registry.js';\nexport { SlotRegistry, getSlotRegistry, registerSlotType } from '../slots.js';\nexport { HOOK_EXECUTION_MODES } from '../types/hooks.js';\n\nexport { defineChannelPluginEntry } from './channel-entry.js';\nexport { registerExtensionCliProgram } from './channel-helpers.js';\n\n// ============================================================================\n// Export Hook Runner and Utilities\n// ============================================================================\n\nexport { \n ExtensionHookRunner, \n createHookContext, \n isHookEvent \n} from '../hooks.js';\n\n// ============================================================================\n// Security Utilities\n// ============================================================================\n\nexport {\n checkExtensionPathSafety,\n checkExtensionDirSafety,\n isExtensionAllowed,\n provenanceTracker,\n logSecurityIssue,\n DEFAULT_SECURITY_CONFIG,\n} from '../security.js';\n\n// ============================================================================\n// Diagnostics Utilities\n// ============================================================================\n\nexport {\n getExtensionCache,\n getExtensionDiagnostics,\n ExtensionLoaderCacheImpl,\n ExtensionDiagnostics,\n} from '../diagnostics.js';\n\n// ============================================================================\n// Config\n// ============================================================================\n\nexport type { Config } from '../../config/config-surface.js';\n\n//
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/extensions/sdk/index.ts"],"sourcesContent":["/**\n * xopc Extension SDK\n * \n * Official SDK for developing xopc extensions.\n * Import types and utilities from this module:\n * \n * @example\n * import type { ExtensionApi, ExtensionDefinition } from '@xopcai/xopc/extension-sdk';\n */\n\n// ============================================================================\n// Core extension types\n// ============================================================================\n\nexport type {\n ExtensionDefinition,\n ExtensionModule,\n ExtensionKind,\n ExtensionApi,\n ExtensionLogger,\n ExtensionManifest,\n ExtensionRecord,\n ExtensionRegistry,\n ResolvedExtensionConfig,\n ExtensionRuntime,\n ExtensionCliRegistration,\n} from '../types/index.js';\n\n// ============================================================================\n// Tools (re-exported from @earendil-works/pi-agent-core)\n// ============================================================================\n\nexport type {\n AgentTool,\n AgentToolResult,\n AgentToolUpdateCallback,\n ToolExecutionStartEvent,\n ToolExecutionUpdateEvent,\n ToolExecutionEndEvent,\n} from '../types/index.js';\n\n// ============================================================================\n// Hooks ( Strongly Typed)\n// ============================================================================\n\nexport type {\n ExtensionHookEvent,\n ExtensionHookHandler,\n HookOptions,\n HookAgentContext,\n AgentMessage,\n ContextEvent,\n ContextResult,\n InputEvent,\n InputResult,\n TurnEvent,\n TurnResult,\n // New hook types\n HookHandlerMap,\n HookExecutionMode,\n // Note: HOOK_EXECUTION_MODES is exported as value below\n // LLM observation hooks\n HookBeforeModelResolveEvent,\n HookBeforeModelResolveResult,\n HookBeforePromptBuildEvent,\n HookBeforePromptBuildResult,\n HookLlmInputEvent,\n HookLlmOutputEvent,\n // Inbound claim\n HookInboundClaimEvent,\n HookInboundClaimResult,\n // Reset hook\n HookBeforeResetEvent,\n HookBeforeResetResult,\n // Message write hook\n HookBeforeMessageWriteEvent,\n HookBeforeMessageWriteResult,\n // Turn hooks\n HookTurnStartEvent,\n HookTurnEndEvent,\n // Tool execution hooks\n HookToolExecutionStartEvent,\n HookToolExecutionUpdateEvent,\n HookToolExecutionEndEvent,\n // Existing context types\n HookContext,\n BeforeAgentStartContext,\n BeforeAgentStartResult,\n AgentEndContext,\n WebchatTurnCompleteEvent,\n BeforeCompactionContext,\n AfterCompactionContext,\n MessageReceivedContext,\n MessageSendingContext,\n MessageSendingResult,\n MessageSentContext,\n BeforeToolCallContext,\n BeforeToolCallResult,\n AfterToolCallContext,\n SessionStartContext,\n SessionEndContext,\n GatewayStartContext,\n GatewayStopContext,\n} from '../types/index.js';\n\n// ============================================================================\n// Typed Event Bus\n// ============================================================================\n\nexport type {\n EventMap,\n RequestMap,\n EventHandler,\n EventHandlerMeta,\n RequestHandler,\n RequestHandlerMeta,\n WildcardEventHandler,\n WildcardHandlerMeta,\n TypedEventBusOptions,\n RequestOptions,\n} from '../types/index.js';\n\n// ============================================================================\n// Provider Types\n// ============================================================================\n\nexport type {\n ProviderPlugin,\n ProviderModelDefinition,\n ProviderCapabilities,\n ProviderStreamParams,\n ProviderStreamChunk,\n ProviderCompleteParams,\n ProviderResponse,\n ProviderRegistry,\n BUILTIN_PROVIDERS,\n BuiltinProviderId,\n} from '../types/index.js';\n\n// ============================================================================\n// Advanced Features\n// ============================================================================\n\nexport type {\n ProviderConfig,\n ModelConfig,\n OAuthConfig,\n OAuthCallbacks,\n OAuthCredentials,\n FlagConfig,\n FlagValue,\n ShortcutConfig,\n ShortcutHandler,\n} from '../types/index.js';\n\nexport type {\n TuiExtensionHostContract,\n TuiExtensionRegistrar,\n TuiAutocompleteProvider,\n TuiAutocompleteSuggestion,\n TuiToolRenderer,\n TuiToolRenderContext,\n TuiSlashCommandHandler,\n TuiNotifyLevel,\n} from '../types/index.js';\n\n// ============================================================================\n// Security Types\n// ============================================================================\n\nexport type {\n SafetyCheckResult,\n SecurityConfig,\n ExtensionSourceOrigin,\n ProvenanceInfo,\n} from '../security.js';\n\n// ============================================================================\n// Slot Types\n// ============================================================================\n\nexport type {\n SlotKey,\n SlotClaim,\n SlotConfig,\n} from '../slots.js';\n\n// ============================================================================\n// Diagnostics Types\n// ============================================================================\n\nexport type {\n DiagnosticLevel,\n ExtensionDiagnostic,\n ExtensionLoaderCache,\n} from '../diagnostics.js';\n\n// ============================================================================\n// Channels (ChannelPlugin registry)\n// ============================================================================\n\nexport type {\n ChannelPlugin,\n ChannelPluginInitOptions,\n ChannelPluginStartOptions,\n} from '../../channels/plugin-types.js';\n\n// ============================================================================\n// HTTP\n// ============================================================================\n\nexport type {\n HttpRequestHandler,\n HttpRequest,\n HttpResponse,\n} from '../types/index.js';\n\n// ============================================================================\n// Commands\n// ============================================================================\n\nexport type {\n ExtensionCommand,\n ExtensionCommandHandler,\n ExtensionCommandContext,\n ExtensionCommandResult,\n ExtensionReloadHandler,\n ExtensionReloadResult,\n ExtensionReloadRegistration,\n} from '../types/index.js';\n\n// ============================================================================\n// Services\n// ============================================================================\n\nexport type {\n ExtensionService,\n} from '../types/index.js';\n\n// ============================================================================\n// Gateway\n// ============================================================================\n\nexport type {\n GatewayMethodHandler,\n} from '../types/index.js';\n\n// ============================================================================\n// Export Classes\n// ============================================================================\n\nexport { TypedEventBus } from '../typed-event-bus.js';\nexport { ExtensionRegistryImpl } from '../loader.js';\nexport { ProviderPluginRegistry, getProviderRegistry } from '../../providers/plugin-registry.js';\nexport { SlotRegistry, getSlotRegistry, registerSlotType } from '../slots.js';\nexport { HOOK_EXECUTION_MODES } from '../types/hooks.js';\n\nexport { defineChannelPluginEntry } from './channel-entry.js';\nexport { registerExtensionCliProgram } from './channel-helpers.js';\n\n// ============================================================================\n// Export Hook Runner and Utilities\n// ============================================================================\n\nexport { \n ExtensionHookRunner, \n createHookContext, \n isHookEvent \n} from '../hooks.js';\n\n// ============================================================================\n// Security Utilities\n// ============================================================================\n\nexport {\n checkExtensionPathSafety,\n checkExtensionDirSafety,\n isExtensionAllowed,\n provenanceTracker,\n logSecurityIssue,\n DEFAULT_SECURITY_CONFIG,\n} from '../security.js';\n\n// ============================================================================\n// Diagnostics Utilities\n// ============================================================================\n\nexport {\n getExtensionCache,\n getExtensionDiagnostics,\n ExtensionLoaderCacheImpl,\n ExtensionDiagnostics,\n} from '../diagnostics.js';\n\n// ============================================================================\n// Config\n// ============================================================================\n\nexport type { Config } from '../../config/config-surface.js';\n\n// Public subpath barrels under `@xopcai/xopc/extension-sdk/<name>`.\nexport { lazyModule, lazyFunction } from './lazy.js';\n\nexport { createMockExtensionApi, createTestGateway } from './testing.js';\nexport type {\n MockExtensionApi,\n MockExtensionApiOptions,\n TestGateway,\n} from './testing.js';\n"],"mappings":";;;;;;;;;;;;;;sBA6PiG"}
|
|
@@ -6,6 +6,10 @@ import type { ExtensionKind } from './core.js';
|
|
|
6
6
|
export interface EnginesDeclaration {
|
|
7
7
|
/** Semver range string for the running xopc CLI / gateway, e.g. `">=0.0.20"`. */
|
|
8
8
|
xopc?: string;
|
|
9
|
+
/** Stable backend extension SDK API range, independent from the host package version. */
|
|
10
|
+
extensionApi?: string;
|
|
11
|
+
/** Stable iframe UI SDK API range, independent from the host package version. */
|
|
12
|
+
extensionUiApi?: string;
|
|
9
13
|
}
|
|
10
14
|
export interface ExtensionManifest {
|
|
11
15
|
id: string;
|
|
@@ -222,6 +226,17 @@ export interface ActivationDeclaration {
|
|
|
222
226
|
onCapabilities?: Array<'provider' | 'channel' | 'tool' | 'hook'>;
|
|
223
227
|
}
|
|
224
228
|
export interface ContractDeclaration {
|
|
229
|
+
tools?: string[];
|
|
230
|
+
hooks?: string[];
|
|
231
|
+
commands?: string[];
|
|
232
|
+
cliCommands?: string[];
|
|
233
|
+
channels?: string[];
|
|
234
|
+
httpRoutes?: string[];
|
|
235
|
+
gatewayMethods?: string[];
|
|
236
|
+
services?: string[];
|
|
237
|
+
tui?: string[];
|
|
238
|
+
providers?: string[];
|
|
239
|
+
marketplaceAdapters?: string[];
|
|
225
240
|
mediaUnderstandingProviders?: string[];
|
|
226
241
|
speechProviders?: string[];
|
|
227
242
|
imageGenerationProviders?: string[];
|
|
@@ -6,8 +6,8 @@ import { getExtensionLockfileManager } from "./lockfile.js";
|
|
|
6
6
|
import { installExtensionFromStoreZip, installFromNpm } from "./install.js";
|
|
7
7
|
import { findExtension } from "./marketplace.js";
|
|
8
8
|
import { downloadExtensionStoreZipBuffer, resolveExtensionZipDownloadUrl, resolveExtensionsStoreBaseUrl } from "../agent/skills/marketplace/adapters/store/store-api-client.js";
|
|
9
|
-
import { existsSync, readFileSync, readdirSync, rmSync } from "node:fs";
|
|
10
9
|
import { join } from "node:path";
|
|
10
|
+
import { existsSync, readFileSync, readdirSync, rmSync } from "node:fs";
|
|
11
11
|
import semver from "semver";
|
|
12
12
|
//#region src/extensions/update.ts
|
|
13
13
|
/**
|
|
@@ -82,14 +82,6 @@ export declare function prepareCreateAgent(cfg: Config, body: CreateAgentBody):
|
|
|
82
82
|
agentId: string;
|
|
83
83
|
workspace: string;
|
|
84
84
|
}>;
|
|
85
|
-
export type PreparedBatchCreateAgent = {
|
|
86
|
-
agentId: string;
|
|
87
|
-
profileFiles?: Record<string, string>;
|
|
88
|
-
};
|
|
89
|
-
export declare function prepareCreateAgentsBatch(cfg: Config, bodies: CreateAgentBody[]): AgentAdminResult<{
|
|
90
|
-
nextConfig: Config;
|
|
91
|
-
created: PreparedBatchCreateAgent[];
|
|
92
|
-
}>;
|
|
93
85
|
export declare function finalizeCreateAgentDirs(cfg: Config, agentId: string, opts?: {
|
|
94
86
|
profileFiles?: Record<string, string>;
|
|
95
87
|
cloneFrom?: string;
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { DEFAULT_AGENT_ID, init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentDir, resolveAgentProfileDir, resolveAgentWorkspaceDir, resolveDefaultAgentId, resolveUserPath, validateAgentIdForNewAgent } from "../agent/agent-scope.js";
|
|
2
|
-
import { WORKSPACE_FILES, init_paths } from "../config/paths.js";
|
|
3
2
|
import { resolveEffectiveAgentProfile } from "../config/agent-profile.js";
|
|
3
|
+
import { WORKSPACE_FILES, init_paths } from "../config/paths.js";
|
|
4
4
|
import { AGENT_PROFILE_MARKDOWN_SYSTEM_FILES } from "../agent/context/workspace.js";
|
|
5
5
|
import { isPathUnderWorkspace, resolveWorkspaceSafePath } from "./workspace-editor-path.js";
|
|
6
6
|
import { applyAgentConfig, findAgentEntryIndex, pruneAgentConfig, removeAgentDirsFromDisk } from "../commands/agents.config.js";
|
|
7
7
|
import { resolveEffectiveTypedModels } from "../config/agent-typed-models.js";
|
|
8
8
|
import { GATEWAY_BUILTIN_TOOL_IDS } from "./agent-builtin-tools.js";
|
|
9
9
|
import { seedAgentProfileMarkdownFiles } from "../agent/context/workspace-seed.js";
|
|
10
|
-
import { cp, mkdir, readFile, readdir, realpath, stat, unlink, writeFile } from "node:fs/promises";
|
|
11
10
|
import { join, resolve } from "node:path";
|
|
11
|
+
import { cp, mkdir, readFile, readdir, realpath, stat, unlink, writeFile } from "node:fs/promises";
|
|
12
12
|
//#region src/gateway/agents-admin.ts
|
|
13
13
|
/**
|
|
14
14
|
* Gateway REST helpers for multi-agent management.
|
|
@@ -204,31 +204,6 @@ function prepareCreateAgent(cfg, body) {
|
|
|
204
204
|
}
|
|
205
205
|
};
|
|
206
206
|
}
|
|
207
|
-
function prepareCreateAgentsBatch(cfg, bodies) {
|
|
208
|
-
if (!Array.isArray(bodies) || bodies.length === 0) return {
|
|
209
|
-
ok: false,
|
|
210
|
-
error: "agents must be a non-empty array",
|
|
211
|
-
status: 400
|
|
212
|
-
};
|
|
213
|
-
let next = cfg;
|
|
214
|
-
const created = [];
|
|
215
|
-
for (const body of bodies) {
|
|
216
|
-
const prep = prepareCreateAgent(next, body);
|
|
217
|
-
if (prep.ok === false) return prep;
|
|
218
|
-
next = prep.data.nextConfig;
|
|
219
|
-
created.push({
|
|
220
|
-
agentId: prep.data.agentId,
|
|
221
|
-
...body.profileFiles !== void 0 ? { profileFiles: body.profileFiles } : {}
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
return {
|
|
225
|
-
ok: true,
|
|
226
|
-
data: {
|
|
227
|
-
nextConfig: next,
|
|
228
|
-
created
|
|
229
|
-
}
|
|
230
|
-
};
|
|
231
|
-
}
|
|
232
207
|
async function finalizeCreateAgentDirs(cfg, agentId, opts) {
|
|
233
208
|
const wsPath = resolveAgentWorkspaceDir(cfg, agentId);
|
|
234
209
|
const profilePath = resolveAgentProfileDir(cfg, agentId);
|
|
@@ -658,6 +633,6 @@ async function deleteAgentAvatarFile(cfg, agentId) {
|
|
|
658
633
|
};
|
|
659
634
|
}
|
|
660
635
|
//#endregion
|
|
661
|
-
export { deleteAgentAvatarFile, extractAvatarFromIdentityMarkdown, finalizeCreateAgentDirs, listAgentProfileFiles, listGatewayAgents, parseIdentityMarkdown, prepareCreateAgent,
|
|
636
|
+
export { deleteAgentAvatarFile, extractAvatarFromIdentityMarkdown, finalizeCreateAgentDirs, listAgentProfileFiles, listGatewayAgents, parseIdentityMarkdown, prepareCreateAgent, prepareDeleteAgent, prepareUpdateAgent, readAgentAvatarFile, readAgentProfileFile, runAfterDeletePurge, writeAgentAvatarFromBase64, writeAgentProfileFile };
|
|
662
637
|
|
|
663
638
|
//# sourceMappingURL=agents-admin.js.map
|