@xopcai/xopc 0.0.115 → 0.0.117
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/README.md +26 -10
- package/README.zh-CN.md +26 -10
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/demo-memory/src/index.d.ts +6 -0
- package/dist/extensions/demo-memory/src/index.js +132 -0
- package/dist/extensions/demo-memory/src/index.js.map +1 -0
- package/dist/extensions/demo-memory/xopc.extension.json +15 -0
- package/dist/extensions/feishu/src/schema/config-schema.d.ts +3 -3
- package/dist/extensions/telegram/src/command-handler.js +1 -2
- package/dist/extensions/telegram/src/command-handler.js.map +1 -1
- package/dist/extensions/telegram/src/config-schema.d.ts +8 -8
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DVnBfANm.js → agent-avatar-dicebear-BBLhJ2C6.js} +1 -1
- package/dist/gateway/static/root/assets/agents-C6xgagZd.js +71 -0
- package/dist/gateway/static/root/assets/app-management-settings-panel-CBpLONvG.js +1 -0
- package/dist/gateway/static/root/assets/{appearance-settings-BQpPSTHD.js → appearance-settings-CGcc54yj.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-DdDx0V4z.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-CXu-Csep.js → archive-plugin-DZsVqMhU.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-BAjgOoGY.js → attachment-load-CIol6JWX.js} +1 -1
- package/dist/gateway/static/root/assets/{binary-plugins-BSBgB2hO.js → binary-plugins-B3UauMfp.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-BpXw9TTR.js → block-editor-2HJoFchH.js} +3 -3
- package/dist/gateway/static/root/assets/browser-settings-page-CUOO-PQk.js +8 -0
- package/dist/gateway/static/root/assets/capability-presets-api-XQoMTI0A.js +1 -0
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-CfqF-kGr.js +1 -0
- package/dist/gateway/static/root/assets/{channels-settings-BbPUpzWB.js → channels-settings-BYyRzsex.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-DIvEz4NX.js +2 -0
- package/dist/gateway/static/root/assets/cron-api-R41aQCX9.js +1 -0
- package/dist/gateway/static/root/assets/cron-page-D97nFqQD.js +3 -0
- package/dist/gateway/static/root/assets/dreaming-settings-Bceaw1PG.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-D9kgUHCc.js → extension-debug-page-DX5WRE_t.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CGyhXqzR.js → extension-page-Buah7Bw-.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DL8Xquqd.js → extension-settings-page-DuroLVnf.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-D0VXA932.js → fetch-B5zdl27C.js} +1 -1
- package/dist/gateway/static/root/assets/{format-interval-label-Be8SmgUw.js → format-interval-label-Dn_QKIqb.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-config-api-gT4ZhE7h.js +1 -0
- package/dist/gateway/static/root/assets/gateway-settings-iISWAZRm.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-DERUH61L.js → gateway-startup-retry-B3kL8KGY.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-DCUROLMQ.js +1 -0
- package/dist/gateway/static/root/assets/{goals-config-api-BPmqWk90.js → goals-config-api-AR-fVh0P.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-Cpb21ezg.js +2 -0
- package/dist/gateway/static/root/assets/goals-settings-CPAuFwoD.js +1 -0
- package/dist/gateway/static/root/assets/{heartbeat-config-api-Bfdzr8oV.js → heartbeat-config-api-D7bKFEeO.js} +1 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-CC69vNx0.js +1 -0
- package/dist/gateway/static/root/assets/index-CwhK8qCh.js +122 -0
- package/dist/gateway/static/root/assets/index-CyfhARL-.css +1 -0
- package/dist/gateway/static/root/assets/{interval-presets-utKbuCRY.js → interval-presets-0DtsnxE0.js} +1 -1
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CjqS6c6V.js → keyboard-shortcuts-settings-BPREtN8B.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-DefCgF4o.js +2 -0
- package/dist/gateway/static/root/assets/{markdown-split-DW8C47iB.js → markdown-split-ChbR9LGO.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-D6HwDhDT.js → media-plugins-B82oP80n.js} +1 -1
- package/dist/gateway/static/root/assets/messages-Cf1O9JB0.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-DmKiIihT.js +2 -0
- package/dist/gateway/static/root/assets/note-detail-page-CxxfLRJZ.js +2 -0
- package/dist/gateway/static/root/assets/{note-image-lightbox-pJM35Pz5.js → note-image-lightbox-CDknITM3.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-X2slSx7V.js +1 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-CVwHuyN6.js → preview-open-alternatives-DV3xQsWB.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BvmUWqgu.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-Ba-UEk7x.js → save-bar-controls-BODCXnvY.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-CNN9595U.js → schedule-field-CgJSCD3B.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-DnNMmtD5.js → schema-form-qtfEI6QM.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-B0yESuuL.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-q2M8RKOo.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-CmOz80i5.js → settings-collapsible-section-BHZKjVcS.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-BmK7JJOV.js → settings-form-section-5i35D-J1.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-CGozabLD.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-FoOSe6nU.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-Dp2qGrHC.js → share-preview-page-B0H63tDv.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-Cy5zWyYQ.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-DaZNFro9.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-CnwtUzvw.js +2 -0
- package/dist/gateway/static/root/assets/system-settings-panel-DXs2VmBt.js +1 -0
- package/dist/gateway/static/root/assets/typed-models-lib-4gPuydz_.js +1 -0
- package/dist/gateway/static/root/assets/{use-channel-catalog-CHlO8J9G.js → use-channel-catalog-BCjP_VHb.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DvKiOglO.js +1 -0
- package/dist/gateway/static/root/assets/{voice-player-store-DDDWYHvg.js → voice-player-store-BlF9V05n.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-CAVZcONQ.js +18 -0
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +1 -1
- package/dist/src/agent/agent-manager.js +7 -8
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/agent-scope.js +6 -8
- package/dist/src/agent/agent-scope.js.map +1 -1
- package/dist/src/agent/background-review/coordinator.js +0 -1
- package/dist/src/agent/background-review/coordinator.js.map +1 -1
- package/dist/src/agent/background-review/run-background-review.d.ts +0 -2
- package/dist/src/agent/background-review/run-background-review.js +2 -4
- package/dist/src/agent/background-review/run-background-review.js.map +1 -1
- package/dist/src/agent/background-review/settings.js +8 -7
- package/dist/src/agent/background-review/settings.js.map +1 -1
- package/dist/src/agent/bootstrap/bootstrap-context.d.ts +2 -2
- package/dist/src/agent/bootstrap/bootstrap-context.js +4 -4
- package/dist/src/agent/bootstrap/bootstrap-context.js.map +1 -1
- package/dist/src/agent/context/workspace-seed.js +1 -1
- package/dist/src/agent/embedded/run-for-session.js +1 -1
- package/dist/src/agent/embedded/run-for-session.js.map +1 -1
- package/dist/src/agent/fallback/candidates.js +6 -3
- package/dist/src/agent/fallback/candidates.js.map +1 -1
- package/dist/src/agent/goals/checklist-judge.d.ts +1 -0
- package/dist/src/agent/goals/checklist-judge.js +1 -1
- package/dist/src/agent/goals/checklist-judge.js.map +1 -1
- package/dist/src/agent/goals/evaluate-turn.d.ts +1 -0
- package/dist/src/agent/goals/evaluate-turn.js +1 -0
- package/dist/src/agent/goals/evaluate-turn.js.map +1 -1
- package/dist/src/agent/goals/post-turn.js +8 -1
- package/dist/src/agent/goals/post-turn.js.map +1 -1
- package/dist/src/agent/image/generation/runtime-types.d.ts +2 -0
- package/dist/src/agent/image/generation/runtime.js +1 -1
- package/dist/src/agent/image/generation/runtime.js.map +1 -1
- package/dist/src/agent/image/image-helpers.d.ts +1 -1
- package/dist/src/agent/image/image-helpers.js +4 -17
- package/dist/src/agent/image/image-helpers.js.map +1 -1
- package/dist/src/agent/image/image-model-fallback.js +1 -1
- package/dist/src/agent/image/image-model-fallback.js.map +1 -1
- package/dist/src/agent/image/inbound-image-handling.js +1 -1
- package/dist/src/agent/image/inbound-image-handling.js.map +1 -1
- package/dist/src/agent/image/tool-model-config.d.ts +1 -1
- package/dist/src/agent/image/tool-model-config.js +2 -2
- package/dist/src/agent/image/tool-model-config.js.map +1 -1
- package/dist/src/agent/image/understanding/pi-ai-provider.js +5 -2
- package/dist/src/agent/image/understanding/pi-ai-provider.js.map +1 -1
- package/dist/src/agent/image/understanding/provider-registry.d.ts +1 -0
- package/dist/src/agent/image/understanding/provider-registry.js +16 -2
- package/dist/src/agent/image/understanding/provider-registry.js.map +1 -1
- package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js +1 -1
- package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js.map +1 -1
- package/dist/src/agent/media-generation/runtime-shared.d.ts +5 -2
- package/dist/src/agent/media-generation/runtime-shared.js +1 -1
- package/dist/src/agent/media-generation/runtime-shared.js.map +1 -1
- package/dist/src/agent/memory/builtin-memory-store.d.ts +2 -0
- package/dist/src/agent/memory/builtin-memory-store.js +4 -0
- package/dist/src/agent/memory/builtin-memory-store.js.map +1 -1
- package/dist/src/agent/memory/builtin-provider.d.ts +31 -9
- package/dist/src/agent/memory/builtin-provider.js +261 -11
- package/dist/src/agent/memory/builtin-provider.js.map +1 -1
- package/dist/src/agent/memory/context-assembler.d.ts +10 -0
- package/dist/src/agent/memory/context-assembler.js +26 -0
- package/dist/src/agent/memory/context-assembler.js.map +1 -0
- package/dist/src/agent/memory/create-memory-manager.js +25 -7
- package/dist/src/agent/memory/create-memory-manager.js.map +1 -1
- package/dist/src/agent/memory/dreaming/config.d.ts +1 -6
- package/dist/src/agent/memory/dreaming/config.js +8 -8
- package/dist/src/agent/memory/dreaming/config.js.map +1 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.d.ts +2 -0
- package/dist/src/agent/memory/dreaming/deep-promotion.js +24 -0
- package/dist/src/agent/memory/dreaming/deep-promotion.js.map +1 -1
- package/dist/src/agent/memory/index.d.ts +1 -0
- package/dist/src/agent/memory/index.js +4 -3
- package/dist/src/agent/memory/inject-prefetch.js +6 -2
- package/dist/src/agent/memory/inject-prefetch.js.map +1 -1
- package/dist/src/agent/memory/manager.d.ts +37 -1
- package/dist/src/agent/memory/manager.js +332 -40
- package/dist/src/agent/memory/manager.js.map +1 -1
- package/dist/src/agent/memory/memory-config.js +12 -15
- package/dist/src/agent/memory/memory-config.js.map +1 -1
- package/dist/src/agent/memory/plugin-discovery.d.ts +19 -5
- package/dist/src/agent/memory/plugin-discovery.js +97 -31
- package/dist/src/agent/memory/plugin-discovery.js.map +1 -1
- package/dist/src/agent/memory/provider.d.ts +20 -15
- package/dist/src/agent/memory/stub-memory-provider.d.ts +17 -2
- package/dist/src/agent/memory/stub-memory-provider.js +20 -3
- package/dist/src/agent/memory/stub-memory-provider.js.map +1 -1
- package/dist/src/agent/memory/types.d.ts +136 -0
- package/dist/src/agent/models/manager.d.ts +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/models/manager.js.map +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.d.ts +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +2 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +2 -2
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.d.ts +2 -6
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js +2 -8
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js.map +1 -1
- package/dist/src/agent/reply/post-compaction-context.js +11 -6
- package/dist/src/agent/reply/post-compaction-context.js.map +1 -1
- package/dist/src/agent/reply/startup-context.js +8 -9
- package/dist/src/agent/reply/startup-context.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.js +1 -4
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service/session-context-report.js +1 -1
- package/dist/src/agent/service/session-context-report.js.map +1 -1
- package/dist/src/agent/service.js +21 -25
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/service.types.d.ts +1 -2
- package/dist/src/agent/session/session-hydrator.js +1 -2
- package/dist/src/agent/session/session-hydrator.js.map +1 -1
- package/dist/src/agent/session/session-inspector.d.ts +1 -1
- package/dist/src/agent/session/session-inspector.js +9 -14
- package/dist/src/agent/session/session-inspector.js.map +1 -1
- package/dist/src/agent/skills/hub-pull.js +1 -1
- package/dist/src/agent/starter-agents.d.ts +1 -3
- package/dist/src/agent/starter-agents.js +13 -21
- package/dist/src/agent/starter-agents.js.map +1 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -2
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
- package/dist/src/agent/tools/composio-tool.d.ts +8 -0
- package/dist/src/agent/tools/composio-tool.js +46 -0
- package/dist/src/agent/tools/composio-tool.js.map +1 -0
- package/dist/src/agent/tools/curated-memory-tool.d.ts +2 -5
- package/dist/src/agent/tools/curated-memory-tool.js +20 -16
- package/dist/src/agent/tools/curated-memory-tool.js.map +1 -1
- package/dist/src/agent/tools/factory.d.ts +0 -4
- package/dist/src/agent/tools/factory.js +32 -66
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/image-generate-tool.d.ts +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +19 -14
- package/dist/src/agent/tools/image-generate-tool.js.map +1 -1
- package/dist/src/agent/tools/image-tool.js +1 -3
- package/dist/src/agent/tools/image-tool.js.map +1 -1
- package/dist/src/agent/tools/index.d.ts +1 -0
- package/dist/src/agent/tools/index.js +2 -1
- package/dist/src/agent/tools/memory-tool.d.ts +2 -2
- package/dist/src/agent/tools/memory-tool.js +39 -14
- package/dist/src/agent/tools/memory-tool.js.map +1 -1
- package/dist/src/agent/tools/session-search-tool.js +1 -3
- package/dist/src/agent/tools/session-search-tool.js.map +1 -1
- package/dist/src/agent/tools/web-extract.js +6 -5
- package/dist/src/agent/tools/web-extract.js.map +1 -1
- package/dist/src/agent/workflow/builtins/audit-repo.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/audit-repo.js +15 -2
- package/dist/src/agent/workflow/builtins/audit-repo.js.map +1 -1
- package/dist/src/agent/workflow/builtins/client-proposal.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/client-proposal.js +10 -1
- package/dist/src/agent/workflow/builtins/client-proposal.js.map +1 -1
- package/dist/src/agent/workflow/builtins/competitor-scan.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/competitor-scan.js +16 -2
- package/dist/src/agent/workflow/builtins/competitor-scan.js.map +1 -1
- package/dist/src/agent/workflow/builtins/content-draft.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/content-draft.js +15 -2
- package/dist/src/agent/workflow/builtins/content-draft.js.map +1 -1
- package/dist/src/agent/workflow/builtins/content-repurpose.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/content-repurpose.js +10 -1
- package/dist/src/agent/workflow/builtins/content-repurpose.js.map +1 -1
- package/dist/src/agent/workflow/builtins/debug-incident.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/debug-incident.js +9 -1
- package/dist/src/agent/workflow/builtins/debug-incident.js.map +1 -1
- package/dist/src/agent/workflow/builtins/decision-compare.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/decision-compare.js +16 -2
- package/dist/src/agent/workflow/builtins/decision-compare.js.map +1 -1
- package/dist/src/agent/workflow/builtins/implementation-plan.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/implementation-plan.js +11 -1
- package/dist/src/agent/workflow/builtins/implementation-plan.js.map +1 -1
- package/dist/src/agent/workflow/builtins/inbox-triage.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/inbox-triage.js +11 -1
- package/dist/src/agent/workflow/builtins/inbox-triage.js.map +1 -1
- package/dist/src/agent/workflow/builtins/meeting-prep.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/meeting-prep.js +9 -1
- package/dist/src/agent/workflow/builtins/meeting-prep.js.map +1 -1
- package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/multi-perspective-review.js +9 -1
- package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +1 -1
- package/dist/src/agent/workflow/builtins/offer-design.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/offer-design.js +10 -1
- package/dist/src/agent/workflow/builtins/offer-design.js.map +1 -1
- package/dist/src/agent/workflow/builtins/pr-review.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/pr-review.js +9 -1
- package/dist/src/agent/workflow/builtins/pr-review.js.map +1 -1
- package/dist/src/agent/workflow/builtins/release-check.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/release-check.js +10 -1
- package/dist/src/agent/workflow/builtins/release-check.js.map +1 -1
- package/dist/src/agent/workflow/builtins/research.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/research.js +16 -2
- package/dist/src/agent/workflow/builtins/research.js.map +1 -1
- package/dist/src/agent/workflow/builtins/weekly-review.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/weekly-review.js +9 -1
- package/dist/src/agent/workflow/builtins/weekly-review.js.map +1 -1
- package/dist/src/agent/workflow/subagent-runner.js +1 -3
- package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
- package/dist/src/agent-manifest/index.d.ts +4 -0
- package/dist/src/agent-manifest/index.js +10 -0
- package/dist/src/agent-manifest/index.js.map +1 -0
- package/dist/src/agent-manifest/prompt.d.ts +2 -0
- package/dist/src/agent-manifest/prompt.js +57 -0
- package/dist/src/agent-manifest/prompt.js.map +1 -0
- package/dist/src/agent-manifest/resolver.d.ts +11 -0
- package/dist/src/agent-manifest/resolver.js +93 -0
- package/dist/src/agent-manifest/resolver.js.map +1 -0
- package/dist/src/agent-manifest/schema.d.ts +778 -0
- package/dist/src/agent-manifest/schema.js +267 -0
- package/dist/src/agent-manifest/schema.js.map +1 -0
- package/dist/src/agent-manifest/validator.d.ts +24 -0
- package/dist/src/agent-manifest/validator.js +87 -0
- package/dist/src/agent-manifest/validator.js.map +1 -0
- package/dist/src/agent-runtime/boundary-guard.d.ts +12 -0
- package/dist/src/agent-runtime/boundary-guard.js +23 -0
- package/dist/src/agent-runtime/boundary-guard.js.map +1 -0
- package/dist/src/agent-runtime/index.d.ts +7 -0
- package/dist/src/agent-runtime/index.js +8 -0
- package/dist/src/agent-runtime/memory-runtime.d.ts +21 -0
- package/dist/src/agent-runtime/memory-runtime.js +50 -0
- package/dist/src/agent-runtime/memory-runtime.js.map +1 -0
- package/dist/src/agent-runtime/model-router.d.ts +11 -0
- package/dist/src/agent-runtime/model-router.js +16 -0
- package/dist/src/agent-runtime/model-router.js.map +1 -0
- package/dist/src/agent-runtime/run-trace.d.ts +27 -0
- package/dist/src/agent-runtime/run-trace.js +53 -0
- package/dist/src/agent-runtime/run-trace.js.map +1 -0
- package/dist/src/agent-runtime/runtime-profile.d.ts +24 -0
- package/dist/src/agent-runtime/runtime-profile.js +44 -0
- package/dist/src/agent-runtime/runtime-profile.js.map +1 -0
- package/dist/src/agent-runtime/tool-registry.d.ts +28 -0
- package/dist/src/agent-runtime/tool-registry.js +52 -0
- package/dist/src/agent-runtime/tool-registry.js.map +1 -0
- package/dist/src/agent-runtime/workflow-runtime.d.ts +31 -0
- package/dist/src/agent-runtime/workflow-runtime.js +34 -0
- package/dist/src/agent-runtime/workflow-runtime.js.map +1 -0
- package/dist/src/browser/actions/extension-registry-bridge.js +1 -1
- package/dist/src/browser/actions/extension-registry-bridge.js.map +1 -1
- package/dist/src/browser/actions/registry.js +5 -8
- package/dist/src/browser/actions/registry.js.map +1 -1
- package/dist/src/browser/backend-from-config.d.ts +1 -1
- package/dist/src/browser/backend-from-config.js +50 -71
- package/dist/src/browser/backend-from-config.js.map +1 -1
- package/dist/src/browser/browser-command-timeout.d.ts +0 -1
- package/dist/src/browser/browser-command-timeout.js +3 -7
- package/dist/src/browser/browser-command-timeout.js.map +1 -1
- package/dist/src/browser/providers/browser-ext-install.d.ts +2 -12
- package/dist/src/browser/providers/browser-ext-install.js +3 -8
- package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
- package/dist/src/browser/readiness.js +16 -16
- package/dist/src/browser/readiness.js.map +1 -1
- package/dist/src/browser/schemas.js +1 -1
- package/dist/src/browser/schemas.js.map +1 -1
- package/dist/src/chat-commands/builtins/config.js +4 -4
- package/dist/src/chat-commands/builtins/config.js.map +1 -1
- package/dist/src/chat-commands/builtins/thinking.js +16 -42
- package/dist/src/chat-commands/builtins/thinking.js.map +1 -1
- package/dist/src/chat-commands/config-paths.js +1 -1
- package/dist/src/chat-commands/config-paths.js.map +1 -1
- package/dist/src/chat-commands/context.js +3 -4
- package/dist/src/chat-commands/context.js.map +1 -1
- package/dist/src/cli/command-manifest.js +1 -1
- package/dist/src/cli/command-manifest.js.map +1 -1
- package/dist/src/cli/commands/agent.js +3 -1
- package/dist/src/cli/commands/agent.js.map +1 -1
- package/dist/src/cli/commands/agents.js +3 -6
- package/dist/src/cli/commands/agents.js.map +1 -1
- package/dist/src/cli/commands/browser-cli-helpers.js +9 -11
- package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
- package/dist/src/cli/commands/config.js +5 -5
- package/dist/src/cli/commands/config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -17
- package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
- package/dist/src/cli/commands/goal.js +1 -1
- package/dist/src/cli/commands/image.js +13 -372
- package/dist/src/cli/commands/image.js.map +1 -1
- package/dist/src/cli/commands/models.js +26 -10
- package/dist/src/cli/commands/models.js.map +1 -1
- package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
- package/dist/src/cli/commands/onboard/model.js +20 -22
- package/dist/src/cli/commands/onboard/model.js.map +1 -1
- package/dist/src/cli/commands/onboard.js +1 -1
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/utils/init-workspace-core.d.ts +1 -4
- package/dist/src/cli/utils/init-workspace-core.js +7 -6
- package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
- package/dist/src/commands/agents.config.d.ts +0 -1
- package/dist/src/commands/agents.config.js +66 -12
- package/dist/src/commands/agents.config.js.map +1 -1
- package/dist/src/config/agent-profile.d.ts +5 -17
- package/dist/src/config/agent-profile.js +31 -64
- package/dist/src/config/agent-profile.js.map +1 -1
- package/dist/src/config/agent-typed-models.d.ts +1 -1
- package/dist/src/config/agent-typed-models.js +0 -1
- package/dist/src/config/agent-typed-models.js.map +1 -1
- package/dist/src/config/index.js +3 -3
- package/dist/src/config/integration.d.ts +1 -1
- package/dist/src/config/reload.js +1 -1
- package/dist/src/config/reload.js.map +1 -1
- package/dist/src/config/rules.js +6 -56
- package/dist/src/config/rules.js.map +1 -1
- package/dist/src/config/schema.d.ts +925 -781
- package/dist/src/config/schema.js +157 -424
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/connectors/composio-triggers.d.ts +10 -0
- package/dist/src/connectors/composio-triggers.js +32 -0
- package/dist/src/connectors/composio-triggers.js.map +1 -0
- package/dist/src/connectors/composio.d.ts +54 -0
- package/dist/src/connectors/composio.js +334 -0
- package/dist/src/connectors/composio.js.map +1 -0
- package/dist/src/connectors/health.js +16 -1
- package/dist/src/connectors/health.js.map +1 -1
- package/dist/src/connectors/install.d.ts +2 -1
- package/dist/src/connectors/install.js +50 -13
- package/dist/src/connectors/install.js.map +1 -1
- package/dist/src/connectors/instances.js +57 -6
- package/dist/src/connectors/instances.js.map +1 -1
- package/dist/src/connectors/lifecycle.d.ts +3 -0
- package/dist/src/connectors/lifecycle.js +23 -0
- package/dist/src/connectors/lifecycle.js.map +1 -0
- package/dist/src/connectors/materialize.js +2 -1
- package/dist/src/connectors/materialize.js.map +1 -1
- package/dist/src/connectors/providers.d.ts +1 -0
- package/dist/src/connectors/providers.js +10 -2
- package/dist/src/connectors/providers.js.map +1 -1
- package/dist/src/connectors/registries/modelscope.d.ts +2 -0
- package/dist/src/connectors/registries/modelscope.js +205 -0
- package/dist/src/connectors/registries/modelscope.js.map +1 -0
- package/dist/src/connectors/registries/official-mcp.d.ts +2 -0
- package/dist/src/connectors/registries/official-mcp.js +142 -0
- package/dist/src/connectors/registries/official-mcp.js.map +1 -0
- package/dist/src/connectors/registries/search.d.ts +12 -0
- package/dist/src/connectors/registries/search.js +89 -0
- package/dist/src/connectors/registries/search.js.map +1 -0
- package/dist/src/connectors/registries/smithery.d.ts +2 -0
- package/dist/src/connectors/registries/smithery.js +98 -0
- package/dist/src/connectors/registries/smithery.js.map +1 -0
- package/dist/src/connectors/registries/types.d.ts +20 -0
- package/dist/src/connectors/registries/types.js +1 -0
- package/dist/src/connectors/secret-store.js +4 -2
- package/dist/src/connectors/secret-store.js.map +1 -1
- package/dist/src/connectors/setup-secrets.d.ts +15 -0
- package/dist/src/connectors/setup-secrets.js +64 -0
- package/dist/src/connectors/setup-secrets.js.map +1 -0
- package/dist/src/connectors/supervisor.d.ts +15 -0
- package/dist/src/connectors/supervisor.js +73 -0
- package/dist/src/connectors/supervisor.js.map +1 -0
- package/dist/src/connectors/types.d.ts +27 -3
- package/dist/src/connectors/usage.js +6 -1
- package/dist/src/connectors/usage.js.map +1 -1
- package/dist/src/cron/index.js +1 -1
- package/dist/src/cron/service.js +1 -1
- package/dist/src/cron/validation.d.ts +3 -3
- package/dist/src/extensions/activation-context.js +13 -7
- package/dist/src/extensions/activation-context.js.map +1 -1
- package/dist/src/gateway/agents-admin.d.ts +17 -18
- package/dist/src/gateway/agents-admin.js +123 -88
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/capability-presets-admin.d.ts +56 -0
- package/dist/src/gateway/capability-presets-admin.js +214 -0
- package/dist/src/gateway/capability-presets-admin.js.map +1 -0
- package/dist/src/gateway/hono/lib/agent-model.d.ts +1 -1
- package/dist/src/gateway/hono/lib/agent-model.js +1 -1
- package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +234 -127
- package/dist/src/gateway/hono/lib/config-payload.js +13 -37
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/routes/agents.js +56 -33
- package/dist/src/gateway/hono/routes/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/browser.js +8 -15
- package/dist/src/gateway/hono/routes/browser.js.map +1 -1
- package/dist/src/gateway/hono/routes/capability-presets.d.ts +3 -0
- package/dist/src/gateway/hono/routes/capability-presets.js +145 -0
- package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +1 -17
- package/dist/src/gateway/hono/routes/config-patch/agents.js +2 -443
- package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +7 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
- package/dist/src/gateway/hono/routes/config.js +1 -1
- package/dist/src/gateway/hono/routes/config.js.map +1 -1
- package/dist/src/gateway/hono/routes/connectors.js +230 -3
- package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +7 -0
- package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
- package/dist/src/gateway/hono/routes/goals.js +52 -5
- package/dist/src/gateway/hono/routes/goals.js.map +1 -1
- package/dist/src/gateway/hono/routes/index.js +2 -0
- package/dist/src/gateway/hono/routes/index.js.map +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/memory.d.ts +3 -0
- package/dist/src/gateway/hono/routes/memory.js +290 -0
- package/dist/src/gateway/hono/routes/memory.js.map +1 -0
- package/dist/src/gateway/hono/routes/voice.js +14 -1
- package/dist/src/gateway/hono/routes/voice.js.map +1 -1
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/service/agent-runner.d.ts +5 -12
- package/dist/src/gateway/service/agent-runner.js +8 -8
- package/dist/src/gateway/service/agent-runner.js.map +1 -1
- package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -10
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service.d.ts +2 -2
- package/dist/src/gateway/service.js +20 -16
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/gateway/user-turn-input.d.ts +18 -0
- package/dist/src/gateway/user-turn-input.js +16 -0
- package/dist/src/gateway/user-turn-input.js.map +1 -0
- package/dist/src/goals/goal-queue-store.d.ts +2 -1
- package/dist/src/goals/goal-queue-store.js +2 -2
- package/dist/src/goals/goal-queue-store.js.map +1 -1
- package/dist/src/goals/goal-queue-types.d.ts +4 -3
- package/dist/src/goals/goal-runner.js +25 -3
- package/dist/src/goals/goal-runner.js.map +1 -1
- package/dist/src/goals/goal-service.d.ts +6 -1
- package/dist/src/goals/goal-service.js +9 -2
- package/dist/src/goals/goal-service.js.map +1 -1
- package/dist/src/goals/goal-store.d.ts +7 -1
- package/dist/src/goals/goal-store.js +42 -0
- package/dist/src/goals/goal-store.js.map +1 -1
- package/dist/src/goals/types.d.ts +10 -0
- package/dist/src/notes/agent-context.js +2 -2
- package/dist/src/providers/index.d.ts +2 -2
- package/dist/src/providers/index.js +10 -14
- package/dist/src/providers/index.js.map +1 -1
- package/dist/src/session/index.js +1 -1
- package/dist/src/session/session-workspace.js +7 -2
- package/dist/src/session/session-workspace.js.map +1 -1
- package/dist/src/session/store.js +5 -0
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/thinking-resolve.d.ts +1 -1
- package/dist/src/session/thinking-resolve.js +1 -1
- package/dist/src/session/thinking-resolve.js.map +1 -1
- package/dist/src/storage/sqlite/connection.js +1 -1
- package/dist/src/storage/sqlite/index.d.ts +1 -0
- package/dist/src/storage/sqlite/index.js +2 -1
- package/dist/src/storage/sqlite/memory-records-repository.d.ts +101 -0
- package/dist/src/storage/sqlite/memory-records-repository.js +309 -0
- package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -0
- package/dist/src/storage/sqlite/migrations/011_goal_context_messages.sql +8 -0
- package/dist/src/storage/sqlite/migrations/012_memory_records.sql +63 -0
- package/dist/src/storage/sqlite/migrations/013_memory_trace_events.sql +21 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +2 -2
- package/dist/src/storage/sqlite/migrations/runner.js +4 -4
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +2 -2
- package/dist/src/storage/sqlite/schema.js +3 -3
- package/dist/src/storage/sqlite/schema.sql +95 -0
- package/dist/src/tui/backends/embedded-backend.js +6 -4
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
- package/dist/src/voice/tts/openai-compatible-speech.d.ts +1 -1
- package/dist/src/voice/tts/openai-compatible-speech.js.map +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +14 -2
- package/dist/src/voice/tts/providers/edge-speech.js.map +1 -1
- package/dist/src/voice/tts/speak-core.js +3 -3
- package/dist/src/voice/tts/speak-core.js.map +1 -1
- package/dist/src/voice/tts/speech-provider-types.d.ts +2 -2
- package/dist/src/voice/tts/types.js +1 -1
- package/dist/src/voice/tts/types.js.map +1 -1
- package/dist/src/workflows/domain/result.d.ts +0 -1
- package/dist/src/workflows/engine/workflow-engine.js +7 -23
- package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
- package/dist/src/workflows/service/workflow-run-service.js +3 -4
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
- package/package.json +4 -3
- package/dist/gateway/static/root/assets/agent-browser-settings-page-DPXc4hz8.js +0 -6
- package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CTJ0YnRQ.js +0 -1
- package/dist/gateway/static/root/assets/agents-zJXQfJ_W.js +0 -71
- package/dist/gateway/static/root/assets/app-management-settings-panel-DzGbdr04.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-CPjfyzSD.js +0 -1
- package/dist/gateway/static/root/assets/config-api-NOoPiIYz.js +0 -3
- package/dist/gateway/static/root/assets/connectors-settings-CAXYMOdp.js +0 -2
- package/dist/gateway/static/root/assets/cron-api-C9BOqAXd.js +0 -1
- package/dist/gateway/static/root/assets/cron-page-DuUbBeKI.js +0 -3
- package/dist/gateway/static/root/assets/dreaming-settings-DQ4DtiK1.js +0 -1
- package/dist/gateway/static/root/assets/gateway-config-api-C-xjn__h.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-BMPwIjKI.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-BJsyjJnF.js +0 -1
- package/dist/gateway/static/root/assets/goals-page-BerDgIhw.js +0 -2
- package/dist/gateway/static/root/assets/goals-settings-ByTjeAto.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-TbHgcjTn.js +0 -1
- package/dist/gateway/static/root/assets/index-AkTrf6Pb.js +0 -122
- package/dist/gateway/static/root/assets/index-fh5sXTj9.css +0 -1
- package/dist/gateway/static/root/assets/logs-page-DGXuPf5B.js +0 -2
- package/dist/gateway/static/root/assets/messages-upgxw6Ub.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-Bot16nn7.js +0 -2
- package/dist/gateway/static/root/assets/note-detail-page-Brlyou8M.js +0 -2
- package/dist/gateway/static/root/assets/notes-page-DvZ4pwc-.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BZEDmxbZ.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-DdGGlsfn.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-DlkEkPf9.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-DFPTrsPF.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-CYCCfgh4.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-Bff1pGd0.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-CJGKpBur.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-C6ocduTD.js +0 -2
- package/dist/gateway/static/root/assets/system-settings-panel-5jrIEr5b.js +0 -1
- package/dist/gateway/static/root/assets/use-agent-defaults-form-BuiXLIs5.js +0 -1
- package/dist/gateway/static/root/assets/use-settings-tab-guard-CW5JORnl.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DDoQyghO.js +0 -1
- package/dist/gateway/static/root/assets/workflow-page.utils-CKjeEGqx.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-B604ehHG.js +0 -18
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","names":[],"sources":["../../../../src/cli/commands/models.ts"],"sourcesContent":["import { input } from '@inquirer/prompts';\nimport { Command } from 'commander';\n\nimport { CredentialResolver } from '../../auth/credentials.js';\nimport { loadConfig, saveConfig } from '../../config/index.js';\nimport type { Config } from '../../config/schema.js';\nimport {\n getAllModels,\n getAvailableModels,\n getConfiguredProviders,\n getProviderAuthState,\n getProviderDisplayName,\n isProviderConfigured,\n providerSupportsApiKey,\n providerSupportsOAuth,\n resolveModel,\n} from '../../providers/index.js';\n\nimport { getContextWithOpts } from '../context.js';\nimport { register, formatExamples, type CLIContext } from '../registry.js';\nimport { colors } from '../utils/colors.js';\nimport { runCliOAuthLogin } from '../utils/oauth-login.js';\n\nconst IMAGE_GENERATION_IDS = new Set([\n 'gpt-image-1',\n 'dall-e-3',\n 'dall-e-2',\n 'wan2.6-t2i',\n 'wan2.7-image-pro',\n 'wan2.7-image',\n 'wan2.1-t2i-turbo',\n 'wan2.1-t2i-plus',\n 'image-01',\n 'image-01-live',\n]);\n\nconst VISION_IDS = new Set([\n 'gpt-4o',\n 'gpt-4o-mini',\n 'gpt-4-turbo',\n 'claude-sonnet-4-5',\n 'claude-haiku-3-5',\n 'gemini-2.0-flash',\n 'gemini-1.5-pro',\n 'qwen-vl-max',\n 'qwen2.5-vl-72b-instruct',\n]);\n\ntype ModelsListOptions = {\n json?: boolean;\n all?: boolean;\n provider?: string;\n};\n\ntype ModelsAuthListOptions = {\n provider?: string;\n json?: boolean;\n};\n\ntype ModelsAuthLoginOptions = {\n method?: 'oauth' | 'api-key';\n setDefault?: boolean;\n};\n\nfunction currentModelRef(config: Config): string | undefined {\n return config.agents?.defaults?.models?.chat?.primary;\n}\n\nfunction setDefaultModel(config: Config, modelRef: string): Config {\n config.agents = config.agents ?? {};\n config.agents.defaults = config.agents.defaults ?? {} as NonNullable<Config['agents']>['defaults'];\n config.agents.defaults.models = {\n ...config.agents.defaults.models,\n chat: { primary: modelRef, fallbacks: [] },\n };\n return config;\n}\n\nfunction modelRef(provider: string, id: string): string {\n return `${provider}/${id}`;\n}\n\nasync function runModelsList(options: ModelsListOptions): Promise<void> {\n const ctx = getContextWithOpts();\n const config = loadConfig(ctx.configPath);\n const configuredProviders = await getConfiguredProviders();\n const providerFilter = options.provider?.trim();\n const models = (options.all ? getAllModels() : await getAvailableModels()).filter((m) =>\n providerFilter ? m.provider === providerFilter : true,\n );\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n defaultModel: currentModelRef(config) ?? null,\n providers: configuredProviders,\n models: models.map((m) => ({\n id: modelRef(m.provider, m.id),\n name: m.name,\n provider: m.provider,\n authConfigured: configuredProviders.includes(m.provider),\n })),\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n console.log('\\n🤖 Models\\n');\n console.log('═'.repeat(60));\n\n console.log(`\\n📌 Current default model: ${currentModelRef(config) ?? 'Not set'}\\n`);\n\n const byProvider = new Map<string, typeof models>();\n for (const model of models) {\n const list = byProvider.get(model.provider) ?? [];\n list.push(model);\n byProvider.set(model.provider, list);\n }\n\n for (const [provider, providerModels] of byProvider) {\n const available = await isProviderConfigured(provider);\n console.log(` [${provider}] ${available ? colors.green('configured') : colors.gray('not configured')}`);\n for (const model of providerModels) {\n const badges: string[] = [];\n if (IMAGE_GENERATION_IDS.has(model.id)) badges.push('gen');\n if (model.input?.includes('image') || VISION_IDS.has(model.id)) badges.push('vision');\n const badgeStr = badges.length > 0 ? ` [${badges.join(', ')}]` : '';\n console.log(` ${available ? '✓' : '○'} ${modelRef(model.provider, model.id)}${badgeStr}`);\n }\n }\n\n console.log('\\nUsage:');\n console.log(' xopc models set openai/gpt-5.5');\n console.log(' xopc models auth login --provider anthropic');\n console.log(' xopc models auth paste-api-key --provider deepseek');\n}\n\nasync function runModelsStatus(options: { json?: boolean }): Promise<void> {\n const ctx = getContextWithOpts();\n const config = loadConfig(ctx.configPath);\n const providers = Array.from(new Set(getAllModels().map((m) => m.provider))).sort();\n const auth = [];\n for (const provider of providers) {\n const state = await getProviderAuthState(provider);\n if (state.authMode !== 'none') {\n auth.push({ provider, ...state });\n }\n }\n\n if (options.json) {\n console.log(JSON.stringify({ defaultModel: currentModelRef(config) ?? null, auth }, null, 2));\n return;\n }\n\n console.log('\\n🤖 Model status\\n');\n console.log(`Default: ${currentModelRef(config) ?? 'Not set'}`);\n console.log('\\nAuth:');\n if (auth.length === 0) {\n console.log(' No provider credentials configured.');\n return;\n }\n for (const entry of auth) {\n const status = entry.authStatus === 'connected' ? colors.green(entry.authStatus) : colors.yellow(entry.authStatus);\n console.log(` ${entry.provider}: ${status} (${entry.authMode})`);\n }\n}\n\nasync function runModelsSet(model: string): Promise<void> {\n const ctx = getContextWithOpts();\n const config = loadConfig(ctx.configPath);\n const resolved = resolveModel(model);\n const ref = modelRef(resolved.provider, resolved.id);\n setDefaultModel(config, ref);\n await saveConfig(config, ctx.configPath);\n console.log(`✅ Default model set: ${ref}`);\n}\n\nasync function runAuthList(options: ModelsAuthListOptions): Promise<void> {\n const resolver = new CredentialResolver();\n const profiles = (await resolver.listProfiles()).filter((profile) =>\n options.provider ? profile.provider === options.provider : true,\n );\n const oauthTokens = (await resolver.listOAuthTokens()).filter((token) =>\n options.provider ? token.provider === options.provider : true,\n );\n\n if (options.json) {\n console.log(JSON.stringify({ profiles, oauth: oauthTokens }, null, 2));\n return;\n }\n\n console.log('\\n🔐 Model auth\\n');\n if (profiles.length === 0 && oauthTokens.length === 0) {\n console.log(' No model credentials configured.');\n return;\n }\n for (const profile of profiles) {\n console.log(` ${profile.id} ${colors.blue('api-key')} ${profile.provider} ${profile.source}`);\n }\n for (const token of oauthTokens) {\n const expires = token.expiresAt ? ` expires ${new Date(token.expiresAt).toLocaleString()}` : '';\n console.log(` ${token.provider}:oauth ${colors.yellow('oauth')} ${token.hasAccess ? 'configured' : 'missing'}${expires}`);\n }\n}\n\nasync function runAuthPasteApiKey(provider: string): Promise<void> {\n if (!providerSupportsApiKey(provider)) {\n throw new Error(`Provider ${provider} does not support API key auth`);\n }\n const key = await input({\n message: `API key for ${provider}:`,\n validate: (value: string) => value.trim().length > 0 || 'Required',\n });\n await new CredentialResolver().saveApiKey(provider, key.trim(), { profileName: 'default' });\n console.log(`✅ API key saved for ${provider}`);\n}\n\nfunction resolveAuthMethod(provider: string, rawMethod?: string): 'oauth' | 'api-key' {\n if (rawMethod && rawMethod !== 'oauth' && rawMethod !== 'api-key') {\n throw new Error(`Unsupported auth method: ${rawMethod}`);\n }\n if (rawMethod === 'oauth' || rawMethod === 'api-key') return rawMethod;\n return providerSupportsOAuth(provider) ? 'oauth' : 'api-key';\n}\n\nasync function runAuthLogin(provider: string, options: ModelsAuthLoginOptions): Promise<void> {\n const method = resolveAuthMethod(provider, options.method);\n if (method === 'api-key') {\n await runAuthPasteApiKey(provider);\n } else {\n if (!providerSupportsOAuth(provider)) {\n throw new Error(`Provider ${provider} does not support OAuth`);\n }\n console.log(`\\n🔐 Starting ${getProviderDisplayName(provider)} OAuth login...`);\n await runCliOAuthLogin({ provider, onProgress: (message) => console.log(' →', message) });\n console.log(`✅ OAuth login successful for ${provider}`);\n }\n\n if (options.setDefault) {\n const first = getAllModels().find((model) => model.provider === provider);\n if (!first) throw new Error(`No models found for provider ${provider}`);\n await runModelsSet(modelRef(first.provider, first.id));\n }\n}\n\nasync function runAuthLogout(provider: string): Promise<void> {\n await new CredentialResolver().deleteProviderCredential(provider);\n console.log(`✅ Credentials removed for ${provider}`);\n}\n\nfunction attachModelsListOptions(command: Command): Command {\n return command\n .option('--json', 'Output as JSON', false)\n .option('--all, -a', 'Show all built-in models', false)\n .option('--provider <id>', 'Filter by provider id');\n}\n\nfunction createModelsCommand(_ctx: CLIContext): Command {\n const cmd = new Command('models')\n .description('List and manage models and model auth')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc models list',\n 'xopc models status',\n 'xopc models set openai/gpt-5.5',\n 'xopc models auth list',\n 'xopc models auth login --provider anthropic',\n 'xopc models auth paste-api-key --provider deepseek',\n ]),\n );\n\n attachModelsListOptions(cmd).action(async (options) => {\n await runModelsList(options);\n });\n\n attachModelsListOptions(cmd.command('list').description('List available models')).action(async (options) => {\n await runModelsList(options);\n });\n\n cmd\n .command('status')\n .description('Show default model and provider auth status')\n .option('--json', 'Output as JSON', false)\n .action(async (options: { json?: boolean }) => {\n await runModelsStatus(options);\n });\n\n cmd\n .command('set <model>')\n .description('Set the default model')\n .action(async (model: string) => {\n await runModelsSet(model);\n });\n\n const auth = cmd.command('auth').description('Manage model provider auth');\n\n auth\n .command('list')\n .description('List model auth credentials')\n .option('--provider <id>', 'Filter by provider id')\n .option('--json', 'Output as JSON', false)\n .action(async (options: ModelsAuthListOptions) => {\n await runAuthList(options);\n });\n\n auth\n .command('login')\n .description('Run provider auth flow')\n .requiredOption('--provider <id>', 'Provider id')\n .option('--method <method>', 'Auth method: oauth or api-key')\n .option('--set-default', 'Set the provider first model as default after login', false)\n .action(async (options: ModelsAuthLoginOptions & { provider: string }) => {\n await runAuthLogin(options.provider, options);\n });\n\n auth\n .command('paste-api-key')\n .description('Paste and save an API key')\n .requiredOption('--provider <id>', 'Provider id')\n .action(async (options: { provider: string }) => {\n await runAuthPasteApiKey(options.provider);\n });\n\n auth\n .command('logout')\n .description('Remove provider credentials')\n .requiredOption('--provider <id>', 'Provider id')\n .action(async (options: { provider: string }) => {\n await runAuthLogout(options.provider);\n });\n\n return cmd;\n}\n\nregister({\n id: 'models',\n name: 'models',\n description: 'List and manage models and model auth',\n factory: createModelsCommand,\n metadata: {\n category: 'utility',\n examples: ['xopc models list', 'xopc models status', 'xopc models auth list'],\n },\n});\n\nexport { createModelsCommand };\n"],"mappings":";;;;;;;;;;;kBAG+D;gBAa7B;AAOlC,MAAM,uBAAuB,IAAI,IAAI;CACnC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,aAAa,IAAI,IAAI;CACzB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAkBF,SAAS,gBAAgB,QAAoC;AAC3D,QAAO,OAAO,QAAQ,UAAU,QAAQ,MAAM;;AAGhD,SAAS,gBAAgB,QAAgB,UAA0B;AACjE,QAAO,SAAS,OAAO,UAAU,EAAE;AACnC,QAAO,OAAO,WAAW,OAAO,OAAO,YAAY,EAAE;AACrD,QAAO,OAAO,SAAS,SAAS;EAC9B,GAAG,OAAO,OAAO,SAAS;EAC1B,MAAM;GAAE,SAAS;GAAU,WAAW,EAAE;GAAE;EAC3C;AACD,QAAO;;AAGT,SAAS,SAAS,UAAkB,IAAoB;AACtD,QAAO,GAAG,SAAS,GAAG;;AAGxB,eAAe,cAAc,SAA2C;CAEtE,MAAM,SAAS,WADH,oBACiB,CAAC,WAAW;CACzC,MAAM,sBAAsB,MAAM,wBAAwB;CAC1D,MAAM,iBAAiB,QAAQ,UAAU,MAAM;CAC/C,MAAM,UAAU,QAAQ,MAAM,cAAc,GAAG,MAAM,oBAAoB,EAAE,QAAQ,MACjF,iBAAiB,EAAE,aAAa,iBAAiB,KAClD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IACN,KAAK,UACH;GACE,cAAc,gBAAgB,OAAO,IAAI;GACzC,WAAW;GACX,QAAQ,OAAO,KAAK,OAAO;IACzB,IAAI,SAAS,EAAE,UAAU,EAAE,GAAG;IAC9B,MAAM,EAAE;IACR,UAAU,EAAE;IACZ,gBAAgB,oBAAoB,SAAS,EAAE,SAAS;IACzD,EAAE;GACJ,EACD,MACA,EACD,CACF;AACD;;AAGF,SAAQ,IAAI,gBAAgB;AAC5B,SAAQ,IAAI,IAAI,OAAO,GAAG,CAAC;AAE3B,SAAQ,IAAI,+BAA+B,gBAAgB,OAAO,IAAI,UAAU,IAAI;CAEpF,MAAM,6BAAa,IAAI,KAA4B;AACnD,MAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,OAAO,WAAW,IAAI,MAAM,SAAS,IAAI,EAAE;AACjD,OAAK,KAAK,MAAM;AAChB,aAAW,IAAI,MAAM,UAAU,KAAK;;AAGtC,MAAK,MAAM,CAAC,UAAU,mBAAmB,YAAY;EACnD,MAAM,YAAY,MAAM,qBAAqB,SAAS;AACtD,UAAQ,IAAI,MAAM,SAAS,IAAI,YAAY,OAAO,MAAM,aAAa,GAAG,OAAO,KAAK,iBAAiB,GAAG;AACxG,OAAK,MAAM,SAAS,gBAAgB;GAClC,MAAM,SAAmB,EAAE;AAC3B,OAAI,qBAAqB,IAAI,MAAM,GAAG,CAAE,QAAO,KAAK,MAAM;AAC1D,OAAI,MAAM,OAAO,SAAS,QAAQ,IAAI,WAAW,IAAI,MAAM,GAAG,CAAE,QAAO,KAAK,SAAS;GACrF,MAAM,WAAW,OAAO,SAAS,IAAI,KAAK,OAAO,KAAK,KAAK,CAAC,KAAK;AACjE,WAAQ,IAAI,OAAO,YAAY,MAAM,IAAI,GAAG,SAAS,MAAM,UAAU,MAAM,GAAG,GAAG,WAAW;;;AAIhG,SAAQ,IAAI,WAAW;AACvB,SAAQ,IAAI,oCAAoC;AAChD,SAAQ,IAAI,iDAAiD;AAC7D,SAAQ,IAAI,wDAAwD;;AAGtE,eAAe,gBAAgB,SAA4C;CAEzE,MAAM,SAAS,WADH,oBACiB,CAAC,WAAW;CACzC,MAAM,YAAY,MAAM,KAAK,IAAI,IAAI,cAAc,CAAC,KAAK,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM;CACnF,MAAM,OAAO,EAAE;AACf,MAAK,MAAM,YAAY,WAAW;EAChC,MAAM,QAAQ,MAAM,qBAAqB,SAAS;AAClD,MAAI,MAAM,aAAa,OACrB,MAAK,KAAK;GAAE;GAAU,GAAG;GAAO,CAAC;;AAIrC,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,KAAK,UAAU;GAAE,cAAc,gBAAgB,OAAO,IAAI;GAAM;GAAM,EAAE,MAAM,EAAE,CAAC;AAC7F;;AAGF,SAAQ,IAAI,sBAAsB;AAClC,SAAQ,IAAI,YAAY,gBAAgB,OAAO,IAAI,YAAY;AAC/D,SAAQ,IAAI,UAAU;AACtB,KAAI,KAAK,WAAW,GAAG;AACrB,UAAQ,IAAI,wCAAwC;AACpD;;AAEF,MAAK,MAAM,SAAS,MAAM;EACxB,MAAM,SAAS,MAAM,eAAe,cAAc,OAAO,MAAM,MAAM,WAAW,GAAG,OAAO,OAAO,MAAM,WAAW;AAClH,UAAQ,IAAI,KAAK,MAAM,SAAS,IAAI,OAAO,IAAI,MAAM,SAAS,GAAG;;;AAIrE,eAAe,aAAa,OAA8B;CACxD,MAAM,MAAM,oBAAoB;CAChC,MAAM,SAAS,WAAW,IAAI,WAAW;CACzC,MAAM,WAAW,aAAa,MAAM;CACpC,MAAM,MAAM,SAAS,SAAS,UAAU,SAAS,GAAG;AACpD,iBAAgB,QAAQ,IAAI;AAC5B,OAAM,WAAW,QAAQ,IAAI,WAAW;AACxC,SAAQ,IAAI,wBAAwB,MAAM;;AAG5C,eAAe,YAAY,SAA+C;CACxE,MAAM,WAAW,IAAI,oBAAoB;CACzC,MAAM,YAAY,MAAM,SAAS,cAAc,EAAE,QAAQ,YACvD,QAAQ,WAAW,QAAQ,aAAa,QAAQ,WAAW,KAC5D;CACD,MAAM,eAAe,MAAM,SAAS,iBAAiB,EAAE,QAAQ,UAC7D,QAAQ,WAAW,MAAM,aAAa,QAAQ,WAAW,KAC1D;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,KAAK,UAAU;GAAE;GAAU,OAAO;GAAa,EAAE,MAAM,EAAE,CAAC;AACtE;;AAGF,SAAQ,IAAI,oBAAoB;AAChC,KAAI,SAAS,WAAW,KAAK,YAAY,WAAW,GAAG;AACrD,UAAQ,IAAI,qCAAqC;AACjD;;AAEF,MAAK,MAAM,WAAW,SACpB,SAAQ,IAAI,KAAK,QAAQ,GAAG,IAAI,OAAO,KAAK,UAAU,CAAC,IAAI,QAAQ,SAAS,IAAI,QAAQ,SAAS;AAEnG,MAAK,MAAM,SAAS,aAAa;EAC/B,MAAM,UAAU,MAAM,YAAY,YAAY,IAAI,KAAK,MAAM,UAAU,CAAC,gBAAgB,KAAK;AAC7F,UAAQ,IAAI,KAAK,MAAM,SAAS,UAAU,OAAO,OAAO,QAAQ,CAAC,IAAI,MAAM,YAAY,eAAe,YAAY,UAAU;;;AAIhI,eAAe,mBAAmB,UAAiC;AACjE,KAAI,CAAC,uBAAuB,SAAS,CACnC,OAAM,IAAI,MAAM,YAAY,SAAS,gCAAgC;CAEvE,MAAM,MAAM,MAAM,MAAM;EACtB,SAAS,eAAe,SAAS;EACjC,WAAW,UAAkB,MAAM,MAAM,CAAC,SAAS,KAAK;EACzD,CAAC;AACF,OAAM,IAAI,oBAAoB,CAAC,WAAW,UAAU,IAAI,MAAM,EAAE,EAAE,aAAa,WAAW,CAAC;AAC3F,SAAQ,IAAI,uBAAuB,WAAW;;AAGhD,SAAS,kBAAkB,UAAkB,WAAyC;AACpF,KAAI,aAAa,cAAc,WAAW,cAAc,UACtD,OAAM,IAAI,MAAM,4BAA4B,YAAY;AAE1D,KAAI,cAAc,WAAW,cAAc,UAAW,QAAO;AAC7D,QAAO,sBAAsB,SAAS,GAAG,UAAU;;AAGrD,eAAe,aAAa,UAAkB,SAAgD;AAE5F,KADe,kBAAkB,UAAU,QAAQ,OACzC,KAAK,UACb,OAAM,mBAAmB,SAAS;MAC7B;AACL,MAAI,CAAC,sBAAsB,SAAS,CAClC,OAAM,IAAI,MAAM,YAAY,SAAS,yBAAyB;AAEhE,UAAQ,IAAI,iBAAiB,uBAAuB,SAAS,CAAC,iBAAiB;AAC/E,QAAM,iBAAiB;GAAE;GAAU,aAAa,YAAY,QAAQ,IAAI,MAAM,QAAQ;GAAE,CAAC;AACzF,UAAQ,IAAI,gCAAgC,WAAW;;AAGzD,KAAI,QAAQ,YAAY;EACtB,MAAM,QAAQ,cAAc,CAAC,MAAM,UAAU,MAAM,aAAa,SAAS;AACzE,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,gCAAgC,WAAW;AACvE,QAAM,aAAa,SAAS,MAAM,UAAU,MAAM,GAAG,CAAC;;;AAI1D,eAAe,cAAc,UAAiC;AAC5D,OAAM,IAAI,oBAAoB,CAAC,yBAAyB,SAAS;AACjE,SAAQ,IAAI,6BAA6B,WAAW;;AAGtD,SAAS,wBAAwB,SAA2B;AAC1D,QAAO,QACJ,OAAO,UAAU,kBAAkB,MAAM,CACzC,OAAO,aAAa,4BAA4B,MAAM,CACtD,OAAO,mBAAmB,wBAAwB;;AAGvD,SAAS,oBAAoB,MAA2B;CACtD,MAAM,MAAM,IAAI,QAAQ,SAAS,CAC9B,YAAY,wCAAwC,CACpD,YACC,SACA,eAAe;EACb;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,CACH;AAEH,yBAAwB,IAAI,CAAC,OAAO,OAAO,YAAY;AACrD,QAAM,cAAc,QAAQ;GAC5B;AAEF,yBAAwB,IAAI,QAAQ,OAAO,CAAC,YAAY,wBAAwB,CAAC,CAAC,OAAO,OAAO,YAAY;AAC1G,QAAM,cAAc,QAAQ;GAC5B;AAEF,KACG,QAAQ,SAAS,CACjB,YAAY,8CAA8C,CAC1D,OAAO,UAAU,kBAAkB,MAAM,CACzC,OAAO,OAAO,YAAgC;AAC7C,QAAM,gBAAgB,QAAQ;GAC9B;AAEJ,KACG,QAAQ,cAAc,CACtB,YAAY,wBAAwB,CACpC,OAAO,OAAO,UAAkB;AAC/B,QAAM,aAAa,MAAM;GACzB;CAEJ,MAAM,OAAO,IAAI,QAAQ,OAAO,CAAC,YAAY,6BAA6B;AAE1E,MACG,QAAQ,OAAO,CACf,YAAY,8BAA8B,CAC1C,OAAO,mBAAmB,wBAAwB,CAClD,OAAO,UAAU,kBAAkB,MAAM,CACzC,OAAO,OAAO,YAAmC;AAChD,QAAM,YAAY,QAAQ;GAC1B;AAEJ,MACG,QAAQ,QAAQ,CAChB,YAAY,yBAAyB,CACrC,eAAe,mBAAmB,cAAc,CAChD,OAAO,qBAAqB,gCAAgC,CAC5D,OAAO,iBAAiB,uDAAuD,MAAM,CACrF,OAAO,OAAO,YAA2D;AACxE,QAAM,aAAa,QAAQ,UAAU,QAAQ;GAC7C;AAEJ,MACG,QAAQ,gBAAgB,CACxB,YAAY,4BAA4B,CACxC,eAAe,mBAAmB,cAAc,CAChD,OAAO,OAAO,YAAkC;AAC/C,QAAM,mBAAmB,QAAQ,SAAS;GAC1C;AAEJ,MACG,QAAQ,SAAS,CACjB,YAAY,8BAA8B,CAC1C,eAAe,mBAAmB,cAAc,CAChD,OAAO,OAAO,YAAkC;AAC/C,QAAM,cAAc,QAAQ,SAAS;GACrC;AAEJ,QAAO;;AAGT,SAAS;CACP,IAAI;CACJ,MAAM;CACN,aAAa;CACb,SAAS;CACT,UAAU;EACR,UAAU;EACV,UAAU;GAAC;GAAoB;GAAsB;GAAwB;EAC9E;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"models.js","names":[],"sources":["../../../../src/cli/commands/models.ts"],"sourcesContent":["import { input } from '@inquirer/prompts';\nimport { Command } from 'commander';\n\nimport { CredentialResolver } from '../../auth/credentials.js';\nimport { loadConfig, saveConfig } from '../../config/index.js';\nimport type { Config } from '../../config/schema.js';\nimport {\n getAllModels,\n getAvailableModels,\n getConfiguredProviders,\n getProviderAuthState,\n getProviderDisplayName,\n isProviderConfigured,\n providerSupportsApiKey,\n providerSupportsOAuth,\n resolveModel,\n} from '../../providers/index.js';\n\nimport { getContextWithOpts } from '../context.js';\nimport { register, formatExamples, type CLIContext } from '../registry.js';\nimport { colors } from '../utils/colors.js';\nimport { runCliOAuthLogin } from '../utils/oauth-login.js';\n\nconst IMAGE_GENERATION_IDS = new Set([\n 'gpt-image-1',\n 'dall-e-3',\n 'dall-e-2',\n 'wan2.6-t2i',\n 'wan2.7-image-pro',\n 'wan2.7-image',\n 'wan2.1-t2i-turbo',\n 'wan2.1-t2i-plus',\n 'image-01',\n 'image-01-live',\n]);\n\nconst VISION_IDS = new Set([\n 'gpt-4o',\n 'gpt-4o-mini',\n 'gpt-4-turbo',\n 'claude-sonnet-4-5',\n 'claude-haiku-3-5',\n 'gemini-2.0-flash',\n 'gemini-1.5-pro',\n 'qwen-vl-max',\n 'qwen2.5-vl-72b-instruct',\n]);\n\ntype ModelsListOptions = {\n json?: boolean;\n all?: boolean;\n provider?: string;\n};\n\ntype ModelsAuthListOptions = {\n provider?: string;\n json?: boolean;\n};\n\ntype ModelsAuthLoginOptions = {\n method?: 'oauth' | 'api-key';\n setDefault?: boolean;\n};\n\nfunction currentModelRef(config: Config): string | undefined {\n const legacyDefault = (config.agents as unknown as { defaults?: { model?: string } }).defaults?.model?.trim();\n if (legacyDefault) return legacyDefault;\n\n const list = Array.isArray(config.agents?.list) ? config.agents.list : [];\n const id =\n config.agents?.default ??\n list.find((entry) => (entry as { default?: boolean }).default === true)?.id ??\n list[0]?.id;\n const agent = list.find((entry) => entry.id === id) ?? list[0];\n const roles = agent?.models?.roles ?? {};\n const defaultRole = agent?.models?.defaultRole ?? Object.keys(roles)[0];\n return defaultRole ? roles[defaultRole]?.model : undefined;\n}\n\nfunction setDefaultModel(config: Config, modelRef: string): Config {\n const list = Array.isArray(config.agents?.list) ? config.agents.list : [];\n const id = config.agents?.default ?? list[0]?.id ?? 'main';\n const index = list.findIndex((entry) => entry.id === id);\n if (index >= 0) {\n const agent = list[index]!;\n const defaultRole = agent.models?.defaultRole || 'deep';\n list[index] = {\n ...agent,\n models: {\n ...agent.models,\n defaultRole,\n roles: { ...agent.models?.roles, [defaultRole]: { model: modelRef } },\n },\n };\n }\n return config;\n}\n\nfunction modelRef(provider: string, id: string): string {\n return `${provider}/${id}`;\n}\n\nasync function runModelsList(options: ModelsListOptions): Promise<void> {\n const ctx = getContextWithOpts();\n const config = loadConfig(ctx.configPath);\n const configuredProviders = await getConfiguredProviders();\n const providerFilter = options.provider?.trim();\n const models = (options.all ? getAllModels() : await getAvailableModels()).filter((m) =>\n providerFilter ? m.provider === providerFilter : true,\n );\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n defaultModel: currentModelRef(config) ?? null,\n providers: configuredProviders,\n models: models.map((m) => ({\n id: modelRef(m.provider, m.id),\n name: m.name,\n provider: m.provider,\n authConfigured: configuredProviders.includes(m.provider),\n })),\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n console.log('\\n🤖 Models\\n');\n console.log('═'.repeat(60));\n\n console.log(`\\n📌 Current default model: ${currentModelRef(config) ?? 'Not set'}\\n`);\n\n const byProvider = new Map<string, typeof models>();\n for (const model of models) {\n const list = byProvider.get(model.provider) ?? [];\n list.push(model);\n byProvider.set(model.provider, list);\n }\n\n for (const [provider, providerModels] of byProvider) {\n const available = await isProviderConfigured(provider);\n console.log(` [${provider}] ${available ? colors.green('configured') : colors.gray('not configured')}`);\n for (const model of providerModels) {\n const badges: string[] = [];\n if (IMAGE_GENERATION_IDS.has(model.id)) badges.push('gen');\n if (model.input?.includes('image') || VISION_IDS.has(model.id)) badges.push('vision');\n const badgeStr = badges.length > 0 ? ` [${badges.join(', ')}]` : '';\n console.log(` ${available ? '✓' : '○'} ${modelRef(model.provider, model.id)}${badgeStr}`);\n }\n }\n\n console.log('\\nUsage:');\n console.log(' xopc models set openai/gpt-5.5');\n console.log(' xopc models auth login --provider anthropic');\n console.log(' xopc models auth paste-api-key --provider deepseek');\n}\n\nasync function runModelsStatus(options: { json?: boolean }): Promise<void> {\n const ctx = getContextWithOpts();\n const config = loadConfig(ctx.configPath);\n const providers = Array.from(new Set(getAllModels().map((m) => m.provider))).sort();\n const auth = [];\n for (const provider of providers) {\n const state = await getProviderAuthState(provider);\n if (state.authMode !== 'none') {\n auth.push({ provider, ...state });\n }\n }\n\n if (options.json) {\n console.log(JSON.stringify({ defaultModel: currentModelRef(config) ?? null, auth }, null, 2));\n return;\n }\n\n console.log('\\n🤖 Model status\\n');\n console.log(`Default: ${currentModelRef(config) ?? 'Not set'}`);\n console.log('\\nAuth:');\n if (auth.length === 0) {\n console.log(' No provider credentials configured.');\n return;\n }\n for (const entry of auth) {\n const status = entry.authStatus === 'connected' ? colors.green(entry.authStatus) : colors.yellow(entry.authStatus);\n console.log(` ${entry.provider}: ${status} (${entry.authMode})`);\n }\n}\n\nasync function runModelsSet(model: string): Promise<void> {\n const ctx = getContextWithOpts();\n const config = loadConfig(ctx.configPath);\n const resolved = resolveModel(model);\n const ref = modelRef(resolved.provider, resolved.id);\n setDefaultModel(config, ref);\n await saveConfig(config, ctx.configPath);\n console.log(`✅ Default model set: ${ref}`);\n}\n\nasync function runAuthList(options: ModelsAuthListOptions): Promise<void> {\n const resolver = new CredentialResolver();\n const profiles = (await resolver.listProfiles()).filter((profile) =>\n options.provider ? profile.provider === options.provider : true,\n );\n const oauthTokens = (await resolver.listOAuthTokens()).filter((token) =>\n options.provider ? token.provider === options.provider : true,\n );\n\n if (options.json) {\n console.log(JSON.stringify({ profiles, oauth: oauthTokens }, null, 2));\n return;\n }\n\n console.log('\\n🔐 Model auth\\n');\n if (profiles.length === 0 && oauthTokens.length === 0) {\n console.log(' No model credentials configured.');\n return;\n }\n for (const profile of profiles) {\n console.log(` ${profile.id} ${colors.blue('api-key')} ${profile.provider} ${profile.source}`);\n }\n for (const token of oauthTokens) {\n const expires = token.expiresAt ? ` expires ${new Date(token.expiresAt).toLocaleString()}` : '';\n console.log(` ${token.provider}:oauth ${colors.yellow('oauth')} ${token.hasAccess ? 'configured' : 'missing'}${expires}`);\n }\n}\n\nasync function runAuthPasteApiKey(provider: string): Promise<void> {\n if (!providerSupportsApiKey(provider)) {\n throw new Error(`Provider ${provider} does not support API key auth`);\n }\n const key = await input({\n message: `API key for ${provider}:`,\n validate: (value: string) => value.trim().length > 0 || 'Required',\n });\n await new CredentialResolver().saveApiKey(provider, key.trim(), { profileName: 'default' });\n console.log(`✅ API key saved for ${provider}`);\n}\n\nfunction resolveAuthMethod(provider: string, rawMethod?: string): 'oauth' | 'api-key' {\n if (rawMethod && rawMethod !== 'oauth' && rawMethod !== 'api-key') {\n throw new Error(`Unsupported auth method: ${rawMethod}`);\n }\n if (rawMethod === 'oauth' || rawMethod === 'api-key') return rawMethod;\n return providerSupportsOAuth(provider) ? 'oauth' : 'api-key';\n}\n\nasync function runAuthLogin(provider: string, options: ModelsAuthLoginOptions): Promise<void> {\n const method = resolveAuthMethod(provider, options.method);\n if (method === 'api-key') {\n await runAuthPasteApiKey(provider);\n } else {\n if (!providerSupportsOAuth(provider)) {\n throw new Error(`Provider ${provider} does not support OAuth`);\n }\n console.log(`\\n🔐 Starting ${getProviderDisplayName(provider)} OAuth login...`);\n await runCliOAuthLogin({ provider, onProgress: (message) => console.log(' →', message) });\n console.log(`✅ OAuth login successful for ${provider}`);\n }\n\n if (options.setDefault) {\n const first = getAllModels().find((model) => model.provider === provider);\n if (!first) throw new Error(`No models found for provider ${provider}`);\n await runModelsSet(modelRef(first.provider, first.id));\n }\n}\n\nasync function runAuthLogout(provider: string): Promise<void> {\n await new CredentialResolver().deleteProviderCredential(provider);\n console.log(`✅ Credentials removed for ${provider}`);\n}\n\nfunction attachModelsListOptions(command: Command): Command {\n return command\n .option('--json', 'Output as JSON', false)\n .option('--all, -a', 'Show all built-in models', false)\n .option('--provider <id>', 'Filter by provider id');\n}\n\nfunction createModelsCommand(_ctx: CLIContext): Command {\n const cmd = new Command('models')\n .description('List and manage models and model auth')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc models list',\n 'xopc models status',\n 'xopc models set openai/gpt-5.5',\n 'xopc models auth list',\n 'xopc models auth login --provider anthropic',\n 'xopc models auth paste-api-key --provider deepseek',\n ]),\n );\n\n attachModelsListOptions(cmd).action(async (options) => {\n await runModelsList(options);\n });\n\n attachModelsListOptions(cmd.command('list').description('List available models')).action(async (options) => {\n await runModelsList(options);\n });\n\n cmd\n .command('status')\n .description('Show default model and provider auth status')\n .option('--json', 'Output as JSON', false)\n .action(async (options: { json?: boolean }) => {\n await runModelsStatus(options);\n });\n\n cmd\n .command('set <model>')\n .description('Set the default model')\n .action(async (model: string) => {\n await runModelsSet(model);\n });\n\n const auth = cmd.command('auth').description('Manage model provider auth');\n\n auth\n .command('list')\n .description('List model auth credentials')\n .option('--provider <id>', 'Filter by provider id')\n .option('--json', 'Output as JSON', false)\n .action(async (options: ModelsAuthListOptions) => {\n await runAuthList(options);\n });\n\n auth\n .command('login')\n .description('Run provider auth flow')\n .requiredOption('--provider <id>', 'Provider id')\n .option('--method <method>', 'Auth method: oauth or api-key')\n .option('--set-default', 'Set the provider first model as default after login', false)\n .action(async (options: ModelsAuthLoginOptions & { provider: string }) => {\n await runAuthLogin(options.provider, options);\n });\n\n auth\n .command('paste-api-key')\n .description('Paste and save an API key')\n .requiredOption('--provider <id>', 'Provider id')\n .action(async (options: { provider: string }) => {\n await runAuthPasteApiKey(options.provider);\n });\n\n auth\n .command('logout')\n .description('Remove provider credentials')\n .requiredOption('--provider <id>', 'Provider id')\n .action(async (options: { provider: string }) => {\n await runAuthLogout(options.provider);\n });\n\n return cmd;\n}\n\nregister({\n id: 'models',\n name: 'models',\n description: 'List and manage models and model auth',\n factory: createModelsCommand,\n metadata: {\n category: 'utility',\n examples: ['xopc models list', 'xopc models status', 'xopc models auth list'],\n },\n});\n\nexport { createModelsCommand };\n"],"mappings":";;;;;;;;;;;kBAG+D;gBAa7B;AAOlC,MAAM,uBAAuB,IAAI,IAAI;CACnC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,aAAa,IAAI,IAAI;CACzB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAkBF,SAAS,gBAAgB,QAAoC;CAC3D,MAAM,gBAAiB,OAAO,OAAwD,UAAU,OAAO,MAAM;AAC7G,KAAI,cAAe,QAAO;CAE1B,MAAM,OAAO,MAAM,QAAQ,OAAO,QAAQ,KAAK,GAAG,OAAO,OAAO,OAAO,EAAE;CACzE,MAAM,KACJ,OAAO,QAAQ,WACf,KAAK,MAAM,UAAW,MAAgC,YAAY,KAAK,EAAE,MACzE,KAAK,IAAI;CACX,MAAM,QAAQ,KAAK,MAAM,UAAU,MAAM,OAAO,GAAG,IAAI,KAAK;CAC5D,MAAM,QAAQ,OAAO,QAAQ,SAAS,EAAE;CACxC,MAAM,cAAc,OAAO,QAAQ,eAAe,OAAO,KAAK,MAAM,CAAC;AACrE,QAAO,cAAc,MAAM,cAAc,QAAQ,KAAA;;AAGnD,SAAS,gBAAgB,QAAgB,UAA0B;CACjE,MAAM,OAAO,MAAM,QAAQ,OAAO,QAAQ,KAAK,GAAG,OAAO,OAAO,OAAO,EAAE;CACzE,MAAM,KAAK,OAAO,QAAQ,WAAW,KAAK,IAAI,MAAM;CACpD,MAAM,QAAQ,KAAK,WAAW,UAAU,MAAM,OAAO,GAAG;AACxD,KAAI,SAAS,GAAG;EACd,MAAM,QAAQ,KAAK;EACnB,MAAM,cAAc,MAAM,QAAQ,eAAe;AACjD,OAAK,SAAS;GACZ,GAAG;GACH,QAAQ;IACN,GAAG,MAAM;IACT;IACA,OAAO;KAAE,GAAG,MAAM,QAAQ;MAAQ,cAAc,EAAE,OAAO,UAAU;KAAE;IACtE;GACF;;AAEH,QAAO;;AAGT,SAAS,SAAS,UAAkB,IAAoB;AACtD,QAAO,GAAG,SAAS,GAAG;;AAGxB,eAAe,cAAc,SAA2C;CAEtE,MAAM,SAAS,WADH,oBACiB,CAAC,WAAW;CACzC,MAAM,sBAAsB,MAAM,wBAAwB;CAC1D,MAAM,iBAAiB,QAAQ,UAAU,MAAM;CAC/C,MAAM,UAAU,QAAQ,MAAM,cAAc,GAAG,MAAM,oBAAoB,EAAE,QAAQ,MACjF,iBAAiB,EAAE,aAAa,iBAAiB,KAClD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IACN,KAAK,UACH;GACE,cAAc,gBAAgB,OAAO,IAAI;GACzC,WAAW;GACX,QAAQ,OAAO,KAAK,OAAO;IACzB,IAAI,SAAS,EAAE,UAAU,EAAE,GAAG;IAC9B,MAAM,EAAE;IACR,UAAU,EAAE;IACZ,gBAAgB,oBAAoB,SAAS,EAAE,SAAS;IACzD,EAAE;GACJ,EACD,MACA,EACD,CACF;AACD;;AAGF,SAAQ,IAAI,gBAAgB;AAC5B,SAAQ,IAAI,IAAI,OAAO,GAAG,CAAC;AAE3B,SAAQ,IAAI,+BAA+B,gBAAgB,OAAO,IAAI,UAAU,IAAI;CAEpF,MAAM,6BAAa,IAAI,KAA4B;AACnD,MAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,OAAO,WAAW,IAAI,MAAM,SAAS,IAAI,EAAE;AACjD,OAAK,KAAK,MAAM;AAChB,aAAW,IAAI,MAAM,UAAU,KAAK;;AAGtC,MAAK,MAAM,CAAC,UAAU,mBAAmB,YAAY;EACnD,MAAM,YAAY,MAAM,qBAAqB,SAAS;AACtD,UAAQ,IAAI,MAAM,SAAS,IAAI,YAAY,OAAO,MAAM,aAAa,GAAG,OAAO,KAAK,iBAAiB,GAAG;AACxG,OAAK,MAAM,SAAS,gBAAgB;GAClC,MAAM,SAAmB,EAAE;AAC3B,OAAI,qBAAqB,IAAI,MAAM,GAAG,CAAE,QAAO,KAAK,MAAM;AAC1D,OAAI,MAAM,OAAO,SAAS,QAAQ,IAAI,WAAW,IAAI,MAAM,GAAG,CAAE,QAAO,KAAK,SAAS;GACrF,MAAM,WAAW,OAAO,SAAS,IAAI,KAAK,OAAO,KAAK,KAAK,CAAC,KAAK;AACjE,WAAQ,IAAI,OAAO,YAAY,MAAM,IAAI,GAAG,SAAS,MAAM,UAAU,MAAM,GAAG,GAAG,WAAW;;;AAIhG,SAAQ,IAAI,WAAW;AACvB,SAAQ,IAAI,oCAAoC;AAChD,SAAQ,IAAI,iDAAiD;AAC7D,SAAQ,IAAI,wDAAwD;;AAGtE,eAAe,gBAAgB,SAA4C;CAEzE,MAAM,SAAS,WADH,oBACiB,CAAC,WAAW;CACzC,MAAM,YAAY,MAAM,KAAK,IAAI,IAAI,cAAc,CAAC,KAAK,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM;CACnF,MAAM,OAAO,EAAE;AACf,MAAK,MAAM,YAAY,WAAW;EAChC,MAAM,QAAQ,MAAM,qBAAqB,SAAS;AAClD,MAAI,MAAM,aAAa,OACrB,MAAK,KAAK;GAAE;GAAU,GAAG;GAAO,CAAC;;AAIrC,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,KAAK,UAAU;GAAE,cAAc,gBAAgB,OAAO,IAAI;GAAM;GAAM,EAAE,MAAM,EAAE,CAAC;AAC7F;;AAGF,SAAQ,IAAI,sBAAsB;AAClC,SAAQ,IAAI,YAAY,gBAAgB,OAAO,IAAI,YAAY;AAC/D,SAAQ,IAAI,UAAU;AACtB,KAAI,KAAK,WAAW,GAAG;AACrB,UAAQ,IAAI,wCAAwC;AACpD;;AAEF,MAAK,MAAM,SAAS,MAAM;EACxB,MAAM,SAAS,MAAM,eAAe,cAAc,OAAO,MAAM,MAAM,WAAW,GAAG,OAAO,OAAO,MAAM,WAAW;AAClH,UAAQ,IAAI,KAAK,MAAM,SAAS,IAAI,OAAO,IAAI,MAAM,SAAS,GAAG;;;AAIrE,eAAe,aAAa,OAA8B;CACxD,MAAM,MAAM,oBAAoB;CAChC,MAAM,SAAS,WAAW,IAAI,WAAW;CACzC,MAAM,WAAW,aAAa,MAAM;CACpC,MAAM,MAAM,SAAS,SAAS,UAAU,SAAS,GAAG;AACpD,iBAAgB,QAAQ,IAAI;AAC5B,OAAM,WAAW,QAAQ,IAAI,WAAW;AACxC,SAAQ,IAAI,wBAAwB,MAAM;;AAG5C,eAAe,YAAY,SAA+C;CACxE,MAAM,WAAW,IAAI,oBAAoB;CACzC,MAAM,YAAY,MAAM,SAAS,cAAc,EAAE,QAAQ,YACvD,QAAQ,WAAW,QAAQ,aAAa,QAAQ,WAAW,KAC5D;CACD,MAAM,eAAe,MAAM,SAAS,iBAAiB,EAAE,QAAQ,UAC7D,QAAQ,WAAW,MAAM,aAAa,QAAQ,WAAW,KAC1D;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,KAAK,UAAU;GAAE;GAAU,OAAO;GAAa,EAAE,MAAM,EAAE,CAAC;AACtE;;AAGF,SAAQ,IAAI,oBAAoB;AAChC,KAAI,SAAS,WAAW,KAAK,YAAY,WAAW,GAAG;AACrD,UAAQ,IAAI,qCAAqC;AACjD;;AAEF,MAAK,MAAM,WAAW,SACpB,SAAQ,IAAI,KAAK,QAAQ,GAAG,IAAI,OAAO,KAAK,UAAU,CAAC,IAAI,QAAQ,SAAS,IAAI,QAAQ,SAAS;AAEnG,MAAK,MAAM,SAAS,aAAa;EAC/B,MAAM,UAAU,MAAM,YAAY,YAAY,IAAI,KAAK,MAAM,UAAU,CAAC,gBAAgB,KAAK;AAC7F,UAAQ,IAAI,KAAK,MAAM,SAAS,UAAU,OAAO,OAAO,QAAQ,CAAC,IAAI,MAAM,YAAY,eAAe,YAAY,UAAU;;;AAIhI,eAAe,mBAAmB,UAAiC;AACjE,KAAI,CAAC,uBAAuB,SAAS,CACnC,OAAM,IAAI,MAAM,YAAY,SAAS,gCAAgC;CAEvE,MAAM,MAAM,MAAM,MAAM;EACtB,SAAS,eAAe,SAAS;EACjC,WAAW,UAAkB,MAAM,MAAM,CAAC,SAAS,KAAK;EACzD,CAAC;AACF,OAAM,IAAI,oBAAoB,CAAC,WAAW,UAAU,IAAI,MAAM,EAAE,EAAE,aAAa,WAAW,CAAC;AAC3F,SAAQ,IAAI,uBAAuB,WAAW;;AAGhD,SAAS,kBAAkB,UAAkB,WAAyC;AACpF,KAAI,aAAa,cAAc,WAAW,cAAc,UACtD,OAAM,IAAI,MAAM,4BAA4B,YAAY;AAE1D,KAAI,cAAc,WAAW,cAAc,UAAW,QAAO;AAC7D,QAAO,sBAAsB,SAAS,GAAG,UAAU;;AAGrD,eAAe,aAAa,UAAkB,SAAgD;AAE5F,KADe,kBAAkB,UAAU,QAAQ,OACzC,KAAK,UACb,OAAM,mBAAmB,SAAS;MAC7B;AACL,MAAI,CAAC,sBAAsB,SAAS,CAClC,OAAM,IAAI,MAAM,YAAY,SAAS,yBAAyB;AAEhE,UAAQ,IAAI,iBAAiB,uBAAuB,SAAS,CAAC,iBAAiB;AAC/E,QAAM,iBAAiB;GAAE;GAAU,aAAa,YAAY,QAAQ,IAAI,MAAM,QAAQ;GAAE,CAAC;AACzF,UAAQ,IAAI,gCAAgC,WAAW;;AAGzD,KAAI,QAAQ,YAAY;EACtB,MAAM,QAAQ,cAAc,CAAC,MAAM,UAAU,MAAM,aAAa,SAAS;AACzE,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,gCAAgC,WAAW;AACvE,QAAM,aAAa,SAAS,MAAM,UAAU,MAAM,GAAG,CAAC;;;AAI1D,eAAe,cAAc,UAAiC;AAC5D,OAAM,IAAI,oBAAoB,CAAC,yBAAyB,SAAS;AACjE,SAAQ,IAAI,6BAA6B,WAAW;;AAGtD,SAAS,wBAAwB,SAA2B;AAC1D,QAAO,QACJ,OAAO,UAAU,kBAAkB,MAAM,CACzC,OAAO,aAAa,4BAA4B,MAAM,CACtD,OAAO,mBAAmB,wBAAwB;;AAGvD,SAAS,oBAAoB,MAA2B;CACtD,MAAM,MAAM,IAAI,QAAQ,SAAS,CAC9B,YAAY,wCAAwC,CACpD,YACC,SACA,eAAe;EACb;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,CACH;AAEH,yBAAwB,IAAI,CAAC,OAAO,OAAO,YAAY;AACrD,QAAM,cAAc,QAAQ;GAC5B;AAEF,yBAAwB,IAAI,QAAQ,OAAO,CAAC,YAAY,wBAAwB,CAAC,CAAC,OAAO,OAAO,YAAY;AAC1G,QAAM,cAAc,QAAQ;GAC5B;AAEF,KACG,QAAQ,SAAS,CACjB,YAAY,8CAA8C,CAC1D,OAAO,UAAU,kBAAkB,MAAM,CACzC,OAAO,OAAO,YAAgC;AAC7C,QAAM,gBAAgB,QAAQ;GAC9B;AAEJ,KACG,QAAQ,cAAc,CACtB,YAAY,wBAAwB,CACpC,OAAO,OAAO,UAAkB;AAC/B,QAAM,aAAa,MAAM;GACzB;CAEJ,MAAM,OAAO,IAAI,QAAQ,OAAO,CAAC,YAAY,6BAA6B;AAE1E,MACG,QAAQ,OAAO,CACf,YAAY,8BAA8B,CAC1C,OAAO,mBAAmB,wBAAwB,CAClD,OAAO,UAAU,kBAAkB,MAAM,CACzC,OAAO,OAAO,YAAmC;AAChD,QAAM,YAAY,QAAQ;GAC1B;AAEJ,MACG,QAAQ,QAAQ,CAChB,YAAY,yBAAyB,CACrC,eAAe,mBAAmB,cAAc,CAChD,OAAO,qBAAqB,gCAAgC,CAC5D,OAAO,iBAAiB,uDAAuD,MAAM,CACrF,OAAO,OAAO,YAA2D;AACxE,QAAM,aAAa,QAAQ,UAAU,QAAQ;GAC7C;AAEJ,MACG,QAAQ,gBAAgB,CACxB,YAAY,4BAA4B,CACxC,eAAe,mBAAmB,cAAc,CAChD,OAAO,OAAO,YAAkC;AAC/C,QAAM,mBAAmB,QAAQ,SAAS;GAC1C;AAEJ,MACG,QAAQ,SAAS,CACjB,YAAY,8BAA8B,CAC1C,eAAe,mBAAmB,cAAc,CAChD,OAAO,OAAO,YAAkC;AAC/C,QAAM,cAAc,QAAQ,SAAS;GACrC;AAEJ,QAAO;;AAGT,SAAS;CACP,IAAI;CACJ,MAAM;CACN,aAAa;CACb,SAAS;CACT,UAAU;EACR,UAAU;EACV,UAAU;GAAC;GAAoB;GAAsB;GAAwB;EAC9E;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","names":[],"sources":["../../../../../../src/cli/commands/onboard/channels/registry.ts"],"sourcesContent":["/**\n * Channel configurators for onboarding: {@link ChannelPlugin.onboard} overrides {@link ChannelPlugin.setupWizard}.\n */\n\nimport type { ChannelPlugin } from '../../../../channels/plugin-types.js';\nimport { listChannelPlugins } from '../../../../channels/plugins/registry.js';\nimport { ExtensionLoader } from '../../../../extensions/loader.js';\nimport {\n buildExtensionMetadataSnapshot,\n resolveExtensionLoaderOptionsFromConfig,\n} from '../../../../extensions/extension-metadata-snapshot.js';\nimport type { Config } from '../../../../config/schema.js';\nimport type { ResolvedExtensionConfig } from '../../../../extensions/types/index.js';\nimport type { ChannelConfigurator } from './types.js';\nimport { channelSetupWizardToConfigurator } from './wizard-to-configurator.js';\nimport { channelOnboardToConfigurator } from './onboard-to-configurator.js';\n\nfunction sortByMetaOrder(plugins: ChannelPlugin[]): ChannelPlugin[] {\n return [...plugins].sort((a, b) => {\n const oa = a.meta.order ?? 999;\n const ob = b.meta.order ?? 999;\n if (oa !== ob) return oa - ob;\n return a.id.localeCompare(b.id);\n });\n}\n\nfunction toConfigurators(plugins: readonly ChannelPlugin[]): ChannelConfigurator[] {\n const out: ChannelConfigurator[] = [];\n\n for (const plugin of sortByMetaOrder([...plugins])) {\n if (plugin.onboard) {\n out.push(channelOnboardToConfigurator(plugin));\n } else if (plugin.setupWizard) {\n out.push(\n channelSetupWizardToConfigurator(plugin.setupWizard, {\n name: plugin.meta.label,\n description: plugin.meta.blurb,\n }),\n );\n }\n }\n return out;\n}\n\nasync function loadChannelPluginsForOnboard(config: Config): Promise<ChannelPlugin[]> {\n const snapshot = buildExtensionMetadataSnapshot(resolveExtensionLoaderOptionsFromConfig(config), config);\n const extensionConfigs: ResolvedExtensionConfig[] = [];\n\n for (const entry of snapshot.manifestRegistry.getAllEntries()) {\n if (!entry.manifest.channelContributions || Object.keys(entry.manifest.channelContributions).length === 0) {\n continue;\n }\n extensionConfigs.push({\n id: entry.id,\n name: entry.manifest.name || entry.id,\n source: entry.source,\n path: entry.path,\n enabled: true,\n config: {},\n });\n }\n\n if (extensionConfigs.length === 0) {\n return [];\n }\n\n const loader = new ExtensionLoader(resolveExtensionLoaderOptionsFromConfig(config));\n loader.setConfig(config);\n loader.setManifestSnapshot(snapshot);\n await loader.loadExtensions(extensionConfigs);\n return loader.getRegistry().channelPlugins;\n}\n\nexport async function getChannelConfigurators(config: Config): Promise<ChannelConfigurator[]> {\n const registered = listChannelPlugins();\n if (registered.length > 0) {\n return toConfigurators(registered);\n }\n return toConfigurators(await loadChannelPluginsForOnboard(config));\n}\n"],"mappings":";;;;;;kCAU+D;AAO/D,SAAS,gBAAgB,SAA2C;AAClE,QAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,MAAM;EACjC,MAAM,KAAK,EAAE,KAAK,SAAS;EAC3B,MAAM,KAAK,EAAE,KAAK,SAAS;AAC3B,MAAI,OAAO,GAAI,QAAO,KAAK;AAC3B,SAAO,EAAE,GAAG,cAAc,EAAE,GAAG;GAC/B;;AAGJ,SAAS,gBAAgB,SAA0D;CACjF,MAAM,MAA6B,EAAE;AAErC,MAAK,MAAM,UAAU,gBAAgB,CAAC,GAAG,QAAQ,CAAC,CAChD,KAAI,OAAO,QACT,KAAI,KAAK,6BAA6B,OAAO,CAAC;UACrC,OAAO,YAChB,KAAI,KACF,iCAAiC,OAAO,aAAa;EACnD,MAAM,OAAO,KAAK;EAClB,aAAa,OAAO,KAAK;EAC1B,CAAC,CACH;AAGL,QAAO;;AAGT,eAAe,6BAA6B,QAA0C;CACpF,MAAM,WAAW,+BAA+B,wCAAwC,OAAO,EAAE,OAAO;CACxG,MAAM,mBAA8C,EAAE;AAEtD,MAAK,MAAM,SAAS,SAAS,iBAAiB,eAAe,EAAE;AAC7D,MAAI,CAAC,MAAM,SAAS,wBAAwB,OAAO,KAAK,MAAM,SAAS,qBAAqB,CAAC,WAAW,EACtG;AAEF,mBAAiB,KAAK;GACpB,IAAI,MAAM;GACV,MAAM,MAAM,SAAS,QAAQ,MAAM;GACnC,QAAQ,MAAM;GACd,MAAM,MAAM;GACZ,SAAS;GACT,QAAQ,EAAE;GACX,CAAC;;AAGJ,KAAI,iBAAiB,WAAW,EAC9B,QAAO,EAAE;CAGX,MAAM,SAAS,IAAI,gBAAgB,wCAAwC,OAAO,CAAC;AACnF,QAAO,UAAU,
|
|
1
|
+
{"version":3,"file":"registry.js","names":[],"sources":["../../../../../../src/cli/commands/onboard/channels/registry.ts"],"sourcesContent":["/**\n * Channel configurators for onboarding: {@link ChannelPlugin.onboard} overrides {@link ChannelPlugin.setupWizard}.\n */\n\nimport type { ChannelPlugin } from '../../../../channels/plugin-types.js';\nimport { listChannelPlugins } from '../../../../channels/plugins/registry.js';\nimport { ExtensionLoader } from '../../../../extensions/loader.js';\nimport {\n buildExtensionMetadataSnapshot,\n resolveExtensionLoaderOptionsFromConfig,\n} from '../../../../extensions/extension-metadata-snapshot.js';\nimport type { Config } from '../../../../config/schema.js';\nimport type { ResolvedExtensionConfig } from '../../../../extensions/types/index.js';\nimport type { ChannelConfigurator } from './types.js';\nimport { channelSetupWizardToConfigurator } from './wizard-to-configurator.js';\nimport { channelOnboardToConfigurator } from './onboard-to-configurator.js';\n\nfunction sortByMetaOrder(plugins: ChannelPlugin[]): ChannelPlugin[] {\n return [...plugins].sort((a, b) => {\n const oa = a.meta.order ?? 999;\n const ob = b.meta.order ?? 999;\n if (oa !== ob) return oa - ob;\n return a.id.localeCompare(b.id);\n });\n}\n\nfunction toConfigurators(plugins: readonly ChannelPlugin[]): ChannelConfigurator[] {\n const out: ChannelConfigurator[] = [];\n\n for (const plugin of sortByMetaOrder([...plugins])) {\n if (plugin.onboard) {\n out.push(channelOnboardToConfigurator(plugin));\n } else if (plugin.setupWizard) {\n out.push(\n channelSetupWizardToConfigurator(plugin.setupWizard, {\n name: plugin.meta.label,\n description: plugin.meta.blurb,\n }),\n );\n }\n }\n return out;\n}\n\nasync function loadChannelPluginsForOnboard(config: Config): Promise<ChannelPlugin[]> {\n const snapshot = buildExtensionMetadataSnapshot(resolveExtensionLoaderOptionsFromConfig(config), config);\n const extensionConfigs: ResolvedExtensionConfig[] = [];\n\n for (const entry of snapshot.manifestRegistry.getAllEntries()) {\n if (!entry.manifest.channelContributions || Object.keys(entry.manifest.channelContributions).length === 0) {\n continue;\n }\n extensionConfigs.push({\n id: entry.id,\n name: entry.manifest.name || entry.id,\n source: entry.source,\n path: entry.path,\n enabled: true,\n config: {},\n });\n }\n\n if (extensionConfigs.length === 0) {\n return [];\n }\n\n const loader = new ExtensionLoader(resolveExtensionLoaderOptionsFromConfig(config));\n loader.setConfig(config as Parameters<ExtensionLoader['setConfig']>[0]);\n loader.setManifestSnapshot(snapshot);\n await loader.loadExtensions(extensionConfigs);\n return loader.getRegistry().channelPlugins;\n}\n\nexport async function getChannelConfigurators(config: Config): Promise<ChannelConfigurator[]> {\n const registered = listChannelPlugins();\n if (registered.length > 0) {\n return toConfigurators(registered);\n }\n return toConfigurators(await loadChannelPluginsForOnboard(config));\n}\n"],"mappings":";;;;;;kCAU+D;AAO/D,SAAS,gBAAgB,SAA2C;AAClE,QAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,MAAM;EACjC,MAAM,KAAK,EAAE,KAAK,SAAS;EAC3B,MAAM,KAAK,EAAE,KAAK,SAAS;AAC3B,MAAI,OAAO,GAAI,QAAO,KAAK;AAC3B,SAAO,EAAE,GAAG,cAAc,EAAE,GAAG;GAC/B;;AAGJ,SAAS,gBAAgB,SAA0D;CACjF,MAAM,MAA6B,EAAE;AAErC,MAAK,MAAM,UAAU,gBAAgB,CAAC,GAAG,QAAQ,CAAC,CAChD,KAAI,OAAO,QACT,KAAI,KAAK,6BAA6B,OAAO,CAAC;UACrC,OAAO,YAChB,KAAI,KACF,iCAAiC,OAAO,aAAa;EACnD,MAAM,OAAO,KAAK;EAClB,aAAa,OAAO,KAAK;EAC1B,CAAC,CACH;AAGL,QAAO;;AAGT,eAAe,6BAA6B,QAA0C;CACpF,MAAM,WAAW,+BAA+B,wCAAwC,OAAO,EAAE,OAAO;CACxG,MAAM,mBAA8C,EAAE;AAEtD,MAAK,MAAM,SAAS,SAAS,iBAAiB,eAAe,EAAE;AAC7D,MAAI,CAAC,MAAM,SAAS,wBAAwB,OAAO,KAAK,MAAM,SAAS,qBAAqB,CAAC,WAAW,EACtG;AAEF,mBAAiB,KAAK;GACpB,IAAI,MAAM;GACV,MAAM,MAAM,SAAS,QAAQ,MAAM;GACnC,QAAQ,MAAM;GACd,MAAM,MAAM;GACZ,SAAS;GACT,QAAQ,EAAE;GACX,CAAC;;AAGJ,KAAI,iBAAiB,WAAW,EAC9B,QAAO,EAAE;CAGX,MAAM,SAAS,IAAI,gBAAgB,wCAAwC,OAAO,CAAC;AACnF,QAAO,UAAU,OAAsD;AACvE,QAAO,oBAAoB,SAAS;AACpC,OAAM,OAAO,eAAe,iBAAiB;AAC7C,QAAO,OAAO,aAAa,CAAC;;AAG9B,eAAsB,wBAAwB,QAAgD;CAC5F,MAAM,aAAa,oBAAoB;AACvC,KAAI,WAAW,SAAS,EACtB,QAAO,gBAAgB,WAAW;AAEpC,QAAO,gBAAgB,MAAM,6BAA6B,OAAO,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { getAgentDefaultModelRef, init_schema } from "../../../config/schema.js";
|
|
1
2
|
import { resolveModelsJsonPath } from "../../../config/paths.js";
|
|
2
3
|
import { init_models_json, loadModelsJson, saveModelsJson } from "../../../config/models-json.js";
|
|
3
4
|
import { getApiKeyFromEnv } from "../../../providers/env-keys.js";
|
|
@@ -16,29 +17,26 @@ import { confirm, input, select } from "@inquirer/prompts";
|
|
|
16
17
|
*/
|
|
17
18
|
init_credentials();
|
|
18
19
|
init_models_json();
|
|
20
|
+
init_schema();
|
|
19
21
|
init_providers();
|
|
20
|
-
function ensureAgentDefaults(config, workspacePath) {
|
|
21
|
-
config.agents = config.agents || {};
|
|
22
|
-
config.agents.defaults = config.agents.defaults || {
|
|
23
|
-
workspace: workspacePath,
|
|
24
|
-
maxTokens: 8192,
|
|
25
|
-
temperature: .7,
|
|
26
|
-
maxToolIterations: 20,
|
|
27
|
-
maxRequestsPerTurn: 50,
|
|
28
|
-
maxToolFailuresPerTurn: 3
|
|
29
|
-
};
|
|
30
|
-
config.agents.defaults.workspace = workspacePath;
|
|
31
|
-
return config.agents.defaults;
|
|
32
|
-
}
|
|
33
22
|
function setPrimaryModel(config, workspacePath, modelRef) {
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
23
|
+
const id = config.agents.default ?? config.agents.list[0]?.id ?? "main";
|
|
24
|
+
const index = config.agents.list.findIndex((entry) => entry.id === id);
|
|
25
|
+
if (index >= 0) {
|
|
26
|
+
const agent = config.agents.list[index];
|
|
27
|
+
config.agents.list[index] = {
|
|
28
|
+
...agent,
|
|
29
|
+
workspace: { root: workspacePath },
|
|
30
|
+
models: {
|
|
31
|
+
...agent.models,
|
|
32
|
+
defaultRole: agent.models.defaultRole || "deep",
|
|
33
|
+
roles: {
|
|
34
|
+
...agent.models.roles,
|
|
35
|
+
[agent.models.defaultRole || "deep"]: { model: modelRef }
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
42
40
|
return config;
|
|
43
41
|
}
|
|
44
42
|
function formatRecommended(provider) {
|
|
@@ -268,7 +266,7 @@ async function ensureProviderCredential(provider, providerName) {
|
|
|
268
266
|
async function setupModel(existingConfig, ctx) {
|
|
269
267
|
console.log("\n🤖 Step: AI Model\n");
|
|
270
268
|
const config = existingConfig || {};
|
|
271
|
-
const currentModel = config
|
|
269
|
+
const currentModel = getAgentDefaultModelRef(config);
|
|
272
270
|
if (currentModel) {
|
|
273
271
|
console.log("Current model:", currentModel);
|
|
274
272
|
if (await confirm({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","names":["getModelsJsonPath"],"sources":["../../../../../src/cli/commands/onboard/model.ts"],"sourcesContent":["/**\n * Catalog-driven model configuration for onboarding.\n */\n\nimport { confirm, input, select } from '@inquirer/prompts';\n\nimport { CredentialResolver } from '../../../auth/credentials.js';\nimport {\n getModelsJsonPath,\n loadModelsJson,\n saveModelsJson,\n type ModelsJsonConfig,\n} from '../../../config/models-json.js';\nimport type { Config } from '../../../config/schema.js';\nimport {\n getAllProviders,\n getApiKeyFromEnv,\n getModelRegistry,\n getModelsByProvider,\n getProviderDisplayName,\n providerSupportsApiKey,\n providerSupportsOAuth,\n} from '../../../providers/index.js';\nimport {\n getProviderHint,\n getRecommendedModelsForProvider,\n sortModelsForPicker,\n sortProvidersForPicker,\n} from '../../../providers/presentation.js';\nimport { listProfilesForProvider } from '../../../auth/profiles/index.js';\nimport { getOAuthProvider } from '../../utils/oauth-providers.js';\nimport { runCliOAuthLogin } from '../../utils/oauth-login.js';\nimport type { CLIContext } from '../../registry.js';\nimport { colors } from '../../utils/colors.js';\n\ntype ModelChoice = { value: string; name: string; description?: string };\ntype CustomApiKind = 'openai-completions' | 'openai-responses' | 'anthropic-messages';\n\nfunction ensureAgentDefaults(config: Config, workspacePath: string): NonNullable<Config['agents']>['defaults'] {\n config.agents = config.agents || {};\n config.agents.defaults = config.agents.defaults || {\n workspace: workspacePath,\n maxTokens: 8192,\n temperature: 0.7,\n maxToolIterations: 20,\n maxRequestsPerTurn: 50,\n maxToolFailuresPerTurn: 3,\n };\n config.agents.defaults.workspace = workspacePath;\n return config.agents.defaults;\n}\n\nfunction setPrimaryModel(config: Config, workspacePath: string, modelRef: string): Config {\n const defaults = ensureAgentDefaults(config, workspacePath);\n defaults.models = { ...defaults.models, chat: { primary: modelRef, fallbacks: [] } };\n return config;\n}\n\nfunction formatRecommended(provider: string): string | undefined {\n const labels = getRecommendedModelsForProvider(provider, 3).map((m) => m.name || m.id);\n return labels.length > 0 ? `Recommended: ${labels.join(', ')}` : getProviderHint(provider);\n}\n\nfunction providerChoices(): Array<{ value: string; name: string; description?: string }> {\n const providers = sortProvidersForPicker(getAllProviders());\n const choices = providers.map((provider) => ({\n value: provider,\n name: getProviderDisplayName(provider),\n description: formatRecommended(provider),\n }));\n choices.push({\n value: 'custom-api',\n name: 'Custom API',\n description: 'OpenAI-compatible, OpenAI Responses, or Anthropic-compatible endpoint',\n });\n return choices;\n}\n\nfunction modelChoiceName(choice: ModelChoice): string {\n return choice.description ? `${choice.name} ${colors.gray(choice.description)}` : choice.name;\n}\n\nfunction getModelsForProvider(provider: string): ModelChoice[] {\n return sortModelsForPicker(getModelsByProvider(provider)).map((m) => {\n const badges = [m.reasoning ? 'reasoning' : '', m.input?.includes('image') ? 'vision' : '']\n .filter(Boolean)\n .join(', ');\n return {\n value: `${m.provider}/${m.id}`,\n name: m.name || m.id,\n description: badges || undefined,\n };\n });\n}\n\nasync function doOAuthLogin(provider: string): Promise<boolean> {\n const config = getOAuthProvider(provider);\n if (!config) {\n console.error(`OAuth not supported for provider: ${provider}`);\n return false;\n }\n\n console.log(`\\n🔐 Starting ${config.displayName} OAuth login...`);\n try {\n await runCliOAuthLogin({ provider, onProgress: (message) => console.log(' →', message) });\n return true;\n } catch (error) {\n console.error('❌ OAuth login failed:', error);\n return false;\n }\n}\n\nfunction joinEndpoint(baseUrl: string, suffix: string): string {\n return `${baseUrl.replace(/\\/+$/, '')}/${suffix.replace(/^\\/+/, '')}`;\n}\n\nasync function probeCustomProvider(params: {\n baseUrl: string;\n apiKey: string;\n modelId: string;\n api: CustomApiKind;\n}): Promise<void> {\n const timeout = AbortSignal.timeout(30_000);\n const commonHeaders = {\n 'content-type': 'application/json',\n authorization: `Bearer ${params.apiKey}`,\n };\n\n const request =\n params.api === 'anthropic-messages'\n ? {\n url: joinEndpoint(params.baseUrl, '/messages'),\n headers: { ...commonHeaders, 'anthropic-version': '2023-06-01' },\n body: { model: params.modelId, max_tokens: 1, messages: [{ role: 'user', content: 'ping' }] },\n }\n : params.api === 'openai-responses'\n ? {\n url: joinEndpoint(params.baseUrl, '/responses'),\n headers: commonHeaders,\n body: { model: params.modelId, input: 'ping', max_output_tokens: 1 },\n }\n : {\n url: joinEndpoint(params.baseUrl, '/chat/completions'),\n headers: commonHeaders,\n body: { model: params.modelId, messages: [{ role: 'user', content: 'ping' }], max_tokens: 1 },\n };\n\n const res = await fetch(request.url, {\n method: 'POST',\n headers: request.headers,\n body: JSON.stringify(request.body),\n signal: timeout,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`Probe failed (${res.status}) at ${request.url}${text ? `: ${text.slice(0, 300)}` : ''}`);\n }\n}\n\nfunction defaultProviderIdFromBaseUrl(baseUrl: string): string {\n try {\n const url = new URL(baseUrl);\n return url.hostname\n .replace(/^api\\./, '')\n .split('.')\n .filter(Boolean)\n .slice(0, 2)\n .join('-')\n .toLowerCase()\n .replace(/[^a-z0-9-_]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'custom';\n } catch {\n return 'custom';\n }\n}\n\nfunction validateProviderId(value: string): true | string {\n return /^[a-z0-9]([a-z0-9-_]*[a-z0-9])?$/.test(value)\n ? true\n : 'Use lowercase letters, numbers, hyphens, or underscores; start/end with a letter or number.';\n}\n\nasync function setupCustomApi(config: Config, ctx: CLIContext): Promise<Config> {\n console.log('\\n🔌 Custom API provider\\n');\n\n const baseUrl = (await input({\n message: 'API base URL:',\n default: 'https://api.example.com/v1',\n validate: (value) => URL.canParse(value) || 'Enter a valid URL',\n })).trim();\n\n const apiKey = (await input({\n message: 'API key:',\n validate: (value) => value.trim().length > 0 || 'Required',\n })).trim();\n\n const api = await select<CustomApiKind>({\n message: 'Compatibility:',\n choices: [\n { value: 'openai-completions', name: 'OpenAI-compatible Chat Completions' },\n { value: 'openai-responses', name: 'OpenAI Responses' },\n { value: 'anthropic-messages', name: 'Anthropic Messages' },\n ],\n });\n\n const modelId = (await input({\n message: 'Model ID:',\n validate: (value) => value.trim().length > 0 || 'Required',\n })).trim();\n\n console.log('\\n→ Probing endpoint...');\n await probeCustomProvider({ baseUrl, apiKey, modelId, api });\n console.log(colors.green('✓ Probe succeeded'));\n\n const existingProviders = new Set(getAllProviders());\n const providerId = (await input({\n message: 'Provider ID:',\n default: defaultProviderIdFromBaseUrl(baseUrl),\n validate: (value) => {\n const valid = validateProviderId(value.trim());\n if (valid !== true) return valid;\n if (existingProviders.has(value.trim())) return 'Provider ID already exists; choose a new ID.';\n return true;\n },\n })).trim();\n\n const path = getModelsJsonPath();\n const { config: modelsConfig } = loadModelsJson(path);\n const nextModelsConfig: ModelsJsonConfig = {\n providers: {\n ...(modelsConfig.providers ?? {}),\n [providerId]: {\n baseUrl,\n apiKey,\n api,\n models: [{ id: modelId, name: modelId, api, contextWindow: 128000, input: ['text'] }],\n },\n },\n };\n const saved = saveModelsJson(path, nextModelsConfig);\n if (!saved.success) {\n throw new Error(saved.error || 'Failed to save models.json');\n }\n getModelRegistry().refresh();\n\n const ref = `${providerId}/${modelId}`;\n console.log('\\n✅ Custom model configured:', ref);\n return setPrimaryModel(config, ctx.workspacePath, ref);\n}\n\nasync function ensureProviderCredential(provider: string, providerName: string): Promise<boolean> {\n const existingProfiles = listProfilesForProvider(provider);\n if (existingProfiles.length > 0) {\n console.log(`\\n${colors.green('✓')} Found existing credentials for ${providerName}`);\n return await confirm({ message: 'Use existing credentials?', default: true });\n }\n\n const envKey = getApiKeyFromEnv(provider);\n if (envKey) {\n console.log(`\\n${colors.green('✓')} Found API key for ${providerName} in environment`);\n return true;\n }\n\n const supportsOAuth = providerSupportsOAuth(provider);\n const supportsApiKey = providerSupportsApiKey(provider);\n\n if (supportsOAuth && !supportsApiKey) {\n return await doOAuthLogin(provider);\n }\n\n let useOAuth = false;\n if (supportsOAuth && supportsApiKey) {\n const authMethod = await select<'api_key' | 'oauth'>({\n message: `How would you like to authenticate with ${providerName}?`,\n choices: [\n { value: 'api_key', name: 'API key' },\n { value: 'oauth', name: 'OAuth login' },\n ],\n });\n useOAuth = authMethod === 'oauth';\n }\n\n if (useOAuth) {\n const ok = await doOAuthLogin(provider);\n if (ok) return true;\n console.log('\\n⚠️ OAuth login failed. Enter an API key instead.');\n }\n\n if (!supportsApiKey) return false;\n const apiKey = await input({\n message: `API key for ${providerName}:`,\n validate: (value) => value.trim().length > 0 || 'Required',\n });\n const resolver = new CredentialResolver();\n await resolver.saveApiKey(provider, apiKey.trim(), { profileName: 'default' });\n return true;\n}\n\nexport async function setupModel(existingConfig: Config | null, ctx: CLIContext): Promise<Config> {\n console.log('\\n🤖 Step: AI Model\\n');\n\n const config = existingConfig || ({} as Config);\n const currentModel = config?.agents?.defaults?.models?.chat?.primary;\n\n if (currentModel) {\n console.log('Current model:', currentModel);\n const keepCurrent = await confirm({ message: 'Keep using this model?', default: true });\n if (keepCurrent) {\n console.log('✅ Keeping:', currentModel);\n return config;\n }\n }\n\n const provider = await select({\n message: 'Model/auth provider:',\n choices: providerChoices(),\n });\n\n if (provider === 'custom-api') {\n return await setupCustomApi(config, ctx);\n }\n\n const providerName = getProviderDisplayName(provider);\n const credentialOk = await ensureProviderCredential(provider, providerName);\n if (!credentialOk) {\n console.error(`\\n❌ Could not configure credentials for ${providerName}.`);\n return config;\n }\n\n const modelChoices = getModelsForProvider(provider);\n if (modelChoices.length === 0) {\n throw new Error(`No catalog models found for ${providerName}. Add a Custom API provider instead.`);\n }\n\n console.log(`\\n📋 Models for ${providerName}:`);\n const model = await select({\n message: 'Model:',\n choices: modelChoices.map((choice) => ({ ...choice, name: modelChoiceName(choice) })),\n });\n\n console.log('\\n✅ Model configured:', model);\n return setPrimaryModel(config, ctx.workspacePath, model);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"model.js","names":["getModelsJsonPath"],"sources":["../../../../../src/cli/commands/onboard/model.ts"],"sourcesContent":["/**\n * Catalog-driven model configuration for onboarding.\n */\n\nimport { confirm, input, select } from '@inquirer/prompts';\n\nimport { CredentialResolver } from '../../../auth/credentials.js';\nimport {\n getModelsJsonPath,\n loadModelsJson,\n saveModelsJson,\n type ModelsJsonConfig,\n} from '../../../config/models-json.js';\nimport type { Config } from '../../../config/schema.js';\nimport { getAgentDefaultModelRef } from '../../../config/schema.js';\nimport {\n getAllProviders,\n getApiKeyFromEnv,\n getModelRegistry,\n getModelsByProvider,\n getProviderDisplayName,\n providerSupportsApiKey,\n providerSupportsOAuth,\n} from '../../../providers/index.js';\nimport {\n getProviderHint,\n getRecommendedModelsForProvider,\n sortModelsForPicker,\n sortProvidersForPicker,\n} from '../../../providers/presentation.js';\nimport { listProfilesForProvider } from '../../../auth/profiles/index.js';\nimport { getOAuthProvider } from '../../utils/oauth-providers.js';\nimport { runCliOAuthLogin } from '../../utils/oauth-login.js';\nimport type { CLIContext } from '../../registry.js';\nimport { colors } from '../../utils/colors.js';\n\ntype ModelChoice = { value: string; name: string; description?: string };\ntype CustomApiKind = 'openai-completions' | 'openai-responses' | 'anthropic-messages';\n\nfunction setPrimaryModel(config: Config, workspacePath: string, modelRef: string): Config {\n const id = config.agents.default ?? config.agents.list[0]?.id ?? 'main';\n const index = config.agents.list.findIndex((entry) => entry.id === id);\n if (index >= 0) {\n const agent = config.agents.list[index]!;\n config.agents.list[index] = {\n ...agent,\n workspace: { root: workspacePath },\n models: {\n ...agent.models,\n defaultRole: agent.models.defaultRole || 'deep',\n roles: { ...agent.models.roles, [agent.models.defaultRole || 'deep']: { model: modelRef } },\n },\n };\n }\n return config;\n}\n\nfunction formatRecommended(provider: string): string | undefined {\n const labels = getRecommendedModelsForProvider(provider, 3).map((m) => m.name || m.id);\n return labels.length > 0 ? `Recommended: ${labels.join(', ')}` : getProviderHint(provider);\n}\n\nfunction providerChoices(): Array<{ value: string; name: string; description?: string }> {\n const providers = sortProvidersForPicker(getAllProviders());\n const choices = providers.map((provider) => ({\n value: provider,\n name: getProviderDisplayName(provider),\n description: formatRecommended(provider),\n }));\n choices.push({\n value: 'custom-api',\n name: 'Custom API',\n description: 'OpenAI-compatible, OpenAI Responses, or Anthropic-compatible endpoint',\n });\n return choices;\n}\n\nfunction modelChoiceName(choice: ModelChoice): string {\n return choice.description ? `${choice.name} ${colors.gray(choice.description)}` : choice.name;\n}\n\nfunction getModelsForProvider(provider: string): ModelChoice[] {\n return sortModelsForPicker(getModelsByProvider(provider)).map((m) => {\n const badges = [m.reasoning ? 'reasoning' : '', m.input?.includes('image') ? 'vision' : '']\n .filter(Boolean)\n .join(', ');\n return {\n value: `${m.provider}/${m.id}`,\n name: m.name || m.id,\n description: badges || undefined,\n };\n });\n}\n\nasync function doOAuthLogin(provider: string): Promise<boolean> {\n const config = getOAuthProvider(provider);\n if (!config) {\n console.error(`OAuth not supported for provider: ${provider}`);\n return false;\n }\n\n console.log(`\\n🔐 Starting ${config.displayName} OAuth login...`);\n try {\n await runCliOAuthLogin({ provider, onProgress: (message) => console.log(' →', message) });\n return true;\n } catch (error) {\n console.error('❌ OAuth login failed:', error);\n return false;\n }\n}\n\nfunction joinEndpoint(baseUrl: string, suffix: string): string {\n return `${baseUrl.replace(/\\/+$/, '')}/${suffix.replace(/^\\/+/, '')}`;\n}\n\nasync function probeCustomProvider(params: {\n baseUrl: string;\n apiKey: string;\n modelId: string;\n api: CustomApiKind;\n}): Promise<void> {\n const timeout = AbortSignal.timeout(30_000);\n const commonHeaders = {\n 'content-type': 'application/json',\n authorization: `Bearer ${params.apiKey}`,\n };\n\n const request =\n params.api === 'anthropic-messages'\n ? {\n url: joinEndpoint(params.baseUrl, '/messages'),\n headers: { ...commonHeaders, 'anthropic-version': '2023-06-01' },\n body: { model: params.modelId, max_tokens: 1, messages: [{ role: 'user', content: 'ping' }] },\n }\n : params.api === 'openai-responses'\n ? {\n url: joinEndpoint(params.baseUrl, '/responses'),\n headers: commonHeaders,\n body: { model: params.modelId, input: 'ping', max_output_tokens: 1 },\n }\n : {\n url: joinEndpoint(params.baseUrl, '/chat/completions'),\n headers: commonHeaders,\n body: { model: params.modelId, messages: [{ role: 'user', content: 'ping' }], max_tokens: 1 },\n };\n\n const res = await fetch(request.url, {\n method: 'POST',\n headers: request.headers,\n body: JSON.stringify(request.body),\n signal: timeout,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`Probe failed (${res.status}) at ${request.url}${text ? `: ${text.slice(0, 300)}` : ''}`);\n }\n}\n\nfunction defaultProviderIdFromBaseUrl(baseUrl: string): string {\n try {\n const url = new URL(baseUrl);\n return url.hostname\n .replace(/^api\\./, '')\n .split('.')\n .filter(Boolean)\n .slice(0, 2)\n .join('-')\n .toLowerCase()\n .replace(/[^a-z0-9-_]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'custom';\n } catch {\n return 'custom';\n }\n}\n\nfunction validateProviderId(value: string): true | string {\n return /^[a-z0-9]([a-z0-9-_]*[a-z0-9])?$/.test(value)\n ? true\n : 'Use lowercase letters, numbers, hyphens, or underscores; start/end with a letter or number.';\n}\n\nasync function setupCustomApi(config: Config, ctx: CLIContext): Promise<Config> {\n console.log('\\n🔌 Custom API provider\\n');\n\n const baseUrl = (await input({\n message: 'API base URL:',\n default: 'https://api.example.com/v1',\n validate: (value) => URL.canParse(value) || 'Enter a valid URL',\n })).trim();\n\n const apiKey = (await input({\n message: 'API key:',\n validate: (value) => value.trim().length > 0 || 'Required',\n })).trim();\n\n const api = await select<CustomApiKind>({\n message: 'Compatibility:',\n choices: [\n { value: 'openai-completions', name: 'OpenAI-compatible Chat Completions' },\n { value: 'openai-responses', name: 'OpenAI Responses' },\n { value: 'anthropic-messages', name: 'Anthropic Messages' },\n ],\n });\n\n const modelId = (await input({\n message: 'Model ID:',\n validate: (value) => value.trim().length > 0 || 'Required',\n })).trim();\n\n console.log('\\n→ Probing endpoint...');\n await probeCustomProvider({ baseUrl, apiKey, modelId, api });\n console.log(colors.green('✓ Probe succeeded'));\n\n const existingProviders = new Set(getAllProviders());\n const providerId = (await input({\n message: 'Provider ID:',\n default: defaultProviderIdFromBaseUrl(baseUrl),\n validate: (value) => {\n const valid = validateProviderId(value.trim());\n if (valid !== true) return valid;\n if (existingProviders.has(value.trim())) return 'Provider ID already exists; choose a new ID.';\n return true;\n },\n })).trim();\n\n const path = getModelsJsonPath();\n const { config: modelsConfig } = loadModelsJson(path);\n const nextModelsConfig: ModelsJsonConfig = {\n providers: {\n ...(modelsConfig.providers ?? {}),\n [providerId]: {\n baseUrl,\n apiKey,\n api,\n models: [{ id: modelId, name: modelId, api, contextWindow: 128000, input: ['text'] }],\n },\n },\n };\n const saved = saveModelsJson(path, nextModelsConfig);\n if (!saved.success) {\n throw new Error(saved.error || 'Failed to save models.json');\n }\n getModelRegistry().refresh();\n\n const ref = `${providerId}/${modelId}`;\n console.log('\\n✅ Custom model configured:', ref);\n return setPrimaryModel(config, ctx.workspacePath, ref);\n}\n\nasync function ensureProviderCredential(provider: string, providerName: string): Promise<boolean> {\n const existingProfiles = listProfilesForProvider(provider);\n if (existingProfiles.length > 0) {\n console.log(`\\n${colors.green('✓')} Found existing credentials for ${providerName}`);\n return await confirm({ message: 'Use existing credentials?', default: true });\n }\n\n const envKey = getApiKeyFromEnv(provider);\n if (envKey) {\n console.log(`\\n${colors.green('✓')} Found API key for ${providerName} in environment`);\n return true;\n }\n\n const supportsOAuth = providerSupportsOAuth(provider);\n const supportsApiKey = providerSupportsApiKey(provider);\n\n if (supportsOAuth && !supportsApiKey) {\n return await doOAuthLogin(provider);\n }\n\n let useOAuth = false;\n if (supportsOAuth && supportsApiKey) {\n const authMethod = await select<'api_key' | 'oauth'>({\n message: `How would you like to authenticate with ${providerName}?`,\n choices: [\n { value: 'api_key', name: 'API key' },\n { value: 'oauth', name: 'OAuth login' },\n ],\n });\n useOAuth = authMethod === 'oauth';\n }\n\n if (useOAuth) {\n const ok = await doOAuthLogin(provider);\n if (ok) return true;\n console.log('\\n⚠️ OAuth login failed. Enter an API key instead.');\n }\n\n if (!supportsApiKey) return false;\n const apiKey = await input({\n message: `API key for ${providerName}:`,\n validate: (value) => value.trim().length > 0 || 'Required',\n });\n const resolver = new CredentialResolver();\n await resolver.saveApiKey(provider, apiKey.trim(), { profileName: 'default' });\n return true;\n}\n\nexport async function setupModel(existingConfig: Config | null, ctx: CLIContext): Promise<Config> {\n console.log('\\n🤖 Step: AI Model\\n');\n\n const config = existingConfig || ({} as Config);\n const currentModel = getAgentDefaultModelRef(config);\n\n if (currentModel) {\n console.log('Current model:', currentModel);\n const keepCurrent = await confirm({ message: 'Keep using this model?', default: true });\n if (keepCurrent) {\n console.log('✅ Keeping:', currentModel);\n return config;\n }\n }\n\n const provider = await select({\n message: 'Model/auth provider:',\n choices: providerChoices(),\n });\n\n if (provider === 'custom-api') {\n return await setupCustomApi(config, ctx);\n }\n\n const providerName = getProviderDisplayName(provider);\n const credentialOk = await ensureProviderCredential(provider, providerName);\n if (!credentialOk) {\n console.error(`\\n❌ Could not configure credentials for ${providerName}.`);\n return config;\n }\n\n const modelChoices = getModelsForProvider(provider);\n if (modelChoices.length === 0) {\n throw new Error(`No catalog models found for ${providerName}. Add a Custom API provider instead.`);\n }\n\n console.log(`\\n📋 Models for ${providerName}:`);\n const model = await select({\n message: 'Model:',\n choices: modelChoices.map((choice) => ({ ...choice, name: modelChoiceName(choice) })),\n });\n\n console.log('\\n✅ Model configured:', model);\n return setPrimaryModel(config, ctx.workspacePath, model);\n}\n"],"mappings":"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"}
|
|
@@ -21,7 +21,7 @@ function printGitHubStarHint() {
|
|
|
21
21
|
}
|
|
22
22
|
async function setupNonInteractive(_configPath, existingConfig) {
|
|
23
23
|
console.log("\n🤖 AI Model Configuration (Non-Interactive Mode)\n");
|
|
24
|
-
console.log("Current
|
|
24
|
+
console.log("Current agent manifests:", JSON.stringify(existingConfig.agents?.list ?? [], null, 2));
|
|
25
25
|
console.log("\n💡 To configure in interactive mode, run: xopc onboard");
|
|
26
26
|
console.log("💡 Or set up manually in:", _configPath);
|
|
27
27
|
return existingConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboard.js","names":["runModelSetup","runChannelOnboard"],"sources":["../../../../src/cli/commands/onboard.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { select } from '@inquirer/prompts';\nimport { saveConfig } from '../../config/index.js';\nimport { register, formatExamples } from '../registry.js';\nimport type { CLIContext } from '../registry.js';\nimport type { Config } from '../../config/schema.js';\nimport { setupModel as runModelSetup } from './onboard/model.js';\nimport { colors } from '../utils/colors.js';\nimport { setupChannels as runChannelOnboard, getChannelConfigurators } from './onboard/channels/index.js';\nimport { resolveGatewayLocalClientHost } from '../../config/gateway-bind.js';\nimport { initWorkspace } from '../utils/init-workspace.js';\nimport { ConfigSchema } from '../../config/schema.js';\n\nfunction isInteractive(): boolean {\n return process.stdin.isTTY && process.stdout.isTTY;\n}\n\nfunction printGitHubStarHint(): void {\n console.log('\\n⭐ If xopc helps you keep long-term AI work moving, please star the repo:');\n console.log(' https://github.com/xopcai/xopc');\n}\n\nasync function setupNonInteractive(_configPath: string, existingConfig: Config): Promise<Config> {\n console.log('\\n🤖 AI Model Configuration (Non-Interactive Mode)\\n');\n console.log('Current config:', JSON.stringify(existingConfig.agents?.defaults?.models?.chat, null, 2));\n console.log('\\n💡 To configure in interactive mode, run: xopc onboard');\n console.log('💡 Or set up manually in:', _configPath);\n return existingConfig;\n}\n\nfunction createOnboardCommand(ctx: CLIContext): Command {\n const cmd = new Command('onboard')\n .description('Interactive setup wizard for xopc (gateway uses schema defaults)')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc onboard # Full interactive setup',\n 'xopc onboard --quick # Configure model only, then launch locally',\n 'xopc onboard --model # Configure LLM model only',\n 'xopc onboard --channels # Configure messaging channels',\n 'xopc onboard --gateway # Apply default gateway settings (quiet)',\n ])\n )\n .option('--quick', 'Configure model only, then launch locally')\n .option('--model', 'Configure LLM provider and model')\n .option('--channels', 'Configure messaging channels')\n .option('--gateway', 'Configure gateway WebUI')\n .option('--all', 'Configure everything (default)')\n .action(async (options) => {\n try {\n await runOnboard(options, ctx);\n } catch (error: unknown) {\n const err = error as { name?: string; code?: string };\n if (err?.name === 'ExitPromptError' || err?.code === 'EXIT_PROMPT') {\n console.log('\\n\\n👋 Setup cancelled.');\n process.exit(0);\n }\n throw error;\n }\n });\n\n return cmd;\n}\n\ntype OnboardOptions = {\n quick?: boolean;\n model?: boolean;\n channels?: boolean;\n gateway?: boolean;\n all?: boolean;\n};\n\nasync function runOnboard(\n options: OnboardOptions,\n ctx: CLIContext\n): Promise<void> {\n console.log(colors.cyan('\\n🚀 Welcome to xopc setup!\\n'));\n console.log('═'.repeat(50));\n\n const workspacePath = ctx.workspacePath;\n const configPath = ctx.configPath;\n\n const initResult = await initWorkspace({ configPath, workspacePath });\n let config = initResult.config;\n\n // Determine what to configure based on options\n const doModel = options.quick || options.model || options.all || (!options.channels && !options.gateway);\n const doChannels = !options.quick && (options.channels || options.all || (!options.model && !options.gateway));\n const doGateway = !options.quick && (options.gateway || options.all || (!options.model && !options.channels));\n const runFullWizard = !options.quick && !options.model && !options.channels && !options.gateway;\n /** Any setup step besides the unified launch prompt ran in interactive flow. */\n const didConfigurableSteps = doModel || doChannels || doGateway;\n\n if (!isInteractive()) {\n // Non-interactive mode\n if (doModel) {\n config = await setupNonInteractive(configPath, config);\n }\n if (doChannels) {\n console.log('\\n💬 Channels Configuration (Non-Interactive Mode)\\n');\n console.log('💡 To configure channels, edit the config file manually.');\n }\n if (doGateway) {\n console.log('\\n🌐 Gateway Configuration (Non-Interactive Mode)\\n');\n console.log('💡 To configure gateway, edit the config file manually.');\n }\n } else {\n // Interactive mode\n if (doModel) {\n config = await runModelSetup(config, ctx);\n }\n\n if (doChannels) {\n const channelIds = (await getChannelConfigurators(config)).map(c => c.id);\n console.log(colors.gray(`\\nChannel onboarding: ${channelIds.join(', ')}\\n`));\n config = await runChannelOnboard(config);\n }\n\n if (doGateway) {\n config = await setupGateway(config);\n }\n }\n\n // Save config once at the end\n await saveConfig(config as Config, configPath);\n\n console.log('\\n' + '═'.repeat(50));\n console.log('\\n🎉 Setup Complete!\\n');\n\n const gatewayAuth = (config as any)?.gateway?.auth;\n const gatewayConfigured =\n gatewayAuth?.mode === 'token' &&\n typeof gatewayAuth?.token === 'string' &&\n gatewayAuth.token.length > 0;\n const port = (config as Config)?.gateway?.port ?? 18790;\n const displayHost = resolveGatewayLocalClientHost(config as Config);\n const gwToken = gatewayConfigured ? (gatewayAuth.token as string) : undefined;\n\n const showGatewaySummary = Boolean(gatewayConfigured && gwToken && (doGateway || runFullWizard));\n\n if (showGatewaySummary && gwToken) {\n const webuiUrl = `http://${displayHost}:${port}?token=${gwToken}`;\n console.log('🌐 Web console (browser) — start here');\n console.log(` Open: http://${displayHost}:${port}`);\n console.log(` Token: ${gwToken.slice(0, 8)}...${gwToken.slice(-8)}`);\n console.log(' Bookmark link (token is saved in the browser when you open it):');\n console.log(` ${webuiUrl}`);\n console.log('');\n }\n\n if (runFullWizard) {\n console.log('🚀 Next steps:');\n if (gatewayConfigured) {\n console.log(' 1. Choose how to launch below (gateway or terminal UI)');\n console.log(' 2. Or chat with: xopc agent -i');\n } else {\n console.log(' 1. Chat in the terminal: xopc agent -i');\n console.log(' 2. Optional: add the Web console: xopc onboard --gateway');\n }\n console.log('');\n } else if (doGateway && gatewayConfigured) {\n console.log('🚀 Next step:');\n console.log(' Start the gateway if it is not running, then open the Web console URL above.');\n console.log('');\n }\n\n console.log('📝 Usage:');\n console.log(' xopc agent -m \"Hello\" # Chat with AI');\n console.log(' xopc agent -i # Interactive mode');\n console.log(' xopc models list # List models');\n console.log(' xopc config validate # Validate xopc.json');\n console.log(' xopc auth list # View authentication');\n console.log(' xopc init # Full state dirs (if upgrading or missing data)');\n\n console.log('\\n📁 Files:');\n console.log(' Config:', configPath);\n console.log(' Workspace:', workspacePath);\n\n printGitHubStarHint();\n\n if (isInteractive() && didConfigurableSteps) {\n await promptLaunchAfterOnboard(config as Config, ctx, { doChannels });\n }\n\n process.exit(0);\n}\n\nasync function startGatewayAsService(config: Config, ctx: CLIContext): Promise<void> {\n const { startGatewayNow } = await import('./onboard/gateway.js');\n await startGatewayNow(config, ctx);\n}\n\nasync function promptLaunchAfterOnboard(\n config: Config,\n ctx: CLIContext,\n _flags: { doChannels: boolean },\n): Promise<void> {\n console.log('');\n const choice = await select<'tui' | 'gateway' | 'none'>({\n message: 'How do you want to launch xopc now?',\n choices: [\n {\n value: 'tui',\n name: 'Terminal UI (embedded)',\n description: 'xopc tui --local — no gateway process required',\n },\n {\n value: 'gateway',\n name: 'Gateway WebUI (OS service)',\n description: 'Install and start the HTTP gateway for the browser console',\n },\n {\n value: 'none',\n name: 'Exit — I will start manually',\n description: 'Finish setup without starting a runtime',\n },\n ],\n default: 'tui',\n });\n\n if (choice === 'gateway') {\n await startGatewayAsService(config, ctx);\n return;\n }\n\n if (choice === 'tui') {\n const { runTui } = await import('../../tui/tui.js');\n await runTui({ local: true });\n return;\n }\n\n console.log('\\n⏭️ You can start later:');\n console.log(' xopc gateway service install');\n console.log(' xopc gateway');\n console.log(' xopc tui --local');\n}\n\nasync function setupGateway(config: Config): Promise<Config> {\n console.log(colors.cyan('\\n🌐 Gateway WebUI\\n'));\n console.log(\n colors.gray(\n 'Applying defaults from config schema (127.0.0.1:18790, token auth; token generated if missing).\\n',\n ),\n );\n\n const gw = config.gateway ?? {};\n const { randomBytes } = await import('node:crypto');\n const authMode = gw.auth?.mode === 'none' ? ('none' as const) : ('token' as const);\n const token =\n authMode === 'token'\n ? typeof gw.auth?.token === 'string' && gw.auth.token.length > 0\n ? gw.auth.token\n : randomBytes(24).toString('hex')\n : undefined;\n\n const merged: Config = {\n ...config,\n gateway: {\n ...gw,\n bind: gw.bind ?? 'loopback',\n port: gw.port ?? 18790,\n auth:\n authMode === 'none'\n ? { mode: 'none' as const }\n : { mode: 'token' as const, token: token! },\n },\n };\n\n const parsed = ConfigSchema.parse(merged);\n console.log('✅ Gateway defaults applied.\\n');\n return parsed;\n}\n\nregister({\n id: 'onboard',\n name: 'onboard',\n description: 'Interactive setup wizard',\n factory: createOnboardCommand,\n metadata: {\n category: 'setup',\n examples: ['xopc onboard', 'xopc onboard --model', 'xopc onboard --channels'],\n },\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"onboard.js","names":["runModelSetup","runChannelOnboard"],"sources":["../../../../src/cli/commands/onboard.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { select } from '@inquirer/prompts';\nimport { saveConfig } from '../../config/index.js';\nimport { register, formatExamples } from '../registry.js';\nimport type { CLIContext } from '../registry.js';\nimport type { Config } from '../../config/schema.js';\nimport { setupModel as runModelSetup } from './onboard/model.js';\nimport { colors } from '../utils/colors.js';\nimport { setupChannels as runChannelOnboard, getChannelConfigurators } from './onboard/channels/index.js';\nimport { resolveGatewayLocalClientHost } from '../../config/gateway-bind.js';\nimport { initWorkspace } from '../utils/init-workspace.js';\nimport { ConfigSchema } from '../../config/schema.js';\n\nfunction isInteractive(): boolean {\n return process.stdin.isTTY && process.stdout.isTTY;\n}\n\nfunction printGitHubStarHint(): void {\n console.log('\\n⭐ If xopc helps you keep long-term AI work moving, please star the repo:');\n console.log(' https://github.com/xopcai/xopc');\n}\n\nasync function setupNonInteractive(_configPath: string, existingConfig: Config): Promise<Config> {\n console.log('\\n🤖 AI Model Configuration (Non-Interactive Mode)\\n');\n console.log('Current agent manifests:', JSON.stringify(existingConfig.agents?.list ?? [], null, 2));\n console.log('\\n💡 To configure in interactive mode, run: xopc onboard');\n console.log('💡 Or set up manually in:', _configPath);\n return existingConfig;\n}\n\nfunction createOnboardCommand(ctx: CLIContext): Command {\n const cmd = new Command('onboard')\n .description('Interactive setup wizard for xopc (gateway uses schema defaults)')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc onboard # Full interactive setup',\n 'xopc onboard --quick # Configure model only, then launch locally',\n 'xopc onboard --model # Configure LLM model only',\n 'xopc onboard --channels # Configure messaging channels',\n 'xopc onboard --gateway # Apply default gateway settings (quiet)',\n ])\n )\n .option('--quick', 'Configure model only, then launch locally')\n .option('--model', 'Configure LLM provider and model')\n .option('--channels', 'Configure messaging channels')\n .option('--gateway', 'Configure gateway WebUI')\n .option('--all', 'Configure everything (default)')\n .action(async (options) => {\n try {\n await runOnboard(options, ctx);\n } catch (error: unknown) {\n const err = error as { name?: string; code?: string };\n if (err?.name === 'ExitPromptError' || err?.code === 'EXIT_PROMPT') {\n console.log('\\n\\n👋 Setup cancelled.');\n process.exit(0);\n }\n throw error;\n }\n });\n\n return cmd;\n}\n\ntype OnboardOptions = {\n quick?: boolean;\n model?: boolean;\n channels?: boolean;\n gateway?: boolean;\n all?: boolean;\n};\n\nasync function runOnboard(\n options: OnboardOptions,\n ctx: CLIContext\n): Promise<void> {\n console.log(colors.cyan('\\n🚀 Welcome to xopc setup!\\n'));\n console.log('═'.repeat(50));\n\n const workspacePath = ctx.workspacePath;\n const configPath = ctx.configPath;\n\n const initResult = await initWorkspace({ configPath, workspacePath });\n let config = initResult.config;\n\n // Determine what to configure based on options\n const doModel = options.quick || options.model || options.all || (!options.channels && !options.gateway);\n const doChannels = !options.quick && (options.channels || options.all || (!options.model && !options.gateway));\n const doGateway = !options.quick && (options.gateway || options.all || (!options.model && !options.channels));\n const runFullWizard = !options.quick && !options.model && !options.channels && !options.gateway;\n /** Any setup step besides the unified launch prompt ran in interactive flow. */\n const didConfigurableSteps = doModel || doChannels || doGateway;\n\n if (!isInteractive()) {\n // Non-interactive mode\n if (doModel) {\n config = await setupNonInteractive(configPath, config);\n }\n if (doChannels) {\n console.log('\\n💬 Channels Configuration (Non-Interactive Mode)\\n');\n console.log('💡 To configure channels, edit the config file manually.');\n }\n if (doGateway) {\n console.log('\\n🌐 Gateway Configuration (Non-Interactive Mode)\\n');\n console.log('💡 To configure gateway, edit the config file manually.');\n }\n } else {\n // Interactive mode\n if (doModel) {\n config = await runModelSetup(config, ctx);\n }\n\n if (doChannels) {\n const channelIds = (await getChannelConfigurators(config)).map(c => c.id);\n console.log(colors.gray(`\\nChannel onboarding: ${channelIds.join(', ')}\\n`));\n config = await runChannelOnboard(config);\n }\n\n if (doGateway) {\n config = await setupGateway(config);\n }\n }\n\n // Save config once at the end\n await saveConfig(config as Config, configPath);\n\n console.log('\\n' + '═'.repeat(50));\n console.log('\\n🎉 Setup Complete!\\n');\n\n const gatewayAuth = (config as any)?.gateway?.auth;\n const gatewayConfigured =\n gatewayAuth?.mode === 'token' &&\n typeof gatewayAuth?.token === 'string' &&\n gatewayAuth.token.length > 0;\n const port = (config as Config)?.gateway?.port ?? 18790;\n const displayHost = resolveGatewayLocalClientHost(config as Config);\n const gwToken = gatewayConfigured ? (gatewayAuth.token as string) : undefined;\n\n const showGatewaySummary = Boolean(gatewayConfigured && gwToken && (doGateway || runFullWizard));\n\n if (showGatewaySummary && gwToken) {\n const webuiUrl = `http://${displayHost}:${port}?token=${gwToken}`;\n console.log('🌐 Web console (browser) — start here');\n console.log(` Open: http://${displayHost}:${port}`);\n console.log(` Token: ${gwToken.slice(0, 8)}...${gwToken.slice(-8)}`);\n console.log(' Bookmark link (token is saved in the browser when you open it):');\n console.log(` ${webuiUrl}`);\n console.log('');\n }\n\n if (runFullWizard) {\n console.log('🚀 Next steps:');\n if (gatewayConfigured) {\n console.log(' 1. Choose how to launch below (gateway or terminal UI)');\n console.log(' 2. Or chat with: xopc agent -i');\n } else {\n console.log(' 1. Chat in the terminal: xopc agent -i');\n console.log(' 2. Optional: add the Web console: xopc onboard --gateway');\n }\n console.log('');\n } else if (doGateway && gatewayConfigured) {\n console.log('🚀 Next step:');\n console.log(' Start the gateway if it is not running, then open the Web console URL above.');\n console.log('');\n }\n\n console.log('📝 Usage:');\n console.log(' xopc agent -m \"Hello\" # Chat with AI');\n console.log(' xopc agent -i # Interactive mode');\n console.log(' xopc models list # List models');\n console.log(' xopc config validate # Validate xopc.json');\n console.log(' xopc auth list # View authentication');\n console.log(' xopc init # Full state dirs (if upgrading or missing data)');\n\n console.log('\\n📁 Files:');\n console.log(' Config:', configPath);\n console.log(' Workspace:', workspacePath);\n\n printGitHubStarHint();\n\n if (isInteractive() && didConfigurableSteps) {\n await promptLaunchAfterOnboard(config as Config, ctx, { doChannels });\n }\n\n process.exit(0);\n}\n\nasync function startGatewayAsService(config: Config, ctx: CLIContext): Promise<void> {\n const { startGatewayNow } = await import('./onboard/gateway.js');\n await startGatewayNow(config, ctx);\n}\n\nasync function promptLaunchAfterOnboard(\n config: Config,\n ctx: CLIContext,\n _flags: { doChannels: boolean },\n): Promise<void> {\n console.log('');\n const choice = await select<'tui' | 'gateway' | 'none'>({\n message: 'How do you want to launch xopc now?',\n choices: [\n {\n value: 'tui',\n name: 'Terminal UI (embedded)',\n description: 'xopc tui --local — no gateway process required',\n },\n {\n value: 'gateway',\n name: 'Gateway WebUI (OS service)',\n description: 'Install and start the HTTP gateway for the browser console',\n },\n {\n value: 'none',\n name: 'Exit — I will start manually',\n description: 'Finish setup without starting a runtime',\n },\n ],\n default: 'tui',\n });\n\n if (choice === 'gateway') {\n await startGatewayAsService(config, ctx);\n return;\n }\n\n if (choice === 'tui') {\n const { runTui } = await import('../../tui/tui.js');\n await runTui({ local: true });\n return;\n }\n\n console.log('\\n⏭️ You can start later:');\n console.log(' xopc gateway service install');\n console.log(' xopc gateway');\n console.log(' xopc tui --local');\n}\n\nasync function setupGateway(config: Config): Promise<Config> {\n console.log(colors.cyan('\\n🌐 Gateway WebUI\\n'));\n console.log(\n colors.gray(\n 'Applying defaults from config schema (127.0.0.1:18790, token auth; token generated if missing).\\n',\n ),\n );\n\n const gw = config.gateway ?? {};\n const { randomBytes } = await import('node:crypto');\n const authMode = gw.auth?.mode === 'none' ? ('none' as const) : ('token' as const);\n const token =\n authMode === 'token'\n ? typeof gw.auth?.token === 'string' && gw.auth.token.length > 0\n ? gw.auth.token\n : randomBytes(24).toString('hex')\n : undefined;\n\n const merged: Config = {\n ...config,\n gateway: {\n ...gw,\n bind: gw.bind ?? 'loopback',\n port: gw.port ?? 18790,\n auth:\n authMode === 'none'\n ? { mode: 'none' as const }\n : { mode: 'token' as const, token: token! },\n },\n };\n\n const parsed = ConfigSchema.parse(merged);\n console.log('✅ Gateway defaults applied.\\n');\n return parsed;\n}\n\nregister({\n id: 'onboard',\n name: 'onboard',\n description: 'Interactive setup wizard',\n factory: createOnboardCommand,\n metadata: {\n category: 'setup',\n examples: ['xopc onboard', 'xopc onboard --model', 'xopc onboard --channels'],\n },\n});\n"],"mappings":"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"}
|
|
@@ -4,10 +4,7 @@ export interface InitWorkspaceCoreOptions {
|
|
|
4
4
|
workspacePath: string;
|
|
5
5
|
/** When set with a new config file, overrides schema default port (e.g. Electron). */
|
|
6
6
|
gatewayPort?: number;
|
|
7
|
-
/**
|
|
8
|
-
* When true, sets `agents.defaults.workspace` to `dirname(workspacePath)` (parent of the
|
|
9
|
-
* Markdown root being initialised, e.g. `…/workspace` when `workspacePath` is `…/workspace/main`).
|
|
10
|
-
*/
|
|
7
|
+
/** When true, sets the default agent manifest workspace root to `workspacePath`. */
|
|
11
8
|
persistWorkspacePath?: boolean;
|
|
12
9
|
/** Optional channel plugin validator (CLI/gateway only; Electron omits). */
|
|
13
10
|
assertChannelPlugins?: (cfg: Config) => void | Promise<void>;
|
|
@@ -33,7 +33,7 @@ async function initWorkspaceCore(options) {
|
|
|
33
33
|
const gatewayPortDefaulted = options.gatewayPort ?? 18790;
|
|
34
34
|
const persistWorkspacePath = options.persistWorkspacePath ?? false;
|
|
35
35
|
const { configPath, workspacePath, assertChannelPlugins } = options;
|
|
36
|
-
const
|
|
36
|
+
const persistedWorkspaceRoot = persistWorkspacePath ? workspacePath : void 0;
|
|
37
37
|
mkdirSync(dirname(configPath), { recursive: true });
|
|
38
38
|
const configExisted = existsSync(configPath);
|
|
39
39
|
const workspaceExisted = existsSync(workspacePath);
|
|
@@ -48,15 +48,16 @@ async function initWorkspaceCore(options) {
|
|
|
48
48
|
const workspaceCreated = !workspaceExisted;
|
|
49
49
|
const token = config.gateway?.auth?.mode === "token" && typeof config.gateway?.auth?.token === "string" && config.gateway.auth.token.length > 0 ? config.gateway.auth.token : randomBytes(24).toString("hex");
|
|
50
50
|
const port = configExisted ? config.gateway?.port ?? gatewayPortDefaulted : options.gatewayPort !== void 0 ? gatewayPortDefaulted : config.gateway?.port ?? 18790;
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
...
|
|
54
|
-
|
|
51
|
+
const defaultAgentId = config.agents.default ?? config.agents.list[0]?.id ?? "main";
|
|
52
|
+
const agentsList = persistedWorkspaceRoot === void 0 ? config.agents.list : config.agents.list.map((agent) => agent.id === defaultAgentId ? {
|
|
53
|
+
...agent,
|
|
54
|
+
workspace: { root: persistedWorkspaceRoot }
|
|
55
|
+
} : agent);
|
|
55
56
|
const nextConfig = {
|
|
56
57
|
...config,
|
|
57
58
|
agents: {
|
|
58
59
|
...config.agents,
|
|
59
|
-
|
|
60
|
+
list: agentsList
|
|
60
61
|
},
|
|
61
62
|
gateway: {
|
|
62
63
|
...config.gateway,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-workspace-core.js","names":[],"sources":["../../../../src/cli/utils/init-workspace-core.ts"],"sourcesContent":["import { randomBytes } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\nimport type { Config } from '../../config/schema.js';\nimport { ConfigSchema } from '../../config/schema.js';\nimport { saveConfig } from '../../config/loader.js';\nimport { ensureStarterAgentsInitialized } from '../../agent/starter-agents.js';\n\nexport interface InitWorkspaceCoreOptions {\n configPath: string;\n workspacePath: string;\n /** When set with a new config file, overrides schema default port (e.g. Electron). */\n gatewayPort?: number;\n
|
|
1
|
+
{"version":3,"file":"init-workspace-core.js","names":[],"sources":["../../../../src/cli/utils/init-workspace-core.ts"],"sourcesContent":["import { randomBytes } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\nimport type { Config } from '../../config/schema.js';\nimport { ConfigSchema } from '../../config/schema.js';\nimport { saveConfig } from '../../config/loader.js';\nimport { ensureStarterAgentsInitialized } from '../../agent/starter-agents.js';\n\nexport interface InitWorkspaceCoreOptions {\n configPath: string;\n workspacePath: string;\n /** When set with a new config file, overrides schema default port (e.g. Electron). */\n gatewayPort?: number;\n /** When true, sets the default agent manifest workspace root to `workspacePath`. */\n persistWorkspacePath?: boolean;\n /** Optional channel plugin validator (CLI/gateway only; Electron omits). */\n assertChannelPlugins?: (cfg: Config) => void | Promise<void>;\n}\n\nexport interface InitWorkspaceResult {\n /** Fully-initialised config (matches disk after any write). */\n config: Config;\n /** Gateway auth token (always present after init). */\n token: string;\n configCreated: boolean;\n workspaceCreated: boolean;\n}\n\nasync function assertChannelPluginsIfNeeded(\n cfg: Config,\n assert?: InitWorkspaceCoreOptions['assertChannelPlugins'],\n): Promise<void> {\n if (assert) await assert(cfg);\n}\n\nasync function serializeConfig(\n cfg: Config,\n assertChannelPlugins?: InitWorkspaceCoreOptions['assertChannelPlugins'],\n): Promise<string> {\n const validated = ConfigSchema.parse(cfg);\n await assertChannelPluginsIfNeeded(validated, assertChannelPlugins);\n return JSON.stringify(validated, null, 2);\n}\n\nasync function tryReadDiskConfig(\n configPath: string,\n assertChannelPlugins?: InitWorkspaceCoreOptions['assertChannelPlugins'],\n): Promise<Config | null> {\n try {\n const raw = readFileSync(configPath, 'utf-8');\n const cfg = ConfigSchema.parse(JSON.parse(raw) as unknown);\n await assertChannelPluginsIfNeeded(cfg, assertChannelPlugins);\n return cfg;\n } catch {\n return null;\n }\n}\n\n/**\n * Workspace + config initialisation without importing bundled channel plugins.\n * Used by Electron main; CLI/gateway should call {@link initWorkspace} instead.\n */\nexport async function initWorkspaceCore(options: InitWorkspaceCoreOptions): Promise<InitWorkspaceResult> {\n const gatewayPortDefaulted = options.gatewayPort ?? 18790;\n const persistWorkspacePath = options.persistWorkspacePath ?? false;\n const { configPath, workspacePath, assertChannelPlugins } = options;\n const persistedWorkspaceRoot = persistWorkspacePath ? workspacePath : undefined;\n\n mkdirSync(dirname(configPath), { recursive: true });\n\n const configExisted = existsSync(configPath);\n const workspaceExisted = existsSync(workspacePath);\n\n let config: Config;\n if (configExisted) {\n config = (await tryReadDiskConfig(configPath, assertChannelPlugins)) ?? ConfigSchema.parse(undefined);\n } else {\n config = ConfigSchema.parse(undefined);\n await assertChannelPluginsIfNeeded(config, assertChannelPlugins);\n }\n\n mkdirSync(workspacePath, { recursive: true });\n\n const configCreated = !configExisted;\n const workspaceCreated = !workspaceExisted;\n\n const hadToken =\n config.gateway?.auth?.mode === 'token' &&\n typeof config.gateway?.auth?.token === 'string' &&\n config.gateway.auth.token.length > 0;\n\n const token = hadToken ? (config.gateway!.auth!.token as string) : randomBytes(24).toString('hex');\n\n const port = configExisted\n ? (config.gateway?.port ?? gatewayPortDefaulted)\n : options.gatewayPort !== undefined\n ? gatewayPortDefaulted\n : (config.gateway?.port ?? 18790);\n\n const defaultAgentId = config.agents.default ?? config.agents.list[0]?.id ?? 'main';\n const agentsList =\n persistedWorkspaceRoot === undefined\n ? config.agents.list\n : config.agents.list.map((agent) =>\n agent.id === defaultAgentId ? { ...agent, workspace: { root: persistedWorkspaceRoot } } : agent,\n );\n\n const nextConfig: Config = {\n ...config,\n agents: {\n ...config.agents,\n list: agentsList,\n },\n gateway: {\n ...config.gateway,\n port,\n auth: {\n ...config.gateway?.auth,\n mode: 'token' as const,\n token,\n },\n },\n };\n\n const starterResult = ensureStarterAgentsInitialized(ConfigSchema.parse(nextConfig));\n const nextFinal = ConfigSchema.parse(starterResult.config);\n await assertChannelPluginsIfNeeded(nextFinal, assertChannelPlugins);\n\n let needsWrite = configCreated || starterResult.changed;\n if (!needsWrite) {\n const disk = await tryReadDiskConfig(configPath, assertChannelPlugins);\n if (!disk) {\n needsWrite = true;\n } else {\n needsWrite =\n (await serializeConfig(disk, assertChannelPlugins)) !==\n (await serializeConfig(nextFinal, assertChannelPlugins));\n }\n }\n\n if (needsWrite) {\n if (assertChannelPlugins) {\n await saveConfig(nextFinal, configPath);\n } else {\n writeFileSync(configPath, `${JSON.stringify(nextFinal, null, 2)}\\n`, 'utf8');\n }\n }\n\n return {\n config: nextFinal,\n token,\n configCreated,\n workspaceCreated,\n };\n}\n"],"mappings":";;;;;;;aAKsD;aACF;AAuBpD,eAAe,6BACb,KACA,QACe;AACf,KAAI,OAAQ,OAAM,OAAO,IAAI;;AAG/B,eAAe,gBACb,KACA,sBACiB;CACjB,MAAM,YAAY,aAAa,MAAM,IAAI;AACzC,OAAM,6BAA6B,WAAW,qBAAqB;AACnE,QAAO,KAAK,UAAU,WAAW,MAAM,EAAE;;AAG3C,eAAe,kBACb,YACA,sBACwB;AACxB,KAAI;EACF,MAAM,MAAM,aAAa,YAAY,QAAQ;EAC7C,MAAM,MAAM,aAAa,MAAM,KAAK,MAAM,IAAI,CAAY;AAC1D,QAAM,6BAA6B,KAAK,qBAAqB;AAC7D,SAAO;SACD;AACN,SAAO;;;;;;;AAQX,eAAsB,kBAAkB,SAAiE;CACvG,MAAM,uBAAuB,QAAQ,eAAe;CACpD,MAAM,uBAAuB,QAAQ,wBAAwB;CAC7D,MAAM,EAAE,YAAY,eAAe,yBAAyB;CAC5D,MAAM,yBAAyB,uBAAuB,gBAAgB,KAAA;AAEtE,WAAU,QAAQ,WAAW,EAAE,EAAE,WAAW,MAAM,CAAC;CAEnD,MAAM,gBAAgB,WAAW,WAAW;CAC5C,MAAM,mBAAmB,WAAW,cAAc;CAElD,IAAI;AACJ,KAAI,cACF,UAAU,MAAM,kBAAkB,YAAY,qBAAqB,IAAK,aAAa,MAAM,KAAA,EAAU;MAChG;AACL,WAAS,aAAa,MAAM,KAAA,EAAU;AACtC,QAAM,6BAA6B,QAAQ,qBAAqB;;AAGlE,WAAU,eAAe,EAAE,WAAW,MAAM,CAAC;CAE7C,MAAM,gBAAgB,CAAC;CACvB,MAAM,mBAAmB,CAAC;CAO1B,MAAM,QAJJ,OAAO,SAAS,MAAM,SAAS,WAC/B,OAAO,OAAO,SAAS,MAAM,UAAU,YACvC,OAAO,QAAQ,KAAK,MAAM,SAAS,IAEX,OAAO,QAAS,KAAM,QAAmB,YAAY,GAAG,CAAC,SAAS,MAAM;CAElG,MAAM,OAAO,gBACR,OAAO,SAAS,QAAQ,uBACzB,QAAQ,gBAAgB,KAAA,IACtB,uBACC,OAAO,SAAS,QAAQ;CAE/B,MAAM,iBAAiB,OAAO,OAAO,WAAW,OAAO,OAAO,KAAK,IAAI,MAAM;CAC7E,MAAM,aACJ,2BAA2B,KAAA,IACvB,OAAO,OAAO,OACd,OAAO,OAAO,KAAK,KAAK,UACtB,MAAM,OAAO,iBAAiB;EAAE,GAAG;EAAO,WAAW,EAAE,MAAM,wBAAwB;EAAE,GAAG,MAC3F;CAEP,MAAM,aAAqB;EACzB,GAAG;EACH,QAAQ;GACN,GAAG,OAAO;GACV,MAAM;GACP;EACD,SAAS;GACP,GAAG,OAAO;GACV;GACA,MAAM;IACJ,GAAG,OAAO,SAAS;IACnB,MAAM;IACN;IACD;GACF;EACF;CAED,MAAM,gBAAgB,+BAA+B,aAAa,MAAM,WAAW,CAAC;CACpF,MAAM,YAAY,aAAa,MAAM,cAAc,OAAO;AAC1D,OAAM,6BAA6B,WAAW,qBAAqB;CAEnE,IAAI,aAAa,iBAAiB,cAAc;AAChD,KAAI,CAAC,YAAY;EACf,MAAM,OAAO,MAAM,kBAAkB,YAAY,qBAAqB;AACtE,MAAI,CAAC,KACH,cAAa;MAEb,cACG,MAAM,gBAAgB,MAAM,qBAAqB,KACjD,MAAM,gBAAgB,WAAW,qBAAqB;;AAI7D,KAAI,WACF,KAAI,qBACF,OAAM,WAAW,WAAW,WAAW;KAEvC,eAAc,YAAY,GAAG,KAAK,UAAU,WAAW,MAAM,EAAE,CAAC,KAAK,OAAO;AAIhF,QAAO;EACL,QAAQ;EACR;EACA;EACA;EACD"}
|
|
@@ -9,7 +9,6 @@ export declare function findAgentEntryIndex(list: AgentEntry[], agentId: string)
|
|
|
9
9
|
export declare function applyAgentConfig(cfg: Config, params: {
|
|
10
10
|
agentId: string;
|
|
11
11
|
workspace?: string;
|
|
12
|
-
agentDir?: string;
|
|
13
12
|
model?: string;
|
|
14
13
|
models?: AgentEntry['models'];
|
|
15
14
|
skills?: string[];
|
|
@@ -14,29 +14,86 @@ function applyAgentConfig(cfg, params) {
|
|
|
14
14
|
const agentId = normalizeAgentId(params.agentId);
|
|
15
15
|
const list = listAgentEntries(cfg);
|
|
16
16
|
const index = findAgentEntryIndex(list, agentId);
|
|
17
|
+
const nextTools = params.tools;
|
|
17
18
|
const base = index >= 0 ? list[index] : {
|
|
18
19
|
id: agentId,
|
|
19
|
-
enabled: true
|
|
20
|
+
enabled: true,
|
|
21
|
+
identity: {
|
|
22
|
+
name: agentId,
|
|
23
|
+
role: "Agent",
|
|
24
|
+
language: "en",
|
|
25
|
+
tone: "direct"
|
|
26
|
+
},
|
|
27
|
+
responsibilities: { primary: ["Help the user complete tasks"] },
|
|
28
|
+
workspace: { root: `~/.xopc/workspace/${agentId}` },
|
|
29
|
+
models: {
|
|
30
|
+
defaultRole: "deep",
|
|
31
|
+
roles: { deep: { model: params.model ?? "openai/gpt-4.1" } }
|
|
32
|
+
},
|
|
33
|
+
tools: { builtin: {} },
|
|
34
|
+
skills: { mode: "all" },
|
|
35
|
+
memory: {
|
|
36
|
+
mode: "confirmWrite",
|
|
37
|
+
sources: ["session", "curated"],
|
|
38
|
+
writePolicy: { curated: "confirm" }
|
|
39
|
+
},
|
|
40
|
+
workflows: {},
|
|
41
|
+
boundaries: {
|
|
42
|
+
requiresConfirmation: [],
|
|
43
|
+
forbidden: [],
|
|
44
|
+
escalation: []
|
|
45
|
+
}
|
|
20
46
|
};
|
|
21
47
|
const nextEntry = {
|
|
22
48
|
...base,
|
|
23
49
|
enabled: base.enabled ?? true,
|
|
24
|
-
...params.workspace ? { workspace: params.workspace } : {},
|
|
25
|
-
...params.agentDir ? { agentDir: params.agentDir } : {},
|
|
50
|
+
...params.workspace ? { workspace: { root: params.workspace } } : {},
|
|
26
51
|
...params.models ? { models: params.models } : {},
|
|
27
52
|
...params.model ? { models: {
|
|
28
53
|
...base.models,
|
|
29
|
-
|
|
54
|
+
defaultRole: "deep",
|
|
55
|
+
roles: {
|
|
56
|
+
...base.models.roles,
|
|
57
|
+
deep: { model: params.model }
|
|
58
|
+
}
|
|
59
|
+
} } : {},
|
|
60
|
+
...params.skills ? { skills: {
|
|
61
|
+
mode: "allowlist",
|
|
62
|
+
allow: params.skills
|
|
30
63
|
} } : {},
|
|
31
|
-
...
|
|
32
|
-
...params.tools ? { tools: params.tools } : {}
|
|
64
|
+
...nextTools ? { tools: nextTools } : {}
|
|
33
65
|
};
|
|
34
66
|
const nextList = [...list];
|
|
35
67
|
if (index >= 0) nextList[index] = nextEntry;
|
|
36
68
|
else {
|
|
37
69
|
if (nextList.length === 0 && agentId !== normalizeAgentId(resolveDefaultAgentId(cfg))) nextList.push({
|
|
38
70
|
id: resolveDefaultAgentId(cfg),
|
|
39
|
-
enabled: true
|
|
71
|
+
enabled: true,
|
|
72
|
+
identity: {
|
|
73
|
+
name: resolveDefaultAgentId(cfg),
|
|
74
|
+
role: "Agent",
|
|
75
|
+
language: "en",
|
|
76
|
+
tone: "direct"
|
|
77
|
+
},
|
|
78
|
+
responsibilities: { primary: ["Help the user complete tasks"] },
|
|
79
|
+
workspace: { root: `~/.xopc/workspace/${resolveDefaultAgentId(cfg)}` },
|
|
80
|
+
models: {
|
|
81
|
+
defaultRole: "deep",
|
|
82
|
+
roles: { deep: { model: "openai/gpt-4.1" } }
|
|
83
|
+
},
|
|
84
|
+
tools: { builtin: {} },
|
|
85
|
+
skills: { mode: "all" },
|
|
86
|
+
memory: {
|
|
87
|
+
mode: "confirmWrite",
|
|
88
|
+
sources: ["session", "curated"],
|
|
89
|
+
writePolicy: { curated: "confirm" }
|
|
90
|
+
},
|
|
91
|
+
workflows: {},
|
|
92
|
+
boundaries: {
|
|
93
|
+
requiresConfirmation: [],
|
|
94
|
+
forbidden: [],
|
|
95
|
+
escalation: []
|
|
96
|
+
}
|
|
40
97
|
});
|
|
41
98
|
nextList.push(nextEntry);
|
|
42
99
|
}
|
|
@@ -51,18 +108,15 @@ function applyAgentConfig(cfg, params) {
|
|
|
51
108
|
function pruneAgentConfig(cfg, agentId) {
|
|
52
109
|
const id = normalizeAgentId(agentId);
|
|
53
110
|
const nextAgentsList = listAgentEntries(cfg).filter((e) => normalizeAgentId(e.id) !== id);
|
|
54
|
-
const nextAgents = nextAgentsList.length > 0 ? nextAgentsList :
|
|
111
|
+
const nextAgents = nextAgentsList.length > 0 ? nextAgentsList : [];
|
|
55
112
|
const bindings = cfg.bindings ?? [];
|
|
56
113
|
const filteredBindings = bindings.filter((b) => normalizeAgentId(b.agentId) !== id);
|
|
57
114
|
return {
|
|
58
115
|
config: {
|
|
59
116
|
...cfg,
|
|
60
|
-
agents:
|
|
117
|
+
agents: {
|
|
61
118
|
...cfg.agents,
|
|
62
119
|
list: nextAgents
|
|
63
|
-
} : {
|
|
64
|
-
...cfg.agents,
|
|
65
|
-
list: void 0
|
|
66
120
|
},
|
|
67
121
|
bindings: filteredBindings
|
|
68
122
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.config.js","names":[],"sources":["../../../src/commands/agents.config.ts"],"sourcesContent":["/**\n * Mutate `agents.list` / bindings when adding or removing agents.\n */\n\nimport { rm } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\n\nimport type { Config } from '../config/schema.js';\nimport {\n listAgentEntries,\n normalizeAgentId,\n resolveAgentHomeDir,\n resolveAgentWorkspaceDir,\n resolveDefaultAgentId,\n DEFAULT_AGENT_ID,\n} from '../agent/agent-scope.js';\n\ntype AgentEntry = NonNullable<NonNullable<Config['agents']>['list']>[number];\n\nexport { listAgentEntries };\n\nexport function findAgentEntryIndex(list: AgentEntry[], agentId: string): number {\n const id = normalizeAgentId(agentId);\n return list.findIndex((e) => normalizeAgentId(e.id) === id);\n}\n\nexport function applyAgentConfig(\n cfg: Config,\n params: {\n agentId: string;\n workspace?: string;\n
|
|
1
|
+
{"version":3,"file":"agents.config.js","names":[],"sources":["../../../src/commands/agents.config.ts"],"sourcesContent":["/**\n * Mutate `agents.list` / bindings when adding or removing agents.\n */\n\nimport { rm } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\n\nimport type { Config } from '../config/schema.js';\nimport {\n listAgentEntries,\n normalizeAgentId,\n resolveAgentHomeDir,\n resolveAgentWorkspaceDir,\n resolveDefaultAgentId,\n DEFAULT_AGENT_ID,\n} from '../agent/agent-scope.js';\n\ntype AgentEntry = NonNullable<NonNullable<Config['agents']>['list']>[number];\n\nexport { listAgentEntries };\n\nexport function findAgentEntryIndex(list: AgentEntry[], agentId: string): number {\n const id = normalizeAgentId(agentId);\n return list.findIndex((e) => normalizeAgentId(e.id) === id);\n}\n\nexport function applyAgentConfig(\n cfg: Config,\n params: {\n agentId: string;\n workspace?: string;\n model?: string;\n models?: AgentEntry['models'];\n skills?: string[];\n tools?: AgentEntry['tools'];\n },\n): Config {\n const agentId = normalizeAgentId(params.agentId);\n const list = listAgentEntries(cfg);\n const index = findAgentEntryIndex(list, agentId);\n const nextTools = params.tools;\n const base = index >= 0 ? list[index] : {\n id: agentId,\n enabled: true as const,\n identity: { name: agentId, role: 'Agent', language: 'en', tone: 'direct' },\n responsibilities: { primary: ['Help the user complete tasks'] },\n workspace: { root: `~/.xopc/workspace/${agentId}` },\n models: { defaultRole: 'deep', roles: { deep: { model: params.model ?? 'openai/gpt-4.1' } } },\n tools: { builtin: {} },\n skills: { mode: 'all' as const },\n memory: { mode: 'confirmWrite' as const, sources: ['session' as const, 'curated' as const], writePolicy: { curated: 'confirm' as const } },\n workflows: {},\n boundaries: { requiresConfirmation: [], forbidden: [], escalation: [] },\n };\n const nextEntry: AgentEntry = {\n ...base,\n enabled: base.enabled ?? true,\n ...(params.workspace ? { workspace: { root: params.workspace } } : {}),\n ...(params.models ? { models: params.models } : {}),\n ...(params.model ? { models: { ...base.models, defaultRole: 'deep', roles: { ...base.models.roles, deep: { model: params.model } } } } : {}),\n ...(params.skills ? { skills: { mode: 'allowlist' as const, allow: params.skills } } : {}),\n ...(nextTools ? { tools: nextTools } : {}),\n };\n const nextList = [...list];\n if (index >= 0) {\n nextList[index] = nextEntry;\n } else {\n if (nextList.length === 0 && agentId !== normalizeAgentId(resolveDefaultAgentId(cfg))) {\n nextList.push({\n id: resolveDefaultAgentId(cfg),\n enabled: true,\n identity: { name: resolveDefaultAgentId(cfg), role: 'Agent', language: 'en', tone: 'direct' },\n responsibilities: { primary: ['Help the user complete tasks'] },\n workspace: { root: `~/.xopc/workspace/${resolveDefaultAgentId(cfg)}` },\n models: { defaultRole: 'deep', roles: { deep: { model: 'openai/gpt-4.1' } } },\n tools: { builtin: {} },\n skills: { mode: 'all' },\n memory: { mode: 'confirmWrite', sources: ['session', 'curated'], writePolicy: { curated: 'confirm' } },\n workflows: {},\n boundaries: { requiresConfirmation: [], forbidden: [], escalation: [] },\n });\n }\n nextList.push(nextEntry);\n }\n return {\n ...cfg,\n agents: {\n ...cfg.agents,\n list: nextList,\n },\n };\n}\n\nexport function pruneAgentConfig(\n cfg: Config,\n agentId: string,\n): { config: Config; removedBindings: number } {\n const id = normalizeAgentId(agentId);\n const agents = listAgentEntries(cfg);\n const nextAgentsList = agents.filter((e) => normalizeAgentId(e.id) !== id);\n const nextAgents = nextAgentsList.length > 0 ? nextAgentsList : [];\n\n const bindings = cfg.bindings ?? [];\n const filteredBindings = bindings.filter((b) => normalizeAgentId(b.agentId) !== id);\n\n return {\n config: {\n ...cfg,\n agents: { ...cfg.agents, list: nextAgents },\n bindings: filteredBindings,\n },\n removedBindings: bindings.length - filteredBindings.length,\n };\n}\n\nexport async function removeAgentDirsFromDisk(cfg: Config, id: string): Promise<void> {\n const aid = normalizeAgentId(id);\n if (aid === DEFAULT_AGENT_ID) {\n throw new Error('Refusing to delete the main agent home on disk from this command.');\n }\n const home = resolveAgentHomeDir(cfg, aid);\n const ws = resolveAgentWorkspaceDir(cfg, aid);\n if (existsSync(home)) {\n await rm(home, { recursive: true, force: true });\n }\n if (existsSync(ws) && ws !== home) {\n await rm(ws, { recursive: true, force: true });\n }\n}\n"],"mappings":"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"}
|