@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.17
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 +21 -1
- package/bin/aiwg.mjs +349 -0
- package/dist/src/a2a/agent-card.js +145 -0
- package/dist/src/a2a/client.js +411 -0
- package/dist/src/a2a/hitl-cli.js +171 -0
- package/dist/src/a2a/hitl-driver.js +370 -0
- package/dist/src/a2a/hitl.js +181 -0
- package/dist/src/a2a/http.js +193 -0
- package/dist/src/a2a/jcs.js +128 -0
- package/dist/src/a2a/jws.js +187 -0
- package/dist/src/a2a/types.js +24 -0
- package/dist/src/a2a/webhook.js +240 -0
- package/dist/src/activity-log/cli.js +348 -0
- package/dist/src/activity-log/parser.js +81 -0
- package/dist/src/activity-log/types.js +50 -0
- package/dist/src/agents/agent-deployer.js +367 -0
- package/dist/src/agents/agent-packager.js +271 -0
- package/dist/src/agents/agent-validator.js +271 -0
- package/dist/src/agents/grounding/knowledge-base.js +161 -0
- package/dist/src/agents/grounding/types.js +12 -0
- package/dist/src/agents/index.js +10 -0
- package/dist/src/agents/packaged-agent-inventory.js +75 -0
- package/dist/src/agents/types.js +7 -0
- package/dist/src/api/index.d.ts +10 -0
- package/dist/src/api/index.js +10 -0
- package/dist/src/artifacts/address-parser.js +73 -0
- package/dist/src/artifacts/audit/cli.js +183 -0
- package/dist/src/artifacts/audit/drift.js +122 -0
- package/dist/src/artifacts/audit/types.js +12 -0
- package/dist/src/artifacts/backends/graphology-backend.js +160 -0
- package/dist/src/artifacts/backends/json-backend.js +129 -0
- package/dist/src/artifacts/backends/sqlite-backend.js +199 -0
- package/dist/src/artifacts/browser-export.js +622 -0
- package/dist/src/artifacts/capability-resolver.js +94 -0
- package/dist/src/artifacts/checksum-manifest.js +91 -0
- package/dist/src/artifacts/citation-parser.js +162 -0
- package/dist/src/artifacts/cli.js +1462 -0
- package/dist/src/artifacts/corpus-tools/citation-densify.js +311 -0
- package/dist/src/artifacts/corpus-tools/cli.js +393 -0
- package/dist/src/artifacts/corpus-tools/corpus-graph.js +225 -0
- package/dist/src/artifacts/corpus-tools/curator.js +186 -0
- package/dist/src/artifacts/corpus-tools/discovery-log.js +70 -0
- package/dist/src/artifacts/corpus-tools/funder-network.js +141 -0
- package/dist/src/artifacts/corpus-tools/induction-audit.js +233 -0
- package/dist/src/artifacts/corpus-tools/integrity-scan.js +202 -0
- package/dist/src/artifacts/corpus-tools/profile-communities.js +166 -0
- package/dist/src/artifacts/corpus-tools/profile-edges.js +72 -0
- package/dist/src/artifacts/corpus-tools/profile-embed.js +113 -0
- package/dist/src/artifacts/corpus-tools/profile-generate-fm.js +167 -0
- package/dist/src/artifacts/corpus-tools/profile-generate.js +181 -0
- package/dist/src/artifacts/corpus-tools/profile-metrics.js +98 -0
- package/dist/src/artifacts/corpus-tools/profile-status.js +86 -0
- package/dist/src/artifacts/corpus-tools/profile-temporal.js +139 -0
- package/dist/src/artifacts/corpus-tools/radar-init.js +93 -0
- package/dist/src/artifacts/corpus-tools/radar-report.js +118 -0
- package/dist/src/artifacts/corpus-tools/radar-shared.js +189 -0
- package/dist/src/artifacts/corpus-tools/radar-status.js +68 -0
- package/dist/src/artifacts/corpus-tools/sidecar-lint.js +233 -0
- package/dist/src/artifacts/corpus-tools/sidecar-repair.js +277 -0
- package/dist/src/artifacts/corpus-tools/snapshot.js +591 -0
- package/dist/src/artifacts/corpus-tools/source-types.js +164 -0
- package/dist/src/artifacts/corpus-tools/vision-extract.js +243 -0
- package/dist/src/artifacts/corpus-views/build.js +126 -0
- package/dist/src/artifacts/corpus-views/corpus-config.js +124 -0
- package/dist/src/artifacts/corpus-views/ref-parser.js +437 -0
- package/dist/src/artifacts/corpus-views/renderers.js +353 -0
- package/dist/src/artifacts/corpus-views/taxonomies.js +131 -0
- package/dist/src/artifacts/dep-graph.js +173 -0
- package/dist/src/artifacts/discover-facets.js +375 -0
- package/dist/src/artifacts/embedding-index.js +354 -0
- package/dist/src/artifacts/enrichment/cli.js +240 -0
- package/dist/src/artifacts/enrichment/prompt.js +47 -0
- package/dist/src/artifacts/enrichment/store.js +90 -0
- package/dist/src/artifacts/enrichment/types.js +12 -0
- package/dist/src/artifacts/fortemi-core-query-adapter.js +475 -0
- package/dist/src/artifacts/fortemi-core-sync.js +251 -0
- package/dist/src/artifacts/fortemi-shard-export.js +44 -0
- package/dist/src/artifacts/fulltext.js +108 -0
- package/dist/src/artifacts/graph-backend.js +51 -0
- package/dist/src/artifacts/graph-query.js +247 -0
- package/dist/src/artifacts/hybrid-query.js +225 -0
- package/dist/src/artifacts/index-builder.js +1089 -0
- package/dist/src/artifacts/index-reader.js +112 -0
- package/dist/src/artifacts/index-status.js +193 -0
- package/dist/src/artifacts/legacy-index-migration.js +169 -0
- package/dist/src/artifacts/move.js +154 -0
- package/dist/src/artifacts/operational-state.js +239 -0
- package/dist/src/artifacts/prebuilt-build-lock.js +49 -0
- package/dist/src/artifacts/query-engine.js +1955 -0
- package/dist/src/artifacts/source-graph.js +529 -0
- package/dist/src/artifacts/stats.js +169 -0
- package/dist/src/artifacts/types.js +606 -0
- package/dist/src/artifacts/views/cli.js +293 -0
- package/dist/src/artifacts/views/definition.js +170 -0
- package/dist/src/artifacts/views/store.js +149 -0
- package/dist/src/artifacts/views/types.js +8 -0
- package/dist/src/artifacts/watcher.js +255 -0
- package/dist/src/catalog/builtin-models.json +636 -0
- package/dist/src/catalog/cli.js +228 -0
- package/dist/src/catalog/cli.mjs +289 -0
- package/dist/src/catalog/index.js +15 -0
- package/dist/src/catalog/loader.js +217 -0
- package/dist/src/catalog/loader.mjs +251 -0
- package/dist/src/catalog/sources.json +41 -0
- package/dist/src/catalog/types.js +8 -0
- package/dist/src/channel/manager.mjs +504 -0
- package/dist/src/cli/agent-spawn.js +178 -0
- package/dist/src/cli/cli-extension-loader.js +245 -0
- package/dist/src/cli/command-log.js +275 -0
- package/dist/src/cli/config-loader.js +232 -0
- package/dist/src/cli/env.js +82 -0
- package/dist/src/cli/errors.js +150 -0
- package/dist/src/cli/find-package-root.js +40 -0
- package/dist/src/cli/git-hooks.js +250 -0
- package/dist/src/cli/handlers/agentcard.js +206 -0
- package/dist/src/cli/handlers/artifacts.js +76 -0
- package/dist/src/cli/handlers/best-practices-audit.js +280 -0
- package/dist/src/cli/handlers/cockpit.js +137 -0
- package/dist/src/cli/handlers/command-log.js +37 -0
- package/dist/src/cli/handlers/daemon.js +59 -0
- package/dist/src/cli/handlers/diagnose.js +300 -0
- package/dist/src/cli/handlers/execution-mode.js +105 -0
- package/dist/src/cli/handlers/feedback.js +341 -0
- package/dist/src/cli/handlers/help.js +147 -0
- package/dist/src/cli/handlers/index.js +302 -0
- package/dist/src/cli/handlers/init.js +179 -0
- package/dist/src/cli/handlers/install.js +129 -0
- package/dist/src/cli/handlers/issues.js +46 -0
- package/dist/src/cli/handlers/lint.js +42 -0
- package/dist/src/cli/handlers/local-executor.js +315 -0
- package/dist/src/cli/handlers/marketplace.js +168 -0
- package/dist/src/cli/handlers/mc.js +1010 -0
- package/dist/src/cli/handlers/models.js +352 -0
- package/dist/src/cli/handlers/packages.js +155 -0
- package/dist/src/cli/handlers/ralph-launcher.js +717 -0
- package/dist/src/cli/handlers/ralph.js +575 -0
- package/dist/src/cli/handlers/refresh.js +432 -0
- package/dist/src/cli/handlers/regenerate.js +336 -0
- package/dist/src/cli/handlers/repo-access.js +109 -0
- package/dist/src/cli/handlers/run.js +165 -0
- package/dist/src/cli/handlers/runtime-info.js +301 -0
- package/dist/src/cli/handlers/sandbox.js +197 -0
- package/dist/src/cli/handlers/scaffolding.js +149 -0
- package/dist/src/cli/handlers/script-runner.js +121 -0
- package/dist/src/cli/handlers/sdlc-accelerate.js +148 -0
- package/dist/src/cli/handlers/serve.js +1835 -0
- package/dist/src/cli/handlers/session.js +348 -0
- package/dist/src/cli/handlers/setup.js +440 -0
- package/dist/src/cli/handlers/skill-lint.js +367 -0
- package/dist/src/cli/handlers/skill-usage.js +74 -0
- package/dist/src/cli/handlers/steward.js +567 -0
- package/dist/src/cli/handlers/subcommands.js +1702 -0
- package/dist/src/cli/handlers/team.js +337 -0
- package/dist/src/cli/handlers/types.js +11 -0
- package/dist/src/cli/handlers/use.js +2772 -0
- package/dist/src/cli/handlers/utilities.js +703 -0
- package/dist/src/cli/handlers/version.js +134 -0
- package/dist/src/cli/handlers/workspace-context.js +93 -0
- package/dist/src/cli/handlers/workspace.js +126 -0
- package/dist/src/cli/help-generator.js +178 -0
- package/dist/src/cli/hooks/builtin/activity-log-hook.js +126 -0
- package/dist/src/cli/hooks/executor.js +96 -0
- package/dist/src/cli/hooks/index.js +15 -0
- package/dist/src/cli/hooks/registry.js +143 -0
- package/dist/src/cli/hooks/types.js +13 -0
- package/dist/src/cli/log.js +492 -0
- package/dist/src/cli/project-isolation/detect.js +70 -0
- package/dist/src/cli/project-isolation/index.js +7 -0
- package/dist/src/cli/project-isolation/signals.js +17 -0
- package/dist/src/cli/project-isolation/warning.js +102 -0
- package/dist/src/cli/prompt-utils.js +155 -0
- package/dist/src/cli/provider-deployment-plan.js +126 -0
- package/dist/src/cli/provider-resolution.js +119 -0
- package/dist/src/cli/router.js +305 -0
- package/dist/src/cli/scope-resolver.js +392 -0
- package/dist/src/cli/skill-usage.js +616 -0
- package/dist/src/cli/ui.js +224 -0
- package/dist/src/cli/watch-service.js +203 -0
- package/dist/src/cli/workflow-orchestrator.js +478 -0
- package/dist/src/cli/workspace-signals.js +321 -0
- package/dist/src/community/footer.js +14 -0
- package/dist/src/community/links.js +123 -0
- package/dist/src/community/milestones.js +46 -0
- package/dist/src/community/nudge-policy.js +93 -0
- package/dist/src/config/aiwg-config.js +883 -0
- package/dist/src/config/cli.js +703 -0
- package/dist/src/config/gitignore.js +156 -0
- package/dist/src/config/project-artifacts.js +76 -0
- package/dist/src/config/user-config.js +428 -0
- package/dist/src/config/user-registry.js +127 -0
- package/dist/src/config/workspace.js +276 -0
- package/dist/src/contributors/detect.js +39 -0
- package/dist/src/contributors/discover.js +172 -0
- package/dist/src/contributors/heuristic.js +186 -0
- package/dist/src/contributors/index.js +11 -0
- package/dist/src/contributors/types.js +13 -0
- package/dist/src/contributors/validation.js +116 -0
- package/dist/src/data/community.schema.json +43 -0
- package/dist/src/data/community.yaml +16 -0
- package/dist/src/extensions/capability-index.js +270 -0
- package/dist/src/extensions/claude-hooks-installer.js +268 -0
- package/dist/src/extensions/commands/definitions.js +3485 -0
- package/dist/src/extensions/deployment-registration.js +463 -0
- package/dist/src/extensions/index.js +22 -0
- package/dist/src/extensions/loader.js +132 -0
- package/dist/src/extensions/managed-marker.js +100 -0
- package/dist/src/extensions/manifest.js +196 -0
- package/dist/src/extensions/project-local-activity.js +114 -0
- package/dist/src/extensions/project-local-discovery.js +261 -0
- package/dist/src/extensions/project-local-doctor.js +281 -0
- package/dist/src/extensions/project-local-gitignore.js +176 -0
- package/dist/src/extensions/project-local-paths.js +121 -0
- package/dist/src/extensions/project-local-promote.js +218 -0
- package/dist/src/extensions/project-local-remove.js +373 -0
- package/dist/src/extensions/project-local-scaffold.js +252 -0
- package/dist/src/extensions/project-quickref.js +291 -0
- package/dist/src/extensions/registry.js +368 -0
- package/dist/src/extensions/shadow-resolver.js +271 -0
- package/dist/src/extensions/types.js +86 -0
- package/dist/src/extensions/upstream-registry.js +195 -0
- package/dist/src/extensions/validation.js +631 -0
- package/dist/src/features/catalog.js +88 -0
- package/dist/src/features/cli.js +197 -0
- package/dist/src/features/installer.js +57 -0
- package/dist/src/features/paths.js +14 -0
- package/dist/src/features/runtime.js +21 -0
- package/dist/src/features/status.js +134 -0
- package/dist/src/hooks/laziness-detection.js +532 -0
- package/dist/src/intake/git-history-analyzer.js +486 -0
- package/dist/src/intake/index.js +9 -0
- package/dist/src/issues/cli.js +327 -0
- package/dist/src/issues/index.js +5 -0
- package/dist/src/issues/live.js +154 -0
- package/dist/src/issues/local.js +666 -0
- package/dist/src/issues/sync.js +143 -0
- package/dist/src/issues/types.js +2 -0
- package/dist/src/issues/workflows.js +164 -0
- package/dist/src/kb/cli.js +173 -0
- package/dist/src/lint/cli.js +171 -0
- package/dist/src/lint/loader.js +225 -0
- package/dist/src/lint/reporters.js +141 -0
- package/dist/src/lint/runner.js +364 -0
- package/dist/src/lint/types.js +10 -0
- package/dist/src/marketplace/cache.js +110 -0
- package/dist/src/marketplace/identifier.js +63 -0
- package/dist/src/marketplace/registry.js +36 -0
- package/dist/src/marketplace/sources/clawhub.js +53 -0
- package/dist/src/marketplace/sources/git.js +45 -0
- package/dist/src/marketplace/types.js +9 -0
- package/dist/src/mcp/adapters/codex-runtime.js +224 -0
- package/dist/src/mcp/cli.mjs +1197 -0
- package/dist/src/mcp/elicitation.mjs +149 -0
- package/dist/src/mcp/helpers.mjs +287 -0
- package/dist/src/mcp/index.mjs +11 -0
- package/dist/src/mcp/profiles.js +263 -0
- package/dist/src/mcp/profiles.mjs +360 -0
- package/dist/src/mcp/registry.js +376 -0
- package/dist/src/mcp/registry.mjs +387 -0
- package/dist/src/mcp/server.mjs +633 -0
- package/dist/src/mcp/test-simple.mjs +271 -0
- package/dist/src/mcp/tools/command-run.mjs +101 -0
- package/dist/src/mcp/tools/discovery.mjs +291 -0
- package/dist/src/mcp/tools/interaction.mjs +87 -0
- package/dist/src/mcp/tools/orchestration.mjs +320 -0
- package/dist/src/mcp/tools/subsystems.mjs +640 -0
- package/dist/src/memory/cli.js +166 -0
- package/dist/src/memory/project-registry.js +282 -0
- package/dist/src/metrics/artifact-metrics.js +184 -0
- package/dist/src/metrics/context-budget.js +174 -0
- package/dist/src/metrics/token-counter.js +133 -0
- package/dist/src/models/config-loader.js +228 -0
- package/dist/src/models/index.js +22 -0
- package/dist/src/models/model-capabilities.v1.json +120 -0
- package/dist/src/models/model-catalog.v1.json +96 -0
- package/dist/src/models/model-discovery.js +521 -0
- package/dist/src/models/provider-models.js +73 -0
- package/dist/src/models/provider-policy.js +273 -0
- package/dist/src/models/resolver.js +245 -0
- package/dist/src/models/router.js +70 -0
- package/dist/src/models/types.js +8 -0
- package/dist/src/models/wrapper-deployment.js +178 -0
- package/dist/src/models/wrapper-route.js +54 -0
- package/dist/src/ops/cli.js +268 -0
- package/dist/src/ops/registry.js +623 -0
- package/dist/src/packages/adapters/clawhub.js +113 -0
- package/dist/src/packages/adapters/git.js +153 -0
- package/dist/src/packages/adapters/gitea.js +93 -0
- package/dist/src/packages/adapters/github.js +69 -0
- package/dist/src/packages/adapters/local-cache.js +89 -0
- package/dist/src/packages/package-registry.js +143 -0
- package/dist/src/packages/registry.js +238 -0
- package/dist/src/packages/types.js +11 -0
- package/dist/src/plugin/cross-framework-ops.js +475 -0
- package/dist/src/plugin/framework-config-loader.js +235 -0
- package/dist/src/plugin/framework-detector.js +186 -0
- package/dist/src/plugin/framework-isolator.js +341 -0
- package/dist/src/plugin/framework-migration.js +371 -0
- package/dist/src/plugin/metadata-validator.js +906 -0
- package/dist/src/plugin/plugin-installer.js +436 -0
- package/dist/src/plugin/plugin-status.js +369 -0
- package/dist/src/plugin/plugin-uninstaller.js +473 -0
- package/dist/src/plugin/registry-validator.js +344 -0
- package/dist/src/plugin/skill-command-translator.js +415 -0
- package/dist/src/plugin/workspace-creator.js +189 -0
- package/dist/src/plugin/workspace-migrator.js +821 -0
- package/dist/src/policy/authorization.js +390 -0
- package/dist/src/policy/repo-access.js +215 -0
- package/dist/src/provenance/cli.js +16 -0
- package/dist/src/providers/capability-matrix.js +300 -0
- package/dist/src/providers/capability-matrix.yaml +514 -0
- package/dist/src/providers/provider-definitions.js +977 -0
- package/dist/src/providers/provider-definitions.mjs +159 -0
- package/dist/src/providers/provider-inventory.js +169 -0
- package/dist/src/quality/feedback-ab.js +174 -0
- package/dist/src/quality/feedback-collector.js +176 -0
- package/dist/src/quality/feedback-tracker.js +123 -0
- package/dist/src/quality/patterns/adr.json +24 -0
- package/dist/src/quality/patterns/sad.json +24 -0
- package/dist/src/quality/patterns/test-plan.json +24 -0
- package/dist/src/quality/patterns/use-case.json +24 -0
- package/dist/src/quality/scoring.js +157 -0
- package/dist/src/reflections/cli.js +15 -0
- package/dist/src/release/plan.js +139 -0
- package/dist/src/research/cache/manager.js +227 -0
- package/dist/src/research/clients/arxiv.js +156 -0
- package/dist/src/research/clients/base.js +197 -0
- package/dist/src/research/clients/crossref.js +112 -0
- package/dist/src/research/clients/semantic-scholar.js +126 -0
- package/dist/src/research/clients/unpaywall.js +87 -0
- package/dist/src/research/index.js +14 -0
- package/dist/src/research/query-cli.js +336 -0
- package/dist/src/research/services/acquisition.js +313 -0
- package/dist/src/research/services/archival.js +225 -0
- package/dist/src/research/services/citation.js +279 -0
- package/dist/src/research/services/discovery.js +243 -0
- package/dist/src/research/services/documentation.js +269 -0
- package/dist/src/research/services/index.js +14 -0
- package/dist/src/research/services/provenance.js +279 -0
- package/dist/src/research/services/quality.js +370 -0
- package/dist/src/research/services/types.js +7 -0
- package/dist/src/research/storage-cli.js +20 -0
- package/dist/src/research/types.js +47 -0
- package/dist/src/resources/index.d.ts +2 -0
- package/dist/src/resources/index.js +2 -0
- package/dist/src/resources/web-release.d.ts +89 -0
- package/dist/src/resources/web-release.js +882 -0
- package/dist/src/rlm/cache/cli.js +162 -0
- package/dist/src/rlm/cache/hash.js +35 -0
- package/dist/src/rlm/cache/store.js +170 -0
- package/dist/src/rlm/cache/types.js +8 -0
- package/dist/src/rlm/cli.js +650 -0
- package/dist/src/serve/a2a-terminal-observer.js +120 -0
- package/dist/src/serve/agent-router.js +205 -0
- package/dist/src/serve/dispatch-router.js +171 -0
- package/dist/src/serve/executor-registry.js +715 -0
- package/dist/src/serve/mission-conductor.js +177 -0
- package/dist/src/serve/orchestrator-adapter.js +113 -0
- package/dist/src/serve/orchestrator-override.js +94 -0
- package/dist/src/serve/orchestrator-pty.js +133 -0
- package/dist/src/serve/pty-bridge.js +799 -0
- package/dist/src/serve/sandbox-registry.js +832 -0
- package/dist/src/serve/screen-reader.js +228 -0
- package/dist/src/serve/stack-adapters.js +68 -0
- package/dist/src/serve/telemetry.js +143 -0
- package/dist/src/skills/adapters/clawhub.js +250 -0
- package/dist/src/skills/adapters/local.js +335 -0
- package/dist/src/skills/adapters/openclaw.js +316 -0
- package/dist/src/skills/cli.js +334 -0
- package/dist/src/skills/registry.js +117 -0
- package/dist/src/skills/run.js +259 -0
- package/dist/src/skills/runtime.js +94 -0
- package/dist/src/skills/types.js +10 -0
- package/dist/src/smiths/agentsmith/demo.js +116 -0
- package/dist/src/smiths/agentsmith/examples.js +300 -0
- package/dist/src/smiths/agentsmith/generator.js +503 -0
- package/dist/src/smiths/agentsmith/index.js +11 -0
- package/dist/src/smiths/agentsmith/types.js +8 -0
- package/dist/src/smiths/commandsmith/example.js +220 -0
- package/dist/src/smiths/commandsmith/generator.js +288 -0
- package/dist/src/smiths/commandsmith/index.js +41 -0
- package/dist/src/smiths/commandsmith/templates.js +296 -0
- package/dist/src/smiths/commandsmith/types.js +7 -0
- package/dist/src/smiths/context-pipeline/aiwg-md.js +104 -0
- package/dist/src/smiths/context-pipeline/allowlist.js +195 -0
- package/dist/src/smiths/context-pipeline/claude-hook.js +127 -0
- package/dist/src/smiths/context-pipeline/discovery.js +187 -0
- package/dist/src/smiths/context-pipeline/external-links-section.js +49 -0
- package/dist/src/smiths/context-pipeline/finalization.js +147 -0
- package/dist/src/smiths/context-pipeline/generator.js +477 -0
- package/dist/src/smiths/context-pipeline/index.js +30 -0
- package/dist/src/smiths/context-pipeline/legacy-inject.js +103 -0
- package/dist/src/smiths/context-pipeline/managed-hook.js +95 -0
- package/dist/src/smiths/context-pipeline/overflow.js +212 -0
- package/dist/src/smiths/context-pipeline/parallelism-section.js +94 -0
- package/dist/src/smiths/context-pipeline/provider-policy.js +64 -0
- package/dist/src/smiths/context-pipeline/sanitizer.js +93 -0
- package/dist/src/smiths/context-pipeline/types.js +23 -0
- package/dist/src/smiths/context-pipeline/workspace-context.js +988 -0
- package/dist/src/smiths/hook-bridge/codex-translator.js +129 -0
- package/dist/src/smiths/hook-bridge/copilot-translator.js +64 -0
- package/dist/src/smiths/hook-bridge/factory-translator.js +43 -0
- package/dist/src/smiths/hook-bridge/hermes-translator.js +88 -0
- package/dist/src/smiths/hook-bridge/index.js +79 -0
- package/dist/src/smiths/hook-bridge/loader.js +116 -0
- package/dist/src/smiths/hook-bridge/shim.js +89 -0
- package/dist/src/smiths/hook-bridge/types.js +31 -0
- package/dist/src/smiths/index.js +39 -0
- package/dist/src/smiths/mcpsmith/analyzers/cli-analyzer.js +390 -0
- package/dist/src/smiths/mcpsmith/example.js +119 -0
- package/dist/src/smiths/mcpsmith/generator.js +236 -0
- package/dist/src/smiths/mcpsmith/index.js +17 -0
- package/dist/src/smiths/mcpsmith/types.js +10 -0
- package/dist/src/smiths/platform-paths.js +101 -0
- package/dist/src/smiths/skillsmith/codex-sidecar.js +85 -0
- package/dist/src/smiths/skillsmith/collision-detector.js +249 -0
- package/dist/src/smiths/skillsmith/demo.js +83 -0
- package/dist/src/smiths/skillsmith/examples.js +161 -0
- package/dist/src/smiths/skillsmith/generator.js +316 -0
- package/dist/src/smiths/skillsmith/index.js +12 -0
- package/dist/src/smiths/skillsmith/namespace-adapter.js +180 -0
- package/dist/src/smiths/skillsmith/platform-resolver.js +157 -0
- package/dist/src/smiths/skillsmith/types.js +9 -0
- package/dist/src/smiths/toolsmith/index.js +10 -0
- package/dist/src/smiths/toolsmith/runtime-discovery.mjs +710 -0
- package/dist/src/smiths/toolsmith/types.js +8 -0
- package/dist/src/storage/backends/fortemi.js +227 -0
- package/dist/src/storage/backends/fs.js +134 -0
- package/dist/src/storage/backends/logseq.js +309 -0
- package/dist/src/storage/backends/obsidian.js +233 -0
- package/dist/src/storage/cli.js +468 -0
- package/dist/src/storage/config.js +272 -0
- package/dist/src/storage/index.js +108 -0
- package/dist/src/storage/subsystem-cli.js +201 -0
- package/dist/src/storage/types.js +33 -0
- package/dist/src/testing/corpus/corpus-builder.js +383 -0
- package/dist/src/testing/corpus/ground-truth-manager.js +460 -0
- package/dist/src/testing/corpus/index.js +10 -0
- package/dist/src/testing/fixtures/index.js +9 -0
- package/dist/src/testing/fixtures/test-data-factory.js +472 -0
- package/dist/src/testing/generators/index.js +11 -0
- package/dist/src/testing/generators/test-case-generator.js +393 -0
- package/dist/src/testing/generators/test-code-generator.js +384 -0
- package/dist/src/testing/generators/use-case-parser.js +325 -0
- package/dist/src/testing/index.js +11 -0
- package/dist/src/tracker/capability-protocol.js +118 -0
- package/dist/src/update/checker.mjs +396 -0
- package/dist/src/update/notifier.mjs +235 -0
- package/dist/src/writing/content-diversifier.js +804 -0
- package/dist/src/writing/example-generator.js +959 -0
- package/dist/src/writing/example-templates.js +99 -0
- package/dist/src/writing/pattern-library.js +486 -0
- package/dist/src/writing/patterns/banned-phrases.json +4413 -0
- package/dist/src/writing/patterns/formulaic-structures.json +1300 -0
- package/dist/src/writing/patterns/generic-adjectives.json +1510 -0
- package/dist/src/writing/patterns/hedging-language.json +2096 -0
- package/dist/src/writing/patterns/transition-words.json +1285 -0
- package/dist/src/writing/patterns/weak-verbs.json +1112 -0
- package/dist/src/writing/prompt-optimizer.js +660 -0
- package/dist/src/writing/prompt-templates.js +583 -0
- package/dist/src/writing/scoring-config-loader.js +168 -0
- package/dist/src/writing/validation-engine.js +595 -0
- package/dist/src/writing/validation-rules.js +380 -0
- package/dist/src/writing/voice-analyzer.js +439 -0
- package/dist/src/writing/voice-calibration.js +661 -0
- package/dist/src/writing/voice-profiles.json +588 -0
- package/package.json +64 -9
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { readAiwgConfig } from '../config/aiwg-config.js';
|
|
2
|
+
import { normalizeProviderDefinitionId } from '../providers/provider-definitions.js';
|
|
3
|
+
import { collectProviderInventory } from '../providers/provider-inventory.js';
|
|
4
|
+
import { resolveDynamicModelCatalog } from './model-discovery.js';
|
|
5
|
+
export const MODEL_WRAPPERS = {
|
|
6
|
+
reasoning: 'aiwg-model-reasoning-worker',
|
|
7
|
+
coding: 'aiwg-model-coding-worker',
|
|
8
|
+
efficiency: 'aiwg-model-efficiency-worker',
|
|
9
|
+
};
|
|
10
|
+
async function configuredProviders(cwd) {
|
|
11
|
+
try {
|
|
12
|
+
const config = await readAiwgConfig(cwd);
|
|
13
|
+
const candidates = [
|
|
14
|
+
...(config?.providers ?? []),
|
|
15
|
+
...Object.values(config?.installed ?? {}).flatMap(entry => Object.keys(entry.deployedTo ?? {})),
|
|
16
|
+
];
|
|
17
|
+
return [...new Set(candidates
|
|
18
|
+
.map(provider => normalizeProviderDefinitionId(provider))
|
|
19
|
+
.filter((provider) => provider !== null))];
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export async function loadProviderModelMetadata(cwd, aiwgRoot) {
|
|
26
|
+
if (!aiwgRoot)
|
|
27
|
+
return null;
|
|
28
|
+
let catalog;
|
|
29
|
+
let inventory;
|
|
30
|
+
try {
|
|
31
|
+
inventory = await collectProviderInventory(cwd, { detectProcess: false });
|
|
32
|
+
catalog = await resolveDynamicModelCatalog({
|
|
33
|
+
aiwgRoot,
|
|
34
|
+
inventory,
|
|
35
|
+
allowNetwork: false,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
const configured = await configuredProviders(cwd);
|
|
42
|
+
const installed = inventory.providers
|
|
43
|
+
.filter(provider => provider.available || provider.deployed)
|
|
44
|
+
.map(provider => provider.id)
|
|
45
|
+
.filter(provider => configured.includes(provider));
|
|
46
|
+
const providers = {};
|
|
47
|
+
for (const provider of installed) {
|
|
48
|
+
const roles = catalog.providers[provider]?.roles;
|
|
49
|
+
if (!roles)
|
|
50
|
+
continue;
|
|
51
|
+
providers[provider] = Object.keys(MODEL_WRAPPERS)
|
|
52
|
+
.flatMap(role => {
|
|
53
|
+
const model = roles[role];
|
|
54
|
+
return model ? [{
|
|
55
|
+
provider,
|
|
56
|
+
role,
|
|
57
|
+
model: model.id,
|
|
58
|
+
wrapper: MODEL_WRAPPERS[role],
|
|
59
|
+
status: model.status ?? 'unknown',
|
|
60
|
+
observed: model.observed ?? false,
|
|
61
|
+
source: catalog.discovery?.providers?.[provider]?.source
|
|
62
|
+
?? catalog.discovery?.source
|
|
63
|
+
?? 'static',
|
|
64
|
+
}] : [];
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
catalogVersion: catalog.version,
|
|
69
|
+
refreshedAt: catalog.refreshedAt ?? null,
|
|
70
|
+
providers,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=provider-models.js.map
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider-aware model policy registry, validation, and compilation.
|
|
3
|
+
* @implements #1802
|
|
4
|
+
* @implements #1805
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { createRequire } from 'node:module';
|
|
8
|
+
const require = createRequire(import.meta.url);
|
|
9
|
+
function requireModelResource(filename) {
|
|
10
|
+
const candidates = [
|
|
11
|
+
`./${filename}`,
|
|
12
|
+
`../../agentic/code/providers/${filename}`,
|
|
13
|
+
`../../../agentic/code/providers/${filename}`,
|
|
14
|
+
];
|
|
15
|
+
for (const candidate of candidates) {
|
|
16
|
+
try {
|
|
17
|
+
return require(candidate);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
if (error?.code !== 'MODULE_NOT_FOUND')
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
throw new Error(`Model policy resource is missing: ${filename}`);
|
|
25
|
+
}
|
|
26
|
+
const capabilityData = requireModelResource('model-capabilities.v1.json');
|
|
27
|
+
const catalogData = requireModelResource('model-catalog.v1.json');
|
|
28
|
+
const ProviderSchema = z.enum([
|
|
29
|
+
'claude', 'codex', 'copilot', 'cursor', 'factory', 'hermes',
|
|
30
|
+
'opencode', 'openclaw', 'openhuman', 'warp', 'windsurf',
|
|
31
|
+
]);
|
|
32
|
+
const OutcomeSchema = z.enum([
|
|
33
|
+
'native', 'compiled', 'inherited', 'global-only', 'informational', 'unsupported',
|
|
34
|
+
]);
|
|
35
|
+
const CapabilityEntrySchema = z.object({
|
|
36
|
+
agent: OutcomeSchema,
|
|
37
|
+
skill: OutcomeSchema,
|
|
38
|
+
globalChild: OutcomeSchema,
|
|
39
|
+
identifierSyntax: z.string().min(1),
|
|
40
|
+
effortValues: z.array(z.string().min(1)).optional(),
|
|
41
|
+
inheritance: z.string().min(1),
|
|
42
|
+
invalidPinFallback: z.string().min(1),
|
|
43
|
+
configTarget: z.string().min(1),
|
|
44
|
+
artifactFormat: z.string().min(1),
|
|
45
|
+
verification: z.string().min(1),
|
|
46
|
+
sourceUrl: z.string().url(),
|
|
47
|
+
verifiedAt: z.string().date(),
|
|
48
|
+
});
|
|
49
|
+
const CapabilityRegistrySchema = z.object({
|
|
50
|
+
version: z.literal('1.0.0'),
|
|
51
|
+
verifiedAt: z.string().date(),
|
|
52
|
+
providers: z.record(ProviderSchema, CapabilityEntrySchema),
|
|
53
|
+
});
|
|
54
|
+
const CatalogModelSchema = z.object({
|
|
55
|
+
id: z.string().min(1),
|
|
56
|
+
status: z.enum(['active', 'deprecated', 'unverified']),
|
|
57
|
+
fallback: z.string().min(1).optional(),
|
|
58
|
+
observed: z.boolean().optional(),
|
|
59
|
+
});
|
|
60
|
+
const CatalogProviderSchema = z.object({
|
|
61
|
+
roles: z.object({
|
|
62
|
+
reasoning: CatalogModelSchema,
|
|
63
|
+
coding: CatalogModelSchema,
|
|
64
|
+
efficiency: CatalogModelSchema,
|
|
65
|
+
}),
|
|
66
|
+
sourceUrl: z.string().url(),
|
|
67
|
+
verifiedAt: z.string().date(),
|
|
68
|
+
});
|
|
69
|
+
const CatalogSchema = z.object({
|
|
70
|
+
version: z.literal('1.0.0'),
|
|
71
|
+
refreshedAt: z.string().date(),
|
|
72
|
+
staleAfterDays: z.number().int().positive(),
|
|
73
|
+
providers: z.record(ProviderSchema, CatalogProviderSchema),
|
|
74
|
+
});
|
|
75
|
+
const PolicySchema = z.object({
|
|
76
|
+
role: z.enum(['reasoning', 'coding', 'efficiency']),
|
|
77
|
+
tier: z.enum(['economy', 'standard', 'premium']),
|
|
78
|
+
effort: z.enum(['minimal', 'low', 'medium', 'high', 'xhigh']).optional(),
|
|
79
|
+
override: z.string().min(1).optional(),
|
|
80
|
+
}).strict();
|
|
81
|
+
const UserProjectModelConfigSchema = z.object({
|
|
82
|
+
defaults: z.object({
|
|
83
|
+
tier: z.enum(['economy', 'standard', 'premium', 'max-quality']).optional(),
|
|
84
|
+
provider: ProviderSchema.optional(),
|
|
85
|
+
}).strict().optional(),
|
|
86
|
+
agentOverrides: z.record(z.string(), z.object({
|
|
87
|
+
'model-tier': z.enum(['economy', 'standard', 'premium', 'max-quality']).optional(),
|
|
88
|
+
'model-override': z.string().min(1).optional(),
|
|
89
|
+
rationale: z.string().min(1).optional(),
|
|
90
|
+
}).strict()).optional(),
|
|
91
|
+
customTiers: z.record(z.string(), z.object({
|
|
92
|
+
description: z.string().min(1),
|
|
93
|
+
costMultiplier: z.number().nonnegative(),
|
|
94
|
+
roleMapping: z.object({
|
|
95
|
+
reasoning: z.enum(['reasoning', 'coding', 'efficiency']),
|
|
96
|
+
coding: z.enum(['reasoning', 'coding', 'efficiency']),
|
|
97
|
+
efficiency: z.enum(['reasoning', 'coding', 'efficiency']),
|
|
98
|
+
}).strict(),
|
|
99
|
+
}).strict()).optional(),
|
|
100
|
+
rationale: z.string().optional(),
|
|
101
|
+
}).passthrough();
|
|
102
|
+
let registryCache = null;
|
|
103
|
+
let catalogCache = null;
|
|
104
|
+
export function loadProviderModelCapabilities() {
|
|
105
|
+
if (!registryCache) {
|
|
106
|
+
registryCache = CapabilityRegistrySchema.parse(capabilityData);
|
|
107
|
+
const expected = new Set(ProviderSchema.options);
|
|
108
|
+
const actual = new Set(Object.keys(registryCache.providers));
|
|
109
|
+
if (actual.size !== expected.size || [...expected].some(id => !actual.has(id))) {
|
|
110
|
+
throw new Error('Provider model capability registry must cover all 11 providers');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return registryCache;
|
|
114
|
+
}
|
|
115
|
+
export function loadProviderModelCatalog() {
|
|
116
|
+
if (!catalogCache)
|
|
117
|
+
catalogCache = CatalogSchema.parse(catalogData);
|
|
118
|
+
return catalogCache;
|
|
119
|
+
}
|
|
120
|
+
export function validateCanonicalModelPolicy(input) {
|
|
121
|
+
const parsed = PolicySchema.safeParse(input);
|
|
122
|
+
if (!parsed.success) {
|
|
123
|
+
return {
|
|
124
|
+
valid: false,
|
|
125
|
+
diagnostics: parsed.error.issues.map(issue => ({
|
|
126
|
+
code: 'MODEL_POLICY_INVALID',
|
|
127
|
+
severity: 'error',
|
|
128
|
+
message: `${issue.path.join('.') || 'policy'}: ${issue.message}`,
|
|
129
|
+
})),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
return { valid: true, policy: parsed.data, diagnostics: [] };
|
|
133
|
+
}
|
|
134
|
+
export function validateUserProjectModelConfig(input) {
|
|
135
|
+
const parsed = UserProjectModelConfigSchema.safeParse(input);
|
|
136
|
+
if (parsed.success)
|
|
137
|
+
return { valid: true, diagnostics: [] };
|
|
138
|
+
return {
|
|
139
|
+
valid: false,
|
|
140
|
+
diagnostics: parsed.error.issues.map(issue => ({
|
|
141
|
+
code: 'MODEL_POLICY_INVALID',
|
|
142
|
+
severity: 'error',
|
|
143
|
+
message: `${issue.path.join('.') || 'config'}: ${issue.message}`,
|
|
144
|
+
})),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
function catalogRole(policy) {
|
|
148
|
+
if (policy.tier === 'economy')
|
|
149
|
+
return 'efficiency';
|
|
150
|
+
if (policy.tier === 'premium')
|
|
151
|
+
return 'reasoning';
|
|
152
|
+
return policy.role;
|
|
153
|
+
}
|
|
154
|
+
function fieldNames(provider) {
|
|
155
|
+
switch (provider) {
|
|
156
|
+
case 'codex': return { model: 'model', effort: 'model_reasoning_effort' };
|
|
157
|
+
case 'factory': return { model: 'model', effort: 'reasoningEffort' };
|
|
158
|
+
case 'claude': return { model: 'model', effort: 'effort' };
|
|
159
|
+
case 'copilot':
|
|
160
|
+
case 'cursor':
|
|
161
|
+
case 'opencode': return { model: 'model' };
|
|
162
|
+
case 'openhuman': return { model: 'model_hint' };
|
|
163
|
+
case 'openclaw': return { model: 'subagents.model' };
|
|
164
|
+
default: return {};
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
export function compileModelPolicy(input) {
|
|
168
|
+
const registry = loadProviderModelCapabilities();
|
|
169
|
+
const catalog = input.catalog ?? loadProviderModelCatalog();
|
|
170
|
+
const capability = registry.providers[input.provider];
|
|
171
|
+
if (!capability)
|
|
172
|
+
throw new Error(`Unknown provider model capability: ${input.provider}`);
|
|
173
|
+
const surface = capability[input.artifact];
|
|
174
|
+
const diagnostics = [];
|
|
175
|
+
const fields = {};
|
|
176
|
+
const names = fieldNames(input.provider);
|
|
177
|
+
const catalogProvider = catalog.providers[input.provider];
|
|
178
|
+
if (!catalogProvider)
|
|
179
|
+
throw new Error(`Unknown provider model catalog: ${input.provider}`);
|
|
180
|
+
const catalogEntry = catalogProvider.roles[catalogRole(input.policy)];
|
|
181
|
+
const effectiveModel = input.policy.override ?? catalogEntry.id;
|
|
182
|
+
if (surface === 'unsupported' || surface === 'informational') {
|
|
183
|
+
diagnostics.push({
|
|
184
|
+
code: surface === 'unsupported' ? 'MODEL_SURFACE_UNSUPPORTED' : 'MODEL_SURFACE_DEGRADED',
|
|
185
|
+
severity: surface === 'unsupported' ? 'warning' : 'info',
|
|
186
|
+
provider: input.provider,
|
|
187
|
+
message: `${input.provider} cannot enforce ${input.artifact}-scoped model policy (${surface})`,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
else if (surface === 'global-only' || surface === 'inherited') {
|
|
191
|
+
diagnostics.push({
|
|
192
|
+
code: 'MODEL_SURFACE_DEGRADED', severity: 'warning', provider: input.provider,
|
|
193
|
+
message: `${input.provider} compiles ${input.artifact} policy as ${surface}`,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
else if (names.model) {
|
|
197
|
+
fields[names.model] = effectiveModel;
|
|
198
|
+
}
|
|
199
|
+
if (input.policy.effort) {
|
|
200
|
+
if (names.effort && capability.effortValues?.includes(input.policy.effort)
|
|
201
|
+
&& surface !== 'unsupported' && surface !== 'informational') {
|
|
202
|
+
fields[names.effort] = input.policy.effort;
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
diagnostics.push({
|
|
206
|
+
code: 'MODEL_EFFORT_UNSUPPORTED', severity: 'warning', provider: input.provider,
|
|
207
|
+
message: `${input.provider} does not enforce effort=${input.policy.effort} on ${input.artifact} artifacts`,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (input.policy.override) {
|
|
212
|
+
diagnostics.push({
|
|
213
|
+
code: 'MODEL_OVERRIDE_UNVERIFIED', severity: 'warning', provider: input.provider,
|
|
214
|
+
message: `Exact override ${input.policy.override} requires provider validation`,
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
else if (catalogEntry.status === 'deprecated') {
|
|
218
|
+
diagnostics.push({
|
|
219
|
+
code: 'MODEL_CATALOG_DEPRECATED', severity: 'error', provider: input.provider,
|
|
220
|
+
message: `${catalogEntry.id} is deprecated`,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
else if (catalogEntry.status === 'unverified') {
|
|
224
|
+
diagnostics.push({
|
|
225
|
+
code: 'MODEL_CATALOG_UNVERIFIED', severity: 'warning', provider: input.provider,
|
|
226
|
+
message: `${catalogEntry.id} has not been observed on ${input.provider}`,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
const now = input.now ?? new Date();
|
|
230
|
+
const refreshedAt = new Date(`${catalog.refreshedAt}T00:00:00Z`);
|
|
231
|
+
const ageDays = Math.floor((now.getTime() - refreshedAt.getTime()) / 86_400_000);
|
|
232
|
+
if (ageDays > catalog.staleAfterDays) {
|
|
233
|
+
diagnostics.push({
|
|
234
|
+
code: 'MODEL_CATALOG_STALE', severity: 'warning', provider: input.provider,
|
|
235
|
+
message: `Model catalog is ${ageDays} days old (limit ${catalog.staleAfterDays})`,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
return {
|
|
239
|
+
provider: input.provider,
|
|
240
|
+
artifact: input.artifact,
|
|
241
|
+
outcome: surface,
|
|
242
|
+
effectiveModel: surface === 'unsupported' || surface === 'informational' ? undefined : effectiveModel,
|
|
243
|
+
effectiveEffort: fields[names.effort ?? ''] ? input.policy.effort : undefined,
|
|
244
|
+
fields,
|
|
245
|
+
target: capability.configTarget,
|
|
246
|
+
source: input.policy.override ? 'override' : (surface === 'inherited' ? 'inheritance' : 'catalog'),
|
|
247
|
+
diagnostics,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
function tomlString(value) { return JSON.stringify(value); }
|
|
251
|
+
export function renderCodexAgentToml(definition) {
|
|
252
|
+
const required = [
|
|
253
|
+
['name', definition.name],
|
|
254
|
+
['description', definition.description],
|
|
255
|
+
['developer_instructions', definition.developerInstructions],
|
|
256
|
+
];
|
|
257
|
+
for (const [field, value] of required) {
|
|
258
|
+
if (!value.trim())
|
|
259
|
+
throw new Error(`Codex custom agent requires ${field}`);
|
|
260
|
+
}
|
|
261
|
+
const lines = required.map(([field, value]) => `${field} = ${tomlString(value)}`);
|
|
262
|
+
if (definition.model)
|
|
263
|
+
lines.push(`model = ${tomlString(definition.model)}`);
|
|
264
|
+
if (definition.modelReasoningEffort) {
|
|
265
|
+
lines.push(`model_reasoning_effort = ${tomlString(definition.modelReasoningEffort)}`);
|
|
266
|
+
}
|
|
267
|
+
return `${lines.join('\n')}\n`;
|
|
268
|
+
}
|
|
269
|
+
export function resetModelPolicyCachesForTests() {
|
|
270
|
+
registryCache = null;
|
|
271
|
+
catalogCache = null;
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=provider-policy.js.map
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Resolver
|
|
3
|
+
* Resolves agent names and roles to concrete model identifiers using tier system
|
|
4
|
+
*
|
|
5
|
+
* @implements @.aiwg/architecture/ADR-015-enhanced-model-selection.md
|
|
6
|
+
* @architecture @.aiwg/architecture/enhanced-model-selection-design.md
|
|
7
|
+
*/
|
|
8
|
+
import { ConfigLoader } from './config-loader.js';
|
|
9
|
+
/**
|
|
10
|
+
* Resolves models for agents using tier system
|
|
11
|
+
*/
|
|
12
|
+
export class ModelResolver {
|
|
13
|
+
config = null;
|
|
14
|
+
loader;
|
|
15
|
+
options;
|
|
16
|
+
constructor(options = {}, projectPath) {
|
|
17
|
+
this.options = {
|
|
18
|
+
respectMinimums: true,
|
|
19
|
+
...options,
|
|
20
|
+
};
|
|
21
|
+
this.loader = new ConfigLoader(projectPath);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Resolve model for an agent
|
|
25
|
+
*
|
|
26
|
+
* @param agentName - Name of the agent
|
|
27
|
+
* @param agentRole - Role hint from agent frontmatter (legacy 'model' field)
|
|
28
|
+
* @param agentTier - Tier from agent frontmatter (new 'model-tier' field)
|
|
29
|
+
* @returns Resolved model information
|
|
30
|
+
*/
|
|
31
|
+
async resolve(agentName, agentRole, agentTier) {
|
|
32
|
+
const config = await this.getConfig();
|
|
33
|
+
// Determine effective tier and role
|
|
34
|
+
const { tier, role, source } = this.determineEffectiveTierAndRole(agentName, agentRole, agentTier, config);
|
|
35
|
+
// Check for direct model override (bypasses tier system)
|
|
36
|
+
const override = config.agentOverrides[agentName];
|
|
37
|
+
if (override?.['model-override']) {
|
|
38
|
+
return {
|
|
39
|
+
modelId: override['model-override'],
|
|
40
|
+
provider: this.options.provider || config.defaults.provider,
|
|
41
|
+
tier,
|
|
42
|
+
role,
|
|
43
|
+
source: 'agent',
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
// Resolve tier + role to concrete model
|
|
47
|
+
const modelId = this.resolveModelId(tier, role, config);
|
|
48
|
+
return {
|
|
49
|
+
modelId,
|
|
50
|
+
provider: this.options.provider || config.defaults.provider,
|
|
51
|
+
tier,
|
|
52
|
+
role,
|
|
53
|
+
source,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Determine effective tier and role for an agent
|
|
58
|
+
*/
|
|
59
|
+
determineEffectiveTierAndRole(agentName, agentRole, agentTier, config) {
|
|
60
|
+
// 1. CLI tier takes precedence
|
|
61
|
+
if (this.options.tier) {
|
|
62
|
+
const role = this.determineRole(agentName, agentRole, config);
|
|
63
|
+
return {
|
|
64
|
+
tier: this.applyMinimumTier(agentName, this.options.tier, config),
|
|
65
|
+
role,
|
|
66
|
+
source: 'cli',
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
// 2. Agent frontmatter tier
|
|
70
|
+
const agentOverride = config.agentOverrides[agentName];
|
|
71
|
+
if (agentTier || agentOverride?.['model-tier']) {
|
|
72
|
+
const tier = agentTier || agentOverride['model-tier'];
|
|
73
|
+
const role = this.determineRole(agentName, agentRole, config);
|
|
74
|
+
return {
|
|
75
|
+
tier: this.applyMinimumTier(agentName, tier, config),
|
|
76
|
+
role,
|
|
77
|
+
source: 'agent',
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
// 3. Default tier from config
|
|
81
|
+
const defaultTier = config.defaults.tier;
|
|
82
|
+
const role = this.determineRole(agentName, agentRole, config);
|
|
83
|
+
return {
|
|
84
|
+
tier: this.applyMinimumTier(agentName, defaultTier, config),
|
|
85
|
+
role,
|
|
86
|
+
source: 'default',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Determine role for agent
|
|
91
|
+
*/
|
|
92
|
+
determineRole(agentName, agentRole, config) {
|
|
93
|
+
// If explicit role provided, use it
|
|
94
|
+
if (agentRole) {
|
|
95
|
+
return agentRole;
|
|
96
|
+
}
|
|
97
|
+
// Check agent role assignments
|
|
98
|
+
if (config?.agentRoleAssignments) {
|
|
99
|
+
for (const category of Object.values(config.agentRoleAssignments)) {
|
|
100
|
+
if (category.agents.includes(agentName)) {
|
|
101
|
+
return category.defaultRole;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Default to 'coding' as reasonable middle ground
|
|
106
|
+
return 'coding';
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Apply minimum tier constraint if respectMinimums is true
|
|
110
|
+
*/
|
|
111
|
+
applyMinimumTier(agentName, requestedTier, config) {
|
|
112
|
+
if (!this.options.respectMinimums) {
|
|
113
|
+
return requestedTier;
|
|
114
|
+
}
|
|
115
|
+
// Find agent's minimum tier
|
|
116
|
+
for (const category of Object.values(config.agentRoleAssignments || {})) {
|
|
117
|
+
if (category.agents.includes(agentName)) {
|
|
118
|
+
const minimumTier = category.minimumTier;
|
|
119
|
+
return this.maxTier(requestedTier, minimumTier);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return requestedTier;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Return the higher of two tiers
|
|
126
|
+
*/
|
|
127
|
+
maxTier(tier1, tier2) {
|
|
128
|
+
const tierOrder = ['economy', 'standard', 'premium', 'max-quality'];
|
|
129
|
+
const index1 = tierOrder.indexOf(tier1);
|
|
130
|
+
const index2 = tierOrder.indexOf(tier2);
|
|
131
|
+
return tierOrder[Math.max(index1, index2)];
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Resolve tier + role to concrete model ID
|
|
135
|
+
*/
|
|
136
|
+
resolveModelId(tier, role, config) {
|
|
137
|
+
const provider = this.options.provider || config.defaults.provider;
|
|
138
|
+
let providerDef = config.providers[provider];
|
|
139
|
+
if (!providerDef) {
|
|
140
|
+
throw new Error(`Provider ${provider} not found in configuration`);
|
|
141
|
+
}
|
|
142
|
+
// Resolve inheritance
|
|
143
|
+
providerDef = this.loader.resolveProviderInheritance(providerDef, config.providers);
|
|
144
|
+
// Check for tier-specific override first
|
|
145
|
+
if (providerDef.tierOverrides?.[tier]?.[role]) {
|
|
146
|
+
return providerDef.tierOverrides[tier][role];
|
|
147
|
+
}
|
|
148
|
+
// Apply tier's role mapping
|
|
149
|
+
const tierDef = config.tiers[tier];
|
|
150
|
+
if (!tierDef) {
|
|
151
|
+
throw new Error(`Tier ${tier} not found in configuration`);
|
|
152
|
+
}
|
|
153
|
+
const mappedRole = tierDef.roleMapping[role];
|
|
154
|
+
// Get model for mapped role
|
|
155
|
+
const modelDef = providerDef.models?.[mappedRole];
|
|
156
|
+
if (!modelDef) {
|
|
157
|
+
throw new Error(`Model not found for provider ${provider}, role ${mappedRole}`);
|
|
158
|
+
}
|
|
159
|
+
return modelDef.default;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get model info by ID or alias
|
|
163
|
+
*/
|
|
164
|
+
async getModelInfo(modelIdOrAlias) {
|
|
165
|
+
const config = await this.getConfig();
|
|
166
|
+
const provider = this.options.provider || config.defaults.provider;
|
|
167
|
+
let providerDef = config.providers[provider];
|
|
168
|
+
if (!providerDef) {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
// Resolve inheritance
|
|
172
|
+
providerDef = this.loader.resolveProviderInheritance(providerDef, config.providers);
|
|
173
|
+
// Check shorthand aliases
|
|
174
|
+
const resolvedId = config.shorthand[modelIdOrAlias] || modelIdOrAlias;
|
|
175
|
+
// Search through all roles
|
|
176
|
+
for (const [roleName, modelDef] of Object.entries(providerDef.models || {})) {
|
|
177
|
+
if (modelDef.default === resolvedId || modelDef.aliases?.includes(modelIdOrAlias)) {
|
|
178
|
+
return {
|
|
179
|
+
id: modelDef.default,
|
|
180
|
+
provider,
|
|
181
|
+
role: roleName,
|
|
182
|
+
aliases: modelDef.aliases || [],
|
|
183
|
+
capabilities: modelDef.capabilities || [],
|
|
184
|
+
contextWindow: modelDef.contextWindow || 0,
|
|
185
|
+
costPer1kTokens: modelDef.costPer1kTokens,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* List all available models for provider
|
|
193
|
+
*/
|
|
194
|
+
async listModels(provider) {
|
|
195
|
+
const config = await this.getConfig();
|
|
196
|
+
const targetProvider = provider || this.options.provider || config.defaults.provider;
|
|
197
|
+
let providerDef = config.providers[targetProvider];
|
|
198
|
+
if (!providerDef) {
|
|
199
|
+
return [];
|
|
200
|
+
}
|
|
201
|
+
// Resolve inheritance
|
|
202
|
+
providerDef = this.loader.resolveProviderInheritance(providerDef, config.providers);
|
|
203
|
+
const models = [];
|
|
204
|
+
for (const [roleName, modelDef] of Object.entries(providerDef.models || {})) {
|
|
205
|
+
models.push({
|
|
206
|
+
id: modelDef.default,
|
|
207
|
+
provider: targetProvider,
|
|
208
|
+
role: roleName,
|
|
209
|
+
aliases: modelDef.aliases || [],
|
|
210
|
+
capabilities: modelDef.capabilities || [],
|
|
211
|
+
contextWindow: modelDef.contextWindow || 0,
|
|
212
|
+
costPer1kTokens: modelDef.costPer1kTokens,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
return models;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* List available tiers
|
|
219
|
+
*/
|
|
220
|
+
async listTiers() {
|
|
221
|
+
const config = await this.getConfig();
|
|
222
|
+
return Object.entries(config.tiers).map(([tierName, tierDef]) => ({
|
|
223
|
+
tier: tierName,
|
|
224
|
+
description: tierDef.description,
|
|
225
|
+
costMultiplier: tierDef.costMultiplier,
|
|
226
|
+
}));
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Get configuration (cached)
|
|
230
|
+
*/
|
|
231
|
+
async getConfig() {
|
|
232
|
+
if (!this.config) {
|
|
233
|
+
this.config = await this.loader.load();
|
|
234
|
+
}
|
|
235
|
+
return this.config;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Clear cache (useful for testing)
|
|
239
|
+
*/
|
|
240
|
+
clearCache() {
|
|
241
|
+
this.config = null;
|
|
242
|
+
this.loader.clearCache();
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider-neutral model-tier routing primitive.
|
|
3
|
+
*
|
|
4
|
+
* This is deliberately a policy decision helper, not a provider switcher.
|
|
5
|
+
* Callers use it to decide whether a task stays on the current/default
|
|
6
|
+
* model, escalates to a capable work tier, or requires explicit premium
|
|
7
|
+
* confirmation before routing.
|
|
8
|
+
*
|
|
9
|
+
* @implements #1185
|
|
10
|
+
*/
|
|
11
|
+
const RUNTIME_TO_MODEL_TIER = {
|
|
12
|
+
0: null,
|
|
13
|
+
1: 'economy',
|
|
14
|
+
2: 'standard',
|
|
15
|
+
3: 'premium',
|
|
16
|
+
};
|
|
17
|
+
function clampRuntimeTier(tier, fallback) {
|
|
18
|
+
return tier === 0 || tier === 1 || tier === 2 || tier === 3 ? tier : fallback;
|
|
19
|
+
}
|
|
20
|
+
export function routeModelTier(request = {}) {
|
|
21
|
+
const defaultTier = clampRuntimeTier(request.defaultTier, 1);
|
|
22
|
+
const maxAutoTier = clampRuntimeTier(request.maxAutoTier, request.unattended ? 1 : 2);
|
|
23
|
+
let tier = defaultTier;
|
|
24
|
+
let source = 'default';
|
|
25
|
+
const rationale = [];
|
|
26
|
+
if (request.deterministic) {
|
|
27
|
+
tier = 0;
|
|
28
|
+
source = 'deterministic';
|
|
29
|
+
rationale.push('deterministic tool/cache/existing answer is sufficient');
|
|
30
|
+
}
|
|
31
|
+
else if (request.requestedPremium) {
|
|
32
|
+
tier = 3;
|
|
33
|
+
source = 'request';
|
|
34
|
+
rationale.push('premium tier was explicitly requested');
|
|
35
|
+
}
|
|
36
|
+
else if (request.highImpact) {
|
|
37
|
+
tier = 3;
|
|
38
|
+
source = 'impact';
|
|
39
|
+
rationale.push('high-impact domain requires supervised premium routing');
|
|
40
|
+
}
|
|
41
|
+
else if (request.complex) {
|
|
42
|
+
tier = Math.max(defaultTier, 2);
|
|
43
|
+
source = 'complexity';
|
|
44
|
+
rationale.push('complex or multi-step work needs a capable work tier');
|
|
45
|
+
}
|
|
46
|
+
else if (request.routine) {
|
|
47
|
+
tier = Math.min(defaultTier, 1);
|
|
48
|
+
source = 'default';
|
|
49
|
+
rationale.push('routine work stays at the default/cheap tier');
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
rationale.push('no escalation signal present');
|
|
53
|
+
}
|
|
54
|
+
const requiresConfirmation = (tier === 3 && !request.premiumAuthorized) || tier > maxAutoTier;
|
|
55
|
+
if (requiresConfirmation) {
|
|
56
|
+
rationale.push(tier === 3
|
|
57
|
+
? 'Tier 3 requires explicit human confirmation'
|
|
58
|
+
: `policy permits auto-routing only through Tier ${maxAutoTier}`);
|
|
59
|
+
}
|
|
60
|
+
const summaryRequired = tier > defaultTier;
|
|
61
|
+
return {
|
|
62
|
+
tier,
|
|
63
|
+
modelTier: RUNTIME_TO_MODEL_TIER[tier],
|
|
64
|
+
requiresConfirmation,
|
|
65
|
+
summaryRequired,
|
|
66
|
+
source: requiresConfirmation && tier > maxAutoTier ? 'policy' : source,
|
|
67
|
+
rationale,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript types for Enhanced Model Selection System (Phase 1)
|
|
3
|
+
*
|
|
4
|
+
* @implements @.aiwg/architecture/ADR-015-enhanced-model-selection.md
|
|
5
|
+
* @architecture @.aiwg/architecture/enhanced-model-selection-design.md
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=types.js.map
|