@xopcai/xopc 0.0.106 → 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/outbound/media-load.js +1 -1
- package/dist/extensions/feishu/src/workflow-progress.js +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/streaming-adapter.js +1 -1
- package/dist/extensions/telegram/src/inbound-processor.js +1 -1
- package/dist/extensions/telegram/src/plugin.js +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.js +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/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.js +1 -1
- package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js +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-OM9qGfm5.js → dist-CZh0c-s8.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-D-WHrr_w.js → extension-debug-page-DyJQR0SR.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CCgjSoKn.js → extension-page-CDTuUr9B.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-BJH5a-Gn.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-CVyP6pFj.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-R6Vv_Ja6.js → logs-page-B6js8Bfi.js} +2 -2
- package/dist/gateway/static/root/assets/{note-detail-page-BUDarLhh.js → note-detail-page-DFzAXR35.js} +4 -4
- package/dist/gateway/static/root/assets/{note-time-Cc2-T21g.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-CrlOmEZt.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-BBAQxxew.js → settings-advanced-gate-BCvObK1y.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-DjPD-ErC.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-BjvPht3V.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-D4sqR0yX.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-materialize.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
- package/dist/src/agent/mcp/mcp-transport-config.js +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/runtime.js +49 -15
- package/dist/src/agent/workflow/runtime.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/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/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 +1 -1
- 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/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 +4 -2
- package/dist/gateway/static/root/assets/agents-3eP0vqFO.js +0 -396
- package/dist/gateway/static/root/assets/apps-page-CZ2ZKrko.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-BbETa93K.js +0 -1
- package/dist/gateway/static/root/assets/cron-page-DCtUkHMu.js +0 -1
- package/dist/gateway/static/root/assets/index-BPYKW7FB.css +0 -1
- package/dist/gateway/static/root/assets/index-CEZxETzw.js +0 -4845
- package/dist/gateway/static/root/assets/notes-page-EAHl16bq.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-Ce_xuuSB.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-KhQ9QgH0.js +0 -3
- package/dist/gateway/static/root/assets/skills-page-C0laq7l1.js +0 -2
- package/dist/gateway/static/root/assets/url-DPEStU4M.js +0 -3
- package/dist/gateway/static/root/assets/voice-api-key-field-DeGckWkl.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-DFjM95g5.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,13 +1,27 @@
|
|
|
1
|
+
import { PACKAGE_VERSION, init_package_version } from "../../package-version.js";
|
|
1
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../../utils/logger.js";
|
|
4
|
+
import { init_paths, resolveExtensionsDir } from "../../config/paths.js";
|
|
5
|
+
import { init_loader, loadConfig, saveConfig } from "../../config/loader.js";
|
|
6
|
+
import { checkEngineCompatibility } from "../../extensions/engine-check.js";
|
|
7
|
+
import { ExtensionLoader } from "../../extensions/loader.js";
|
|
8
|
+
import { getContextWithOpts } from "../context.js";
|
|
3
9
|
import { getExtensionLockfileManager } from "../../extensions/lockfile.js";
|
|
4
10
|
import { checkAllExtensionsHealth, getExtensionHealthChecker } from "../../extensions/health.js";
|
|
11
|
+
import { collectExtensionPackageDependencyIssues } from "../../extensions/package-contract.js";
|
|
5
12
|
import { colors } from "../utils/colors.js";
|
|
13
|
+
import { createExtensionCreateCommand } from "./extension-create.js";
|
|
6
14
|
import { createExtensionDevCommand } from "./extension-dev.js";
|
|
7
|
-
import { createExtensionInstallCommand, createExtensionPublishCommand, createExtensionSearchCommand, createExtensionUpdateCommand } from "./extension-marketplace.js";
|
|
8
15
|
import { createExtensionPackCommand } from "./extension-pack.js";
|
|
16
|
+
import { createExtensionInstallCommand, createExtensionPublishCommand, createExtensionSearchCommand, createExtensionUpdateCommand } from "./extension-marketplace.js";
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
19
|
+
import { createHash } from "node:crypto";
|
|
9
20
|
import { Command } from "commander";
|
|
10
21
|
//#region src/cli/commands/extension.ts
|
|
22
|
+
init_loader();
|
|
23
|
+
init_paths();
|
|
24
|
+
init_package_version();
|
|
11
25
|
init_logger();
|
|
12
26
|
const log = createLogger("ExtensionCommands");
|
|
13
27
|
function createExtensionListCommand() {
|
|
@@ -38,6 +52,129 @@ function createExtensionListCommand() {
|
|
|
38
52
|
}
|
|
39
53
|
});
|
|
40
54
|
}
|
|
55
|
+
function hashInstalledExtensionDir(extensionDir) {
|
|
56
|
+
if (!existsSync(extensionDir)) return void 0;
|
|
57
|
+
const hash = createHash("sha256");
|
|
58
|
+
const walk = (dir, prefix = "") => {
|
|
59
|
+
const entries = readdirSync(dir, { withFileTypes: true }).filter((entry) => entry.name !== "node_modules").sort((a, b) => a.name.localeCompare(b.name));
|
|
60
|
+
for (const entry of entries) {
|
|
61
|
+
const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
62
|
+
const full = join(dir, entry.name);
|
|
63
|
+
if (entry.isDirectory()) walk(full, rel);
|
|
64
|
+
else if (entry.isFile()) {
|
|
65
|
+
const st = statSync(full);
|
|
66
|
+
hash.update(`file\0${rel}\0${st.size}\0`);
|
|
67
|
+
hash.update(readFileSync(full));
|
|
68
|
+
hash.update("\0");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
walk(extensionDir);
|
|
73
|
+
return `dir-sha256-${hash.digest("base64")}`;
|
|
74
|
+
}
|
|
75
|
+
function readJson(path) {
|
|
76
|
+
try {
|
|
77
|
+
const raw = JSON.parse(readFileSync(path, "utf-8"));
|
|
78
|
+
return typeof raw === "object" && raw !== null && !Array.isArray(raw) ? raw : void 0;
|
|
79
|
+
} catch {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function createExtensionInspectCommand() {
|
|
84
|
+
return new Command("inspect").description("Inspect an installed extension manifest and package contract").argument("<extension>", "Extension id").option("--json", "Output as JSON").option("--runtime", "Load the extension and include runtime registrations").action(async (extensionId, options) => {
|
|
85
|
+
try {
|
|
86
|
+
const lockEntry = await getExtensionLockfileManager().get(extensionId);
|
|
87
|
+
const extensionDir = join(resolveExtensionsDir(), extensionId);
|
|
88
|
+
const manifest = readJson(join(extensionDir, "xopc.extension.json")) ?? lockEntry?.manifest;
|
|
89
|
+
const packageJson = readJson(join(extensionDir, "package.json")) ?? lockEntry?.packageJson;
|
|
90
|
+
let runtime;
|
|
91
|
+
if (options.runtime) {
|
|
92
|
+
const loader = new ExtensionLoader({
|
|
93
|
+
workspaceDir: process.cwd(),
|
|
94
|
+
extensionsDir: resolveExtensionsDir()
|
|
95
|
+
});
|
|
96
|
+
const api = await loader.loadExtension({
|
|
97
|
+
id: extensionId,
|
|
98
|
+
name: String(manifest?.name ?? extensionId),
|
|
99
|
+
path: extensionDir,
|
|
100
|
+
source: "global",
|
|
101
|
+
enabled: true,
|
|
102
|
+
config: {}
|
|
103
|
+
});
|
|
104
|
+
const registry = loader.getRegistry();
|
|
105
|
+
runtime = api ? {
|
|
106
|
+
loaded: true,
|
|
107
|
+
tools: Array.from(registry.tools.keys()),
|
|
108
|
+
commands: Array.from(registry.commands.keys()),
|
|
109
|
+
hooks: Array.from(registry.hooks.keys()),
|
|
110
|
+
channels: registry.channelPlugins.map((p) => p.id),
|
|
111
|
+
httpRoutes: Array.from(registry.httpRoutes.keys()),
|
|
112
|
+
gatewayMethods: Array.from(registry.gatewayMethods.keys()),
|
|
113
|
+
services: Array.from(registry.services.keys()),
|
|
114
|
+
cliCommands: registry.getCliRegistrations().flatMap((r) => r.commands),
|
|
115
|
+
tui: registry.getTuiRegistrations().map((r) => r.extensionId)
|
|
116
|
+
} : {
|
|
117
|
+
loaded: false,
|
|
118
|
+
diagnostics: loader.getDiagnostics().getAll()
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
const runtimeContractCheck = buildRuntimeContractCheck(manifest, runtime);
|
|
122
|
+
const result = {
|
|
123
|
+
id: extensionId,
|
|
124
|
+
installed: Boolean(lockEntry),
|
|
125
|
+
path: existsSync(extensionDir) ? extensionDir : void 0,
|
|
126
|
+
lockEntry,
|
|
127
|
+
manifest,
|
|
128
|
+
packageJson,
|
|
129
|
+
runtime,
|
|
130
|
+
runtimeContractCheck
|
|
131
|
+
};
|
|
132
|
+
if (options.json) {
|
|
133
|
+
console.log(JSON.stringify(result, null, 2));
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (!lockEntry && !manifest) {
|
|
137
|
+
console.error(colors.red("error:"), `Extension not found: ${extensionId}`);
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
140
|
+
console.log(`${colors.cyan(String(manifest?.name ?? extensionId))} (${extensionId})`);
|
|
141
|
+
if (manifest?.version || lockEntry?.version) console.log(` Version: ${String(manifest?.version ?? lockEntry?.version)}`);
|
|
142
|
+
if (lockEntry) {
|
|
143
|
+
console.log(` Source: ${lockEntry.source}`);
|
|
144
|
+
console.log(` Resolved: ${lockEntry.resolved}`);
|
|
145
|
+
if (lockEntry.integrity) console.log(` Integrity: ${lockEntry.integrity}`);
|
|
146
|
+
}
|
|
147
|
+
if (manifest?.main) console.log(` Main: ${String(manifest.main)}`);
|
|
148
|
+
const engines = manifest?.engines;
|
|
149
|
+
if (engines?.xopc) console.log(` engines.xopc: ${String(engines.xopc)}`);
|
|
150
|
+
const contracts = manifest?.contracts;
|
|
151
|
+
if (contracts) {
|
|
152
|
+
console.log(" Contracts:");
|
|
153
|
+
for (const [key, value] of Object.entries(contracts)) if (Array.isArray(value) && value.length > 0) console.log(` ${key}: ${value.join(", ")}`);
|
|
154
|
+
}
|
|
155
|
+
if (runtime) {
|
|
156
|
+
console.log(" Runtime:");
|
|
157
|
+
if (runtime.loaded === false) console.log(" loaded: false");
|
|
158
|
+
else for (const [key, value] of Object.entries(runtime)) {
|
|
159
|
+
if (key === "loaded") continue;
|
|
160
|
+
if (Array.isArray(value) && value.length > 0) console.log(` ${key}: ${value.join(", ")}`);
|
|
161
|
+
}
|
|
162
|
+
if (runtimeContractCheck.length > 0) {
|
|
163
|
+
console.log(" Runtime contract check:");
|
|
164
|
+
for (const check of runtimeContractCheck) {
|
|
165
|
+
const marker = check.status === "registered" ? colors.green("✓") : colors.red("✗");
|
|
166
|
+
const suffix = check.status === "missing" ? " declared but not registered" : "";
|
|
167
|
+
console.log(` ${marker} ${check.contract}.${check.declared}${suffix}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
} catch (error) {
|
|
172
|
+
log.error({ error }, "Failed to inspect extension");
|
|
173
|
+
console.error(colors.red("Error:"), error instanceof Error ? error.message : String(error));
|
|
174
|
+
process.exit(1);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
}
|
|
41
178
|
function createExtensionFreezeCommand() {
|
|
42
179
|
return new Command("freeze").description("Lock current extension versions").action(async () => {
|
|
43
180
|
try {
|
|
@@ -96,6 +233,241 @@ function createExtensionVerifyCommand() {
|
|
|
96
233
|
}
|
|
97
234
|
});
|
|
98
235
|
}
|
|
236
|
+
function listContractValues(manifest, key) {
|
|
237
|
+
const contracts = manifest.contracts;
|
|
238
|
+
if (typeof contracts !== "object" || contracts === null || Array.isArray(contracts)) return [];
|
|
239
|
+
const value = contracts[key];
|
|
240
|
+
return Array.isArray(value) ? value.filter((x) => typeof x === "string") : [];
|
|
241
|
+
}
|
|
242
|
+
function contractAllows(values, candidate) {
|
|
243
|
+
return values.some((value) => value === candidate || value.endsWith("*") && candidate.startsWith(value.slice(0, -1)));
|
|
244
|
+
}
|
|
245
|
+
function buildRuntimeContractCheck(manifest, runtime) {
|
|
246
|
+
if (!manifest || !runtime || runtime.loaded === false) return [];
|
|
247
|
+
const out = [];
|
|
248
|
+
for (const key of [
|
|
249
|
+
"tools",
|
|
250
|
+
"commands",
|
|
251
|
+
"hooks",
|
|
252
|
+
"channels",
|
|
253
|
+
"httpRoutes",
|
|
254
|
+
"gatewayMethods",
|
|
255
|
+
"services",
|
|
256
|
+
"cliCommands",
|
|
257
|
+
"tui"
|
|
258
|
+
]) {
|
|
259
|
+
const declared = listContractValues(manifest, key);
|
|
260
|
+
const registered = Array.isArray(runtime[key]) ? runtime[key].filter((x) => typeof x === "string") : [];
|
|
261
|
+
for (const item of declared) {
|
|
262
|
+
if (item.endsWith("*")) continue;
|
|
263
|
+
out.push({
|
|
264
|
+
contract: key,
|
|
265
|
+
declared: item,
|
|
266
|
+
status: registered.includes(item) ? "registered" : "missing"
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return out;
|
|
271
|
+
}
|
|
272
|
+
function collectStringLiteralCalls(source, method) {
|
|
273
|
+
const out = [];
|
|
274
|
+
const re = new RegExp(`\\.${method}\\(\\s*['\"]([^'\"]+)['\"]`, "g");
|
|
275
|
+
for (const match of source.matchAll(re)) if (match[1]) out.push(match[1]);
|
|
276
|
+
return out;
|
|
277
|
+
}
|
|
278
|
+
function collectObjectNameRegistrations(source, method, field) {
|
|
279
|
+
const out = [];
|
|
280
|
+
const re = new RegExp(`\\.${method}\\(\\s*\\{[\\s\\S]*?\\b${field}\\s*:\\s*['\"]([^'\"]+)['\"]`, "g");
|
|
281
|
+
for (const match of source.matchAll(re)) if (match[1]) out.push(match[1]);
|
|
282
|
+
return out;
|
|
283
|
+
}
|
|
284
|
+
function diagnoseExtensionPackage(extensionId, extensionDir) {
|
|
285
|
+
const issues = [];
|
|
286
|
+
const manifest = readJson(join(extensionDir, "xopc.extension.json"));
|
|
287
|
+
if (!manifest) return [{
|
|
288
|
+
level: "error",
|
|
289
|
+
extensionId,
|
|
290
|
+
message: "Missing xopc.extension.json"
|
|
291
|
+
}];
|
|
292
|
+
const main = typeof manifest.main === "string" ? manifest.main : "";
|
|
293
|
+
if (!main) issues.push({
|
|
294
|
+
level: "error",
|
|
295
|
+
extensionId,
|
|
296
|
+
message: "manifest.main is required"
|
|
297
|
+
});
|
|
298
|
+
else if (!/\.(js|mjs|cjs)$/i.test(main)) issues.push({
|
|
299
|
+
level: "error",
|
|
300
|
+
extensionId,
|
|
301
|
+
message: `manifest.main must point at built JavaScript, got ${main}`
|
|
302
|
+
});
|
|
303
|
+
else if (!existsSync(join(extensionDir, main))) issues.push({
|
|
304
|
+
level: "error",
|
|
305
|
+
extensionId,
|
|
306
|
+
message: `manifest.main target does not exist: ${main}`
|
|
307
|
+
});
|
|
308
|
+
const engines = manifest.engines;
|
|
309
|
+
const xopcRange = typeof engines === "object" && engines !== null && !Array.isArray(engines) ? engines.xopc : void 0;
|
|
310
|
+
if (typeof xopcRange !== "string" || !xopcRange.trim()) issues.push({
|
|
311
|
+
level: "error",
|
|
312
|
+
extensionId,
|
|
313
|
+
message: "engines.xopc is required"
|
|
314
|
+
});
|
|
315
|
+
else {
|
|
316
|
+
const engineCheck = checkEngineCompatibility(PACKAGE_VERSION, xopcRange);
|
|
317
|
+
if (engineCheck.parseWarning || !engineCheck.compatible) issues.push({
|
|
318
|
+
level: "error",
|
|
319
|
+
extensionId,
|
|
320
|
+
message: engineCheck.reason ?? `xopc ${PACKAGE_VERSION} does not satisfy engines.xopc ${xopcRange}`
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
const pkg = readJson(join(extensionDir, "package.json"));
|
|
324
|
+
if (pkg) for (const issue of collectExtensionPackageDependencyIssues(pkg, { strictRuntimeSdkDeps: true })) issues.push({
|
|
325
|
+
level: "error",
|
|
326
|
+
extensionId,
|
|
327
|
+
message: issue.message
|
|
328
|
+
});
|
|
329
|
+
if (main && existsSync(join(extensionDir, main))) {
|
|
330
|
+
const source = readFileSync(join(extensionDir, main), "utf-8");
|
|
331
|
+
const checks = [
|
|
332
|
+
{
|
|
333
|
+
contract: "hooks",
|
|
334
|
+
values: collectStringLiteralCalls(source, "registerHook")
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
contract: "hooks",
|
|
338
|
+
values: collectStringLiteralCalls(source, "onHook")
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
contract: "httpRoutes",
|
|
342
|
+
values: collectStringLiteralCalls(source, "registerHttpRoute")
|
|
343
|
+
},
|
|
344
|
+
{
|
|
345
|
+
contract: "gatewayMethods",
|
|
346
|
+
values: collectStringLiteralCalls(source, "registerGatewayMethod")
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
contract: "tools",
|
|
350
|
+
values: collectObjectNameRegistrations(source, "registerTool", "name")
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
contract: "commands",
|
|
354
|
+
values: collectObjectNameRegistrations(source, "registerCommand", "name")
|
|
355
|
+
},
|
|
356
|
+
{
|
|
357
|
+
contract: "services",
|
|
358
|
+
values: collectObjectNameRegistrations(source, "registerService", "id")
|
|
359
|
+
}
|
|
360
|
+
];
|
|
361
|
+
for (const check of checks) {
|
|
362
|
+
const declared = listContractValues(manifest, check.contract);
|
|
363
|
+
for (const value of check.values) if (!contractAllows(declared, value)) issues.push({
|
|
364
|
+
level: "error",
|
|
365
|
+
extensionId,
|
|
366
|
+
message: `Runtime registers ${check.contract}:${value} but manifest contracts.${check.contract} does not declare it`
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
return issues;
|
|
371
|
+
}
|
|
372
|
+
function createExtensionDoctorCommand() {
|
|
373
|
+
return new Command("doctor").description("Diagnose installed extension package contracts").option("--json", "Output as JSON").option("--fix", "Refresh lockfile snapshots and installed file integrity for valid installed extensions").action(async (options) => {
|
|
374
|
+
try {
|
|
375
|
+
const ctx = getContextWithOpts();
|
|
376
|
+
const cfg = loadConfig(ctx.configPath);
|
|
377
|
+
const extensionsConfig = typeof cfg.extensions === "object" && cfg.extensions !== null && !Array.isArray(cfg.extensions) ? cfg.extensions : void 0;
|
|
378
|
+
const enabledIds = Array.isArray(extensionsConfig?.enabled) ? extensionsConfig.enabled.filter((x) => typeof x === "string") : [];
|
|
379
|
+
const lockfileManager = getExtensionLockfileManager();
|
|
380
|
+
const extensions = await lockfileManager.list();
|
|
381
|
+
const issues = [];
|
|
382
|
+
const lockDir = resolveExtensionsDir();
|
|
383
|
+
const lockedIds = new Set(extensions.map((entry) => entry.name));
|
|
384
|
+
for (const entry of extensions) {
|
|
385
|
+
const extensionDir = join(lockDir, entry.name);
|
|
386
|
+
if (!existsSync(extensionDir)) {
|
|
387
|
+
issues.push({
|
|
388
|
+
level: "error",
|
|
389
|
+
extensionId: entry.name,
|
|
390
|
+
message: "Lockfile entry exists but extension directory is missing; reinstall the extension"
|
|
391
|
+
});
|
|
392
|
+
continue;
|
|
393
|
+
}
|
|
394
|
+
const entryIssues = diagnoseExtensionPackage(entry.name, extensionDir);
|
|
395
|
+
issues.push(...entryIssues);
|
|
396
|
+
if (options.fix && entryIssues.length === 0) await lockfileManager.upsert(entry.name, {
|
|
397
|
+
...entry,
|
|
398
|
+
manifest: readJson(join(extensionDir, "xopc.extension.json")),
|
|
399
|
+
packageJson: readJson(join(extensionDir, "package.json")),
|
|
400
|
+
installedIntegrity: hashInstalledExtensionDir(extensionDir)
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
for (const enabledId of enabledIds) if (!lockedIds.has(enabledId) && !existsSync(join(lockDir, enabledId))) if (options.fix && extensionsConfig) {
|
|
404
|
+
extensionsConfig.enabled = enabledIds.filter((id) => id !== enabledId);
|
|
405
|
+
issues.push({
|
|
406
|
+
level: "warning",
|
|
407
|
+
extensionId: enabledId,
|
|
408
|
+
message: "Removed from extensions.enabled because it is not installed"
|
|
409
|
+
});
|
|
410
|
+
} else issues.push({
|
|
411
|
+
level: "error",
|
|
412
|
+
extensionId: enabledId,
|
|
413
|
+
message: "Configured in extensions.enabled but not installed"
|
|
414
|
+
});
|
|
415
|
+
if (options.fix && extensionsConfig) await saveConfig(cfg, ctx.configPath);
|
|
416
|
+
if (existsSync(lockDir)) for (const dirent of readdirSync(lockDir, { withFileTypes: true })) {
|
|
417
|
+
if (!dirent.isDirectory() || lockedIds.has(dirent.name)) continue;
|
|
418
|
+
const extensionDir = join(lockDir, dirent.name);
|
|
419
|
+
const entryIssues = diagnoseExtensionPackage(dirent.name, extensionDir);
|
|
420
|
+
if (entryIssues.length > 0) {
|
|
421
|
+
issues.push(...entryIssues);
|
|
422
|
+
issues.push({
|
|
423
|
+
level: "error",
|
|
424
|
+
extensionId: dirent.name,
|
|
425
|
+
message: "Extension directory is not recorded in the lockfile and cannot be auto-fixed until package contract errors are resolved"
|
|
426
|
+
});
|
|
427
|
+
continue;
|
|
428
|
+
}
|
|
429
|
+
if (!options.fix) issues.push({
|
|
430
|
+
level: "warning",
|
|
431
|
+
extensionId: dirent.name,
|
|
432
|
+
message: "Extension directory is not recorded in the lockfile"
|
|
433
|
+
});
|
|
434
|
+
if (options.fix) {
|
|
435
|
+
const manifest = readJson(join(extensionDir, "xopc.extension.json"));
|
|
436
|
+
const packageJson = readJson(join(extensionDir, "package.json"));
|
|
437
|
+
await lockfileManager.upsert(dirent.name, {
|
|
438
|
+
name: dirent.name,
|
|
439
|
+
version: String(manifest?.version ?? packageJson?.version ?? "0.0.0"),
|
|
440
|
+
resolved: extensionDir,
|
|
441
|
+
source: "local",
|
|
442
|
+
manifest,
|
|
443
|
+
packageJson,
|
|
444
|
+
installedIntegrity: hashInstalledExtensionDir(extensionDir)
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
if (options.json) {
|
|
449
|
+
console.log(JSON.stringify({
|
|
450
|
+
ok: issues.every((i) => i.level !== "error"),
|
|
451
|
+
issues
|
|
452
|
+
}, null, 2));
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
|
+
if (issues.length === 0) {
|
|
456
|
+
console.log(colors.green("✓"), options.fix ? "All installed extensions satisfy the package contract; lockfile snapshots refreshed" : "All installed extensions satisfy the package contract");
|
|
457
|
+
return;
|
|
458
|
+
}
|
|
459
|
+
for (const issue of issues) {
|
|
460
|
+
const marker = issue.level === "error" ? colors.red("✗") : colors.yellow("⚠");
|
|
461
|
+
console.log(marker, `${issue.extensionId}: ${issue.message}`);
|
|
462
|
+
}
|
|
463
|
+
if (issues.some((i) => i.level === "error")) process.exit(1);
|
|
464
|
+
} catch (error) {
|
|
465
|
+
log.error({ error }, "Failed to run extension doctor");
|
|
466
|
+
console.error(colors.red("Error:"), error instanceof Error ? error.message : String(error));
|
|
467
|
+
process.exit(1);
|
|
468
|
+
}
|
|
469
|
+
});
|
|
470
|
+
}
|
|
99
471
|
function createExtensionAuditCommand() {
|
|
100
472
|
return new Command("audit").description("Audit extensions for security issues").action(async () => {
|
|
101
473
|
try {
|
|
@@ -121,10 +493,10 @@ function createExtensionAuditCommand() {
|
|
|
121
493
|
});
|
|
122
494
|
}
|
|
123
495
|
function registerExtensionCommands(program) {
|
|
124
|
-
const extensions = new Command("extensions").description("Manage extensions").addCommand(createExtensionListCommand()).addCommand(createExtensionFreezeCommand()).addCommand(createExtensionHealthCommand()).addCommand(createExtensionVerifyCommand()).addCommand(createExtensionAuditCommand()).addCommand(createExtensionPackCommand()).addCommand(createExtensionDevCommand()).addCommand(createExtensionInstallCommand()).addCommand(createExtensionSearchCommand()).addCommand(createExtensionPublishCommand()).addCommand(createExtensionUpdateCommand());
|
|
496
|
+
const extensions = new Command("extensions").description("Manage extensions").addCommand(createExtensionListCommand()).addCommand(createExtensionInspectCommand()).addCommand(createExtensionFreezeCommand()).addCommand(createExtensionHealthCommand()).addCommand(createExtensionVerifyCommand()).addCommand(createExtensionDoctorCommand()).addCommand(createExtensionAuditCommand()).addCommand(createExtensionPackCommand()).addCommand(createExtensionCreateCommand()).addCommand(createExtensionDevCommand()).addCommand(createExtensionInstallCommand()).addCommand(createExtensionSearchCommand()).addCommand(createExtensionPublishCommand()).addCommand(createExtensionUpdateCommand());
|
|
125
497
|
program.addCommand(extensions);
|
|
126
498
|
}
|
|
127
499
|
//#endregion
|
|
128
|
-
export { createExtensionAuditCommand, createExtensionFreezeCommand, createExtensionHealthCommand, createExtensionListCommand, createExtensionVerifyCommand, registerExtensionCommands };
|
|
500
|
+
export { createExtensionAuditCommand, createExtensionDoctorCommand, createExtensionFreezeCommand, createExtensionHealthCommand, createExtensionInspectCommand, createExtensionListCommand, createExtensionVerifyCommand, registerExtensionCommands };
|
|
129
501
|
|
|
130
502
|
//# sourceMappingURL=extension.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.js","names":[],"sources":["../../../../src/cli/commands/extension.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { createLogger } from '../../utils/logger.js';\nimport { getExtensionLockfileManager } from '../../extensions/lockfile.js';\nimport {\n getExtensionHealthChecker,\n checkAllExtensionsHealth,\n} from '../../extensions/health.js';\nimport { colors } from '../utils/colors.js';\nimport { createExtensionPackCommand } from './extension-pack.js';\nimport { createExtensionDevCommand } from './extension-dev.js';\nimport {\n createExtensionInstallCommand,\n createExtensionPublishCommand,\n createExtensionSearchCommand,\n createExtensionUpdateCommand,\n} from './extension-marketplace.js';\n\nconst log = createLogger('ExtensionCommands');\n\n// ============================================\n// Extension List Command\n// ============================================\n\nexport function createExtensionListCommand(): Command {\n return new Command('list')\n .description('List installed extensions')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const lockfileManager = getExtensionLockfileManager();\n const extensions = await lockfileManager.list();\n\n if (options.json) {\n console.log(JSON.stringify(extensions, null, 2));\n return;\n }\n\n if (extensions.length === 0) {\n console.log('No extensions installed.');\n return;\n }\n\n console.log(`Installed extensions (${extensions.length}):`);\n console.log();\n\n for (const ext of extensions) {\n console.log(`${colors.cyan(ext.name)}@${ext.version}`);\n console.log(` Source: ${ext.source}`);\n console.log(` Resolved: ${ext.resolved}`);\n console.log(` Installed: ${new Date(ext.installedAt).toLocaleString()}`);\n console.log();\n }\n } catch (error) {\n log.error({ error }, 'Failed to list extensions');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Extension Freeze Command\n// ============================================\n\nexport function createExtensionFreezeCommand(): Command {\n return new Command('freeze')\n .description('Lock current extension versions')\n .action(async () => {\n try {\n const lockfileManager = getExtensionLockfileManager();\n await lockfileManager.freeze();\n\n console.log(colors.green('✓'), 'Extension versions locked');\n } catch (error) {\n log.error({ error }, 'Failed to freeze extensions');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Extension Health Command\n// ============================================\n\nexport function createExtensionHealthCommand(): Command {\n return new Command('health')\n .description('Check extension health')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const checker = getExtensionHealthChecker();\n const report = await checkAllExtensionsHealth();\n\n if (options.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n\n console.log(checker.formatReport(report));\n\n // Exit with error code if there are errors\n if (report.summary.error > 0) {\n process.exit(1);\n }\n } catch (error) {\n log.error({ error }, 'Failed to check extension health');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Extension Verify Command\n// ============================================\n\nexport function createExtensionVerifyCommand(): Command {\n return new Command('verify')\n .description('Verify extension integrity')\n .argument('[extension]', 'Specific extension to verify (default: all)')\n .action(async (extensionId) => {\n try {\n const lockfileManager = getExtensionLockfileManager();\n\n if (extensionId) {\n const result = await lockfileManager.verify(extensionId);\n\n if (result.valid) {\n console.log(colors.green('✓'), `Extension \"${extensionId}\" is valid`);\n } else {\n console.log(colors.red('✗'), `Extension \"${extensionId}\" is invalid: ${result.reason}`);\n process.exit(1);\n }\n } else {\n const results = await lockfileManager.verifyAll();\n let hasErrors = false;\n\n for (const result of results) {\n if (result.valid) {\n console.log(colors.green('✓'), result.extensionId);\n } else {\n console.log(colors.red('✗'), `${result.extensionId}: ${result.reason}`);\n hasErrors = true;\n }\n }\n\n if (hasErrors) {\n process.exit(1);\n }\n }\n } catch (error) {\n log.error({ error }, 'Failed to verify extensions');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Extension Audit Command\n// ============================================\n\nexport function createExtensionAuditCommand(): Command {\n return new Command('audit')\n .description('Audit extensions for security issues')\n .action(async () => {\n try {\n const checker = getExtensionHealthChecker();\n\n // Check for orphaned extensions\n const orphaned = await checker.findOrphaned();\n\n if (orphaned.length > 0) {\n console.log(colors.yellow('⚠'), 'Orphaned extensions found:');\n for (const ext of orphaned) {\n console.log(` - ${ext}`);\n }\n console.log();\n console.log('These extensions are installed but not in the lockfile.');\n console.log('Run `xopc extensions freeze` to add them.');\n } else {\n console.log(colors.green('✓'), 'No orphaned extensions found');\n }\n\n // Run health check\n const report = await checkAllExtensionsHealth();\n\n if (report.summary.error > 0 || report.summary.warning > 0) {\n console.log();\n console.log(checker.formatReport(report));\n } else {\n console.log(colors.green('✓'), 'All extensions are healthy');\n }\n } catch (error) {\n log.error({ error }, 'Failed to audit extensions');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Register All Commands\n// ============================================\n\nexport function registerExtensionCommands(program: Command): void {\n const extensions = new Command('extensions')\n .description('Manage extensions')\n .addCommand(createExtensionListCommand())\n .addCommand(createExtensionFreezeCommand())\n .addCommand(createExtensionHealthCommand())\n .addCommand(createExtensionVerifyCommand())\n .addCommand(createExtensionAuditCommand())\n .addCommand(createExtensionPackCommand())\n .addCommand(createExtensionDevCommand())\n .addCommand(createExtensionInstallCommand())\n .addCommand(createExtensionSearchCommand())\n .addCommand(createExtensionPublishCommand())\n .addCommand(createExtensionUpdateCommand());\n\n program.addCommand(extensions);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extension.js","names":[],"sources":["../../../../src/cli/commands/extension.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { Command } from 'commander';\n\nimport { loadConfig, saveConfig } from '../../config/loader.js';\nimport { resolveExtensionsDir } from '../../config/paths.js';\nimport { checkEngineCompatibility } from '../../extensions/engine-check.js';\nimport { ExtensionLoader } from '../../extensions/loader.js';\nimport { collectExtensionPackageDependencyIssues } from '../../extensions/package-contract.js';\nimport { PACKAGE_VERSION } from '../../package-version.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { getExtensionLockfileManager } from '../../extensions/lockfile.js';\nimport {\n getExtensionHealthChecker,\n checkAllExtensionsHealth,\n} from '../../extensions/health.js';\nimport { getContextWithOpts } from '../context.js';\nimport { colors } from '../utils/colors.js';\nimport { createExtensionPackCommand } from './extension-pack.js';\nimport { createExtensionCreateCommand } from './extension-create.js';\nimport { createExtensionDevCommand } from './extension-dev.js';\nimport {\n createExtensionInstallCommand,\n createExtensionPublishCommand,\n createExtensionSearchCommand,\n createExtensionUpdateCommand,\n} from './extension-marketplace.js';\n\nconst log = createLogger('ExtensionCommands');\n\n// ============================================\n// Extension List Command\n// ============================================\n\nexport function createExtensionListCommand(): Command {\n return new Command('list')\n .description('List installed extensions')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const lockfileManager = getExtensionLockfileManager();\n const extensions = await lockfileManager.list();\n\n if (options.json) {\n console.log(JSON.stringify(extensions, null, 2));\n return;\n }\n\n if (extensions.length === 0) {\n console.log('No extensions installed.');\n return;\n }\n\n console.log(`Installed extensions (${extensions.length}):`);\n console.log();\n\n for (const ext of extensions) {\n console.log(`${colors.cyan(ext.name)}@${ext.version}`);\n console.log(` Source: ${ext.source}`);\n console.log(` Resolved: ${ext.resolved}`);\n console.log(` Installed: ${new Date(ext.installedAt).toLocaleString()}`);\n console.log();\n }\n } catch (error) {\n log.error({ error }, 'Failed to list extensions');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Extension Inspect Command\n// ============================================\n\nfunction hashInstalledExtensionDir(extensionDir: string): string | undefined {\n if (!existsSync(extensionDir)) return undefined;\n const hash = createHash('sha256');\n const walk = (dir: string, prefix = '') => {\n const entries = readdirSync(dir, { withFileTypes: true })\n .filter((entry) => entry.name !== 'node_modules')\n .sort((a, b) => a.name.localeCompare(b.name));\n for (const entry of entries) {\n const rel = prefix ? `${prefix}/${entry.name}` : entry.name;\n const full = join(dir, entry.name);\n if (entry.isDirectory()) {\n walk(full, rel);\n } else if (entry.isFile()) {\n const st = statSync(full);\n hash.update(`file\\0${rel}\\0${st.size}\\0`);\n hash.update(readFileSync(full));\n hash.update('\\0');\n }\n }\n };\n walk(extensionDir);\n return `dir-sha256-${hash.digest('base64')}`;\n}\n\nfunction readJson(path: string): Record<string, unknown> | undefined {\n try {\n const raw = JSON.parse(readFileSync(path, 'utf-8')) as unknown;\n return typeof raw === 'object' && raw !== null && !Array.isArray(raw)\n ? (raw as Record<string, unknown>)\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function createExtensionInspectCommand(): Command {\n return new Command('inspect')\n .description('Inspect an installed extension manifest and package contract')\n .argument('<extension>', 'Extension id')\n .option('--json', 'Output as JSON')\n .option('--runtime', 'Load the extension and include runtime registrations')\n .action(async (extensionId: string, options: { json?: boolean; runtime?: boolean }) => {\n try {\n const lockfileManager = getExtensionLockfileManager();\n const lockEntry = await lockfileManager.get(extensionId);\n const extensionDir = join(resolveExtensionsDir(), extensionId);\n const manifest = readJson(join(extensionDir, 'xopc.extension.json')) ?? lockEntry?.manifest;\n const packageJson = readJson(join(extensionDir, 'package.json')) ?? lockEntry?.packageJson;\n let runtime: Record<string, unknown> | undefined;\n if (options.runtime) {\n const loader = new ExtensionLoader({\n workspaceDir: process.cwd(),\n extensionsDir: resolveExtensionsDir(),\n });\n const api = await loader.loadExtension({\n id: extensionId,\n name: String(manifest?.name ?? extensionId),\n path: extensionDir,\n source: 'global',\n enabled: true,\n config: {},\n });\n const registry = loader.getRegistry();\n runtime = api\n ? {\n loaded: true,\n tools: Array.from(registry.tools.keys()),\n commands: Array.from(registry.commands.keys()),\n hooks: Array.from(registry.hooks.keys()),\n channels: registry.channelPlugins.map((p) => p.id),\n httpRoutes: Array.from(registry.httpRoutes.keys()),\n gatewayMethods: Array.from(registry.gatewayMethods.keys()),\n services: Array.from(registry.services.keys()),\n cliCommands: registry.getCliRegistrations().flatMap((r) => r.commands),\n tui: registry.getTuiRegistrations().map((r) => r.extensionId),\n }\n : { loaded: false, diagnostics: loader.getDiagnostics().getAll() };\n }\n\n const runtimeContractCheck = buildRuntimeContractCheck(manifest, runtime);\n const result = {\n id: extensionId,\n installed: Boolean(lockEntry),\n path: existsSync(extensionDir) ? extensionDir : undefined,\n lockEntry,\n manifest,\n packageJson,\n runtime,\n runtimeContractCheck,\n };\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (!lockEntry && !manifest) {\n console.error(colors.red('error:'), `Extension not found: ${extensionId}`);\n process.exit(1);\n }\n\n console.log(`${colors.cyan(String(manifest?.name ?? extensionId))} (${extensionId})`);\n if (manifest?.version || lockEntry?.version) {\n console.log(` Version: ${String(manifest?.version ?? lockEntry?.version)}`);\n }\n if (lockEntry) {\n console.log(` Source: ${lockEntry.source}`);\n console.log(` Resolved: ${lockEntry.resolved}`);\n if (lockEntry.integrity) console.log(` Integrity: ${lockEntry.integrity}`);\n }\n if (manifest?.main) console.log(` Main: ${String(manifest.main)}`);\n const engines = manifest?.engines as Record<string, unknown> | undefined;\n if (engines?.xopc) console.log(` engines.xopc: ${String(engines.xopc)}`);\n const contracts = manifest?.contracts as Record<string, unknown> | undefined;\n if (contracts) {\n console.log(' Contracts:');\n for (const [key, value] of Object.entries(contracts)) {\n if (Array.isArray(value) && value.length > 0) {\n console.log(` ${key}: ${value.join(', ')}`);\n }\n }\n }\n if (runtime) {\n console.log(' Runtime:');\n if (runtime.loaded === false) {\n console.log(' loaded: false');\n } else {\n for (const [key, value] of Object.entries(runtime)) {\n if (key === 'loaded') continue;\n if (Array.isArray(value) && value.length > 0) {\n console.log(` ${key}: ${value.join(', ')}`);\n }\n }\n }\n if (runtimeContractCheck.length > 0) {\n console.log(' Runtime contract check:');\n for (const check of runtimeContractCheck) {\n const marker = check.status === 'registered' ? colors.green('✓') : colors.red('✗');\n const suffix = check.status === 'missing' ? ' declared but not registered' : '';\n console.log(` ${marker} ${check.contract}.${check.declared}${suffix}`);\n }\n }\n }\n } catch (error) {\n log.error({ error }, 'Failed to inspect extension');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Extension Freeze Command\n// ============================================\n\nexport function createExtensionFreezeCommand(): Command {\n return new Command('freeze')\n .description('Lock current extension versions')\n .action(async () => {\n try {\n const lockfileManager = getExtensionLockfileManager();\n await lockfileManager.freeze();\n\n console.log(colors.green('✓'), 'Extension versions locked');\n } catch (error) {\n log.error({ error }, 'Failed to freeze extensions');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Extension Health Command\n// ============================================\n\nexport function createExtensionHealthCommand(): Command {\n return new Command('health')\n .description('Check extension health')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const checker = getExtensionHealthChecker();\n const report = await checkAllExtensionsHealth();\n\n if (options.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n\n console.log(checker.formatReport(report));\n\n // Exit with error code if there are errors\n if (report.summary.error > 0) {\n process.exit(1);\n }\n } catch (error) {\n log.error({ error }, 'Failed to check extension health');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Extension Verify Command\n// ============================================\n\nexport function createExtensionVerifyCommand(): Command {\n return new Command('verify')\n .description('Verify extension integrity')\n .argument('[extension]', 'Specific extension to verify (default: all)')\n .action(async (extensionId) => {\n try {\n const lockfileManager = getExtensionLockfileManager();\n\n if (extensionId) {\n const result = await lockfileManager.verify(extensionId);\n\n if (result.valid) {\n console.log(colors.green('✓'), `Extension \"${extensionId}\" is valid`);\n } else {\n console.log(colors.red('✗'), `Extension \"${extensionId}\" is invalid: ${result.reason}`);\n process.exit(1);\n }\n } else {\n const results = await lockfileManager.verifyAll();\n let hasErrors = false;\n\n for (const result of results) {\n if (result.valid) {\n console.log(colors.green('✓'), result.extensionId);\n } else {\n console.log(colors.red('✗'), `${result.extensionId}: ${result.reason}`);\n hasErrors = true;\n }\n }\n\n if (hasErrors) {\n process.exit(1);\n }\n }\n } catch (error) {\n log.error({ error }, 'Failed to verify extensions');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Extension Doctor Command\n// ============================================\n\ninterface DoctorIssue {\n level: 'error' | 'warning';\n extensionId: string;\n message: string;\n}\n\nfunction listContractValues(manifest: Record<string, unknown>, key: string): string[] {\n const contracts = manifest.contracts;\n if (typeof contracts !== 'object' || contracts === null || Array.isArray(contracts)) return [];\n const value = (contracts as Record<string, unknown>)[key];\n return Array.isArray(value) ? value.filter((x): x is string => typeof x === 'string') : [];\n}\n\nfunction contractAllows(values: string[], candidate: string): boolean {\n return values.some((value) => value === candidate || (value.endsWith('*') && candidate.startsWith(value.slice(0, -1))));\n}\n\nfunction buildRuntimeContractCheck(\n manifest: Record<string, unknown> | undefined,\n runtime: Record<string, unknown> | undefined,\n): Array<{ contract: string; declared: string; status: 'registered' | 'missing' }> {\n if (!manifest || !runtime || runtime.loaded === false) return [];\n const out: Array<{ contract: string; declared: string; status: 'registered' | 'missing' }> = [];\n for (const key of ['tools', 'commands', 'hooks', 'channels', 'httpRoutes', 'gatewayMethods', 'services', 'cliCommands', 'tui']) {\n const declared = listContractValues(manifest, key);\n const registered = Array.isArray(runtime[key]) ? (runtime[key] as unknown[]).filter((x): x is string => typeof x === 'string') : [];\n for (const item of declared) {\n if (item.endsWith('*')) continue;\n out.push({\n contract: key,\n declared: item,\n status: registered.includes(item) ? 'registered' : 'missing',\n });\n }\n }\n return out;\n}\n\nfunction collectStringLiteralCalls(source: string, method: string): string[] {\n const out: string[] = [];\n const re = new RegExp(`\\\\.${method}\\\\(\\\\s*['\\\"]([^'\\\"]+)['\\\"]`, 'g');\n for (const match of source.matchAll(re)) {\n if (match[1]) out.push(match[1]);\n }\n return out;\n}\n\nfunction collectObjectNameRegistrations(source: string, method: string, field: string): string[] {\n const out: string[] = [];\n const re = new RegExp(`\\\\.${method}\\\\(\\\\s*\\\\{[\\\\s\\\\S]*?\\\\b${field}\\\\s*:\\\\s*['\\\"]([^'\\\"]+)['\\\"]`, 'g');\n for (const match of source.matchAll(re)) {\n if (match[1]) out.push(match[1]);\n }\n return out;\n}\n\nfunction diagnoseExtensionPackage(extensionId: string, extensionDir: string): DoctorIssue[] {\n const issues: DoctorIssue[] = [];\n const manifest = readJson(join(extensionDir, 'xopc.extension.json'));\n if (!manifest) {\n return [{ level: 'error', extensionId, message: 'Missing xopc.extension.json' }];\n }\n\n const main = typeof manifest.main === 'string' ? manifest.main : '';\n if (!main) {\n issues.push({ level: 'error', extensionId, message: 'manifest.main is required' });\n } else if (!/\\.(js|mjs|cjs)$/i.test(main)) {\n issues.push({ level: 'error', extensionId, message: `manifest.main must point at built JavaScript, got ${main}` });\n } else if (!existsSync(join(extensionDir, main))) {\n issues.push({ level: 'error', extensionId, message: `manifest.main target does not exist: ${main}` });\n }\n\n const engines = manifest.engines;\n const xopcRange = typeof engines === 'object' && engines !== null && !Array.isArray(engines)\n ? (engines as Record<string, unknown>).xopc\n : undefined;\n if (typeof xopcRange !== 'string' || !xopcRange.trim()) {\n issues.push({ level: 'error', extensionId, message: 'engines.xopc is required' });\n } else {\n const engineCheck = checkEngineCompatibility(PACKAGE_VERSION, xopcRange);\n if (engineCheck.parseWarning || !engineCheck.compatible) {\n issues.push({\n level: 'error',\n extensionId,\n message: engineCheck.reason ?? `xopc ${PACKAGE_VERSION} does not satisfy engines.xopc ${xopcRange}`,\n });\n }\n }\n\n const pkg = readJson(join(extensionDir, 'package.json'));\n if (pkg) {\n for (const issue of collectExtensionPackageDependencyIssues(pkg, { strictRuntimeSdkDeps: true })) {\n issues.push({ level: 'error', extensionId, message: issue.message });\n }\n }\n\n if (main && existsSync(join(extensionDir, main))) {\n const source = readFileSync(join(extensionDir, main), 'utf-8');\n const checks: Array<{ contract: string; values: string[] }> = [\n { contract: 'hooks', values: collectStringLiteralCalls(source, 'registerHook') },\n { contract: 'hooks', values: collectStringLiteralCalls(source, 'onHook') },\n { contract: 'httpRoutes', values: collectStringLiteralCalls(source, 'registerHttpRoute') },\n { contract: 'gatewayMethods', values: collectStringLiteralCalls(source, 'registerGatewayMethod') },\n { contract: 'tools', values: collectObjectNameRegistrations(source, 'registerTool', 'name') },\n { contract: 'commands', values: collectObjectNameRegistrations(source, 'registerCommand', 'name') },\n { contract: 'services', values: collectObjectNameRegistrations(source, 'registerService', 'id') },\n ];\n for (const check of checks) {\n const declared = listContractValues(manifest, check.contract);\n for (const value of check.values) {\n if (!contractAllows(declared, value)) {\n issues.push({\n level: 'error',\n extensionId,\n message: `Runtime registers ${check.contract}:${value} but manifest contracts.${check.contract} does not declare it`,\n });\n }\n }\n }\n }\n\n return issues;\n}\n\nexport function createExtensionDoctorCommand(): Command {\n return new Command('doctor')\n .description('Diagnose installed extension package contracts')\n .option('--json', 'Output as JSON')\n .option('--fix', 'Refresh lockfile snapshots and installed file integrity for valid installed extensions')\n .action(async (options: { json?: boolean; fix?: boolean }) => {\n try {\n const ctx = getContextWithOpts();\n const cfg = loadConfig(ctx.configPath) as Record<string, unknown>;\n const extensionsConfig =\n typeof cfg.extensions === 'object' && cfg.extensions !== null && !Array.isArray(cfg.extensions)\n ? (cfg.extensions as Record<string, unknown>)\n : undefined;\n const enabledIds = Array.isArray(extensionsConfig?.enabled)\n ? extensionsConfig.enabled.filter((x): x is string => typeof x === 'string')\n : [];\n const lockfileManager = getExtensionLockfileManager();\n const extensions = await lockfileManager.list();\n const issues: DoctorIssue[] = [];\n const lockDir = resolveExtensionsDir();\n const lockedIds = new Set(extensions.map((entry) => entry.name));\n for (const entry of extensions) {\n const extensionDir = join(lockDir, entry.name);\n if (!existsSync(extensionDir)) {\n issues.push({ level: 'error', extensionId: entry.name, message: 'Lockfile entry exists but extension directory is missing; reinstall the extension' });\n continue;\n }\n const entryIssues = diagnoseExtensionPackage(entry.name, extensionDir);\n issues.push(...entryIssues);\n if (options.fix && entryIssues.length === 0) {\n await lockfileManager.upsert(entry.name, {\n ...entry,\n manifest: readJson(join(extensionDir, 'xopc.extension.json')),\n packageJson: readJson(join(extensionDir, 'package.json')),\n installedIntegrity: hashInstalledExtensionDir(extensionDir),\n });\n }\n }\n\n for (const enabledId of enabledIds) {\n if (!lockedIds.has(enabledId) && !existsSync(join(lockDir, enabledId))) {\n if (options.fix && extensionsConfig) {\n extensionsConfig.enabled = enabledIds.filter((id) => id !== enabledId);\n issues.push({ level: 'warning', extensionId: enabledId, message: 'Removed from extensions.enabled because it is not installed' });\n } else {\n issues.push({ level: 'error', extensionId: enabledId, message: 'Configured in extensions.enabled but not installed' });\n }\n }\n }\n if (options.fix && extensionsConfig) {\n await saveConfig(cfg as Parameters<typeof saveConfig>[0], ctx.configPath);\n }\n\n if (existsSync(lockDir)) {\n for (const dirent of readdirSync(lockDir, { withFileTypes: true })) {\n if (!dirent.isDirectory() || lockedIds.has(dirent.name)) continue;\n const extensionDir = join(lockDir, dirent.name);\n const entryIssues = diagnoseExtensionPackage(dirent.name, extensionDir);\n if (entryIssues.length > 0) {\n issues.push(...entryIssues);\n issues.push({ level: 'error', extensionId: dirent.name, message: 'Extension directory is not recorded in the lockfile and cannot be auto-fixed until package contract errors are resolved' });\n continue;\n }\n if (!options.fix) {\n issues.push({ level: 'warning', extensionId: dirent.name, message: 'Extension directory is not recorded in the lockfile' });\n }\n if (options.fix) {\n const manifest = readJson(join(extensionDir, 'xopc.extension.json'));\n const packageJson = readJson(join(extensionDir, 'package.json'));\n await lockfileManager.upsert(dirent.name, {\n name: dirent.name,\n version: String(manifest?.version ?? packageJson?.version ?? '0.0.0'),\n resolved: extensionDir,\n source: 'local',\n manifest,\n packageJson,\n installedIntegrity: hashInstalledExtensionDir(extensionDir),\n });\n }\n }\n }\n\n if (options.json) {\n console.log(JSON.stringify({ ok: issues.every((i) => i.level !== 'error'), issues }, null, 2));\n return;\n }\n\n if (issues.length === 0) {\n console.log(colors.green('✓'), options.fix\n ? 'All installed extensions satisfy the package contract; lockfile snapshots refreshed'\n : 'All installed extensions satisfy the package contract');\n return;\n }\n for (const issue of issues) {\n const marker = issue.level === 'error' ? colors.red('✗') : colors.yellow('⚠');\n console.log(marker, `${issue.extensionId}: ${issue.message}`);\n }\n if (issues.some((i) => i.level === 'error')) process.exit(1);\n } catch (error) {\n log.error({ error }, 'Failed to run extension doctor');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Extension Audit Command\n// ============================================\n\nexport function createExtensionAuditCommand(): Command {\n return new Command('audit')\n .description('Audit extensions for security issues')\n .action(async () => {\n try {\n const checker = getExtensionHealthChecker();\n\n // Check for orphaned extensions\n const orphaned = await checker.findOrphaned();\n\n if (orphaned.length > 0) {\n console.log(colors.yellow('⚠'), 'Orphaned extensions found:');\n for (const ext of orphaned) {\n console.log(` - ${ext}`);\n }\n console.log();\n console.log('These extensions are installed but not in the lockfile.');\n console.log('Run `xopc extensions freeze` to add them.');\n } else {\n console.log(colors.green('✓'), 'No orphaned extensions found');\n }\n\n // Run health check\n const report = await checkAllExtensionsHealth();\n\n if (report.summary.error > 0 || report.summary.warning > 0) {\n console.log();\n console.log(checker.formatReport(report));\n } else {\n console.log(colors.green('✓'), 'All extensions are healthy');\n }\n } catch (error) {\n log.error({ error }, 'Failed to audit extensions');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Register All Commands\n// ============================================\n\nexport function registerExtensionCommands(program: Command): void {\n const extensions = new Command('extensions')\n .description('Manage extensions')\n .addCommand(createExtensionListCommand())\n .addCommand(createExtensionInspectCommand())\n .addCommand(createExtensionFreezeCommand())\n .addCommand(createExtensionHealthCommand())\n .addCommand(createExtensionVerifyCommand())\n .addCommand(createExtensionDoctorCommand())\n .addCommand(createExtensionAuditCommand())\n .addCommand(createExtensionPackCommand())\n .addCommand(createExtensionCreateCommand())\n .addCommand(createExtensionDevCommand())\n .addCommand(createExtensionInstallCommand())\n .addCommand(createExtensionSearchCommand())\n .addCommand(createExtensionPublishCommand())\n .addCommand(createExtensionUpdateCommand());\n\n program.addCommand(extensions);\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getContextWithOpts } from "../../context.js";
|
|
2
|
+
import path from "node:path";
|
|
2
3
|
import { existsSync, statSync, watch } from "node:fs";
|
|
3
4
|
import { readFile } from "node:fs/promises";
|
|
4
|
-
import path from "node:path";
|
|
5
5
|
import { Command } from "commander";
|
|
6
6
|
//#region src/cli/commands/gateway/logs.ts
|
|
7
7
|
function parseLineCount(value) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region src/cli/commands/gateway/run-foreground.ts
|
|
2
2
|
async function ensureGatewayReady(configPath, workspacePath, port) {
|
|
3
|
-
const
|
|
3
|
+
const { initWorkspace } = await import("../../utils/init-workspace.js");
|
|
4
4
|
const result = await initWorkspace({
|
|
5
5
|
configPath,
|
|
6
6
|
workspacePath,
|
|
@@ -17,7 +17,6 @@ async function ensureGatewayReady(configPath, workspacePath, port) {
|
|
|
17
17
|
console.log("");
|
|
18
18
|
console.log("💡 Tip: run `xopc onboard` anytime to configure models, channels, and more.");
|
|
19
19
|
console.log("");
|
|
20
|
-
seedMainAgentProfileMarkdown(result.config);
|
|
21
20
|
}
|
|
22
21
|
}
|
|
23
22
|
async function runGatewayFromCliOptions(options, ctx) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-foreground.js","names":[],"sources":["../../../../../src/cli/commands/gateway/run-foreground.ts"],"sourcesContent":["import type { CLIContext } from '../../registry.js';\n\nexport type GatewayRunCliOptions = {\n bind?: string;\n port?: string | number;\n token?: string;\n tailscale?: string;\n tailscaleResetOnExit?: boolean;\n force?: boolean;\n hotReload?: boolean;\n foreground?: boolean;\n};\n\nasync function ensureGatewayReady(\n configPath: string,\n workspacePath: string,\n port: number,\n): Promise<void> {\n const [{ initWorkspace }, { seedMainAgentProfileMarkdown }] = await Promise.all([\n import('../../utils/init-workspace.js'),\n import('../../../agent/context/workspace-seed.js'),\n ]);\n const result = await initWorkspace({\n configPath,\n workspacePath,\n gatewayPort: port,\n });\n\n if (result.configCreated || result.workspaceCreated) {\n console.log('');\n console.log('👋 Welcome to xopc! Running first-time setup before starting the gateway...');\n console.log('');\n console.log('✅ First-time setup complete!');\n console.log(` Config: ${configPath}`);\n console.log(` Workspace: ${workspacePath}`);\n console.log(` Token: ${result.token.slice(0, 8)}...${result.token.slice(-8)}`);\n console.log('');\n console.log('💡 Tip: run `xopc onboard` anytime to configure models, channels, and more.');\n console.log('');\n seedMainAgentProfileMarkdown(result.config);\n }\n}\n\nexport async function runGatewayFromCliOptions(\n options: GatewayRunCliOptions,\n ctx: CLIContext,\n): Promise<void> {\n const tailscaleModes = new Set(['off', 'serve', 'funnel']);\n const tailscaleRaw =\n typeof options.tailscale === 'string' ? options.tailscale.trim().toLowerCase() : undefined;\n const tailscaleOverride =\n tailscaleRaw && tailscaleModes.has(tailscaleRaw)\n ? (tailscaleRaw as 'off' | 'serve' | 'funnel')\n : undefined;\n if (tailscaleRaw && !tailscaleOverride) {\n console.error(`Invalid --tailscale mode \"${tailscaleRaw}\". Use: off, serve, funnel.`);\n process.exit(1);\n }\n\n if (tailscaleOverride && tailscaleOverride !== 'off') {\n process.env.XOPC_GATEWAY_TAILSCALE_MODE = tailscaleOverride;\n }\n if (options.tailscaleResetOnExit === true) {\n process.env.XOPC_GATEWAY_TAILSCALE_RESET_ON_EXIT = '1';\n }\n\n const [{ loadConfig }, { resolveConfigPath }, { runGatewayLoop }, gatewayPorts] = await Promise.all([\n import('../../../config/index.js'),\n import('../../../config/paths.js'),\n import('../../../gateway/run-loop.js'),\n import('../../../gateway/ports.js'),\n ]);\n const { checkPortAvailable, forceFreePortAndWait } = gatewayPorts;\n const config = loadConfig(ctx.configPath);\n\n const bindFromFlagRaw =\n typeof options.bind === 'string' && options.bind.trim().length > 0\n ? options.bind.trim().toLowerCase()\n : undefined;\n const bindModes = new Set(['auto', 'loopback', 'lan', 'tailnet', 'custom']);\n const bindFromFlag = bindFromFlagRaw && bindModes.has(bindFromFlagRaw)\n ? (bindFromFlagRaw as import('../../../config/schema.js').GatewayBindMode)\n : undefined;\n if (bindFromFlagRaw && !bindFromFlag) {\n console.error(`Invalid --bind mode \"${bindFromFlagRaw}\". Use: loopback, lan, auto, custom, tailnet.`);\n process.exit(1);\n }\n\n const portRaw = options.port;\n const portFromFlag =\n portRaw !== undefined && portRaw !== null && String(portRaw).trim().length > 0\n ? parseInt(String(portRaw), 10)\n : undefined;\n\n const { resolveGatewayListenPlan } = await import('../../../gateway/listen.js');\n const listenPlan = resolveGatewayListenPlan({\n cfg: config,\n bindOverride: bindFromFlag,\n });\n const bindHost = listenPlan.bindHost;\n const port =\n portFromFlag !== undefined && Number.isFinite(portFromFlag)\n ? portFromFlag\n : (typeof config.gateway.port === 'number' ? config.gateway.port : 18790);\n\n await ensureGatewayReady(ctx.configPath, ctx.workspacePath, port);\n\n const effectiveConfig = loadConfig(ctx.configPath);\n const { resolveGatewayAuth, assertGatewayAuthConfigured } = await import('../../../gateway/auth.js');\n const { assertGatewayRuntimeConfig } = await import('../../../gateway/runtime-config.js');\n\n let auth = resolveGatewayAuth({ authConfig: effectiveConfig.gateway?.auth });\n if (typeof options.token === 'string' && options.token.trim().length > 0) {\n auth = { mode: 'token', token: options.token.trim() };\n }\n try {\n assertGatewayAuthConfigured(auth);\n assertGatewayRuntimeConfig({\n cfg: effectiveConfig,\n auth,\n bindOverride: bindFromFlag,\n port,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`Gateway refused to start: ${message}`);\n process.exit(1);\n }\n\n if (options.force) {\n try {\n const result = await forceFreePortAndWait(port, {\n timeoutMs: 2000,\n sigtermTimeoutMs: 700,\n });\n if (result.killed.length > 0) {\n console.log(`Force killed ${result.killed.length} process(es) on port ${port}`);\n if (result.escalatedToSigkill) {\n console.log('Escalated to SIGKILL');\n }\n }\n } catch (err) {\n console.error(`Failed to free port ${port}: ${String(err)}`);\n process.exit(1);\n }\n }\n\n const portAvailable = await checkPortAvailable(port, bindHost);\n if (!portAvailable) {\n console.error(`Port ${port} is already in use. Use --force to kill existing process.`);\n process.exit(1);\n }\n\n console.log('🚀 Starting xopc gateway...');\n console.log(` Bind: ${listenPlan.bindMode} (${bindHost})`);\n console.log(` Port: ${port}`);\n console.log('');\n console.log('Press Ctrl+C to stop');\n console.log('');\n\n await runGatewayLoop({\n configPath: ctx.configPath || resolveConfigPath(),\n port,\n start: async () => {\n const { GatewayServer } = await import('../../../gateway/index.js');\n const server = new GatewayServer({\n bindHost: listenPlan.bindHost,\n bind: listenPlan.bindMode,\n customBindHost: listenPlan.customBindHost,\n port,\n token: options.token || config?.gateway?.auth?.token,\n verbose: ctx.isVerbose,\n configPath: ctx.configPath,\n enableHotReload: options.hotReload,\n });\n await server.start();\n\n const displayHost = bindHost === '0.0.0.0' ? 'localhost' : bindHost;\n const token = options.token || config?.gateway?.auth?.token;\n console.log('✅ Gateway started');\n console.log(` URL: http://${displayHost}:${port}`);\n if (token) {\n console.log(` Token: ${token.slice(0, 8)}...${token.slice(-8)}`);\n }\n console.log('');\n\n return server;\n },\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"run-foreground.js","names":[],"sources":["../../../../../src/cli/commands/gateway/run-foreground.ts"],"sourcesContent":["import type { CLIContext } from '../../registry.js';\n\nexport type GatewayRunCliOptions = {\n bind?: string;\n port?: string | number;\n token?: string;\n tailscale?: string;\n tailscaleResetOnExit?: boolean;\n force?: boolean;\n hotReload?: boolean;\n foreground?: boolean;\n};\n\nasync function ensureGatewayReady(\n configPath: string,\n workspacePath: string,\n port: number,\n): Promise<void> {\n const { initWorkspace } = await import('../../utils/init-workspace.js');\n const result = await initWorkspace({\n configPath,\n workspacePath,\n gatewayPort: port,\n });\n\n if (result.configCreated || result.workspaceCreated) {\n console.log('');\n console.log('👋 Welcome to xopc! Running first-time setup before starting the gateway...');\n console.log('');\n console.log('✅ First-time setup complete!');\n console.log(` Config: ${configPath}`);\n console.log(` Workspace: ${workspacePath}`);\n console.log(` Token: ${result.token.slice(0, 8)}...${result.token.slice(-8)}`);\n console.log('');\n console.log('💡 Tip: run `xopc onboard` anytime to configure models, channels, and more.');\n console.log('');\n }\n}\n\nexport async function runGatewayFromCliOptions(\n options: GatewayRunCliOptions,\n ctx: CLIContext,\n): Promise<void> {\n const tailscaleModes = new Set(['off', 'serve', 'funnel']);\n const tailscaleRaw =\n typeof options.tailscale === 'string' ? options.tailscale.trim().toLowerCase() : undefined;\n const tailscaleOverride =\n tailscaleRaw && tailscaleModes.has(tailscaleRaw)\n ? (tailscaleRaw as 'off' | 'serve' | 'funnel')\n : undefined;\n if (tailscaleRaw && !tailscaleOverride) {\n console.error(`Invalid --tailscale mode \"${tailscaleRaw}\". Use: off, serve, funnel.`);\n process.exit(1);\n }\n\n if (tailscaleOverride && tailscaleOverride !== 'off') {\n process.env.XOPC_GATEWAY_TAILSCALE_MODE = tailscaleOverride;\n }\n if (options.tailscaleResetOnExit === true) {\n process.env.XOPC_GATEWAY_TAILSCALE_RESET_ON_EXIT = '1';\n }\n\n const [{ loadConfig }, { resolveConfigPath }, { runGatewayLoop }, gatewayPorts] = await Promise.all([\n import('../../../config/index.js'),\n import('../../../config/paths.js'),\n import('../../../gateway/run-loop.js'),\n import('../../../gateway/ports.js'),\n ]);\n const { checkPortAvailable, forceFreePortAndWait } = gatewayPorts;\n const config = loadConfig(ctx.configPath);\n\n const bindFromFlagRaw =\n typeof options.bind === 'string' && options.bind.trim().length > 0\n ? options.bind.trim().toLowerCase()\n : undefined;\n const bindModes = new Set(['auto', 'loopback', 'lan', 'tailnet', 'custom']);\n const bindFromFlag = bindFromFlagRaw && bindModes.has(bindFromFlagRaw)\n ? (bindFromFlagRaw as import('../../../config/schema.js').GatewayBindMode)\n : undefined;\n if (bindFromFlagRaw && !bindFromFlag) {\n console.error(`Invalid --bind mode \"${bindFromFlagRaw}\". Use: loopback, lan, auto, custom, tailnet.`);\n process.exit(1);\n }\n\n const portRaw = options.port;\n const portFromFlag =\n portRaw !== undefined && portRaw !== null && String(portRaw).trim().length > 0\n ? parseInt(String(portRaw), 10)\n : undefined;\n\n const { resolveGatewayListenPlan } = await import('../../../gateway/listen.js');\n const listenPlan = resolveGatewayListenPlan({\n cfg: config,\n bindOverride: bindFromFlag,\n });\n const bindHost = listenPlan.bindHost;\n const port =\n portFromFlag !== undefined && Number.isFinite(portFromFlag)\n ? portFromFlag\n : (typeof config.gateway.port === 'number' ? config.gateway.port : 18790);\n\n await ensureGatewayReady(ctx.configPath, ctx.workspacePath, port);\n\n const effectiveConfig = loadConfig(ctx.configPath);\n const { resolveGatewayAuth, assertGatewayAuthConfigured } = await import('../../../gateway/auth.js');\n const { assertGatewayRuntimeConfig } = await import('../../../gateway/runtime-config.js');\n\n let auth = resolveGatewayAuth({ authConfig: effectiveConfig.gateway?.auth });\n if (typeof options.token === 'string' && options.token.trim().length > 0) {\n auth = { mode: 'token', token: options.token.trim() };\n }\n try {\n assertGatewayAuthConfigured(auth);\n assertGatewayRuntimeConfig({\n cfg: effectiveConfig,\n auth,\n bindOverride: bindFromFlag,\n port,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`Gateway refused to start: ${message}`);\n process.exit(1);\n }\n\n if (options.force) {\n try {\n const result = await forceFreePortAndWait(port, {\n timeoutMs: 2000,\n sigtermTimeoutMs: 700,\n });\n if (result.killed.length > 0) {\n console.log(`Force killed ${result.killed.length} process(es) on port ${port}`);\n if (result.escalatedToSigkill) {\n console.log('Escalated to SIGKILL');\n }\n }\n } catch (err) {\n console.error(`Failed to free port ${port}: ${String(err)}`);\n process.exit(1);\n }\n }\n\n const portAvailable = await checkPortAvailable(port, bindHost);\n if (!portAvailable) {\n console.error(`Port ${port} is already in use. Use --force to kill existing process.`);\n process.exit(1);\n }\n\n console.log('🚀 Starting xopc gateway...');\n console.log(` Bind: ${listenPlan.bindMode} (${bindHost})`);\n console.log(` Port: ${port}`);\n console.log('');\n console.log('Press Ctrl+C to stop');\n console.log('');\n\n await runGatewayLoop({\n configPath: ctx.configPath || resolveConfigPath(),\n port,\n start: async () => {\n const { GatewayServer } = await import('../../../gateway/index.js');\n const server = new GatewayServer({\n bindHost: listenPlan.bindHost,\n bind: listenPlan.bindMode,\n customBindHost: listenPlan.customBindHost,\n port,\n token: options.token || config?.gateway?.auth?.token,\n verbose: ctx.isVerbose,\n configPath: ctx.configPath,\n enableHotReload: options.hotReload,\n });\n await server.start();\n\n const displayHost = bindHost === '0.0.0.0' ? 'localhost' : bindHost;\n const token = options.token || config?.gateway?.auth?.token;\n console.log('✅ Gateway started');\n console.log(` URL: http://${displayHost}:${port}`);\n if (token) {\n console.log(` Token: ${token.slice(0, 8)}...${token.slice(-8)}`);\n }\n console.log('');\n\n return server;\n },\n });\n}\n"],"mappings":"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"}
|
|
@@ -8,8 +8,8 @@ import { formatExamples, register } from "../registry.js";
|
|
|
8
8
|
import { getContextWithOpts } from "../context.js";
|
|
9
9
|
import "../../agent/image/index.js";
|
|
10
10
|
import { colors } from "../utils/colors.js";
|
|
11
|
-
import { mkdir, writeFile } from "node:fs/promises";
|
|
12
11
|
import { join, resolve } from "node:path";
|
|
12
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
13
13
|
import { Command } from "commander";
|
|
14
14
|
//#region src/cli/commands/image.ts
|
|
15
15
|
init_loader();
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { createLogger } from "../../utils/logger/index.js";
|
|
2
|
-
import { init_logger } from "../../utils/logger.js";
|
|
3
1
|
import { resolveStateDir } from "../../config/paths-state.js";
|
|
4
2
|
import { resolveAgentWorkspaceDir } from "../../agent/agent-scope.js";
|
|
3
|
+
import { createLogger } from "../../utils/logger/index.js";
|
|
4
|
+
import { init_logger } from "../../utils/logger.js";
|
|
5
5
|
import { WORKSPACE_FILES, init_paths, resolveAgentDir, resolveAgentHomeDir, resolveAgentProfileDir, resolveConfigPath } from "../../config/paths.js";
|
|
6
6
|
import { init_loader, loadConfig, saveConfig } from "../../config/loader.js";
|
|
7
7
|
import { formatExamples, register } from "../registry.js";
|
|
8
|
-
import { mkdir, writeFile } from "fs/promises";
|
|
9
8
|
import { join } from "path";
|
|
10
9
|
import { existsSync } from "fs";
|
|
10
|
+
import { mkdir, writeFile } from "fs/promises";
|
|
11
11
|
import { Command } from "commander";
|
|
12
12
|
//#region src/cli/commands/init.ts
|
|
13
13
|
init_logger();
|