@aiwg/cli 2026.10.1 → 2026.10.4
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 +2 -2
- package/agentic/code/providers/capability-matrix.yaml +270 -0
- package/agentic/code/providers/model-capabilities.v1.json +3183 -24
- package/bin/aiwg.mjs +135 -47
- package/dist/src/a2a/codecs.js +9 -0
- package/dist/src/agents/grounding/knowledge-base.js +54 -6
- package/dist/src/artifacts/browser-export.js +6 -0
- package/dist/src/artifacts/checksum-manifest.js +1 -0
- package/dist/src/artifacts/citation-parser.js +173 -92
- package/dist/src/artifacts/citation-table-schema.js +59 -0
- package/dist/src/artifacts/cli.js +57 -18
- package/dist/src/artifacts/corpus-tools/snapshot.js +1 -1
- package/dist/src/artifacts/corpus-tools/vision-extract.js +107 -15
- package/dist/src/artifacts/corpus-views/ref-parser.js +3 -1
- package/dist/src/artifacts/corpus-views/renderers.js +3 -3
- package/dist/src/artifacts/discovery-eval.js +6 -4
- package/dist/src/artifacts/fortemi-core-query-adapter.js +36 -3
- package/dist/src/artifacts/fortemi-core-sync.js +166 -40
- package/dist/src/artifacts/framework-capabilities.js +171 -0
- package/dist/src/artifacts/framework-index-paths.js +73 -0
- package/dist/src/artifacts/framework-source-digest.js +75 -0
- package/dist/src/artifacts/index-builder.js +285 -131
- package/dist/src/artifacts/index-files.js +132 -18
- package/dist/src/artifacts/index-preparation.js +65 -0
- package/dist/src/artifacts/index-refresh.js +576 -0
- package/dist/src/artifacts/index-worker.mjs +9 -0
- package/dist/src/artifacts/prebuilt-build-lock.js +47 -4
- package/dist/src/artifacts/prebuilt-deployment.js +46 -0
- package/dist/src/artifacts/prebuilt-relations.js +80 -0
- package/dist/src/artifacts/query-engine.js +410 -88
- package/dist/src/artifacts/relations-builder.js +168 -0
- package/dist/src/artifacts/relations.js +148 -0
- package/dist/src/artifacts/repair.js +9 -4
- package/dist/src/artifacts/stats.js +5 -2
- package/dist/src/artifacts/types.js +30 -10
- package/dist/src/artifacts/watcher.js +1 -1
- package/dist/src/auth/credential-store.js +2 -1
- package/dist/src/catalog/cli.d.mts +5 -0
- package/dist/src/channel/manager.d.mts +20 -0
- package/dist/src/channel/manager.mjs +78 -12
- package/dist/src/cli/child-process-result.js +40 -0
- package/dist/src/cli/command-log.js +2 -3
- package/dist/src/cli/env.js +38 -16
- package/dist/src/cli/flag-parsing.js +236 -0
- package/dist/src/cli/handlers/artifacts.js +3 -0
- package/dist/src/cli/handlers/auth.js +3 -0
- package/dist/src/cli/handlers/decision.js +218 -5
- package/dist/src/cli/handlers/diagnose.js +13 -5
- package/dist/src/cli/handlers/effect.js +4 -2
- package/dist/src/cli/handlers/evidence.js +3 -0
- package/dist/src/cli/handlers/feedback.js +14 -5
- package/dist/src/cli/handlers/help.js +1 -0
- package/dist/src/cli/handlers/index.js +3 -1
- package/dist/src/cli/handlers/init.js +248 -30
- package/dist/src/cli/handlers/lint.js +5 -0
- package/dist/src/cli/handlers/mc.js +23 -0
- package/dist/src/cli/handlers/models.js +169 -10
- package/dist/src/cli/handlers/ralph-launcher.js +2 -0
- package/dist/src/cli/handlers/ralph.js +3 -0
- package/dist/src/cli/handlers/refresh.js +28 -0
- package/dist/src/cli/handlers/regenerate.js +14 -0
- package/dist/src/cli/handlers/resource-versions.js +3 -0
- package/dist/src/cli/handlers/rules.js +195 -0
- package/dist/src/cli/handlers/run.js +4 -0
- package/dist/src/cli/handlers/runtime-info.js +25 -11
- package/dist/src/cli/handlers/script-runner.js +19 -8
- package/dist/src/cli/handlers/session.js +406 -62
- package/dist/src/cli/handlers/sessions.js +243 -76
- package/dist/src/cli/handlers/setup-manifest.js +474 -79
- package/dist/src/cli/handlers/setup.js +180 -39
- package/dist/src/cli/handlers/steward.js +11 -0
- package/dist/src/cli/handlers/subcommands.js +60 -3
- package/dist/src/cli/handlers/team.js +18 -8
- package/dist/src/cli/handlers/uhp.js +3 -0
- package/dist/src/cli/handlers/use.js +307 -55
- package/dist/src/cli/handlers/utilities.js +125 -26
- package/dist/src/cli/handlers/version.js +8 -0
- package/dist/src/cli/prompt-utils.js +72 -0
- package/dist/src/cli/provider-resolution.js +11 -0
- package/dist/src/cli/router.js +15 -1
- package/dist/src/cli/services/deployment-verification.js +19 -9
- package/dist/src/cli/services/provider-prepare-coordinator.js +24 -0
- package/dist/src/cli/skill-usage.js +2 -3
- package/dist/src/config/aiwg-config.js +349 -35
- package/dist/src/config/cli.js +256 -23
- package/dist/src/config/decision-config.js +106 -0
- package/dist/src/config/dispatch-thresholds-runtime.d.mts +8 -0
- package/dist/src/config/dispatch-thresholds-runtime.mjs +38 -0
- package/dist/src/config/gitignore.js +50 -0
- package/dist/src/config/index-graph-overrides.js +36 -0
- package/dist/src/config/project-artifacts-health.d.mts +37 -0
- package/dist/src/config/project-artifacts-health.mjs +14 -3
- package/dist/src/config/project-artifacts-runtime.d.mts +16 -0
- package/dist/src/config/user-config-dir.d.mts +9 -0
- package/dist/src/config/user-config.js +38 -11
- package/dist/src/config/user-registry.js +23 -15
- package/dist/src/config/user-state.js +7 -0
- package/dist/src/decision/adapters/jev.js +75 -27
- package/dist/src/decision/ask.js +203 -43
- package/dist/src/decision/context-live-qualification.js +2 -2
- package/dist/src/decision/driver.js +14 -7
- package/dist/src/decision/ensemble/aggregate.js +23 -10
- package/dist/src/decision/ensemble-study/multifact-study.js +6 -2
- package/dist/src/decision/entry.js +25 -6
- package/dist/src/decision/graph-live-qualification.js +1 -1
- package/dist/src/decision/graph-run.js +9 -0
- package/dist/src/decision/heldout/collector.js +15 -14
- package/dist/src/decision/heldout/contract.js +30 -7
- package/dist/src/decision/index.js +1 -0
- package/dist/src/decision/interop.js +60 -8
- package/dist/src/decision/jev-credentials.js +15 -1
- package/dist/src/decision/ledger.js +942 -0
- package/dist/src/decision/offload-activation.js +137 -0
- package/dist/src/decision/offload.js +550 -0
- package/dist/src/decision/qualification/load.js +4 -6
- package/dist/src/decision/savings.js +28 -0
- package/dist/src/decision/validate.js +6 -3
- package/dist/src/effects/dispatch-verifier.js +252 -0
- package/dist/src/effects/index.js +1 -0
- package/dist/src/effects/types.js +5 -1
- package/dist/src/effects/verifiers/git.js +2 -1
- package/dist/src/effects/verifiers/tracker.js +26 -14
- package/dist/src/extensions/commands/definitions.js +19 -0
- package/dist/src/extensions/project-local-remove.js +36 -1
- package/dist/src/features/installer.js +2 -2
- package/dist/src/flow/graph-metadata.js +5 -0
- package/dist/src/gates/providers/loader.js +64 -18
- package/dist/src/installation/manager-command.d.mts +18 -0
- package/dist/src/installation/manager-command.mjs +15 -3
- package/dist/src/installation/manager.d.mts +49 -0
- package/dist/src/installation/manager.mjs +95 -5
- package/dist/src/issues/cli.js +4 -4
- package/dist/src/issues/local.js +24 -5
- package/dist/src/jobs/runner.js +1 -1
- package/dist/src/lint/cli.js +27 -1
- package/dist/src/lint/loader.js +2 -1
- package/dist/src/lint/reporters.js +25 -1
- package/dist/src/lint/rule-activation.js +43 -0
- package/dist/src/lint/runner.js +137 -62
- package/dist/src/mcp/adapters/codex-runtime.js +366 -56
- package/dist/src/mcp/claude-install.d.mts +4 -0
- package/dist/src/mcp/claude-install.mjs +41 -0
- package/dist/src/mcp/cli.d.mts +1 -0
- package/dist/src/mcp/cli.mjs +620 -85
- package/dist/src/mcp/config-file.d.mts +28 -0
- package/dist/src/mcp/config-file.mjs +279 -0
- package/dist/src/mcp/config-layers.d.mts +36 -0
- package/dist/src/mcp/config-layers.mjs +348 -0
- package/dist/src/mcp/credentials.d.mts +51 -0
- package/dist/src/mcp/credentials.mjs +484 -0
- package/dist/src/mcp/grok-build-config.d.mts +6 -0
- package/dist/src/mcp/grok-build-config.mjs +17 -27
- package/dist/src/mcp/helpers.mjs +109 -4
- package/dist/src/mcp/muse-native-config.d.mts +13 -0
- package/dist/src/mcp/muse-native-config.mjs +1 -0
- package/dist/src/mcp/omp-config.d.mts +4 -0
- package/dist/src/mcp/omp-config.mjs +50 -29
- package/dist/src/mcp/profiles.js +97 -23
- package/dist/src/mcp/profiles.mjs +99 -27
- package/dist/src/mcp/registry.js +248 -131
- package/dist/src/mcp/registry.mjs +169 -100
- package/dist/src/mcp/server-config.d.mts +3 -0
- package/dist/src/mcp/server-config.mjs +89 -0
- package/dist/src/mcp/server.mjs +127 -82
- package/dist/src/mcp/test-simple.mjs +2 -1
- package/dist/src/mcp/toml-editor.d.mts +4 -0
- package/dist/src/mcp/toml-string.d.mts +1 -0
- package/dist/src/mcp/toml-string.mjs +9 -0
- package/dist/src/mcp/toml-strip-mcp.d.mts +1 -0
- package/dist/src/mcp/toml-strip-mcp.mjs +135 -0
- package/dist/src/mcp/tool-filters.d.mts +46 -0
- package/dist/src/mcp/tool-filters.mjs +357 -0
- package/dist/src/mcp/tools/agentic-sandbox.mjs +3 -1
- package/dist/src/mcp/tools/decision.mjs +22 -3
- package/dist/src/mcp/tools/discovery.mjs +62 -55
- package/dist/src/mcp/tools/orchestration.mjs +50 -2
- package/dist/src/mcp/tools/subsystems.mjs +39 -8
- package/dist/src/mcp/tools/worker-invoke.mjs +2856 -0
- package/dist/src/mcp/tools/worker-shell-control.mjs +289 -0
- package/dist/src/mcp/tools/worker-stdin-runtime.mjs +79 -0
- package/dist/src/memory/project-registry.js +2 -2
- package/dist/src/mission-protocol/codecs.js +647 -1
- package/dist/src/mission-protocol/types.js +110 -0
- package/dist/src/mission-protocol/worker-status.js +2 -0
- package/dist/src/models/config-loader.js +76 -14
- package/dist/src/models/grok-build-models.js +93 -41
- package/dist/src/models/model-capabilities.v1.json +3183 -24
- package/dist/src/models/model-discovery.js +931 -67
- package/dist/src/models/provider-policy.js +719 -11
- package/dist/src/models/qualification-digest.d.mts +2 -0
- package/dist/src/models/qualification-digest.mjs +17 -0
- package/dist/src/models/resolver.js +261 -0
- package/dist/src/models/worker-direct-readiness.js +550 -0
- package/dist/src/models/worker-dispatch-offer.js +169 -0
- package/dist/src/models/worker-health-readiness.js +144 -0
- package/dist/src/models/worker-installation.d.mts +39 -0
- package/dist/src/models/worker-installation.mjs +986 -0
- package/dist/src/models/wrapper-route.js +18 -0
- package/dist/src/ops/registry.js +9 -14
- package/dist/src/plugins/standalone-packager.js +4 -3
- package/dist/src/process/bounded-child-process.d.mts +84 -0
- package/dist/src/process/bounded-child-process.mjs +430 -0
- package/dist/src/process/cli-command.d.mts +16 -0
- package/dist/src/process/cli-command.mjs +75 -0
- package/dist/src/process/signal-child.d.mts +6 -0
- package/dist/src/process/signal-child.mjs +7 -0
- package/dist/src/providers/capability-matrix.js +8 -0
- package/dist/src/providers/capability-matrix.yaml +270 -0
- package/dist/src/providers/deployed-skill-roots.js +20 -0
- package/dist/src/providers/grok-build-acp.js +3 -2
- package/dist/src/providers/grok-build-headless.js +53 -23
- package/dist/src/providers/grok-build-inspect.js +1 -0
- package/dist/src/providers/omp-agent.d.mts +8 -0
- package/dist/src/providers/omp-diagnostics.d.mts +1 -0
- package/dist/src/providers/omp-paths.d.mts +13 -0
- package/dist/src/providers/provider-definitions.js +9 -1
- package/dist/src/providers/provider-definitions.mjs +9 -2
- package/dist/src/providers/skill-ownership.d.mts +9 -0
- package/dist/src/providers/skill-ownership.mjs +88 -0
- package/dist/src/rules/activation.d.mts +21 -0
- package/dist/src/rules/activation.mjs +62 -0
- package/dist/src/rules/inline-budget.d.mts +26 -0
- package/dist/src/rules/inline-budget.mjs +66 -0
- package/dist/src/rules/inventory.js +129 -0
- package/dist/src/rules/pin-state.js +73 -0
- package/dist/src/rules/pins.d.mts +14 -0
- package/dist/src/rules/pins.mjs +112 -0
- package/dist/src/rules/rule-frontmatter.schema.json +197 -0
- package/dist/src/serve/executor-registry.js +16 -24
- package/dist/src/serve/fleet-mission-conductor.js +9 -0
- package/dist/src/serve/mission-conductor.js +47 -12
- package/dist/src/serve/shared-host-scheduler.js +2 -0
- package/dist/src/serve/worker-invocation.js +558 -0
- package/dist/src/serve/worker-stdin-frame.d.mts +10 -0
- package/dist/src/serve/worker-stdin-frame.mjs +107 -0
- package/dist/src/sessions/adapter-registry.js +49 -0
- package/dist/src/sessions/adapters/claude.js +39 -54
- package/dist/src/sessions/adapters/codex.js +82 -67
- package/dist/src/sessions/adapters/copilot.js +4 -4
- package/dist/src/sessions/adapters/cursor.js +40 -57
- package/dist/src/sessions/adapters/deepseek-harness.js +15 -12
- package/dist/src/sessions/adapters/factory.js +31 -27
- package/dist/src/sessions/adapters/generic.js +43 -9
- package/dist/src/sessions/adapters/grok-build.js +11 -11
- package/dist/src/sessions/adapters/grokbot-locator.js +111 -0
- package/dist/src/sessions/adapters/grokbot.js +434 -24
- package/dist/src/sessions/adapters/hermes.js +27 -29
- package/dist/src/sessions/adapters/muse-workspace-scan.js +128 -0
- package/dist/src/sessions/adapters/muse.js +200 -104
- package/dist/src/sessions/adapters/omp.js +28 -14
- package/dist/src/sessions/adapters/openclaw.js +89 -79
- package/dist/src/sessions/adapters/opencode.js +27 -24
- package/dist/src/sessions/adapters/openhuman.js +18 -60
- package/dist/src/sessions/adapters/pi.js +30 -14
- package/dist/src/sessions/adapters/warp.js +3 -3
- package/dist/src/sessions/adapters/windsurf.js +19 -48
- package/dist/src/sessions/batch-contracts.js +25 -5
- package/dist/src/sessions/batch-import.js +72 -51
- package/dist/src/sessions/candidates.js +47 -11
- package/dist/src/sessions/contracts.js +75 -2
- package/dist/src/sessions/coverage-preflight.js +134 -0
- package/dist/src/sessions/discovery.js +3 -0
- package/dist/src/sessions/export-plan.js +4 -3
- package/dist/src/sessions/grok-build-cli.js +67 -5
- package/dist/src/sessions/import-exclusions.js +72 -0
- package/dist/src/sessions/import-lease.js +34 -18
- package/dist/src/sessions/import-limits.js +37 -0
- package/dist/src/sessions/importer.js +84 -46
- package/dist/src/sessions/index.js +2 -0
- package/dist/src/sessions/lifecycle.js +45 -0
- package/dist/src/sessions/policy.js +133 -25
- package/dist/src/sessions/readers.js +106 -53
- package/dist/src/sessions/refresh.js +106 -0
- package/dist/src/sessions/repository.js +199 -63
- package/dist/src/sessions/workspace-discovery.js +315 -88
- package/dist/src/sessions/workspace-matching.js +107 -0
- package/dist/src/skills/adapters/clawhub.js +10 -8
- package/dist/src/skills/adapters/openclaw.js +10 -7
- package/dist/src/skills/importer.js +1 -0
- package/dist/src/smiths/context-pipeline/aiwg-md.js +11 -0
- package/dist/src/smiths/context-pipeline/claude-hook.js +3 -26
- package/dist/src/smiths/context-pipeline/finalization.js +6 -5
- package/dist/src/smiths/context-pipeline/generator.js +21 -4
- package/dist/src/smiths/context-pipeline/parallelism-section.js +195 -14
- package/dist/src/smiths/context-pipeline/workspace-context.js +116 -9
- package/dist/src/smiths/hook-bridge/codex-translator.js +6 -5
- package/dist/src/smiths/mcpsmith/example.js +1 -1
- package/dist/src/smiths/mcpsmith/generator.js +1 -1
- package/dist/src/smiths/toolsmith/runtime-discovery.d.mts +10 -0
- package/dist/src/smiths/toolsmith/runtime-discovery.mjs +85 -31
- package/dist/src/storage/backends/fs.js +18 -76
- package/dist/src/storage/backends/logseq.js +68 -7
- package/dist/src/storage/backends/obsidian.js +1 -0
- package/dist/src/storage/fortemi-qualification-receipt.js +2 -2
- package/dist/src/testing/generators/test-code-generator.js +57 -30
- package/dist/src/tracker/forge-http.js +2 -1
- package/dist/src/uhp/client.js +11 -1
- package/dist/src/uhp/mission.js +5 -0
- package/dist/src/update/checker.d.mts +2 -0
- package/dist/src/update/checker.mjs +5 -5
- package/dist/src/update/notifier.mjs +54 -2
- package/dist/src/update/service.d.mts +22 -0
- package/dist/src/utils/contained-filesystem.d.mts +37 -0
- package/dist/src/utils/contained-filesystem.mjs +683 -0
- package/dist/src/utils/temporary-directory.js +36 -0
- package/dist/src/writing/example-generator.js +1 -1
- package/dist/src/writing/fidelity.js +18 -1
- package/package.json +32 -2
- package/schemas/mission-v1.schema.json +2429 -0
- package/schemas/models/model-catalog.v1.schema.json +301 -0
- package/schemas/models/model-config-compatibility.v1.schema.json +281 -0
- package/schemas/models/model-policy.v1.schema.json +14 -0
- package/schemas/models/provider-model-capabilities.v1.schema.json +1072 -0
- package/tools/_resolve-impl.mjs +39 -2
- package/tools/agents/deploy-agents.mjs +64 -23
- package/tools/agents/providers/base.mjs +153 -166
- package/tools/agents/providers/claude.mjs +8 -24
- package/tools/agents/providers/codex.mjs +18 -11
- package/tools/agents/providers/cursor.mjs +19 -18
- package/tools/agents/providers/grok-build.mjs +3 -1
- package/tools/agents/providers/grokbot.mjs +11 -12
- package/tools/agents/providers/hermes.mjs +62 -49
- package/tools/agents/providers/omp.mjs +5 -2
- package/tools/agents/providers/openclaw-translator.mjs +19 -5
- package/tools/agents/providers/openclaw.mjs +9 -4
- package/tools/agents/providers/pi.mjs +5 -0
- package/tools/agents/providers/provider-prepare-channel.mjs +5 -0
- package/tools/agents/providers/provider-prepare-coordinator.mjs +247 -0
- package/tools/agents/providers/provider-prepare-worker.mjs +84 -0
- package/tools/agents/providers/rule-delivery.mjs +1270 -0
- package/tools/agents/providers/warp.mjs +20 -26
- package/tools/cli/decision-offload-report.mjs +40 -0
- package/tools/cli/workspace-status.mjs +862 -0
- package/tools/plugin/package-plugins.mjs +186 -8
- package/tools/plugin/plugin-links.mjs +114 -0
- package/tools/providers/antigravity-transport.mjs +3 -1
- package/tools/providers/deepseek-harness-transport.mjs +360 -0
- package/tools/providers/omp-transport.mjs +194 -0
- package/tools/ralph-external/lib/claude-adapter.mjs +389 -0
- package/tools/ralph-external/lib/codex-adapter.mjs +432 -0
- package/tools/ralph-external/lib/consecutive-failure-circuit-breaker.mjs +1748 -0
- package/tools/ralph-external/lib/deepseek-harness-adapter.mjs +397 -0
- package/tools/ralph-external/lib/factory-adapter.mjs +503 -0
- package/tools/ralph-external/lib/launcher-recovery-evidence.mjs +55 -0
- package/tools/ralph-external/lib/muse-adapter.mjs +364 -0
- package/tools/ralph-external/lib/omp-adapter.mjs +315 -0
- package/tools/ralph-external/lib/opencode-adapter.mjs +575 -0
- package/tools/ralph-external/lib/openhuman-adapter.mjs +75 -0
- package/tools/ralph-external/lib/pi-adapter.mjs +329 -0
- package/tools/ralph-external/lib/provider-adapter.mjs +748 -0
- package/tools/ralph-external/lib/recovery-probe.mjs +72 -0
- package/tools/ralph-external/lib/session-environment.mjs +28 -0
- package/tools/ralph-external/lib/systemd-client.mjs +49 -0
- package/tools/ralph-external/lib/worker-health.mjs +439 -0
- package/tools/ralph-external/lib/worker-isolation.mjs +717 -0
- package/tools/ralph-external/lib/worker-overflow.mjs +50 -0
- package/tools/ralph-external/process-monitor.mjs +1017 -0
- package/tools/ralph-external/session-launcher.mjs +5057 -0
- package/tools/scripts/resource-preflight.mjs +541 -0
- package/tools/skills/deploy-skills-codex.mjs +2 -1
- package/vscode-extension/schemas/aiwg.config.v1.json +2916 -0
|
@@ -10,7 +10,9 @@
|
|
|
10
10
|
* @implements #889
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import {
|
|
13
|
+
import { resolveCredentialPolicy } from './credentials.mjs';
|
|
14
|
+
import { isLowerLayerEntry, loadLayered, resolveProfileExtends, resolveConfigLayers, saveLayerData } from './config-layers.mjs';
|
|
15
|
+
import { readFile, writeFile } from 'fs/promises';
|
|
14
16
|
import { resolve } from 'path';
|
|
15
17
|
import { homedir } from 'os';
|
|
16
18
|
import { existsSync } from 'fs';
|
|
@@ -95,8 +97,12 @@ export class McpProfileRegistry {
|
|
|
95
97
|
#configDir;
|
|
96
98
|
#cache = null;
|
|
97
99
|
|
|
100
|
+
#layers;
|
|
101
|
+
#layering = null;
|
|
102
|
+
|
|
98
103
|
constructor(configDirOverride) {
|
|
99
|
-
this.#
|
|
104
|
+
this.#layers = resolveConfigLayers(configDirOverride);
|
|
105
|
+
this.#configDir = this.#layers ? this.#layers[this.#layers.length - 1] : resolveConfigDir(configDirOverride);
|
|
100
106
|
}
|
|
101
107
|
|
|
102
108
|
getPath() {
|
|
@@ -106,6 +112,13 @@ export class McpProfileRegistry {
|
|
|
106
112
|
async load() {
|
|
107
113
|
if (this.#cache) return this.#cache;
|
|
108
114
|
|
|
115
|
+
if (this.#layers) {
|
|
116
|
+
const layered = await loadLayered(this.#layers, PROFILES_FILENAME, 'profiles', DEFAULT_DATA);
|
|
117
|
+
this.#cache = layered.data;
|
|
118
|
+
this.#layering = layered.layering;
|
|
119
|
+
return this.#cache;
|
|
120
|
+
}
|
|
121
|
+
|
|
109
122
|
const filePath = this.getPath();
|
|
110
123
|
try {
|
|
111
124
|
const content = await readFile(filePath, 'utf-8');
|
|
@@ -119,17 +132,24 @@ export class McpProfileRegistry {
|
|
|
119
132
|
this.#cache = { ...DEFAULT_DATA, profiles: {} };
|
|
120
133
|
}
|
|
121
134
|
|
|
135
|
+
try {
|
|
136
|
+
resolveCredentialPolicy({ registryPolicy: this.#cache.credentialPolicy, env: {} });
|
|
137
|
+
} catch (error) {
|
|
138
|
+
this.#cache = null;
|
|
139
|
+
throw new Error(`Invalid MCP credential policy in ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
140
|
+
}
|
|
141
|
+
|
|
122
142
|
return this.#cache;
|
|
123
143
|
}
|
|
124
144
|
|
|
125
|
-
async save() {
|
|
126
|
-
if (!
|
|
127
|
-
await
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
145
|
+
async save(data = this.#cache) {
|
|
146
|
+
if (!data) return;
|
|
147
|
+
await saveLayerData(this.getPath(), data, 'profiles', this.#layers, this.#layering);
|
|
148
|
+
this.#cache = data;
|
|
149
|
+
if (this.#layers) {
|
|
150
|
+
this.clearCache();
|
|
151
|
+
await this.load();
|
|
152
|
+
}
|
|
133
153
|
}
|
|
134
154
|
|
|
135
155
|
/**
|
|
@@ -171,7 +191,7 @@ export class McpProfileRegistry {
|
|
|
171
191
|
/** Add a new profile */
|
|
172
192
|
async add(profile, serverRegistry) {
|
|
173
193
|
this.#validateName(profile.name);
|
|
174
|
-
const data = await this.load();
|
|
194
|
+
const data = structuredClone(await this.load());
|
|
175
195
|
|
|
176
196
|
if (data.profiles[profile.name]) {
|
|
177
197
|
throw new Error(
|
|
@@ -180,17 +200,19 @@ export class McpProfileRegistry {
|
|
|
180
200
|
}
|
|
181
201
|
|
|
182
202
|
await this.#validateServers(profile.servers ?? [], serverRegistry);
|
|
203
|
+
if (profile.extends?.length) resolveProfileExtends(profile.name, { ...data.profiles, [profile.name]: profile });
|
|
183
204
|
|
|
184
205
|
data.profiles[profile.name] = {
|
|
185
206
|
name: profile.name,
|
|
186
207
|
description: profile.description,
|
|
208
|
+
...(profile.extends ? { extends: profile.extends } : {}),
|
|
187
209
|
servers: profile.servers ?? [],
|
|
188
210
|
providerOverrides: profile.providerOverrides ?? {},
|
|
189
211
|
createdAt: new Date().toISOString(),
|
|
190
212
|
updatedAt: new Date().toISOString(),
|
|
191
213
|
};
|
|
192
214
|
|
|
193
|
-
await this.save();
|
|
215
|
+
await this.save(data);
|
|
194
216
|
}
|
|
195
217
|
|
|
196
218
|
/** Get a profile by name */
|
|
@@ -199,6 +221,16 @@ export class McpProfileRegistry {
|
|
|
199
221
|
return data.profiles[name];
|
|
200
222
|
}
|
|
201
223
|
|
|
224
|
+
/**
|
|
225
|
+
* Return a profile with its `extends` chain applied across all configuration
|
|
226
|
+
* layers. Use get() for the profile exactly as stored.
|
|
227
|
+
*/
|
|
228
|
+
async resolve(name) {
|
|
229
|
+
const data = await this.load();
|
|
230
|
+
if (!data.profiles[name]) return undefined;
|
|
231
|
+
return resolveProfileExtends(name, data.profiles);
|
|
232
|
+
}
|
|
233
|
+
|
|
202
234
|
/** List all profiles */
|
|
203
235
|
async list() {
|
|
204
236
|
const data = await this.load();
|
|
@@ -207,7 +239,7 @@ export class McpProfileRegistry {
|
|
|
207
239
|
|
|
208
240
|
/** Edit an existing profile (add/remove servers, update description) */
|
|
209
241
|
async edit(name, changes, serverRegistry) {
|
|
210
|
-
const data = await this.load();
|
|
242
|
+
const data = structuredClone(await this.load());
|
|
211
243
|
const existing = data.profiles[name];
|
|
212
244
|
if (!existing) {
|
|
213
245
|
throw new Error(`Profile "${name}" not found.`);
|
|
@@ -232,20 +264,47 @@ export class McpProfileRegistry {
|
|
|
232
264
|
);
|
|
233
265
|
}
|
|
234
266
|
|
|
267
|
+
if (changes.clearToolFilters) {
|
|
268
|
+
const overrides = { ...(current.providerOverrides ?? {}) };
|
|
269
|
+
delete overrides[changes.clearToolFilters];
|
|
270
|
+
current.providerOverrides = overrides;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
for (const [provider, override] of Object.entries(changes.providerOverrides ?? {})) {
|
|
274
|
+
const overrides = { ...(current.providerOverrides ?? {}) };
|
|
275
|
+
const previous = overrides[provider] ?? {};
|
|
276
|
+
const merge = (before, added) => (added ? [...new Set([...(before ?? []), ...added])] : before);
|
|
277
|
+
overrides[provider] = {
|
|
278
|
+
...previous,
|
|
279
|
+
...(override.toolDeny ? { toolDeny: merge(previous.toolDeny, override.toolDeny) } : {}),
|
|
280
|
+
...(override.toolAllow ? { toolAllow: merge(previous.toolAllow, override.toolAllow) } : {}),
|
|
281
|
+
};
|
|
282
|
+
current.providerOverrides = overrides;
|
|
283
|
+
}
|
|
284
|
+
|
|
235
285
|
current.updatedAt = new Date().toISOString();
|
|
236
286
|
data.profiles[name] = current;
|
|
237
|
-
await this.save();
|
|
287
|
+
await this.save(data);
|
|
238
288
|
return data.profiles[name];
|
|
239
289
|
}
|
|
240
290
|
|
|
241
291
|
/** Remove a profile */
|
|
242
292
|
async remove(name) {
|
|
243
|
-
const data = await this.load();
|
|
293
|
+
const data = structuredClone(await this.load());
|
|
244
294
|
if (!data.profiles[name]) {
|
|
245
295
|
throw new Error(`Profile "${name}" not found.`);
|
|
246
296
|
}
|
|
297
|
+
if (this.#layering && isLowerLayerEntry(this.#layering, name)) {
|
|
298
|
+
throw new Error(`Profile "${name}" is defined in a lower configuration layer; remove it there.`);
|
|
299
|
+
}
|
|
300
|
+
const dependents = Object.entries(data.profiles)
|
|
301
|
+
.filter(([other, profile]) => other !== name && profile.extends?.includes(name))
|
|
302
|
+
.map(([other]) => other);
|
|
303
|
+
if (dependents.length) {
|
|
304
|
+
throw new Error(`Cannot remove profile "${name}": extended by ${dependents.join(', ')}.`);
|
|
305
|
+
}
|
|
247
306
|
delete data.profiles[name];
|
|
248
|
-
await this.save();
|
|
307
|
+
await this.save(data);
|
|
249
308
|
}
|
|
250
309
|
|
|
251
310
|
/**
|
|
@@ -253,7 +312,7 @@ export class McpProfileRegistry {
|
|
|
253
312
|
* If the profile contains '__all__', expand to all servers in serverRegistry.
|
|
254
313
|
*/
|
|
255
314
|
async resolveServers(name, serverRegistry) {
|
|
256
|
-
const profile = await this.
|
|
315
|
+
const profile = await this.resolve(name);
|
|
257
316
|
if (!profile) {
|
|
258
317
|
throw new Error(`Profile "${name}" not found.`);
|
|
259
318
|
}
|
|
@@ -276,10 +335,11 @@ export class McpProfileRegistry {
|
|
|
276
335
|
async importFrom(filePath) {
|
|
277
336
|
const content = await readFile(filePath, 'utf-8');
|
|
278
337
|
const imported = JSON.parse(content);
|
|
279
|
-
const data = await this.load();
|
|
338
|
+
const data = structuredClone(await this.load());
|
|
280
339
|
|
|
281
340
|
let added = 0;
|
|
282
341
|
let updated = 0;
|
|
342
|
+
const invalidNames = [];
|
|
283
343
|
|
|
284
344
|
const profiles = imported.profiles ?? (
|
|
285
345
|
typeof imported === 'object' && !Array.isArray(imported)
|
|
@@ -287,24 +347,30 @@ export class McpProfileRegistry {
|
|
|
287
347
|
: {}
|
|
288
348
|
);
|
|
289
349
|
|
|
350
|
+
const candidate = { ...data.profiles };
|
|
351
|
+
|
|
290
352
|
for (const [name, profile] of Object.entries(profiles)) {
|
|
291
353
|
try {
|
|
292
354
|
this.#validateName(name);
|
|
293
|
-
} catch {
|
|
294
|
-
|
|
355
|
+
} catch (error) {
|
|
356
|
+
// Collected and refused below with the complete graph-validation pass,
|
|
357
|
+
// instead of silently dropping named profiles from the import.
|
|
358
|
+
invalidNames.push(`${name}: ${error instanceof Error ? error.message : String(error)}`);
|
|
359
|
+
continue;
|
|
295
360
|
}
|
|
296
|
-
if (
|
|
297
|
-
|
|
298
|
-
...
|
|
361
|
+
if (candidate[name]) {
|
|
362
|
+
candidate[name] = {
|
|
363
|
+
...candidate[name],
|
|
299
364
|
...profile,
|
|
300
365
|
name,
|
|
301
366
|
updatedAt: new Date().toISOString(),
|
|
302
367
|
};
|
|
303
368
|
updated++;
|
|
304
369
|
} else {
|
|
305
|
-
|
|
370
|
+
candidate[name] = {
|
|
306
371
|
name,
|
|
307
372
|
description: profile.description,
|
|
373
|
+
...(profile.extends ? { extends: profile.extends } : {}),
|
|
308
374
|
servers: profile.servers ?? [],
|
|
309
375
|
providerOverrides: profile.providerOverrides ?? {},
|
|
310
376
|
createdAt: new Date().toISOString(),
|
|
@@ -314,7 +380,13 @@ export class McpProfileRegistry {
|
|
|
314
380
|
}
|
|
315
381
|
}
|
|
316
382
|
|
|
317
|
-
|
|
383
|
+
if (invalidNames.length) {
|
|
384
|
+
throw new Error(`Refusing to import profile(s) with invalid names: ${invalidNames.join('; ')}`);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
for (const name of Object.keys(candidate)) resolveProfileExtends(name, candidate);
|
|
388
|
+
data.profiles = candidate;
|
|
389
|
+
await this.save(data);
|
|
318
390
|
return { added, updated };
|
|
319
391
|
}
|
|
320
392
|
|
|
@@ -335,7 +407,7 @@ export class McpProfileRegistry {
|
|
|
335
407
|
|
|
336
408
|
/** Install preset profiles (does not overwrite existing) */
|
|
337
409
|
async initPresets() {
|
|
338
|
-
const data = await this.load();
|
|
410
|
+
const data = structuredClone(await this.load());
|
|
339
411
|
let added = 0;
|
|
340
412
|
|
|
341
413
|
for (const [name, preset] of Object.entries(PRESET_PROFILES)) {
|
|
@@ -350,7 +422,7 @@ export class McpProfileRegistry {
|
|
|
350
422
|
}
|
|
351
423
|
}
|
|
352
424
|
|
|
353
|
-
await this.save();
|
|
425
|
+
await this.save(data);
|
|
354
426
|
return { added, total: Object.keys(PRESET_PROFILES).length };
|
|
355
427
|
}
|
|
356
428
|
|