@xopcai/xopc 0.0.86 → 0.0.87
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/feishu/src/adapters/cli-login.js +3 -3
- package/dist/extensions/feishu/src/adapters/cli-login.js.map +1 -1
- package/dist/extensions/telegram/src/delivery-chat-id.d.ts +1 -1
- package/dist/extensions/telegram/src/delivery-chat-id.js +1 -1
- package/dist/extensions/telegram/src/delivery-chat-id.js.map +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +1 -0
- package/dist/extensions/telegram/src/routing-integration.js.map +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +2 -2
- package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +1 -1
- package/dist/extensions/weixin/src/api/api.js +2 -2
- package/dist/extensions/weixin/src/api/api.js.map +1 -1
- package/dist/extensions/weixin/src/auth/accounts.js +12 -12
- package/dist/extensions/weixin/src/auth/accounts.js.map +1 -1
- package/dist/extensions/weixin/src/delivery-to.js +2 -2
- package/dist/extensions/weixin/src/delivery-to.js.map +1 -1
- package/dist/extensions/weixin/src/messaging/debug-mode.js +5 -5
- package/dist/extensions/weixin/src/messaging/debug-mode.js.map +1 -1
- package/dist/extensions/weixin/src/messaging/inbound.js +11 -11
- package/dist/extensions/weixin/src/messaging/inbound.js.map +1 -1
- package/dist/extensions/weixin/src/storage/sync-buf.js +4 -4
- package/dist/extensions/weixin/src/storage/sync-buf.js.map +1 -1
- package/dist/extensions/weixin/src/workflow-progress.d.ts +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js.map +1 -1
- package/dist/gateway/static/root/assets/{agents-mS3_HpRI.js → agents-BEAbXpuP.js} +6 -6
- package/dist/gateway/static/root/assets/{apps-page-DrfytjOb.js → apps-page-Dg8R-Szf.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-settings-BG6b9KrW.js → channels-settings-yohw9YSu.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-status-swr-Bs5kMCMI.js → channels-status-swr-BSHqqCF1.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-api-BuVcZ5zR.js → cron-api-0h_QT8U3.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-BMrloeFH.js → cron-page-BkfKFfFk.js} +1 -1
- package/dist/gateway/static/root/assets/{dist-CKU1OOTf.js → dist-Cmjp2APP.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-BdW_46sN.js → extension-debug-page-CFa9z_1N.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-DW47KI82.js → extension-page-BI8eaTPq.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-B-W4x2xP.js → extension-settings-page-x4BB7q1X.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-B2MYHbWg.js → fetch-DRqwef_Q.js} +1 -1
- package/dist/gateway/static/root/assets/{field-primitives-DPG-oJmx.js → field-primitives-BiNHBo2Y.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-C8dNts9i.js → heartbeat-config-api-ZRb8qhuz.js} +1 -1
- package/dist/gateway/static/root/assets/{index-BmVYculr.js → index-Cu7bKuUi.js} +96 -94
- package/dist/gateway/static/root/assets/index-a5gWIdZQ.css +1 -0
- package/dist/gateway/static/root/assets/{logs-page-sTsVWz0X.js → logs-page-BFZ8GgCv.js} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-FaG_Vlkb.js → sessions-page-CD7AfB-2.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-DuvRQW--.js → settings-form-section-DiqqVs6m.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-Bet1OerL.js → settings-page-BBOjEQW3.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-BtG2kLDh.js → share-preview-page-n1Gprylk.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page-DhUO235y.js → skills-page-CcN_gj--.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-DryYl3qD.js → theme-store-CZOh1nT3.js} +1 -1
- package/dist/gateway/static/root/assets/url-Dd8Q7kZZ.js +3 -0
- package/dist/gateway/static/root/assets/{utils-BY7bU1DT.js → utils-CkWBfxs4.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-CGEydndO.js → voice-api-key-field-O6awz9hi.js} +1 -1
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-scope.d.ts +4 -0
- package/dist/src/agent/agent-scope.js +53 -10
- package/dist/src/agent/agent-scope.js.map +1 -1
- package/dist/src/agent/bootstrap/filter-bootstrap-files.js +2 -1
- package/dist/src/agent/bootstrap/filter-bootstrap-files.js.map +1 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js +2 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
- package/dist/src/agent/embedded/tool-result-truncation.js +2 -1
- package/dist/src/agent/embedded/tool-result-truncation.js.map +1 -1
- package/dist/src/agent/fallback/candidates.js +2 -2
- package/dist/src/agent/fallback/candidates.js.map +1 -1
- package/dist/src/agent/goals/persistent-goal-apis.d.ts +0 -2
- package/dist/src/agent/goals/persistent-goal-service.js +0 -1
- package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
- package/dist/src/agent/image/generation/normalization.js +2 -12
- package/dist/src/agent/image/generation/normalization.js.map +1 -1
- package/dist/src/agent/image/generation/provider-registry.d.ts +4 -8
- package/dist/src/agent/image/generation/provider-registry.js.map +1 -1
- package/dist/src/agent/image/generation/runtime.d.ts +2 -2
- package/dist/src/agent/image/generation/runtime.js.map +1 -1
- package/dist/src/agent/image/generation/types.d.ts +0 -18
- package/dist/src/agent/image/image-helpers.js +6 -1
- package/dist/src/agent/image/image-helpers.js.map +1 -1
- package/dist/src/agent/image/index.d.ts +1 -1
- package/dist/src/agent/inbound/inbound-loop.d.ts +5 -0
- package/dist/src/agent/inbound/inbound-loop.js +41 -10
- package/dist/src/agent/inbound/inbound-loop.js.map +1 -1
- package/dist/src/agent/inbound/turn-dispatcher.d.ts +4 -0
- package/dist/src/agent/inbound/turn-dispatcher.js +6 -4
- package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.js +2 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.js.map +1 -1
- package/dist/src/agent/mcp/bundle-mcp-names.js +2 -1
- package/dist/src/agent/mcp/bundle-mcp-names.js.map +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +2 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js.map +1 -1
- package/dist/src/agent/mcp/mcp-transport-config.js +2 -1
- package/dist/src/agent/mcp/mcp-transport-config.js.map +1 -1
- package/dist/src/agent/mcp/mcp-transport.js +2 -1
- package/dist/src/agent/mcp/mcp-transport.js.map +1 -1
- package/dist/src/agent/media-generation/runtime-shared.js +2 -9
- package/dist/src/agent/media-generation/runtime-shared.js.map +1 -1
- package/dist/src/agent/messaging/command-handler.d.ts +6 -0
- package/dist/src/agent/messaging/command-handler.js +5 -0
- package/dist/src/agent/messaging/command-handler.js.map +1 -1
- package/dist/src/agent/prompt/safety.d.ts +0 -7
- package/dist/src/agent/prompt/safety.js +1 -20
- package/dist/src/agent/prompt/safety.js.map +1 -1
- package/dist/src/agent/service/build-direct-message-content.js +1 -1
- package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
- package/dist/src/agent/service/direct-turn-helpers.d.ts +3 -1
- package/dist/src/agent/service/direct-turn-helpers.js +6 -1
- package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
- package/dist/src/agent/service/process-direct-one-shot.d.ts +4 -0
- package/dist/src/agent/service/process-direct-one-shot.js +15 -2
- package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.d.ts +4 -0
- package/dist/src/agent/service/process-direct-streaming.js +34 -4
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service/webchat-tts.js +1 -1
- package/dist/src/agent/service/webchat-tts.js.map +1 -1
- package/dist/src/agent/service.d.ts +8 -0
- package/dist/src/agent/service.js +21 -1
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/tools/create-share-tool.js +27 -20
- package/dist/src/agent/tools/create-share-tool.js.map +1 -1
- package/dist/src/agent/tools/factory.js +1 -1
- package/dist/src/agent/tools/index.d.ts +0 -1
- package/dist/src/agent/tools/index.js +4 -5
- package/dist/src/agent/tools/shell.js +0 -13
- package/dist/src/agent/tools/shell.js.map +1 -1
- package/dist/src/agent/tools/workflow-tool.js +7 -1
- package/dist/src/agent/tools/workflow-tool.js.map +1 -1
- package/dist/src/agent/workflow/channel-capability.d.ts +3 -3
- package/dist/src/agent/workflow/lint.d.ts +38 -0
- package/dist/src/agent/workflow/lint.js +74 -0
- package/dist/src/agent/workflow/lint.js.map +1 -0
- package/dist/src/agent/workflow/parser.js +4 -1
- package/dist/src/agent/workflow/parser.js.map +1 -1
- package/dist/src/agent/workflow/runtime.d.ts +3 -0
- package/dist/src/agent/workflow/runtime.js +76 -3
- package/dist/src/agent/workflow/runtime.js.map +1 -1
- package/dist/src/agent/workflow/types.d.ts +3 -1
- package/dist/src/browser/index.js +4 -4
- package/dist/src/browser/manager.d.ts +1 -3
- package/dist/src/browser/manager.js +0 -6
- package/dist/src/browser/manager.js.map +1 -1
- package/dist/src/browser/providers/browser-ext-install.d.ts +4 -4
- package/dist/src/browser/providers/browser-ext-install.js +38 -85
- package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
- package/dist/src/browser/providers/cloakbrowser.d.ts +0 -5
- package/dist/src/browser/providers/cloakbrowser.js +2 -55
- package/dist/src/browser/providers/cloakbrowser.js.map +1 -1
- package/dist/src/channels/attachments/voice-stt-webchat.js +10 -8
- package/dist/src/channels/attachments/voice-stt-webchat.js.map +1 -1
- package/dist/src/channels/pairing/allow-from-file.js +9 -9
- package/dist/src/channels/pairing/allow-from-file.js.map +1 -1
- package/dist/src/channels/pairing/pairing-store.js +6 -6
- package/dist/src/channels/pairing/pairing-store.js.map +1 -1
- package/dist/src/chat-commands/builtins/session.js +1 -1
- package/dist/src/chat-commands/builtins/session.js.map +1 -1
- package/dist/src/chat-commands/builtins/tts.js +2 -2
- package/dist/src/chat-commands/builtins/tts.js.map +1 -1
- package/dist/src/chat-commands/context.d.ts +3 -0
- package/dist/src/chat-commands/context.js +21 -3
- package/dist/src/chat-commands/context.js.map +1 -1
- package/dist/src/chat-commands/session-key.d.ts +4 -37
- package/dist/src/chat-commands/session-key.js +49 -85
- package/dist/src/chat-commands/session-key.js.map +1 -1
- package/dist/src/chat-commands/types.d.ts +2 -0
- package/dist/src/cli/commands/agent/interactive.js +2 -2
- package/dist/src/cli/commands/agent/interactive.js.map +1 -1
- package/dist/src/cli/commands/agent/sessions.js +2 -2
- package/dist/src/cli/commands/agent/sessions.js.map +1 -1
- package/dist/src/cli/commands/agent.js +4 -5
- package/dist/src/cli/commands/agent.js.map +1 -1
- package/dist/src/cli/commands/channels.js +1 -5
- package/dist/src/cli/commands/channels.js.map +1 -1
- package/dist/src/cli/commands/gateway/lifecycle-core.js +1 -1
- package/dist/src/cli/commands/gateway/lifecycle-core.js.map +1 -1
- package/dist/src/cli/commands/gateway/logs.d.ts +9 -0
- package/dist/src/cli/commands/gateway/logs.js +50 -17
- package/dist/src/cli/commands/gateway/logs.js.map +1 -1
- package/dist/src/cli/commands/image.js +22 -21
- package/dist/src/cli/commands/image.js.map +1 -1
- package/dist/src/cli/commands/session/utils.js +2 -2
- package/dist/src/cli/commands/session/utils.js.map +1 -1
- package/dist/src/cli/commands/update.js +26 -46
- package/dist/src/cli/commands/update.js.map +1 -1
- package/dist/src/cli/utils/session.d.ts +0 -5
- package/dist/src/cli/utils/session.js +1 -6
- package/dist/src/cli/utils/session.js.map +1 -1
- package/dist/src/commands/agents.config.js +1 -1
- package/dist/src/commands/agents.config.js.map +1 -1
- package/dist/src/config/agent-profile.js +5 -27
- package/dist/src/config/agent-profile.js.map +1 -1
- package/dist/src/config/index.js +2 -2
- package/dist/src/config/model-input.js +2 -5
- package/dist/src/config/model-input.js.map +1 -1
- package/dist/src/config/schema.d.ts +201 -217
- package/dist/src/config/schema.js +54 -39
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/workspace-path-helpers.d.ts +1 -2
- package/dist/src/config/workspace-path-helpers.js.map +1 -1
- package/dist/src/daemon/install-plan.js +25 -1
- package/dist/src/daemon/install-plan.js.map +1 -1
- package/dist/src/daemon/launchd.d.ts +8 -0
- package/dist/src/daemon/launchd.js +5 -12
- package/dist/src/daemon/launchd.js.map +1 -1
- package/dist/src/daemon/schtasks.d.ts +25 -0
- package/dist/src/daemon/schtasks.js +166 -46
- package/dist/src/daemon/schtasks.js.map +1 -1
- package/dist/src/daemon/service.js +5 -4
- package/dist/src/daemon/service.js.map +1 -1
- package/dist/src/daemon/systemd.d.ts +6 -0
- package/dist/src/daemon/systemd.js +18 -3
- package/dist/src/daemon/systemd.js.map +1 -1
- package/dist/src/extensions/activation-context.js +0 -1
- package/dist/src/extensions/activation-context.js.map +1 -1
- package/dist/src/extensions/normalize-manifest.js +0 -1
- package/dist/src/extensions/normalize-manifest.js.map +1 -1
- package/dist/src/extensions/types/manifest.d.ts +0 -2
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/agent-builtin-tools.js +1 -0
- package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
- package/dist/src/gateway/agents-admin.js +10 -2
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/heartbeat/service.js +2 -2
- package/dist/src/gateway/heartbeat/service.js.map +1 -1
- package/dist/src/gateway/hono/app.js +1 -1
- package/dist/src/gateway/hono/lib/agent-model.d.ts +18 -10
- package/dist/src/gateway/hono/lib/agent-model.js +24 -35
- package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.js +1 -1
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/lib/safe-voice-config.js +14 -53
- package/dist/src/gateway/hono/lib/safe-voice-config.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/agents.js +17 -5
- package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/channels.js +0 -11
- package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/goals.js +1 -1
- package/dist/src/gateway/hono/routes/goals.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +28 -7
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/shares.js +14 -12
- package/dist/src/gateway/hono/routes/shares.js.map +1 -1
- package/dist/src/gateway/hono/routes/tunnel.js +1 -1
- package/dist/src/gateway/hono/routes/update.js +4 -2
- package/dist/src/gateway/hono/routes/update.js.map +1 -1
- package/dist/src/gateway/hono/sse.js +16 -33
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/lock.js +10 -10
- package/dist/src/gateway/lock.js.map +1 -1
- package/dist/src/gateway/ports.js +6 -6
- package/dist/src/gateway/ports.js.map +1 -1
- package/dist/src/gateway/resolve-webchat-session-key.d.ts +19 -0
- package/dist/src/gateway/resolve-webchat-session-key.js +46 -0
- package/dist/src/gateway/resolve-webchat-session-key.js.map +1 -0
- package/dist/src/gateway/service/run-gateway-agent.js +27 -11
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service/sessions-api.d.ts +3 -0
- package/dist/src/gateway/service/sessions-api.js +8 -0
- package/dist/src/gateway/service/sessions-api.js.map +1 -1
- package/dist/src/gateway/service.d.ts +0 -2
- package/dist/src/gateway/service.js +2 -7
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/gateway/session-reset-service.d.ts +20 -0
- package/dist/src/gateway/session-reset-service.js +54 -0
- package/dist/src/gateway/session-reset-service.js.map +1 -0
- package/dist/src/gateway/startup-readiness.d.ts +1 -1
- package/dist/src/gateway/startup-readiness.js +1 -0
- package/dist/src/gateway/startup-readiness.js.map +1 -1
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/infra/gateway-processes.js +2 -2
- package/dist/src/infra/gateway-processes.js.map +1 -1
- package/dist/src/infra/run-command.d.ts +16 -0
- package/dist/src/infra/run-command.js +67 -0
- package/dist/src/infra/run-command.js.map +1 -0
- package/dist/src/infra/update-global.d.ts +45 -0
- package/dist/src/infra/update-global.js +224 -0
- package/dist/src/infra/update-global.js.map +1 -0
- package/dist/src/mcp/channel-bridge.js +1 -1
- package/dist/src/mcp/channel-shared.js +2 -1
- package/dist/src/mcp/channel-shared.js.map +1 -1
- package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
- package/dist/src/providers/auth-runtime/auth-profile-store.js.map +1 -1
- package/dist/src/providers/auth-runtime/resolve-auth.js +1 -12
- package/dist/src/providers/auth-runtime/resolve-auth.js.map +1 -1
- package/dist/src/providers/auth-runtime/types.d.ts +6 -12
- package/dist/src/routing/agent-session-key.d.ts +58 -0
- package/dist/src/routing/agent-session-key.js +164 -0
- package/dist/src/routing/agent-session-key.js.map +1 -0
- package/dist/src/routing/index.d.ts +1 -1
- package/dist/src/routing/index.js +4 -2
- package/dist/src/routing/index.js.map +1 -1
- package/dist/src/routing/resolve-route.d.ts +15 -0
- package/dist/src/routing/resolve-route.js +41 -20
- package/dist/src/routing/resolve-route.js.map +1 -1
- package/dist/src/routing/resolve-tui-session-key.d.ts +25 -0
- package/dist/src/routing/resolve-tui-session-key.js +54 -0
- package/dist/src/routing/resolve-tui-session-key.js.map +1 -0
- package/dist/src/routing/session-key-utils.d.ts +24 -0
- package/dist/src/routing/session-key-utils.js +92 -0
- package/dist/src/routing/session-key-utils.js.map +1 -0
- package/dist/src/routing/session-key.d.ts +19 -49
- package/dist/src/routing/session-key.js +143 -116
- package/dist/src/routing/session-key.js.map +1 -1
- package/dist/src/session/index.d.ts +6 -0
- package/dist/src/session/index.js +7 -1
- package/dist/src/session/init-session-turn.d.ts +30 -0
- package/dist/src/session/init-session-turn.js +102 -0
- package/dist/src/session/init-session-turn.js.map +1 -0
- package/dist/src/session/lifecycle-timestamps.d.ts +8 -0
- package/dist/src/session/lifecycle-timestamps.js +16 -0
- package/dist/src/session/lifecycle-timestamps.js.map +1 -0
- package/dist/src/session/manager.d.ts +7 -1
- package/dist/src/session/manager.js +8 -1
- package/dist/src/session/manager.js.map +1 -1
- package/dist/src/session/parity/transcript-paths.js +2 -2
- package/dist/src/session/parity/transcript-paths.js.map +1 -1
- package/dist/src/session/parity/xopc-session-disk-entry.d.ts +6 -0
- package/dist/src/session/reset-policy.d.ts +32 -0
- package/dist/src/session/reset-policy.js +65 -0
- package/dist/src/session/reset-policy.js.map +1 -0
- package/dist/src/session/reset-triggers.d.ts +20 -0
- package/dist/src/session/reset-triggers.js +63 -0
- package/dist/src/session/reset-triggers.js.map +1 -0
- package/dist/src/session/reset-type.d.ts +12 -0
- package/dist/src/session/reset-type.js +25 -0
- package/dist/src/session/reset-type.js.map +1 -0
- package/dist/src/session/resolve-session.d.ts +30 -0
- package/dist/src/session/resolve-session.js +93 -0
- package/dist/src/session/resolve-session.js.map +1 -0
- package/dist/src/session/session-title.js +3 -2
- package/dist/src/session/session-title.js.map +1 -1
- package/dist/src/session/store.d.ts +11 -4
- package/dist/src/session/store.js +57 -6
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/transcript-events.js +2 -1
- package/dist/src/session/transcript-events.js.map +1 -1
- package/dist/src/share/share-url.d.ts +33 -0
- package/dist/src/share/share-url.js +56 -14
- package/dist/src/share/share-url.js.map +1 -1
- package/dist/src/tui/backends/embedded-backend.js +4 -9
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.js +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/components/chat-log.js +3 -3
- package/dist/src/tui/components/chat-log.js.map +1 -1
- package/dist/src/tui/theme.d.ts +0 -2
- package/dist/src/tui/theme.js +1 -3
- package/dist/src/tui/theme.js.map +1 -1
- package/dist/src/tui/tui-commands.d.ts +3 -0
- package/dist/src/tui/tui-commands.js +45 -10
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/tui/tui-keybindings-file.js +1 -21
- package/dist/src/tui/tui-keybindings-file.js.map +1 -1
- package/dist/src/tui/tui-session-actions.d.ts +28 -0
- package/dist/src/tui/tui-session-actions.js +88 -0
- package/dist/src/tui/tui-session-actions.js.map +1 -0
- package/dist/src/tui/tui.js +52 -47
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/utils/string-coerce.d.ts +2 -0
- package/dist/src/utils/string-coerce.js +10 -1
- package/dist/src/utils/string-coerce.js.map +1 -1
- package/dist/src/voice/stt/config-slice.d.ts +2 -5
- package/dist/src/voice/stt/config-slice.js +5 -26
- package/dist/src/voice/stt/config-slice.js.map +1 -1
- package/dist/src/voice/stt/types.d.ts +1 -18
- package/dist/src/voice/stt/types.js +4 -2
- package/dist/src/voice/stt/types.js.map +1 -1
- package/dist/src/voice/tts/config-slice.d.ts +3 -7
- package/dist/src/voice/tts/config-slice.js +7 -38
- package/dist/src/voice/tts/config-slice.js.map +1 -1
- package/dist/src/voice/tts/merge-config.js +2 -48
- package/dist/src/voice/tts/merge-config.js.map +1 -1
- package/dist/src/voice/tts/providers/alibaba-speech.js +1 -1
- package/dist/src/voice/tts/providers/alibaba-speech.js.map +1 -1
- package/dist/src/voice/tts/types.d.ts +1 -29
- package/dist/src/voice/tts/types.js +19 -17
- package/dist/src/voice/tts/types.js.map +1 -1
- package/package.json +1 -4
- package/dist/gateway/static/root/assets/index-ew_2L2We.css +0 -1
- package/dist/gateway/static/root/assets/url-BwNL6Rgk.js +0 -3
- package/dist/src/agent/tools/browser-legacy-tools.d.ts +0 -17
- package/dist/src/agent/tools/browser-legacy-tools.js +0 -766
- package/dist/src/agent/tools/browser-legacy-tools.js.map +0 -1
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
declare function parseLineCount(value: string | number | undefined): number;
|
|
3
|
+
declare function resolveGatewayLogPath(configPath: string): string;
|
|
4
|
+
declare function readLastLines(filePath: string, lineCount: number): Promise<string>;
|
|
2
5
|
/**
|
|
3
6
|
* Create logs subcommand
|
|
4
7
|
*/
|
|
5
8
|
export declare function createLogsCommand(): Command;
|
|
9
|
+
export declare const gatewayLogsTestInternals: {
|
|
10
|
+
parseLineCount: typeof parseLineCount;
|
|
11
|
+
readLastLines: typeof readLastLines;
|
|
12
|
+
resolveGatewayLogPath: typeof resolveGatewayLogPath;
|
|
13
|
+
};
|
|
14
|
+
export {};
|
|
@@ -1,39 +1,72 @@
|
|
|
1
1
|
import { getContextWithOpts } from "../../context.js";
|
|
2
|
-
import
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { existsSync, statSync, watch } from "node:fs";
|
|
4
|
+
import { readFile } from "node:fs/promises";
|
|
3
5
|
import { Command } from "commander";
|
|
4
6
|
//#region src/cli/commands/gateway/logs.ts
|
|
7
|
+
function parseLineCount(value) {
|
|
8
|
+
const parsed = parseInt(String(value ?? "50"), 10);
|
|
9
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : 50;
|
|
10
|
+
}
|
|
11
|
+
function resolveGatewayLogPath(configPath) {
|
|
12
|
+
const logDir = process.env.XOPC_LOG_DIR || path.join(path.dirname(configPath), "logs");
|
|
13
|
+
return path.join(logDir, "app.log");
|
|
14
|
+
}
|
|
15
|
+
async function readLastLines(filePath, lineCount) {
|
|
16
|
+
if (!existsSync(filePath)) return "No logs found\n";
|
|
17
|
+
const lines = (await readFile(filePath, "utf8")).split(/\r?\n/);
|
|
18
|
+
const selectedLines = (lines.at(-1) === "" ? lines.slice(0, -1) : lines).slice(-lineCount);
|
|
19
|
+
return `${selectedLines.join("\n")}${selectedLines.length > 0 ? "\n" : ""}`;
|
|
20
|
+
}
|
|
21
|
+
async function followLogFile(filePath, lineCount) {
|
|
22
|
+
process.stdout.write(await readLastLines(filePath, lineCount));
|
|
23
|
+
let lastSize = existsSync(filePath) ? statSync(filePath).size : 0;
|
|
24
|
+
const directory = path.dirname(filePath);
|
|
25
|
+
const fileName = path.basename(filePath);
|
|
26
|
+
watch(directory, async (_eventType, changedFileName) => {
|
|
27
|
+
if (changedFileName && changedFileName.toString() !== fileName) return;
|
|
28
|
+
if (!existsSync(filePath)) {
|
|
29
|
+
lastSize = 0;
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const nextSize = statSync(filePath).size;
|
|
33
|
+
if (nextSize < lastSize) lastSize = 0;
|
|
34
|
+
if (nextSize === lastSize) return;
|
|
35
|
+
const content = await readFile(filePath, "utf8");
|
|
36
|
+
process.stdout.write(content.slice(lastSize));
|
|
37
|
+
lastSize = nextSize;
|
|
38
|
+
});
|
|
39
|
+
}
|
|
5
40
|
/**
|
|
6
41
|
* Create logs subcommand
|
|
7
42
|
*/
|
|
8
43
|
function createLogsCommand() {
|
|
9
44
|
return new Command("logs").description("View gateway logs").option("--lines <n>", "Number of lines to show", "50").option("--follow", "Follow log output (like tail -f)").action(async (options) => {
|
|
10
45
|
const ctx = getContextWithOpts();
|
|
11
|
-
const
|
|
46
|
+
const lineCount = parseLineCount(options.lines);
|
|
47
|
+
const logPath = resolveGatewayLogPath(ctx.configPath);
|
|
12
48
|
try {
|
|
13
49
|
if (options.follow) {
|
|
14
50
|
console.log(`📜 Following gateway logs (Ctrl+C to exit)...\n`);
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
"-n",
|
|
18
|
-
options.lines,
|
|
19
|
-
`${logDir}/app.log`
|
|
20
|
-
], { stdio: "inherit" }).on("error", (err) => {
|
|
21
|
-
console.error("❌ Failed to tail logs:", err.message);
|
|
22
|
-
process.exit(1);
|
|
23
|
-
});
|
|
24
|
-
} else {
|
|
25
|
-
const output = execSync(`tail -n ${options.lines} ${logDir}/app.log 2>/dev/null || echo "No logs found"`, { encoding: "utf-8" });
|
|
26
|
-
console.log(`📜 Last ${options.lines} lines of gateway logs:\n`);
|
|
27
|
-
console.log(output);
|
|
28
|
-
process.exit(0);
|
|
51
|
+
await followLogFile(logPath, lineCount);
|
|
52
|
+
return;
|
|
29
53
|
}
|
|
54
|
+
const output = await readLastLines(logPath, lineCount);
|
|
55
|
+
console.log(`📜 Last ${lineCount} lines of gateway logs:\n`);
|
|
56
|
+
console.log(output);
|
|
57
|
+
process.exit(0);
|
|
30
58
|
} catch (err) {
|
|
31
59
|
console.error("❌ Failed to read logs:", err);
|
|
32
60
|
process.exit(1);
|
|
33
61
|
}
|
|
34
62
|
});
|
|
35
63
|
}
|
|
64
|
+
const gatewayLogsTestInternals = {
|
|
65
|
+
parseLineCount,
|
|
66
|
+
readLastLines,
|
|
67
|
+
resolveGatewayLogPath
|
|
68
|
+
};
|
|
36
69
|
//#endregion
|
|
37
|
-
export { createLogsCommand };
|
|
70
|
+
export { createLogsCommand, gatewayLogsTestInternals };
|
|
38
71
|
|
|
39
72
|
//# sourceMappingURL=logs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.js","names":[],"sources":["../../../../../src/cli/commands/gateway/logs.ts"],"sourcesContent":["import { Command } from 'commander';\nimport {
|
|
1
|
+
{"version":3,"file":"logs.js","names":[],"sources":["../../../../../src/cli/commands/gateway/logs.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { existsSync, statSync, watch } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { getContextWithOpts } from '../../context.js';\n\nfunction parseLineCount(value: string | number | undefined): number {\n const parsed = parseInt(String(value ?? '50'), 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 50;\n}\n\nfunction resolveGatewayLogPath(configPath: string): string {\n const logDir = process.env.XOPC_LOG_DIR || path.join(path.dirname(configPath), 'logs');\n return path.join(logDir, 'app.log');\n}\n\nasync function readLastLines(filePath: string, lineCount: number): Promise<string> {\n if (!existsSync(filePath)) {\n return 'No logs found\\n';\n }\n\n const content = await readFile(filePath, 'utf8');\n const lines = content.split(/\\r?\\n/);\n const trailingEmptyLine = lines.at(-1) === '';\n const logLines = trailingEmptyLine ? lines.slice(0, -1) : lines;\n const selectedLines = logLines.slice(-lineCount);\n return `${selectedLines.join('\\n')}${selectedLines.length > 0 ? '\\n' : ''}`;\n}\n\nasync function followLogFile(filePath: string, lineCount: number): Promise<void> {\n process.stdout.write(await readLastLines(filePath, lineCount));\n let lastSize = existsSync(filePath) ? statSync(filePath).size : 0;\n\n const directory = path.dirname(filePath);\n const fileName = path.basename(filePath);\n watch(directory, async (_eventType, changedFileName) => {\n if (changedFileName && changedFileName.toString() !== fileName) {\n return;\n }\n if (!existsSync(filePath)) {\n lastSize = 0;\n return;\n }\n\n const nextSize = statSync(filePath).size;\n if (nextSize < lastSize) {\n lastSize = 0;\n }\n if (nextSize === lastSize) {\n return;\n }\n\n const content = await readFile(filePath, 'utf8');\n process.stdout.write(content.slice(lastSize));\n lastSize = nextSize;\n });\n}\n\n/**\n * Create logs subcommand\n */\nexport function createLogsCommand(): Command {\n return new Command('logs')\n .description('View gateway logs')\n .option('--lines <n>', 'Number of lines to show', '50')\n .option('--follow', 'Follow log output (like tail -f)')\n .action(async (options) => {\n const ctx = getContextWithOpts();\n const lineCount = parseLineCount(options.lines);\n const logPath = resolveGatewayLogPath(ctx.configPath);\n\n try {\n if (options.follow) {\n console.log(`📜 Following gateway logs (Ctrl+C to exit)...\\n`);\n await followLogFile(logPath, lineCount);\n return;\n }\n\n const output = await readLastLines(logPath, lineCount);\n console.log(`📜 Last ${lineCount} lines of gateway logs:\\n`);\n console.log(output);\n process.exit(0);\n } catch (err) {\n console.error('❌ Failed to read logs:', err);\n process.exit(1);\n }\n });\n}\n\nexport const gatewayLogsTestInternals = {\n parseLineCount,\n readLastLines,\n resolveGatewayLogPath,\n};\n"],"mappings":";;;;;;AAOA,SAAS,eAAe,OAA4C;CAClE,MAAM,SAAS,SAAS,OAAO,SAAS,KAAK,EAAE,GAAG;AAClD,QAAO,OAAO,SAAS,OAAO,IAAI,SAAS,IAAI,SAAS;;AAG1D,SAAS,sBAAsB,YAA4B;CACzD,MAAM,SAAS,QAAQ,IAAI,gBAAgB,KAAK,KAAK,KAAK,QAAQ,WAAW,EAAE,OAAO;AACtF,QAAO,KAAK,KAAK,QAAQ,UAAU;;AAGrC,eAAe,cAAc,UAAkB,WAAoC;AACjF,KAAI,CAAC,WAAW,SAAS,CACvB,QAAO;CAIT,MAAM,SAAQ,MADQ,SAAS,UAAU,OAAO,EAC1B,MAAM,QAAQ;CAGpC,MAAM,iBAFoB,MAAM,GAAG,GAAG,KAAK,KACN,MAAM,MAAM,GAAG,GAAG,GAAG,OAC3B,MAAM,CAAC,UAAU;AAChD,QAAO,GAAG,cAAc,KAAK,KAAK,GAAG,cAAc,SAAS,IAAI,OAAO;;AAGzE,eAAe,cAAc,UAAkB,WAAkC;AAC/E,SAAQ,OAAO,MAAM,MAAM,cAAc,UAAU,UAAU,CAAC;CAC9D,IAAI,WAAW,WAAW,SAAS,GAAG,SAAS,SAAS,CAAC,OAAO;CAEhE,MAAM,YAAY,KAAK,QAAQ,SAAS;CACxC,MAAM,WAAW,KAAK,SAAS,SAAS;AACxC,OAAM,WAAW,OAAO,YAAY,oBAAoB;AACtD,MAAI,mBAAmB,gBAAgB,UAAU,KAAK,SACpD;AAEF,MAAI,CAAC,WAAW,SAAS,EAAE;AACzB,cAAW;AACX;;EAGF,MAAM,WAAW,SAAS,SAAS,CAAC;AACpC,MAAI,WAAW,SACb,YAAW;AAEb,MAAI,aAAa,SACf;EAGF,MAAM,UAAU,MAAM,SAAS,UAAU,OAAO;AAChD,UAAQ,OAAO,MAAM,QAAQ,MAAM,SAAS,CAAC;AAC7C,aAAW;GACX;;;;;AAMJ,SAAgB,oBAA6B;AAC3C,QAAO,IAAI,QAAQ,OAAO,CACvB,YAAY,oBAAoB,CAChC,OAAO,eAAe,2BAA2B,KAAK,CACtD,OAAO,YAAY,mCAAmC,CACtD,OAAO,OAAO,YAAY;EACzB,MAAM,MAAM,oBAAoB;EAChC,MAAM,YAAY,eAAe,QAAQ,MAAM;EAC/C,MAAM,UAAU,sBAAsB,IAAI,WAAW;AAErD,MAAI;AACF,OAAI,QAAQ,QAAQ;AAClB,YAAQ,IAAI,kDAAkD;AAC9D,UAAM,cAAc,SAAS,UAAU;AACvC;;GAGF,MAAM,SAAS,MAAM,cAAc,SAAS,UAAU;AACtD,WAAQ,IAAI,WAAW,UAAU,2BAA2B;AAC5D,WAAQ,IAAI,OAAO;AACnB,WAAQ,KAAK,EAAE;WACR,KAAK;AACZ,WAAQ,MAAM,0BAA0B,IAAI;AAC5C,WAAQ,KAAK,EAAE;;GAEjB;;AAGN,MAAa,2BAA2B;CACtC;CACA;CACA;CACD"}
|
|
@@ -102,11 +102,10 @@ function createImageCommand(_ctx) {
|
|
|
102
102
|
if (!config.agents) config.agents = { defaults: {} };
|
|
103
103
|
if (!config.agents.defaults) config.agents.defaults = {};
|
|
104
104
|
const existingFallbacks = modelFallbacksToArray(config.agents.defaults.imageModel);
|
|
105
|
-
|
|
105
|
+
config.agents.defaults.imageModel = existingFallbacks.length > 0 ? {
|
|
106
106
|
primary: modelRef,
|
|
107
107
|
fallbacks: existingFallbacks
|
|
108
|
-
};
|
|
109
|
-
else config.agents.defaults.imageModel = modelRef;
|
|
108
|
+
} : { primary: modelRef };
|
|
110
109
|
await saveConfig(config, configPath);
|
|
111
110
|
console.log(colors.green(`Image understanding model set to: ${modelRef}`));
|
|
112
111
|
});
|
|
@@ -122,11 +121,10 @@ function createImageCommand(_ctx) {
|
|
|
122
121
|
if (!config.agents) config.agents = { defaults: {} };
|
|
123
122
|
if (!config.agents.defaults) config.agents.defaults = {};
|
|
124
123
|
const existingFallbacks = modelFallbacksToArray(config.agents.defaults.imageGenerationModel);
|
|
125
|
-
|
|
124
|
+
config.agents.defaults.imageGenerationModel = existingFallbacks.length > 0 ? {
|
|
126
125
|
primary: modelRef,
|
|
127
126
|
fallbacks: existingFallbacks
|
|
128
|
-
};
|
|
129
|
-
else config.agents.defaults.imageGenerationModel = modelRef;
|
|
127
|
+
} : { primary: modelRef };
|
|
130
128
|
await saveConfig(config, configPath);
|
|
131
129
|
console.log(colors.green(`Image generation model set to: ${modelRef}`));
|
|
132
130
|
});
|
|
@@ -190,11 +188,10 @@ function createImageCommand(_ctx) {
|
|
|
190
188
|
const removed = fallbacks.splice(index, 1)[0];
|
|
191
189
|
if (!config.agents) config.agents = { defaults: {} };
|
|
192
190
|
if (!config.agents.defaults) config.agents.defaults = {};
|
|
193
|
-
if (
|
|
191
|
+
if (primary) config.agents.defaults[configKey] = fallbacks.length > 0 ? {
|
|
194
192
|
primary,
|
|
195
193
|
fallbacks
|
|
196
|
-
};
|
|
197
|
-
else if (primary) config.agents.defaults[configKey] = primary;
|
|
194
|
+
} : { primary };
|
|
198
195
|
await saveConfig(config, configPath);
|
|
199
196
|
console.log(colors.green(`Removed fallback: ${removed}`));
|
|
200
197
|
});
|
|
@@ -272,22 +269,24 @@ function createImageCommand(_ctx) {
|
|
|
272
269
|
if (!config.agents.defaults) config.agents.defaults = {};
|
|
273
270
|
const current = config.agents.defaults.imageGenerationModel;
|
|
274
271
|
const primary = resolveAgentModelPrimaryValue(current);
|
|
272
|
+
if (!primary) {
|
|
273
|
+
console.error(colors.red("No image generation model is configured. Run `xopc image set-generation <provider/model>` first."));
|
|
274
|
+
process.exit(1);
|
|
275
|
+
}
|
|
275
276
|
const fallbacks = resolveAgentModelFallbackValues(current);
|
|
276
|
-
const autoProviderFallback =
|
|
277
|
+
const autoProviderFallback = current?.autoProviderFallback === true;
|
|
277
278
|
if (ms === 0) {
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
...primary ? { primary } : {},
|
|
279
|
+
config.agents.defaults.imageGenerationModel = {
|
|
280
|
+
primary,
|
|
281
281
|
...fallbacks.length > 0 ? { fallbacks } : {},
|
|
282
282
|
...autoProviderFallback ? { autoProviderFallback: true } : {}
|
|
283
283
|
};
|
|
284
|
-
else delete config.agents.defaults.imageGenerationModel;
|
|
285
284
|
await saveConfig(config, configPath);
|
|
286
285
|
console.log(colors.green("Image generation timeout cleared."));
|
|
287
286
|
return;
|
|
288
287
|
}
|
|
289
288
|
config.agents.defaults.imageGenerationModel = {
|
|
290
|
-
|
|
289
|
+
primary,
|
|
291
290
|
...fallbacks.length > 0 ? { fallbacks } : {},
|
|
292
291
|
...autoProviderFallback ? { autoProviderFallback: true } : {},
|
|
293
292
|
timeoutMs: ms
|
|
@@ -309,22 +308,24 @@ function createImageCommand(_ctx) {
|
|
|
309
308
|
if (!config.agents.defaults) config.agents.defaults = {};
|
|
310
309
|
const current = config.agents.defaults.imageGenerationModel;
|
|
311
310
|
const primary = resolveAgentModelPrimaryValue(current);
|
|
311
|
+
if (!primary) {
|
|
312
|
+
console.error(colors.red("No image generation model is configured. Run `xopc image set-generation <provider/model>` first."));
|
|
313
|
+
process.exit(1);
|
|
314
|
+
}
|
|
312
315
|
const fallbacks = resolveAgentModelFallbackValues(current);
|
|
313
|
-
const timeoutMs =
|
|
316
|
+
const timeoutMs = current?.timeoutMs;
|
|
314
317
|
if (disable) {
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
...primary ? { primary } : {},
|
|
318
|
+
config.agents.defaults.imageGenerationModel = {
|
|
319
|
+
primary,
|
|
318
320
|
...fallbacks.length > 0 ? { fallbacks } : {},
|
|
319
321
|
...timeoutMs ? { timeoutMs } : {}
|
|
320
322
|
};
|
|
321
|
-
else delete config.agents.defaults.imageGenerationModel;
|
|
322
323
|
await saveConfig(config, configPath);
|
|
323
324
|
console.log(colors.green("Image generation auto-fallback disabled."));
|
|
324
325
|
return;
|
|
325
326
|
}
|
|
326
327
|
config.agents.defaults.imageGenerationModel = {
|
|
327
|
-
|
|
328
|
+
primary,
|
|
328
329
|
...fallbacks.length > 0 ? { fallbacks } : {},
|
|
329
330
|
...timeoutMs ? { timeoutMs } : {},
|
|
330
331
|
autoProviderFallback: true
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image.js","names":["resolvePath"],"sources":["../../../../src/cli/commands/image.ts"],"sourcesContent":["import { mkdir, writeFile } from 'node:fs/promises';\nimport { join, resolve as resolvePath } from 'node:path';\nimport { Command } from 'commander';\nimport { loadConfig, saveConfig } from '../../config/loader.js';\nimport { parseModelRef, type AgentModelConfig } from '../../config/schema.js';\nimport {\n resolveAgentModelPrimaryValue,\n resolveAgentModelFallbackValues,\n} from '../../config/model-input.js';\nimport { isProviderConfigured } from '../../providers/index.js';\nimport {\n generateImage,\n getImageGenerationProvider,\n listImageGenerationProvidersSummary,\n} from '../../agent/image/index.js';\nimport { register, formatExamples, type CLIContext } from '../registry.js';\nimport { colors } from '../utils/colors.js';\nimport { getContextWithOpts } from '../context.js';\n\nfunction modelRefToString(model?: AgentModelConfig): string | null {\n if (!model) {\n return null;\n }\n return resolveAgentModelPrimaryValue(model) ?? null;\n}\n\nfunction modelFallbacksToArray(model?: AgentModelConfig): string[] {\n return resolveAgentModelFallbackValues(model);\n}\n\nfunction createImageCommand(_ctx: CLIContext): Command {\n const cmd = new Command('image')\n .description('Configure image generation and understanding models')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc image status # Show current image config',\n 'xopc image set-understanding openai/gpt-4o # Set image understanding model',\n 'xopc image set-generation openai/gpt-image-1 # Set image generation model',\n 'xopc image add-fallback understanding anthropic/claude-sonnet-4-5',\n 'xopc image add-fallback generation dashscope/wan2.7-image-pro',\n 'xopc image remove-fallback understanding 0 # Remove first fallback',\n 'xopc image providers # List available providers',\n ]),\n );\n\n cmd\n .command('status')\n .description('Show current image model configuration')\n .option('--json', 'Output as JSON')\n .action(async (opts: { json?: boolean }) => {\n const ctx = getContextWithOpts();\n const config = loadConfig(ctx.configPath);\n const defaults = config.agents?.defaults;\n\n const understandingPrimary = modelRefToString(defaults?.imageModel);\n const understandingFallbacks = modelFallbacksToArray(defaults?.imageModel);\n const generationPrimary = modelRefToString(defaults?.imageGenerationModel);\n const generationFallbacks = modelFallbacksToArray(defaults?.imageGenerationModel);\n const mediaMaxMb = defaults?.mediaMaxMb;\n\n if (opts.json) {\n console.log(\n JSON.stringify(\n {\n imageUnderstanding: {\n primary: understandingPrimary,\n fallbacks: understandingFallbacks,\n },\n imageGeneration: {\n primary: generationPrimary,\n fallbacks: generationFallbacks,\n },\n mediaMaxMb: mediaMaxMb ?? null,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n console.log('');\n console.log(colors.cyan('Image multimodal configuration'));\n console.log('═'.repeat(50));\n\n console.log('');\n console.log(colors.cyan('Image understanding (vision)'));\n if (understandingPrimary) {\n const parsed = parseModelRef(understandingPrimary);\n const configured = parsed ? await isProviderConfigured(parsed.provider) : false;\n const status = configured ? colors.green('OK') : colors.yellow('(provider not configured)');\n console.log(` Primary: ${understandingPrimary} ${status}`);\n } else {\n console.log(` Primary: ${colors.gray('(not set — inferred from keys / defaults)')}`);\n }\n for (let i = 0; i < understandingFallbacks.length; i++) {\n const fb = understandingFallbacks[i]!;\n const parsed = parseModelRef(fb);\n const configured = parsed ? await isProviderConfigured(parsed.provider) : false;\n const status = configured ? colors.green('OK') : colors.yellow('?');\n console.log(` Fallback ${i + 1}: ${fb} ${status}`);\n }\n\n console.log('');\n console.log(colors.cyan('Image generation'));\n if (generationPrimary) {\n const parsed = parseModelRef(generationPrimary);\n const configured = parsed ? await isProviderConfigured(parsed.provider) : false;\n const status = configured ? colors.green('OK') : colors.yellow('(provider not configured)');\n console.log(` Primary: ${generationPrimary} ${status}`);\n } else {\n console.log(` Primary: ${colors.gray('(not set — defaults to openai/gpt-image-1)')}`);\n }\n for (let i = 0; i < generationFallbacks.length; i++) {\n const fb = generationFallbacks[i]!;\n const parsed = parseModelRef(fb);\n const configured = parsed ? await isProviderConfigured(parsed.provider) : false;\n const status = configured ? colors.green('OK') : colors.yellow('?');\n console.log(` Fallback ${i + 1}: ${fb} ${status}`);\n }\n\n console.log('');\n console.log(colors.cyan('General'));\n console.log(` Max image size: ${mediaMaxMb ? `${mediaMaxMb} MB` : colors.gray('(default)')}`);\n\n console.log('');\n console.log('═'.repeat(50));\n console.log(\n colors.gray(\n 'Use \"xopc image set-understanding\" / \"xopc image set-generation\" to set primary models.',\n ),\n );\n console.log('');\n });\n\n cmd\n .command('set-understanding <modelRef>')\n .description('Set the primary image understanding (vision) model')\n .action(async (modelRef: string) => {\n const parsed = parseModelRef(modelRef);\n if (!parsed) {\n console.error(\n colors.red(`Invalid model reference: \"${modelRef}\". Use \"provider/model\" format.`),\n );\n process.exit(1);\n }\n\n const configured = await isProviderConfigured(parsed.provider);\n if (!configured) {\n console.warn(\n colors.yellow(\n `Provider \"${parsed.provider}\" is not configured. Set the API key before using this model.`,\n ),\n );\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) {\n config.agents = { defaults: {} } as typeof config.agents;\n }\n if (!config.agents.defaults) {\n config.agents.defaults = {} as typeof config.agents.defaults;\n }\n\n const existingFallbacks = modelFallbacksToArray(config.agents.defaults.imageModel);\n if (existingFallbacks.length > 0) {\n config.agents.defaults.imageModel = {\n primary: modelRef,\n fallbacks: existingFallbacks,\n };\n } else {\n config.agents.defaults.imageModel = modelRef;\n }\n\n await saveConfig(config, configPath);\n console.log(colors.green(`Image understanding model set to: ${modelRef}`));\n });\n\n cmd\n .command('set-generation <modelRef>')\n .description('Set the primary image generation model')\n .action(async (modelRef: string) => {\n const parsed = parseModelRef(modelRef);\n if (!parsed) {\n console.error(\n colors.red(`Invalid model reference: \"${modelRef}\". Use \"provider/model\" format.`),\n );\n process.exit(1);\n }\n\n const configured = await isProviderConfigured(parsed.provider);\n if (!configured) {\n console.warn(\n colors.yellow(\n `Provider \"${parsed.provider}\" is not configured. Set the API key before using this model.`,\n ),\n );\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) {\n config.agents = { defaults: {} } as typeof config.agents;\n }\n if (!config.agents.defaults) {\n config.agents.defaults = {} as typeof config.agents.defaults;\n }\n\n const existingFallbacks = modelFallbacksToArray(config.agents.defaults.imageGenerationModel);\n if (existingFallbacks.length > 0) {\n config.agents.defaults.imageGenerationModel = {\n primary: modelRef,\n fallbacks: existingFallbacks,\n };\n } else {\n config.agents.defaults.imageGenerationModel = modelRef;\n }\n\n await saveConfig(config, configPath);\n console.log(colors.green(`Image generation model set to: ${modelRef}`));\n });\n\n cmd\n .command('add-fallback <type> <modelRef>')\n .description('Add a fallback model (type: \"understanding\" or \"generation\")')\n .action(async (type: string, modelRef: string) => {\n if (type !== 'understanding' && type !== 'generation') {\n console.error(colors.red('Type must be \"understanding\" or \"generation\".'));\n process.exit(1);\n }\n\n const parsed = parseModelRef(modelRef);\n if (!parsed) {\n console.error(\n colors.red(`Invalid model reference: \"${modelRef}\". Use \"provider/model\" format.`),\n );\n process.exit(1);\n }\n\n const configured = await isProviderConfigured(parsed.provider);\n if (!configured) {\n console.warn(colors.yellow(`Provider \"${parsed.provider}\" is not configured.`));\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) {\n config.agents = { defaults: {} } as typeof config.agents;\n }\n if (!config.agents.defaults) {\n config.agents.defaults = {} as typeof config.agents.defaults;\n }\n\n const configKey = type === 'understanding' ? 'imageModel' : 'imageGenerationModel';\n const current = config.agents.defaults[configKey];\n const primary = resolveAgentModelPrimaryValue(current);\n const fallbacks = [...resolveAgentModelFallbackValues(current)];\n\n if (!primary) {\n const hint =\n type === 'understanding'\n ? 'xopc image set-understanding <model>'\n : 'xopc image set-generation <model>';\n console.error(colors.red(`No primary model set for image ${type}. Set it first: ${hint}`));\n process.exit(1);\n }\n\n if (fallbacks.includes(modelRef)) {\n console.warn(colors.yellow(`\"${modelRef}\" is already in the fallback list.`));\n return;\n }\n\n fallbacks.push(modelRef);\n config.agents.defaults[configKey] = { primary, fallbacks };\n\n await saveConfig(config, configPath);\n console.log(colors.green(`Added fallback for image ${type}: ${modelRef}`));\n console.log(colors.gray(` Fallback chain: ${primary} -> ${fallbacks.join(' -> ')}`));\n });\n\n cmd\n .command('remove-fallback <type> <index>')\n .description('Remove a fallback model by index (0-based)')\n .action(async (type: string, indexStr: string) => {\n if (type !== 'understanding' && type !== 'generation') {\n console.error(colors.red('Type must be \"understanding\" or \"generation\".'));\n process.exit(1);\n }\n\n const index = parseInt(indexStr, 10);\n if (Number.isNaN(index) || index < 0) {\n console.error(colors.red('Index must be a non-negative integer.'));\n process.exit(1);\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n const configKey = type === 'understanding' ? 'imageModel' : 'imageGenerationModel';\n const current = config.agents?.defaults?.[configKey];\n const primary = resolveAgentModelPrimaryValue(current);\n const fallbacks = [...resolveAgentModelFallbackValues(current)];\n\n if (index >= fallbacks.length) {\n console.error(\n colors.red(`Fallback index ${index} out of range (${fallbacks.length} fallbacks).`),\n );\n process.exit(1);\n }\n\n const removed = fallbacks.splice(index, 1)[0];\n\n if (!config.agents) {\n config.agents = { defaults: {} } as typeof config.agents;\n }\n if (!config.agents.defaults) {\n config.agents.defaults = {} as typeof config.agents.defaults;\n }\n\n if (fallbacks.length > 0 && primary) {\n config.agents.defaults[configKey] = { primary, fallbacks };\n } else if (primary) {\n config.agents.defaults[configKey] = primary;\n }\n\n await saveConfig(config, configPath);\n console.log(colors.green(`Removed fallback: ${removed}`));\n });\n\n cmd\n .command('providers')\n .description('List registered image-generation providers and their capabilities')\n .option('--json', 'Output as JSON')\n .action(async (opts: { json?: boolean }) => {\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n\n const summaries = listImageGenerationProvidersSummary(config);\n const rows = summaries.map((s) => {\n const provider = getImageGenerationProvider(s.id, config);\n let configured = false;\n try {\n configured = provider?.isConfigured?.({ cfg: config }) === true;\n } catch {\n configured = false;\n }\n return {\n id: s.id,\n label: s.label ?? s.id,\n defaultModel: s.defaultModel ?? null,\n models: s.models,\n aliases: s.aliases ?? [],\n capabilities: s.capabilities ?? null,\n configured,\n };\n });\n\n if (opts.json) {\n console.log(JSON.stringify(rows, null, 2));\n return;\n }\n\n console.log('');\n console.log(colors.cyan('Image-generation providers'));\n console.log('═'.repeat(60));\n\n if (rows.length === 0) {\n console.log('');\n console.log(\n colors.yellow(\n ' No image-generation providers registered. Check `extensions/<vendor>/` and bundled.ts.',\n ),\n );\n console.log('');\n return;\n }\n\n for (const row of rows) {\n const statusIcon = row.configured ? colors.green('OK') : colors.yellow('?');\n const statusText = row.configured ? 'configured' : 'missing API key';\n console.log('');\n console.log(` ${statusIcon} ${row.label} (${row.id}) — ${statusText}`);\n if (row.defaultModel) console.log(` Default: ${row.defaultModel}`);\n if (row.models.length > 0) {\n console.log(` Models: ${row.models.map((m) => `${row.id}/${m}`).join(', ')}`);\n }\n if (row.aliases.length > 0) {\n console.log(` Aliases: ${row.aliases.join(', ')}`);\n }\n }\n\n console.log('');\n console.log('═'.repeat(60));\n console.log(\n colors.gray(\n 'Use `xopc image set-generation <provider/model>` to set the primary model, ' +\n '`xopc auth set <provider>` to configure API keys.',\n ),\n );\n console.log('');\n });\n\n cmd\n .command('set-max-size <mb>')\n .description('Set maximum image size in MB')\n .action(async (mbStr: string) => {\n const mb = parseFloat(mbStr);\n if (Number.isNaN(mb) || mb <= 0) {\n console.error(colors.red('Size must be a positive number (in MB).'));\n process.exit(1);\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) {\n config.agents = { defaults: {} } as typeof config.agents;\n }\n if (!config.agents.defaults) {\n config.agents.defaults = {} as typeof config.agents.defaults;\n }\n config.agents.defaults.mediaMaxMb = mb;\n\n await saveConfig(config, configPath);\n console.log(colors.green(`Max image size set to: ${mb} MB`));\n });\n\n cmd\n .command('set-timeout <ms>')\n .description('Set the per-request timeout (ms) for image generation; 0 to clear')\n .action(async (msStr: string) => {\n const ms = parseInt(msStr, 10);\n if (Number.isNaN(ms) || ms < 0) {\n console.error(colors.red('Timeout must be a non-negative integer (ms).'));\n process.exit(1);\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) config.agents = { defaults: {} } as typeof config.agents;\n if (!config.agents.defaults) config.agents.defaults = {} as typeof config.agents.defaults;\n\n const current = config.agents.defaults.imageGenerationModel;\n const primary = resolveAgentModelPrimaryValue(current);\n const fallbacks = resolveAgentModelFallbackValues(current);\n const autoProviderFallback =\n typeof current === 'object' && current !== null && !Array.isArray(current)\n ? (current as { autoProviderFallback?: boolean }).autoProviderFallback === true\n : false;\n\n if (ms === 0) {\n // Clear timeout but keep other knobs.\n if (primary && fallbacks.length === 0 && !autoProviderFallback) {\n config.agents.defaults.imageGenerationModel = primary;\n } else if (primary || fallbacks.length > 0) {\n config.agents.defaults.imageGenerationModel = {\n ...(primary ? { primary } : {}),\n ...(fallbacks.length > 0 ? { fallbacks } : {}),\n ...(autoProviderFallback ? { autoProviderFallback: true } : {}),\n };\n } else {\n delete (config.agents.defaults as Record<string, unknown>).imageGenerationModel;\n }\n await saveConfig(config, configPath);\n console.log(colors.green('Image generation timeout cleared.'));\n return;\n }\n\n config.agents.defaults.imageGenerationModel = {\n ...(primary ? { primary } : {}),\n ...(fallbacks.length > 0 ? { fallbacks } : {}),\n ...(autoProviderFallback ? { autoProviderFallback: true } : {}),\n timeoutMs: ms,\n };\n await saveConfig(config, configPath);\n console.log(colors.green(`Image generation timeout set to: ${ms}ms`));\n });\n\n cmd\n .command('set-auto-fallback <on-or-off>')\n .description('Enable / disable sweeping every configured provider when primary chain fails')\n .action(async (value: string) => {\n const v = value.trim().toLowerCase();\n const enable = v === 'on' || v === 'true' || v === '1' || v === 'yes';\n const disable = v === 'off' || v === 'false' || v === '0' || v === 'no';\n if (!enable && !disable) {\n console.error(colors.red('Value must be \"on\" or \"off\".'));\n process.exit(1);\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) config.agents = { defaults: {} } as typeof config.agents;\n if (!config.agents.defaults) config.agents.defaults = {} as typeof config.agents.defaults;\n\n const current = config.agents.defaults.imageGenerationModel;\n const primary = resolveAgentModelPrimaryValue(current);\n const fallbacks = resolveAgentModelFallbackValues(current);\n const timeoutMs =\n typeof current === 'object' && current !== null && !Array.isArray(current)\n ? (current as { timeoutMs?: number }).timeoutMs\n : undefined;\n\n if (disable) {\n if (primary && fallbacks.length === 0 && !timeoutMs) {\n config.agents.defaults.imageGenerationModel = primary;\n } else if (primary || fallbacks.length > 0 || timeoutMs) {\n config.agents.defaults.imageGenerationModel = {\n ...(primary ? { primary } : {}),\n ...(fallbacks.length > 0 ? { fallbacks } : {}),\n ...(timeoutMs ? { timeoutMs } : {}),\n };\n } else {\n delete (config.agents.defaults as Record<string, unknown>).imageGenerationModel;\n }\n await saveConfig(config, configPath);\n console.log(colors.green('Image generation auto-fallback disabled.'));\n return;\n }\n\n config.agents.defaults.imageGenerationModel = {\n ...(primary ? { primary } : {}),\n ...(fallbacks.length > 0 ? { fallbacks } : {}),\n ...(timeoutMs ? { timeoutMs } : {}),\n autoProviderFallback: true,\n };\n await saveConfig(config, configPath);\n console.log(colors.green('Image generation auto-fallback enabled.'));\n });\n\n cmd\n .command('generate <prompt...>')\n .description('Generate one or more images and save them to disk')\n .option('--model <ref>', 'Model ref (provider/model); falls back to configured primary')\n .option('--size <size>', 'Image size, e.g. 1024x1024')\n .option('--count <n>', 'Number of images to generate', (v) => parseInt(v, 10), 1)\n .option('--output <dir>', 'Output directory (default: ./generated-images)')\n .option('--timeout <ms>', 'Per-call timeout (ms)', (v) => parseInt(v, 10))\n .action(\n async (\n promptParts: string[],\n opts: { model?: string; size?: string; count?: number; output?: string; timeout?: number },\n ) => {\n const prompt = promptParts.join(' ').trim();\n if (!prompt) {\n console.error(colors.red('Prompt is required.'));\n process.exit(1);\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n const outputDir = resolvePath(opts.output ?? './generated-images');\n await mkdir(outputDir, { recursive: true });\n\n const count = Number.isFinite(opts.count) && (opts.count ?? 0) > 0 ? Math.floor(opts.count!) : 1;\n\n try {\n const result = await generateImage({\n prompt,\n cfg: config,\n ...(opts.model ? { modelRef: opts.model } : {}),\n ...(opts.size ? { size: opts.size } : {}),\n count,\n ...(typeof opts.timeout === 'number' && opts.timeout > 0 ? { timeoutMs: opts.timeout } : {}),\n });\n\n const writtenPaths: string[] = [];\n for (let i = 0; i < result.images.length; i++) {\n const img = result.images[i];\n const fileName = img.fileName?.trim() || `image-${i + 1}.png`;\n const full = join(outputDir, fileName);\n await writeFile(full, img.buffer);\n writtenPaths.push(full);\n }\n\n console.log('');\n console.log(\n colors.green(\n `Generated ${result.images.length} image${result.images.length === 1 ? '' : 's'} (model: ${result.model}).`,\n ),\n );\n for (const p of writtenPaths) console.log(` - ${p}`);\n console.log('');\n } catch (err) {\n console.error(colors.red(`Image generation failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n },\n );\n\n return cmd;\n}\n\nregister({\n id: 'image',\n name: 'image',\n description: 'Configure image generation and understanding models',\n factory: createImageCommand,\n metadata: {\n category: 'utility',\n examples: [\n 'xopc image status',\n 'xopc image set-understanding openai/gpt-4o',\n 'xopc image set-generation openai/gpt-image-1',\n 'xopc image providers',\n ],\n },\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"image.js","names":["resolvePath"],"sources":["../../../../src/cli/commands/image.ts"],"sourcesContent":["import { mkdir, writeFile } from 'node:fs/promises';\nimport { join, resolve as resolvePath } from 'node:path';\nimport { Command } from 'commander';\nimport { loadConfig, saveConfig } from '../../config/loader.js';\nimport { parseModelRef, type AgentModelConfig } from '../../config/schema.js';\nimport {\n resolveAgentModelPrimaryValue,\n resolveAgentModelFallbackValues,\n} from '../../config/model-input.js';\nimport { isProviderConfigured } from '../../providers/index.js';\nimport {\n generateImage,\n getImageGenerationProvider,\n listImageGenerationProvidersSummary,\n} from '../../agent/image/index.js';\nimport { register, formatExamples, type CLIContext } from '../registry.js';\nimport { colors } from '../utils/colors.js';\nimport { getContextWithOpts } from '../context.js';\n\nfunction modelRefToString(model?: AgentModelConfig): string | null {\n if (!model) {\n return null;\n }\n return resolveAgentModelPrimaryValue(model) ?? null;\n}\n\nfunction modelFallbacksToArray(model?: AgentModelConfig): string[] {\n return resolveAgentModelFallbackValues(model);\n}\n\nfunction createImageCommand(_ctx: CLIContext): Command {\n const cmd = new Command('image')\n .description('Configure image generation and understanding models')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc image status # Show current image config',\n 'xopc image set-understanding openai/gpt-4o # Set image understanding model',\n 'xopc image set-generation openai/gpt-image-1 # Set image generation model',\n 'xopc image add-fallback understanding anthropic/claude-sonnet-4-5',\n 'xopc image add-fallback generation dashscope/wan2.7-image-pro',\n 'xopc image remove-fallback understanding 0 # Remove first fallback',\n 'xopc image providers # List available providers',\n ]),\n );\n\n cmd\n .command('status')\n .description('Show current image model configuration')\n .option('--json', 'Output as JSON')\n .action(async (opts: { json?: boolean }) => {\n const ctx = getContextWithOpts();\n const config = loadConfig(ctx.configPath);\n const defaults = config.agents?.defaults;\n\n const understandingPrimary = modelRefToString(defaults?.imageModel);\n const understandingFallbacks = modelFallbacksToArray(defaults?.imageModel);\n const generationPrimary = modelRefToString(defaults?.imageGenerationModel);\n const generationFallbacks = modelFallbacksToArray(defaults?.imageGenerationModel);\n const mediaMaxMb = defaults?.mediaMaxMb;\n\n if (opts.json) {\n console.log(\n JSON.stringify(\n {\n imageUnderstanding: {\n primary: understandingPrimary,\n fallbacks: understandingFallbacks,\n },\n imageGeneration: {\n primary: generationPrimary,\n fallbacks: generationFallbacks,\n },\n mediaMaxMb: mediaMaxMb ?? null,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n console.log('');\n console.log(colors.cyan('Image multimodal configuration'));\n console.log('═'.repeat(50));\n\n console.log('');\n console.log(colors.cyan('Image understanding (vision)'));\n if (understandingPrimary) {\n const parsed = parseModelRef(understandingPrimary);\n const configured = parsed ? await isProviderConfigured(parsed.provider) : false;\n const status = configured ? colors.green('OK') : colors.yellow('(provider not configured)');\n console.log(` Primary: ${understandingPrimary} ${status}`);\n } else {\n console.log(` Primary: ${colors.gray('(not set — inferred from keys / defaults)')}`);\n }\n for (let i = 0; i < understandingFallbacks.length; i++) {\n const fb = understandingFallbacks[i]!;\n const parsed = parseModelRef(fb);\n const configured = parsed ? await isProviderConfigured(parsed.provider) : false;\n const status = configured ? colors.green('OK') : colors.yellow('?');\n console.log(` Fallback ${i + 1}: ${fb} ${status}`);\n }\n\n console.log('');\n console.log(colors.cyan('Image generation'));\n if (generationPrimary) {\n const parsed = parseModelRef(generationPrimary);\n const configured = parsed ? await isProviderConfigured(parsed.provider) : false;\n const status = configured ? colors.green('OK') : colors.yellow('(provider not configured)');\n console.log(` Primary: ${generationPrimary} ${status}`);\n } else {\n console.log(` Primary: ${colors.gray('(not set — defaults to openai/gpt-image-1)')}`);\n }\n for (let i = 0; i < generationFallbacks.length; i++) {\n const fb = generationFallbacks[i]!;\n const parsed = parseModelRef(fb);\n const configured = parsed ? await isProviderConfigured(parsed.provider) : false;\n const status = configured ? colors.green('OK') : colors.yellow('?');\n console.log(` Fallback ${i + 1}: ${fb} ${status}`);\n }\n\n console.log('');\n console.log(colors.cyan('General'));\n console.log(` Max image size: ${mediaMaxMb ? `${mediaMaxMb} MB` : colors.gray('(default)')}`);\n\n console.log('');\n console.log('═'.repeat(50));\n console.log(\n colors.gray(\n 'Use \"xopc image set-understanding\" / \"xopc image set-generation\" to set primary models.',\n ),\n );\n console.log('');\n });\n\n cmd\n .command('set-understanding <modelRef>')\n .description('Set the primary image understanding (vision) model')\n .action(async (modelRef: string) => {\n const parsed = parseModelRef(modelRef);\n if (!parsed) {\n console.error(\n colors.red(`Invalid model reference: \"${modelRef}\". Use \"provider/model\" format.`),\n );\n process.exit(1);\n }\n\n const configured = await isProviderConfigured(parsed.provider);\n if (!configured) {\n console.warn(\n colors.yellow(\n `Provider \"${parsed.provider}\" is not configured. Set the API key before using this model.`,\n ),\n );\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) {\n config.agents = { defaults: {} } as typeof config.agents;\n }\n if (!config.agents.defaults) {\n config.agents.defaults = {} as typeof config.agents.defaults;\n }\n\n const existingFallbacks = modelFallbacksToArray(config.agents.defaults.imageModel);\n config.agents.defaults.imageModel =\n existingFallbacks.length > 0\n ? { primary: modelRef, fallbacks: existingFallbacks }\n : { primary: modelRef };\n\n await saveConfig(config, configPath);\n console.log(colors.green(`Image understanding model set to: ${modelRef}`));\n });\n\n cmd\n .command('set-generation <modelRef>')\n .description('Set the primary image generation model')\n .action(async (modelRef: string) => {\n const parsed = parseModelRef(modelRef);\n if (!parsed) {\n console.error(\n colors.red(`Invalid model reference: \"${modelRef}\". Use \"provider/model\" format.`),\n );\n process.exit(1);\n }\n\n const configured = await isProviderConfigured(parsed.provider);\n if (!configured) {\n console.warn(\n colors.yellow(\n `Provider \"${parsed.provider}\" is not configured. Set the API key before using this model.`,\n ),\n );\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) {\n config.agents = { defaults: {} } as typeof config.agents;\n }\n if (!config.agents.defaults) {\n config.agents.defaults = {} as typeof config.agents.defaults;\n }\n\n const existingFallbacks = modelFallbacksToArray(config.agents.defaults.imageGenerationModel);\n config.agents.defaults.imageGenerationModel =\n existingFallbacks.length > 0\n ? { primary: modelRef, fallbacks: existingFallbacks }\n : { primary: modelRef };\n\n await saveConfig(config, configPath);\n console.log(colors.green(`Image generation model set to: ${modelRef}`));\n });\n\n cmd\n .command('add-fallback <type> <modelRef>')\n .description('Add a fallback model (type: \"understanding\" or \"generation\")')\n .action(async (type: string, modelRef: string) => {\n if (type !== 'understanding' && type !== 'generation') {\n console.error(colors.red('Type must be \"understanding\" or \"generation\".'));\n process.exit(1);\n }\n\n const parsed = parseModelRef(modelRef);\n if (!parsed) {\n console.error(\n colors.red(`Invalid model reference: \"${modelRef}\". Use \"provider/model\" format.`),\n );\n process.exit(1);\n }\n\n const configured = await isProviderConfigured(parsed.provider);\n if (!configured) {\n console.warn(colors.yellow(`Provider \"${parsed.provider}\" is not configured.`));\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) {\n config.agents = { defaults: {} } as typeof config.agents;\n }\n if (!config.agents.defaults) {\n config.agents.defaults = {} as typeof config.agents.defaults;\n }\n\n const configKey = type === 'understanding' ? 'imageModel' : 'imageGenerationModel';\n const current = config.agents.defaults[configKey];\n const primary = resolveAgentModelPrimaryValue(current);\n const fallbacks = [...resolveAgentModelFallbackValues(current)];\n\n if (!primary) {\n const hint =\n type === 'understanding'\n ? 'xopc image set-understanding <model>'\n : 'xopc image set-generation <model>';\n console.error(colors.red(`No primary model set for image ${type}. Set it first: ${hint}`));\n process.exit(1);\n }\n\n if (fallbacks.includes(modelRef)) {\n console.warn(colors.yellow(`\"${modelRef}\" is already in the fallback list.`));\n return;\n }\n\n fallbacks.push(modelRef);\n config.agents.defaults[configKey] = { primary, fallbacks };\n\n await saveConfig(config, configPath);\n console.log(colors.green(`Added fallback for image ${type}: ${modelRef}`));\n console.log(colors.gray(` Fallback chain: ${primary} -> ${fallbacks.join(' -> ')}`));\n });\n\n cmd\n .command('remove-fallback <type> <index>')\n .description('Remove a fallback model by index (0-based)')\n .action(async (type: string, indexStr: string) => {\n if (type !== 'understanding' && type !== 'generation') {\n console.error(colors.red('Type must be \"understanding\" or \"generation\".'));\n process.exit(1);\n }\n\n const index = parseInt(indexStr, 10);\n if (Number.isNaN(index) || index < 0) {\n console.error(colors.red('Index must be a non-negative integer.'));\n process.exit(1);\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n const configKey = type === 'understanding' ? 'imageModel' : 'imageGenerationModel';\n const current = config.agents?.defaults?.[configKey];\n const primary = resolveAgentModelPrimaryValue(current);\n const fallbacks = [...resolveAgentModelFallbackValues(current)];\n\n if (index >= fallbacks.length) {\n console.error(\n colors.red(`Fallback index ${index} out of range (${fallbacks.length} fallbacks).`),\n );\n process.exit(1);\n }\n\n const removed = fallbacks.splice(index, 1)[0];\n\n if (!config.agents) {\n config.agents = { defaults: {} } as typeof config.agents;\n }\n if (!config.agents.defaults) {\n config.agents.defaults = {} as typeof config.agents.defaults;\n }\n\n if (primary) {\n config.agents.defaults[configKey] =\n fallbacks.length > 0 ? { primary, fallbacks } : { primary };\n }\n\n await saveConfig(config, configPath);\n console.log(colors.green(`Removed fallback: ${removed}`));\n });\n\n cmd\n .command('providers')\n .description('List registered image-generation providers and their capabilities')\n .option('--json', 'Output as JSON')\n .action(async (opts: { json?: boolean }) => {\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n\n const summaries = listImageGenerationProvidersSummary(config);\n const rows = summaries.map((s) => {\n const provider = getImageGenerationProvider(s.id, config);\n let configured = false;\n try {\n configured = provider?.isConfigured?.({ cfg: config }) === true;\n } catch {\n configured = false;\n }\n return {\n id: s.id,\n label: s.label ?? s.id,\n defaultModel: s.defaultModel ?? null,\n models: s.models,\n aliases: s.aliases ?? [],\n capabilities: s.capabilities ?? null,\n configured,\n };\n });\n\n if (opts.json) {\n console.log(JSON.stringify(rows, null, 2));\n return;\n }\n\n console.log('');\n console.log(colors.cyan('Image-generation providers'));\n console.log('═'.repeat(60));\n\n if (rows.length === 0) {\n console.log('');\n console.log(\n colors.yellow(\n ' No image-generation providers registered. Check `extensions/<vendor>/` and bundled.ts.',\n ),\n );\n console.log('');\n return;\n }\n\n for (const row of rows) {\n const statusIcon = row.configured ? colors.green('OK') : colors.yellow('?');\n const statusText = row.configured ? 'configured' : 'missing API key';\n console.log('');\n console.log(` ${statusIcon} ${row.label} (${row.id}) — ${statusText}`);\n if (row.defaultModel) console.log(` Default: ${row.defaultModel}`);\n if (row.models.length > 0) {\n console.log(` Models: ${row.models.map((m) => `${row.id}/${m}`).join(', ')}`);\n }\n if (row.aliases.length > 0) {\n console.log(` Aliases: ${row.aliases.join(', ')}`);\n }\n }\n\n console.log('');\n console.log('═'.repeat(60));\n console.log(\n colors.gray(\n 'Use `xopc image set-generation <provider/model>` to set the primary model, ' +\n '`xopc auth set <provider>` to configure API keys.',\n ),\n );\n console.log('');\n });\n\n cmd\n .command('set-max-size <mb>')\n .description('Set maximum image size in MB')\n .action(async (mbStr: string) => {\n const mb = parseFloat(mbStr);\n if (Number.isNaN(mb) || mb <= 0) {\n console.error(colors.red('Size must be a positive number (in MB).'));\n process.exit(1);\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) {\n config.agents = { defaults: {} } as typeof config.agents;\n }\n if (!config.agents.defaults) {\n config.agents.defaults = {} as typeof config.agents.defaults;\n }\n config.agents.defaults.mediaMaxMb = mb;\n\n await saveConfig(config, configPath);\n console.log(colors.green(`Max image size set to: ${mb} MB`));\n });\n\n cmd\n .command('set-timeout <ms>')\n .description('Set the per-request timeout (ms) for image generation; 0 to clear')\n .action(async (msStr: string) => {\n const ms = parseInt(msStr, 10);\n if (Number.isNaN(ms) || ms < 0) {\n console.error(colors.red('Timeout must be a non-negative integer (ms).'));\n process.exit(1);\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) config.agents = { defaults: {} } as typeof config.agents;\n if (!config.agents.defaults) config.agents.defaults = {} as typeof config.agents.defaults;\n\n const current = config.agents.defaults.imageGenerationModel;\n const primary = resolveAgentModelPrimaryValue(current);\n if (!primary) {\n console.error(\n colors.red('No image generation model is configured. Run `xopc image set-generation <provider/model>` first.'),\n );\n process.exit(1);\n }\n const fallbacks = resolveAgentModelFallbackValues(current);\n const autoProviderFallback = current?.autoProviderFallback === true;\n\n if (ms === 0) {\n config.agents.defaults.imageGenerationModel = {\n primary,\n ...(fallbacks.length > 0 ? { fallbacks } : {}),\n ...(autoProviderFallback ? { autoProviderFallback: true } : {}),\n };\n await saveConfig(config, configPath);\n console.log(colors.green('Image generation timeout cleared.'));\n return;\n }\n\n config.agents.defaults.imageGenerationModel = {\n primary,\n ...(fallbacks.length > 0 ? { fallbacks } : {}),\n ...(autoProviderFallback ? { autoProviderFallback: true } : {}),\n timeoutMs: ms,\n };\n await saveConfig(config, configPath);\n console.log(colors.green(`Image generation timeout set to: ${ms}ms`));\n });\n\n cmd\n .command('set-auto-fallback <on-or-off>')\n .description('Enable / disable sweeping every configured provider when primary chain fails')\n .action(async (value: string) => {\n const v = value.trim().toLowerCase();\n const enable = v === 'on' || v === 'true' || v === '1' || v === 'yes';\n const disable = v === 'off' || v === 'false' || v === '0' || v === 'no';\n if (!enable && !disable) {\n console.error(colors.red('Value must be \"on\" or \"off\".'));\n process.exit(1);\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n if (!config.agents) config.agents = { defaults: {} } as typeof config.agents;\n if (!config.agents.defaults) config.agents.defaults = {} as typeof config.agents.defaults;\n\n const current = config.agents.defaults.imageGenerationModel;\n const primary = resolveAgentModelPrimaryValue(current);\n if (!primary) {\n console.error(\n colors.red('No image generation model is configured. Run `xopc image set-generation <provider/model>` first.'),\n );\n process.exit(1);\n }\n const fallbacks = resolveAgentModelFallbackValues(current);\n const timeoutMs = current?.timeoutMs;\n\n if (disable) {\n config.agents.defaults.imageGenerationModel = {\n primary,\n ...(fallbacks.length > 0 ? { fallbacks } : {}),\n ...(timeoutMs ? { timeoutMs } : {}),\n };\n await saveConfig(config, configPath);\n console.log(colors.green('Image generation auto-fallback disabled.'));\n return;\n }\n\n config.agents.defaults.imageGenerationModel = {\n primary,\n ...(fallbacks.length > 0 ? { fallbacks } : {}),\n ...(timeoutMs ? { timeoutMs } : {}),\n autoProviderFallback: true,\n };\n await saveConfig(config, configPath);\n console.log(colors.green('Image generation auto-fallback enabled.'));\n });\n\n cmd\n .command('generate <prompt...>')\n .description('Generate one or more images and save them to disk')\n .option('--model <ref>', 'Model ref (provider/model); falls back to configured primary')\n .option('--size <size>', 'Image size, e.g. 1024x1024')\n .option('--count <n>', 'Number of images to generate', (v) => parseInt(v, 10), 1)\n .option('--output <dir>', 'Output directory (default: ./generated-images)')\n .option('--timeout <ms>', 'Per-call timeout (ms)', (v) => parseInt(v, 10))\n .action(\n async (\n promptParts: string[],\n opts: { model?: string; size?: string; count?: number; output?: string; timeout?: number },\n ) => {\n const prompt = promptParts.join(' ').trim();\n if (!prompt) {\n console.error(colors.red('Prompt is required.'));\n process.exit(1);\n }\n\n const configPath = getContextWithOpts().configPath;\n const config = loadConfig(configPath);\n const outputDir = resolvePath(opts.output ?? './generated-images');\n await mkdir(outputDir, { recursive: true });\n\n const count = Number.isFinite(opts.count) && (opts.count ?? 0) > 0 ? Math.floor(opts.count!) : 1;\n\n try {\n const result = await generateImage({\n prompt,\n cfg: config,\n ...(opts.model ? { modelRef: opts.model } : {}),\n ...(opts.size ? { size: opts.size } : {}),\n count,\n ...(typeof opts.timeout === 'number' && opts.timeout > 0 ? { timeoutMs: opts.timeout } : {}),\n });\n\n const writtenPaths: string[] = [];\n for (let i = 0; i < result.images.length; i++) {\n const img = result.images[i];\n const fileName = img.fileName?.trim() || `image-${i + 1}.png`;\n const full = join(outputDir, fileName);\n await writeFile(full, img.buffer);\n writtenPaths.push(full);\n }\n\n console.log('');\n console.log(\n colors.green(\n `Generated ${result.images.length} image${result.images.length === 1 ? '' : 's'} (model: ${result.model}).`,\n ),\n );\n for (const p of writtenPaths) console.log(` - ${p}`);\n console.log('');\n } catch (err) {\n console.error(colors.red(`Image generation failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n },\n );\n\n return cmd;\n}\n\nregister({\n id: 'image',\n name: 'image',\n description: 'Configure image generation and understanding models',\n factory: createImageCommand,\n metadata: {\n category: 'utility',\n examples: [\n 'xopc image status',\n 'xopc image set-understanding openai/gpt-4o',\n 'xopc image set-generation openai/gpt-image-1',\n 'xopc image providers',\n ],\n },\n});\n"],"mappings":";;;;;;;;;;;;;;aAGgE;aACc;gBAKd;AAUhE,SAAS,iBAAiB,OAAyC;AACjE,KAAI,CAAC,MACH,QAAO;AAET,QAAO,8BAA8B,MAAM,IAAI;;AAGjD,SAAS,sBAAsB,OAAoC;AACjE,QAAO,gCAAgC,MAAM;;AAG/C,SAAS,mBAAmB,MAA2B;CACrD,MAAM,MAAM,IAAI,QAAQ,QAAQ,CAC7B,YAAY,sDAAsD,CAClE,YACC,SACA,eAAe;EACb;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,CACH;AAEH,KACG,QAAQ,SAAS,CACjB,YAAY,yCAAyC,CACrD,OAAO,UAAU,iBAAiB,CAClC,OAAO,OAAO,SAA6B;EAG1C,MAAM,WADS,WADH,oBACiB,CAAC,WACP,CAAC,QAAQ;EAEhC,MAAM,uBAAuB,iBAAiB,UAAU,WAAW;EACnE,MAAM,yBAAyB,sBAAsB,UAAU,WAAW;EAC1E,MAAM,oBAAoB,iBAAiB,UAAU,qBAAqB;EAC1E,MAAM,sBAAsB,sBAAsB,UAAU,qBAAqB;EACjF,MAAM,aAAa,UAAU;AAE7B,MAAI,KAAK,MAAM;AACb,WAAQ,IACN,KAAK,UACH;IACE,oBAAoB;KAClB,SAAS;KACT,WAAW;KACZ;IACD,iBAAiB;KACf,SAAS;KACT,WAAW;KACZ;IACD,YAAY,cAAc;IAC3B,EACD,MACA,EACD,CACF;AACD;;AAGF,UAAQ,IAAI,GAAG;AACf,UAAQ,IAAI,OAAO,KAAK,iCAAiC,CAAC;AAC1D,UAAQ,IAAI,IAAI,OAAO,GAAG,CAAC;AAE3B,UAAQ,IAAI,GAAG;AACf,UAAQ,IAAI,OAAO,KAAK,+BAA+B,CAAC;AACxD,MAAI,sBAAsB;GACxB,MAAM,SAAS,cAAc,qBAAqB;GAElD,MAAM,UADa,SAAS,MAAM,qBAAqB,OAAO,SAAS,GAAG,SAC9C,OAAO,MAAM,KAAK,GAAG,OAAO,OAAO,4BAA4B;AAC3F,WAAQ,IAAI,cAAc,qBAAqB,GAAG,SAAS;QAE3D,SAAQ,IAAI,cAAc,OAAO,KAAK,4CAA4C,GAAG;AAEvF,OAAK,IAAI,IAAI,GAAG,IAAI,uBAAuB,QAAQ,KAAK;GACtD,MAAM,KAAK,uBAAuB;GAClC,MAAM,SAAS,cAAc,GAAG;GAEhC,MAAM,UADa,SAAS,MAAM,qBAAqB,OAAO,SAAS,GAAG,SAC9C,OAAO,MAAM,KAAK,GAAG,OAAO,OAAO,IAAI;AACnE,WAAQ,IAAI,cAAc,IAAI,EAAE,IAAI,GAAG,GAAG,SAAS;;AAGrD,UAAQ,IAAI,GAAG;AACf,UAAQ,IAAI,OAAO,KAAK,mBAAmB,CAAC;AAC5C,MAAI,mBAAmB;GACrB,MAAM,SAAS,cAAc,kBAAkB;GAE/C,MAAM,UADa,SAAS,MAAM,qBAAqB,OAAO,SAAS,GAAG,SAC9C,OAAO,MAAM,KAAK,GAAG,OAAO,OAAO,4BAA4B;AAC3F,WAAQ,IAAI,cAAc,kBAAkB,GAAG,SAAS;QAExD,SAAQ,IAAI,cAAc,OAAO,KAAK,6CAA6C,GAAG;AAExF,OAAK,IAAI,IAAI,GAAG,IAAI,oBAAoB,QAAQ,KAAK;GACnD,MAAM,KAAK,oBAAoB;GAC/B,MAAM,SAAS,cAAc,GAAG;GAEhC,MAAM,UADa,SAAS,MAAM,qBAAqB,OAAO,SAAS,GAAG,SAC9C,OAAO,MAAM,KAAK,GAAG,OAAO,OAAO,IAAI;AACnE,WAAQ,IAAI,cAAc,IAAI,EAAE,IAAI,GAAG,GAAG,SAAS;;AAGrD,UAAQ,IAAI,GAAG;AACf,UAAQ,IAAI,OAAO,KAAK,UAAU,CAAC;AACnC,UAAQ,IAAI,qBAAqB,aAAa,GAAG,WAAW,OAAO,OAAO,KAAK,YAAY,GAAG;AAE9F,UAAQ,IAAI,GAAG;AACf,UAAQ,IAAI,IAAI,OAAO,GAAG,CAAC;AAC3B,UAAQ,IACN,OAAO,KACL,8FACD,CACF;AACD,UAAQ,IAAI,GAAG;GACf;AAEJ,KACG,QAAQ,+BAA+B,CACvC,YAAY,qDAAqD,CACjE,OAAO,OAAO,aAAqB;EAClC,MAAM,SAAS,cAAc,SAAS;AACtC,MAAI,CAAC,QAAQ;AACX,WAAQ,MACN,OAAO,IAAI,6BAA6B,SAAS,iCAAiC,CACnF;AACD,WAAQ,KAAK,EAAE;;AAIjB,MAAI,CAAC,MADoB,qBAAqB,OAAO,SAAS,CAE5D,SAAQ,KACN,OAAO,OACL,aAAa,OAAO,SAAS,+DAC9B,CACF;EAGH,MAAM,aAAa,oBAAoB,CAAC;EACxC,MAAM,SAAS,WAAW,WAAW;AACrC,MAAI,CAAC,OAAO,OACV,QAAO,SAAS,EAAE,UAAU,EAAE,EAAE;AAElC,MAAI,CAAC,OAAO,OAAO,SACjB,QAAO,OAAO,WAAW,EAAE;EAG7B,MAAM,oBAAoB,sBAAsB,OAAO,OAAO,SAAS,WAAW;AAClF,SAAO,OAAO,SAAS,aACrB,kBAAkB,SAAS,IACvB;GAAE,SAAS;GAAU,WAAW;GAAmB,GACnD,EAAE,SAAS,UAAU;AAE3B,QAAM,WAAW,QAAQ,WAAW;AACpC,UAAQ,IAAI,OAAO,MAAM,qCAAqC,WAAW,CAAC;GAC1E;AAEJ,KACG,QAAQ,4BAA4B,CACpC,YAAY,yCAAyC,CACrD,OAAO,OAAO,aAAqB;EAClC,MAAM,SAAS,cAAc,SAAS;AACtC,MAAI,CAAC,QAAQ;AACX,WAAQ,MACN,OAAO,IAAI,6BAA6B,SAAS,iCAAiC,CACnF;AACD,WAAQ,KAAK,EAAE;;AAIjB,MAAI,CAAC,MADoB,qBAAqB,OAAO,SAAS,CAE5D,SAAQ,KACN,OAAO,OACL,aAAa,OAAO,SAAS,+DAC9B,CACF;EAGH,MAAM,aAAa,oBAAoB,CAAC;EACxC,MAAM,SAAS,WAAW,WAAW;AACrC,MAAI,CAAC,OAAO,OACV,QAAO,SAAS,EAAE,UAAU,EAAE,EAAE;AAElC,MAAI,CAAC,OAAO,OAAO,SACjB,QAAO,OAAO,WAAW,EAAE;EAG7B,MAAM,oBAAoB,sBAAsB,OAAO,OAAO,SAAS,qBAAqB;AAC5F,SAAO,OAAO,SAAS,uBACrB,kBAAkB,SAAS,IACvB;GAAE,SAAS;GAAU,WAAW;GAAmB,GACnD,EAAE,SAAS,UAAU;AAE3B,QAAM,WAAW,QAAQ,WAAW;AACpC,UAAQ,IAAI,OAAO,MAAM,kCAAkC,WAAW,CAAC;GACvE;AAEJ,KACG,QAAQ,iCAAiC,CACzC,YAAY,mEAA+D,CAC3E,OAAO,OAAO,MAAc,aAAqB;AAChD,MAAI,SAAS,mBAAmB,SAAS,cAAc;AACrD,WAAQ,MAAM,OAAO,IAAI,oDAAgD,CAAC;AAC1E,WAAQ,KAAK,EAAE;;EAGjB,MAAM,SAAS,cAAc,SAAS;AACtC,MAAI,CAAC,QAAQ;AACX,WAAQ,MACN,OAAO,IAAI,6BAA6B,SAAS,iCAAiC,CACnF;AACD,WAAQ,KAAK,EAAE;;AAIjB,MAAI,CAAC,MADoB,qBAAqB,OAAO,SAAS,CAE5D,SAAQ,KAAK,OAAO,OAAO,aAAa,OAAO,SAAS,sBAAsB,CAAC;EAGjF,MAAM,aAAa,oBAAoB,CAAC;EACxC,MAAM,SAAS,WAAW,WAAW;AACrC,MAAI,CAAC,OAAO,OACV,QAAO,SAAS,EAAE,UAAU,EAAE,EAAE;AAElC,MAAI,CAAC,OAAO,OAAO,SACjB,QAAO,OAAO,WAAW,EAAE;EAG7B,MAAM,YAAY,SAAS,kBAAkB,eAAe;EAC5D,MAAM,UAAU,OAAO,OAAO,SAAS;EACvC,MAAM,UAAU,8BAA8B,QAAQ;EACtD,MAAM,YAAY,CAAC,GAAG,gCAAgC,QAAQ,CAAC;AAE/D,MAAI,CAAC,SAAS;GACZ,MAAM,OACJ,SAAS,kBACL,yCACA;AACN,WAAQ,MAAM,OAAO,IAAI,kCAAkC,KAAK,kBAAkB,OAAO,CAAC;AAC1F,WAAQ,KAAK,EAAE;;AAGjB,MAAI,UAAU,SAAS,SAAS,EAAE;AAChC,WAAQ,KAAK,OAAO,OAAO,IAAI,SAAS,oCAAoC,CAAC;AAC7E;;AAGF,YAAU,KAAK,SAAS;AACxB,SAAO,OAAO,SAAS,aAAa;GAAE;GAAS;GAAW;AAE1D,QAAM,WAAW,QAAQ,WAAW;AACpC,UAAQ,IAAI,OAAO,MAAM,4BAA4B,KAAK,IAAI,WAAW,CAAC;AAC1E,UAAQ,IAAI,OAAO,KAAK,sBAAsB,QAAQ,MAAM,UAAU,KAAK,OAAO,GAAG,CAAC;GACtF;AAEJ,KACG,QAAQ,iCAAiC,CACzC,YAAY,6CAA6C,CACzD,OAAO,OAAO,MAAc,aAAqB;AAChD,MAAI,SAAS,mBAAmB,SAAS,cAAc;AACrD,WAAQ,MAAM,OAAO,IAAI,oDAAgD,CAAC;AAC1E,WAAQ,KAAK,EAAE;;EAGjB,MAAM,QAAQ,SAAS,UAAU,GAAG;AACpC,MAAI,OAAO,MAAM,MAAM,IAAI,QAAQ,GAAG;AACpC,WAAQ,MAAM,OAAO,IAAI,wCAAwC,CAAC;AAClE,WAAQ,KAAK,EAAE;;EAGjB,MAAM,aAAa,oBAAoB,CAAC;EACxC,MAAM,SAAS,WAAW,WAAW;EACrC,MAAM,YAAY,SAAS,kBAAkB,eAAe;EAC5D,MAAM,UAAU,OAAO,QAAQ,WAAW;EAC1C,MAAM,UAAU,8BAA8B,QAAQ;EACtD,MAAM,YAAY,CAAC,GAAG,gCAAgC,QAAQ,CAAC;AAE/D,MAAI,SAAS,UAAU,QAAQ;AAC7B,WAAQ,MACN,OAAO,IAAI,kBAAkB,MAAM,iBAAiB,UAAU,OAAO,cAAc,CACpF;AACD,WAAQ,KAAK,EAAE;;EAGjB,MAAM,UAAU,UAAU,OAAO,OAAO,EAAE,CAAC;AAE3C,MAAI,CAAC,OAAO,OACV,QAAO,SAAS,EAAE,UAAU,EAAE,EAAE;AAElC,MAAI,CAAC,OAAO,OAAO,SACjB,QAAO,OAAO,WAAW,EAAE;AAG7B,MAAI,QACF,QAAO,OAAO,SAAS,aACrB,UAAU,SAAS,IAAI;GAAE;GAAS;GAAW,GAAG,EAAE,SAAS;AAG/D,QAAM,WAAW,QAAQ,WAAW;AACpC,UAAQ,IAAI,OAAO,MAAM,qBAAqB,UAAU,CAAC;GACzD;AAEJ,KACG,QAAQ,YAAY,CACpB,YAAY,oEAAoE,CAChF,OAAO,UAAU,iBAAiB,CAClC,OAAO,OAAO,SAA6B;EAC1C,MAAM,aAAa,oBAAoB,CAAC;EACxC,MAAM,SAAS,WAAW,WAAW;EAGrC,MAAM,OADY,oCAAoC,OAChC,CAAC,KAAK,MAAM;GAChC,MAAM,WAAW,2BAA2B,EAAE,IAAI,OAAO;GACzD,IAAI,aAAa;AACjB,OAAI;AACF,iBAAa,UAAU,eAAe,EAAE,KAAK,QAAQ,CAAC,KAAK;WACrD;AACN,iBAAa;;AAEf,UAAO;IACL,IAAI,EAAE;IACN,OAAO,EAAE,SAAS,EAAE;IACpB,cAAc,EAAE,gBAAgB;IAChC,QAAQ,EAAE;IACV,SAAS,EAAE,WAAW,EAAE;IACxB,cAAc,EAAE,gBAAgB;IAChC;IACD;IACD;AAEF,MAAI,KAAK,MAAM;AACb,WAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,EAAE,CAAC;AAC1C;;AAGF,UAAQ,IAAI,GAAG;AACf,UAAQ,IAAI,OAAO,KAAK,6BAA6B,CAAC;AACtD,UAAQ,IAAI,IAAI,OAAO,GAAG,CAAC;AAE3B,MAAI,KAAK,WAAW,GAAG;AACrB,WAAQ,IAAI,GAAG;AACf,WAAQ,IACN,OAAO,OACL,2FACD,CACF;AACD,WAAQ,IAAI,GAAG;AACf;;AAGF,OAAK,MAAM,OAAO,MAAM;GACtB,MAAM,aAAa,IAAI,aAAa,OAAO,MAAM,KAAK,GAAG,OAAO,OAAO,IAAI;GAC3E,MAAM,aAAa,IAAI,aAAa,eAAe;AACnD,WAAQ,IAAI,GAAG;AACf,WAAQ,IAAI,KAAK,WAAW,GAAG,IAAI,MAAM,IAAI,IAAI,GAAG,MAAM,aAAa;AACvE,OAAI,IAAI,aAAc,SAAQ,IAAI,iBAAiB,IAAI,eAAe;AACtE,OAAI,IAAI,OAAO,SAAS,EACtB,SAAQ,IAAI,iBAAiB,IAAI,OAAO,KAAK,MAAM,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,KAAK,GAAG;AAEpF,OAAI,IAAI,QAAQ,SAAS,EACvB,SAAQ,IAAI,iBAAiB,IAAI,QAAQ,KAAK,KAAK,GAAG;;AAI1D,UAAQ,IAAI,GAAG;AACf,UAAQ,IAAI,IAAI,OAAO,GAAG,CAAC;AAC3B,UAAQ,IACN,OAAO,KACL,+HAED,CACF;AACD,UAAQ,IAAI,GAAG;GACf;AAEJ,KACG,QAAQ,oBAAoB,CAC5B,YAAY,+BAA+B,CAC3C,OAAO,OAAO,UAAkB;EAC/B,MAAM,KAAK,WAAW,MAAM;AAC5B,MAAI,OAAO,MAAM,GAAG,IAAI,MAAM,GAAG;AAC/B,WAAQ,MAAM,OAAO,IAAI,0CAA0C,CAAC;AACpE,WAAQ,KAAK,EAAE;;EAGjB,MAAM,aAAa,oBAAoB,CAAC;EACxC,MAAM,SAAS,WAAW,WAAW;AACrC,MAAI,CAAC,OAAO,OACV,QAAO,SAAS,EAAE,UAAU,EAAE,EAAE;AAElC,MAAI,CAAC,OAAO,OAAO,SACjB,QAAO,OAAO,WAAW,EAAE;AAE7B,SAAO,OAAO,SAAS,aAAa;AAEpC,QAAM,WAAW,QAAQ,WAAW;AACpC,UAAQ,IAAI,OAAO,MAAM,0BAA0B,GAAG,KAAK,CAAC;GAC5D;AAEJ,KACG,QAAQ,mBAAmB,CAC3B,YAAY,oEAAoE,CAChF,OAAO,OAAO,UAAkB;EAC/B,MAAM,KAAK,SAAS,OAAO,GAAG;AAC9B,MAAI,OAAO,MAAM,GAAG,IAAI,KAAK,GAAG;AAC9B,WAAQ,MAAM,OAAO,IAAI,+CAA+C,CAAC;AACzE,WAAQ,KAAK,EAAE;;EAGjB,MAAM,aAAa,oBAAoB,CAAC;EACxC,MAAM,SAAS,WAAW,WAAW;AACrC,MAAI,CAAC,OAAO,OAAQ,QAAO,SAAS,EAAE,UAAU,EAAE,EAAE;AACpD,MAAI,CAAC,OAAO,OAAO,SAAU,QAAO,OAAO,WAAW,EAAE;EAExD,MAAM,UAAU,OAAO,OAAO,SAAS;EACvC,MAAM,UAAU,8BAA8B,QAAQ;AACtD,MAAI,CAAC,SAAS;AACZ,WAAQ,MACN,OAAO,IAAI,mGAAmG,CAC/G;AACD,WAAQ,KAAK,EAAE;;EAEjB,MAAM,YAAY,gCAAgC,QAAQ;EAC1D,MAAM,uBAAuB,SAAS,yBAAyB;AAE/D,MAAI,OAAO,GAAG;AACZ,UAAO,OAAO,SAAS,uBAAuB;IAC5C;IACA,GAAI,UAAU,SAAS,IAAI,EAAE,WAAW,GAAG,EAAE;IAC7C,GAAI,uBAAuB,EAAE,sBAAsB,MAAM,GAAG,EAAE;IAC/D;AACD,SAAM,WAAW,QAAQ,WAAW;AACpC,WAAQ,IAAI,OAAO,MAAM,oCAAoC,CAAC;AAC9D;;AAGF,SAAO,OAAO,SAAS,uBAAuB;GAC5C;GACA,GAAI,UAAU,SAAS,IAAI,EAAE,WAAW,GAAG,EAAE;GAC7C,GAAI,uBAAuB,EAAE,sBAAsB,MAAM,GAAG,EAAE;GAC9D,WAAW;GACZ;AACD,QAAM,WAAW,QAAQ,WAAW;AACpC,UAAQ,IAAI,OAAO,MAAM,oCAAoC,GAAG,IAAI,CAAC;GACrE;AAEJ,KACG,QAAQ,gCAAgC,CACxC,YAAY,+EAA+E,CAC3F,OAAO,OAAO,UAAkB;EAC/B,MAAM,IAAI,MAAM,MAAM,CAAC,aAAa;EACpC,MAAM,SAAS,MAAM,QAAQ,MAAM,UAAU,MAAM,OAAO,MAAM;EAChE,MAAM,UAAU,MAAM,SAAS,MAAM,WAAW,MAAM,OAAO,MAAM;AACnE,MAAI,CAAC,UAAU,CAAC,SAAS;AACvB,WAAQ,MAAM,OAAO,IAAI,mCAA+B,CAAC;AACzD,WAAQ,KAAK,EAAE;;EAGjB,MAAM,aAAa,oBAAoB,CAAC;EACxC,MAAM,SAAS,WAAW,WAAW;AACrC,MAAI,CAAC,OAAO,OAAQ,QAAO,SAAS,EAAE,UAAU,EAAE,EAAE;AACpD,MAAI,CAAC,OAAO,OAAO,SAAU,QAAO,OAAO,WAAW,EAAE;EAExD,MAAM,UAAU,OAAO,OAAO,SAAS;EACvC,MAAM,UAAU,8BAA8B,QAAQ;AACtD,MAAI,CAAC,SAAS;AACZ,WAAQ,MACN,OAAO,IAAI,mGAAmG,CAC/G;AACD,WAAQ,KAAK,EAAE;;EAEjB,MAAM,YAAY,gCAAgC,QAAQ;EAC1D,MAAM,YAAY,SAAS;AAE3B,MAAI,SAAS;AACX,UAAO,OAAO,SAAS,uBAAuB;IAC5C;IACA,GAAI,UAAU,SAAS,IAAI,EAAE,WAAW,GAAG,EAAE;IAC7C,GAAI,YAAY,EAAE,WAAW,GAAG,EAAE;IACnC;AACD,SAAM,WAAW,QAAQ,WAAW;AACpC,WAAQ,IAAI,OAAO,MAAM,2CAA2C,CAAC;AACrE;;AAGF,SAAO,OAAO,SAAS,uBAAuB;GAC5C;GACA,GAAI,UAAU,SAAS,IAAI,EAAE,WAAW,GAAG,EAAE;GAC7C,GAAI,YAAY,EAAE,WAAW,GAAG,EAAE;GAClC,sBAAsB;GACvB;AACD,QAAM,WAAW,QAAQ,WAAW;AACpC,UAAQ,IAAI,OAAO,MAAM,0CAA0C,CAAC;GACpE;AAEJ,KACG,QAAQ,uBAAuB,CAC/B,YAAY,oDAAoD,CAChE,OAAO,iBAAiB,+DAA+D,CACvF,OAAO,iBAAiB,6BAA6B,CACrD,OAAO,eAAe,iCAAiC,MAAM,SAAS,GAAG,GAAG,EAAE,EAAE,CAChF,OAAO,kBAAkB,iDAAiD,CAC1E,OAAO,kBAAkB,0BAA0B,MAAM,SAAS,GAAG,GAAG,CAAC,CACzE,OACC,OACE,aACA,SACG;EACH,MAAM,SAAS,YAAY,KAAK,IAAI,CAAC,MAAM;AAC3C,MAAI,CAAC,QAAQ;AACX,WAAQ,MAAM,OAAO,IAAI,sBAAsB,CAAC;AAChD,WAAQ,KAAK,EAAE;;EAGjB,MAAM,aAAa,oBAAoB,CAAC;EACxC,MAAM,SAAS,WAAW,WAAW;EACrC,MAAM,YAAYA,QAAY,KAAK,UAAU,qBAAqB;AAClE,QAAM,MAAM,WAAW,EAAE,WAAW,MAAM,CAAC;EAE3C,MAAM,QAAQ,OAAO,SAAS,KAAK,MAAM,KAAK,KAAK,SAAS,KAAK,IAAI,KAAK,MAAM,KAAK,MAAO,GAAG;AAE/F,MAAI;GACF,MAAM,SAAS,MAAM,cAAc;IACjC;IACA,KAAK;IACL,GAAI,KAAK,QAAQ,EAAE,UAAU,KAAK,OAAO,GAAG,EAAE;IAC9C,GAAI,KAAK,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,EAAE;IACxC;IACA,GAAI,OAAO,KAAK,YAAY,YAAY,KAAK,UAAU,IAAI,EAAE,WAAW,KAAK,SAAS,GAAG,EAAE;IAC5F,CAAC;GAEF,MAAM,eAAyB,EAAE;AACjC,QAAK,IAAI,IAAI,GAAG,IAAI,OAAO,OAAO,QAAQ,KAAK;IAC7C,MAAM,MAAM,OAAO,OAAO;IAE1B,MAAM,OAAO,KAAK,WADD,IAAI,UAAU,MAAM,IAAI,SAAS,IAAI,EAAE,MAClB;AACtC,UAAM,UAAU,MAAM,IAAI,OAAO;AACjC,iBAAa,KAAK,KAAK;;AAGzB,WAAQ,IAAI,GAAG;AACf,WAAQ,IACN,OAAO,MACL,aAAa,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO,WAAW,IAAI,KAAK,IAAI,WAAW,OAAO,MAAM,IACzG,CACF;AACD,QAAK,MAAM,KAAK,aAAc,SAAQ,IAAI,OAAO,IAAI;AACrD,WAAQ,IAAI,GAAG;WACR,KAAK;AACZ,WAAQ,MAAM,OAAO,IAAI,4BAA4B,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAAG,CAAC;AACzG,WAAQ,KAAK,EAAE;;GAGpB;AAEH,QAAO;;AAGT,SAAS;CACP,IAAI;CACJ,MAAM;CACN,aAAa;CACb,SAAS;CACT,UAAU;EACR,UAAU;EACV,UAAU;GACR;GACA;GACA;GACA;GACD;EACF;CACF,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getContextWithOpts } from "../../context.js";
|
|
2
|
-
import {
|
|
2
|
+
import { getSessionIndex } from "../../utils/session.js";
|
|
3
3
|
//#region src/cli/commands/session/utils.ts
|
|
4
4
|
/**
|
|
5
5
|
* Session command utilities
|
|
@@ -9,7 +9,7 @@ import { getSessionManager } from "../../utils/session.js";
|
|
|
9
9
|
*/
|
|
10
10
|
async function getManager() {
|
|
11
11
|
getContextWithOpts();
|
|
12
|
-
return
|
|
12
|
+
return getSessionIndex();
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
15
|
* Collect multiple option values into array
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":[],"sources":["../../../../../src/cli/commands/session/utils.ts"],"sourcesContent":["/**\n * Session command utilities\n */\n\nimport {
|
|
1
|
+
{"version":3,"file":"utils.js","names":[],"sources":["../../../../../src/cli/commands/session/utils.ts"],"sourcesContent":["/**\n * Session command utilities\n */\n\nimport { getSessionIndex } from '../../utils/session.js';\nimport { getContextWithOpts } from '../../context.js';\nimport type { SessionIndex } from '../../../session/index.js';\n\n/**\n * Get initialized session manager\n */\nexport async function getManager(): Promise<SessionIndex> {\n getContextWithOpts();\n return getSessionIndex();\n}\n\n/**\n * Collect multiple option values into array\n */\nexport function collect(value: string, previous: string[]): string[] {\n return previous.concat([value]);\n}\n"],"mappings":";;;;;;;;;AAWA,eAAsB,aAAoC;AACxD,qBAAoB;AACpB,QAAO,iBAAiB;;;;;AAM1B,SAAgB,QAAQ,OAAe,UAA8B;AACnE,QAAO,SAAS,OAAO,CAAC,MAAM,CAAC"}
|
|
@@ -4,7 +4,7 @@ import { formatExamples, register } from "../registry.js";
|
|
|
4
4
|
import "../../config/index.js";
|
|
5
5
|
import { normalizeUpdateChannel } from "../../infra/update-channels.js";
|
|
6
6
|
import { compareSemver, detectInstallKind, resolveNpmChannelTag, resolvePackageRoot } from "../../infra/update-check.js";
|
|
7
|
-
import {
|
|
7
|
+
import { formatGlobalInstallFailure, resolveGlobalInstallSpec, resolveGlobalManager, runGlobalPackageInstall } from "../../infra/update-global.js";
|
|
8
8
|
import { Command } from "commander";
|
|
9
9
|
//#region src/cli/commands/update.ts
|
|
10
10
|
init_package_version();
|
|
@@ -86,10 +86,9 @@ function createUpdateCommand(_ctx) {
|
|
|
86
86
|
return;
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
|
-
const packageManager =
|
|
90
|
-
const spec =
|
|
89
|
+
const packageManager = await resolveGlobalManager({ root });
|
|
90
|
+
const spec = resolveGlobalInstallSpec({ version: resolved.version });
|
|
91
91
|
if (!options.json) console.log(`Installing ${spec} via ${packageManager}...`);
|
|
92
|
-
const installArgs = buildInstallArgs(packageManager, spec);
|
|
93
92
|
const { acquireUpdateLock } = await import("../../infra/update-lock.js");
|
|
94
93
|
const lock = process.env.XOPC_AUTO_UPDATE ? { release: async () => {} } : await acquireUpdateLock("cli");
|
|
95
94
|
if (!lock) {
|
|
@@ -102,72 +101,53 @@ function createUpdateCommand(_ctx) {
|
|
|
102
101
|
else console.error(`❌ ${message}`);
|
|
103
102
|
process.exit(1);
|
|
104
103
|
}
|
|
105
|
-
let
|
|
104
|
+
let installResult;
|
|
106
105
|
try {
|
|
107
|
-
|
|
106
|
+
installResult = await runGlobalPackageInstall({
|
|
107
|
+
manager: packageManager,
|
|
108
|
+
spec,
|
|
109
|
+
pkgRoot: root,
|
|
110
|
+
echoToTerminal: !options.json
|
|
111
|
+
});
|
|
108
112
|
} finally {
|
|
109
113
|
await lock.release();
|
|
110
114
|
}
|
|
111
|
-
if (exitCode === 0) if (options.json) console.log(JSON.stringify({
|
|
115
|
+
if (installResult.exitCode === 0) if (options.json) console.log(JSON.stringify({
|
|
112
116
|
status: "ok",
|
|
113
117
|
previousVersion: PACKAGE_VERSION,
|
|
114
118
|
installedVersion: resolved.version,
|
|
115
119
|
channel: resolved.tag,
|
|
116
|
-
packageManager
|
|
120
|
+
packageManager: installResult.packageManager
|
|
117
121
|
}));
|
|
118
122
|
else {
|
|
119
123
|
console.log(`✅ Updated to v${resolved.version}`);
|
|
120
124
|
console.log("Restart the gateway to use the new version: xopc gateway restart");
|
|
121
125
|
}
|
|
122
126
|
else {
|
|
127
|
+
const message = formatGlobalInstallFailure({
|
|
128
|
+
packageManager: installResult.packageManager,
|
|
129
|
+
spec,
|
|
130
|
+
exitCode: installResult.exitCode,
|
|
131
|
+
stderr: installResult.stderr,
|
|
132
|
+
usedFallback: installResult.usedFallback
|
|
133
|
+
});
|
|
123
134
|
if (options.json) console.log(JSON.stringify({
|
|
124
135
|
status: "error",
|
|
125
136
|
reason: "install-failed",
|
|
126
|
-
exitCode,
|
|
127
|
-
packageManager
|
|
137
|
+
exitCode: installResult.exitCode,
|
|
138
|
+
packageManager: installResult.packageManager,
|
|
139
|
+
usedFallback: installResult.usedFallback,
|
|
140
|
+
stderrTail: installResult.stderr.trim().slice(-4e3) || void 0,
|
|
141
|
+
message
|
|
128
142
|
}));
|
|
129
143
|
else {
|
|
130
|
-
console.error(`❌ Update failed (exit code ${exitCode})`);
|
|
131
|
-
console.error(
|
|
144
|
+
console.error(`❌ Update failed (exit code ${installResult.exitCode})`);
|
|
145
|
+
console.error(message);
|
|
132
146
|
}
|
|
133
147
|
process.exit(1);
|
|
134
148
|
}
|
|
135
149
|
});
|
|
136
150
|
}
|
|
137
|
-
/**
|
|
138
|
-
* Detect which package manager was used to install xopc globally.
|
|
139
|
-
* Checks common indicators: npm_config_user_agent, process.env, argv paths.
|
|
140
|
-
*/
|
|
141
|
-
function detectGlobalPackageManager() {
|
|
142
|
-
if ((process.env.npm_config_user_agent ?? "").startsWith("pnpm/")) return "pnpm";
|
|
143
|
-
return "npm";
|
|
144
|
-
}
|
|
145
|
-
function buildInstallArgs(manager, spec) {
|
|
146
|
-
if (manager === "pnpm") return [
|
|
147
|
-
"pnpm",
|
|
148
|
-
"add",
|
|
149
|
-
"-g",
|
|
150
|
-
spec
|
|
151
|
-
];
|
|
152
|
-
return [
|
|
153
|
-
"npm",
|
|
154
|
-
"install",
|
|
155
|
-
"-g",
|
|
156
|
-
spec,
|
|
157
|
-
"--no-fund",
|
|
158
|
-
"--no-audit"
|
|
159
|
-
];
|
|
160
|
-
}
|
|
161
|
-
function runInstallCommand(argv) {
|
|
162
|
-
return new Promise((resolve) => {
|
|
163
|
-
const child = spawn(argv[0], argv.slice(1), {
|
|
164
|
-
stdio: "inherit",
|
|
165
|
-
env: process.env
|
|
166
|
-
});
|
|
167
|
-
child.on("error", () => resolve(1));
|
|
168
|
-
child.on("exit", (code) => resolve(code ?? 1));
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
151
|
register({
|
|
172
152
|
id: "update",
|
|
173
153
|
name: "update",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","names":[],"sources":["../../../../src/cli/commands/update.ts"],"sourcesContent":["// src/cli/commands/update.ts\n\nimport { Command } from 'commander';\nimport { spawn } from 'node:child_process';\n\nimport { loadConfig } from '../../config/index.js';\nimport { PACKAGE_VERSION } from '../../package-version.js';\nimport { register, formatExamples, type CLIContext } from '../registry.js';\nimport { normalizeUpdateChannel, DEFAULT_PACKAGE_CHANNEL } from '../../infra/update-channels.js';\nimport {\n resolveNpmChannelTag,\n compareSemver,\n detectInstallKind,\n resolvePackageRoot,\n} from '../../infra/update-check.js';\n\nfunction createUpdateCommand(_ctx: CLIContext): Command {\n return new Command('update')\n .description('Check for and install xopc updates')\n .option('--check', 'Only check for updates without installing')\n .option('--yes', 'Skip confirmation prompts')\n .option('--channel <channel>', 'Update channel: stable, beta, or dev (default: from config, else stable)')\n .option('--json', 'Output results as JSON')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc update',\n 'xopc update --check',\n 'xopc update --channel beta',\n 'xopc update --yes',\n 'xopc update --json',\n ]),\n )\n .action(\n async (options: { check?: boolean; yes?: boolean; channel?: string; json?: boolean }) => {\n const fromCli = options.channel;\n const fromConfig = (() => {\n try {\n return loadConfig().update?.channel;\n } catch {\n return undefined;\n }\n })();\n const channel = normalizeUpdateChannel(fromCli ?? fromConfig) ?? DEFAULT_PACKAGE_CHANNEL;\n\n // Check current install kind\n const root = await resolvePackageRoot();\n if (root) {\n const installKind = await detectInstallKind(root);\n if (installKind === 'git') {\n const message = 'Running from a git checkout. Use `git pull` to update instead.';\n if (options.json) {\n console.log(JSON.stringify({ status: 'skipped', reason: 'git-checkout', message }));\n } else {\n console.log(message);\n }\n return;\n }\n }\n\n if (!options.json) {\n console.log(`Checking for updates (channel: ${channel})...`);\n }\n\n const resolved = await resolveNpmChannelTag({ channel });\n if (!resolved.version) {\n const message = 'Could not reach npm registry. Check your network connection.';\n if (options.json) {\n console.log(JSON.stringify({ status: 'error', reason: 'registry-unreachable', message }));\n } else {\n console.error(message);\n }\n process.exit(1);\n }\n\n const comparison = compareSemver(PACKAGE_VERSION, resolved.version);\n if (comparison === null || comparison >= 0) {\n const message = `Already up to date: v${PACKAGE_VERSION} (${resolved.tag}: v${resolved.version})`;\n if (options.json) {\n console.log(\n JSON.stringify({\n status: 'up-to-date',\n currentVersion: PACKAGE_VERSION,\n latestVersion: resolved.version,\n channel: resolved.tag,\n }),\n );\n } else {\n console.log(`✅ ${message}`);\n }\n return;\n }\n\n if (options.check) {\n const message = `Update available: v${PACKAGE_VERSION} → v${resolved.version} (${resolved.tag})`;\n if (options.json) {\n console.log(\n JSON.stringify({\n status: 'update-available',\n currentVersion: PACKAGE_VERSION,\n latestVersion: resolved.version,\n channel: resolved.tag,\n }),\n );\n } else {\n console.log(`📦 ${message}`);\n console.log('Run `xopc update` to install.');\n }\n return;\n }\n\n if (!options.yes && !process.env.XOPC_AUTO_UPDATE) {\n const { confirm } = await import('@inquirer/prompts');\n const shouldUpdate = await confirm({\n message: `Update from v${PACKAGE_VERSION} to v${resolved.version} (${resolved.tag})?`,\n default: true,\n });\n if (!shouldUpdate) {\n console.log('Update cancelled.');\n return;\n }\n }\n\n const packageManager = detectGlobalPackageManager();\n const spec = `@xopcai/xopc@${resolved.version}`;\n\n if (!options.json) {\n console.log(`Installing ${spec} via ${packageManager}...`);\n }\n\n const installArgs = buildInstallArgs(packageManager, spec);\n\n // Gateway / auto-update spawn this CLI with XOPC_AUTO_UPDATE=1 after acquiring the lock.\n const { acquireUpdateLock } = await import('../../infra/update-lock.js');\n const lock = process.env.XOPC_AUTO_UPDATE\n ? { release: async () => {} }\n : await acquireUpdateLock('cli');\n if (!lock) {\n const message = 'Another update is already in progress. Try again later.';\n if (options.json) {\n console.log(JSON.stringify({ status: 'error', reason: 'lock-held', message }));\n } else {\n console.error(`❌ ${message}`);\n }\n process.exit(1);\n }\n\n let exitCode: number;\n try {\n exitCode = await runInstallCommand(installArgs);\n } finally {\n await lock.release();\n }\n\n if (exitCode === 0) {\n if (options.json) {\n console.log(\n JSON.stringify({\n status: 'ok',\n previousVersion: PACKAGE_VERSION,\n installedVersion: resolved.version,\n channel: resolved.tag,\n packageManager,\n }),\n );\n } else {\n console.log(`✅ Updated to v${resolved.version}`);\n console.log('Restart the gateway to use the new version: xopc gateway restart');\n }\n } else {\n if (options.json) {\n console.log(\n JSON.stringify({\n status: 'error',\n reason: 'install-failed',\n exitCode,\n packageManager,\n }),\n );\n } else {\n console.error(`❌ Update failed (exit code ${exitCode})`);\n console.error(`Try manually: ${packageManager} install -g ${spec}`);\n }\n process.exit(1);\n }\n },\n );\n}\n\n/**\n * Detect which package manager was used to install xopc globally.\n * Checks common indicators: npm_config_user_agent, process.env, argv paths.\n */\nfunction detectGlobalPackageManager(): 'npm' | 'pnpm' {\n const userAgent = process.env.npm_config_user_agent ?? '';\n if (userAgent.startsWith('pnpm/')) return 'pnpm';\n return 'npm';\n}\n\nfunction buildInstallArgs(manager: 'npm' | 'pnpm', spec: string): string[] {\n if (manager === 'pnpm') {\n return ['pnpm', 'add', '-g', spec];\n }\n return ['npm', 'install', '-g', spec, '--no-fund', '--no-audit'];\n}\n\nfunction runInstallCommand(argv: string[]): Promise<number> {\n return new Promise((resolve) => {\n const child = spawn(argv[0], argv.slice(1), {\n stdio: 'inherit',\n env: process.env,\n });\n child.on('error', () => resolve(1));\n child.on('exit', (code) => resolve(code ?? 1));\n });\n}\n\nregister({\n id: 'update',\n name: 'update',\n description: 'Check for and install xopc updates',\n factory: createUpdateCommand,\n metadata: {\n category: 'maintenance',\n examples: [\n 'xopc update',\n 'xopc update --check',\n 'xopc update --channel beta',\n 'xopc update --yes --json',\n ],\n },\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"update.js","names":[],"sources":["../../../../src/cli/commands/update.ts"],"sourcesContent":["// src/cli/commands/update.ts\n\nimport { Command } from 'commander';\n\nimport { loadConfig } from '../../config/index.js';\nimport {\n formatGlobalInstallFailure,\n resolveGlobalInstallSpec,\n resolveGlobalManager,\n runGlobalPackageInstall,\n} from '../../infra/update-global.js';\nimport { normalizeUpdateChannel, DEFAULT_PACKAGE_CHANNEL } from '../../infra/update-channels.js';\nimport {\n resolveNpmChannelTag,\n compareSemver,\n detectInstallKind,\n resolvePackageRoot,\n} from '../../infra/update-check.js';\nimport { PACKAGE_VERSION } from '../../package-version.js';\nimport { register, formatExamples, type CLIContext } from '../registry.js';\n\nfunction createUpdateCommand(_ctx: CLIContext): Command {\n return new Command('update')\n .description('Check for and install xopc updates')\n .option('--check', 'Only check for updates without installing')\n .option('--yes', 'Skip confirmation prompts')\n .option('--channel <channel>', 'Update channel: stable, beta, or dev (default: from config, else stable)')\n .option('--json', 'Output results as JSON')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc update',\n 'xopc update --check',\n 'xopc update --channel beta',\n 'xopc update --yes',\n 'xopc update --json',\n ]),\n )\n .action(\n async (options: { check?: boolean; yes?: boolean; channel?: string; json?: boolean }) => {\n const fromCli = options.channel;\n const fromConfig = (() => {\n try {\n return loadConfig().update?.channel;\n } catch {\n return undefined;\n }\n })();\n const channel = normalizeUpdateChannel(fromCli ?? fromConfig) ?? DEFAULT_PACKAGE_CHANNEL;\n\n const root = await resolvePackageRoot();\n if (root) {\n const installKind = await detectInstallKind(root);\n if (installKind === 'git') {\n const message = 'Running from a git checkout. Use `git pull` to update instead.';\n if (options.json) {\n console.log(JSON.stringify({ status: 'skipped', reason: 'git-checkout', message }));\n } else {\n console.log(message);\n }\n return;\n }\n }\n\n if (!options.json) {\n console.log(`Checking for updates (channel: ${channel})...`);\n }\n\n const resolved = await resolveNpmChannelTag({ channel });\n if (!resolved.version) {\n const message = 'Could not reach npm registry. Check your network connection.';\n if (options.json) {\n console.log(JSON.stringify({ status: 'error', reason: 'registry-unreachable', message }));\n } else {\n console.error(message);\n }\n process.exit(1);\n }\n\n const comparison = compareSemver(PACKAGE_VERSION, resolved.version);\n if (comparison === null || comparison >= 0) {\n const message = `Already up to date: v${PACKAGE_VERSION} (${resolved.tag}: v${resolved.version})`;\n if (options.json) {\n console.log(\n JSON.stringify({\n status: 'up-to-date',\n currentVersion: PACKAGE_VERSION,\n latestVersion: resolved.version,\n channel: resolved.tag,\n }),\n );\n } else {\n console.log(`✅ ${message}`);\n }\n return;\n }\n\n if (options.check) {\n const message = `Update available: v${PACKAGE_VERSION} → v${resolved.version} (${resolved.tag})`;\n if (options.json) {\n console.log(\n JSON.stringify({\n status: 'update-available',\n currentVersion: PACKAGE_VERSION,\n latestVersion: resolved.version,\n channel: resolved.tag,\n }),\n );\n } else {\n console.log(`📦 ${message}`);\n console.log('Run `xopc update` to install.');\n }\n return;\n }\n\n if (!options.yes && !process.env.XOPC_AUTO_UPDATE) {\n const { confirm } = await import('@inquirer/prompts');\n const shouldUpdate = await confirm({\n message: `Update from v${PACKAGE_VERSION} to v${resolved.version} (${resolved.tag})?`,\n default: true,\n });\n if (!shouldUpdate) {\n console.log('Update cancelled.');\n return;\n }\n }\n\n const packageManager = await resolveGlobalManager({ root });\n const spec = resolveGlobalInstallSpec({ version: resolved.version });\n\n if (!options.json) {\n console.log(`Installing ${spec} via ${packageManager}...`);\n }\n\n const { acquireUpdateLock } = await import('../../infra/update-lock.js');\n const lock = process.env.XOPC_AUTO_UPDATE\n ? { release: async () => {} }\n : await acquireUpdateLock('cli');\n if (!lock) {\n const message = 'Another update is already in progress. Try again later.';\n if (options.json) {\n console.log(JSON.stringify({ status: 'error', reason: 'lock-held', message }));\n } else {\n console.error(`❌ ${message}`);\n }\n process.exit(1);\n }\n\n let installResult: Awaited<ReturnType<typeof runGlobalPackageInstall>>;\n try {\n installResult = await runGlobalPackageInstall({\n manager: packageManager,\n spec,\n pkgRoot: root,\n echoToTerminal: !options.json,\n });\n } finally {\n await lock.release();\n }\n\n if (installResult.exitCode === 0) {\n if (options.json) {\n console.log(\n JSON.stringify({\n status: 'ok',\n previousVersion: PACKAGE_VERSION,\n installedVersion: resolved.version,\n channel: resolved.tag,\n packageManager: installResult.packageManager,\n }),\n );\n } else {\n console.log(`✅ Updated to v${resolved.version}`);\n console.log('Restart the gateway to use the new version: xopc gateway restart');\n }\n } else {\n const message = formatGlobalInstallFailure({\n packageManager: installResult.packageManager,\n spec,\n exitCode: installResult.exitCode,\n stderr: installResult.stderr,\n usedFallback: installResult.usedFallback,\n });\n if (options.json) {\n console.log(\n JSON.stringify({\n status: 'error',\n reason: 'install-failed',\n exitCode: installResult.exitCode,\n packageManager: installResult.packageManager,\n usedFallback: installResult.usedFallback,\n stderrTail: installResult.stderr.trim().slice(-4000) || undefined,\n message,\n }),\n );\n } else {\n console.error(`❌ Update failed (exit code ${installResult.exitCode})`);\n console.error(message);\n }\n process.exit(1);\n }\n },\n );\n}\n\nregister({\n id: 'update',\n name: 'update',\n description: 'Check for and install xopc updates',\n factory: createUpdateCommand,\n metadata: {\n category: 'maintenance',\n examples: [\n 'xopc update',\n 'xopc update --check',\n 'xopc update --channel beta',\n 'xopc update --yes --json',\n ],\n },\n});\n"],"mappings":"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"}
|
|
@@ -7,11 +7,6 @@ import { SessionIndex } from '../../session/index.js';
|
|
|
7
7
|
* Eliminates repeated initialization boilerplate
|
|
8
8
|
*/
|
|
9
9
|
export declare function getSessionIndex(): Promise<SessionIndex>;
|
|
10
|
-
/**
|
|
11
|
-
* Get session manager and handle errors consistently
|
|
12
|
-
*/
|
|
13
|
-
/** @deprecated Use {@link getSessionIndex}. */
|
|
14
|
-
export declare const getSessionManager: typeof getSessionIndex;
|
|
15
10
|
export declare function getSessionIndexSafe(): Promise<{
|
|
16
11
|
manager: SessionIndex;
|
|
17
12
|
error: null;
|