sneakoscope 7.1.0 → 7.3.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/README.md +9 -1
- package/config/architecture-budgets.v1.json +1 -8
- package/crates/sks-core/Cargo.lock +225 -1
- package/crates/sks-core/Cargo.toml +8 -1
- package/crates/sks-core/src/main.rs +7 -1
- package/crates/sks-core/src/search/files.rs +114 -0
- package/crates/sks-core/src/search/mod.rs +274 -0
- package/crates/sks-core/src/search/text.rs +175 -0
- package/dist/bin/sks-dispatch.js +4 -3
- package/dist/cli/command-manifest-lite.js +177 -6
- package/dist/cli/command-registry.js +42 -8
- package/dist/cli/help.js +30 -0
- package/dist/cli/install-helpers-codex-lb-config.js +9 -6
- package/dist/cli/install-helpers-codex-lb-selftest-chain.js +1 -1
- package/dist/cli/install-helpers-install-support.js +1 -1
- package/dist/cli/install-helpers.js +19 -9
- package/dist/cli/router.js +16 -3
- package/dist/commands/codex-app.js +40 -5
- package/dist/commands/doctor-profile.js +78 -0
- package/dist/commands/doctor.js +29 -69
- package/dist/commands/search.js +4 -0
- package/dist/config/skills-manifest.json +53 -60
- package/dist/core/agent-bridge/agent-manifest.js +22 -26
- package/dist/core/agent-bridge/host-capability-policy.js +109 -8
- package/dist/core/agent-bridge/host-capability-runtime.js +178 -50
- package/dist/core/agent-guidance/directive-registry.js +123 -0
- package/dist/core/agents/agent-effort-policy.js +45 -6
- package/dist/core/agents/agent-worker-pipeline.js +1 -3
- package/dist/core/agents/native-worker-backend-router.js +43 -19
- package/dist/core/auto-review.js +1 -3
- package/dist/core/code-structure.js +282 -19
- package/dist/core/codex/codex-config-guard.js +14 -4
- package/dist/core/codex/codex-config-toml.js +1 -3
- package/dist/core/codex-app/codex-agent-role-sync.js +1 -3
- package/dist/core/codex-app/codex-app-fast-ui-repair.js +14 -1
- package/dist/core/codex-app/codex-app-types.js +2 -3
- package/dist/core/codex-app/codex-desktop-routing-ownership.js +91 -0
- package/dist/core/codex-app/codex-hook-approval-probe.js +1 -3
- package/dist/core/codex-app/codex-hook-lifecycle.js +1 -3
- package/dist/core/codex-app/codex-init-deep.js +22 -10
- package/dist/core/codex-app/codex-model-catalog.js +384 -0
- package/dist/core/codex-app/codex-models-cache.js +160 -0
- package/dist/core/codex-app/desktop-routing-snapshot.js +233 -0
- package/dist/core/codex-app/glm-profile-installer.js +1 -3
- package/dist/core/codex-app/mcp-manager.js +1 -3
- package/dist/core/codex-app/menubar/constants.js +3 -0
- package/dist/core/codex-app/menubar/installer.js +11 -1
- package/dist/core/codex-app/multi-provider-router-support.js +202 -0
- package/dist/core/codex-app/multi-provider-router.js +379 -0
- package/dist/core/codex-app/openrouter-activate.js +189 -26
- package/dist/core/codex-app/openrouter-base-instructions.js +1 -0
- package/dist/core/codex-app/openrouter-model-catalog.js +217 -0
- package/dist/core/codex-app/role-model-catalog-priority.js +61 -0
- package/dist/core/codex-app.js +30 -6
- package/dist/core/codex-compat/codex-hook-semantic-validator.js +1 -3
- package/dist/core/codex-control/codex-app-server-v2-client.js +39 -2
- package/dist/core/codex-lb/codex-lb-env.js +1 -3
- package/dist/core/codex-lb/codex-lb-tool-catalog.js +6 -1
- package/dist/core/codex-native/codex-native-feature-broker.js +2 -6
- package/dist/core/codex-native/codex-native-interop-policy.js +1 -3
- package/dist/core/codex-native/codex-native-reference-cache.js +1 -3
- package/dist/core/codex-native/codex-native-reference-source.js +1 -3
- package/dist/core/codex-native/codex-native-repair-transaction.js +1 -3
- package/dist/core/codex-native/core-skill-manifest.js +3 -2
- package/dist/core/codex-native/native-capability-repair-matrix.js +1 -3
- package/dist/core/codex-plugins/codex-plugin-repair.js +1 -3
- package/dist/core/codex-runtime/codex-desktop-config-policy.js +4 -4
- package/dist/core/commands/agent-bridge-command.js +24 -3
- package/dist/core/commands/image-ux-review-command.js +5 -11
- package/dist/core/commands/menubar-command.js +1 -1
- package/dist/core/commands/naruto-command.js +40 -13
- package/dist/core/commands/pipeline-command.js +5 -2
- package/dist/core/commands/release-command.js +63 -1
- package/dist/core/commands/remote-command.js +18 -0
- package/dist/core/commands/search-command.js +151 -0
- package/dist/core/commands/telegram-command.js +251 -108
- package/dist/core/commands/uninstall-command.js +1 -1
- package/dist/core/config/secret-preservation.js +1 -3
- package/dist/core/context7-client.js +2 -1
- package/dist/core/db-review.js +704 -0
- package/dist/core/db-safety.js +17 -23
- package/dist/core/doctor/browser-use-repair.js +1 -3
- package/dist/core/doctor/codex-startup-config-repair.js +1 -3
- package/dist/core/doctor/computer-use-repair.js +1 -3
- package/dist/core/doctor/context7-mcp-repair.js +1 -3
- package/dist/core/doctor/current-project-guidance.js +1 -3
- package/dist/core/doctor/doctor-codex-startup-repair.js +1 -3
- package/dist/core/doctor/doctor-dirty-planner.js +2 -2
- package/dist/core/doctor/doctor-native-capability-repair.js +1 -3
- package/dist/core/doctor/doctor-transaction.js +1 -3
- package/dist/core/doctor/imagegen-repair.js +1 -3
- package/dist/core/doctor/legacy-global-hook-cleanup.js +1 -3
- package/dist/core/doctor/mcp-transport-collision-repair.js +1 -3
- package/dist/core/doctor/retired-managed-residue-private.js +1 -3
- package/dist/core/doctor/supabase-mcp-repair.js +1 -3
- package/dist/core/engineering-sanity-review.js +186 -0
- package/dist/core/errors/message.js +3 -0
- package/dist/core/evidence/evidence-schema.js +1 -3
- package/dist/core/feature-fixtures.js +1 -0
- package/dist/core/feature-registry.js +1 -3
- package/dist/core/fsx.js +13 -0
- package/dist/core/git-hygiene/shared-memory-publish.js +1 -3
- package/dist/core/git-hygiene/validators.js +1 -3
- package/dist/core/harness-guard.js +21 -3
- package/dist/core/hooks-runtime/hook-context.js +2 -2
- package/dist/core/image-ux-review/imagegen-adapter.js +52 -56
- package/dist/core/image-ux-review/real-callout-extractor.js +6 -1
- package/dist/core/image-ux-review.js +3 -5
- package/dist/core/imagegen/codex-lb-imagegen-target.js +70 -0
- package/dist/core/imagegen/imagegen-capability.js +11 -11
- package/dist/core/imagegen/imagegen-evidence.js +32 -0
- package/dist/core/init/skills.js +9 -11
- package/dist/core/init.js +4 -6
- package/dist/core/json/records.js +9 -0
- package/dist/core/json-schema-validator.js +1 -3
- package/dist/core/lean-engineering-policy.js +54 -0
- package/dist/core/loops/loop-continuation-enforcer.js +1 -3
- package/dist/core/mad-sks/sql-plane/mcp-executor.js +2 -1
- package/dist/core/mad-sks/sql-plane/policy.js +2 -1
- package/dist/core/managed-assets/managed-assets-manifest.js +4 -3
- package/dist/core/mcp-config/codex-cli-adapter.js +1 -3
- package/dist/core/mcp-config/config-reader.js +2 -3
- package/dist/core/mcp-config/guarded-patch.js +1 -1
- package/dist/core/mcp-config/health-check.js +2 -1
- package/dist/core/mcp-config/mutation.js +1 -1
- package/dist/core/mcp-config/restore.js +1 -1
- package/dist/core/mcp-config/secret-policy.js +1 -3
- package/dist/core/migration/migration-transaction-journal.js +3 -3
- package/dist/core/naruto/naruto-concurrency-governor.js +2 -2
- package/dist/core/perf/import-graph-budget.js +91 -1
- package/dist/core/pipeline/pipeline-plan-writer.js +1 -1
- package/dist/core/pipeline-internals/runtime-core.js +121 -23
- package/dist/core/pipeline-internals/runtime-gates.js +193 -4
- package/dist/core/pipeline.js +1 -1
- package/dist/core/ppt-review/slide-imagegen-review.js +7 -7
- package/dist/core/ppt.js +3 -3
- package/dist/core/product-design-app-server.js +2 -1
- package/dist/core/proof/fake-real-proof-policy.js +1 -3
- package/dist/core/proof/root-cause-policy.js +1 -3
- package/dist/core/proof/validation.js +1 -3
- package/dist/core/provider/model-router.js +4 -0
- package/dist/core/provider/provider-context.js +1 -3
- package/dist/core/providers/openrouter/openrouter-account.js +1 -3
- package/dist/core/quality/helper-dedup.js +0 -0
- package/dist/core/recallpulse.js +1 -1
- package/dist/core/release/file-ownership.js +26 -17
- package/dist/core/release/macos-menubar-proof.js +59 -1
- package/dist/core/release/main-push-guard.js +288 -24
- package/dist/core/release/main-push-receipt.js +10 -45
- package/dist/core/release/package-size-budget.js +1 -1
- package/dist/core/release/release-gate-contract.js +2 -0
- package/dist/core/release/release-pack-receipt.js +1 -1
- package/dist/core/release/release-proof-io.js +33 -0
- package/dist/core/release/release-upgrade-baseline.js +9 -0
- package/dist/core/release/runtime-script-pack-closure.js +153 -4
- package/dist/core/release/stage-publish.js +194 -0
- package/dist/core/remote/index.js +2 -0
- package/dist/core/remote/local-worker-client.js +35 -0
- package/dist/core/remote/machine-registry.js +18 -13
- package/dist/core/remote/owner-proof.js +1 -3
- package/dist/core/remote/protocol.js +1 -3
- package/dist/core/remote/readiness.js +1 -3
- package/dist/core/remote/session-binding.js +153 -0
- package/dist/core/remote/session-index.js +1 -3
- package/dist/core/remote/types.js +1 -0
- package/dist/core/remote/worker.js +228 -14
- package/dist/core/responses-stream.js +151 -0
- package/dist/core/routes/dollar-manifest-lite.js +1 -1
- package/dist/core/routes.js +8 -8
- package/dist/core/rust-accelerator.js +12 -2
- package/dist/core/safety/ssot-guard.js +1 -3
- package/dist/core/search/benchmark.js +358 -0
- package/dist/core/search/cache.js +65 -0
- package/dist/core/search/context.js +144 -0
- package/dist/core/search/doctor.js +74 -0
- package/dist/core/search/files.js +192 -0
- package/dist/core/search/index.js +5 -0
- package/dist/core/search/ipc.js +64 -0
- package/dist/core/search/provider.js +142 -0
- package/dist/core/search/rust-bridge.js +24 -0
- package/dist/core/search/structure.js +230 -0
- package/dist/core/search/symbol.js +272 -0
- package/dist/core/search/text.js +146 -0
- package/dist/core/search/types.js +22 -0
- package/dist/core/search/typescript-ls.js +215 -0
- package/dist/core/search-visibility/discovery.js +1 -3
- package/dist/core/skill-forge.js +1 -1
- package/dist/core/stop-gate/gate-evaluator.js +3 -3
- package/dist/core/stop-gate/stop-gate-check.js +1 -3
- package/dist/core/structured-output-adapter.js +62 -2
- package/dist/core/subagents/agent-catalog.js +56 -43
- package/dist/core/subagents/model-policy.js +17 -7
- package/dist/core/subagents/naruto-proof-projection.js +2 -6
- package/dist/core/subagents/official-subagent-config.js +1 -3
- package/dist/core/subagents/official-subagent-preparation.js +73 -10
- package/dist/core/subagents/official-subagent-prompt.js +85 -18
- package/dist/core/subagents/official-subagent-runner.js +10 -5
- package/dist/core/subagents/role-model-preferences.js +202 -44
- package/dist/core/subagents/subagent-evidence.js +1 -3
- package/dist/core/subagents/thread-budget.js +1 -1
- package/dist/core/subagents/triwiki-attention.js +1 -5
- package/dist/core/telegram/config.js +29 -12
- package/dist/core/telegram/hub.js +8 -2
- package/dist/core/telegram/index.js +2 -0
- package/dist/core/telegram/messages.js +8 -2
- package/dist/core/telegram/runtime-projection.js +8 -5
- package/dist/core/telegram/runtime.js +19 -9
- package/dist/core/telegram/service.js +181 -0
- package/dist/core/telegram/setup.js +220 -0
- package/dist/core/text/regex.js +3 -0
- package/dist/core/text/strings.js +6 -0
- package/dist/core/triwiki-wrongness/image-wrongness.js +1 -3
- package/dist/core/triwiki-wrongness/wrongness-ledger.js +1 -3
- package/dist/core/triwiki-wrongness/wrongness-proof-linker.js +1 -3
- package/dist/core/triwiki-wrongness/wrongness-retrieval.js +1 -3
- package/dist/core/triwiki-wrongness/wrongness-schema.js +1 -3
- package/dist/core/triwiki-wrongness/wrongness-trust-policy.js +1 -3
- package/dist/core/trust-kernel/completion-contract.js +1 -3
- package/dist/core/trust-kernel/route-contract.js +1 -3
- package/dist/core/update/update-migration-state.js +1 -3
- package/dist/core/update-check.js +20 -6
- package/dist/core/verification/diff-quality.js +3 -4
- package/dist/core/verification/impact-scan.js +36 -89
- package/dist/core/verification/mistake-rule-compiler.js +17 -4
- package/dist/core/version-manager.js +3 -20
- package/dist/core/version.js +1 -1
- package/dist/native/sks-menubar/Sources/ControlCenterWindowController.swift +23 -3
- package/dist/native/sks-menubar/Sources/ControlKit.swift +102 -0
- package/dist/native/sks-menubar/Sources/DiagnosticsViewController.swift +23 -11
- package/dist/native/sks-menubar/Sources/MCPServersViewController.swift +7 -3
- package/dist/native/sks-menubar/Sources/OperationCoordinator.swift +17 -1
- package/dist/native/sks-menubar/Sources/OverviewViewController.swift +22 -15
- package/dist/native/sks-menubar/Sources/ProcessClient.swift +15 -5
- package/dist/native/sks-menubar/Sources/ProvidersMultiProvider.swift +324 -0
- package/dist/native/sks-menubar/Sources/ProvidersOpenRouter.swift +154 -214
- package/dist/native/sks-menubar/Sources/ProvidersRoleModels.swift +252 -0
- package/dist/native/sks-menubar/Sources/ProvidersViewController.swift +77 -71
- package/dist/native/sks-menubar/Sources/RemoteTelegramViewController.swift +167 -51
- package/dist/native/sks-menubar/Sources/SettingsViewController.swift +14 -5
- package/dist/native/sks-menubar/Sources/SidebarItem.swift +15 -1
- package/dist/native/sks-menubar/Sources/StatusItemController.swift +2 -2
- package/dist/native/sks-menubar/Sources/UpdatesViewController.swift +16 -12
- package/dist/scripts/agent-guidance-dedup-check.js +23 -0
- package/dist/scripts/agent-message-bus-reader-check.js +1 -1
- package/dist/scripts/all-feature-deep-completion-check.js +1 -1
- package/dist/scripts/appshots-thread-attachment-discovery-check.js +1 -1
- package/dist/scripts/architecture-guard-check.js +1 -2
- package/dist/scripts/certificate-sla-check.js +1 -1
- package/dist/scripts/cli-output-consistency-check.js +1 -1
- package/dist/scripts/codex-0-134-runner-truth-check.js +1 -1
- package/dist/scripts/codex-0138-capability-artifact-check.js +1 -1
- package/dist/scripts/codex-0138-capability-check.js +1 -1
- package/dist/scripts/codex-0138-doctor-check.js +1 -1
- package/dist/scripts/codex-0138-feature-probes-check.js +1 -1
- package/dist/scripts/codex-0144-app-server-v2-check.js +1 -1
- package/dist/scripts/codex-0144-binary-identity-check.js +1 -1
- package/dist/scripts/codex-0144-capability-check.js +1 -1
- package/dist/scripts/codex-0144-core-real-probes-check.js +1 -1
- package/dist/scripts/codex-0144-manifest-check.js +1 -1
- package/dist/scripts/codex-0144-policy-check.js +1 -1
- package/dist/scripts/codex-0144-thread-store-check.js +1 -1
- package/dist/scripts/codex-agent-role-rich-content-check.js +2 -2
- package/dist/scripts/codex-agent-role-sync-check.js +2 -2
- package/dist/scripts/codex-agent-type-routing-check.js +2 -2
- package/dist/scripts/codex-app-execution-profile-check.js +2 -2
- package/dist/scripts/codex-app-handoff-check.js +1 -1
- package/dist/scripts/codex-app-handoff-launch-check.js +1 -1
- package/dist/scripts/codex-control-tool-output-continuity-audit-check.js +1 -1
- package/dist/scripts/codex-lb-fast-ui-preservation-check.js +1 -3
- package/dist/scripts/codex-native-feature-broker-blackbox.js +2 -2
- package/dist/scripts/codex-native-feature-broker-check.js +2 -2
- package/dist/scripts/{sks-3-1-6-directive-check-lib.js → codex-native-gate-lib.js} +5 -5
- package/dist/scripts/codex-native-harness-compat-check.js +2 -2
- package/dist/scripts/codex-native-hook-lifecycle-proof-check.js +2 -2
- package/dist/scripts/codex-plugin-app-template-policy-check.js +1 -1
- package/dist/scripts/codex-sdk-backend-router-check.js +1 -1
- package/dist/scripts/codex-sdk-capability-check.js +1 -1
- package/dist/scripts/context7-evidence-dedupe-check.js +1 -1
- package/dist/scripts/core-skill-card-schema-check.js +1 -1
- package/dist/scripts/core-skill-deployment-snapshot-check.js +1 -1
- package/dist/scripts/core-skill-heldout-validation-check.js +1 -1
- package/dist/scripts/core-skill-no-inference-optimizer-check.js +1 -1
- package/dist/scripts/core-skill-patch-check.js +1 -1
- package/dist/scripts/core-skill-route-runtime-integration-check.js +1 -1
- package/dist/scripts/current-command-surface-check.js +1 -1
- package/dist/scripts/current-surface-update-e2e-check.js +4 -1
- package/dist/scripts/current-upgrade-matrix-check.js +1 -1
- package/dist/scripts/dfix-fixture-check.js +1 -1
- package/dist/scripts/dfix-patch-handoff-check.js +1 -1
- package/dist/scripts/dfix-verification-check.js +1 -1
- package/dist/scripts/dfix-verification-recommendation-check.js +1 -1
- package/dist/scripts/docs-truthfulness-check.js +16 -3
- package/dist/scripts/doctor-codex-app-harness-check.js +2 -2
- package/dist/scripts/evidence-flagship-coverage-check.js +1 -1
- package/dist/scripts/{sks-1-18-gate-lib.js → gate-lib.js} +1 -1
- package/dist/scripts/gate-policy-audit-check.js +4 -1
- package/dist/scripts/git-worktree-checkpoint-check.js +1 -1
- package/dist/scripts/git-worktree-cross-rebase-check.js +1 -1
- package/dist/scripts/git-worktree-diff-envelope-check.js +1 -1
- package/dist/scripts/git-worktree-dirty-lock-check.js +1 -1
- package/dist/scripts/git-worktree-dirty-main-detection-check.js +1 -1
- package/dist/scripts/git-worktree-integration-primary-check.js +1 -1
- package/dist/scripts/git-worktree-manifest-append-check.js +1 -1
- package/dist/scripts/git-worktree-untracked-diff-check.js +1 -1
- package/dist/scripts/harness-benchmark-check.js +1 -1
- package/dist/scripts/helper-dedup-check.js +62 -0
- package/dist/scripts/hook-latency-budget-check.js +1 -1
- package/dist/scripts/image-artifact-path-contract-check.js +1 -1
- package/dist/scripts/imagegen-real-smoke-check.js +2 -5
- package/dist/scripts/installed-package-smoke-check.js +1 -1
- package/dist/scripts/legacy-gate-inventory-check.js +1 -1
- package/dist/scripts/legacy-gate-purge-check.js +1 -1
- package/dist/scripts/legacy-strong-inventory-check.js +1 -1
- package/dist/scripts/lib/codex-sdk-gate-lib.js +1 -1
- package/dist/scripts/mad-sks-launch-sql-plane-boundary-check.js +1 -1
- package/dist/scripts/mad-sks-sql-plane-capability-check.js +1 -1
- package/dist/scripts/mad-sks-sql-plane-lifecycle-hook-decision-check.js +1 -1
- package/dist/scripts/mad-sks-sql-plane-result-lifecycle-check.js +1 -1
- package/dist/scripts/managed-config-merge-check.js +1 -1
- package/dist/scripts/mcp-plugin-inventory-check.js +1 -1
- package/dist/scripts/model-call-concurrency-check.js +1 -1
- package/dist/scripts/mutation-callsite-coverage-check.js +1 -1
- package/dist/scripts/naruto-ssot-gate-aliases-check.js +1 -1
- package/dist/scripts/naruto-ssot-pipeline-default-check.js +1 -1
- package/dist/scripts/naruto-ssot-route-normalization-check.js +1 -1
- package/dist/scripts/naruto-ssot-routing-check.js +1 -1
- package/dist/scripts/naruto-worktree-coding-blackbox.js +1 -1
- package/dist/scripts/native-capability-repair-matrix-check.js +1 -1
- package/dist/scripts/native-image-generation-repair-check.js +1 -1
- package/dist/scripts/official-subagent-workflow-check.js +3 -3
- package/dist/scripts/package-published-contract-check.js +37 -4
- package/dist/scripts/packlist-performance-check.js +17 -1
- package/dist/scripts/pipeline-codex-native-doctor-mad-routing-real-blackbox.js +1 -3
- package/dist/scripts/ppt-real-export-adapter-check.js +1 -1
- package/dist/scripts/ppt-real-imagegen-wiring-check.js +1 -1
- package/dist/scripts/ppt-reexport-rereview-check.js +1 -1
- package/dist/scripts/prepublish-fast-check.js +1 -1
- package/dist/scripts/probe-memoization-check.js +2 -2
- package/dist/scripts/prompt-placeholder-guard-check.js +1 -1
- package/dist/scripts/qa-loop-app-handoff-capability-check.js +1 -1
- package/dist/scripts/qa-loop-app-handoff-check.js +1 -1
- package/dist/scripts/qa-loop-app-handoff-cli-check.js +1 -1
- package/dist/scripts/qa-loop-app-handoff-confirmation-check.js +1 -1
- package/dist/scripts/qa-loop-app-handoff-gate-lifecycle-check.js +1 -1
- package/dist/scripts/qa-loop-app-handoff-launch-check.js +1 -1
- package/dist/scripts/qa-loop-app-handoff-status-lifecycle-check.js +1 -1
- package/dist/scripts/qa-loop-budget-policy-check.js +1 -1
- package/dist/scripts/qa-loop-effort-escalation-check.js +1 -1
- package/dist/scripts/qa-loop-execution-profile-routing-check.js +2 -2
- package/dist/scripts/qa-loop-image-path-exposure-check.js +1 -1
- package/dist/scripts/qa-loop-image-path-prompt-injection-check.js +1 -1
- package/dist/scripts/{sks-1-12-real-execution-check-lib.js → real-execution-check-lib.js} +1 -1
- package/dist/scripts/release-affected-selector-check.js +1 -1
- package/dist/scripts/release-aggressive-resource-governor-check.js +1 -1
- package/dist/scripts/release-cache-glob-hashing-check.js +1 -1
- package/dist/scripts/release-cache-input-classifier-check.js +1 -1
- package/dist/scripts/release-cache-neutralization-report-check.js +1 -1
- package/dist/scripts/release-cache-version-neutral-fixture-check.js +1 -1
- package/dist/scripts/release-dynamic-presets-check.js +2 -2
- package/dist/scripts/release-full-parallelism-blackbox.js +1 -1
- package/dist/scripts/release-gate-batch-runner-check.js +1 -1
- package/dist/scripts/release-gate-budget-check.js +1 -1
- package/dist/scripts/release-gate-dag-runner-check.js +1 -1
- package/dist/scripts/release-latency-slo-check.js +1 -1
- package/dist/scripts/release-metadata-check.js +256 -2
- package/dist/scripts/release-parallel-speed-budget-check.js +1 -1
- package/dist/scripts/release-proof-truth-check.js +1 -1
- package/dist/scripts/release-provenance-check.js +4 -2
- package/dist/scripts/release-runtime-truth-matrix-check.js +1 -1
- package/dist/scripts/research-blueprint-densifier-check.js +1 -1
- package/dist/scripts/research-claim-builder-check.js +1 -1
- package/dist/scripts/research-complete-package-fixture-check.js +1 -1
- package/dist/scripts/research-execution-profile-routing-check.js +2 -2
- package/dist/scripts/research-final-reviewer-blackbox.js +1 -1
- package/dist/scripts/{sks-3-1-4-directive-check-lib.js → runtime-domain-gate-lib.js} +2 -2
- package/dist/scripts/runtime-proof-summary-check.js +1 -1
- package/dist/scripts/runtime-script-pack-closure-check.js +7 -1
- package/dist/scripts/scheduler-batch-dispatch-check.js +1 -1
- package/dist/scripts/scheduler-parallel-proof-consistency-check.js +1 -1
- package/dist/scripts/scheduler-utilization-integral-check.js +1 -1
- package/dist/scripts/search-visibility-gate-lib.js +1 -1
- package/dist/scripts/secret-preservation-check.js +1 -1
- package/dist/scripts/seo-geo-geo-disambiguation-check.js +1 -1
- package/dist/scripts/seo-geo-skill-rich-content-check.js +1 -1
- package/dist/scripts/side-effect-runtime-report-check.js +1 -1
- package/dist/scripts/{sks-3-1-8-check-lib.js → skill-fixture-check-lib.js} +1 -1
- package/dist/scripts/skill-name-canonicalizer-check.js +1 -1
- package/dist/scripts/skills-manifest-continuity-check.js +1 -1
- package/dist/scripts/sks-uninstall-regression-check.js +1 -1
- package/dist/scripts/sksd-daemon-check.js +1 -1
- package/dist/scripts/super-search-provider-interface-check.js +1 -1
- package/dist/scripts/triwiki-cache-key-check.js +1 -1
- package/dist/scripts/triwiki-proof-bank-blackbox.js +2 -2
- package/dist/scripts/triwiki-proof-bank-check.js +1 -1
- package/dist/scripts/triwiki-proof-card-check.js +1 -1
- package/dist/scripts/type-surface-codex-app-check.js +2 -2
- package/dist/scripts/{sks-3-1-5-directive-check-lib.js → typed-routing-gate-lib.js} +2 -2
- package/dist/scripts/ultra-router-auto-router-check.js +1 -1
- package/dist/scripts/ux-review-extract-wires-real-extractor-check.js +1 -1
- package/dist/scripts/ux-review-patch-diff-recheck-check.js +1 -1
- package/dist/scripts/ux-review-run-wires-imagegen-check.js +9 -2
- package/package.json +5 -7
- package/release-gates.v2.json +66 -11
- package/runtime-required-scripts.json +138 -14
- package/config/bench-baseline.json +0 -7
- package/dist/core/codex-app/sks-menubar.js +0 -1
- package/dist/core/release/release-closure-contract.js +0 -30
- package/dist/core/release/release-closure-helpers.js +0 -293
- package/dist/core/release/release-closure-validation.js +0 -284
- package/dist/core/release/release-closure.js +0 -163
- package/dist/scripts/build-dist.js +0 -124
- package/dist/scripts/build-once-runner-check.js +0 -6
- package/dist/scripts/canonical-test-runner.js +0 -234
- package/dist/scripts/changelog-check.js +0 -45
- package/dist/scripts/check-architecture.js +0 -295
- package/dist/scripts/check-cli-entrypoint.js +0 -41
- package/dist/scripts/check-command-module-budget.js +0 -77
- package/dist/scripts/check-feature-quality.js +0 -51
- package/dist/scripts/check-legacy-free.js +0 -64
- package/dist/scripts/check-pipeline-budget.js +0 -49
- package/dist/scripts/check-pipeline-runtime.js +0 -16
- package/dist/scripts/check-publish-tag.js +0 -56
- package/dist/scripts/check-route-modularity.js +0 -72
- package/dist/scripts/codex-0140-capability-check.js +0 -14
- package/dist/scripts/codex-0140-feature-probes-check.js +0 -23
- package/dist/scripts/codex-permission-profiles-check.js +0 -34
- package/dist/scripts/codex-project-config-policy-splitter-check.js +0 -49
- package/dist/scripts/competitor-scorecard-check.js +0 -24
- package/dist/scripts/core-skill-no-drift-check.js +0 -23
- package/dist/scripts/db-route-materialization-check.js +0 -32
- package/dist/scripts/doctor-context7-mcp-repair-blackbox.js +0 -15
- package/dist/scripts/doctor-fastpath-check.js +0 -25
- package/dist/scripts/doctor-fix-production-blackbox.js +0 -35
- package/dist/scripts/doctor-idempotence-check.js +0 -6
- package/dist/scripts/doctor-ops-semantics-check.js +0 -83
- package/dist/scripts/doctor-startup-config-repair-blackbox.js +0 -18
- package/dist/scripts/doctor-supabase-mcp-repair-blackbox.js +0 -13
- package/dist/scripts/ensure-bin-executable.js +0 -16
- package/dist/scripts/fsx-hotpath-check.js +0 -9
- package/dist/scripts/high-risk-contracts-check.js +0 -183
- package/dist/scripts/hook-latency-quantum-check.js +0 -120
- package/dist/scripts/import-graph-budget-check.js +0 -9
- package/dist/scripts/mcp-tool-naming-parity-check.js +0 -14
- package/dist/scripts/naruto-codex-e2e-check.js +0 -105
- package/dist/scripts/naruto-write-e2e-check.js +0 -31
- package/dist/scripts/native-capability-postcheck-check.js +0 -16
- package/dist/scripts/ops-diagnostics-bundle-check.js +0 -11
- package/dist/scripts/parallel-production-smoke-check.js +0 -20
- package/dist/scripts/perf-budget-check.js +0 -12
- package/dist/scripts/project-skill-dedupe-blackbox.js +0 -62
- package/dist/scripts/release-dag-full-coverage-check.js +0 -98
- package/dist/scripts/release-dist-freshness-check.js +0 -6
- package/dist/scripts/release-file-ownership-check.js +0 -35
- package/dist/scripts/release-gate-script-parity-check.js +0 -148
- package/dist/scripts/release-macos-menubar-proof.js +0 -167
- package/dist/scripts/release-main-push-guard.js +0 -37
- package/dist/scripts/release-main-push-receipt.js +0 -43
- package/dist/scripts/release-metadata-1-19-check.js +0 -257
- package/dist/scripts/release-version-truth-check.js +0 -138
- package/dist/scripts/retention-apply-smoke-check.js +0 -19
- package/dist/scripts/retention-budget-check.js +0 -6
- package/dist/scripts/retention-dry-run-check.js +0 -8
- package/dist/scripts/rollback-recovery-smoke-check.js +0 -70
- package/dist/scripts/route-intent-regression-check.js +0 -42
- package/dist/scripts/runtime-current-terminal-check.js +0 -108
- package/dist/scripts/runtime-dist-parity-check.js +0 -76
- package/dist/scripts/runtime-no-src-mjs-check.js +0 -30
- package/dist/scripts/runtime-ts-rust-boundary-check.js +0 -58
- package/dist/scripts/runtime-ts-source-of-truth-check.js +0 -53
- package/dist/scripts/secret-preservation-guard-check.js +0 -36
- package/dist/scripts/seo-marketing-truthfulness-check.js +0 -98
- package/dist/scripts/seo-metadata-sync-check.js +0 -60
- package/dist/scripts/sizecheck.js +0 -148
- package/dist/scripts/sks-menubar-install-check.js +0 -333
- package/dist/scripts/supabase-secret-preservation-blackbox.js +0 -28
- package/dist/scripts/super-search-live-smoke-check.js +0 -115
- package/dist/scripts/super-search-local-http-smoke-check.js +0 -16
- package/dist/scripts/super-search-offline-contract-check.js +0 -43
- package/dist/scripts/update-fastpath-check.js +0 -28
- package/dist/scripts/update-preserves-supabase-keys-blackbox.js +0 -26
- package/dist/scripts/upgrade-migration-matrix-check.js +0 -351
- package/dist/scripts/write-build-manifest.js +0 -70
- package/dist/scripts/zellij-capability-check.js +0 -13
- package/dist/scripts/zellij-developer-controls-check.js +0 -16
- package/dist/scripts/zellij-doctor-readiness-check.js +0 -49
- package/dist/scripts/zellij-dynamic-pane-lifecycle-check.js +0 -19
- package/dist/scripts/zellij-fake-adapter-check.js +0 -31
- package/dist/scripts/zellij-first-slot-down-stack-check.js +0 -20
- package/dist/scripts/zellij-first-slot-down-stack-real-check.js +0 -348
- package/dist/scripts/zellij-homebrew-policy-check.js +0 -3
- package/dist/scripts/zellij-initial-main-only-blackbox.js +0 -21
- package/dist/scripts/zellij-lane-renderer-check.js +0 -78
- package/dist/scripts/zellij-launch-command-truth-check.js +0 -62
- package/dist/scripts/zellij-layout-valid-check.js +0 -120
- package/dist/scripts/zellij-pane-creation-lock-metrics-check.js +0 -10
- package/dist/scripts/zellij-pane-lock-concurrency-blackbox.js +0 -78
- package/dist/scripts/zellij-pane-lock-does-not-block-worker-check.js +0 -12
- package/dist/scripts/zellij-pane-lock-open-worker-integration-blackbox.js +0 -134
- package/dist/scripts/zellij-qa-app-handoff-status-check.js +0 -7
- package/dist/scripts/zellij-right-column-geometry-proof.js +0 -158
- package/dist/scripts/zellij-right-column-headless-overflow-check.js +0 -20
- package/dist/scripts/zellij-right-column-manager-check.js +0 -24
- package/dist/scripts/zellij-self-heal-check.js +0 -3
- package/dist/scripts/zellij-self-heal-dry-run-check.js +0 -3
- package/dist/scripts/zellij-self-heal-status-contract-check.js +0 -3
- package/dist/scripts/zellij-self-heal-typed-blackbox.js +0 -3
- package/dist/scripts/zellij-slot-column-anchor-check.js +0 -65
- package/dist/scripts/zellij-slot-column-anchor-telemetry-check.js +0 -8
- package/dist/scripts/zellij-slot-only-ui-check.js +0 -29
- package/dist/scripts/zellij-slot-pane-renderer-check.js +0 -149
- package/dist/scripts/zellij-slot-pane-stale-detection-check.js +0 -65
- package/dist/scripts/zellij-slot-pane-telemetry-renderer-check.js +0 -11
- package/dist/scripts/zellij-slot-renderer-proof-semantics-check.js +0 -58
- package/dist/scripts/zellij-slot-telemetry-check.js +0 -38
- package/dist/scripts/zellij-slot-telemetry-incremental-check.js +0 -46
- package/dist/scripts/zellij-slot-telemetry-live-flush-check.js +0 -55
- package/dist/scripts/zellij-slot-telemetry-performance-check.js +0 -32
- package/dist/scripts/zellij-slot-telemetry-real-blackbox.js +0 -19
- package/dist/scripts/zellij-slot-telemetry-renderer-check.js +0 -11
- package/dist/scripts/zellij-slot-telemetry-runtime-check.js +0 -23
- package/dist/scripts/zellij-spawn-on-demand-layout-check.js +0 -45
- package/dist/scripts/zellij-stacked-capability-routing-check.js +0 -9
- package/dist/scripts/zellij-stacked-fallback-integration-blackbox.js +0 -78
- package/dist/scripts/zellij-stacked-version-matrix-check.js +0 -29
- package/dist/scripts/zellij-stacked-version-parser-check.js +0 -19
- package/dist/scripts/zellij-ui-design-check.js +0 -92
- package/dist/scripts/zellij-update-missing-self-heal-check.js +0 -3
- package/dist/scripts/zellij-update-prompt-matrix-check.js +0 -16
- package/dist/scripts/zellij-update-prompt-mode-check.js +0 -18
- package/dist/scripts/zellij-update-prompt-safety-check.js +0 -8
- package/dist/scripts/zellij-worker-pane-manager-check.js +0 -108
- package/dist/scripts/zellij-worker-pane-manager-single-owner-check.js +0 -47
- package/dist/scripts/zellij-worker-pane-real-ui-blackbox.js +0 -199
- /package/dist/scripts/{sks-1-11-gate-lib.js → sks-cli-gate-lib.js} +0 -0
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import Cocoa
|
|
2
|
+
|
|
3
|
+
final class MultiProviderRouterControls {
|
|
4
|
+
let baseURL: NSTextField = {
|
|
5
|
+
let field = NSTextField(frame: NSRect(x: 0, y: 0, width: 280, height: 24))
|
|
6
|
+
field.placeholderString = "http://127.0.0.1:10100/v1"
|
|
7
|
+
field.stringValue = "http://127.0.0.1:10100/v1"
|
|
8
|
+
field.setAccessibilityLabel("Multi-provider router base URL")
|
|
9
|
+
field.setAccessibilityHelp("Only loopback HTTP or HTTPS endpoints ending in /v1 are accepted.")
|
|
10
|
+
field.toolTip = "Loopback only: localhost, 127.0.0.1, or ::1, ending in /v1."
|
|
11
|
+
return field
|
|
12
|
+
}()
|
|
13
|
+
let catalogPath: NSTextField = {
|
|
14
|
+
let field = NSTextField(frame: NSRect(x: 0, y: 0, width: 340, height: 24))
|
|
15
|
+
field.placeholderString = "~/.codex/opencodex-catalog.json"
|
|
16
|
+
field.stringValue = "~/.codex/opencodex-catalog.json"
|
|
17
|
+
field.setAccessibilityLabel("Codex multi-provider model catalog path")
|
|
18
|
+
field.setAccessibilityHelp("OpenCodex writes this owner-only Codex catalog. Other routers must export a complete Codex ModelInfo catalog.")
|
|
19
|
+
field.toolTip = "OpenCodex default: $CODEX_HOME/opencodex-catalog.json"
|
|
20
|
+
return field
|
|
21
|
+
}()
|
|
22
|
+
let model: NSTextField = {
|
|
23
|
+
let field = NSTextField(frame: NSRect(x: 0, y: 0, width: 280, height: 24))
|
|
24
|
+
field.placeholderString = "anthropic/claude-sonnet"
|
|
25
|
+
field.setAccessibilityLabel("Multi-provider router model slug")
|
|
26
|
+
field.setAccessibilityPlaceholderValue("provider/model")
|
|
27
|
+
field.setAccessibilityHelp("Enter an exact model slug from the configured Codex catalog.")
|
|
28
|
+
return field
|
|
29
|
+
}()
|
|
30
|
+
let modelPopup = NSPopUpButton()
|
|
31
|
+
let status: NSTextField = {
|
|
32
|
+
let field = NativeView.detail("Multi-provider router status has not loaded yet.")
|
|
33
|
+
field.setAccessibilityLabel("Multi-provider router status")
|
|
34
|
+
return field
|
|
35
|
+
}()
|
|
36
|
+
weak var refreshButton: NSButton?
|
|
37
|
+
var models: [String] = []
|
|
38
|
+
var refreshInFlight = false
|
|
39
|
+
var modelSelectionPending = false
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
extension ProvidersViewController {
|
|
43
|
+
func makeMultiProviderRouterCard() -> NSBox {
|
|
44
|
+
multiProvider.model.delegate = self
|
|
45
|
+
multiProvider.modelPopup.addItem(withTitle: "Choose from catalog…")
|
|
46
|
+
multiProvider.modelPopup.target = self
|
|
47
|
+
multiProvider.modelPopup.action = #selector(selectMultiProviderModel(_:))
|
|
48
|
+
multiProvider.modelPopup.setAccessibilityLabel("Multi-provider routed model catalog")
|
|
49
|
+
multiProvider.modelPopup.setAccessibilityHelp("Choose an exact provider/model slug from the active Codex catalog.")
|
|
50
|
+
multiProvider.modelPopup.widthAnchor.constraint(greaterThanOrEqualToConstant: 280).isActive = true
|
|
51
|
+
multiProvider.modelPopup.isEnabled = false
|
|
52
|
+
|
|
53
|
+
let refresh = NativeView.button("Refresh Router", target: self, action: #selector(refreshMultiProviderRouterAction(_:)))
|
|
54
|
+
let test = NativeView.button("Check Router", target: self, action: #selector(testMultiProviderRouter))
|
|
55
|
+
let activate = NativeView.button("Configure Router Model", target: self, action: #selector(useMultiProviderRouter))
|
|
56
|
+
refresh.setAccessibilityLabel("Refresh multi-provider router and catalog status")
|
|
57
|
+
test.setAccessibilityLabel("Check the loopback multi-provider router")
|
|
58
|
+
activate.setAccessibilityLabel("Configure the selected routed model and restart Codex App")
|
|
59
|
+
test.setAccessibilityHelp("Checks that the selected model exists in both the local catalog and the live loopback router. No configuration is changed.")
|
|
60
|
+
activate.setAccessibilityHelp("Validates the loopback router, writes its provider and catalog settings to Codex config, and restarts Codex App. Runtime adoption still requires a live Codex check.")
|
|
61
|
+
multiProvider.refreshButton = refresh
|
|
62
|
+
actionButtons += [refresh, test, activate]
|
|
63
|
+
|
|
64
|
+
let routerLabel = NSTextField(labelWithString: "Router URL")
|
|
65
|
+
let catalogLabel = NSTextField(labelWithString: "Catalog")
|
|
66
|
+
let modelsLabel = NSTextField(labelWithString: "Models")
|
|
67
|
+
let modelLabel = NSTextField(labelWithString: "Model slug")
|
|
68
|
+
for label in [routerLabel, catalogLabel, modelsLabel, modelLabel] {
|
|
69
|
+
label.setContentHuggingPriority(.required, for: .horizontal)
|
|
70
|
+
}
|
|
71
|
+
let security = NativeView.detail(
|
|
72
|
+
"Security: only loopback HTTP(S) /v1 endpoints are accepted. SKS Control Center does not accept or store router credentials; keep upstream credentials inside the local router."
|
|
73
|
+
)
|
|
74
|
+
security.setAccessibilityLabel("Multi-provider router security")
|
|
75
|
+
let setup = NativeView.detail(
|
|
76
|
+
"OpenCodex setup: run ocx start, then ensure the catalog stamps multi_agent_version = \"v2\" on routed models. If OpenCodex chose a fallback port, replace 10100 with the live port reported by ocx status."
|
|
77
|
+
)
|
|
78
|
+
setup.setAccessibilityLabel("OpenCodex multi-provider setup guidance")
|
|
79
|
+
|
|
80
|
+
return NativeView.card(
|
|
81
|
+
title: "Multi-Provider Router",
|
|
82
|
+
subtitle: "Connects Codex to one local Responses router, such as OpenCodex. Multi-agent v2 catalog slugs (multi_agent_version = \"v2\") can then be assigned to different agent roles.",
|
|
83
|
+
views: [
|
|
84
|
+
security,
|
|
85
|
+
setup,
|
|
86
|
+
multiProvider.status,
|
|
87
|
+
NativeView.row([routerLabel, multiProvider.baseURL]),
|
|
88
|
+
NativeView.row([catalogLabel, multiProvider.catalogPath]),
|
|
89
|
+
NativeView.row([modelsLabel, multiProvider.modelPopup, refresh]),
|
|
90
|
+
NativeView.row([modelLabel, multiProvider.model]),
|
|
91
|
+
NativeView.row([test, activate])
|
|
92
|
+
]
|
|
93
|
+
)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
func setMultiProviderRouterBusy(_ value: Bool) {
|
|
97
|
+
multiProvider.baseURL.isEnabled = !value
|
|
98
|
+
multiProvider.catalogPath.isEnabled = !value
|
|
99
|
+
multiProvider.model.isEnabled = !value
|
|
100
|
+
multiProvider.modelPopup.isEnabled = !value && !multiProvider.models.isEmpty
|
|
101
|
+
multiProvider.refreshButton?.isEnabled = !value && !multiProvider.refreshInFlight
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
@objc func refreshMultiProviderRouterAction(_ sender: NSButton) {
|
|
105
|
+
refreshMultiProviderRouterStatus()
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
func refreshMultiProviderRouterStatus() {
|
|
109
|
+
guard !multiProvider.refreshInFlight else { return }
|
|
110
|
+
multiProvider.refreshInFlight = true
|
|
111
|
+
multiProvider.refreshButton?.isEnabled = false
|
|
112
|
+
if !busy { multiProvider.status.stringValue = "Checking multi-provider router and catalog…" }
|
|
113
|
+
processClient.run(["codex-app", "router-status", "--json"], timeout: NativeView.statusTimeout) { [weak self] result in
|
|
114
|
+
guard let self = self else { return }
|
|
115
|
+
self.multiProvider.refreshInFlight = false
|
|
116
|
+
self.multiProvider.refreshButton?.isEnabled = !self.busy
|
|
117
|
+
guard let json = self.json(result.output) else {
|
|
118
|
+
if !self.busy {
|
|
119
|
+
self.multiProvider.status.stringValue = "Router status unavailable · no configuration was changed."
|
|
120
|
+
self.multiProvider.status.textColor = .systemOrange
|
|
121
|
+
}
|
|
122
|
+
self.setMultiProviderRouterBusy(self.busy)
|
|
123
|
+
return
|
|
124
|
+
}
|
|
125
|
+
if let baseURL = json["base_url"] as? String, !baseURL.isEmpty {
|
|
126
|
+
self.multiProvider.baseURL.stringValue = baseURL
|
|
127
|
+
}
|
|
128
|
+
if let catalogPath = json["catalog_path"] as? String, !catalogPath.isEmpty {
|
|
129
|
+
self.multiProvider.catalogPath.stringValue = catalogPath
|
|
130
|
+
}
|
|
131
|
+
let models = (json["models"] as? [String]) ?? []
|
|
132
|
+
self.multiProvider.models = models
|
|
133
|
+
self.multiProvider.modelPopup.removeAllItems()
|
|
134
|
+
self.multiProvider.modelPopup.addItem(withTitle: models.isEmpty ? "Catalog has no models" : "Choose from \(models.count) models…")
|
|
135
|
+
if !models.isEmpty { self.multiProvider.modelPopup.addItems(withTitles: models) }
|
|
136
|
+
if let activeModel = json["active_model"] as? String,
|
|
137
|
+
!activeModel.isEmpty,
|
|
138
|
+
!self.multiProvider.modelSelectionPending,
|
|
139
|
+
self.multiProvider.model.stringValue.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
|
|
140
|
+
self.multiProvider.model.stringValue = activeModel
|
|
141
|
+
}
|
|
142
|
+
self.synchronizeMultiProviderPopupSelection()
|
|
143
|
+
let selected = json["selected"] as? Bool == true
|
|
144
|
+
self.routerSelectedNow = selected
|
|
145
|
+
self.routerActiveModel = (json["active_model"] as? String) ?? ""
|
|
146
|
+
self.renderActiveProviderSummary()
|
|
147
|
+
let providerReady = json["provider_contract_ok"] as? Bool == true
|
|
148
|
+
let catalog = json["catalog"] as? [String: Any]
|
|
149
|
+
let catalogReady = catalog?["ok"] as? Bool == true
|
|
150
|
+
let activeModel = json["active_model"] as? String ?? "unset"
|
|
151
|
+
let modelCount = json["model_count"] as? Int ?? models.count
|
|
152
|
+
let truncated = json["models_truncated"] as? Bool == true
|
|
153
|
+
let modelSummary = truncated
|
|
154
|
+
? "\(models.count) of \(modelCount) catalog models shown"
|
|
155
|
+
: "\(modelCount) catalog models available"
|
|
156
|
+
let state = json["status"] as? String ?? "unknown"
|
|
157
|
+
let ownership = json["routing_ownership"] as? [String: Any]
|
|
158
|
+
let ownershipClass = ownership?["classification"] as? String ?? ""
|
|
159
|
+
let desktopPicker = json["desktop_picker"] as? [String: Any]
|
|
160
|
+
let cacheInvalidated = desktopPicker?["models_cache_invalidated"] as? Bool == true
|
|
161
|
+
let restartRecommended = desktopPicker?["restart_recommended"] as? Bool == true
|
|
162
|
+
if !self.busy {
|
|
163
|
+
var suffix = ""
|
|
164
|
+
if ownershipClass == "opencodex_design_b" {
|
|
165
|
+
suffix += " · OpenCodex Design B owns openai_base_url (do not overwrite without --force-routing-override)"
|
|
166
|
+
} else if !ownershipClass.isEmpty && ownershipClass != "sks_router" && ownershipClass != "unconfigured" {
|
|
167
|
+
suffix += " · routing owner: \(ownershipClass)"
|
|
168
|
+
}
|
|
169
|
+
if restartRecommended {
|
|
170
|
+
suffix += cacheInvalidated
|
|
171
|
+
? " · Desktop models cache marked stale; restart Codex App if the picker is still old"
|
|
172
|
+
: " · restart Codex App after catalog changes so the Desktop picker refreshes"
|
|
173
|
+
}
|
|
174
|
+
if selected && providerReady && catalogReady {
|
|
175
|
+
self.multiProvider.status.stringValue = "Router configured · \(activeModel) · \(modelSummary). Runtime adoption is not verified here.\(suffix)"
|
|
176
|
+
self.multiProvider.status.textColor = .systemGreen
|
|
177
|
+
} else if providerReady && catalogReady {
|
|
178
|
+
self.multiProvider.status.stringValue = "Router definition ready, not selected · \(modelSummary). Choose a model and configure when ready.\(suffix)"
|
|
179
|
+
self.multiProvider.status.textColor = .secondaryLabelColor
|
|
180
|
+
} else {
|
|
181
|
+
self.multiProvider.status.stringValue = "Router \(state.replacingOccurrences(of: "_", with: " ")) · \(self.multiProviderPublicDetail(json, fallback: result.output))\(suffix)"
|
|
182
|
+
self.multiProvider.status.textColor = .systemOrange
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
self.setMultiProviderRouterBusy(self.busy)
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
@objc private func selectMultiProviderModel(_ sender: NSPopUpButton) {
|
|
190
|
+
guard sender.indexOfSelectedItem > 0, let model = sender.titleOfSelectedItem else { return }
|
|
191
|
+
multiProvider.modelSelectionPending = true
|
|
192
|
+
multiProvider.model.stringValue = model
|
|
193
|
+
multiProvider.status.stringValue = "Selected \(model). Check the router before activation."
|
|
194
|
+
multiProvider.status.textColor = .secondaryLabelColor
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
@objc func testMultiProviderRouter() {
|
|
198
|
+
let values = multiProviderRouterInput()
|
|
199
|
+
guard !values.model.isEmpty else {
|
|
200
|
+
multiProvider.status.stringValue = "Router check blocked · choose or enter a provider/model catalog slug."
|
|
201
|
+
multiProvider.status.textColor = .systemOrange
|
|
202
|
+
return
|
|
203
|
+
}
|
|
204
|
+
guard !busy else { multiProvider.status.stringValue = "Another provider action is already running."; return }
|
|
205
|
+
guard let snapshot = operations.begin(kind: "multi-provider-router-test", mutationGroup: nil, summary: "Check multi-provider router") else {
|
|
206
|
+
multiProvider.status.stringValue = "Another guarded mutation is already running. Wait or open Diagnostics."
|
|
207
|
+
return
|
|
208
|
+
}
|
|
209
|
+
setBusy(true)
|
|
210
|
+
multiProvider.status.stringValue = "Checking \(values.model) through the loopback router…"
|
|
211
|
+
_ = operations.update(snapshot, state: .running, stage: "testing", progress: nil, summary: "Check multi-provider router")
|
|
212
|
+
processClient.run([
|
|
213
|
+
"codex-app", "router-test",
|
|
214
|
+
"--base-url", values.baseURL,
|
|
215
|
+
"--catalog", values.catalogPath,
|
|
216
|
+
"--model", values.model,
|
|
217
|
+
"--json"
|
|
218
|
+
], timeout: NativeView.mutationTimeout) { [weak self] result in
|
|
219
|
+
guard let self = self else { return }
|
|
220
|
+
self.setBusy(false)
|
|
221
|
+
let json = self.json(result.output)
|
|
222
|
+
let ok = result.code == 0 && json?["ok"] as? Bool == true
|
|
223
|
+
_ = self.operations.update(snapshot, state: ok ? .succeeded : .failed, stage: "complete", progress: 1, summary: ok ? "Multi-provider router ready" : "Multi-provider router needs action")
|
|
224
|
+
self.multiProvider.status.stringValue = ok
|
|
225
|
+
? "Router check passed · \(values.model) is present in both the Codex catalog and live router."
|
|
226
|
+
: "Router check failed · \(self.multiProviderPublicDetail(json, fallback: result.output))"
|
|
227
|
+
self.multiProvider.status.textColor = ok ? .systemGreen : .systemOrange
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
@objc func useMultiProviderRouter() {
|
|
232
|
+
let values = multiProviderRouterInput()
|
|
233
|
+
guard !values.model.isEmpty else {
|
|
234
|
+
multiProvider.status.stringValue = "Configuration blocked · choose or enter a provider/model catalog slug."
|
|
235
|
+
multiProvider.status.textColor = .systemOrange
|
|
236
|
+
return
|
|
237
|
+
}
|
|
238
|
+
guard !busy else { multiProvider.status.stringValue = "Another provider action is already running."; return }
|
|
239
|
+
guard let window = view.window else { return }
|
|
240
|
+
AlertFactory.confirmSheet(
|
|
241
|
+
window: window,
|
|
242
|
+
title: "Configure Router Model?",
|
|
243
|
+
message: "\(values.model) becomes the routed Codex main model and Codex App restarts.",
|
|
244
|
+
destructive: false
|
|
245
|
+
) { [weak self] approved in
|
|
246
|
+
guard let self = self, approved else { return }
|
|
247
|
+
self.performUseMultiProviderRouter(values: values)
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
private func performUseMultiProviderRouter(values: (baseURL: String, catalogPath: String, model: String)) {
|
|
252
|
+
guard let snapshot = operations.begin(kind: "multi-provider-router-use", mutationGroup: "codex-config", summary: "Configure multi-provider router") else {
|
|
253
|
+
multiProvider.status.stringValue = "Another guarded mutation is already running. Wait or open Diagnostics."
|
|
254
|
+
return
|
|
255
|
+
}
|
|
256
|
+
setBusy(true)
|
|
257
|
+
multiProvider.status.stringValue = "Validating and configuring \(values.model), then restarting Codex App…"
|
|
258
|
+
_ = operations.update(snapshot, state: .running, stage: "configuring", progress: nil, summary: "Configure multi-provider router")
|
|
259
|
+
processClient.run([
|
|
260
|
+
"codex-app", "use-router",
|
|
261
|
+
"--base-url", values.baseURL,
|
|
262
|
+
"--catalog", values.catalogPath,
|
|
263
|
+
"--model", values.model,
|
|
264
|
+
"--restart-app",
|
|
265
|
+
"--json"
|
|
266
|
+
], timeout: NativeView.mutationTimeout) { [weak self] result in
|
|
267
|
+
guard let self = self else { return }
|
|
268
|
+
self.setBusy(false)
|
|
269
|
+
let json = self.json(result.output)
|
|
270
|
+
let applied = json?["config_applied"] as? Bool == true
|
|
271
|
+
let restarted = json?["restart_completed"] as? Bool == true
|
|
272
|
+
let ok = result.code == 0 && json?["ok"] as? Bool == true && applied && restarted
|
|
273
|
+
_ = self.operations.update(snapshot, state: ok ? .succeeded : .failed, stage: "complete", progress: 1, summary: ok ? "Multi-provider router configured" : applied ? "Router configured; restart needs action" : "Router configuration needs action")
|
|
274
|
+
if ok {
|
|
275
|
+
let desktopPicker = json?["desktop_picker"] as? [String: Any]
|
|
276
|
+
let cacheNote = desktopPicker?["models_cache_invalidated"] as? Bool == true
|
|
277
|
+
? " Desktop models cache was marked stale."
|
|
278
|
+
: ""
|
|
279
|
+
self.multiProvider.status.stringValue = "Configuration saved and Codex App restarted · \(values.model).\(cacheNote) Run a live Codex turn before treating runtime adoption as verified."
|
|
280
|
+
self.multiProvider.status.textColor = .systemGreen
|
|
281
|
+
} else if applied {
|
|
282
|
+
let desktopPicker = json?["desktop_picker"] as? [String: Any]
|
|
283
|
+
let cacheNote = desktopPicker?["models_cache_invalidated"] as? Bool == true
|
|
284
|
+
? " Desktop models cache was marked stale."
|
|
285
|
+
: ""
|
|
286
|
+
self.multiProvider.status.stringValue = "Router configuration saved, but Codex App did not restart.\(cacheNote) Reopen the app, then refresh status."
|
|
287
|
+
self.multiProvider.status.textColor = .systemOrange
|
|
288
|
+
} else {
|
|
289
|
+
self.multiProvider.status.stringValue = "Router configuration failed · \(self.multiProviderPublicDetail(json, fallback: result.output))"
|
|
290
|
+
self.multiProvider.status.textColor = .systemOrange
|
|
291
|
+
}
|
|
292
|
+
if applied {
|
|
293
|
+
self.multiProvider.modelSelectionPending = false
|
|
294
|
+
}
|
|
295
|
+
self.refreshMultiProviderRouterStatus()
|
|
296
|
+
self.refreshRoleModels()
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
func synchronizeMultiProviderPopupSelection() {
|
|
301
|
+
let current = multiProvider.model.stringValue.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
302
|
+
if let index = multiProvider.models.firstIndex(of: current) {
|
|
303
|
+
multiProvider.modelPopup.selectItem(at: index + 1)
|
|
304
|
+
} else {
|
|
305
|
+
multiProvider.modelPopup.selectItem(at: 0)
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
private func multiProviderRouterInput() -> (baseURL: String, catalogPath: String, model: String) {
|
|
310
|
+
(
|
|
311
|
+
multiProvider.baseURL.stringValue.trimmingCharacters(in: .whitespacesAndNewlines),
|
|
312
|
+
multiProvider.catalogPath.stringValue.trimmingCharacters(in: .whitespacesAndNewlines),
|
|
313
|
+
multiProvider.model.stringValue.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
314
|
+
)
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
private func multiProviderPublicDetail(_ json: [String: Any]?, fallback: String) -> String {
|
|
318
|
+
if let blockers = json?["blockers"] as? [String], !blockers.isEmpty {
|
|
319
|
+
return "Reason: \(blockers.joined(separator: ", ").replacingOccurrences(of: "_", with: " "))."
|
|
320
|
+
}
|
|
321
|
+
if let hint = json?["hint"] as? String, !hint.isEmpty { return "Next: \(hint)." }
|
|
322
|
+
return "Next: \(NativeView.redactPreview(fallback))"
|
|
323
|
+
}
|
|
324
|
+
}
|