sneakoscope 6.0.3 → 6.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -12
- package/config/codex-releases/{rust-v0.142.0.json → rust-v0.144.1.json} +6 -6
- package/crates/sks-core/Cargo.lock +1 -1
- package/crates/sks-core/Cargo.toml +1 -1
- package/dist/bin/fast-inline.js +18 -14
- package/dist/bin/sks-dispatch.js +2 -4
- package/dist/cli/args.js +2 -0
- package/dist/cli/command-manifest-lite.js +2 -3
- package/dist/cli/command-registry.js +3 -4
- package/dist/cli/help-fast.js +1 -1
- package/dist/cli/install-helpers.js +348 -763
- package/dist/cli/install-tool-helpers.js +287 -0
- package/dist/cli/router.js +91 -6
- package/dist/commands/codex-lb.js +188 -53
- package/dist/commands/codex.js +44 -5
- package/dist/commands/doctor.js +302 -46
- package/dist/commands/tmux.js +5 -1
- package/dist/commands/versioning.js +7 -0
- package/dist/commands/zellij-monitor-pane.js +2 -0
- package/dist/commands/zellij-viewport-pane.js +3 -1
- package/dist/commands/zellij.js +1 -1
- package/dist/config/skills-manifest.json +59 -59
- package/dist/core/agent-bridge/agent-manifest.js +48 -0
- package/dist/core/agents/agent-central-ledger.js +9 -0
- package/dist/core/agents/agent-cleanup-executor.js +334 -41
- package/dist/core/agents/agent-cleanup.js +20 -1
- package/dist/core/agents/agent-command-surface.js +3 -1
- package/dist/core/agents/agent-effort-policy.js +30 -38
- package/dist/core/agents/agent-janitor.js +9 -10
- package/dist/core/agents/agent-namespace-safety.js +56 -0
- package/dist/core/agents/agent-orchestrator.js +25 -3
- package/dist/core/agents/agent-output-validator.js +1 -1
- package/dist/core/agents/agent-plan.js +100 -21
- package/dist/core/agents/agent-role-config.js +43 -49
- package/dist/core/agents/agent-runner-codex-exec.js +18 -3
- package/dist/core/agents/agent-runner-process.js +1 -0
- package/dist/core/agents/agent-schema.js +3 -2
- package/dist/core/agents/fast-mode-policy.js +3 -5
- package/dist/core/agents/native-cli-session-swarm.js +1 -1
- package/dist/core/agents/native-worker-backend-router.js +2 -1
- package/dist/core/agents/work-partition/repo-inventory.js +68 -7
- package/dist/core/agents/zellij-right-lane-cockpit.js +2 -2
- package/dist/core/code-structure.js +5 -4
- package/dist/core/codex/agent-config-file-repair.js +94 -193
- package/dist/core/codex/codex-cli-update.js +723 -0
- package/dist/core/codex/codex-config-guard.js +38 -11
- package/dist/core/codex/codex-project-config-policy.js +3 -6
- package/dist/core/codex/codex-startup-config-postcheck.js +52 -42
- package/dist/core/codex-adapter.js +35 -22
- package/dist/core/codex-app/codex-agent-role-sync.js +13 -54
- package/dist/core/codex-app/codex-app-fast-ui-repair.js +51 -20
- package/dist/core/codex-app/codex-app-launcher.js +48 -17
- package/dist/core/codex-app/codex-app-restart.js +23 -2
- package/dist/core/codex-app/codex-app-ui-state-snapshot.js +11 -3
- package/dist/core/codex-app/sks-menubar.js +136 -5
- package/dist/core/codex-app.js +35 -14
- package/dist/core/codex-compat/codex-hook-warning-detector.js +10 -1
- package/dist/core/codex-compat/codex-release-manifest.js +6 -6
- package/dist/core/codex-control/codex-0139-doctor-real-probe.js +7 -1
- package/dist/core/codex-control/codex-0139-image-path-real-probe.js +29 -12
- package/dist/core/codex-control/codex-0139-probe-runner.js +103 -28
- package/dist/core/codex-control/codex-0139-real-probe-summary.js +7 -3
- package/dist/core/codex-control/codex-0139-real-probes.js +21 -6
- package/dist/core/codex-control/codex-0139-sandbox-real-probe.js +39 -13
- package/dist/core/codex-control/codex-0139-web-search-probe.js +28 -14
- package/dist/core/codex-control/{codex-0142-capability.js → codex-0144-capability.js} +22 -22
- package/dist/core/codex-control/codex-0144-collab-agent-real-probe.js +63 -0
- package/dist/core/codex-control/codex-lb-launch-recovery.js +278 -0
- package/dist/core/codex-control/codex-multi-agent-event-normalizer.js +5 -1
- package/dist/core/codex-control/codex-reliability-shield.js +93 -30
- package/dist/core/codex-control/codex-sdk-adapter.js +96 -13
- package/dist/core/codex-control/codex-sdk-config-policy.js +2 -1
- package/dist/core/codex-control/codex-sdk-sandbox-policy.js +6 -3
- package/dist/core/codex-control/codex-task-runner.js +62 -9
- package/dist/core/codex-control/python-codex-sdk-adapter.js +30 -3
- package/dist/core/codex-exec-output-schema.js +35 -6
- package/dist/core/codex-lb/codex-lb-env.js +30 -1
- package/dist/core/codex-lb/codex-lb-tool-catalog.js +478 -0
- package/dist/core/codex-lb/codex-lb-tool-output-recovery.js +291 -0
- package/dist/core/codex-native/codex-native-feature-broker.js +31 -38
- package/dist/core/codex-native/codex-native-feature-matrix.js +2 -2
- package/dist/core/codex-native/codex-native-repair-transaction.js +1 -1
- package/dist/core/codex-native/core-skill-manifest.js +8 -4
- package/dist/core/codex-native/native-capability-postcheck.js +16 -8
- package/dist/core/codex-native/native-capability-repair-matrix.js +76 -27
- package/dist/core/codex-plugins/codex-plugin-json.js +67 -21
- package/dist/core/codex-plugins/codex-plugin-repair.js +118 -0
- package/dist/core/codex-runtime/codex-desktop-config-policy.js +305 -0
- package/dist/core/commands/agent-bridge-command.js +23 -2
- package/dist/core/commands/agent-command.js +38 -5
- package/dist/core/commands/basic-cli.js +77 -30
- package/dist/core/commands/command-utils.js +1 -1
- package/dist/core/commands/gc-command.js +27 -4
- package/dist/core/commands/image-ux-review-command.js +55 -24
- package/dist/core/commands/mad-sks-command.js +182 -137
- package/dist/core/commands/naruto-command.js +643 -1153
- package/dist/core/commands/pipeline-command.js +1 -0
- package/dist/core/commands/research-command.js +293 -231
- package/dist/core/commands/run-command.js +100 -23
- package/dist/core/commands/team-command.js +2 -3
- package/dist/core/commands/team-legacy-observe-command.js +94 -359
- package/dist/core/commands/wiki-command.js +179 -83
- package/dist/core/computer-use-live-evidence.js +166 -3
- package/dist/core/computer-use-status.js +5 -2
- package/dist/core/daemon/sksd-hook-daemon-entrypoint.js +2 -2
- package/dist/core/daemon/sksd-hook-daemon.js +171 -28
- package/dist/core/daemon/sksd-hook-dispatch.js +2 -2
- package/dist/core/db-safety.js +2 -2
- package/dist/core/decision-lattice.js +6 -6
- package/dist/core/dfix/verification-selector.js +6 -4
- package/dist/core/doctor/browser-use-repair.js +54 -13
- package/dist/core/doctor/codex-0139-doctor.js +3 -2
- package/dist/core/doctor/codex-startup-config-repair.js +8 -3
- package/dist/core/doctor/computer-use-repair.js +28 -39
- package/dist/core/doctor/doctor-codex-startup-repair.js +24 -149
- package/dist/core/doctor/doctor-context7-repair.js +1 -1
- package/dist/core/doctor/doctor-dirty-planner.js +1 -1
- package/dist/core/doctor/doctor-native-capability-repair.js +74 -3
- package/dist/core/doctor/imagegen-repair.js +47 -12
- package/dist/core/doctor/legacy-global-hook-cleanup.js +179 -0
- package/dist/core/feature-fixture-executor.js +71 -7
- package/dist/core/feature-fixture-runner.js +53 -12
- package/dist/core/feature-fixtures.js +47 -14
- package/dist/core/feature-registry.js +53 -58
- package/dist/core/fsx.js +54 -6
- package/dist/core/harness-conflicts.js +19 -10
- package/dist/core/hooks-runtime/code-pack-freshness-preflight.js +5 -4
- package/dist/core/hooks-runtime/hook-invocation-dedupe.js +147 -0
- package/dist/core/hooks-runtime/hook-io.js +14 -4
- package/dist/core/hooks-runtime/light-turn.js +70 -0
- package/dist/core/hooks-runtime/payload-signals.js +270 -0
- package/dist/core/hooks-runtime/team-digest.js +0 -1
- package/dist/core/hooks-runtime/tool-output-quarantine.js +93 -0
- package/dist/core/hooks-runtime.js +418 -250
- package/dist/core/image/image-artifact-path-contract.js +8 -6
- package/dist/core/image/image-artifact-registry.js +5 -1
- package/dist/core/image-ux-review/imagegen-adapter.js +5 -2
- package/dist/core/imagegen/imagegen-capability.js +10 -13
- package/dist/core/imagegen/require-imagegen.js +37 -11
- package/dist/core/init/skills.js +16 -30
- package/dist/core/init.js +144 -36
- package/dist/core/managed-assets/managed-assets-manifest.js +417 -14
- package/dist/core/mission.js +24 -1
- package/dist/core/naruto/naruto-work-graph.js +70 -4
- package/dist/core/ops/reporting.js +3 -0
- package/dist/core/pipeline-internals/runtime-core.js +578 -180
- package/dist/core/pipeline-internals/runtime-gates.js +191 -49
- package/dist/core/ppt/style-tokens.js +1 -1
- package/dist/core/ppt-review/index.js +1 -1
- package/dist/core/ppt-review/slide-exporter.js +23 -17
- package/dist/core/ppt-review/slide-imagegen-review.js +1 -1
- package/dist/core/ppt-review/slide-issue-extraction.js +4 -2
- package/dist/core/preflight/parallel-preflight-engine.js +50 -1
- package/dist/core/product-design-plugin.js +2 -2
- package/dist/core/proof/route-finalizer.js +1 -1
- package/dist/core/proof/route-proof-gate.js +7 -2
- package/dist/core/proof-field.js +3 -3
- package/dist/core/provider/model-router.js +38 -32
- package/dist/core/recallpulse/policy.js +12 -28
- package/dist/core/recallpulse.js +11 -6
- package/dist/core/release/gate-manifest.js +18 -12
- package/dist/core/release/gate-pack-manifest.js +1 -1
- package/dist/core/release/npm-pack-proof.js +247 -0
- package/dist/core/release/package-dist-snapshot.js +151 -0
- package/dist/core/release/package-size-budget.js +5 -0
- package/dist/core/release/release-authorization-snapshot.js +115 -0
- package/dist/core/release/release-gate-affected-selector.js +15 -3
- package/dist/core/release/release-gate-cache-v2.js +30 -0
- package/dist/core/release/release-gate-contract.js +161 -0
- package/dist/core/release/release-gate-dag.js +44 -3
- package/dist/core/release/release-gate-hermetic-env.js +28 -17
- package/dist/core/release/release-real-contract.js +496 -0
- package/dist/core/release-parallel-full-coverage.js +31 -143
- package/dist/core/research/claim-evidence-matrix.js +41 -6
- package/dist/core/research/experiment-plan.js +14 -10
- package/dist/core/research/falsification.js +9 -2
- package/dist/core/research/implementation-blueprint-densifier.js +82 -60
- package/dist/core/research/implementation-blueprint.js +32 -26
- package/dist/core/research/mock-result.js +122 -11
- package/dist/core/research/replication-pack.js +15 -8
- package/dist/core/research/research-adversarial-review.js +1068 -0
- package/dist/core/research/research-claim-builder.js +69 -17
- package/dist/core/research/research-claim-synthesizer.js +343 -0
- package/dist/core/research/research-cycle-runner.js +53 -3
- package/dist/core/research/research-falsification-runner.js +176 -0
- package/dist/core/research/research-final-reviewer.js +44 -125
- package/dist/core/research/research-realistic-report.js +14 -6
- package/dist/core/research/research-review-artifact-digest.js +66 -0
- package/dist/core/research/research-source-evidence.js +144 -0
- package/dist/core/research/research-source-layer-catalog.js +68 -0
- package/dist/core/research/research-source-ledger-merge.js +250 -12
- package/dist/core/research/research-source-shards.js +26 -70
- package/dist/core/research/research-stage-runner.js +237 -247
- package/dist/core/research/research-super-search.js +184 -0
- package/dist/core/research/research-synthesis-prompt.js +20 -1
- package/dist/core/research/research-synthesis-writer.js +86 -5
- package/dist/core/research/research-work-graph.js +25 -18
- package/dist/core/research/source-quality-report.js +21 -0
- package/dist/core/research.js +429 -280
- package/dist/core/retention/retention-budget.js +25 -6
- package/dist/core/retention.js +980 -101
- package/dist/core/routes/constants.js +1 -1
- package/dist/core/routes/dollar-manifest-lite.js +11 -11
- package/dist/core/routes/evidence.js +4 -4
- package/dist/core/routes/ppt-policy.js +1 -1
- package/dist/core/routes.js +92 -64
- package/dist/core/runtime/task-profile.js +66 -0
- package/dist/core/runtime/verification-budget.js +12 -0
- package/dist/core/secret-redaction.js +4 -0
- package/dist/core/security/high-risk-contracts.js +6 -6
- package/dist/core/stop-gate/stop-gate-check.js +49 -12
- package/dist/core/subagents/agent-catalog.js +215 -0
- package/dist/core/subagents/model-policy.js +118 -0
- package/dist/core/subagents/naruto-help-contract.js +40 -0
- package/dist/core/subagents/official-subagent-config.js +488 -0
- package/dist/core/subagents/official-subagent-preparation.js +251 -0
- package/dist/core/subagents/official-subagent-prompt.js +137 -0
- package/dist/core/subagents/official-subagent-runner.js +129 -0
- package/dist/core/subagents/subagent-evidence.js +663 -0
- package/dist/core/subagents/terminology.js +16 -0
- package/dist/core/subagents/thread-budget.js +21 -0
- package/dist/core/subagents/triwiki-attention.js +65 -0
- package/dist/core/super-search/runtime-helpers.js +173 -19
- package/dist/core/super-search/runtime.js +140 -15
- package/dist/core/super-search/source-records.js +49 -8
- package/dist/core/team-review-policy.js +15 -0
- package/dist/core/triwiki/code-pack.js +8 -2
- package/dist/core/triwiki/triwiki-cache-key.js +108 -29
- package/dist/core/triwiki/triwiki-module-card.js +1 -1
- package/dist/core/triwiki-attention.js +13 -6
- package/dist/core/triwiki-provenance.js +274 -0
- package/dist/core/triwiki-runtime.js +21 -7
- package/dist/core/triwiki-wrongness/wrongness-ledger.js +187 -61
- package/dist/core/triwiki-wrongness/wrongness-retrieval.js +11 -2
- package/dist/core/triwiki-wrongness/wrongness-trust-policy.js +2 -0
- package/dist/core/update-check.js +23 -15
- package/dist/core/version-manager.js +51 -1
- package/dist/core/version.js +1 -1
- package/dist/core/wiki-coordinate.js +128 -12
- package/dist/core/work-order-ledger.js +208 -10
- package/dist/core/zellij/zellij-command.js +12 -1
- package/dist/core/zellij/zellij-dashboard-pane.js +3 -3
- package/dist/core/zellij/zellij-fake-adapter.js +3 -1
- package/dist/core/zellij/zellij-launcher.js +51 -21
- package/dist/core/zellij/zellij-layout-builder.js +14 -5
- package/dist/core/zellij/zellij-official-subagent-activity.js +477 -0
- package/dist/core/zellij/zellij-official-subagent-telemetry.js +264 -0
- package/dist/core/zellij/zellij-pane-proof.js +32 -6
- package/dist/core/zellij/zellij-slot-pane-renderer.js +17 -5
- package/dist/core/zellij/zellij-slot-telemetry.js +15 -3
- package/dist/core/zellij/zellij-ui-mode.js +1 -1
- package/dist/core/zellij/zellij-viewport-binder.js +3 -0
- package/dist/core/zellij/zellij-worker-pane-manager.js +5 -3
- package/dist/scripts/agent-fast-mode-default-check.js +48 -29
- package/dist/scripts/agent-role-config-repair-check.js +34 -15
- package/dist/scripts/agent-wiki-context-proof-check.js +16 -2
- package/dist/scripts/all-feature-deep-completion-check.js +14 -4
- package/dist/scripts/architecture-guard-check.js +8 -1
- package/dist/scripts/build-dist.js +17 -5
- package/dist/scripts/canonical-test-runner.js +188 -0
- package/dist/scripts/check-command-module-budget.js +38 -16
- package/dist/scripts/check-legacy-free.js +1 -1
- package/dist/scripts/check-route-modularity.js +0 -1
- package/dist/scripts/check-ts-contracts.js +1 -1
- package/dist/scripts/codex-0139-interrupt-agent-check.js +5 -1
- package/dist/scripts/{codex-0142-app-server-v2-check.js → codex-0144-app-server-v2-check.js} +11 -10
- package/dist/scripts/{codex-0142-binary-identity-check.js → codex-0144-binary-identity-check.js} +4 -4
- package/dist/scripts/codex-0144-capability-check.js +21 -0
- package/dist/scripts/{codex-0139-real-probes-check.js → codex-0144-core-real-probes-check.js} +19 -5
- package/dist/scripts/{codex-0142-doctor-wiring-check.js → codex-0144-doctor-wiring-check.js} +6 -6
- package/dist/scripts/{codex-0142-manifest-check.js → codex-0144-manifest-check.js} +11 -3
- package/dist/scripts/{codex-0142-policy-check.js → codex-0144-policy-check.js} +2 -2
- package/dist/scripts/{codex-0142-thread-store-check.js → codex-0144-thread-store-check.js} +3 -3
- package/dist/scripts/codex-app-provider-model-ui-check.js +53 -19
- package/dist/scripts/codex-app-ui-preservation-check.js +35 -4
- package/dist/scripts/codex-control-all-pipelines-check.js +7 -3
- package/dist/scripts/codex-control-side-effect-scope-check.js +2 -2
- package/dist/scripts/codex-control-tool-output-continuity-audit-check.js +27 -0
- package/dist/scripts/codex-effort-auto-discovery-check.js +1 -1
- package/dist/scripts/codex-lb-fast-mode-truth-check.js +1 -0
- package/dist/scripts/{codex-lb-gpt55-fast-profile-check.js → codex-lb-gpt56-fast-profile-check.js} +56 -5
- package/dist/scripts/codex-model-metadata-check.js +1 -1
- package/dist/scripts/codex-native-agent-role-content-check.js +15 -7
- package/dist/scripts/codex-native-repair-transaction-check.js +3 -1
- package/dist/scripts/codex-sdk-all-pipelines-check.js +7 -4
- package/dist/scripts/codex-sdk-research-pipeline-check.js +30 -8
- package/dist/scripts/codex-sdk-sandbox-policy-check.js +5 -1
- package/dist/scripts/codex-sdk-version-compat-check.js +2 -1
- package/dist/scripts/db-route-materialization-check.js +33 -0
- package/dist/scripts/dfix-fixture-check.js +1 -1
- package/dist/scripts/docs-truthfulness-check.js +4 -2
- package/dist/scripts/doctor-codex-startup-repair-check.js +47 -25
- package/dist/scripts/doctor-context7-repair-check.js +2 -1
- package/dist/scripts/doctor-fix-production-blackbox.js +12 -2
- package/dist/scripts/doctor-fixes-codex-app-fast-ui-check.js +34 -7
- package/dist/scripts/doctor-imagegen-repair-check.js +14 -4
- package/dist/scripts/doctor-startup-config-repair-blackbox.js +9 -3
- package/dist/scripts/doctor-startup-config-repair-check.js +13 -3
- package/dist/scripts/install-update-preserves-config-check.js +7 -2
- package/dist/scripts/legacy-gate-inventory-check.js +7 -5
- package/dist/scripts/legacy-strong-inventory-check.js +7 -5
- package/dist/scripts/legacy-upgrade-matrix-check.js +4 -4
- package/dist/scripts/lib/native-cli-session-swarm-check-lib.js +173 -13
- package/dist/scripts/mad-sks-app-ui-no-mutation-check.js +165 -6
- package/dist/scripts/managed-role-manifest-parity-check.js +5 -4
- package/dist/scripts/mutation-callsite-coverage-check.js +0 -11
- package/dist/scripts/naruto-codex-e2e-check.js +14 -7
- package/dist/scripts/naruto-shadow-clone-swarm-check.js +4 -201
- package/dist/scripts/npm-publish-performance-check.js +20 -12
- package/dist/scripts/official-subagent-workflow-check.js +145 -0
- package/dist/scripts/package-published-contract-check.js +6 -20
- package/dist/scripts/packlist-performance-check.js +17 -3
- package/dist/scripts/parallel-verification-engine-check.js +2 -2
- package/dist/scripts/postinstall-safe-side-effects-check.js +8 -3
- package/dist/scripts/ppt-no-mock-as-real-check.js +3 -1
- package/dist/scripts/prepublish-release-check-or-fast.js +23 -86
- package/dist/scripts/product-design-plugin-routing-check.js +1 -1
- package/dist/scripts/release-affected-selector-check.js +74 -1
- package/dist/scripts/release-check-stamp.js +324 -239
- package/dist/scripts/release-dag-full-coverage-check.js +7 -15
- package/dist/scripts/release-dynamic-presets-check.js +10 -1
- package/dist/scripts/release-gate-dag-runner-check.js +3 -3
- package/dist/scripts/release-gate-dag-runner.js +35 -11
- package/dist/scripts/release-gate-existence-audit.js +1 -2
- package/dist/scripts/release-gate-script-parity-check.js +1 -1
- package/dist/scripts/release-parallel-full-coverage-check.js +12 -6
- package/dist/scripts/release-parallel-speed-budget-check.js +18 -2
- package/dist/scripts/release-real-check.js +390 -157
- package/dist/scripts/release-registry-check.js +61 -16
- package/dist/scripts/release-runtime-truth-matrix-check.js +22 -0
- package/dist/scripts/research-blueprint-densifier-check.js +2 -2
- package/dist/scripts/research-real-cycle-no-legacy-final-md-check.js +11 -7
- package/dist/scripts/route-proof-artifact-structure-check.js +1 -0
- package/dist/scripts/search-visibility-gate-lib.js +1 -1
- package/dist/scripts/seo-geo-route-identity-check.js +30 -4
- package/dist/scripts/sizecheck.js +4 -4
- package/dist/scripts/sks-1-11-gate-lib.js +53 -6
- package/dist/scripts/sks-3-1-4-directive-check-lib.js +8 -2
- package/dist/scripts/sks-3-1-5-directive-check-lib.js +3 -2
- package/dist/scripts/sks-3-1-6-directive-check-lib.js +5 -3
- package/dist/scripts/sks-menubar-install-check.js +8 -0
- package/dist/scripts/sks-uninstall-regression-check.js +1 -1
- package/dist/scripts/sksd-daemon-check.js +16 -6
- package/dist/scripts/trust-fixture-check.js +32 -10
- package/dist/scripts/write-build-manifest.js +2 -1
- package/dist/scripts/wrongness-fixture-check.js +1 -1
- package/dist/scripts/zellij-layout-valid-check.js +36 -11
- package/dist/scripts/zellij-pane-proof-check.js +33 -2
- package/dist/scripts/zellij-real-session-cleanup-check.js +122 -2
- package/dist/scripts/zellij-real-session-launch-check.js +76 -5
- package/dist/scripts/zellij-slot-pane-renderer-check.js +4 -4
- package/dist/scripts/zellij-spawn-on-demand-layout-check.js +3 -3
- package/docs/demo.tape +1 -1
- package/infra-harness-gates.json +1486 -0
- package/package.json +32 -19
- package/release-gates.v2.json +4060 -0
- package/runtime-required-scripts.json +9 -0
- package/schemas/codex/{app-server-0.142 → app-server-0.144}/codex_app_server_protocol.v2.schemas.json +1146 -781
- package/schemas/codex/codex-0139-real-probe-result.schema.json +39 -5
- package/schemas/codex/ppt-slide-issue-ledger.schema.json +2 -1
- package/dist/commands/db.js +0 -6
- package/dist/core/codex-control/codex-0139-multi-agent-real-probe.js +0 -107
- package/dist/core/commands/db-command.js +0 -146
- package/dist/core/research/prompt.js +0 -15
- package/dist/scripts/agent-native-release-gate.js +0 -274
- package/dist/scripts/codex-0142-capability-check.js +0 -21
- package/dist/scripts/codex-control-tool-call-sequence-repair-check.js +0 -14
- package/dist/scripts/command-performance-scorecard-check.js +0 -204
- package/dist/scripts/config-managed-merge-callsite-coverage-check.js +0 -212
- package/dist/scripts/dollar-performance-scorecard-check.js +0 -257
- package/dist/scripts/gate-timing-check.js +0 -16
- package/dist/scripts/ops-maturity-scorecard-check.js +0 -12
- package/dist/scripts/performance-baseline-check.js +0 -12
- package/dist/scripts/performance-improvement-report-check.js +0 -58
- package/dist/scripts/release-parallel-check.js +0 -389
- package/dist/scripts/release-runner-efficiency-check.js +0 -15
- package/dist/scripts/retention-long-run-smoke-check.js +0 -299
- package/docs/assets/sneakoscope-architecture-pipeline.jpg +0 -0
|
@@ -4,6 +4,7 @@ import { managedProxyEnvForChild } from '../codex/managed-proxy-env.js';
|
|
|
4
4
|
import { agentWorkerEnv, validateAgentWorkerResult } from './agent-worker-pipeline.js';
|
|
5
5
|
import { fastModeEnv, resolveFastModePolicy } from './fast-mode-policy.js';
|
|
6
6
|
import { buildCodexExecArgs } from '../codex/codex-cli-syntax-builder.js';
|
|
7
|
+
import { codexLbRecoveryBlockedProcessResult, withCodexLbCliLaunchRecovery } from '../codex-control/codex-lb-launch-recovery.js';
|
|
7
8
|
export function buildCodexExecAgentArgs(agent, prompt, opts = {}) {
|
|
8
9
|
const resultFile = opts.resultFile || defaultCodexResultFile(agent, opts);
|
|
9
10
|
const sandbox = opts.workspaceWrite ? 'workspace-write' : 'read-only';
|
|
@@ -44,6 +45,7 @@ export async function runCodexExecAgent(agent, slice, opts = {}) {
|
|
|
44
45
|
const command = buildCodexExecAgentArgs(agent, opts.prompt || slice?.description || '', opts);
|
|
45
46
|
const proxyEnv = managedProxyEnvForChild({ ...process.env, ...(opts.env || {}) });
|
|
46
47
|
const report = await writeCodexProcessReport(opts.agentRoot || opts.cwd || process.cwd(), agent, {
|
|
48
|
+
project_hash: opts.projectHash || agent.project_hash || agent.root_hash || null,
|
|
47
49
|
command: [opts.codexBin || 'codex', ...command.args],
|
|
48
50
|
profile: opts.profile || null,
|
|
49
51
|
result_file: command.resultFile,
|
|
@@ -71,9 +73,21 @@ export async function runCodexExecAgent(agent, slice, opts = {}) {
|
|
|
71
73
|
const stderrFile = path.join(logRoot, 'codex-exec.stderr.log');
|
|
72
74
|
const allowedCommandsFile = path.join(opts.agentRoot || opts.cwd || process.cwd(), 'agent-allowed-commands.json');
|
|
73
75
|
const workerEnv = agentWorkerEnv(agent, allowedCommandsFile);
|
|
74
|
-
const
|
|
75
|
-
const
|
|
76
|
+
const effectiveEnv = { ...process.env, ...(opts.env || {}) };
|
|
77
|
+
const proxyEnv = managedProxyEnvForChild(effectiveEnv);
|
|
78
|
+
const execute = opts.runProcessImpl || runProcess;
|
|
79
|
+
const guarded = await withCodexLbCliLaunchRecovery({
|
|
80
|
+
root: opts.cwd || process.cwd(),
|
|
81
|
+
env: effectiveEnv,
|
|
82
|
+
cliArgs: command.args.slice(0, -1),
|
|
83
|
+
...(typeof opts.recoveryFetch === 'function' ? { fetchImpl: opts.recoveryFetch } : {}),
|
|
84
|
+
...(opts.recoveryTimeoutMs === undefined ? {} : { timeoutMs: opts.recoveryTimeoutMs })
|
|
85
|
+
}, () => execute(opts.codexBin || 'codex', command.args, { cwd: opts.cwd || process.cwd(), env: { ...(opts.env || {}), ...proxyEnv, ...fastModeEnv(fastPolicy), ...workerEnv }, timeoutMs: opts.timeoutMs || 30 * 60 * 1000, maxOutputBytes: 256 * 1024, stdoutFile, stderrFile }));
|
|
86
|
+
const result = guarded.launched
|
|
87
|
+
? guarded.value
|
|
88
|
+
: codexLbRecoveryBlockedProcessResult(guarded.toolOutputRecovery);
|
|
76
89
|
const report = await writeCodexProcessReport(opts.agentRoot || opts.cwd || process.cwd(), agent, {
|
|
90
|
+
project_hash: opts.projectHash || agent.project_hash || agent.root_hash || null,
|
|
77
91
|
command: [opts.codexBin || 'codex', ...command.args],
|
|
78
92
|
profile: opts.profile || null,
|
|
79
93
|
result_file: command.resultFile,
|
|
@@ -97,6 +111,7 @@ export async function runCodexExecAgent(agent, slice, opts = {}) {
|
|
|
97
111
|
stderr_bytes: result.stderrBytes,
|
|
98
112
|
truncated: result.truncated,
|
|
99
113
|
timed_out: result.timedOut,
|
|
114
|
+
codex_lb_tool_output_recovery: guarded.toolOutputRecovery,
|
|
100
115
|
dry_run: false
|
|
101
116
|
});
|
|
102
117
|
if (result.code === 0) {
|
|
@@ -121,7 +136,7 @@ export async function runCodexExecAgent(agent, slice, opts = {}) {
|
|
|
121
136
|
return { ...validated, status: 'blocked', blockers: [...validated.blockers, 'codex_exec_result_schema_invalid'] };
|
|
122
137
|
}
|
|
123
138
|
}
|
|
124
|
-
return validateAgentWorkerResult({ mission_id: opts.missionId || opts.mission_id || '', agent_id: agent.id, session_id: agent.session_id, persona_id: agent.persona_id || agent.id, task_slice_id: slice?.id || '', status: result.code === 0 ? 'done' : 'failed', backend: 'codex-exec', summary: result.stdout.slice(-1000) || result.stderr.slice(-1000), artifacts: [command.resultFile, report], blockers: result.code === 0 ? ['codex_exec_output_last_message_missing_or_invalid'] : ['codex_exec_exit_' + result.code], confidence: 'verified_partial', unverified: result.code === 0 ? ['codex-exec stdout fallback; resultFile JSON missing or invalid'] : [], writes: [], source_intelligence_refs: agent.source_intelligence_refs || null, goal_mode_ref: agent.goal_mode_ref || null, verification: { status: result.code === 0 ? 'partial' : 'failed', checks: ['codex-exec-exit-code', 'codex-exec-process-report', 'codex-exec-output-last-message'] } });
|
|
139
|
+
return validateAgentWorkerResult({ mission_id: opts.missionId || opts.mission_id || '', agent_id: agent.id, session_id: agent.session_id, persona_id: agent.persona_id || agent.id, task_slice_id: slice?.id || '', status: result.code === 0 ? 'done' : 'failed', backend: 'codex-exec', summary: result.stdout.slice(-1000) || result.stderr.slice(-1000), artifacts: [command.resultFile, report], blockers: result.code === 0 ? ['codex_exec_output_last_message_missing_or_invalid'] : [...(guarded.launched ? [] : guarded.toolOutputRecovery.blockers), 'codex_exec_exit_' + result.code], confidence: 'verified_partial', unverified: result.code === 0 ? ['codex-exec stdout fallback; resultFile JSON missing or invalid'] : [], writes: [], source_intelligence_refs: agent.source_intelligence_refs || null, goal_mode_ref: agent.goal_mode_ref || null, codex_child_report: { tool_output_recovery: guarded.toolOutputRecovery }, verification: { status: result.code === 0 ? 'partial' : 'failed', checks: ['codex-exec-exit-code', 'codex-exec-process-report', 'codex-exec-output-last-message'] } });
|
|
125
140
|
}
|
|
126
141
|
function workerNoMcpDefault(agent, opts = {}, sandbox = 'read-only') {
|
|
127
142
|
if (opts.noMcp !== undefined)
|
|
@@ -48,6 +48,7 @@ export async function runProcessAgent(agent, slice, opts = {}) {
|
|
|
48
48
|
}
|
|
49
49
|
const result = await runProcess(opts.command[0], opts.command.slice(1), { cwd: opts.cwd || process.cwd(), env: { ...(opts.env || {}), ...fastModeEnv(fastPolicy) }, timeoutMs: opts.timeoutMs || 30000, maxOutputBytes: 128 * 1024 });
|
|
50
50
|
const report = await writeAgentProcessReport(opts.agentRoot || opts.cwd || process.cwd(), agent, 'process', {
|
|
51
|
+
project_hash: opts.projectHash || agent.project_hash || agent.root_hash || null,
|
|
51
52
|
command: opts.command,
|
|
52
53
|
service_tier: fastPolicy.service_tier,
|
|
53
54
|
fast_mode: fastPolicy.fast_mode,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { DEFAULT_NARUTO_MAX_THREADS, DEFAULT_NARUTO_REQUESTED_SUBAGENTS, HARD_NARUTO_MAX_THREADS } from '../subagents/thread-budget.js';
|
|
1
2
|
export const AGENT_KERNEL_SCHEMA = 'sks.native-agent-kernel.v1';
|
|
2
3
|
export const AGENT_RESULT_SCHEMA = 'sks.agent-result.v1';
|
|
3
4
|
export const AGENT_LEDGER_EVENT_SCHEMA = 'sks.agent-ledger-event.v1';
|
|
@@ -9,9 +10,9 @@ export const AGENT_COUNT = DEFAULT_AGENT_COUNT;
|
|
|
9
10
|
export const AGENT_INTAKE_STAGE_ID = 'native_agent_intake';
|
|
10
11
|
export const MAX_AGENT_COUNT = 20;
|
|
11
12
|
export const DEFAULT_AGENT_CONCURRENCY = 4;
|
|
12
|
-
|
|
13
|
-
// remain bounded by live CPU, memory, load, and I/O pressure.
|
|
13
|
+
/** @deprecated Legacy process-swarm queue ceiling; never an official thread cap. */
|
|
14
14
|
export const MAX_NARUTO_AGENT_COUNT = 100;
|
|
15
|
+
/** @deprecated Legacy clone default; official workflows use one safe default child unless --agents is explicit. */
|
|
15
16
|
export const DEFAULT_NARUTO_CLONES = 8;
|
|
16
17
|
export const AGENT_BACKENDS = ['fake', 'process', 'codex-sdk', 'zellij', 'ollama', 'local-llm'];
|
|
17
18
|
export function normalizeAgentBackend(input) {
|
|
@@ -18,17 +18,15 @@ export function resolveFastModePolicy(input = {}) {
|
|
|
18
18
|
? 'standard'
|
|
19
19
|
: preference?.mode === 'standard'
|
|
20
20
|
? 'standard'
|
|
21
|
-
:
|
|
22
|
-
? 'fast'
|
|
23
|
-
: 'standard';
|
|
21
|
+
: 'fast';
|
|
24
22
|
return {
|
|
25
23
|
schema: FAST_MODE_POLICY_SCHEMA,
|
|
26
24
|
generated_at: nowIso(),
|
|
27
25
|
fast_mode: serviceTier === 'fast',
|
|
28
26
|
service_tier: serviceTier,
|
|
29
27
|
codex_desktop_service_tier: codexDesktopServiceTier(serviceTier),
|
|
30
|
-
default_fast_mode:
|
|
31
|
-
disabled_by: explicitNoFast ? 'no-fast' : explicitTier === 'standard' ? 'service-tier-standard' : preference?.mode === 'standard' ? 'preference-standard' :
|
|
28
|
+
default_fast_mode: true,
|
|
29
|
+
disabled_by: explicitNoFast ? 'no-fast' : explicitTier === 'standard' ? 'service-tier-standard' : preference?.mode === 'standard' ? 'preference-standard' : 'none',
|
|
32
30
|
explicit_fast: explicitFast,
|
|
33
31
|
explicit_no_fast: explicitNoFast,
|
|
34
32
|
explicit_service_tier: explicitTier,
|
|
@@ -435,7 +435,7 @@ class NativeCliSessionSwarmRecorder {
|
|
|
435
435
|
headless_by_design_viewport_ui: process.env.SKS_ZELLIJ_LEGACY_WORKER_PANES === '1' ? 0 : this.input.targetActiveSlots
|
|
436
436
|
},
|
|
437
437
|
active_workers: this.input.targetActiveSlots,
|
|
438
|
-
visible_panes: Number(process.env.SKS_ZELLIJ_VIEWPORTS ||
|
|
438
|
+
visible_panes: Number(process.env.SKS_ZELLIJ_VIEWPORTS || 1),
|
|
439
439
|
headless_workers: process.env.SKS_ZELLIJ_LEGACY_WORKER_PANES === '1' ? Math.max(0, this.input.targetActiveSlots - this.zellijVisiblePaneCap(input.ctx.opts)) : this.input.targetActiveSlots,
|
|
440
440
|
queue_depth: Math.max(0, this.input.requestedAgents - this.input.targetActiveSlots),
|
|
441
441
|
local_llm: { tps: 0, queue: 0 },
|
|
@@ -12,6 +12,7 @@ import { CODEX_AGENT_WORKER_RESULT_SCHEMA_ID, codexAgentWorkerResultSchema } fro
|
|
|
12
12
|
import { leanEngineeringCompactText, leanPolicyReference } from '../lean-engineering-policy.js';
|
|
13
13
|
import { readCodexLbModelCatalog, readLbHealth } from '../codex-lb/codex-lb-env.js';
|
|
14
14
|
import { categoryForWorkerRole, isNarutoGpt56Model, modelRouteReason, routeModel } from '../provider/model-router.js';
|
|
15
|
+
import { codexTimeoutClassForRoute } from '../codex-control/codex-reliability-shield.js';
|
|
15
16
|
export const NATIVE_WORKER_BACKEND_ROUTER_SCHEMA = 'sks.native-worker-backend-router.v1';
|
|
16
17
|
export async function runNativeWorkerBackendRouter(input) {
|
|
17
18
|
const root = path.resolve(input.agentRoot);
|
|
@@ -147,7 +148,7 @@ export async function runNativeWorkerBackendRouter(input) {
|
|
|
147
148
|
zellijPaneId: await readZellijPaneId(root, input.workerDirRel),
|
|
148
149
|
reliabilityPolicy: {
|
|
149
150
|
maxEmptyResultRetries: 1,
|
|
150
|
-
timeoutClass: 'standard'
|
|
151
|
+
timeoutClass: codexTimeoutClassForRoute(input.intake.route, 'standard')
|
|
151
152
|
}
|
|
152
153
|
});
|
|
153
154
|
outputLastMessagePath = sdkTask.workerResultPath;
|
|
@@ -1,9 +1,50 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
const IGNORE = new Set([
|
|
3
|
+
const IGNORE = new Set([
|
|
4
|
+
'.agents', '.cache', '.claude', '.codex', '.git', '.git-worktrees', '.hg', '.mypy_cache', '.next', '.npm', '.nuxt',
|
|
5
|
+
'.nyc_output', '.parcel-cache', '.pnpm-store', '.pytest_cache', '.ruff_cache', '.sneakoscope', '.svelte-kit', '.svn',
|
|
6
|
+
'.tmp', '.turbo', '.venv', '.worktrees', '.yarn', '__pycache__', 'build', 'coverage', 'dist', 'logs', 'node_modules',
|
|
7
|
+
'out', 'target', 'temp', 'tmp', 'venv'
|
|
8
|
+
]);
|
|
9
|
+
const PRIORITY_DIRS = ['src', 'test', 'docs', 'schemas', 'scripts', 'crates', 'bin'];
|
|
10
|
+
const REPRESENTATIVE_DIRS = ['src', 'test', 'docs'];
|
|
11
|
+
const CORE_FILES = ['package.json', 'package-lock.json', 'README.md', 'CHANGELOG.md', 'LICENSE', 'tsconfig.json', 'release-gates.v2.json', 'runtime-required-scripts.json', 'AGENTS.md'];
|
|
4
12
|
export async function collectRepoInventory(root, opts = {}) {
|
|
5
13
|
const files = [];
|
|
6
|
-
|
|
14
|
+
const seen = new Set();
|
|
15
|
+
const requestedMax = Number(opts.maxFiles ?? process.env.SKS_AGENT_REPO_INVENTORY_MAX_FILES ?? 10000);
|
|
16
|
+
const maxFiles = Number.isFinite(requestedMax) ? Math.max(1, Math.floor(requestedMax)) : 10000;
|
|
17
|
+
const add = (file) => {
|
|
18
|
+
if (files.length >= maxFiles || seen.has(file))
|
|
19
|
+
return;
|
|
20
|
+
seen.add(file);
|
|
21
|
+
files.push(file);
|
|
22
|
+
};
|
|
23
|
+
// Seed representative source/test/docs entries before any large tree can
|
|
24
|
+
// exhaust the cap, then expand the priority roots in a stable order.
|
|
25
|
+
for (const name of REPRESENTATIVE_DIRS) {
|
|
26
|
+
const representative = await firstFile(root, path.join(root, name));
|
|
27
|
+
if (representative)
|
|
28
|
+
add(representative);
|
|
29
|
+
}
|
|
30
|
+
for (const name of CORE_FILES) {
|
|
31
|
+
const full = path.join(root, name);
|
|
32
|
+
if ((await fs.stat(full).catch(() => null))?.isFile())
|
|
33
|
+
add(name);
|
|
34
|
+
}
|
|
35
|
+
for (const name of PRIORITY_DIRS)
|
|
36
|
+
await walk(root, path.join(root, name), files, seen, maxFiles);
|
|
37
|
+
for (const entry of await sortedEntries(root)) {
|
|
38
|
+
if (files.length >= maxFiles)
|
|
39
|
+
break;
|
|
40
|
+
if (IGNORE.has(entry.name) || PRIORITY_DIRS.includes(entry.name) || CORE_FILES.includes(entry.name))
|
|
41
|
+
continue;
|
|
42
|
+
const full = path.join(root, entry.name);
|
|
43
|
+
if (entry.isDirectory())
|
|
44
|
+
await walk(root, full, files, seen, maxFiles);
|
|
45
|
+
else if (entry.isFile())
|
|
46
|
+
add(entry.name);
|
|
47
|
+
}
|
|
7
48
|
const classify = (re) => files.filter((file) => re.test(file));
|
|
8
49
|
return {
|
|
9
50
|
schema: 'sks.agent-repo-inventory.v1',
|
|
@@ -19,11 +60,10 @@ export async function collectRepoInventory(root, opts = {}) {
|
|
|
19
60
|
files
|
|
20
61
|
};
|
|
21
62
|
}
|
|
22
|
-
async function walk(root, dir, out, maxFiles) {
|
|
63
|
+
async function walk(root, dir, out, seen, maxFiles) {
|
|
23
64
|
if (out.length >= maxFiles)
|
|
24
65
|
return;
|
|
25
|
-
const
|
|
26
|
-
for (const entry of entries) {
|
|
66
|
+
for (const entry of await sortedEntries(dir)) {
|
|
27
67
|
if (out.length >= maxFiles)
|
|
28
68
|
return;
|
|
29
69
|
if (IGNORE.has(entry.name))
|
|
@@ -31,9 +71,30 @@ async function walk(root, dir, out, maxFiles) {
|
|
|
31
71
|
const full = path.join(dir, entry.name);
|
|
32
72
|
const rel = path.relative(root, full).replace(/\\/g, '/');
|
|
33
73
|
if (entry.isDirectory())
|
|
34
|
-
await walk(root, full, out, maxFiles);
|
|
35
|
-
else if (entry.isFile())
|
|
74
|
+
await walk(root, full, out, seen, maxFiles);
|
|
75
|
+
else if (entry.isFile() && !seen.has(rel)) {
|
|
76
|
+
seen.add(rel);
|
|
36
77
|
out.push(rel);
|
|
78
|
+
}
|
|
37
79
|
}
|
|
38
80
|
}
|
|
81
|
+
async function firstFile(root, dir) {
|
|
82
|
+
for (const entry of await sortedEntries(dir)) {
|
|
83
|
+
if (IGNORE.has(entry.name))
|
|
84
|
+
continue;
|
|
85
|
+
const full = path.join(dir, entry.name);
|
|
86
|
+
if (entry.isFile())
|
|
87
|
+
return path.relative(root, full).replace(/\\/g, '/');
|
|
88
|
+
if (entry.isDirectory()) {
|
|
89
|
+
const nested = await firstFile(root, full);
|
|
90
|
+
if (nested)
|
|
91
|
+
return nested;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
async function sortedEntries(dir) {
|
|
97
|
+
return (await fs.readdir(dir, { withFileTypes: true }).catch(() => []))
|
|
98
|
+
.sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0);
|
|
99
|
+
}
|
|
39
100
|
//# sourceMappingURL=repo-inventory.js.map
|
|
@@ -36,9 +36,9 @@ export function buildZellijRightLaneCockpit(input = {}) {
|
|
|
36
36
|
visible_lane_count: Math.min(lanes.length, maxVisible),
|
|
37
37
|
page_count: pageCount,
|
|
38
38
|
actual_pane_ids: lanes.map((lane) => lane.pane_id).filter(Boolean),
|
|
39
|
-
attach_command: input.sessionName ? `zellij attach ${input.sessionName}` : 'sks
|
|
39
|
+
attach_command: input.sessionName ? `zellij attach ${input.sessionName}` : 'sks zellij status',
|
|
40
40
|
keyboard_hint: 'Use the Zellij pane controls to move between lanes; detach with the configured Zellij detach binding.',
|
|
41
|
-
cleanup_command_hint: '
|
|
41
|
+
cleanup_command_hint: 'Use native Zellij session controls; legacy Team mutation commands are removed.',
|
|
42
42
|
ok: lanes.length > 0
|
|
43
43
|
};
|
|
44
44
|
const laneManifest = {
|
|
@@ -194,10 +194,11 @@ async function collectChangedScope(root, opts) {
|
|
|
194
194
|
async function listSourceFiles(root, dir = root, out = []) {
|
|
195
195
|
const entries = await fsp.readdir(dir, { withFileTypes: true }).catch(() => []);
|
|
196
196
|
for (const entry of entries) {
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
197
|
+
// Hidden runtime/worktree directories can contain complete repository copies.
|
|
198
|
+
// Only .agents is a source-bearing project directory; all other hidden trees
|
|
199
|
+
// are state, caches, or external workspaces and must stay outside this scan.
|
|
200
|
+
if (entry.name.startsWith('.') && entry.name !== '.agents')
|
|
201
|
+
continue;
|
|
201
202
|
const full = path.join(dir, entry.name);
|
|
202
203
|
if (entry.isDirectory()) {
|
|
203
204
|
if (!SKIP_DIRS.has(entry.name))
|
|
@@ -1,227 +1,128 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { nowIso, readJson, writeJsonAtomic } from '../fsx.js';
|
|
4
|
+
import { backupInvalidToml, inspectOfficialSubagentToml, mergeOfficialSubagentConfig, officialSubagentConfigOwnershipProof, officialSubagentConfigWarnings, readInheritedOfficialSubagentConfigText } from '../subagents/official-subagent-config.js';
|
|
5
|
+
import { writeCodexConfigGuarded } from './codex-config-guard.js';
|
|
6
|
+
/**
|
|
7
|
+
* Compatibility entrypoint retained for doctor callers. It repairs the
|
|
8
|
+
* official project [agents] settings and removes only exact legacy SKS child
|
|
9
|
+
* tables after ownership has been proven. User-authored child tables remain.
|
|
10
|
+
*/
|
|
6
11
|
export async function repairAgentConfigFileReferences(input) {
|
|
7
12
|
const root = path.resolve(input.root);
|
|
8
13
|
const configPath = path.join(root, '.codex', 'config.toml');
|
|
9
14
|
const configExists = await fs.stat(configPath).then((stat) => stat.isFile()).catch(() => false);
|
|
10
|
-
const original = configExists ? await fs.readFile(configPath, 'utf8').catch(() => '') :
|
|
11
|
-
|
|
12
|
-
|
|
15
|
+
const original = configExists ? await fs.readFile(configPath, 'utf8').catch(() => '') : '';
|
|
16
|
+
const manifest = await readJson(path.join(root, '.sneakoscope', 'manifest.json'), null);
|
|
17
|
+
const migrationReceipt = await readJson(path.join(root, '.sneakoscope', 'update', 'migration-receipt.json'), null);
|
|
18
|
+
const ownershipProof = officialSubagentConfigOwnershipProof({
|
|
19
|
+
text: original,
|
|
20
|
+
manifest,
|
|
21
|
+
migrationReceipt
|
|
22
|
+
});
|
|
23
|
+
const originalValidation = inspectOfficialSubagentToml(original);
|
|
24
|
+
if (configExists && !originalValidation.ok) {
|
|
25
|
+
const backupPath = input.apply
|
|
26
|
+
? await backupInvalidToml(configPath, original, 'doctor-project-config-invalid')
|
|
27
|
+
: null;
|
|
28
|
+
return writeReport(input.reportPath, root, {
|
|
13
29
|
schema: 'sks.agent-config-file-repair.v1',
|
|
14
30
|
generated_at: nowIso(),
|
|
15
31
|
ok: false,
|
|
16
|
-
apply: true,
|
|
32
|
+
apply: input.apply === true,
|
|
17
33
|
config_path: configPath,
|
|
34
|
+
backup_path: backupPath,
|
|
18
35
|
repaired_paths: [],
|
|
19
36
|
created_files: [],
|
|
20
37
|
removed_unsupported_fields: [],
|
|
21
38
|
skipped_unmanaged_paths: [],
|
|
22
39
|
manual_required: true,
|
|
23
|
-
blockers: [
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const repairedPaths = [];
|
|
31
|
-
const removedUnsupportedFields = [];
|
|
32
|
-
const skippedUnmanagedPaths = [];
|
|
33
|
-
const edits = [];
|
|
34
|
-
let text = original;
|
|
35
|
-
for (const block of tomlBlocks(original)) {
|
|
36
|
-
const managed = managedBlockTarget(root, block);
|
|
37
|
-
const currentConfigFile = stringValue(block.text, 'config_file');
|
|
38
|
-
if (!managed) {
|
|
39
|
-
if (currentConfigFile && !path.isAbsolute(currentConfigFile))
|
|
40
|
-
skippedUnmanagedPaths.push(currentConfigFile);
|
|
41
|
-
continue;
|
|
42
|
-
}
|
|
43
|
-
const target = path.join(root, '.codex', 'agents', managed.file);
|
|
44
|
-
let replacement = removeKey(block.text, 'message_role_prefix', removedUnsupportedFields);
|
|
45
|
-
replacement = replaceOrInsertKey(replacement, 'config_file', `"${escapeToml(target)}"`);
|
|
46
|
-
if (replacement !== block.text) {
|
|
47
|
-
edits.push({ start: block.start, end: block.end, replacement });
|
|
48
|
-
repairedPaths.push(target);
|
|
49
|
-
}
|
|
50
|
-
if (input.apply) {
|
|
51
|
-
const exists = await fs.stat(target).then((stat) => stat.isFile()).catch(() => false);
|
|
52
|
-
if (!exists) {
|
|
53
|
-
await ensureDir(path.dirname(target));
|
|
54
|
-
await writeTextAtomic(target, managed.content);
|
|
55
|
-
createdFiles.push(target);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
40
|
+
blockers: [
|
|
41
|
+
'project_official_subagent_config_toml_parse_failed',
|
|
42
|
+
...(!ownershipProof.owned ? ['user_owned_file_without_sks_marker'] : [])
|
|
43
|
+
],
|
|
44
|
+
warnings: [],
|
|
45
|
+
ownership_proof: ownershipProof
|
|
46
|
+
});
|
|
58
47
|
}
|
|
59
|
-
if (
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
configPath,
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
48
|
+
if (input.apply && configExists && !ownershipProof.owned) {
|
|
49
|
+
return writeReport(input.reportPath, root, {
|
|
50
|
+
schema: 'sks.agent-config-file-repair.v1',
|
|
51
|
+
generated_at: nowIso(),
|
|
52
|
+
ok: false,
|
|
53
|
+
apply: true,
|
|
54
|
+
config_path: configPath,
|
|
55
|
+
backup_path: null,
|
|
56
|
+
repaired_paths: [],
|
|
57
|
+
created_files: [],
|
|
58
|
+
removed_unsupported_fields: [],
|
|
59
|
+
skipped_unmanaged_paths: [],
|
|
60
|
+
manual_required: true,
|
|
61
|
+
blockers: ['user_owned_file_without_sks_marker'],
|
|
62
|
+
warnings: [],
|
|
63
|
+
ownership_proof: ownershipProof
|
|
69
64
|
});
|
|
70
|
-
createdFiles.push(configPath);
|
|
71
65
|
}
|
|
72
|
-
|
|
73
|
-
|
|
66
|
+
const inheritedText = await readInheritedOfficialSubagentConfigText(configPath, {
|
|
67
|
+
...(input.home ? { home: input.home } : {}),
|
|
68
|
+
...(input.codexHome ? { codexHome: input.codexHome } : {})
|
|
69
|
+
});
|
|
70
|
+
const merged = mergeOfficialSubagentConfig(original, {
|
|
71
|
+
sksOwned: ownershipProof.owned,
|
|
72
|
+
inheritedText
|
|
73
|
+
});
|
|
74
|
+
const validation = inspectOfficialSubagentToml(merged);
|
|
75
|
+
const warnings = officialSubagentConfigWarnings(merged, inheritedText);
|
|
76
|
+
const blockers = [];
|
|
77
|
+
let changed = merged !== original;
|
|
78
|
+
let writeSucceeded = input.apply !== true;
|
|
79
|
+
let backupPath = null;
|
|
80
|
+
if (input.apply) {
|
|
81
|
+
const guarded = await writeCodexConfigGuarded({
|
|
74
82
|
root,
|
|
75
83
|
configPath,
|
|
76
84
|
before: original,
|
|
77
|
-
cause: '
|
|
78
|
-
|
|
85
|
+
cause: 'official-subagent-config-repair',
|
|
86
|
+
ownershipVerified: ownershipProof.owned,
|
|
87
|
+
mutate: () => merged
|
|
79
88
|
});
|
|
89
|
+
writeSucceeded = guarded.ok;
|
|
90
|
+
changed = guarded.ok && guarded.changed;
|
|
91
|
+
backupPath = guarded.backup_path;
|
|
92
|
+
if (!guarded.ok)
|
|
93
|
+
blockers.push(`config_write_guard:${guarded.status}`);
|
|
94
|
+
}
|
|
95
|
+
else if (!validation.ok) {
|
|
96
|
+
blockers.push('project_official_subagent_config_toml_parse_failed');
|
|
80
97
|
}
|
|
81
|
-
const effectiveText = input.apply ? await fs.readFile(configPath, 'utf8').catch(() => text) : text;
|
|
82
|
-
const missing = await missingAgentConfigFiles(effectiveText);
|
|
83
|
-
const unsupportedManagedFields = managedAgentBlocks(effectiveText)
|
|
84
|
-
.flatMap((block) => block.text.split(/\r?\n/).filter((line) => /^\s*message_role_prefix\s*=/.test(line)));
|
|
85
98
|
const report = {
|
|
86
99
|
schema: 'sks.agent-config-file-repair.v1',
|
|
87
100
|
generated_at: nowIso(),
|
|
88
|
-
ok:
|
|
101
|
+
ok: blockers.length === 0,
|
|
89
102
|
apply: input.apply === true,
|
|
90
103
|
config_path: configPath,
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
104
|
+
backup_path: backupPath,
|
|
105
|
+
repaired_paths: changed && writeSucceeded ? [configPath] : [],
|
|
106
|
+
created_files: input.apply === true && !configExists && changed && writeSucceeded ? [configPath] : [],
|
|
107
|
+
removed_unsupported_fields: [],
|
|
108
|
+
skipped_unmanaged_paths: [],
|
|
109
|
+
manual_required: blockers.length > 0,
|
|
110
|
+
blockers,
|
|
111
|
+
warnings,
|
|
112
|
+
ownership_proof: ownershipProof
|
|
100
113
|
};
|
|
101
|
-
|
|
102
|
-
if (input.reportPath !== null)
|
|
103
|
-
await writeJsonAtomic(input.reportPath || path.join(root, '.sneakoscope', 'reports', 'agent-config-file-repair.json'), report).catch(() => undefined);
|
|
104
|
-
return report;
|
|
114
|
+
return writeReport(input.reportPath, root, report);
|
|
105
115
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
for (const file of rows) {
|
|
112
|
-
if (!path.isAbsolute(file)) {
|
|
113
|
-
missing.push(file);
|
|
114
|
-
continue;
|
|
115
|
-
}
|
|
116
|
-
const ok = await fs.stat(file).then((stat) => stat.isFile()).catch(() => false);
|
|
117
|
-
if (!ok)
|
|
118
|
-
missing.push(file);
|
|
119
|
-
}
|
|
120
|
-
return missing;
|
|
116
|
+
// Retained for compatibility with the startup postcheck API. Official custom
|
|
117
|
+
// agents are discovered from .codex/agents and do not require config_file
|
|
118
|
+
// references; legacy references are intentionally ignored and preserved.
|
|
119
|
+
export async function missingAgentConfigFiles(_text) {
|
|
120
|
+
return [];
|
|
121
121
|
}
|
|
122
|
-
function
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
return matches.map((match, index) => {
|
|
126
|
-
const start = Number(match.index || 0) + (match[1] ? 1 : 0);
|
|
127
|
-
const next = matches[index + 1];
|
|
128
|
-
const end = next ? Number(next.index || 0) + (next[1] ? 1 : 0) : source.length;
|
|
129
|
-
return {
|
|
130
|
-
header: String(match[2] || '').trim(),
|
|
131
|
-
start,
|
|
132
|
-
end,
|
|
133
|
-
text: source.slice(start, end)
|
|
134
|
-
};
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
function managedAgentBlocks(text) {
|
|
138
|
-
return tomlBlocks(text).filter((block) => Boolean(managedBlockTarget(process.cwd(), block)));
|
|
139
|
-
}
|
|
140
|
-
function managedBlockTarget(root, block) {
|
|
141
|
-
if (!block.header.startsWith('agents.'))
|
|
142
|
-
return null;
|
|
143
|
-
const role = block.header.slice('agents.'.length);
|
|
144
|
-
const byRole = managedAgentRoleConfigForRole(role);
|
|
145
|
-
if (byRole)
|
|
146
|
-
return byRole;
|
|
147
|
-
const configFile = stringValue(block.text, 'config_file');
|
|
148
|
-
if (configFile) {
|
|
149
|
-
const content = managedAgentRoleConfigForFile(configFile);
|
|
150
|
-
if (content)
|
|
151
|
-
return { file: path.basename(configFile), content };
|
|
122
|
+
async function writeReport(reportPath, root, report) {
|
|
123
|
+
if (reportPath !== null) {
|
|
124
|
+
await writeJsonAtomic(reportPath || path.join(root, '.sneakoscope', 'reports', 'agent-config-file-repair.json'), report).catch(() => undefined);
|
|
152
125
|
}
|
|
153
|
-
|
|
154
|
-
const fallback = managedAgentRoleConfigForRole(role);
|
|
155
|
-
if (fallback)
|
|
156
|
-
return fallback;
|
|
157
|
-
}
|
|
158
|
-
void root;
|
|
159
|
-
return null;
|
|
160
|
-
}
|
|
161
|
-
function stringValue(text, key) {
|
|
162
|
-
const match = text.match(new RegExp(`^\\s*${escapeRegExp(key)}\\s*=\\s*"([^"]*)"`, 'm'));
|
|
163
|
-
return match && typeof match[1] === 'string' ? match[1] : null;
|
|
164
|
-
}
|
|
165
|
-
function removeKey(text, key, removed) {
|
|
166
|
-
return text.split(/\r?\n/).filter((line) => {
|
|
167
|
-
const match = new RegExp(`^\\s*${escapeRegExp(key)}\\s*=`).test(line);
|
|
168
|
-
if (match)
|
|
169
|
-
removed.push(line.trim());
|
|
170
|
-
return !match;
|
|
171
|
-
}).join('\n');
|
|
172
|
-
}
|
|
173
|
-
function replaceOrInsertKey(text, key, encodedValue) {
|
|
174
|
-
const lines = text.replace(/\s*$/, '').split('\n');
|
|
175
|
-
const re = new RegExp(`^\\s*${escapeRegExp(key)}\\s*=`);
|
|
176
|
-
const index = lines.findIndex((line) => re.test(line));
|
|
177
|
-
if (index >= 0)
|
|
178
|
-
lines[index] = `${key} = ${encodedValue}`;
|
|
179
|
-
else
|
|
180
|
-
lines.push(`${key} = ${encodedValue}`);
|
|
181
|
-
return `${lines.join('\n')}\n`;
|
|
182
|
-
}
|
|
183
|
-
function applyEdits(text, edits) {
|
|
184
|
-
return [...edits]
|
|
185
|
-
.sort((a, b) => b.start - a.start)
|
|
186
|
-
.reduce((current, edit) => `${current.slice(0, edit.start)}${edit.replacement}${current.slice(edit.end)}`, text);
|
|
187
|
-
}
|
|
188
|
-
function escapeToml(value) {
|
|
189
|
-
return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
190
|
-
}
|
|
191
|
-
function escapeRegExp(value) {
|
|
192
|
-
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
193
|
-
}
|
|
194
|
-
function minimalManagedConfigToml() {
|
|
195
|
-
return [
|
|
196
|
-
'service_tier = "fast"',
|
|
197
|
-
'',
|
|
198
|
-
'[features]',
|
|
199
|
-
'hooks = true',
|
|
200
|
-
'multi_agent = true',
|
|
201
|
-
'fast_mode = true',
|
|
202
|
-
'apps = true',
|
|
203
|
-
'',
|
|
204
|
-
'[mcp_servers.context7]',
|
|
205
|
-
'url = "https://mcp.context7.com/mcp"',
|
|
206
|
-
'',
|
|
207
|
-
agentConfigBlock('native_agent', 'SKS native agent with bounded write capability.', './agents/native-agent-intake.toml', ['Analysis', 'Mapper']),
|
|
208
|
-
'',
|
|
209
|
-
agentConfigBlock('team_consensus', 'SKS planning/debate agent with bounded write capability.', './agents/team-consensus.toml', ['Consensus', 'Atlas']),
|
|
210
|
-
'',
|
|
211
|
-
agentConfigBlock('implementation_worker', 'SKS bounded implementation worker.', './agents/implementation-worker.toml', ['Builder', 'Mason']),
|
|
212
|
-
'',
|
|
213
|
-
agentConfigBlock('db_safety_reviewer', 'DB safety reviewer with bounded write capability.', './agents/db-safety-reviewer.toml', ['Sentinel', 'Ledger']),
|
|
214
|
-
'',
|
|
215
|
-
agentConfigBlock('qa_reviewer', 'QA reviewer with bounded write capability.', './agents/qa-reviewer.toml', ['Verifier', 'Reviewer']),
|
|
216
|
-
''
|
|
217
|
-
].join('\n');
|
|
218
|
-
}
|
|
219
|
-
function agentConfigBlock(table, description, configFile, nicknames = []) {
|
|
220
|
-
return [
|
|
221
|
-
`[agents.${table}]`,
|
|
222
|
-
`description = "${description}"`,
|
|
223
|
-
`config_file = "${configFile}"`,
|
|
224
|
-
`nickname_candidates = [${nicknames.map((name) => `"${name}"`).join(', ')}]`
|
|
225
|
-
].join('\n');
|
|
126
|
+
return report;
|
|
226
127
|
}
|
|
227
128
|
//# sourceMappingURL=agent-config-file-repair.js.map
|