@event4u/agent-config 16.5.0 → 17.1.0
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/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/skills/install-agent-config/SKILL.md +4 -4
- package/CHANGELOG.md +114 -530
- package/CONTRIBUTING.md +47 -0
- package/README.md +25 -24
- package/dist/agent-src/commands/{design.md → agent-design.md} +10 -6
- package/dist/agent-src/commands/agents/init.md +66 -3
- package/dist/agent-src/commands/agents/user/init.md +3 -0
- package/dist/agent-src/commands/{optimize/deep.md → analyze/and-optimize.md} +72 -33
- package/dist/agent-src/commands/analyze/inbox.md +168 -37
- package/dist/agent-src/commands/analyze/pr.md +144 -0
- package/dist/agent-src/commands/analyze/{repo.md → reference.md} +85 -14
- package/dist/agent-src/commands/analyze/roadmap-repos.md +19 -10
- package/dist/agent-src/commands/analyze.md +28 -12
- package/dist/agent-src/commands/audit.md +115 -0
- package/dist/agent-src/commands/brand/review.md +13 -2
- package/dist/agent-src/commands/brand/tokens.md +3 -3
- package/dist/agent-src/commands/brand/voice.md +8 -5
- package/dist/agent-src/commands/brand.md +2 -2
- package/dist/agent-src/commands/challenge-me/closure.md +25 -0
- package/dist/agent-src/commands/design-system/import.md +8 -3
- package/dist/agent-src/commands/design-system/sync.md +98 -0
- package/dist/agent-src/commands/design-system.md +6 -1
- package/dist/agent-src/commands/evals/analyze.json +44 -0
- package/dist/agent-src/commands/evals/audit.json +12 -0
- package/dist/agent-src/commands/evals/retro.json +12 -0
- package/dist/agent-src/commands/fix/ci.md +10 -8
- package/dist/agent-src/commands/ghostwriter/write.md +22 -0
- package/dist/agent-src/commands/memory/learn-low-impact.md +70 -83
- package/dist/agent-src/commands/memory/propose.md +12 -0
- package/dist/agent-src/commands/memory.md +1 -1
- package/dist/agent-src/commands/optimize.md +4 -3
- package/dist/agent-src/commands/post-as/me.md +18 -0
- package/dist/agent-src/commands/pr/create.md +17 -342
- package/dist/agent-src/commands/pr/merge.md +129 -368
- package/dist/agent-src/commands/retro.md +121 -0
- package/dist/agent-src/commands/review/routing.md +1 -1
- package/dist/agent-src/commands/roadmap/next.md +4 -1
- package/dist/agent-src/commands/roadmap/process-full.md +46 -333
- package/dist/agent-src/commands/roadmap/triage-parked.md +6 -2
- package/dist/agent-src/commands/team-knowledge/consolidate.md +2 -2
- package/dist/agent-src/commands/team-knowledge.md +1 -1
- package/dist/agent-src/commands/threat-model.md +1 -1
- package/dist/agent-src/commands/upstream-contribute.md +91 -101
- package/dist/agent-src/commands/worktree/cleanup.md +18 -11
- package/dist/agent-src/contexts/contracts/consumer-agents-md-guide.md +54 -0
- package/dist/agent-src/contexts/execution/analysis-loop.md +137 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +3 -3
- package/dist/agent-src/contexts/execution/decision-closure-execution.md +1 -1
- package/dist/agent-src/contexts/execution/host-capability-manifest.md +10 -2
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +11 -4
- package/dist/agent-src/contexts/execution/pr-create-branches-content.md +250 -0
- package/dist/agent-src/contexts/execution/pr-create-branches-freshness.md +150 -0
- package/dist/agent-src/contexts/execution/pr-merge-queue.md +287 -0
- package/dist/agent-src/contexts/execution/pr-merge-sync.md +276 -0
- package/dist/agent-src/contexts/execution/pr-merge-trust-boundary.md +69 -0
- package/dist/agent-src/contexts/execution/process-full-all.md +233 -0
- package/dist/agent-src/contexts/execution/process-full-delivery.md +231 -0
- package/dist/agent-src/contexts/execution/roadmap-execution-contract-branches.md +42 -0
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +1 -35
- package/dist/agent-src/contexts/execution/roadmap-process-loop-close.md +235 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop-prescan.md +216 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop-run.md +253 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop-set.md +212 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +25 -864
- package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +14 -2
- package/dist/agent-src/contexts/execution/subagent-steering.md +65 -8
- package/dist/agent-src/contexts/model-recommendations.md +5 -5
- package/dist/agent-src/contexts/subagent-configuration.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/api-cost-levers.md +4 -3
- package/dist/agent-src/guidelines/agent-infra/model-recommendation.md +11 -5
- package/dist/agent-src/guidelines/agent-infra/rule-body-migration-inventory.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +47 -24
- package/dist/agent-src/guidelines/design-antipatterns.md +5 -0
- package/dist/agent-src/guidelines/design-asset-discipline.md +17 -0
- package/dist/agent-src/guidelines/design-fidelity-routing.md +1 -0
- package/dist/agent-src/guidelines/php/api-design.md +10 -1
- package/dist/agent-src/rules/brand-source-of-truth.md +7 -6
- package/dist/agent-src/rules/code-provenance.md +1 -1
- package/dist/agent-src/rules/context-hygiene.md +0 -1
- package/dist/agent-src/rules/design-fidelity.md +12 -13
- package/dist/agent-src/rules/external-reference-deep-dive.md +2 -2
- package/dist/agent-src/rules/fix-what-you-see.md +1 -1
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +14 -15
- package/dist/agent-src/rules/missing-skill-recovery.md +12 -11
- package/dist/agent-src/rules/neighbour-precedence.md +1 -1
- package/dist/agent-src/rules/recurring-criticism.md +1 -1
- package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -2
- package/dist/agent-src/rules/self-repair-loop.md +2 -2
- package/dist/agent-src/rules/token-budget-discipline.md +1 -1
- package/dist/agent-src/scripts/dashboard_mode.ts +4 -1
- package/dist/agent-src/scripts/roadmap_age.ts +175 -0
- package/dist/agent-src/scripts/update_roadmap_progress.ts +10 -2
- package/dist/agent-src/skills/accessibility-auditor/SKILL.md +3 -3
- package/dist/agent-src/skills/agent-security-review/SKILL.md +2 -2
- package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +12 -4
- package/dist/agent-src/skills/ai-code-blindspots/SKILL.md +7 -0
- package/dist/agent-src/skills/ai-council/references/advanced-modes.md +11 -1
- package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +7 -0
- package/dist/agent-src/skills/ai-council/references/execution-modes.md +7 -0
- package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +19 -0
- package/dist/agent-src/skills/ai-council/references/procedure.md +7 -0
- package/dist/agent-src/skills/api-design/SKILL.md +2 -2
- package/dist/agent-src/skills/api-endpoint/SKILL.md +2 -2
- package/dist/agent-src/skills/authz-review/SKILL.md +5 -3
- package/dist/agent-src/skills/blade-ui/SKILL.md +2 -2
- package/dist/agent-src/skills/brand/SKILL.md +7 -3
- package/dist/agent-src/skills/brand-asset-generation/SKILL.md +13 -6
- package/dist/agent-src/skills/brand-audit/SKILL.md +2 -1
- package/dist/agent-src/skills/brand-identity/SKILL.md +5 -4
- package/dist/agent-src/skills/brand-strategy/SKILL.md +5 -4
- package/dist/agent-src/skills/brand-to-tokens/SKILL.md +18 -39
- package/dist/agent-src/skills/brand-to-tokens/templates/marp-brand-deck.md.example +2 -2
- package/dist/agent-src/skills/brand-to-tokens/templates/reveal-brand-deck.yaml +2 -2
- package/dist/agent-src/skills/canvas-design/SKILL.md +12 -2
- package/dist/agent-src/skills/competitive-positioning/SKILL.md +2 -2
- package/dist/agent-src/skills/composer-packages/SKILL.md +18 -0
- package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
- package/dist/agent-src/skills/content-funnel-design/SKILL.md +8 -1
- package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
- package/dist/agent-src/skills/context-document/SKILL.md +2 -2
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +6 -6
- package/dist/agent-src/skills/corpus-grounding/scripts/decision_engine.ts +13 -11
- package/dist/agent-src/skills/corpus-grounding/scripts/ground.mjs +1706 -0
- package/dist/agent-src/skills/corpus-grounding/scripts/schema_validator.ts +7 -1
- package/dist/agent-src/skills/dashboard-design/SKILL.md +1 -1
- package/dist/agent-src/skills/data-flow-mapper/SKILL.md +5 -2
- package/dist/agent-src/skills/database/SKILL.md +5 -4
- package/dist/agent-src/skills/decision-record/references/weighted-matrix.md +12 -0
- package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +1 -1
- package/dist/agent-src/skills/dependency-upgrade/SKILL.md +61 -11
- package/dist/agent-src/skills/description-assist/SKILL.md +1 -1
- package/dist/agent-src/skills/design-intelligence/SKILL.md +1 -1
- package/dist/agent-src/skills/design-intelligence/data/landing.csv +1 -1
- package/dist/agent-src/skills/design-intelligence/references/context-and-registers.md +10 -2
- package/dist/agent-src/skills/design-intelligence/references/design-languages.md +1 -1
- package/dist/agent-src/skills/design-intelligence/references/design-rules-checklist.md +4 -3
- package/dist/agent-src/skills/design-intelligence/references/integration-mapping.md +14 -14
- package/dist/agent-src/skills/{wireframe → design-review}/references/story-beat-ledger.schema.json +1 -1
- package/dist/agent-src/skills/design-review/references/verification-automation.md +11 -3
- package/dist/agent-src/skills/design-system-capture/SKILL.md +15 -10
- package/dist/agent-src/skills/design-system-capture/references/design-system-json.md +20 -5
- package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +2 -2
- package/dist/agent-src/skills/design-tokens/SKILL.md +23 -23
- package/dist/agent-src/skills/design-tokens/scripts/tokens.mjs +1037 -0
- package/dist/agent-src/skills/design-tokens/scripts/tokens.ts +336 -13
- package/dist/agent-src/skills/design-tokens/templates/design-tokens-starter.json +52 -53
- package/dist/agent-src/skills/docker/SKILL.md +1 -1
- package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +14 -276
- package/dist/agent-src/skills/existing-ui-audit/procedure.yaml +44 -0
- package/dist/agent-src/skills/existing-ui-audit/references/anti-slop-cross-reference.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/references/steps/00-inspect-stack-and-input.md +4 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/01-enumerate-components.md +26 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/01b-detect-component-taxonomy.md +7 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/02-identify-design-system.md +12 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/03-detect-design-tokens.md +35 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/04-detect-shadcn-inventory.md +13 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/04b-live-storybook-read.md +26 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/05-list-reusable-patterns.md +14 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/06-match-candidates.md +52 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/07-greenfield-branch.md +29 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/08-a11y-baseline.md +40 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/09-validate-and-write.md +5 -0
- package/dist/agent-src/skills/experiment-loop/SKILL.md +1 -1
- package/dist/agent-src/skills/fe-design/references/design-patterns.md +16 -2
- package/dist/agent-src/skills/fe-design/references/design-read-and-memory.md +1 -1
- package/dist/agent-src/skills/fe-design/references/source-led-port.md +1 -1
- package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +6 -6
- package/dist/agent-src/skills/flux/SKILL.md +1 -1
- package/dist/agent-src/skills/form-handler/SKILL.md +15 -2
- package/dist/agent-src/skills/git-workflow/SKILL.md +2 -2
- package/dist/agent-src/skills/git-workflow/references/branch-update.md +7 -0
- package/dist/agent-src/skills/git-workflow/references/commit-subject.md +12 -0
- package/dist/agent-src/skills/git-workflow/references/push-closes-its-loop.md +10 -0
- package/dist/agent-src/skills/gtm-launch/SKILL.md +8 -1
- package/dist/agent-src/skills/html-deck/SKILL.md +7 -2
- package/dist/agent-src/skills/humanizer/SKILL.md +16 -3
- package/dist/agent-src/skills/humanizer/references/anti-aiisms.md +13 -1
- package/dist/agent-src/skills/humanizer/references/fixtures.md +8 -0
- package/dist/agent-src/skills/js-library-packaging/SKILL.md +5 -4
- package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.mjs +197 -0
- package/dist/agent-src/skills/judge-artifact-completeness/SKILL.md +1 -1
- package/dist/agent-src/skills/judge-security-auditor/SKILL.md +2 -2
- package/dist/agent-src/skills/launch-readiness/SKILL.md +18 -22
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +5 -5
- package/dist/agent-src/skills/livewire/SKILL.md +1 -1
- package/dist/agent-src/skills/llm-provider-knowledge/SKILL.md +18 -0
- package/dist/agent-src/skills/logo-generation/SKILL.md +9 -3
- package/dist/agent-src/skills/market-entry-analysis/SKILL.md +6 -1
- package/dist/agent-src/skills/markitdown/SKILL.md +1 -1
- package/dist/agent-src/skills/memory-consolidation/SKILL.md +2 -2
- package/dist/agent-src/skills/messaging-architecture/SKILL.md +8 -1
- package/dist/agent-src/skills/motion-choreographer/SKILL.md +2 -2
- package/dist/agent-src/skills/playwright-testing/SKILL.md +2 -0
- package/dist/agent-src/skills/positioning-strategy/SKILL.md +10 -2
- package/dist/agent-src/skills/prediction-pool-optimizer/references/ev-fixtures.md +13 -0
- package/dist/agent-src/skills/prediction-pool-optimizer/references/odds-and-bonus.md +7 -0
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +1 -1
- package/dist/agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +1 -1
- package/dist/agent-src/skills/project-analyzer/SKILL.md +14 -75
- package/dist/agent-src/skills/project-analyzer/procedure.yaml +39 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/01-project-overview.md +9 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/02-architecture.md +7 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/03-data-layer.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/04-business-domains.md +7 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/05-api-surface.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/06-service-map.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/07-module-inventory.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/08-infrastructure-and-testing.md +5 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/09-agent-docs-audit.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/10-gap-analysis.md +6 -0
- package/dist/agent-src/skills/quality-tools/references/js-ts-tools.md +10 -0
- package/dist/agent-src/skills/quality-tools/references/php-tools.md +13 -0
- package/dist/agent-src/skills/quality-tools/references/python-tools.md +11 -0
- package/dist/agent-src/skills/react-native-setup/SKILL.md +7 -2
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +5 -1
- package/dist/agent-src/skills/react-shadcn-ui/references/registry.md +13 -0
- package/dist/agent-src/skills/react-shadcn-ui/scripts/shadcn_add.mjs +315 -0
- package/dist/agent-src/skills/react-shadcn-ui/scripts/shadcn_add.ts +6 -6
- package/dist/agent-src/skills/receiving-code-review/SKILL.md +1 -1
- package/dist/agent-src/skills/refine-ticket/SKILL.md +2 -2
- package/dist/agent-src/skills/release-comms/SKILL.md +2 -1
- package/dist/agent-src/skills/repomix-packer/SKILL.md +2 -2
- package/dist/agent-src/skills/requesting-code-review/SKILL.md +3 -3
- package/dist/agent-src/skills/roadmap-management/references/archival.md +3 -3
- package/dist/agent-src/skills/roadmap-management/references/authoring.md +9 -2
- package/dist/agent-src/skills/roadmap-management/references/dashboard.md +3 -3
- package/dist/agent-src/skills/roadmap-management/references/lifecycle.md +3 -3
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +4 -4
- package/dist/agent-src/skills/rtk-output-filtering/SKILL.md +1 -1
- package/dist/agent-src/skills/rule-writing/SKILL.md +1 -2
- package/dist/agent-src/skills/security/SKILL.md +41 -5
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +5 -3
- package/dist/agent-src/skills/skill-reviewer/SKILL.md +1 -1
- package/dist/agent-src/skills/skill-writing/SKILL.md +23 -8
- package/dist/agent-src/skills/skill-writing/references/section-patterns.md +19 -1
- package/dist/agent-src/skills/source-discovery/SKILL.md +3 -3
- package/dist/agent-src/skills/sql-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/standards-from-config/SKILL.md +2 -2
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +5 -0
- package/dist/agent-src/skills/storybook-workshop/scripts/story_contrast_floor.mjs +99 -0
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +13 -13
- package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +4 -3
- package/dist/agent-src/skills/svg-authoring/SKILL.md +7 -1
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +8 -3
- package/dist/agent-src/skills/tailwind-engineer/scripts/tailwind_config_gen.mjs +482 -0
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/threat-modeling/SKILL.md +8 -1
- package/dist/agent-src/skills/threat-modeling/data/manifest.json +5 -2
- package/dist/agent-src/skills/threat-modeling/data/reasoning.csv +10 -10
- package/dist/agent-src/skills/threat-modeling/data/surfaces.csv +11 -10
- package/dist/agent-src/skills/threat-modeling/data/threats.csv +34 -20
- package/dist/agent-src/skills/type-design/SKILL.md +196 -0
- package/dist/agent-src/skills/type-design/references/font-spec.md +90 -0
- package/dist/agent-src/skills/type-design/references/gates.md +113 -0
- package/dist/agent-src/skills/type-design/references/toolchain.md +66 -0
- package/dist/agent-src/skills/typography-system/SKILL.md +21 -11
- package/dist/agent-src/skills/typography-system/references/worked-scales.md +85 -0
- package/dist/agent-src/skills/ui-apply-generic/SKILL.md +1 -1
- package/dist/agent-src/skills/universal-project-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +120 -125
- package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -0
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +1 -1
- package/dist/agent-src/skills/voice-and-tone-design/SKILL.md +71 -2
- package/dist/agent-src/skills/worktree-lifecycle/SKILL.md +16 -14
- package/dist/agent-src/templates/AGENTS.md +1 -1
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/agents/proposal.example.md +1 -1
- package/dist/agent-src/templates/github-workflows/advisories-daily.yml +85 -0
- package/dist/agent-src/templates/roadmaps.md +44 -2
- package/dist/agent-src/templates/scripts/check_memory.ts +2 -2
- package/dist/agent-src/templates/scripts/historical-bug-patterns.example.yml +13 -1
- package/dist/agent-src/templates/scripts/work_engine/cli.ts +17 -0
- package/dist/agent-src/templates/scripts/work_engine/cli_args.ts +10 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +22 -13
- package/dist/agent-src/templates/scripts/work_engine/dispatcher.ts +18 -4
- package/dist/agent-src/templates/scripts/work_engine/procedure/checks.ts +283 -0
- package/dist/agent-src/templates/scripts/work_engine/procedure/run.ts +432 -0
- package/dist/agent-src/templates/scripts/work_engine/procedure/sidecar.ts +185 -0
- package/dist/agent-src/templates/scripts/work_engine/state.ts +3 -0
- package/dist/cli/commands/uiRender.js +72 -17
- package/dist/cli/commands/uiRenderAsset.js +10 -2
- package/dist/cli/commands/uiRenderAssetFonts.js +158 -0
- package/dist/cli/commands/uiRenderAssetTypes.js +8 -20
- package/dist/cli/initRouting.js +1 -1
- package/dist/cli/mcp/dispatch.js +31 -9
- package/dist/cli/python/knowledge_ingest.js +7 -39
- package/dist/cli/python/workspace_secrets.js +4 -177
- package/dist/cli/registry.js +4 -1
- package/dist/cli-delegate/archive_completed_roadmaps.js +3 -2
- package/dist/cli-delegate/check_update_banner.js +635 -266
- package/dist/cli-delegate/{chunk-TMWYUOK4.js → chunk-2CX7NWRB.js} +224 -437
- package/dist/cli-delegate/chunk-2Y5AMLMY.js +136 -0
- package/dist/cli-delegate/chunk-3PK3VZHB.js +235 -0
- package/dist/cli-delegate/{chunk-OKJUIAPS.js → chunk-4E2W63DA.js} +1 -62
- package/dist/cli-delegate/chunk-5VO3RTMV.js +208 -0
- package/dist/cli-delegate/chunk-6E2LDY4F.js +27 -0
- package/dist/cli-delegate/{chunk-XQTPXKFA.js → chunk-6ZD2QZMN.js} +8 -17
- package/dist/cli-delegate/{chunk-6V5FMA3P.js → chunk-7CEI2YPS.js} +1 -1
- package/dist/cli-delegate/{chunk-DMSZHXZS.js → chunk-7DRWULEQ.js} +80 -7
- package/dist/cli-delegate/chunk-7NXCZSDL.js +54 -0
- package/dist/cli-delegate/chunk-AX3U3UWJ.js +328 -0
- package/dist/cli-delegate/{chunk-WOKWX5PL.js → chunk-BKALSTBZ.js} +18 -3
- package/dist/cli-delegate/chunk-BMGUGSY6.js +103 -0
- package/dist/cli-delegate/chunk-BYV46VRM.js +3309 -0
- package/dist/cli-delegate/{chunk-F3QDG2GT.js → chunk-BZJ4Y3CI.js} +259 -159
- package/dist/cli-delegate/{chunk-5GPULQBE.js → chunk-CMZEKSNN.js} +4280 -705
- package/dist/cli-delegate/chunk-DSY6LLCQ.js +127 -0
- package/dist/cli-delegate/{chunk-ZUZKZYCN.js → chunk-E3CFULNX.js} +67 -13
- package/dist/cli-delegate/{chunk-G5VVIZRC.js → chunk-F7HLSW6P.js} +1 -1
- package/dist/cli-delegate/chunk-FIEEOH5C.js +133 -0
- package/dist/cli-delegate/chunk-FKYZOWVD.js +719 -0
- package/dist/cli-delegate/chunk-I4KJYVPB.js +69 -0
- package/dist/cli-delegate/{chunk-JQOM7TTM.js → chunk-IDAOTDPE.js} +1 -100
- package/dist/cli-delegate/chunk-J2SJZICO.js +698 -0
- package/dist/cli-delegate/chunk-KR5ZIFPO.js +581 -0
- package/dist/cli-delegate/{chunk-WQWXGIWB.js → chunk-M6CRG5O6.js} +165 -15
- package/dist/cli-delegate/{chunk-PHD7OOLE.js → chunk-MQ2UDEGV.js} +14 -3
- package/dist/cli-delegate/chunk-NTM7G2V4.js +220 -0
- package/dist/cli-delegate/chunk-PV7S5DPJ.js +175 -0
- package/dist/cli-delegate/chunk-QBHEI5N4.js +919 -0
- package/dist/cli-delegate/{chunk-F7DQWYR5.js → chunk-RAXQOETZ.js} +6 -2
- package/dist/cli-delegate/{chunk-KR6EM23A.js → chunk-TULVDQ4L.js} +3 -48
- package/dist/cli-delegate/chunk-UUYEKXKR.js +20 -0
- package/dist/cli-delegate/{chunk-7XGD2OEU.js → chunk-UXWHY6CQ.js} +2 -1
- package/dist/cli-delegate/{chunk-PWX7CKMD.js → chunk-VC3ECUEK.js} +1 -1
- package/dist/cli-delegate/{chunk-T7XSJSUQ.js → chunk-VYZGJLCA.js} +1000 -814
- package/dist/cli-delegate/chunk-W5JXMF2T.js +77 -0
- package/dist/cli-delegate/{chunk-KXXWJTDO.js → chunk-WMNYVIYX.js} +1 -1
- package/dist/cli-delegate/chunk-XCY5KKUC.js +181 -0
- package/dist/cli-delegate/{chunk-6SRJTYJS.js → chunk-XIAPY44N.js} +37 -16
- package/dist/cli-delegate/{chunk-H76PHZBI.js → chunk-XLY5G3CM.js} +14 -19
- package/dist/cli-delegate/{chunk-6YQC2HLF.js → chunk-YHAPONWV.js} +54 -40
- package/dist/cli-delegate/cmd_adr_effective.js +41 -2
- package/dist/cli-delegate/cmd_analyze_session.js +7 -7
- package/dist/cli-delegate/cmd_brand_status.js +1287 -10
- package/dist/cli-delegate/cmd_ci_settle.js +330 -0
- package/dist/cli-delegate/cmd_conformance.js +487 -820
- package/dist/cli-delegate/cmd_doctor.js +26 -16
- package/dist/cli-delegate/cmd_doctor_neighbours.js +10 -7
- package/dist/cli-delegate/cmd_explain.js +9 -24
- package/dist/cli-delegate/cmd_export.js +15 -12
- package/dist/cli-delegate/cmd_fleet.js +6 -4
- package/dist/cli-delegate/cmd_git_convention.js +8 -4
- package/dist/cli-delegate/cmd_handoff.js +79 -242
- package/dist/cli-delegate/cmd_mcp_available.js +1 -1
- package/dist/cli-delegate/cmd_memory_get.js +4 -2
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +2 -2
- package/dist/cli-delegate/cmd_preflight.js +8 -6
- package/dist/cli-delegate/cmd_prune.js +17 -14
- package/dist/cli-delegate/cmd_route_audit.js +11 -8
- package/dist/cli-delegate/cmd_route_explain.js +649 -16
- package/dist/cli-delegate/cmd_session_recycle.js +15 -6
- package/dist/cli-delegate/cmd_settings_check.js +2 -2
- package/dist/cli-delegate/cmd_settings_get.js +1 -1
- package/dist/cli-delegate/cmd_settings_migrate.js +15 -12
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +17 -14
- package/dist/cli-delegate/cmd_uninstall.js +186 -32
- package/dist/cli-delegate/cmd_update.js +76 -16
- package/dist/cli-delegate/cmd_upgrade.js +38 -7
- package/dist/cli-delegate/cmd_validate.js +17 -14
- package/dist/cli-delegate/cmd_versions.js +1 -1
- package/dist/cli-delegate/dashboard_mode.js +1 -1
- package/dist/cli-delegate/gate_execute.js +4 -3
- package/dist/cli-delegate/roadmap_age.js +22 -0
- package/dist/cli-delegate/roadmap_gates.js +4 -3
- package/dist/cli-delegate/update_roadmap_progress.js +3 -2
- package/dist/cli-delegate/upgrade_unattended-VVL6JLSX.js +541 -0
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +373 -190
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +5 -5
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +21 -16
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +16 -11
- package/dist/hooks/chat_history.chunk.cjs +6852 -0
- package/dist/hooks/chat_history.chunk.cjs.sha256 +1 -0
- package/dist/hooks/dispatch.js +17450 -18612
- package/dist/hooks/dispatch.sha256 +1 -1
- package/dist/hooks/egress_engine.chunk.cjs +915 -0
- package/dist/hooks/egress_engine.chunk.cjs.sha256 +1 -0
- package/dist/hooks/svg_rules.chunk.cjs +281 -49
- package/dist/hooks/svg_rules.chunk.cjs.sha256 +1 -1
- package/dist/install/claudeRuleRewrite.js +10 -3
- package/dist/install/conflict.js +59 -7
- package/dist/install/conflictTracker.js +93 -8
- package/dist/install/detect.js +3 -3
- package/dist/install/hostPermissionsAdapter.js +106 -0
- package/dist/install/install.mjs +3234 -1961
- package/dist/install/installThinLayer.js +2 -1
- package/dist/install/loggedWrites.js +142 -0
- package/dist/install/manifestFiles.js +21 -0
- package/dist/install/noGoDenyRows.js +300 -0
- package/dist/install/noGoRules.js +368 -0
- package/dist/install/ownershipLedger.js +133 -0
- package/dist/install/paths.js +12 -2
- package/dist/install/plan.js +1 -1
- package/dist/install/preflight.js +39 -8
- package/dist/install/preserve.js +96 -13
- package/dist/install/recordedOwnership.js +88 -5
- package/dist/install/rule_scope.js +20 -3
- package/dist/install/stagedRuntime.js +455 -0
- package/dist/install/toolsArg.js +19 -0
- package/dist/install/txlog.js +10 -6
- package/dist/install/userPin.js +47 -0
- package/dist/install/wizard-plan.js +26 -4
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +3 -2
- package/dist/mcp/registry-manifest.json +6 -5
- package/dist/mcp/server.json +3 -3
- package/dist/mcp/server.mjs +10716 -5880
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +7 -12
- package/dist/scripts/_lib/asset_render_record.js +219 -0
- package/dist/scripts/_lib/claude_builtin_names.js +9 -4
- package/dist/scripts/_lib/claude_settings_hooks.js +102 -34
- package/dist/scripts/_lib/egress_rules.js +769 -0
- package/dist/scripts/_lib/environment_detector.js +24 -33
- package/dist/scripts/_lib/global_deploy_inventory.js +146 -9
- package/dist/scripts/_lib/guidelines_lane.js +10 -1
- package/dist/scripts/_lib/identifier_redaction.js +57 -0
- package/dist/scripts/_lib/installed_layer.js +17 -0
- package/dist/scripts/_lib/installed_layer_normalise.js +72 -0
- package/dist/scripts/_lib/lean_projection_mode.js +34 -152
- package/dist/scripts/_lib/project_tree_form.js +118 -0
- package/dist/scripts/_lib/scoped_projection.js +133 -3
- package/dist/scripts/_lib/settings_removed_keys.js +29 -0
- package/dist/scripts/_lib/settings_renamed_keys.js +17 -5
- package/dist/scripts/_lib/subagent_native_fields.js +35 -0
- package/dist/scripts/_lib/svg_filled_counter.js +285 -0
- package/dist/scripts/_lib/svg_rules.js +2 -0
- package/dist/scripts/_lib/ui_surface.js +19 -0
- package/dist/scripts/_lib/verification_command.js +364 -0
- package/dist/scripts/_lib/workspace_secrets.js +229 -0
- package/dist/scripts/ai_council/seat_policy.js +33 -0
- package/dist/scripts/ai_council/transport_resolver.js +9 -10
- package/dist/scripts/condense.js +25 -29
- package/dist/server/io/substituteTemplate.js +2 -2
- package/dist/server/io/yamlIO.js +2 -2
- package/dist/server/routes/install.js +5 -1
- package/dist/server/routes/settings.js +2 -2
- package/dist/server/routes/wizard.js +1 -1
- package/dist/server/schemas/settings.js +22 -16
- package/dist/server/serverInfo.js +1 -1
- package/dist/shared/brandTokenDocument.js +47 -0
- package/dist/shared/brandTokenPaths.js +43 -0
- package/dist/shared/settingsCarveOut.js +0 -7
- package/dist/shared/skillRanking.js +103 -5
- package/dist/shared/userMd/formAdapter.js +16 -0
- package/dist/shared/userMd/schema.js +17 -0
- package/dist/ui/assets/index-w70Ado09.js +23 -0
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +89 -2
- package/docs/THIRD-PARTY-NOTICES.md +27 -0
- package/docs/contracts/settings-classes.md +27 -9
- package/docs/guidelines/agent-infra/api-cost-levers.md +4 -3
- package/docs/guidelines/agent-infra/model-recommendation.md +11 -5
- package/docs/guidelines/agent-infra/rule-body-migration-inventory.md +1 -1
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +47 -24
- package/docs/guidelines/design-antipatterns.md +5 -0
- package/docs/guidelines/design-asset-discipline.md +17 -0
- package/docs/guidelines/design-fidelity-routing.md +1 -0
- package/docs/guidelines/php/api-design.md +10 -1
- package/llms.txt +12 -10
- package/package.json +13 -4
- package/src/agent-src/scripts/dashboard_mode.ts +4 -1
- package/src/agent-src/scripts/roadmap_age.ts +175 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +10 -2
- package/src/agent-src/templates/AGENTS.md +1 -1
- package/src/agent-src/templates/scripts/check_memory.ts +2 -2
- package/src/agent-src/templates/scripts/historical-bug-patterns.example.yml +13 -1
- package/src/agent-src/templates/scripts/work_engine/cli.ts +17 -0
- package/src/agent-src/templates/scripts/work_engine/cli_args.ts +10 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +22 -13
- package/src/agent-src/templates/scripts/work_engine/dispatcher.ts +18 -4
- package/src/agent-src/templates/scripts/work_engine/procedure/checks.ts +283 -0
- package/src/agent-src/templates/scripts/work_engine/procedure/run.ts +432 -0
- package/src/agent-src/templates/scripts/work_engine/procedure/sidecar.ts +185 -0
- package/src/agent-src/templates/scripts/work_engine/state.ts +3 -0
- package/src/config/agent-settings.template.yml +120 -57
- package/src/config/agents-paths.yml +13 -7
- package/src/config/ci-local-parity.yml +45 -1
- package/src/config/continuity-surface.json +51 -2
- package/src/config/depth-audit-samples.json +5 -0
- package/src/config/discovery/command-verbs.yml +1 -0
- package/src/config/dispatch-economy-metrics.json +1 -0
- package/src/config/egress-mutations/class-precedence-swapped.json +7 -0
- package/src/config/egress-mutations/credential-token-restores.json +7 -0
- package/src/config/egress-mutations/iban-checksum-disabled.json +7 -0
- package/src/config/egress-mutations/raw-value-in-the-count-record.json +7 -0
- package/src/config/evaluator-budgets.json +4 -4
- package/src/config/gate-coverage.yml +176 -10
- package/src/config/gate-reachability-exemptions.json +3 -5
- package/src/config/gate-violation-baselines.json +32 -22
- package/src/config/gitignore-block.txt +6 -3
- package/src/config/hook-bundle-budget.json +34 -3
- package/src/config/hook-carrier-probes.json +30 -0
- package/src/config/hook-latency-budget.json +4 -2
- package/src/config/host-injection-effect.json +8 -1
- package/src/config/host-skill-frontmatter-keys.json +56 -0
- package/src/config/layer-form-brakes.json +4 -0
- package/src/config/layer-form-comparison-corpus.json +42 -0
- package/src/config/loop-surfaces.yaml +28 -47
- package/src/config/memory-twin-verdicts.yml +9 -1
- package/src/config/metric-registry.yml +40 -3
- package/src/config/pack-size-budget.json +15 -0
- package/src/config/procedure-core-budget.json +21 -0
- package/src/config/production-entries.json +18 -0
- package/src/config/profiles/minimal.ini +1 -1
- package/src/config/project-tree-form.json +24 -0
- package/src/config/reach-channels.yml +3 -3
- package/src/config/reach-prescriptions-intake.yml +1 -1
- package/src/config/release-gate-locality.yml +0 -7
- package/src/config/roadmap-step-size-baseline.json +118 -0
- package/src/config/routing-coverage-seed.json +93 -2
- package/src/config/skill-body-budget.json +686 -0
- package/src/config/skill-fork-pilot.json +17 -0
- package/src/config/skill-lifecycle-probes-codex.json +57 -0
- package/src/config/skill-lifecycle-probes.json +57 -0
- package/src/config/skill-output-shape.json +316 -0
- package/src/config/step-depth-table.json +58 -0
- package/src/config/turnaround-budget.json +90 -0
- package/src/install/claudeRuleRewrite.ts +10 -1
- package/src/install/conflict.ts +61 -6
- package/src/install/conflictTracker.ts +143 -9
- package/src/install/detect.ts +3 -3
- package/src/install/hostPermissionsAdapter.ts +136 -0
- package/src/install/installThinLayer.ts +12 -1
- package/src/install/loggedWrites.ts +148 -0
- package/src/install/manifestFiles.ts +24 -0
- package/src/install/noGoDenyRows.ts +368 -0
- package/src/install/noGoRules.ts +438 -0
- package/src/install/ownershipLedger.ts +180 -0
- package/src/install/paths.ts +11 -2
- package/src/install/plan.ts +1 -1
- package/src/install/preflight.ts +42 -10
- package/src/install/preserve.ts +131 -13
- package/src/install/recordedOwnership.ts +121 -3
- package/src/install/rule_scope.ts +20 -3
- package/src/install/stagedRuntime.ts +528 -0
- package/src/install/toolsArg.ts +16 -0
- package/src/install/txlog.ts +10 -6
- package/src/install/types.ts +23 -2
- package/src/install/userPin.ts +54 -0
- package/src/install/wizard-plan.ts +25 -4
- package/src/scripts/_cli/_doctor_emit.ts +24 -0
- package/src/scripts/_cli/cmd_brand_status.ts +223 -12
- package/src/scripts/_cli/cmd_ci_settle.ts +32 -0
- package/src/scripts/_cli/cmd_conformance.ts +3 -2
- package/src/scripts/_cli/cmd_doctor.ts +23 -44
- package/src/scripts/_cli/cmd_route_explain.ts +176 -2
- package/src/scripts/_cli/cmd_uninstall.ts +270 -26
- package/src/scripts/_cli/cmd_update.ts +49 -18
- package/src/scripts/_cli/cmd_upgrade.ts +38 -2
- package/src/scripts/_cli/detection_report.ts +7 -0
- package/src/scripts/_cli/doctor_execution.ts +1 -2
- package/src/scripts/_cli/doctor_install_mode.ts +39 -0
- package/src/scripts/_cli/doctor_network_posture.ts +3 -3
- package/src/scripts/_cli/doctor_ownership_ledger.ts +126 -0
- package/src/scripts/_cli/doctor_update_verdict.ts +104 -0
- package/src/scripts/_cli/explain_last/scrubber.ts +9 -21
- package/src/scripts/_cli/upgrade_unattended.ts +548 -0
- package/src/scripts/_dispatch.bash +42 -9
- package/src/scripts/_lib/activation_ladder.ts +1 -1
- package/src/scripts/_lib/advisory_inventory.ts +405 -0
- package/src/scripts/_lib/advisory_notice.ts +270 -0
- package/src/scripts/_lib/advisory_sources.ts +752 -0
- package/src/scripts/_lib/advisory_verdicts.ts +363 -0
- package/src/scripts/_lib/agent_artifact_location.ts +177 -0
- package/src/scripts/_lib/agent_settings.ts +7 -12
- package/src/scripts/_lib/arrival_record.ts +217 -0
- package/src/scripts/_lib/asset_render_record.ts +247 -0
- package/src/scripts/_lib/billing_grant.ts +4 -2
- package/src/scripts/_lib/brand_voice_slot.ts +258 -0
- package/src/scripts/_lib/canary_status.ts +24 -0
- package/src/scripts/_lib/cc_transcript.ts +276 -0
- package/src/scripts/_lib/changelog_eras.ts +83 -0
- package/src/scripts/_lib/claim_phrases.ts +71 -0
- package/src/scripts/_lib/classify_update.ts +171 -0
- package/src/scripts/_lib/claude_builtin_names.ts +9 -4
- package/src/scripts/_lib/claude_hook_scope.ts +195 -0
- package/src/scripts/_lib/claude_settings_hooks.ts +118 -34
- package/src/scripts/_lib/codex_resident_set.ts +460 -0
- package/src/scripts/_lib/codex_skill_finder.ts +225 -0
- package/src/scripts/_lib/confusables.ts +19 -0
- package/src/scripts/_lib/consumer_impact.ts +199 -0
- package/src/scripts/_lib/content_class.ts +127 -0
- package/src/scripts/_lib/council_settings_block.ts +9 -2
- package/src/scripts/_lib/counted_probe.ts +68 -1
- package/src/scripts/_lib/credential_deny_rows.ts +151 -0
- package/src/scripts/_lib/credential_files.ts +367 -0
- package/src/scripts/_lib/delivery_arm_experiment.ts +2 -2
- package/src/scripts/_lib/depth_flip.ts +141 -0
- package/src/scripts/_lib/design_lock.ts +117 -0
- package/src/scripts/_lib/design_sync_ledger.ts +142 -0
- package/src/scripts/_lib/design_sync_plan.ts +177 -0
- package/src/scripts/_lib/design_sync_reconcile.ts +159 -0
- package/src/scripts/_lib/design_sync_verify.ts +99 -0
- package/src/scripts/_lib/design_system_claude_design.ts +323 -0
- package/src/scripts/_lib/design_system_import.ts +84 -6
- package/src/scripts/_lib/dispatch_import_closure.ts +42 -11
- package/src/scripts/_lib/egress_credential_env.ts +35 -0
- package/src/scripts/_lib/egress_engine.ts +22 -0
- package/src/scripts/_lib/egress_known_values.ts +223 -0
- package/src/scripts/_lib/egress_normalize.ts +67 -0
- package/src/scripts/_lib/egress_prefixes.ts +42 -0
- package/src/scripts/_lib/egress_rules.ts +899 -0
- package/src/scripts/_lib/egress_rules_linearity.ts +56 -0
- package/src/scripts/_lib/egress_sender_scan.ts +290 -0
- package/src/scripts/_lib/egress_session_table.ts +510 -0
- package/src/scripts/_lib/egress_text.ts +63 -0
- package/src/scripts/_lib/egress_token.ts +252 -0
- package/src/scripts/_lib/empty_cycles.ts +1 -1
- package/src/scripts/_lib/environment_detector.ts +45 -30
- package/src/scripts/_lib/exemption_shape.ts +75 -1
- package/src/scripts/_lib/floor_posture.ts +185 -0
- package/src/scripts/_lib/forge_protection.ts +140 -2
- package/src/scripts/_lib/global_deploy_inventory.ts +159 -6
- package/src/scripts/_lib/guidelines_lane.ts +12 -1
- package/src/scripts/_lib/hand_kinds.ts +65 -0
- package/src/scripts/_lib/headless_invocation.ts +3 -3
- package/src/scripts/_lib/host_capability.ts +44 -7
- package/src/scripts/_lib/host_env_write.ts +39 -18
- package/src/scripts/_lib/host_listing_model.ts +14 -7
- package/src/scripts/_lib/identifier_redaction.ts +62 -0
- package/src/scripts/_lib/impact_bump.ts +70 -0
- package/src/scripts/_lib/install_reach_checks.ts +53 -1
- package/src/scripts/_lib/installed_layer.ts +31 -0
- package/src/scripts/_lib/installed_layer_normalise.ts +75 -0
- package/src/scripts/_lib/instructions_loaded_classify.ts +75 -0
- package/src/scripts/_lib/instructions_loaded_event.ts +53 -0
- package/src/scripts/_lib/knowledge_global_redaction.ts +2 -2
- package/src/scripts/_lib/layer_form_corpus.ts +165 -0
- package/src/scripts/_lib/layer_form_decision.ts +248 -0
- package/src/scripts/_lib/layer_form_evidence.ts +112 -0
- package/src/scripts/_lib/lean_projection_mode.ts +32 -161
- package/src/scripts/_lib/llm_proposer_transport.ts +1 -0
- package/src/scripts/_lib/loop_guards.ts +8 -120
- package/src/scripts/_lib/major_surface.ts +207 -0
- package/src/scripts/_lib/mcp_bridge.ts +30 -69
- package/src/scripts/_lib/merge_clearance_record.ts +384 -0
- package/src/scripts/_lib/neighbour_census.ts +18 -1
- package/src/scripts/_lib/orchestration_record.ts +61 -0
- package/src/scripts/_lib/outcome_vocabularies.ts +15 -23
- package/src/scripts/_lib/pin_advice.ts +49 -0
- package/src/scripts/_lib/platform_anchor.ts +222 -0
- package/src/scripts/_lib/price_freshness.ts +112 -0
- package/src/scripts/_lib/procedure_checks.ts +5 -0
- package/src/scripts/_lib/production_reach.ts +194 -0
- package/src/scripts/_lib/project_tree_form.ts +134 -0
- package/src/scripts/_lib/projection_key_migration.ts +122 -0
- package/src/scripts/_lib/prompt_shape.ts +13 -2
- package/src/scripts/_lib/provenance_verify.ts +272 -0
- package/src/scripts/_lib/quota_parked.ts +29 -14
- package/src/scripts/_lib/ratification_artifact.ts +64 -1
- package/src/scripts/_lib/ratification_subject.ts +508 -46
- package/src/scripts/_lib/release_findings_ingest.ts +36 -311
- package/src/scripts/_lib/release_highlights.ts +72 -2
- package/src/scripts/_lib/release_settings_surface.ts +392 -0
- package/src/scripts/_lib/review_round.ts +134 -0
- package/src/scripts/_lib/roadmap_checkboxes.ts +1 -1
- package/src/scripts/_lib/roadmap_slug_lock.ts +254 -0
- package/src/scripts/_lib/roadmap_step_size.ts +75 -0
- package/src/scripts/_lib/run_checkpoint.ts +60 -3
- package/src/scripts/_lib/runtime_wiring_checks.ts +15 -1
- package/src/scripts/_lib/scope_guard.sh +64 -5
- package/src/scripts/_lib/scoped_projection.ts +136 -3
- package/src/scripts/_lib/secret_detector.ts +24 -103
- package/src/scripts/_lib/security_fix.ts +429 -0
- package/src/scripts/_lib/security_fix_context.ts +133 -0
- package/src/scripts/_lib/self_repair.ts +69 -39
- package/src/scripts/_lib/self_repair_outgoing.ts +209 -0
- package/src/scripts/_lib/self_repair_payload.ts +86 -0
- package/src/scripts/_lib/session_eol.ts +3 -0
- package/src/scripts/_lib/session_pr_watch.ts +207 -0
- package/src/scripts/_lib/session_register.ts +51 -1
- package/src/scripts/_lib/session_tag.ts +51 -0
- package/src/scripts/_lib/settings_removed_keys.ts +30 -0
- package/src/scripts/_lib/settings_renamed_keys.ts +19 -5
- package/src/scripts/_lib/skill_catalogue.ts +66 -25
- package/src/scripts/_lib/skill_fork_pilot.ts +121 -0
- package/src/scripts/_lib/skill_leases.ts +203 -0
- package/src/scripts/_lib/skill_listing_overrides.ts +294 -0
- package/src/scripts/_lib/skill_materialisation.ts +388 -0
- package/src/scripts/_lib/skill_materialisation_gate.ts +210 -0
- package/src/scripts/_lib/skill_materialisation_lock.ts +149 -0
- package/src/scripts/_lib/skill_materialisation_triggers.ts +96 -0
- package/src/scripts/_lib/skill_origin.ts +21 -1
- package/src/scripts/_lib/skill_reach.ts +342 -0
- package/src/scripts/_lib/source_shape.ts +7 -2
- package/src/scripts/_lib/sqlite_guard.ts +1 -1
- package/src/scripts/_lib/step_anatomy.ts +330 -0
- package/src/scripts/_lib/subagent_capsule.ts +8 -2
- package/src/scripts/_lib/subagent_native_fields.ts +30 -0
- package/src/scripts/_lib/subagent_spawn.ts +36 -0
- package/src/scripts/_lib/subagent_steering.ts +367 -0
- package/src/scripts/_lib/svg_filled_counter.ts +287 -0
- package/src/scripts/_lib/svg_rules.ts +2 -0
- package/src/scripts/_lib/test_delta.ts +89 -6
- package/src/scripts/_lib/tier_downshift_verdict.ts +268 -0
- package/src/scripts/_lib/tool_result_census.ts +62 -0
- package/src/scripts/_lib/trigger_routers.ts +1 -0
- package/src/scripts/_lib/turnaround_throughput.ts +378 -0
- package/src/scripts/_lib/ui_surface.ts +22 -0
- package/src/scripts/_lib/unattended_gates.ts +100 -0
- package/src/scripts/_lib/undeployed_fixes.ts +34 -0
- package/src/scripts/_lib/update_check.ts +143 -12
- package/src/scripts/_lib/update_invite.ts +116 -0
- package/src/scripts/_lib/update_notice.ts +259 -0
- package/src/scripts/_lib/verify_clause.ts +4 -2
- package/src/scripts/_lib/version_order.ts +146 -0
- package/src/scripts/_lib/worker_reuse.ts +191 -0
- package/src/scripts/_lib/workspace_secrets.ts +273 -0
- package/src/scripts/_lib/worktree_git.ts +67 -0
- package/src/scripts/_lib/worktree_ignored.ts +116 -0
- package/src/scripts/adoption_status.ts +330 -3
- package/src/scripts/adr_cite_check.ts +93 -0
- package/src/scripts/advisories.ts +803 -0
- package/src/scripts/ai-image/adapters/flux.sh +1 -0
- package/src/scripts/ai-image/adapters/gemini-image.sh +1 -0
- package/src/scripts/ai-image/adapters/ideogram.sh +1 -0
- package/src/scripts/ai-image/adapters/recraft.sh +1 -0
- package/src/scripts/ai-video/adapters/comfyui.sh +1 -0
- package/src/scripts/ai-video/adapters/fal.sh +1 -0
- package/src/scripts/ai-video/adapters/gemini-veo.sh +1 -0
- package/src/scripts/ai-video/adapters/higgsfield.sh +1 -0
- package/src/scripts/ai-video/adapters/kling.sh +1 -0
- package/src/scripts/ai-video/adapters/musetalk.sh +1 -0
- package/src/scripts/ai-video/adapters/openai-images.sh +1 -0
- package/src/scripts/ai-video/adapters/replicate.sh +1 -0
- package/src/scripts/ai-video/adapters/sora.sh +1 -0
- package/src/scripts/ai-video/adapters/syncso.sh +1 -0
- package/src/scripts/ai-video/stitch.sh +115 -2
- package/src/scripts/ai_council/airgap.ts +1 -0
- package/src/scripts/ai_council/api_transport.ts +27 -4
- package/src/scripts/ai_council/budget_guard.ts +300 -11
- package/src/scripts/ai_council/bundler.ts +20 -29
- package/src/scripts/ai_council/chairman.ts +20 -2
- package/src/scripts/ai_council/cli_agency_bounds.ts +158 -0
- package/src/scripts/ai_council/cli_launch_env.ts +54 -0
- package/src/scripts/ai_council/cli_least_agency_canary.ts +18 -2
- package/src/scripts/ai_council/clients.ts +56 -73
- package/src/scripts/ai_council/config.ts +16 -22
- package/src/scripts/ai_council/council_egress.ts +167 -0
- package/src/scripts/ai_council/exposure_ledger.ts +117 -0
- package/src/scripts/ai_council/free_hand_shadow.ts +288 -0
- package/src/scripts/ai_council/free_route.ts +216 -0
- package/src/scripts/ai_council/free_route_catalog.ts +310 -0
- package/src/scripts/ai_council/free_route_client.ts +99 -0
- package/src/scripts/ai_council/free_rung.ts +61 -0
- package/src/scripts/ai_council/hand_payload.ts +338 -0
- package/src/scripts/ai_council/hand_schemas.ts +123 -0
- package/src/scripts/ai_council/jury_aggregate.ts +155 -1
- package/src/scripts/ai_council/kind_flip.ts +221 -0
- package/src/scripts/ai_council/kind_flip_state.ts +19 -0
- package/src/scripts/ai_council/learn_low_impact_preview.ts +50 -22
- package/src/scripts/ai_council/modification_review.ts +98 -5
- package/src/scripts/ai_council/necessity.ts +7 -0
- package/src/scripts/ai_council/orchestrator.ts +23 -26
- package/src/scripts/ai_council/pricing.ts +10 -0
- package/src/scripts/ai_council/redact_low_impact_entry.ts +5 -2
- package/src/scripts/ai_council/response_render.ts +27 -4
- package/src/scripts/ai_council/round_reservations.ts +119 -0
- package/src/scripts/ai_council/route_chooser.ts +161 -0
- package/src/scripts/ai_council/route_liveness.ts +152 -0
- package/src/scripts/ai_council/route_member.ts +114 -0
- package/src/scripts/ai_council/seat_policy.ts +47 -0
- package/src/scripts/ai_council/seat_resume.ts +40 -0
- package/src/scripts/ai_council/self_hosted_probe.ts +327 -0
- package/src/scripts/ai_council/shadow_dispatch.ts +13 -3
- package/src/scripts/ai_council/spend_gate.ts +18 -2
- package/src/scripts/ai_council/status_surface.ts +39 -0
- package/src/scripts/ai_council/transport_resolver.ts +15 -18
- package/src/scripts/analysis_analysts.ts +226 -0
- package/src/scripts/analysis_anchors.ts +140 -0
- package/src/scripts/analysis_and_optimize.ts +44 -0
- package/src/scripts/analysis_emit.ts +150 -0
- package/src/scripts/analysis_exchange.ts +186 -0
- package/src/scripts/analysis_gate.ts +158 -0
- package/src/scripts/analysis_inbox_final.ts +173 -0
- package/src/scripts/analysis_ledger.ts +119 -0
- package/src/scripts/analysis_pr_optimize.ts +219 -0
- package/src/scripts/analysis_pr_review.ts +240 -0
- package/src/scripts/analysis_pr_target.ts +121 -0
- package/src/scripts/analysis_prompts.ts +130 -0
- package/src/scripts/analysis_publish.ts +358 -0
- package/src/scripts/analysis_questions.ts +78 -0
- package/src/scripts/analysis_run.ts +248 -0
- package/src/scripts/analysis_run_record.ts +210 -0
- package/src/scripts/analysis_target.ts +343 -0
- package/src/scripts/analysis_validate.ts +161 -0
- package/src/scripts/anchor_eval_falsify.ts +1 -1
- package/src/scripts/arrival_report.ts +115 -0
- package/src/scripts/ask_transport.ts +406 -35
- package/src/scripts/backfill_model_tier.ts +4 -5
- package/src/scripts/before_complete_hook.ts +48 -2
- package/src/scripts/bench_hook_latency.ts +3 -3
- package/src/scripts/bench_procedure_cursor.ts +440 -0
- package/src/scripts/bootstrap.sh +3 -3
- package/src/scripts/build_exit_code_register.ts +440 -0
- package/src/scripts/build_proof.ts +23 -1
- package/src/scripts/cache_realization_report.ts +155 -14
- package/src/scripts/canary_liveness.ts +117 -0
- package/src/scripts/chat_history.ts +12 -15
- package/src/scripts/check_account_surface.ts +318 -0
- package/src/scripts/check_agent_artifact_location.ts +17 -160
- package/src/scripts/check_bundle_path_leakage.ts +6 -0
- package/src/scripts/check_ci_local_parity.ts +21 -13
- package/src/scripts/check_claims.ts +77 -2
- package/src/scripts/check_completion_review.ts +34 -1
- package/src/scripts/check_concern_admissions.ts +41 -5
- package/src/scripts/check_consumer_scope_flip.ts +1 -1
- package/src/scripts/check_context_paths.ts +2 -0
- package/src/scripts/check_council_layout.ts +9 -0
- package/src/scripts/check_credential_spelling.ts +267 -0
- package/src/scripts/check_egress_mutations.ts +239 -0
- package/src/scripts/check_enforcement_coverage.ts +16 -3
- package/src/scripts/check_estate_count.ts +16 -1
- package/src/scripts/check_finding_dispositions.ts +174 -73
- package/src/scripts/check_gate_coverage.ts +123 -21
- package/src/scripts/check_gate_reachability.ts +16 -2
- package/src/scripts/check_generator_sync.ts +46 -0
- package/src/scripts/check_hook_bundle_composition.ts +139 -1
- package/src/scripts/check_host_docs_digest.ts +142 -5
- package/src/scripts/check_kernel_edit_ratified.ts +301 -76
- package/src/scripts/check_kernel_rule_bundle.ts +14 -10
- package/src/scripts/check_knowledge_cards.ts +83 -3
- package/src/scripts/check_memory.ts +13 -3
- package/src/scripts/check_pack_size.ts +1 -1
- package/src/scripts/check_permission_deny_syntax.ts +247 -0
- package/src/scripts/check_platform_anchor.ts +243 -0
- package/src/scripts/check_proposal.ts +183 -1
- package/src/scripts/check_reach_channels.ts +5 -3
- package/src/scripts/check_references.ts +5 -2
- package/src/scripts/check_release_manifest_content.ts +33 -0
- package/src/scripts/check_release_pr_shape.ts +8 -3
- package/src/scripts/check_rule_invariants.ts +9 -1
- package/src/scripts/check_skill_body_budget.ts +343 -0
- package/src/scripts/check_skill_requires.ts +137 -1
- package/src/scripts/check_step_production_reach.ts +257 -0
- package/src/scripts/check_step_receipts.ts +246 -0
- package/src/scripts/check_structural_breaking.ts +7 -1
- package/src/scripts/check_suppression_hygiene.ts +8 -0
- package/src/scripts/check_test_weakening.ts +14 -0
- package/src/scripts/check_token_quality_golden.ts +5 -1
- package/src/scripts/check_update_banner.ts +50 -3
- package/src/scripts/check_verify_expectation_delta.ts +2 -1
- package/src/scripts/check_voice_lexicon.ts +531 -0
- package/src/scripts/ci_os_attribution.ts +327 -0
- package/src/scripts/ci_platform_scope.ts +69 -0
- package/src/scripts/ci_settle.ts +4 -1
- package/src/scripts/ci_status.ts +0 -1
- package/src/scripts/ci_time_to_green.ts +748 -0
- package/src/scripts/classify_merge_risk.ts +407 -19
- package/src/scripts/code_graph/sqlite_store.ts +1 -1
- package/src/scripts/compile_trigger_evals.ts +353 -0
- package/src/scripts/condense.ts +25 -31
- package/src/scripts/consumer_matrix.ts +61 -3
- package/src/scripts/council_availability_hook.ts +12 -4
- package/src/scripts/council_cli.ts +56 -44
- package/src/scripts/cross_repo_retrieve.ts +9 -72
- package/src/scripts/design_lock.ts +106 -0
- package/src/scripts/design_slop_rules.ts +30 -0
- package/src/scripts/design_sync.ts +264 -0
- package/src/scripts/design_system_import.ts +30 -13
- package/src/scripts/dispatch_economy_report.ts +46 -1
- package/src/scripts/dispatch_r2_reviewer.ts +41 -5
- package/src/scripts/egress_canary.ts +166 -0
- package/src/scripts/egress_sender_census.ts +101 -0
- package/src/scripts/external_sources_denylist.json +94 -12
- package/src/scripts/generate_catalog.ts +6 -2
- package/src/scripts/generate_owned_digest.ts +163 -0
- package/src/scripts/generate_reference_toc.ts +143 -0
- package/src/scripts/generate_subagent_floor.ts +11 -1
- package/src/scripts/handoff_context_hook.ts +34 -0
- package/src/scripts/hook_carrier_census.ts +263 -0
- package/src/scripts/hook_chunks.d.mts +12 -0
- package/src/scripts/hook_chunks.mjs +114 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +68 -42
- package/src/scripts/hooks/block_config_weakening.ts +127 -3
- package/src/scripts/hooks/block_credential_reads.ts +165 -0
- package/src/scripts/hooks/block_no_verify.ts +47 -23
- package/src/scripts/hooks/block_speaking_inbox_dir.ts +38 -7
- package/src/scripts/hooks/category_a.ts +202 -25
- package/src/scripts/hooks/concern_failure_policy.ts +6 -6
- package/src/scripts/hooks/concern_registry.ts +31 -6
- package/src/scripts/hooks/concern_registry_types.ts +11 -0
- package/src/scripts/hooks/delegation_nudge_hook.ts +105 -15
- package/src/scripts/hooks/design_pass_hook.ts +42 -10
- package/src/scripts/hooks/dispatch_hook.ts +14 -13
- package/src/scripts/hooks/egress_engine_loader.ts +125 -0
- package/src/scripts/hooks/egress_stage.ts +440 -0
- package/src/scripts/hooks/hook_stdin.ts +29 -4
- package/src/scripts/hooks/host_docs_pages.ts +194 -0
- package/src/scripts/hooks/host_docs_pages.yaml +75 -0
- package/src/scripts/hooks/host_lowering.json +1 -1
- package/src/scripts/hooks/host_lowering.yaml +22 -21
- package/src/scripts/hooks/host_rate_marker_hook.ts +73 -0
- package/src/scripts/hooks/instructions_observer_hook.ts +170 -0
- package/src/scripts/hooks/interruption_ledger_hook.ts +1 -1
- package/src/scripts/hooks/lazy_concern.ts +148 -0
- package/src/scripts/hooks/orchestration_record_hook.ts +80 -2
- package/src/scripts/hooks/payload_stub.ts +43 -6
- package/src/scripts/hooks/permission_gate.ts +7 -7
- package/src/scripts/hooks/push_settle_hook.ts +32 -3
- package/src/scripts/hooks/replay_hook.ts +43 -0
- package/src/scripts/hooks/reread_guard_hook.ts +87 -10
- package/src/scripts/hooks/rtk_wrap_hook.ts +4 -3
- package/src/scripts/hooks/rule_inject_hook.ts +8 -1
- package/src/scripts/hooks/session_eol_hook.ts +48 -1
- package/src/scripts/hooks/source_first_gate_hook.ts +6 -8
- package/src/scripts/hooks/spawn_guard_shadow_hook.ts +162 -10
- package/src/scripts/hooks/state_io.ts +2 -2
- package/src/scripts/hooks/subagent_ledger_hook.ts +80 -0
- package/src/scripts/hooks/svg_obligation.ts +75 -19
- package/src/scripts/hooks/tool_result_bytes_hook.ts +14 -5
- package/src/scripts/hooks/turn_end_gate_hook.ts +1 -1
- package/src/scripts/hooks/ui_route_nudge_hook.ts +2 -12
- package/src/scripts/hooks_doctor.ts +31 -0
- package/src/scripts/hooks_status.ts +58 -3
- package/src/scripts/inbox_source_census.ts +74 -13
- package/src/scripts/install +25 -3
- package/src/scripts/install.ts +61 -92
- package/src/scripts/interruption_report.ts +11 -1
- package/src/scripts/layer_baseline_report.ts +267 -0
- package/src/scripts/learning_sidecar.ts +1 -1
- package/src/scripts/lint_agents_layout.ts +3 -0
- package/src/scripts/lint_blocker_citations.ts +104 -0
- package/src/scripts/lint_breaking_changes_index.ts +40 -7
- package/src/scripts/lint_consolidation_lineage.ts +144 -16
- package/src/scripts/lint_consumer_internal_refs.ts +90 -42
- package/src/scripts/lint_context_spine_usage.ts +21 -0
- package/src/scripts/lint_decision_classes.ts +34 -0
- package/src/scripts/lint_design_antipattern_parity.ts +39 -7
- package/src/scripts/lint_evidence_artifacts.ts +31 -0
- package/src/scripts/lint_example_fences.ts +11 -2
- package/src/scripts/lint_ghostwriter_source.ts +42 -10
- package/src/scripts/lint_hook_manifest.ts +118 -0
- package/src/scripts/lint_marketplace_install_completeness.ts +4 -0
- package/src/scripts/lint_mcp_config_security.ts +9 -11
- package/src/scripts/lint_plan_risk_register.ts +28 -1
- package/src/scripts/lint_positioning.ts +4 -4
- package/src/scripts/lint_provenance.ts +1 -0
- package/src/scripts/lint_roadmap_blockers.ts +114 -4
- package/src/scripts/lint_roadmap_complexity.ts +98 -0
- package/src/scripts/lint_skill_link_reach.ts +251 -9
- package/src/scripts/lint_skill_procedures.ts +252 -0
- package/src/scripts/lint_skill_scripts_readonly.ts +12 -1
- package/src/scripts/lint_subagent_determinism.ts +14 -1
- package/src/scripts/lint_ticked_unmet_criteria.ts +300 -21
- package/src/scripts/mcp_registry_submit.sh +2 -2
- package/src/scripts/mcp_server/consumer_tool_catalog.json +4 -4
- package/src/scripts/mcp_server/suggest_skill.ts +89 -4
- package/src/scripts/mcp_server/tools.ts +2 -33
- package/src/scripts/measure_skill_ranker_baseline.ts +203 -5
- package/src/scripts/measure_turn_end_gate.ts +61 -1
- package/src/scripts/merge_clearance.ts +225 -0
- package/src/scripts/migrate_command_suggestions.ts +1 -1
- package/src/scripts/network_sources.ts +236 -0
- package/src/scripts/no_go_deny_rows.ts +225 -0
- package/src/scripts/orchestration_record.ts +15 -2
- package/src/scripts/plan_test_shards.ts +103 -0
- package/src/scripts/pr_url_reminder_hook.ts +10 -0
- package/src/scripts/print_required_checks.ts +5 -5
- package/src/scripts/probe_depth_shadow.ts +406 -0
- package/src/scripts/probe_turnaround.ts +342 -10
- package/src/scripts/ratification_subject.ts +176 -0
- package/src/scripts/rdp_gate_classify.ts +1 -0
- package/src/scripts/rdp_quality_eval.ts +1 -0
- package/src/scripts/release.ts +31 -64
- package/src/scripts/release_drill.ts +63 -188
- package/src/scripts/release_env.ts +37 -0
- package/src/scripts/release_publication.ts +11 -10
- package/src/scripts/report_consumer_gate_reach.ts +233 -0
- package/src/scripts/report_merge_gate_load.ts +295 -0
- package/src/scripts/report_production_reach.ts +35 -0
- package/src/scripts/report_project_contract.ts +123 -0
- package/src/scripts/report_reducible_classes.ts +342 -0
- package/src/scripts/report_required_checks_drift.ts +5 -3
- package/src/scripts/report_skill_host_census.ts +199 -0
- package/src/scripts/report_standing_payload_by_host.ts +7 -7
- package/src/scripts/retro.ts +758 -0
- package/src/scripts/retro_facts.ts +575 -0
- package/src/scripts/retro_queue.ts +739 -0
- package/src/scripts/retro_session_facts.ts +218 -0
- package/src/scripts/retro_sweep.ts +493 -0
- package/src/scripts/retro_triage.ts +126 -0
- package/src/scripts/roadmap_context.ts +2 -2
- package/src/scripts/roadmap_drain_queue.ts +601 -0
- package/src/scripts/run_supervise.ts +24 -2
- package/src/scripts/schemas/agent-settings.schema.json +0 -16
- package/src/scripts/schemas/command.schema.json +3 -3
- package/src/scripts/schemas/review-findings.schema.json +8 -0
- package/src/scripts/schemas/skill.schema.json +7 -6
- package/src/scripts/schemas/subagent.schema.json +33 -2
- package/src/scripts/score_skill_selection.ts +5 -2
- package/src/scripts/second_brain_retrieval.ts +1 -0
- package/src/scripts/second_brain_run.ts +1 -0
- package/src/scripts/self_repair_cli.ts +563 -87
- package/src/scripts/self_review_gate.ts +59 -4
- package/src/scripts/session_register_hook.ts +91 -4
- package/src/scripts/sessions_cli.ts +100 -5
- package/src/scripts/skill_collision_clusters.ts +1 -1
- package/src/scripts/skill_tools/score_skill_relevance.ts +31 -2
- package/src/scripts/skill_trigger_eval.ts +4 -2
- package/src/scripts/source_adapters.ts +183 -0
- package/src/scripts/step_receipt.ts +100 -0
- package/src/scripts/sync_pr_branch.ts +4 -0
- package/src/scripts/test_council_qualification.ts +1 -1
- package/src/scripts/trigger_eval_grandfather.json +3 -49
- package/src/scripts/trigger_eval_rotation.ts +31 -3
- package/src/scripts/ui_conformance_probe.ts +405 -1
- package/src/scripts/update_counts.ts +230 -11
- package/src/scripts/update_invite_hook.ts +245 -0
- package/src/scripts/update_notice_hook.ts +298 -0
- package/src/scripts/validate_frontmatter.ts +85 -0
- package/src/scripts/worker_reuse_shadow_report.ts +519 -0
- package/src/scripts/worktree_cleanup_check.ts +915 -121
- package/src/server/io/yamlIO.ts +2 -2
- package/src/server/schemas/settings.ts +37 -23
- package/src/shared/brandTokenDocument.ts +46 -0
- package/src/shared/brandTokenPaths.ts +43 -0
- package/src/shared/settingsCarveOut.ts +0 -8
- package/src/shared/skillRanking.ts +106 -5
- package/src/shared/userMd/formAdapter.ts +15 -1
- package/src/shared/userMd/schema.ts +22 -0
- package/src/templates/agent-user.md +4 -0
- package/src/templates/agent-user.yml +4 -0
- package/dist/cli-delegate/chunk-4DBG5K7M.js +0 -1123
- package/dist/cli-delegate/chunk-523HCFYO.js +0 -90
- package/dist/cli-delegate/chunk-A4QJ6ENT.js +0 -50
- package/dist/cli-delegate/chunk-AL3RZ22D.js +0 -74
- package/dist/cli-delegate/chunk-KB5FZ655.js +0 -208
- package/dist/cli-delegate/chunk-MDPPKQCQ.js +0 -875
- package/dist/cli-delegate/chunk-OAFSJBHH.js +0 -272
- package/dist/ui/assets/index-C3djEJah.js +0 -23
- package/src/scripts/_lib/continuation_ladder.ts +0 -335
- package/src/scripts/hooks/run_continuation_hook.ts +0 -1524
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A council member reached over an OpenAI-compatible `base_url` — a route the
|
|
3
|
+
* package does not pay for by default.
|
|
4
|
+
*
|
|
5
|
+
* Kept out of `config.ts` and `clients.ts`, which both sit far past the source
|
|
6
|
+
* ceiling. Imports no client code: `config.ts` loads this and is itself in the
|
|
7
|
+
* hook bundle. The client is `free_route_client.ts`.
|
|
8
|
+
*
|
|
9
|
+
* The rules, each failing toward the metered or restricted side:
|
|
10
|
+
*
|
|
11
|
+
* - billing is `free-quota` only with a dated proof (keyless endpoint or a
|
|
12
|
+
* documented free tier); without one the route is `per-token` and stays
|
|
13
|
+
* inside the USD gate;
|
|
14
|
+
* - an HTTP 402 is `policy_unproven_cost` — the route asked for money, so its
|
|
15
|
+
* free claim is void for the pass, and no other route is tried in its place;
|
|
16
|
+
* - every route sits at the `public-artifact` ceiling; only a loopback route
|
|
17
|
+
* whose per-model probe shows local weights and no outbound connection may
|
|
18
|
+
* carry its declared ceiling (`self-hosted`). Loopback alone proves nothing:
|
|
19
|
+
* a local proxy forwards upstream;
|
|
20
|
+
* - identity is derived from the served id, and a route serving another model
|
|
21
|
+
* than the one requested is absent with `policy_model_mismatch`;
|
|
22
|
+
* - random or auto routers are refused at config time: their family is unknown
|
|
23
|
+
* until after the call.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import { admitsContent, classifyContentClass, DEFAULT_CONTENT_CLASS, type ContentClass } from './content_ceiling.js';
|
|
27
|
+
import type { BillingClass } from '../_lib/environment_detector.js';
|
|
28
|
+
import type { ResolvedTransport } from './transport_resolver.js';
|
|
29
|
+
|
|
30
|
+
export type RouteBilling = Extract<BillingClass, 'free-quota' | 'per-token' | 'self-hosted'>;
|
|
31
|
+
|
|
32
|
+
export const BILLING_PROOF_KINDS = ['keyless', 'free-tier'] as const;
|
|
33
|
+
export type BillingProofKind = (typeof BILLING_PROOF_KINDS)[number];
|
|
34
|
+
|
|
35
|
+
export interface BillingProof {
|
|
36
|
+
readonly kind: BillingProofKind;
|
|
37
|
+
readonly url: string;
|
|
38
|
+
/** `YYYY-MM-DD` — the day someone read the documented free terms. */
|
|
39
|
+
readonly checked: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface RouteSpec {
|
|
43
|
+
readonly base_url: string;
|
|
44
|
+
readonly keyless: boolean;
|
|
45
|
+
readonly proof: BillingProof | null;
|
|
46
|
+
readonly loopback: boolean;
|
|
47
|
+
/** The configured ceiling; effective only for a probed self-hosted route. */
|
|
48
|
+
readonly declared_ceiling: ContentClass;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** What a self-hosted probe observed for one model. */
|
|
52
|
+
export interface SelfHostedProbeResult {
|
|
53
|
+
readonly weights: 'local' | 'remote' | 'unknown';
|
|
54
|
+
/** True when an outbound connection was seen during the probe call; null when unmeasured. */
|
|
55
|
+
readonly outbound: boolean | null;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export type SelfHostedProbe = (route: RouteSpec, model: string) => SelfHostedProbeResult;
|
|
59
|
+
|
|
60
|
+
/** Nothing measured, nothing proven: the default, so production never raises a ceiling by omission. */
|
|
61
|
+
export const UNPROVEN_PROBE: SelfHostedProbe = () => ({ weights: 'unknown', outbound: null });
|
|
62
|
+
|
|
63
|
+
const _ISO_DATE = /^\d{4}-\d{2}-\d{2}$/;
|
|
64
|
+
|
|
65
|
+
export function isRealDate(s: unknown): s is string {
|
|
66
|
+
if (typeof s !== 'string' || !_ISO_DATE.test(s)) return false;
|
|
67
|
+
const [y, m, d] = s.split('-').map(Number) as [number, number, number];
|
|
68
|
+
const probe = new Date(Date.UTC(y, m - 1, d));
|
|
69
|
+
return probe.getUTCFullYear() === y && probe.getUTCMonth() + 1 === m && probe.getUTCDate() === d;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** `localhost`, `127.0.0.0/8` and `::1`. A name that merely resolves locally does not count. */
|
|
73
|
+
export function isLoopbackUrl(raw: string): boolean {
|
|
74
|
+
let host: string;
|
|
75
|
+
try {
|
|
76
|
+
host = new URL(raw).hostname.toLowerCase();
|
|
77
|
+
} catch {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
if (host === 'localhost' || host === '[::1]' || host === '::1') return true;
|
|
81
|
+
return /^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(host);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** A model id that asks the route to pick for us (K2). */
|
|
85
|
+
export function isRandomRouter(model: string): boolean {
|
|
86
|
+
return /^(?:.*\/)?(?:auto|random|free|router)(?::.*)?$/i.test(model.trim());
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function _parseProof(name: string, raw: unknown, keyless: boolean): BillingProof | { error: string } | null {
|
|
90
|
+
if (raw === undefined || raw === null) return null;
|
|
91
|
+
const where = `members.${name}.billing_proof`;
|
|
92
|
+
if (typeof raw !== 'object' || Array.isArray(raw)) return { error: `${where} must be a mapping with kind, url and checked.` };
|
|
93
|
+
const p = raw as Record<string, unknown>;
|
|
94
|
+
if (!BILLING_PROOF_KINDS.includes(p['kind'] as BillingProofKind)) {
|
|
95
|
+
return { error: `${where}.kind must be one of ${BILLING_PROOF_KINDS.join(', ')}.` };
|
|
96
|
+
}
|
|
97
|
+
if (typeof p['url'] !== 'string' || !/^https:\/\/\S+$/.test(p['url'])) {
|
|
98
|
+
return { error: `${where}.url must be the https URL documenting the free terms.` };
|
|
99
|
+
}
|
|
100
|
+
// An unquoted YAML date is a Date object and may have rolled an impossible value over.
|
|
101
|
+
if (!isRealDate(p['checked'])) {
|
|
102
|
+
return { error: `${where}.checked must be a quoted 'YYYY-MM-DD' date — an undated proof proves nothing.` };
|
|
103
|
+
}
|
|
104
|
+
if (p['kind'] === 'keyless' && !keyless) {
|
|
105
|
+
return { error: `${where}.kind is 'keyless' but the member carries an api_key_ref.` };
|
|
106
|
+
}
|
|
107
|
+
return { kind: p['kind'] as BillingProofKind, url: p['url'], checked: p['checked'] };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* The route half of a member's config. `{ route: null }` for a member without
|
|
112
|
+
* `base_url`; an error message (the loader raises it) for a malformed one.
|
|
113
|
+
*/
|
|
114
|
+
export function parseRouteFields(
|
|
115
|
+
name: string,
|
|
116
|
+
raw: Record<string, unknown>,
|
|
117
|
+
knownProvider: boolean,
|
|
118
|
+
): { route: RouteSpec | null } | { error: string } {
|
|
119
|
+
const base = raw['base_url'];
|
|
120
|
+
if (base === undefined || base === null) {
|
|
121
|
+
return raw['billing_proof'] === undefined ? { route: null } : { error: `members.${name}.billing_proof needs base_url.` };
|
|
122
|
+
}
|
|
123
|
+
if (knownProvider) {
|
|
124
|
+
return { error: `members.${name}: base_url names a route, so the member needs its own name, not a provider's.` };
|
|
125
|
+
}
|
|
126
|
+
let url: URL;
|
|
127
|
+
try {
|
|
128
|
+
url = new URL(String(base));
|
|
129
|
+
} catch {
|
|
130
|
+
return { error: `members.${name}.base_url is not a URL (got ${JSON.stringify(base)}).` };
|
|
131
|
+
}
|
|
132
|
+
const loopback = isLoopbackUrl(url.href);
|
|
133
|
+
if (url.protocol !== 'https:' && !(url.protocol === 'http:' && loopback)) {
|
|
134
|
+
return { error: `members.${name}.base_url must use https unless it is a loopback address.` };
|
|
135
|
+
}
|
|
136
|
+
const model = raw['model'];
|
|
137
|
+
if (typeof model === 'string' && isRandomRouter(model)) {
|
|
138
|
+
return { error: `members.${name}.model ${JSON.stringify(model)} is a random/auto router; its identity is unknown before the call.` };
|
|
139
|
+
}
|
|
140
|
+
const ref = raw['api_key_ref'];
|
|
141
|
+
const keyless = ref === undefined || ref === null || ref === '';
|
|
142
|
+
const proof = _parseProof(name, raw['billing_proof'], keyless);
|
|
143
|
+
if (proof !== null && 'error' in proof) return proof;
|
|
144
|
+
return {
|
|
145
|
+
route: {
|
|
146
|
+
base_url: String(base).replace(/\/+$/, ''),
|
|
147
|
+
keyless,
|
|
148
|
+
proof,
|
|
149
|
+
loopback,
|
|
150
|
+
declared_ceiling: classifyContentClass(raw['content_ceiling']),
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function _provenLocal(route: RouteSpec, probe: SelfHostedProbeResult): boolean {
|
|
156
|
+
return route.loopback && probe.weights === 'local' && probe.outbound === false;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export function routeBilling(route: RouteSpec, probe: SelfHostedProbeResult = UNPROVEN_PROBE(route, '')): RouteBilling {
|
|
160
|
+
if (_provenLocal(route, probe)) return 'self-hosted';
|
|
161
|
+
return route.proof === null ? 'per-token' : 'free-quota';
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** `public-artifact` for every route, except a proven self-hosted one. */
|
|
165
|
+
export function routeCeiling(route: RouteSpec, probe: SelfHostedProbeResult = UNPROVEN_PROBE(route, '')): ContentClass {
|
|
166
|
+
return _provenLocal(route, probe) ? route.declared_ceiling : 'public-artifact';
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export interface ResolveRouteOptions {
|
|
170
|
+
readonly name: string;
|
|
171
|
+
readonly route: RouteSpec;
|
|
172
|
+
readonly model: string;
|
|
173
|
+
readonly contentClass?: ContentClass | null;
|
|
174
|
+
/** Whether the member's `api_key_ref` resolves; ignored for a keyless route. */
|
|
175
|
+
readonly keyPresent?: boolean;
|
|
176
|
+
readonly probe?: SelfHostedProbe;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export function resolveRouteTransport(opts: ResolveRouteOptions): ResolvedTransport {
|
|
180
|
+
const result = (opts.probe ?? UNPROVEN_PROBE)(opts.route, opts.model);
|
|
181
|
+
const billing = routeBilling(opts.route, result);
|
|
182
|
+
const absent = (reason: string, absentReason: ResolvedTransport['absentReason']): ResolvedTransport => ({
|
|
183
|
+
available: false, transport: null, billing, authSource: null, makesProviderCall: false, reason, absentReason,
|
|
184
|
+
});
|
|
185
|
+
const verdict = admitsContent(routeCeiling(opts.route, result), opts.contentClass ?? DEFAULT_CONTENT_CLASS);
|
|
186
|
+
if (!verdict.admitted) {
|
|
187
|
+
return absent(`${opts.name}: ${verdict.reason ?? 'content ceiling refused the payload'}`, 'policy_content_ceiling');
|
|
188
|
+
}
|
|
189
|
+
if (!opts.route.keyless && opts.keyPresent !== true) {
|
|
190
|
+
return absent(`${opts.name}: the route's api_key_ref does not resolve`, 'no_auth');
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
available: true,
|
|
194
|
+
transport: 'api',
|
|
195
|
+
billing,
|
|
196
|
+
authSource: opts.route.keyless ? null : 'env-key',
|
|
197
|
+
makesProviderCall: true,
|
|
198
|
+
reason: null,
|
|
199
|
+
absentReason: null,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/** The family a served id belongs to: the leading word of its last path segment. */
|
|
204
|
+
export function familyOf(servedId: string): string {
|
|
205
|
+
const last = servedId.trim().split('/').pop() ?? '';
|
|
206
|
+
return (last.split(/[^a-zA-Z]+/).find((t) => t !== '') ?? '').toLowerCase();
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/** Same model, allowing only a vendor prefix and a dated or variant suffix of the requested id. */
|
|
210
|
+
export function servedMatches(requested: string, served: string): boolean {
|
|
211
|
+
const norm = (s: string): string => (s.trim().split('/').pop() ?? '').toLowerCase();
|
|
212
|
+
const r = norm(requested);
|
|
213
|
+
const s = norm(served);
|
|
214
|
+
if (r === '' || s === '') return false;
|
|
215
|
+
return s === r || (s.startsWith(`${r}-`) && familyOf(s) === familyOf(r));
|
|
216
|
+
}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
// egress-content: fixed-corpus — a GET of the route's /models listing with no request body, never session content
|
|
2
|
+
/**
|
|
3
|
+
* What the package ships about `base_url` routes: endpoints and dated data-use
|
|
4
|
+
* attestations, never model ids. Catalogues lose and gain rows within weeks,
|
|
5
|
+
* so a committed id is stale by the time it is read; the ids a route serves
|
|
6
|
+
* are discovered from its own `/models` and kept in gitignored runtime state.
|
|
7
|
+
*
|
|
8
|
+
* An attestation records what someone read in the route's terms on a date. It
|
|
9
|
+
* enforces nothing — every free route stays at the `public-artifact` ceiling
|
|
10
|
+
* whatever it says. It decides one thing: whether a route may be offered to
|
|
11
|
+
* consumers by default. A row without an attestation, or without the
|
|
12
|
+
* EEA/Switzerland/UK client-distribution field, is for the maintainer's own
|
|
13
|
+
* runs only: some free tiers require paid service once a client distributed
|
|
14
|
+
* to users in those regions exists.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import fs from 'node:fs';
|
|
18
|
+
import path from 'node:path';
|
|
19
|
+
import { pathToFileURL } from 'node:url';
|
|
20
|
+
|
|
21
|
+
import { resolve_project_root } from '../_lib/agent_settings.js';
|
|
22
|
+
import { isRealDate } from './free_route.js';
|
|
23
|
+
|
|
24
|
+
export interface RouteAttestation {
|
|
25
|
+
/** `YYYY-MM-DD` the terms were read. */
|
|
26
|
+
readonly checked: string;
|
|
27
|
+
readonly source_url: string;
|
|
28
|
+
readonly trains_on_prompts: boolean;
|
|
29
|
+
/** What the terms say about keeping prompts and outputs, in their words' substance. */
|
|
30
|
+
readonly retention?: string;
|
|
31
|
+
/**
|
|
32
|
+
* Whether the terms permit use inside a client distributed to users in the
|
|
33
|
+
* EEA, Switzerland and the UK. `unknown` records that the terms were read
|
|
34
|
+
* and say neither, which keeps the route maintainer-only like an absent field.
|
|
35
|
+
*/
|
|
36
|
+
readonly client_distribution_eea_ch_uk?: 'permitted' | 'forbidden' | 'unknown';
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface CatalogRoute {
|
|
40
|
+
readonly id: string;
|
|
41
|
+
readonly base_url: string;
|
|
42
|
+
readonly keyless: boolean;
|
|
43
|
+
/** `null` until someone reads the terms and dates what they say. */
|
|
44
|
+
readonly attestation: RouteAttestation | null;
|
|
45
|
+
/**
|
|
46
|
+
* The route's own model list marking each entry `community: true|false`.
|
|
47
|
+
* When set, discovery admits only first-party ids and fails closed when the
|
|
48
|
+
* list cannot be read, because the attestation speaks for first-party
|
|
49
|
+
* models only.
|
|
50
|
+
*/
|
|
51
|
+
readonly first_party_list?: string;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Base URLs only. One row carries an attestation (council 2026-10-22,
|
|
56
|
+
* decision 2): its terms were read from the provider's published policy, and
|
|
57
|
+
* they settle neither way whether a distributed client may serve EEA, CH or UK
|
|
58
|
+
* users, so it stays maintainer-only.
|
|
59
|
+
*/
|
|
60
|
+
export const ROUTE_CATALOG: readonly CatalogRoute[] = [
|
|
61
|
+
{
|
|
62
|
+
id: 'pollinations',
|
|
63
|
+
base_url: 'https://text.pollinations.ai/openai',
|
|
64
|
+
keyless: true,
|
|
65
|
+
first_party_list: 'https://text.pollinations.ai/models',
|
|
66
|
+
attestation: {
|
|
67
|
+
checked: '2026-10-22',
|
|
68
|
+
source_url: 'https://pollinations.ai/privacy',
|
|
69
|
+
trains_on_prompts: false,
|
|
70
|
+
retention:
|
|
71
|
+
'prompts and outputs processed transiently, with short-lived response caches; the selected model\'s inference host sets its own retention',
|
|
72
|
+
client_distribution_eea_ch_uk: 'unknown',
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
{ id: 'groq', base_url: 'https://api.groq.com/openai/v1', keyless: false, attestation: null },
|
|
76
|
+
{ id: 'cerebras', base_url: 'https://api.cerebras.ai/v1', keyless: false, attestation: null },
|
|
77
|
+
{ id: 'openrouter', base_url: 'https://openrouter.ai/api/v1', keyless: false, attestation: null },
|
|
78
|
+
{ id: 'huggingface', base_url: 'https://router.huggingface.co/v1', keyless: false, attestation: null },
|
|
79
|
+
{ id: 'nvidia', base_url: 'https://integrate.api.nvidia.com/v1', keyless: false, attestation: null },
|
|
80
|
+
];
|
|
81
|
+
|
|
82
|
+
/** Terms drift; an attestation older than this no longer speaks for the route. */
|
|
83
|
+
export const ATTESTATION_MAX_AGE_DAYS = 90;
|
|
84
|
+
|
|
85
|
+
export interface ConsumerDefaultVerdict {
|
|
86
|
+
readonly admissible: boolean;
|
|
87
|
+
readonly reason: string;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export function consumerDefaultVerdict(route: CatalogRoute, now: Date = new Date()): ConsumerDefaultVerdict {
|
|
91
|
+
const a = route.attestation;
|
|
92
|
+
if (a === null) return { admissible: false, reason: `${route.id}: unattested — maintainer runs only` };
|
|
93
|
+
if (!isRealDate(a.checked)) return { admissible: false, reason: `${route.id}: attestation is undated — maintainer runs only` };
|
|
94
|
+
const ageDays = (now.getTime() - Date.parse(`${a.checked}T00:00:00Z`)) / 86_400_000;
|
|
95
|
+
if (ageDays > ATTESTATION_MAX_AGE_DAYS) {
|
|
96
|
+
return { admissible: false, reason: `${route.id}: attestation from ${a.checked} is older than ${ATTESTATION_MAX_AGE_DAYS} days` };
|
|
97
|
+
}
|
|
98
|
+
if (a.client_distribution_eea_ch_uk === undefined || a.client_distribution_eea_ch_uk === 'unknown') {
|
|
99
|
+
return { admissible: false, reason: `${route.id}: attestation records no EEA/CH/UK distribution term — maintainer runs only` };
|
|
100
|
+
}
|
|
101
|
+
if (a.client_distribution_eea_ch_uk === 'forbidden') {
|
|
102
|
+
return { admissible: false, reason: `${route.id}: terms forbid use in a client distributed to EEA/CH/UK users` };
|
|
103
|
+
}
|
|
104
|
+
return { admissible: true, reason: `${route.id}: attested ${a.checked}` };
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export function consumerDefaultRoutes(now: Date = new Date()): CatalogRoute[] {
|
|
108
|
+
return ROUTE_CATALOG.filter((r) => consumerDefaultVerdict(r, now).admissible);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Runtime state beside `council-probes.json`; gitignored, never committed. */
|
|
112
|
+
export const ROUTE_MODELS_RELPATH = path.join('agents', 'runtime', 'state', 'council-route-models.json');
|
|
113
|
+
|
|
114
|
+
export type RouteRoster =
|
|
115
|
+
| { readonly status: 'known'; readonly models: readonly string[]; readonly observed_at: string }
|
|
116
|
+
| { readonly status: 'unknown'; readonly reason: string };
|
|
117
|
+
|
|
118
|
+
interface StoredRoster {
|
|
119
|
+
readonly base_url: string;
|
|
120
|
+
readonly models: readonly string[];
|
|
121
|
+
readonly observed_at: string;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function _storePath(repoRoot: string): string {
|
|
125
|
+
return path.join(repoRoot, ROUTE_MODELS_RELPATH);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** Corrupt or missing state reads as "nothing observed". */
|
|
129
|
+
function _readStore(repoRoot: string): Record<string, StoredRoster> {
|
|
130
|
+
try {
|
|
131
|
+
const raw = JSON.parse(fs.readFileSync(_storePath(repoRoot), 'utf8')) as unknown;
|
|
132
|
+
return raw !== null && typeof raw === 'object' && !Array.isArray(raw) ? (raw as Record<string, StoredRoster>) : {};
|
|
133
|
+
} catch {
|
|
134
|
+
return {};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function _writeStore(repoRoot: string, store: Record<string, StoredRoster>): void {
|
|
139
|
+
const target = _storePath(repoRoot);
|
|
140
|
+
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
141
|
+
const tmp = `${target}.${process.pid}.tmp`;
|
|
142
|
+
fs.writeFileSync(tmp, `${JSON.stringify(store, null, 2)}\n`, 'utf8');
|
|
143
|
+
fs.renameSync(tmp, target);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export function readRouteRoster(repoRoot: string, routeKey: string): RouteRoster {
|
|
147
|
+
const row = _readStore(repoRoot)[routeKey];
|
|
148
|
+
if (row === undefined || !Array.isArray(row.models)) return { status: 'unknown', reason: 'never discovered' };
|
|
149
|
+
return { status: 'known', models: row.models, observed_at: row.observed_at };
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Drop one model from a route's discovered roster; the next discovery that
|
|
154
|
+
* serves it brings it back. False when the roster does not list it.
|
|
155
|
+
*/
|
|
156
|
+
export function retireRouteModel(repoRoot: string, routeKey: string, model: string): boolean {
|
|
157
|
+
const store = _readStore(repoRoot);
|
|
158
|
+
const row = store[routeKey];
|
|
159
|
+
if (row === undefined || !Array.isArray(row.models) || !row.models.includes(model)) return false;
|
|
160
|
+
store[routeKey] = { ...row, models: row.models.filter((m) => m !== model) };
|
|
161
|
+
_writeStore(repoRoot, store);
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export interface DiscoverOptions {
|
|
166
|
+
readonly repoRoot: string;
|
|
167
|
+
readonly apiKey?: string | null;
|
|
168
|
+
readonly fetchImpl?: typeof fetch;
|
|
169
|
+
readonly now?: Date;
|
|
170
|
+
readonly timeoutMs?: number;
|
|
171
|
+
/** A route's `first_party_list`; when set, only ids it marks `community: false` are kept. */
|
|
172
|
+
readonly firstPartyListUrl?: string;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/** First-party names and aliases, each mapped to the full alias set of its entry. */
|
|
176
|
+
async function firstPartyIds(url: string, opts: DiscoverOptions): Promise<Map<string, ReadonlySet<string>>> {
|
|
177
|
+
const res = await (opts.fetchImpl ?? fetch)(url, {
|
|
178
|
+
headers: { accept: 'application/json' },
|
|
179
|
+
signal: AbortSignal.timeout(opts.timeoutMs ?? 15_000),
|
|
180
|
+
});
|
|
181
|
+
if (!res.ok) throw new Error(`first-party list HTTP ${res.status}`);
|
|
182
|
+
const body = (await res.json()) as unknown;
|
|
183
|
+
if (!Array.isArray(body)) throw new Error('first-party list is not a list');
|
|
184
|
+
const ids = new Map<string, ReadonlySet<string>>();
|
|
185
|
+
for (const m of body) {
|
|
186
|
+
if (m === null || typeof m !== 'object') continue;
|
|
187
|
+
const e = m as Record<string, unknown>;
|
|
188
|
+
if (e['community'] !== false) continue;
|
|
189
|
+
const names = [e['name'], ...(Array.isArray(e['aliases']) ? e['aliases'] : [])].filter((n): n is string => typeof n === 'string');
|
|
190
|
+
const entry = new Set(names);
|
|
191
|
+
for (const n of names) ids.set(n, entry);
|
|
192
|
+
}
|
|
193
|
+
return ids;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* The id a route answers under when asked for `model`, from one minimal call; '' when the call
|
|
198
|
+
* gives no answer. A route may list one id and serve under another, and the client keeps an
|
|
199
|
+
* answer only on an exact match, so the roster must hold the id the route actually serves.
|
|
200
|
+
*/
|
|
201
|
+
async function servedIdOf(baseUrl: string, model: string, opts: DiscoverOptions): Promise<string> {
|
|
202
|
+
try {
|
|
203
|
+
const headers: Record<string, string> = { 'content-type': 'application/json', accept: 'application/json' };
|
|
204
|
+
if (opts.apiKey) headers['authorization'] = `Bearer ${opts.apiKey}`;
|
|
205
|
+
const res = await (opts.fetchImpl ?? fetch)(`${baseUrl.replace(/\/+$/, '')}/chat/completions`, {
|
|
206
|
+
method: 'POST',
|
|
207
|
+
headers,
|
|
208
|
+
body: JSON.stringify({ model, max_tokens: 16, messages: [{ role: 'user', content: 'Reply with: ok' }] }),
|
|
209
|
+
signal: AbortSignal.timeout(opts.timeoutMs ?? 15_000),
|
|
210
|
+
});
|
|
211
|
+
if (!res.ok) return '';
|
|
212
|
+
const served = ((await res.json()) as { model?: unknown }).model;
|
|
213
|
+
return typeof served === 'string' ? served : '';
|
|
214
|
+
} catch {
|
|
215
|
+
return '';
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* One GET of `<base_url>/models`. A failure clears the stored entry, so an
|
|
221
|
+
* offline route reads `unknown` rather than the list it served last time.
|
|
222
|
+
*/
|
|
223
|
+
export async function discoverRouteModels(routeKey: string, baseUrl: string, opts: DiscoverOptions): Promise<RouteRoster> {
|
|
224
|
+
const store = _readStore(opts.repoRoot);
|
|
225
|
+
let models: string[];
|
|
226
|
+
try {
|
|
227
|
+
const headers: Record<string, string> = { accept: 'application/json' };
|
|
228
|
+
if (opts.apiKey) headers['authorization'] = `Bearer ${opts.apiKey}`;
|
|
229
|
+
const res = await (opts.fetchImpl ?? fetch)(`${baseUrl.replace(/\/+$/, '')}/models`, {
|
|
230
|
+
headers,
|
|
231
|
+
signal: AbortSignal.timeout(opts.timeoutMs ?? 15_000),
|
|
232
|
+
});
|
|
233
|
+
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
|
234
|
+
const body = (await res.json()) as { data?: unknown };
|
|
235
|
+
if (!Array.isArray(body.data)) throw new Error('no data array in the /models answer');
|
|
236
|
+
models = body.data
|
|
237
|
+
.map((m) => (m !== null && typeof m === 'object' ? (m as Record<string, unknown>)['id'] : undefined))
|
|
238
|
+
.filter((id): id is string => typeof id === 'string' && id !== '');
|
|
239
|
+
if (opts.firstPartyListUrl) {
|
|
240
|
+
const fp = await firstPartyIds(opts.firstPartyListUrl, opts);
|
|
241
|
+
const resolved: string[] = [];
|
|
242
|
+
for (const id of models.filter((m) => fp.has(m))) {
|
|
243
|
+
const aliases = fp.get(id) as ReadonlySet<string>;
|
|
244
|
+
const served = aliases.size > 1 ? await servedIdOf(baseUrl, id, opts) : '';
|
|
245
|
+
// No answer keeps the listed id; an id outside the entry's declared aliases is a substitution.
|
|
246
|
+
if (served === '' || served === id) resolved.push(id);
|
|
247
|
+
else if (aliases.has(served)) resolved.push(served);
|
|
248
|
+
}
|
|
249
|
+
models = [...new Set(resolved)];
|
|
250
|
+
}
|
|
251
|
+
} catch (exc) {
|
|
252
|
+
if (routeKey in store) {
|
|
253
|
+
delete store[routeKey];
|
|
254
|
+
_writeStore(opts.repoRoot, store);
|
|
255
|
+
}
|
|
256
|
+
return { status: 'unknown', reason: exc instanceof Error ? exc.message : String(exc) };
|
|
257
|
+
}
|
|
258
|
+
const observed_at = (opts.now ?? new Date()).toISOString();
|
|
259
|
+
store[routeKey] = { base_url: baseUrl, models, observed_at };
|
|
260
|
+
_writeStore(opts.repoRoot, store);
|
|
261
|
+
return { status: 'known', models, observed_at };
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
export interface CatalogMainDeps {
|
|
265
|
+
readonly fetchImpl?: typeof fetch;
|
|
266
|
+
readonly stdout?: (line: string) => void;
|
|
267
|
+
readonly now?: Date;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
const USAGE = 'usage: free_route_catalog discover [--root <dir>]';
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* `discover [--root <dir>]` — the production path that writes the first-party
|
|
274
|
+
* roster `route_member.ts` gates on. Every catalogued row with a
|
|
275
|
+
* `first_party_list` is discovered under its catalogue id, beneath the same
|
|
276
|
+
* repository root the gate resolves. Exit 1 when any roster stays unknown.
|
|
277
|
+
*/
|
|
278
|
+
export async function main(argv: readonly string[], deps: CatalogMainDeps = {}): Promise<number> {
|
|
279
|
+
const out = deps.stdout ?? ((line: string) => process.stdout.write(`${line}\n`));
|
|
280
|
+
const [cmd, ...rest] = argv;
|
|
281
|
+
const rootAt = rest.indexOf('--root');
|
|
282
|
+
const rootArg = rootAt === -1 ? null : (rest[rootAt + 1] ?? '');
|
|
283
|
+
if (cmd !== 'discover' || rootArg === '' || rest.length !== (rootAt === -1 ? 0 : 2)) {
|
|
284
|
+
out(USAGE);
|
|
285
|
+
return 2;
|
|
286
|
+
}
|
|
287
|
+
const [repoRoot] = resolve_project_root(rootArg);
|
|
288
|
+
let unknown = 0;
|
|
289
|
+
for (const row of ROUTE_CATALOG) {
|
|
290
|
+
if (row.first_party_list === undefined) continue;
|
|
291
|
+
const roster = await discoverRouteModels(row.id, row.base_url, {
|
|
292
|
+
repoRoot,
|
|
293
|
+
firstPartyListUrl: row.first_party_list,
|
|
294
|
+
...(deps.fetchImpl ? { fetchImpl: deps.fetchImpl } : {}),
|
|
295
|
+
...(deps.now ? { now: deps.now } : {}),
|
|
296
|
+
});
|
|
297
|
+
if (roster.status === 'known') {
|
|
298
|
+
out(`${row.id}: known (${roster.models.length} first-party models, observed ${roster.observed_at})`);
|
|
299
|
+
} else {
|
|
300
|
+
unknown += 1;
|
|
301
|
+
out(`${row.id}: unknown (${roster.reason})`);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
out(`roster: ${path.join(repoRoot, ROUTE_MODELS_RELPATH)}`);
|
|
305
|
+
return unknown === 0 ? 0 : 1;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
if (process.argv[1] !== undefined && import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href) {
|
|
309
|
+
void main(process.argv.slice(2)).then((code) => process.exit(code));
|
|
310
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `chat/completions` client for a `base_url` route. Separate from
|
|
3
|
+
* `free_route.ts` so the config loader, which sits in the hook bundle, does not
|
|
4
|
+
* pull the client layer in.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { curlJsonPost, type JsonPost } from './api_transport.js';
|
|
8
|
+
import { CouncilResponse, ExternalAIClient } from './clients.js';
|
|
9
|
+
import type { ContentClass } from './content_ceiling.js';
|
|
10
|
+
import { familyOf, servedMatches, type RouteBilling } from './free_route.js';
|
|
11
|
+
import { policyExclusionReason, type PolicyExclusion } from './seat_policy.js';
|
|
12
|
+
|
|
13
|
+
export interface FreeRouteClientOptions {
|
|
14
|
+
readonly name: string;
|
|
15
|
+
readonly model: string;
|
|
16
|
+
readonly base_url: string;
|
|
17
|
+
readonly api_key: string | null;
|
|
18
|
+
readonly billing: RouteBilling;
|
|
19
|
+
readonly content_ceiling: ContentClass;
|
|
20
|
+
readonly post?: JsonPost;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* `chat/completions` against a route. Distinct from `_OpenAICompatibleClient`
|
|
25
|
+
* because a keyless route must send no Authorization header at all, and
|
|
26
|
+
* because its answer is only kept when the served model is the requested one.
|
|
27
|
+
* Paid provider clients keep `model_served` as attribution only.
|
|
28
|
+
*/
|
|
29
|
+
export class FreeRouteClient extends ExternalAIClient {
|
|
30
|
+
readonly base_url: string;
|
|
31
|
+
readonly billing: RouteBilling;
|
|
32
|
+
readonly content_ceiling: ContentClass;
|
|
33
|
+
private readonly _apiKey: string | null;
|
|
34
|
+
private readonly _post: JsonPost;
|
|
35
|
+
|
|
36
|
+
constructor(opts: FreeRouteClientOptions) {
|
|
37
|
+
super();
|
|
38
|
+
this.name = opts.name;
|
|
39
|
+
this.model = opts.model;
|
|
40
|
+
this.base_url = opts.base_url.replace(/\/+$/, '');
|
|
41
|
+
this.billing = opts.billing;
|
|
42
|
+
this.content_ceiling = opts.content_ceiling;
|
|
43
|
+
this.billable = opts.billing === 'per-token';
|
|
44
|
+
this._apiKey = opts.api_key;
|
|
45
|
+
this._post = opts.post ?? curlJsonPost;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
private _refused(exclusion: PolicyExclusion, detail: string, latency_ms: number, served = ''): CouncilResponse {
|
|
49
|
+
return new CouncilResponse({
|
|
50
|
+
provider: this.name,
|
|
51
|
+
model: this.model,
|
|
52
|
+
model_served: served,
|
|
53
|
+
text: '',
|
|
54
|
+
latency_ms,
|
|
55
|
+
error: `${exclusion}: ${policyExclusionReason(exclusion, this.name)} — ${detail}`,
|
|
56
|
+
metadata: { absent_reason: exclusion, billing: this.billing, route: this.base_url },
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
override ask(system_prompt: string, user_prompt: string, max_tokens = 2048): CouncilResponse {
|
|
61
|
+
const t0 = performance.now();
|
|
62
|
+
const headers = this._apiKey === null ? [] : [`authorization: Bearer ${this._apiKey}`];
|
|
63
|
+
let response: Record<string, unknown>;
|
|
64
|
+
try {
|
|
65
|
+
response = (this._post(`${this.base_url}/chat/completions`, headers, {
|
|
66
|
+
model: this.model,
|
|
67
|
+
max_tokens,
|
|
68
|
+
messages: [
|
|
69
|
+
{ role: 'system', content: system_prompt },
|
|
70
|
+
{ role: 'user', content: user_prompt },
|
|
71
|
+
],
|
|
72
|
+
}) ?? {}) as Record<string, unknown>;
|
|
73
|
+
} catch (exc) {
|
|
74
|
+
const msg = exc instanceof Error ? exc.message : String(exc);
|
|
75
|
+
const ms = Math.trunc(performance.now() - t0);
|
|
76
|
+
if (/^HTTP 402\b/.test(msg)) return this._refused('policy_unproven_cost', 'the route answered 402; no paid fallback is tried', ms);
|
|
77
|
+
return new CouncilResponse({ provider: this.name, model: this.model, text: '', latency_ms: ms, error: msg });
|
|
78
|
+
}
|
|
79
|
+
const ms = Math.trunc(performance.now() - t0);
|
|
80
|
+
const served = typeof response['model'] === 'string' ? response['model'] : '';
|
|
81
|
+
if (!servedMatches(this.model, served)) {
|
|
82
|
+
return this._refused('policy_model_mismatch', `requested ${this.model}, served ${served || '(none reported)'}`, ms, served);
|
|
83
|
+
}
|
|
84
|
+
const choices = Array.isArray(response['choices']) ? (response['choices'] as Record<string, unknown>[]) : [];
|
|
85
|
+
const message = (choices[0]?.['message'] ?? {}) as Record<string, unknown>;
|
|
86
|
+
const usage = (response['usage'] ?? {}) as Record<string, unknown>;
|
|
87
|
+
const num = (v: unknown): number => (typeof v === 'number' && Number.isFinite(v) ? v : 0);
|
|
88
|
+
return new CouncilResponse({
|
|
89
|
+
provider: this.name,
|
|
90
|
+
model: this.model,
|
|
91
|
+
model_served: served,
|
|
92
|
+
text: typeof message['content'] === 'string' ? message['content'] : '',
|
|
93
|
+
input_tokens: num(usage['prompt_tokens']),
|
|
94
|
+
output_tokens: num(usage['completion_tokens']),
|
|
95
|
+
latency_ms: ms,
|
|
96
|
+
metadata: { family: familyOf(served), billing: this.billing, route: this.base_url, billable: this.billable },
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|