@event4u/agent-config 16.5.0 → 17.0.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 +463 -498
- package/CONTRIBUTING.md +47 -0
- package/README.md +25 -25
- 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 +6 -0
- 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 +39 -1
- 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-F3QDG2GT.js → chunk-2SFOOFJJ.js} +259 -159
- package/dist/cli-delegate/chunk-2Y5AMLMY.js +136 -0
- package/dist/cli-delegate/{chunk-OKJUIAPS.js → chunk-4E2W63DA.js} +1 -62
- package/dist/cli-delegate/{chunk-6SRJTYJS.js → chunk-4SHNERBL.js} +37 -16
- 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-5GPULQBE.js → chunk-CAL76ADI.js} +4215 -682
- package/dist/cli-delegate/chunk-DSY6LLCQ.js +127 -0
- package/dist/cli-delegate/chunk-E6XNBVE4.js +581 -0
- package/dist/cli-delegate/{chunk-ZUZKZYCN.js → chunk-ESUNQ5XR.js} +46 -10
- 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-GOMILC3O.js +918 -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-IROAQ77A.js +137 -0
- package/dist/cli-delegate/chunk-J2SJZICO.js +698 -0
- package/dist/cli-delegate/{chunk-6YQC2HLF.js → chunk-JHMMWNJ2.js} +54 -40
- 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-F7DQWYR5.js → chunk-RAXQOETZ.js} +6 -2
- package/dist/cli-delegate/{chunk-T7XSJSUQ.js → chunk-SIOMDAKL.js} +980 -784
- 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-KXXWJTDO.js → chunk-WMNYVIYX.js} +1 -1
- package/dist/cli-delegate/chunk-XCY5KKUC.js +181 -0
- package/dist/cli-delegate/{chunk-H76PHZBI.js → chunk-XLY5G3CM.js} +14 -19
- 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 +483 -817
- 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 +14 -11
- package/dist/cli-delegate/cmd_fleet.js +5 -3
- 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 +7 -5
- package/dist/cli-delegate/cmd_prune.js +16 -13
- 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 +14 -11
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +16 -13
- package/dist/cli-delegate/cmd_uninstall.js +185 -31
- package/dist/cli-delegate/cmd_update.js +67 -3
- package/dist/cli-delegate/cmd_upgrade.js +38 -7
- package/dist/cli-delegate/cmd_validate.js +16 -13
- 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 +17506 -18692
- 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/conflict.js +36 -6
- package/dist/install/conflictTracker.js +81 -7
- package/dist/install/detect.js +3 -3
- package/dist/install/hostPermissionsAdapter.js +106 -0
- package/dist/install/install.mjs +3117 -1949
- package/dist/install/installThinLayer.js +1 -1
- 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/plan.js +1 -1
- package/dist/install/preflight.js +39 -8
- package/dist/install/preserve.js +74 -12
- 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/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 +9831 -5546
- 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 +766 -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 +24 -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 +27 -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 +44 -0
- 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 +149 -3
- package/src/config/gate-reachability-exemptions.json +3 -5
- package/src/config/gate-violation-baselines.json +26 -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/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/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/conflict.ts +38 -6
- package/src/install/conflictTracker.ts +126 -8
- package/src/install/detect.ts +3 -3
- package/src/install/hostPermissionsAdapter.ts +136 -0
- package/src/install/installThinLayer.ts +6 -1
- 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/plan.ts +1 -1
- package/src/install/preflight.ts +42 -10
- package/src/install/preserve.ts +94 -12
- 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/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_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 +34 -1
- 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/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 +896 -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 +34 -2
- 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 +26 -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/procedure_checks.ts +5 -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 +27 -1
- 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 +52 -5
- 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 +222 -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 +17 -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 +55 -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 +276 -0
- package/src/scripts/ai_council/free_route.ts +216 -0
- package/src/scripts/ai_council/free_route_catalog.ts +173 -0
- package/src/scripts/ai_council/free_route_client.ts +95 -0
- package/src/scripts/ai_council/free_rung.ts +61 -0
- package/src/scripts/ai_council/hand_payload.ts +230 -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 +16 -16
- 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 +52 -0
- package/src/scripts/ai_council/seat_policy.ts +40 -0
- package/src/scripts/ai_council/seat_resume.ts +40 -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 +37 -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 +284 -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 +147 -0
- 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 +5 -0
- 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_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 +48 -38
- 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 +65 -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 +13 -12
- 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 +16 -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 +203 -10
- package/src/scripts/hooks/state_io.ts +2 -2
- 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 +60 -91
- 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_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 +94 -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 +65 -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 +26 -55
- package/src/scripts/release_drill.ts +52 -23
- package/src/scripts/release_env.ts +37 -0
- package/src/scripts/release_publication.ts +11 -1
- package/src/scripts/report_consumer_gate_reach.ts +233 -0
- package/src/scripts/report_merge_gate_load.ts +295 -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 +121 -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-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,440 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The egress stage — the one dispatcher stage that may produce a rewrite
|
|
3
|
+
* (ADR-285) and the only code that builds the views concerns receive.
|
|
4
|
+
* Contract, including the per-mode table: docs/contracts/egress-placeholders-v1.md.
|
|
5
|
+
*
|
|
6
|
+
* `observe` detects and counts and never changes a view; the placeholder view
|
|
7
|
+
* exists only from `protect` onward. The execution view is the envelope as the
|
|
8
|
+
* host sent it, granted by the closed list below and never requested: a
|
|
9
|
+
* concern's own manifest declaration grants nothing.
|
|
10
|
+
*
|
|
11
|
+
* The rule table holds credential rules only, so every count is a credential
|
|
12
|
+
* count until identifier rules exist.
|
|
13
|
+
*/
|
|
14
|
+
import * as fs from "node:fs";
|
|
15
|
+
import * as path from "node:path";
|
|
16
|
+
|
|
17
|
+
import { parse as parseYaml } from "yaml";
|
|
18
|
+
|
|
19
|
+
import { _resolve_cascade_paths, load_agent_settings } from "../_lib/agent_settings.js";
|
|
20
|
+
import type { EgressClass } from "../_lib/egress_rules.js";
|
|
21
|
+
import type { TokenScope } from "../_lib/egress_token.js";
|
|
22
|
+
import { isEnvKillSwitchActive } from "../_lib/env_kill_switch.js";
|
|
23
|
+
import { type EgressEngine, loadEgressEngine } from "./egress_engine_loader.js";
|
|
24
|
+
import { BODY_KEYS, type JsonObject, type JsonValue } from "./payload_stub.js";
|
|
25
|
+
import { is_replay_mode } from "./state_io.js";
|
|
26
|
+
|
|
27
|
+
export const EGRESS_MODES = ["off", "observe", "protect", "strict"] as const;
|
|
28
|
+
export type EgressMode = (typeof EGRESS_MODES)[number];
|
|
29
|
+
|
|
30
|
+
/** Set to anything outside the off-set and the stage does nothing, whatever the settings say. */
|
|
31
|
+
export const EGRESS_STAGE_KILL_SWITCH = "AGENT_CONFIG_NO_EGRESS_STAGE";
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* The concerns that receive the execution view — every concern that decides
|
|
35
|
+
* whether a call may run — each bound to the one script it may run. A guard
|
|
36
|
+
* served the placeholder view would match a token instead of the value it
|
|
37
|
+
* exists to stop, so `lint_hook_manifest` fails when a blocking concern is
|
|
38
|
+
* missing here, when a name here is not a blocking concern, and when the
|
|
39
|
+
* manifest binds a listed name to another script. The binding to the script is
|
|
40
|
+
* what stops a manifest entry from borrowing a guard's name to read raw values.
|
|
41
|
+
*/
|
|
42
|
+
export const EXECUTION_VIEW_GRANTS: ReadonlyMap<string, string> = new Map([
|
|
43
|
+
["block-config-weakening", "src/scripts/hooks/block_config_weakening.ts"],
|
|
44
|
+
["block-credential-reads", "src/scripts/hooks/block_credential_reads.ts"],
|
|
45
|
+
["block-kernel-rule-writes", "src/scripts/hooks/block_kernel_rule_writes.ts"],
|
|
46
|
+
["block-no-verify", "src/scripts/hooks/block_no_verify.ts"],
|
|
47
|
+
["block-plumbing-writes", "src/scripts/hooks/block_plumbing_writes.ts"],
|
|
48
|
+
["block-speaking-inbox-dir", "src/scripts/hooks/block_speaking_inbox_dir.ts"],
|
|
49
|
+
["evidence-independence", "src/scripts/hooks/evidence_independence.ts"],
|
|
50
|
+
["one-question-per-ask", "src/scripts/hooks/one_question_per_ask_hook.ts"],
|
|
51
|
+
["turn-end-gate", "src/scripts/hooks/turn_end_gate_hook.ts"],
|
|
52
|
+
]);
|
|
53
|
+
|
|
54
|
+
export type EnvelopeView = "execution" | "placeholder";
|
|
55
|
+
|
|
56
|
+
/** Execution only for a listed name running its listed script; everything else gets the placeholder view. */
|
|
57
|
+
export function egressViewFor(concern: JsonObject): EnvelopeView {
|
|
58
|
+
const name = concern["name"];
|
|
59
|
+
const script = typeof name === "string" ? EXECUTION_VIEW_GRANTS.get(name) : undefined;
|
|
60
|
+
return script !== undefined && concern["script"] === script ? "execution" : "placeholder";
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export type EgressField = "prompt" | "input" | "result";
|
|
64
|
+
|
|
65
|
+
const FIELD_KEYS: Readonly<Record<EgressField, readonly string[]>> = {
|
|
66
|
+
prompt: ["prompt", "userPrompt"],
|
|
67
|
+
input: BODY_KEYS.input,
|
|
68
|
+
result: BODY_KEYS.result,
|
|
69
|
+
};
|
|
70
|
+
const FIELDS = Object.keys(FIELD_KEYS) as EgressField[];
|
|
71
|
+
|
|
72
|
+
/** Marks a field the placeholder view could not replace safely; carries the rule id and nothing else. */
|
|
73
|
+
export const WITHHELD_MARKER = "_agent_config_egress_withheld" as const;
|
|
74
|
+
|
|
75
|
+
export interface EgressCount {
|
|
76
|
+
readonly field: EgressField;
|
|
77
|
+
readonly class: EgressClass;
|
|
78
|
+
readonly type: string;
|
|
79
|
+
readonly count: number;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export interface EgressRefusal {
|
|
83
|
+
readonly field: EgressField;
|
|
84
|
+
readonly rule: string;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export interface EgressStageResult {
|
|
88
|
+
readonly mode: EgressMode;
|
|
89
|
+
/** The envelope every concern off the grant list receives; `undefined` means the received envelope. */
|
|
90
|
+
readonly placeholder: JsonObject | undefined;
|
|
91
|
+
readonly scanned: readonly EgressField[];
|
|
92
|
+
readonly counts: readonly EgressCount[];
|
|
93
|
+
/** Fields whose secret had no provable extent; withheld from the placeholder view. */
|
|
94
|
+
readonly refused: readonly EgressRefusal[];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function isObject(v: unknown): v is JsonObject {
|
|
98
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* An absent mode is `off`, the shipped default. A mode that is present but not
|
|
103
|
+
* one of the four is `protect`: someone asked for the stage, and guessing the
|
|
104
|
+
* least protective reading of a typo would serve raw values in their name.
|
|
105
|
+
*/
|
|
106
|
+
export function resolveEgressMode(settings: unknown): EgressMode {
|
|
107
|
+
if (isEnvKillSwitchActive(EGRESS_STAGE_KILL_SWITCH)) return "off";
|
|
108
|
+
const egress = isObject(settings) ? settings["egress"] : undefined;
|
|
109
|
+
const placeholders = isObject(egress) ? egress["placeholders"] : undefined;
|
|
110
|
+
const mode = isObject(placeholders) ? placeholders["mode"] : undefined;
|
|
111
|
+
// YAML 1.1 reads a bare `off` as false, which is the user writing `off`.
|
|
112
|
+
if (mode === undefined || mode === null || mode === false) return "off";
|
|
113
|
+
return (EGRESS_MODES as readonly unknown[]).includes(mode) ? (mode as EgressMode) : "protect";
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Any spelling of the key — block, flow or quoted — contains the word. */
|
|
117
|
+
const EGRESS_WORD = /\begress\b/;
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Every project settings layer the cascade would read; the user-global layer
|
|
121
|
+
* cannot carry `egress` (it is not on MERGEABLE_KEYS). When no layer contains
|
|
122
|
+
* the word at all the shipped default holds, and the full cascade — whose
|
|
123
|
+
* template parse measured about 25 ms cold — is skipped. A layer that names it
|
|
124
|
+
* anywhere, even in a comment, pays the full parse. `broken` means a layer
|
|
125
|
+
* exists but cannot be read, or names `egress` and does not parse; the cascade
|
|
126
|
+
* would read either as empty and fall to `off`.
|
|
127
|
+
*/
|
|
128
|
+
function egressLayers(workspaceRoot: string, readFile: (p: string) => string): "none" | "named" | "broken" {
|
|
129
|
+
let named = false;
|
|
130
|
+
for (const p of _resolve_cascade_paths(workspaceRoot, null)) {
|
|
131
|
+
let text: string;
|
|
132
|
+
try {
|
|
133
|
+
text = readFile(p);
|
|
134
|
+
} catch (exc) {
|
|
135
|
+
// Only a missing layer is skipped; a layer that exists and cannot be read could hold the mode.
|
|
136
|
+
const code = (exc as NodeJS.ErrnoException).code;
|
|
137
|
+
if (code === "ENOENT" || code === "ENOTDIR") continue;
|
|
138
|
+
return "broken";
|
|
139
|
+
}
|
|
140
|
+
if (!EGRESS_WORD.test(text)) continue;
|
|
141
|
+
named = true;
|
|
142
|
+
try {
|
|
143
|
+
parseYaml(text, { version: "1.1" });
|
|
144
|
+
} catch {
|
|
145
|
+
return "broken";
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return named ? "named" : "none";
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* A layer that names `egress` but cannot be read or parsed resolves to
|
|
153
|
+
* `protect`, never `off`: a broken file must not switch configured protection
|
|
154
|
+
* off in silence. The count record carries the mode, so the fallback is visible.
|
|
155
|
+
*/
|
|
156
|
+
export function readEgressMode(
|
|
157
|
+
workspaceRoot: string,
|
|
158
|
+
readFile: (p: string) => string = (p) => fs.readFileSync(p, "utf8"),
|
|
159
|
+
): EgressMode {
|
|
160
|
+
if (isEnvKillSwitchActive(EGRESS_STAGE_KILL_SWITCH)) return "off";
|
|
161
|
+
let layers: "none" | "named" | "broken";
|
|
162
|
+
try {
|
|
163
|
+
layers = egressLayers(workspaceRoot, readFile);
|
|
164
|
+
} catch {
|
|
165
|
+
return "protect";
|
|
166
|
+
}
|
|
167
|
+
if (layers === "none") return "off";
|
|
168
|
+
if (layers === "broken") return "protect";
|
|
169
|
+
try {
|
|
170
|
+
return resolveEgressMode(load_agent_settings({ cwd: workspaceRoot }));
|
|
171
|
+
} catch {
|
|
172
|
+
return "protect";
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function payloadOf(envelope: JsonObject): JsonObject | null {
|
|
177
|
+
const p = envelope["payload"];
|
|
178
|
+
return isObject(p) ? p : null;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function presentKeys(payload: JsonObject, field: EgressField): string[] {
|
|
182
|
+
return FIELD_KEYS[field].filter((k) => payload[k] !== undefined && payload[k] !== null);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function collectStrings(v: JsonValue, out: string[]): void {
|
|
186
|
+
if (typeof v === "string") out.push(v);
|
|
187
|
+
else if (Array.isArray(v)) for (const x of v) collectStrings(x, out);
|
|
188
|
+
else if (isObject(v)) for (const x of Object.values(v)) collectStrings(x, out);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/** The rule id a refusal records when the engine cannot load. */
|
|
192
|
+
export const ENGINE_UNAVAILABLE = "engine-unavailable";
|
|
193
|
+
|
|
194
|
+
/** Raised when the engine cannot load; the stage turns it into an `engine-unavailable` refusal. */
|
|
195
|
+
export class EngineUnavailableError extends Error {
|
|
196
|
+
readonly reason: string;
|
|
197
|
+
|
|
198
|
+
constructor(reason: string) {
|
|
199
|
+
super(`${ENGINE_UNAVAILABLE}: ${reason}`);
|
|
200
|
+
this.reason = reason;
|
|
201
|
+
this.name = "EngineUnavailableError";
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* The engine, or an `EngineUnavailableError` the stage's own failure path turns
|
|
207
|
+
* into a withheld view (`protect`, `strict`) or a recorded miss (`observe`).
|
|
208
|
+
* Never reached when the mode is `off`, so the shipped default loads nothing.
|
|
209
|
+
*/
|
|
210
|
+
export function requireEngine(load: () => ReturnType<typeof loadEgressEngine> = loadEgressEngine): EgressEngine {
|
|
211
|
+
const r = load();
|
|
212
|
+
if (!r.ok) throw new EngineUnavailableError(r.reason);
|
|
213
|
+
return r.engine;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Detection and the extent proof only — nothing is replaced and nothing is kept.
|
|
218
|
+
* Throws `EngineUnavailableError` when no engine is passed and none loads; a
|
|
219
|
+
* caller outside the stage handles it (the replay preview reports it).
|
|
220
|
+
*/
|
|
221
|
+
export function countEnvelope(
|
|
222
|
+
envelope: JsonObject,
|
|
223
|
+
engine: EgressEngine = requireEngine(),
|
|
224
|
+
): Pick<EgressStageResult, "scanned" | "counts" | "refused"> {
|
|
225
|
+
const payload = payloadOf(envelope);
|
|
226
|
+
const scanned: EgressField[] = [];
|
|
227
|
+
const counts = new Map<string, EgressCount>();
|
|
228
|
+
const refused: EgressRefusal[] = [];
|
|
229
|
+
if (payload === null) return { scanned, counts: [], refused };
|
|
230
|
+
for (const field of FIELDS) {
|
|
231
|
+
const keys = presentKeys(payload, field);
|
|
232
|
+
if (keys.length === 0) continue;
|
|
233
|
+
scanned.push(field);
|
|
234
|
+
const texts: string[] = [];
|
|
235
|
+
for (const k of keys) collectStrings(payload[k] as JsonValue, texts);
|
|
236
|
+
for (const text of texts) {
|
|
237
|
+
const tally = engine.tallyText(text);
|
|
238
|
+
for (const rule of tally.refused) refused.push({ field, rule });
|
|
239
|
+
for (const f of tally.found) {
|
|
240
|
+
const key = `${field}\u0000${f.class}\u0000${f.type}`;
|
|
241
|
+
counts.set(key, { field, class: f.class, type: f.type, count: (counts.get(key)?.count ?? 0) + 1 });
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return { scanned, counts: [...counts.values()], refused };
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* The placeholder view: every listed value in the prompt, the tool input and
|
|
250
|
+
* the tool result replaced by its token, under one scope that lives as long as
|
|
251
|
+
* this dispatch. A key whose value cannot be replaced safely is withheld whole,
|
|
252
|
+
* never partly replaced. The received envelope is not modified. Throws
|
|
253
|
+
* `EngineUnavailableError` when no engine is passed and none loads.
|
|
254
|
+
*/
|
|
255
|
+
export function buildPlaceholderEnvelope(
|
|
256
|
+
envelope: JsonObject,
|
|
257
|
+
engine: EgressEngine = requireEngine(),
|
|
258
|
+
scope: TokenScope = new engine.TokenScope(),
|
|
259
|
+
): JsonObject {
|
|
260
|
+
const payload = payloadOf(envelope);
|
|
261
|
+
if (payload === null) return envelope;
|
|
262
|
+
const next: JsonObject = { ...payload };
|
|
263
|
+
for (const field of FIELDS) {
|
|
264
|
+
for (const k of presentKeys(payload, field)) {
|
|
265
|
+
try {
|
|
266
|
+
next[k] = engine.replaceJson(payload[k] as JsonValue, scope);
|
|
267
|
+
} catch (exc) {
|
|
268
|
+
// Anything but a refusal is a defect, and withholds every body upstream.
|
|
269
|
+
if (!(exc instanceof engine.EgressRefusedError)) throw exc;
|
|
270
|
+
next[k] = { [WITHHELD_MARKER]: true, rule: exc.rule };
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
return { ...envelope, payload: next };
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/** Bounds the append-only record; past it the file rotates once to `.1`. */
|
|
278
|
+
export const OBSERVATION_FILE_MAX_BYTES = 4 * 1024 * 1024;
|
|
279
|
+
export const OBSERVATION_FILE = path.join("agents", "runtime", "state", "egress-observations.jsonl");
|
|
280
|
+
|
|
281
|
+
const TOOL_NAME = /^[A-Za-z0-9_.:-]{1,128}$/;
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* One fixed-field line per scanned dispatch: type and count per field, the rule
|
|
285
|
+
* id of a refusal, and nothing derived from a value — no value, fragment,
|
|
286
|
+
* length or digest. The tool name is kept only when it is id-shaped.
|
|
287
|
+
*/
|
|
288
|
+
export interface EgressObservationLine {
|
|
289
|
+
ts: string;
|
|
290
|
+
platform: string;
|
|
291
|
+
event: string;
|
|
292
|
+
tool: string | null;
|
|
293
|
+
mode: EgressMode;
|
|
294
|
+
scanned: EgressField[];
|
|
295
|
+
counts: EgressCount[];
|
|
296
|
+
refused: EgressRefusal[];
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
export function observationLine(envelope: JsonObject, result: EgressStageResult): EgressObservationLine {
|
|
300
|
+
const tool = payloadOf(envelope)?.["tool_name"];
|
|
301
|
+
return {
|
|
302
|
+
ts: new Date().toISOString(),
|
|
303
|
+
platform: String(envelope["platform"] ?? ""),
|
|
304
|
+
event: String(envelope["event"] ?? ""),
|
|
305
|
+
tool: typeof tool === "string" && TOOL_NAME.test(tool) ? tool : null,
|
|
306
|
+
mode: result.mode,
|
|
307
|
+
scanned: [...result.scanned],
|
|
308
|
+
counts: result.counts.map((c) => ({ field: c.field, class: c.class, type: c.type, count: c.count })),
|
|
309
|
+
refused: result.refused.map((r) => ({ field: r.field, rule: r.rule })),
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
export function recordObservation(workspaceRoot: string, line: EgressObservationLine): void {
|
|
314
|
+
if (is_replay_mode()) return;
|
|
315
|
+
try {
|
|
316
|
+
const file = path.join(workspaceRoot, OBSERVATION_FILE);
|
|
317
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
318
|
+
try {
|
|
319
|
+
if (fs.statSync(file).size > OBSERVATION_FILE_MAX_BYTES) fs.renameSync(file, `${file}.1`);
|
|
320
|
+
} catch {
|
|
321
|
+
// no file yet
|
|
322
|
+
}
|
|
323
|
+
fs.appendFileSync(file, `${JSON.stringify(line)}\n`, "utf8");
|
|
324
|
+
} catch {
|
|
325
|
+
// observability never breaks the hook
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Runs before the concern loop. Reads the mode only when the event carries a
|
|
331
|
+
* prompt or a tool body, so a body-less event pays one property read. Never
|
|
332
|
+
* throws: an unexpected failure in `protect` or `strict` withholds every body
|
|
333
|
+
* from the placeholder view rather than serving it raw.
|
|
334
|
+
*/
|
|
335
|
+
export function runEgressStage(
|
|
336
|
+
envelope: JsonObject,
|
|
337
|
+
readMode: (workspaceRoot: string) => EgressMode = readEgressMode,
|
|
338
|
+
loadEngine: () => ReturnType<typeof loadEgressEngine> = loadEgressEngine,
|
|
339
|
+
): EgressStageResult {
|
|
340
|
+
const none: EgressStageResult = { mode: "off", placeholder: undefined, scanned: [], counts: [], refused: [] };
|
|
341
|
+
const payload = payloadOf(envelope);
|
|
342
|
+
if (payload === null || !FIELDS.some((f) => presentKeys(payload, f).length > 0)) return none;
|
|
343
|
+
const workspaceRoot = String(envelope["workspace_root"] || process.cwd());
|
|
344
|
+
let mode: EgressMode;
|
|
345
|
+
try {
|
|
346
|
+
mode = readMode(workspaceRoot);
|
|
347
|
+
} catch {
|
|
348
|
+
mode = "protect";
|
|
349
|
+
}
|
|
350
|
+
if (mode === "off") return none;
|
|
351
|
+
let result: EgressStageResult;
|
|
352
|
+
try {
|
|
353
|
+
const engine = requireEngine(loadEngine);
|
|
354
|
+
const counted = countEnvelope(envelope, engine);
|
|
355
|
+
const placeholder = mode === "observe" ? undefined : buildPlaceholderEnvelope(envelope, engine);
|
|
356
|
+
result = { mode, placeholder, ...counted };
|
|
357
|
+
} catch (exc) {
|
|
358
|
+
const rule = exc instanceof EngineUnavailableError ? ENGINE_UNAVAILABLE : "stage-error";
|
|
359
|
+
const scanned = FIELDS.filter((f) => presentKeys(payload, f).length > 0);
|
|
360
|
+
const refused = scanned.map((field) => ({ field, rule }));
|
|
361
|
+
if (mode === "observe") {
|
|
362
|
+
result = { ...none, mode, scanned, refused };
|
|
363
|
+
} else {
|
|
364
|
+
const withheld: JsonObject = { ...payload };
|
|
365
|
+
for (const f of scanned) {
|
|
366
|
+
for (const k of presentKeys(payload, f)) withheld[k] = { [WITHHELD_MARKER]: true, rule };
|
|
367
|
+
}
|
|
368
|
+
result = { ...none, mode, scanned, refused, placeholder: { ...envelope, payload: withheld } };
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
recordObservation(workspaceRoot, observationLine(envelope, result));
|
|
372
|
+
return result;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Text this package injects into a session — hot context and a handoff at
|
|
377
|
+
* session start, memory recall and every other concern's reply — passes the
|
|
378
|
+
* engine too (road-to-one-detector-and-the-senders-we-own 3.5). In `protect`
|
|
379
|
+
* and `strict` each listed value becomes its token under one scope per
|
|
380
|
+
* dispatch; text whose secret has no provable extent, or that no engine can
|
|
381
|
+
* read, is withheld whole. `off` and `observe` change nothing. Returns a
|
|
382
|
+
* function so the mode is read once per dispatch, and only when there is text.
|
|
383
|
+
*/
|
|
384
|
+
export function egressInjection(
|
|
385
|
+
workspaceRoot: string,
|
|
386
|
+
readMode: (workspaceRoot: string) => EgressMode = readEgressMode,
|
|
387
|
+
loadEngine: () => ReturnType<typeof loadEgressEngine> = loadEgressEngine,
|
|
388
|
+
): (text: string) => string {
|
|
389
|
+
let inject: ((text: string) => string) | undefined;
|
|
390
|
+
return (text) => (inject ??= injector(workspaceRoot, readMode, loadEngine))(text);
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
function injector(
|
|
394
|
+
workspaceRoot: string,
|
|
395
|
+
readMode: (workspaceRoot: string) => EgressMode,
|
|
396
|
+
loadEngine: () => ReturnType<typeof loadEgressEngine>,
|
|
397
|
+
): (text: string) => string {
|
|
398
|
+
let mode: EgressMode;
|
|
399
|
+
try {
|
|
400
|
+
mode = readMode(workspaceRoot);
|
|
401
|
+
} catch {
|
|
402
|
+
mode = "protect";
|
|
403
|
+
}
|
|
404
|
+
if (mode !== "protect" && mode !== "strict") return (t) => t;
|
|
405
|
+
const load = loadEngine();
|
|
406
|
+
if (!load.ok) return () => `${WITHHELD_PREFIX}${ENGINE_UNAVAILABLE})]`;
|
|
407
|
+
let scope: InstanceType<typeof load.engine.TokenScope> | undefined;
|
|
408
|
+
return (t) => {
|
|
409
|
+
try {
|
|
410
|
+
scope ??= new load.engine.TokenScope();
|
|
411
|
+
return load.engine.injectText(t, scope);
|
|
412
|
+
} catch {
|
|
413
|
+
return `${WITHHELD_PREFIX}engine-threw)]`;
|
|
414
|
+
}
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
const WITHHELD_PREFIX = "[egress: injected text withheld (";
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* A refusal's reason may be withheld, never the fact of who refused. Without
|
|
422
|
+
* the concern name a withheld block reads as an unexplained deny, and the user
|
|
423
|
+
* cannot tell which guard to look up.
|
|
424
|
+
*/
|
|
425
|
+
export function attributeRefusal(concernName: string, refused: boolean, text: string): string {
|
|
426
|
+
return refused && text.startsWith(WITHHELD_PREFIX) ? `${concernName}: BLOCKED — reason ${text}` : text;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
export type PublishedState = "asserted" | "replaced" | "gated" | "uncovered";
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* The state a channel may be published in. A thrown kill switch, or a mode that
|
|
433
|
+
* replaces nothing, makes every channel `uncovered` whatever evidence was
|
|
434
|
+
* committed for it, so a stale `replaced` can never outlive the stage.
|
|
435
|
+
*/
|
|
436
|
+
export function publishedEgressState(claimed: PublishedState, mode: EgressMode): PublishedState {
|
|
437
|
+
if (isEnvKillSwitchActive(EGRESS_STAGE_KILL_SWITCH)) return "uncovered";
|
|
438
|
+
if (mode !== "protect" && mode !== "strict") return "uncovered";
|
|
439
|
+
return claimed;
|
|
440
|
+
}
|
|
@@ -24,14 +24,38 @@ import * as tty from 'node:tty';
|
|
|
24
24
|
|
|
25
25
|
import { readStdinText } from '../_lib/stdin.js';
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
/**
|
|
28
|
+
* The override lives on `globalThis`, not in a module-local binding, and that
|
|
29
|
+
* is load-bearing rather than stylistic.
|
|
30
|
+
*
|
|
31
|
+
* A concern loaded from a conditional chunk (`hooks/lazy_concern.ts`) is a
|
|
32
|
+
* SECOND module graph in the same process: it carries its own copy of this
|
|
33
|
+
* file. A module-local `_override` set by the dispatcher is then invisible to
|
|
34
|
+
* the concern, which falls through to fd 0 — already consumed — and reads an
|
|
35
|
+
* empty envelope. Measured 2026-10-20: the lazily loaded `chat-history` concern
|
|
36
|
+
* wrote no history line at all, silently and with exit code 0.
|
|
37
|
+
*
|
|
38
|
+
* The seam is a property of the PROCESS — "the per-concern envelope currently
|
|
39
|
+
* being delivered" — so it belongs where every graph in the process can see it.
|
|
40
|
+
* The symbol is registered in the global symbol registry so two copies of this
|
|
41
|
+
* module resolve the same key.
|
|
42
|
+
*/
|
|
43
|
+
const OVERRIDE_KEY = Symbol.for('agent-config.hookStdinOverride');
|
|
44
|
+
|
|
45
|
+
interface OverrideHost {
|
|
46
|
+
[OVERRIDE_KEY]?: string | null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function host(): OverrideHost {
|
|
50
|
+
return globalThis as unknown as OverrideHost;
|
|
51
|
+
}
|
|
28
52
|
|
|
29
53
|
export function setHookStdinOverride(raw: string): void {
|
|
30
|
-
|
|
54
|
+
host()[OVERRIDE_KEY] = raw;
|
|
31
55
|
}
|
|
32
56
|
|
|
33
57
|
export function clearHookStdinOverride(): void {
|
|
34
|
-
|
|
58
|
+
host()[OVERRIDE_KEY] = null;
|
|
35
59
|
}
|
|
36
60
|
|
|
37
61
|
/**
|
|
@@ -138,7 +162,8 @@ export function readFd0ToEnd(): string {
|
|
|
138
162
|
* large-payload truncation both halves prevent.
|
|
139
163
|
*/
|
|
140
164
|
export function readHookStdin(): string {
|
|
141
|
-
|
|
165
|
+
const override = host()[OVERRIDE_KEY];
|
|
166
|
+
if (override !== null && override !== undefined) return override;
|
|
142
167
|
try {
|
|
143
168
|
if (tty.isatty(0)) return '';
|
|
144
169
|
return readFd0ToEnd();
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* host_docs_pages — the reader for the sibling page list.
|
|
3
|
+
*
|
|
4
|
+
* `host_lowering.yaml` carries a `verified.docs_url` per host and
|
|
5
|
+
* `check_host_docs_digest` watches exactly those. Every one of them is a HOOKS
|
|
6
|
+
* page, because that is what a lowering row is about. A vendor page this tree
|
|
7
|
+
* reads for anything else reached the tree only by accident — nothing
|
|
8
|
+
* re-fetched it and nothing noticed when it moved.
|
|
9
|
+
*
|
|
10
|
+
* `host_docs_pages.yaml` is the list of those other pages. This module reads it
|
|
11
|
+
* and writes digests back into it, with the same two disciplines the sibling
|
|
12
|
+
* reader follows:
|
|
13
|
+
*
|
|
14
|
+
* - PARSE with the YAML library, because the file is hand-written and a
|
|
15
|
+
* regex reader would accept shapes the schema does not.
|
|
16
|
+
* - WRITE by editing the two lines whose content changed, NOT by a
|
|
17
|
+
* `parseDocument` round-trip. The sibling learned that the hard way: a
|
|
18
|
+
* round-trip renormalises hand-aligned blocks and produces a diff nobody
|
|
19
|
+
* reads. Here the stake is smaller and the reason is the same — a
|
|
20
|
+
* scheduled job's commit should contain only what moved.
|
|
21
|
+
*
|
|
22
|
+
* Node-reading but logic-pure: every exported function takes TEXT, so a test
|
|
23
|
+
* can exercise the whole round trip over a fixture without touching the
|
|
24
|
+
* committed file.
|
|
25
|
+
*/
|
|
26
|
+
import * as path from 'node:path';
|
|
27
|
+
import { fileURLToPath } from 'node:url';
|
|
28
|
+
|
|
29
|
+
import { parse as parseYaml } from 'yaml';
|
|
30
|
+
|
|
31
|
+
declare const __AGENT_CONFIG_BUNDLE__: boolean | undefined;
|
|
32
|
+
const _IN_BUNDLE = typeof __AGENT_CONFIG_BUNDLE__ !== 'undefined' && __AGENT_CONFIG_BUNDLE__;
|
|
33
|
+
const _REPO_ROOT = path.resolve(
|
|
34
|
+
path.dirname(fileURLToPath(import.meta.url)),
|
|
35
|
+
...(_IN_BUNDLE ? ['..', '..'] : ['..', '..', '..']),
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
export const HOST_DOCS_PAGES_PATH = path.join(
|
|
39
|
+
_REPO_ROOT,
|
|
40
|
+
'src',
|
|
41
|
+
'scripts',
|
|
42
|
+
'hooks',
|
|
43
|
+
'host_docs_pages.yaml',
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* The name the watcher prints in the `host` column for a page-list row.
|
|
48
|
+
*
|
|
49
|
+
* The watcher's finding shape is `(host, surface)` and a page has neither. It
|
|
50
|
+
* borrows the pair rather than growing a third axis: `pages/<id>` reads as one
|
|
51
|
+
* identifier and sorts beside `claude/any` without pretending to be a host.
|
|
52
|
+
*/
|
|
53
|
+
export const PAGES_PSEUDO_HOST = 'pages';
|
|
54
|
+
|
|
55
|
+
export interface DocsPage {
|
|
56
|
+
readonly id: string;
|
|
57
|
+
readonly docs_url: string;
|
|
58
|
+
readonly docs_at: string;
|
|
59
|
+
readonly docs_digest: string | null;
|
|
60
|
+
readonly expires: string;
|
|
61
|
+
readonly why: string;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export class MalformedDocsPages extends Error {}
|
|
65
|
+
|
|
66
|
+
const ISO_DATE = /^\d{4}-\d{2}-\d{2}$/;
|
|
67
|
+
const SHA256 = /^[0-9a-f]{64}$/;
|
|
68
|
+
|
|
69
|
+
function _str(row: Record<string, unknown>, id: string, key: string): string {
|
|
70
|
+
const v = row[key];
|
|
71
|
+
if (typeof v !== 'string' || v.trim() === '') {
|
|
72
|
+
throw new MalformedDocsPages(`page ${id}: ${key} must be a non-empty string`);
|
|
73
|
+
}
|
|
74
|
+
return v.trim();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Parse the list from TEXT.
|
|
79
|
+
*
|
|
80
|
+
* Every field is checked here rather than at the use sites. A `docs_digest`
|
|
81
|
+
* that is neither null nor a sha256, or an `expires` that is not an ISO date,
|
|
82
|
+
* is a malformed row — and the watcher writes a DATE back into this file, so a
|
|
83
|
+
* row it cannot trust is one it must refuse rather than work around.
|
|
84
|
+
*/
|
|
85
|
+
export function parseDocsPages(text: string): Map<string, DocsPage> {
|
|
86
|
+
const doc = parseYaml(text) as unknown;
|
|
87
|
+
if (doc === null || typeof doc !== 'object') {
|
|
88
|
+
throw new MalformedDocsPages('the file must be a mapping with a `pages:` key');
|
|
89
|
+
}
|
|
90
|
+
const pages = (doc as Record<string, unknown>)['pages'];
|
|
91
|
+
if (pages === null || typeof pages !== 'object' || Array.isArray(pages)) {
|
|
92
|
+
throw new MalformedDocsPages('`pages:` must be a mapping of id -> row');
|
|
93
|
+
}
|
|
94
|
+
const out = new Map<string, DocsPage>();
|
|
95
|
+
for (const [id, raw] of Object.entries(pages as Record<string, unknown>)) {
|
|
96
|
+
if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
97
|
+
throw new MalformedDocsPages(`page ${id}: a row must be a mapping`);
|
|
98
|
+
}
|
|
99
|
+
const row = raw as Record<string, unknown>;
|
|
100
|
+
const docs_url = _str(row, id, 'docs_url');
|
|
101
|
+
const docs_at = _str(row, id, 'docs_at');
|
|
102
|
+
const expires = _str(row, id, 'expires');
|
|
103
|
+
const why = _str(row, id, 'why');
|
|
104
|
+
const digestRaw = row['docs_digest'];
|
|
105
|
+
if (!(digestRaw === null || digestRaw === undefined || typeof digestRaw === 'string')) {
|
|
106
|
+
throw new MalformedDocsPages(`page ${id}: docs_digest must be a sha256 string or null`);
|
|
107
|
+
}
|
|
108
|
+
const docs_digest = typeof digestRaw === 'string' && digestRaw.trim() !== ''
|
|
109
|
+
? digestRaw.trim()
|
|
110
|
+
: null;
|
|
111
|
+
if (!ISO_DATE.test(docs_at)) throw new MalformedDocsPages(`page ${id}: docs_at must be YYYY-MM-DD`);
|
|
112
|
+
if (!ISO_DATE.test(expires)) throw new MalformedDocsPages(`page ${id}: expires must be YYYY-MM-DD`);
|
|
113
|
+
if (docs_digest !== null && !SHA256.test(docs_digest)) {
|
|
114
|
+
throw new MalformedDocsPages(`page ${id}: docs_digest must be 64 hex characters`);
|
|
115
|
+
}
|
|
116
|
+
if (!/^https:\/\//.test(docs_url)) {
|
|
117
|
+
throw new MalformedDocsPages(`page ${id}: docs_url must be an https URL`);
|
|
118
|
+
}
|
|
119
|
+
out.set(id, { id, docs_url, docs_at, docs_digest, expires, why });
|
|
120
|
+
}
|
|
121
|
+
if (out.size === 0) {
|
|
122
|
+
// An EMPTY list is refused rather than reported clean. A watcher that
|
|
123
|
+
// silently walks zero rows is indistinguishable from a watcher that
|
|
124
|
+
// works — the same scan-scope argument every gate in this tree carries.
|
|
125
|
+
throw new MalformedDocsPages('`pages:` is empty — a watcher over zero rows reports nothing and proves nothing');
|
|
126
|
+
}
|
|
127
|
+
return out;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Rewrite a page's `docs_digest`, its `expires`, or both — whichever the edit
|
|
132
|
+
* names.
|
|
133
|
+
*
|
|
134
|
+
* The two are separable because the watcher's two outcomes want different
|
|
135
|
+
* halves of the row, and mirroring the sibling table matters more than a
|
|
136
|
+
* simpler signature: a FILLED row gets its first digest, and a CHANGED row
|
|
137
|
+
* keeps the digest it recorded (that is the evidence) while `expires` is pulled
|
|
138
|
+
* back to the day before detection.
|
|
139
|
+
*
|
|
140
|
+
* Line-located structurally: the walk tracks the two-space page header and only
|
|
141
|
+
* rewrites fields inside THAT row, so a `docs_digest:` in the file's header
|
|
142
|
+
* comment or under a different page is never hit. Returns the text unchanged,
|
|
143
|
+
* and reports the id as missed, when the row is not found — a silent no-op
|
|
144
|
+
* here would read as a successful write.
|
|
145
|
+
*/
|
|
146
|
+
export function applyDocsPageEdits(
|
|
147
|
+
yamlText: string,
|
|
148
|
+
edits: ReadonlyArray<{ id: string; digest?: string; expires?: string }>,
|
|
149
|
+
): { text: string; written: string[]; expired: string[]; missed: string[] } {
|
|
150
|
+
const wanted = new Map(edits.map((e) => [e.id, e]));
|
|
151
|
+
const lines = yamlText.split('\n');
|
|
152
|
+
const written: string[] = [];
|
|
153
|
+
const expired: string[] = [];
|
|
154
|
+
const seen = new Set<string>();
|
|
155
|
+
let current: string | null = null;
|
|
156
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
157
|
+
const line = lines[i] as string;
|
|
158
|
+
const header = /^ {2}([A-Za-z0-9][A-Za-z0-9._-]*):\s*$/.exec(line);
|
|
159
|
+
if (header) {
|
|
160
|
+
current = header[1] as string;
|
|
161
|
+
if (wanted.has(current)) seen.add(current);
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
// A line at column 0 ends the `pages:` block; nothing below it is a row.
|
|
165
|
+
if (/^\S/.test(line)) {
|
|
166
|
+
current = null;
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (current === null) continue;
|
|
170
|
+
const edit = wanted.get(current);
|
|
171
|
+
if (edit === undefined) continue;
|
|
172
|
+
if (edit.digest !== undefined) {
|
|
173
|
+
const digestLine = /^(\s+docs_digest:\s*)(.*)$/.exec(line);
|
|
174
|
+
if (digestLine) {
|
|
175
|
+
lines[i] = `${digestLine[1] as string}${edit.digest}`;
|
|
176
|
+
written.push(current);
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (edit.expires !== undefined) {
|
|
181
|
+
const expiresLine = /^(\s+expires:\s*)(.*)$/.exec(line);
|
|
182
|
+
if (expiresLine) {
|
|
183
|
+
lines[i] = `${expiresLine[1] as string}${edit.expires}`;
|
|
184
|
+
expired.push(current);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
text: lines.join('\n'),
|
|
190
|
+
written,
|
|
191
|
+
expired,
|
|
192
|
+
missed: [...wanted.keys()].filter((id) => !seen.has(id)),
|
|
193
|
+
};
|
|
194
|
+
}
|