sneakoscope 7.0.2 → 7.0.5

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.
Files changed (598) hide show
  1. package/README.md +9 -7
  2. package/config/codex-releases/{rust-v0.144.5.json → rust-v0.145.0.json} +14 -8
  3. package/crates/sks-core/Cargo.lock +1 -1
  4. package/crates/sks-core/Cargo.toml +1 -1
  5. package/dist/bin/sks-dispatch.js +0 -3
  6. package/dist/cli/command-manifest-lite.js +1 -2
  7. package/dist/cli/command-registry.js +0 -4
  8. package/dist/cli/global-mode-router.js +5 -12
  9. package/dist/cli/install-helpers-codex-lb-chain.js +24 -2
  10. package/dist/cli/install-helpers-codex-lb-config.js +10 -25
  11. package/dist/cli/install-helpers-codex-lb-selftest-chain.js +0 -3
  12. package/dist/cli/install-helpers-codex-lb-selftest.js +0 -17
  13. package/dist/cli/install-helpers-install-support.js +1 -2
  14. package/dist/cli/install-helpers.js +83 -99
  15. package/dist/cli/router.js +22 -31
  16. package/dist/commands/codex-app.js +20 -2
  17. package/dist/commands/codex-lb.js +176 -22
  18. package/dist/commands/codex.js +3 -8
  19. package/dist/commands/conflicts.js +26 -3
  20. package/dist/commands/doctor.js +26 -31
  21. package/dist/commands/perf.js +5 -1
  22. package/dist/commands/zellij-slot-column-anchor.js +0 -2
  23. package/dist/commands/zellij-slot-pane.js +0 -7
  24. package/dist/commands/zellij.js +0 -2
  25. package/dist/config/skills-manifest.json +52 -52
  26. package/dist/core/agent-bridge/agent-manifest.js +192 -1
  27. package/dist/core/agent-bridge/agent-mode.js +0 -5
  28. package/dist/core/agent-bridge/host-capability-policy.js +189 -0
  29. package/dist/core/agent-bridge/host-capability-runtime.js +1395 -0
  30. package/dist/core/agent-bridge/mcp-server.js +1 -11
  31. package/dist/core/agents/agent-effort-policy.js +7 -10
  32. package/dist/core/agents/agent-orchestrator.js +0 -4
  33. package/dist/core/agents/agent-proof-evidence.js +0 -2
  34. package/dist/core/agents/agent-roster.js +6 -5
  35. package/dist/core/agents/agent-runner-ollama.js +0 -3
  36. package/dist/core/agents/agent-scheduler.js +7 -10
  37. package/dist/core/agents/agent-schema.js +3 -1
  38. package/dist/core/agents/agent-task-graph.js +4 -1
  39. package/dist/core/agents/agent-work-partition.js +4 -2
  40. package/dist/core/agents/native-cli-worker-runtime.js +5 -17
  41. package/dist/core/agents/work-partition/repo-inventory.js +0 -2
  42. package/dist/core/auto-review.js +8 -14
  43. package/dist/core/bench.js +0 -14
  44. package/dist/core/code-structure.js +0 -3
  45. package/dist/core/codex/agent-config-file-repair.js +0 -8
  46. package/dist/core/codex/codex-cli-update.js +122 -20
  47. package/dist/core/codex/codex-config-eperm-repair.js +0 -4
  48. package/dist/core/codex/codex-config-guard.js +0 -3
  49. package/dist/core/codex/codex-config-readability.js +0 -13
  50. package/dist/core/codex/codex-project-config-policy.js +0 -33
  51. package/dist/core/codex/codex-startup-config-postcheck.js +5 -0
  52. package/dist/core/codex/official-goal-mode.js +0 -2
  53. package/dist/core/codex-app/codex-agent-type-probe.js +31 -24
  54. package/dist/core/codex-app/codex-app-fast-ui-repair.js +5 -7
  55. package/dist/core/codex-app/codex-app-ui-state-snapshot.js +44 -7
  56. package/dist/core/codex-app/glm-model-profile.js +1 -1
  57. package/dist/core/codex-app/glm-profile-installer.js +40 -41
  58. package/dist/core/codex-app/glm-profile-schema.js +7 -11
  59. package/dist/core/codex-app/menubar/constants.js +1 -0
  60. package/dist/core/codex-app/menubar/launch-agent.js +37 -1
  61. package/dist/core/codex-app/openrouter-activate.js +152 -0
  62. package/dist/core/codex-app/openrouter-provider.js +82 -0
  63. package/dist/core/codex-app/sks-menubar.js +0 -1
  64. package/dist/core/codex-app.js +14 -32
  65. package/dist/core/codex-compat/codex-capability-matrix.js +208 -0
  66. package/dist/core/codex-compat/codex-hook-output-builders.js +9 -1
  67. package/dist/core/codex-compat/codex-hook-output-normalizer.js +1 -1
  68. package/dist/core/codex-compat/codex-hook-semantic-validator.js +3 -2
  69. package/dist/core/codex-compat/codex-hook-warning-detector.js +10 -2
  70. package/dist/core/codex-compat/codex-release-manifest.js +15 -8
  71. package/dist/core/codex-compat/codex-version-policy.js +77 -15
  72. package/dist/core/codex-control/codex-0144-capability.js +1 -1
  73. package/dist/core/codex-control/codex-lb-launch-recovery.js +0 -3
  74. package/dist/core/codex-control/codex-reliability-shield.js +0 -8
  75. package/dist/core/codex-control/codex-sdk-adapter.js +0 -3
  76. package/dist/core/codex-control/codex-sdk-config-policy.js +0 -2
  77. package/dist/core/codex-control/codex-sdk-env-policy.js +61 -16
  78. package/dist/core/codex-control/codex-task-runner.js +0 -7
  79. package/dist/core/codex-control/codex-thread-registry.js +0 -4
  80. package/dist/core/codex-lb/codex-lb-env.js +133 -24
  81. package/dist/core/codex-lb/codex-lb-tool-catalog.js +0 -4
  82. package/dist/core/codex-lb/codex-lb-tool-output-recovery.js +1 -1
  83. package/dist/core/codex-model-guard.js +0 -14
  84. package/dist/core/codex-native/codex-native-feature-broker.js +67 -22
  85. package/dist/core/codex-native/codex-native-interop-policy.js +81 -9
  86. package/dist/core/codex-native/confined-report-writer.js +21 -0
  87. package/dist/core/codex-native/core-skill-integrity.js +169 -20
  88. package/dist/core/codex-native/project-skill-dedupe.js +55 -13
  89. package/dist/core/codex-native/skill-registry-ledger.js +137 -16
  90. package/dist/core/codex-native/sks-skill-paths.js +185 -0
  91. package/dist/core/codex-runtime/codex-desktop-config-policy.js +3 -3
  92. package/dist/core/commands/agent-bridge-command.js +28 -8
  93. package/dist/core/commands/basic-cli.js +89 -42
  94. package/dist/core/commands/bench-command.js +5 -1
  95. package/dist/core/commands/command-utils.js +0 -5
  96. package/dist/core/commands/image-ux-review-command.js +0 -9
  97. package/dist/core/commands/mad-sks-command.js +55 -208
  98. package/dist/core/commands/naruto-command.js +55 -21
  99. package/dist/core/commands/ppt-command.js +0 -9
  100. package/dist/core/commands/run-command.js +8 -2
  101. package/dist/core/commands/seo-command.js +0 -6
  102. package/dist/core/commands/wiki-command.js +0 -14
  103. package/dist/core/computer-use-live-evidence.js +0 -5
  104. package/dist/core/config/secret-preservation.js +0 -11
  105. package/dist/core/daemon/sksd-hook-daemon-entrypoint.js +0 -2
  106. package/dist/core/daemon/sksd-hook-daemon.js +1 -29
  107. package/dist/core/daemon/sksd-hook-dispatch.js +0 -17
  108. package/dist/core/db-safety.js +0 -7
  109. package/dist/core/doctor/browser-use-repair.js +0 -2
  110. package/dist/core/doctor/command-alias-cleanup.js +37 -9
  111. package/dist/core/doctor/current-project-guidance.js +6 -3
  112. package/dist/core/doctor/doctor-codex-startup-repair.js +0 -3
  113. package/dist/core/doctor/doctor-dirty-planner.js +1 -1
  114. package/dist/core/doctor/doctor-readiness-matrix.js +12 -0
  115. package/dist/core/doctor/doctor-skill-reconcile.js +32 -0
  116. package/dist/core/doctor/imagegen-repair.js +0 -2
  117. package/dist/core/doctor/mcp-transport-collision-repair.js +0 -3
  118. package/dist/core/doctor/retired-auto-review-config.js +9 -1
  119. package/dist/core/doctor/retired-managed-residue-private.js +5 -4
  120. package/dist/core/doctor/retired-managed-residue-runtime.js +9 -1
  121. package/dist/core/doctor/skill-legacy-surface.js +351 -0
  122. package/dist/core/doctor/supabase-mcp-repair.js +0 -11
  123. package/dist/core/evaluation.js +3 -0
  124. package/dist/core/feature-fixture-executor.js +0 -48
  125. package/dist/core/feature-fixtures.js +0 -6
  126. package/dist/core/fsx.js +11 -12
  127. package/dist/core/harness-conflicts.js +177 -18
  128. package/dist/core/hooks-runtime/code-pack-freshness-preflight.js +0 -5
  129. package/dist/core/hooks-runtime/hook-context.js +202 -0
  130. package/dist/core/hooks-runtime/hook-io.js +1 -12
  131. package/dist/core/hooks-runtime/light-turn.js +0 -2
  132. package/dist/core/hooks-runtime/naruto-decision-gate.js +4 -1
  133. package/dist/core/hooks-runtime/naruto-terminal-finalization.js +91 -0
  134. package/dist/core/hooks-runtime/official-subagent-lifecycle.js +369 -0
  135. package/dist/core/hooks-runtime/standalone-parent-host-capability.js +98 -0
  136. package/dist/core/hooks-runtime/subagent-context.js +59 -0
  137. package/dist/core/hooks-runtime/subagent-skill-availability-contract.js +29 -0
  138. package/dist/core/hooks-runtime/subagent-skill-availability-evidence.js +195 -0
  139. package/dist/core/hooks-runtime/subagent-skill-availability-guards.js +316 -0
  140. package/dist/core/hooks-runtime/subagent-skill-availability.js +217 -0
  141. package/dist/core/hooks-runtime.js +275 -540
  142. package/dist/core/image-ux-review/codex-app-generated-image-discovery.js +0 -17
  143. package/dist/core/image-ux-review/imagegen-adapter.js +0 -14
  144. package/dist/core/imagegen/imagegen-auth-readiness.js +0 -9
  145. package/dist/core/imagegen/imagegen-capability.js +0 -3
  146. package/dist/core/init/managed-skill-install.js +42 -0
  147. package/dist/core/init/skills.js +248 -75
  148. package/dist/core/init.js +19 -45
  149. package/dist/core/lean-engineering-policy.js +0 -2
  150. package/dist/core/locks/file-lock.js +0 -21
  151. package/dist/core/loops/loop-planner.js +0 -6
  152. package/dist/core/loops/loop-runtime.js +0 -1
  153. package/dist/core/loops/loop-worker-runtime.js +0 -19
  154. package/dist/core/mad-sks/executors/db-write-executor.js +0 -4
  155. package/dist/core/mad-sks/executors/executor-base.js +0 -10
  156. package/dist/core/mad-sks/immutable-harness-guard.js +0 -5
  157. package/dist/core/mad-sks/sql-plane/coordinator.js +0 -5
  158. package/dist/core/mad-sks/sql-plane/ledger.js +0 -4
  159. package/dist/core/mad-sks/sql-plane/lock.js +0 -4
  160. package/dist/core/mad-sks/sql-plane/mcp-executor.js +0 -9
  161. package/dist/core/mad-sks/sql-plane/policy-resolver.js +0 -2
  162. package/dist/core/mad-sks/sql-plane/postconditions.js +0 -4
  163. package/dist/core/mad-sks/sql-plane/recovery.js +0 -2
  164. package/dist/core/mad-sks/sql-plane/runtime-profile.js +0 -8
  165. package/dist/core/managed-assets/managed-assets-manifest.js +1 -7
  166. package/dist/core/mcp-config/health-check.js +10 -3
  167. package/dist/core/migration/migration-transaction-journal.js +0 -8
  168. package/dist/core/mission.js +0 -2
  169. package/dist/core/naruto/naruto-active-pool.js +0 -2
  170. package/dist/core/naruto/naruto-concurrency-governor.js +18 -11
  171. package/dist/core/naruto/naruto-real-write-proof.js +0 -4
  172. package/dist/core/naruto/naruto-write-e2e.js +0 -1
  173. package/dist/core/perf/perf-budget.js +0 -5
  174. package/dist/core/permission-gates.js +0 -2
  175. package/dist/core/pipeline-internals/runtime-core.js +15 -5
  176. package/dist/core/pipeline-internals/runtime-gates.js +7 -19
  177. package/dist/core/preflight/parallel-preflight-engine.js +1 -12
  178. package/dist/core/proof/evidence-collector.js +0 -2
  179. package/dist/core/proof/route-finalizer.js +0 -1
  180. package/dist/core/proof/selftest-proof-fixtures.js +0 -5
  181. package/dist/core/providers/openrouter/openrouter-client.js +2 -2
  182. package/dist/core/providers/openrouter/openrouter-provider-health.js +1 -1
  183. package/dist/core/providers/{glm/glm-request-cache.js → openrouter/openrouter-request-cache.js} +5 -6
  184. package/dist/core/providers/openrouter/openrouter-secret-store.js +0 -1
  185. package/dist/core/providers/openrouter/openrouter-stream.js +2 -4
  186. package/dist/core/questions.js +3 -3
  187. package/dist/core/release/gate-manifest.js +0 -5
  188. package/dist/core/release/package-size-budget.js +2 -2
  189. package/dist/core/release/release-gate-batch-runner.js +11 -2
  190. package/dist/core/release/release-gate-cache-v2.js +0 -4
  191. package/dist/core/release/release-gate-contract.js +0 -7
  192. package/dist/core/release/release-gate-hermetic-env.js +0 -5
  193. package/dist/core/release/release-pack-receipt.js +1 -0
  194. package/dist/core/release-parallel-full-coverage.js +0 -2
  195. package/dist/core/remote/ssh-worker-client.js +0 -3
  196. package/dist/core/research/research-adversarial-review.js +6 -2
  197. package/dist/core/responses-retry-policy.js +0 -10
  198. package/dist/core/retention.js +0 -7
  199. package/dist/core/routes/constants.js +0 -3
  200. package/dist/core/routes/model-mode-router.js +10 -19
  201. package/dist/core/routes.js +91 -17
  202. package/dist/core/safety/command-contract/contracts.js +2 -0
  203. package/dist/core/safety/mutation-guard.js +0 -25
  204. package/dist/core/safety/mutation-ledger.js +0 -9
  205. package/dist/core/safety/requested-scope-contract.js +0 -0
  206. package/dist/core/security/high-risk-contracts.js +0 -1
  207. package/dist/core/skills/core-skill-card.js +0 -0
  208. package/dist/core/skills/core-skill-deployment.js +0 -13
  209. package/dist/core/skills/core-skill-epoch.js +0 -11
  210. package/dist/core/skills/core-skill-meta-update.js +0 -6
  211. package/dist/core/skills/core-skill-patch-apply.js +0 -7
  212. package/dist/core/skills/core-skill-patch.js +0 -8
  213. package/dist/core/skills/core-skill-reflection.js +0 -16
  214. package/dist/core/skills/core-skill-runtime.js +0 -6
  215. package/dist/core/skills/core-skill-scorer.js +0 -7
  216. package/dist/core/skills/core-skill-trainer.js +0 -11
  217. package/dist/core/skills/core-skill-types.js +0 -9
  218. package/dist/core/skills/core-skill-validation.js +0 -5
  219. package/dist/core/skills/rejected-skill-patch-buffer.js +0 -2
  220. package/dist/core/stop-gate/stop-gate-check.js +0 -8
  221. package/dist/core/stop-gate/stop-gate-resolver.js +0 -7
  222. package/dist/core/stop-gate/stop-gate-writer.js +0 -5
  223. package/dist/core/subagents/model-policy.js +0 -7
  224. package/dist/core/subagents/naruto-help-contract.js +3 -2
  225. package/dist/core/subagents/naruto-proof-projection.js +580 -12
  226. package/dist/core/subagents/official-subagent-config.js +256 -40
  227. package/dist/core/subagents/official-subagent-preparation.js +11 -7
  228. package/dist/core/subagents/official-subagent-prompt.js +29 -0
  229. package/dist/core/subagents/official-subagent-runner.js +379 -39
  230. package/dist/core/subagents/subagent-evidence.js +378 -9
  231. package/dist/core/subagents/terminology.js +11 -6
  232. package/dist/core/subagents/thread-budget.js +6 -3
  233. package/dist/core/subagents/triwiki-attention.js +0 -4
  234. package/dist/core/subagents/wave-parent-guidance.js +54 -9
  235. package/dist/core/telegram/runtime.js +0 -1
  236. package/dist/core/triwiki/code-index-scanner.js +0 -3
  237. package/dist/core/triwiki/code-pack-head-freshness.js +0 -10
  238. package/dist/core/triwiki/code-pack.js +0 -2
  239. package/dist/core/triwiki/triwiki-cache-key.js +0 -1
  240. package/dist/core/triwiki/triwiki-proof-bank.js +0 -1
  241. package/dist/core/triwiki-attention.js +0 -10
  242. package/dist/core/triwiki-provenance.js +0 -5
  243. package/dist/core/triwiki-runtime.js +0 -12
  244. package/dist/core/triwiki-wrongness/wrongness-ledger.js +0 -7
  245. package/dist/core/triwiki-wrongness/wrongness-schema.js +0 -3
  246. package/dist/core/trust-kernel/trust-report.js +0 -7
  247. package/dist/core/update/update-migration-state.js +113 -61
  248. package/dist/core/update-check.js +2 -14
  249. package/dist/core/version-manager.js +43 -4
  250. package/dist/core/version.js +1 -1
  251. package/dist/core/work-order-ledger.js +0 -17
  252. package/dist/core/zellij/zellij-clipboard-config.js +0 -18
  253. package/dist/core/zellij/zellij-fake-adapter.js +16 -0
  254. package/dist/core/zellij/zellij-lane-renderer.js +5 -46
  255. package/dist/core/zellij/zellij-lane-runtime.js +0 -1
  256. package/dist/core/zellij/zellij-launcher.js +35 -35
  257. package/dist/core/zellij/zellij-official-subagent-activity.js +0 -5
  258. package/dist/core/zellij/zellij-official-subagent-telemetry.js +0 -5
  259. package/dist/core/zellij/zellij-pane-proof.js +3 -3
  260. package/dist/core/zellij/zellij-screen-proof.js +0 -7
  261. package/dist/core/zellij/zellij-slot-column-anchor.js +0 -1
  262. package/dist/core/zellij/zellij-slot-pane-renderer.js +0 -9
  263. package/dist/core/zellij/zellij-slot-telemetry.js +6 -16
  264. package/dist/core/zellij/zellij-ui-mode.js +0 -7
  265. package/dist/core/zellij/zellij-update.js +0 -29
  266. package/dist/core/zellij/zellij-worker-pane-manager.js +0 -39
  267. package/dist/native/sks-menubar/Sources/DiagnosticsViewController.swift +61 -2
  268. package/dist/native/sks-menubar/Sources/MCPServersViewController.swift +10 -3
  269. package/dist/native/sks-menubar/Sources/OverviewViewController.swift +55 -3
  270. package/dist/native/sks-menubar/Sources/ProvidersOpenRouter.swift +76 -0
  271. package/dist/native/sks-menubar/Sources/ProvidersViewController.swift +273 -54
  272. package/dist/native/sks-menubar/Sources/RemoteTelegramViewController.swift +5 -1
  273. package/dist/native/sks-menubar/Sources/SettingsViewController.swift +2 -2
  274. package/dist/native/sks-menubar/Sources/StatusItemController.swift +28 -2
  275. package/dist/native/sks-menubar/Sources/UpdatesViewController.swift +96 -13
  276. package/dist/scripts/agent-message-bus-reader-check.js +0 -1
  277. package/dist/scripts/all-feature-deep-completion-check.js +0 -1
  278. package/dist/scripts/appshots-thread-attachment-discovery-check.js +0 -1
  279. package/dist/scripts/architecture-guard-check.js +0 -1
  280. package/dist/scripts/build-dist.js +0 -1
  281. package/dist/scripts/build-once-runner-check.js +0 -1
  282. package/dist/scripts/canonical-test-runner.js +0 -2
  283. package/dist/scripts/certificate-sla-check.js +0 -1
  284. package/dist/scripts/changelog-check.js +0 -1
  285. package/dist/scripts/check-cli-entrypoint.js +0 -1
  286. package/dist/scripts/check-command-module-budget.js +0 -7
  287. package/dist/scripts/check-feature-quality.js +0 -1
  288. package/dist/scripts/check-legacy-free.js +0 -1
  289. package/dist/scripts/check-pipeline-runtime.js +0 -1
  290. package/dist/scripts/check-runtime-schemas.js +0 -1
  291. package/dist/scripts/codex-0-134-runner-truth-check.js +0 -1
  292. package/dist/scripts/codex-0-137-compat-check.js +0 -1
  293. package/dist/scripts/codex-0138-capability-artifact-check.js +0 -1
  294. package/dist/scripts/codex-0138-capability-check.js +0 -1
  295. package/dist/scripts/codex-0138-doctor-check.js +0 -1
  296. package/dist/scripts/codex-0138-feature-probes-check.js +0 -1
  297. package/dist/scripts/codex-0144-app-server-v2-check.js +5 -5
  298. package/dist/scripts/codex-0144-core-real-probes-check.js +0 -1
  299. package/dist/scripts/codex-app-handoff-check.js +0 -1
  300. package/dist/scripts/codex-app-handoff-launch-check.js +0 -1
  301. package/dist/scripts/codex-config-load-probe.js +0 -5
  302. package/dist/scripts/codex-control-all-pipelines-check.js +0 -1
  303. package/dist/scripts/codex-control-event-stream-ledger-check.js +0 -1
  304. package/dist/scripts/codex-control-tool-output-continuity-audit-check.js +0 -1
  305. package/dist/scripts/codex-permission-profiles-check.js +0 -1
  306. package/dist/scripts/codex-plugin-app-template-policy-check.js +0 -1
  307. package/dist/scripts/codex-project-config-policy-splitter-check.js +0 -1
  308. package/dist/scripts/codex-sdk-all-pipelines-check.js +0 -1
  309. package/dist/scripts/codex-sdk-backend-router-check.js +0 -1
  310. package/dist/scripts/codex-sdk-capability-check.js +0 -1
  311. package/dist/scripts/codex-sdk-event-stream-ledger-check.js +0 -1
  312. package/dist/scripts/codex-sdk-real-smoke-check.js +0 -1
  313. package/dist/scripts/concurrent-session-collision-check.js +9 -0
  314. package/dist/scripts/context7-evidence-dedupe-check.js +0 -1
  315. package/dist/scripts/core-skill-card-schema-check.js +0 -11
  316. package/dist/scripts/core-skill-deployment-snapshot-check.js +0 -10
  317. package/dist/scripts/core-skill-heldout-validation-check.js +0 -11
  318. package/dist/scripts/core-skill-no-inference-optimizer-check.js +0 -11
  319. package/dist/scripts/core-skill-patch-check.js +0 -11
  320. package/dist/scripts/core-skill-route-runtime-integration-check.js +0 -11
  321. package/dist/scripts/current-command-surface-check.js +1 -1
  322. package/dist/scripts/current-surface-update-e2e-check.js +2 -4
  323. package/dist/scripts/current-upgrade-matrix-check.js +0 -1
  324. package/dist/scripts/dfix-fixture-check.js +0 -1
  325. package/dist/scripts/dfix-patch-handoff-check.js +0 -1
  326. package/dist/scripts/dfix-verification-check.js +0 -1
  327. package/dist/scripts/dfix-verification-recommendation-check.js +0 -1
  328. package/dist/scripts/docs-truthfulness-check.js +7 -7
  329. package/dist/scripts/doctor-fastpath-check.js +0 -1
  330. package/dist/scripts/doctor-fix-production-blackbox.js +1 -1
  331. package/dist/scripts/doctor-fix-proves-codex-read-check.js +0 -11
  332. package/dist/scripts/doctor-fixes-codex-app-fast-ui-check.js +0 -4
  333. package/dist/scripts/doctor-idempotence-check.js +0 -1
  334. package/dist/scripts/doctor-ops-semantics-check.js +0 -1
  335. package/dist/scripts/doctor-startup-config-repair-blackbox.js +1 -1
  336. package/dist/scripts/ensure-bin-executable.js +0 -1
  337. package/dist/scripts/evidence-flagship-coverage-check.js +0 -1
  338. package/dist/scripts/fast-codex-service-tier-proof-check.js +0 -1
  339. package/dist/scripts/fixtures/fake-codex-config-loader.js +0 -5
  340. package/dist/scripts/fsx-hotpath-check.js +0 -1
  341. package/dist/scripts/gate-policy-audit-check.js +1 -1
  342. package/dist/scripts/geo-claim-evidence-check.js +0 -1
  343. package/dist/scripts/geo-cli-blackbox-check.js +0 -1
  344. package/dist/scripts/geo-crawler-policy-check.js +0 -1
  345. package/dist/scripts/git-worktree-diff-envelope-check.js +0 -1
  346. package/dist/scripts/git-worktree-dirty-lock-check.js +0 -1
  347. package/dist/scripts/git-worktree-dirty-main-detection-check.js +0 -1
  348. package/dist/scripts/git-worktree-integration-primary-check.js +0 -1
  349. package/dist/scripts/git-worktree-manifest-append-check.js +0 -1
  350. package/dist/scripts/git-worktree-untracked-diff-check.js +0 -1
  351. package/dist/scripts/high-risk-contracts-check.js +0 -1
  352. package/dist/scripts/hook-latency-budget-check.js +0 -1
  353. package/dist/scripts/hook-latency-quantum-check.js +0 -1
  354. package/dist/scripts/image-artifact-path-contract-check.js +0 -1
  355. package/dist/scripts/imagegen-real-smoke-check.js +0 -1
  356. package/dist/scripts/import-graph-budget-check.js +0 -1
  357. package/dist/scripts/installed-package-smoke-check.js +0 -1
  358. package/dist/scripts/legacy-gate-purge-check.js +0 -1
  359. package/dist/scripts/lib/codex-sdk-gate-lib.js +0 -3
  360. package/dist/scripts/lib/ensure-dist-fresh.js +0 -1
  361. package/dist/scripts/lib/valid-png-fixture.js +0 -1
  362. package/dist/scripts/local-collab-all-pipelines-final-gpt-check.js +0 -1
  363. package/dist/scripts/loop-directive-check-lib.js +0 -1
  364. package/dist/scripts/loop-worker-fixture-child.js +0 -1
  365. package/dist/scripts/mad-preflight-blocks-unreadable-config-check.js +0 -10
  366. package/dist/scripts/mad-sks-sql-plane-lifecycle-hook-decision-check.js +0 -1
  367. package/dist/scripts/mad-sks-sql-plane-result-lifecycle-check.js +0 -1
  368. package/dist/scripts/mcp-plugin-inventory-check.js +0 -1
  369. package/dist/scripts/mcp-tool-naming-parity-check.js +0 -1
  370. package/dist/scripts/model-call-concurrency-check.js +0 -1
  371. package/dist/scripts/mutation-callsite-coverage-check.js +0 -5
  372. package/dist/scripts/naruto-codex-e2e-check.js +0 -1
  373. package/dist/scripts/naruto-worktree-coding-blackbox.js +0 -1
  374. package/dist/scripts/official-subagent-workflow-check.js +4 -2
  375. package/dist/scripts/ops-diagnostics-bundle-check.js +0 -1
  376. package/dist/scripts/packlist-performance-check.js +1 -3
  377. package/dist/scripts/perf-budget-check.js +0 -1
  378. package/dist/scripts/ppt-full-e2e-blackbox-check.js +0 -1
  379. package/dist/scripts/ppt-real-export-adapter-check.js +0 -1
  380. package/dist/scripts/ppt-real-imagegen-smoke-check.js +0 -1
  381. package/dist/scripts/ppt-real-imagegen-wiring-check.js +0 -1
  382. package/dist/scripts/ppt-reexport-rereview-check.js +0 -1
  383. package/dist/scripts/prepublish-fast-check.js +0 -23
  384. package/dist/scripts/prepublish-release-check-or-fast.js +0 -7
  385. package/dist/scripts/probe-memoization-check.js +0 -1
  386. package/dist/scripts/product-design-plugin-routing-check.js +0 -1
  387. package/dist/scripts/project-skill-dedupe-blackbox.js +36 -9
  388. package/dist/scripts/prompt-placeholder-guard-check.js +0 -1
  389. package/dist/scripts/python-codex-sdk-all-pipelines-check.js +0 -3
  390. package/dist/scripts/qa-loop-app-handoff-capability-check.js +0 -1
  391. package/dist/scripts/qa-loop-app-handoff-check.js +0 -1
  392. package/dist/scripts/qa-loop-app-handoff-cli-check.js +0 -1
  393. package/dist/scripts/qa-loop-app-handoff-confirmation-check.js +0 -1
  394. package/dist/scripts/qa-loop-app-handoff-gate-lifecycle-check.js +0 -1
  395. package/dist/scripts/qa-loop-app-handoff-launch-check.js +0 -1
  396. package/dist/scripts/qa-loop-app-handoff-status-lifecycle-check.js +0 -1
  397. package/dist/scripts/qa-loop-budget-policy-check.js +0 -1
  398. package/dist/scripts/qa-loop-effort-escalation-check.js +0 -1
  399. package/dist/scripts/qa-loop-image-path-exposure-check.js +0 -1
  400. package/dist/scripts/qa-loop-image-path-prompt-injection-check.js +0 -1
  401. package/dist/scripts/release-cache-glob-hashing-check.js +0 -1
  402. package/dist/scripts/release-cache-input-classifier-check.js +0 -1
  403. package/dist/scripts/release-cache-neutralization-report-check.js +0 -1
  404. package/dist/scripts/release-cache-version-neutral-fixture-check.js +0 -1
  405. package/dist/scripts/release-check-stamp.js +0 -4
  406. package/dist/scripts/release-dist-freshness-check.js +0 -1
  407. package/dist/scripts/release-full-parallelism-blackbox.js +3 -3
  408. package/dist/scripts/release-gate-batch-runner-check.js +22 -0
  409. package/dist/scripts/release-gate-budget-check.js +0 -6
  410. package/dist/scripts/release-gate-dag-runner-check.js +0 -1
  411. package/dist/scripts/release-latency-slo-check.js +0 -1
  412. package/dist/scripts/release-metadata-1-19-check.js +0 -2
  413. package/dist/scripts/release-metadata-check.js +0 -3
  414. package/dist/scripts/release-parallel-speed-budget-check.js +0 -5
  415. package/dist/scripts/release-proof-truth-check.js +0 -1
  416. package/dist/scripts/release-provenance-check.js +0 -1
  417. package/dist/scripts/release-real-check.js +0 -1
  418. package/dist/scripts/release-runtime-truth-matrix-check.js +0 -1
  419. package/dist/scripts/release-version-truth-check.js +0 -1
  420. package/dist/scripts/research-blueprint-densifier-check.js +0 -1
  421. package/dist/scripts/research-claim-builder-check.js +0 -1
  422. package/dist/scripts/research-complete-package-fixture-check.js +0 -1
  423. package/dist/scripts/research-final-reviewer-blackbox.js +0 -1
  424. package/dist/scripts/responses-retry-policy-centralized-check.js +0 -1
  425. package/dist/scripts/retention-apply-smoke-check.js +0 -1
  426. package/dist/scripts/retention-budget-check.js +0 -1
  427. package/dist/scripts/retention-dry-run-check.js +0 -1
  428. package/dist/scripts/rollback-recovery-smoke-check.js +0 -1
  429. package/dist/scripts/route-intent-regression-check.js +0 -1
  430. package/dist/scripts/runtime-current-terminal-check.js +0 -1
  431. package/dist/scripts/runtime-dist-parity-check.js +0 -1
  432. package/dist/scripts/runtime-no-src-mjs-check.js +0 -1
  433. package/dist/scripts/runtime-proof-summary-check.js +0 -1
  434. package/dist/scripts/runtime-ts-rust-boundary-check.js +0 -15
  435. package/dist/scripts/runtime-ts-source-of-truth-check.js +0 -1
  436. package/dist/scripts/scheduler-batch-dispatch-check.js +0 -1
  437. package/dist/scripts/scheduler-parallel-proof-consistency-check.js +0 -1
  438. package/dist/scripts/scheduler-utilization-integral-check.js +0 -1
  439. package/dist/scripts/search-visibility-gate-lib.js +0 -1
  440. package/dist/scripts/seo-audit-fixture-check.js +0 -1
  441. package/dist/scripts/seo-cli-blackbox-check.js +0 -1
  442. package/dist/scripts/seo-geo-geo-disambiguation-check.js +0 -1
  443. package/dist/scripts/seo-geo-route-identity-check.js +0 -1
  444. package/dist/scripts/seo-geo-skill-rich-content-check.js +0 -1
  445. package/dist/scripts/seo-marketing-truthfulness-check.js +0 -1
  446. package/dist/scripts/seo-metadata-sync-check.js +0 -1
  447. package/dist/scripts/seo-no-mutation-by-default-check.js +0 -1
  448. package/dist/scripts/shared-memory-fixture-check.js +0 -1
  449. package/dist/scripts/side-effect-runtime-report-check.js +0 -1
  450. package/dist/scripts/sizecheck.js +2 -3
  451. package/dist/scripts/sks-1-11-gate-lib.js +0 -1
  452. package/dist/scripts/sks-1-12-real-execution-check-lib.js +0 -1
  453. package/dist/scripts/sks-1-18-gate-lib.js +0 -1
  454. package/dist/scripts/sks-menubar-install-check.js +0 -3
  455. package/dist/scripts/sksd-daemon-check.js +0 -1
  456. package/dist/scripts/super-search-live-smoke-check.js +0 -1
  457. package/dist/scripts/super-search-local-http-smoke-check.js +0 -1
  458. package/dist/scripts/super-search-offline-contract-check.js +0 -1
  459. package/dist/scripts/super-search-provider-interface-check.js +0 -1
  460. package/dist/scripts/triwiki-cache-key-check.js +0 -1
  461. package/dist/scripts/triwiki-proof-bank-blackbox.js +0 -1
  462. package/dist/scripts/triwiki-proof-bank-check.js +0 -1
  463. package/dist/scripts/triwiki-proof-card-check.js +0 -1
  464. package/dist/scripts/trust-fixture-check.js +0 -1
  465. package/dist/scripts/ultra-router-auto-router-check.js +0 -1
  466. package/dist/scripts/update-fastpath-check.js +0 -1
  467. package/dist/scripts/upgrade-migration-matrix-check.js +0 -1
  468. package/dist/scripts/ux-review-extract-wires-real-extractor-check.js +0 -1
  469. package/dist/scripts/ux-review-imagegen-blackbox-check.js +0 -1
  470. package/dist/scripts/ux-review-patch-diff-recheck-check.js +0 -1
  471. package/dist/scripts/ux-review-real-imagegen-smoke-check.js +0 -1
  472. package/dist/scripts/ux-review-run-wires-imagegen-check.js +0 -1
  473. package/dist/scripts/write-build-manifest.js +0 -1
  474. package/dist/scripts/wrongness-fixture-check.js +0 -1
  475. package/dist/scripts/zellij-capability-check.js +0 -1
  476. package/dist/scripts/zellij-developer-controls-check.js +0 -1
  477. package/dist/scripts/zellij-doctor-readiness-check.js +0 -13
  478. package/dist/scripts/zellij-dynamic-pane-lifecycle-check.js +0 -1
  479. package/dist/scripts/zellij-fake-adapter-check.js +0 -1
  480. package/dist/scripts/zellij-initial-main-only-blackbox.js +0 -1
  481. package/dist/scripts/zellij-lane-renderer-check.js +0 -1
  482. package/dist/scripts/zellij-launch-command-truth-check.js +0 -12
  483. package/dist/scripts/zellij-layout-valid-check.js +0 -1
  484. package/dist/scripts/zellij-pane-creation-lock-metrics-check.js +0 -1
  485. package/dist/scripts/zellij-pane-lock-concurrency-blackbox.js +0 -1
  486. package/dist/scripts/zellij-pane-lock-does-not-block-worker-check.js +0 -1
  487. package/dist/scripts/zellij-pane-lock-open-worker-integration-blackbox.js +0 -1
  488. package/dist/scripts/zellij-pane-proof-check.js +0 -1
  489. package/dist/scripts/zellij-qa-app-handoff-status-check.js +0 -1
  490. package/dist/scripts/zellij-real-session-cleanup-check.js +0 -1
  491. package/dist/scripts/zellij-real-session-launch-check.js +0 -1
  492. package/dist/scripts/zellij-right-column-geometry-proof.js +0 -1
  493. package/dist/scripts/zellij-right-column-headless-overflow-check.js +0 -1
  494. package/dist/scripts/zellij-right-column-manager-check.js +0 -1
  495. package/dist/scripts/zellij-screen-proof-check.js +0 -1
  496. package/dist/scripts/zellij-slot-only-ui-check.js +0 -1
  497. package/dist/scripts/zellij-slot-pane-renderer-check.js +0 -1
  498. package/dist/scripts/zellij-slot-pane-stale-detection-check.js +0 -7
  499. package/dist/scripts/zellij-slot-telemetry-incremental-check.js +0 -1
  500. package/dist/scripts/zellij-slot-telemetry-live-flush-check.js +0 -1
  501. package/dist/scripts/zellij-slot-telemetry-performance-check.js +0 -1
  502. package/dist/scripts/zellij-stacked-capability-routing-check.js +0 -1
  503. package/dist/scripts/zellij-stacked-fallback-integration-blackbox.js +0 -1
  504. package/dist/scripts/zellij-stacked-version-matrix-check.js +0 -1
  505. package/dist/scripts/zellij-stacked-version-parser-check.js +0 -1
  506. package/dist/scripts/zellij-ui-design-check.js +0 -12
  507. package/dist/scripts/zellij-update-prompt-matrix-check.js +0 -1
  508. package/dist/scripts/zellij-update-prompt-mode-check.js +0 -1
  509. package/dist/scripts/zellij-update-prompt-safety-check.js +0 -1
  510. package/dist/scripts/zellij-worker-pane-real-ui-blackbox.js +0 -2
  511. package/package.json +6 -7
  512. package/release-gates.v2.json +426 -93
  513. package/schemas/codex/app-server-0.145/codex_app_server_protocol.v2.schemas.json +19611 -0
  514. package/dist/core/commands/glm-command.js +0 -93
  515. package/dist/core/providers/glm/bench/glm-bench-comparison.js +0 -47
  516. package/dist/core/providers/glm/bench/glm-bench-fixture.js +0 -64
  517. package/dist/core/providers/glm/bench/glm-bench-model-lock-proof.js +0 -52
  518. package/dist/core/providers/glm/bench/glm-bench-report.js +0 -74
  519. package/dist/core/providers/glm/bench/glm-benchmark-runner.js +0 -243
  520. package/dist/core/providers/glm/bench/glm-benchmark-types.js +0 -1
  521. package/dist/core/providers/glm/bench/glm-direct-bench-runner.js +0 -72
  522. package/dist/core/providers/glm/glm-52-profile.js +0 -82
  523. package/dist/core/providers/glm/glm-52-request.js +0 -73
  524. package/dist/core/providers/glm/glm-52-response-guard.js +0 -32
  525. package/dist/core/providers/glm/glm-52-settings.js +0 -67
  526. package/dist/core/providers/glm/glm-context-budget.js +0 -14
  527. package/dist/core/providers/glm/glm-context-cache.js +0 -8
  528. package/dist/core/providers/glm/glm-direct-run.js +0 -140
  529. package/dist/core/providers/glm/glm-interactive-launch.js +0 -4
  530. package/dist/core/providers/glm/glm-latency-trace.js +0 -39
  531. package/dist/core/providers/glm/glm-loop-guard.js +0 -30
  532. package/dist/core/providers/glm/glm-mad-launch.js +0 -128
  533. package/dist/core/providers/glm/glm-mad-mode.js +0 -269
  534. package/dist/core/providers/glm/glm-model-meta-cache.js +0 -18
  535. package/dist/core/providers/glm/glm-patch-apply.js +0 -72
  536. package/dist/core/providers/glm/glm-patch-parser.js +0 -18
  537. package/dist/core/providers/glm/glm-profile-resolver.js +0 -168
  538. package/dist/core/providers/glm/glm-readiness.js +0 -4
  539. package/dist/core/providers/glm/glm-reasoning-policy.js +0 -14
  540. package/dist/core/providers/glm/glm-run-controller.js +0 -65
  541. package/dist/core/providers/glm/glm-run-state.js +0 -10
  542. package/dist/core/providers/glm/glm-run-timeout.js +0 -30
  543. package/dist/core/providers/glm/glm-speed-context.js +0 -81
  544. package/dist/core/providers/glm/glm-speed-gate.js +0 -39
  545. package/dist/core/providers/glm/glm-speed-output-parser.js +0 -39
  546. package/dist/core/providers/glm/glm-tool-schema-cache.js +0 -18
  547. package/dist/core/providers/glm/naruto/glm-naruto-apply-transaction.js +0 -135
  548. package/dist/core/providers/glm/naruto/glm-naruto-artifacts.js +0 -1
  549. package/dist/core/providers/glm/naruto/glm-naruto-bench.js +0 -6
  550. package/dist/core/providers/glm/naruto/glm-naruto-budget.js +0 -44
  551. package/dist/core/providers/glm/naruto/glm-naruto-combined-patch.js +0 -48
  552. package/dist/core/providers/glm/naruto/glm-naruto-command.js +0 -101
  553. package/dist/core/providers/glm/naruto/glm-naruto-concurrency-governor.js +0 -37
  554. package/dist/core/providers/glm/naruto/glm-naruto-conflict-graph.js +0 -79
  555. package/dist/core/providers/glm/naruto/glm-naruto-critical-path.js +0 -50
  556. package/dist/core/providers/glm/naruto/glm-naruto-decomposer.js +0 -148
  557. package/dist/core/providers/glm/naruto/glm-naruto-file-lease.js +0 -22
  558. package/dist/core/providers/glm/naruto/glm-naruto-final-seal.js +0 -81
  559. package/dist/core/providers/glm/naruto/glm-naruto-finalizer.js +0 -22
  560. package/dist/core/providers/glm/naruto/glm-naruto-hunk-conflict.js +0 -15
  561. package/dist/core/providers/glm/naruto/glm-naruto-hunk-parser.js +0 -35
  562. package/dist/core/providers/glm/naruto/glm-naruto-isolation-policy.js +0 -37
  563. package/dist/core/providers/glm/naruto/glm-naruto-judge.js +0 -83
  564. package/dist/core/providers/glm/naruto/glm-naruto-merge-planner.js +0 -61
  565. package/dist/core/providers/glm/naruto/glm-naruto-metrics.js +0 -33
  566. package/dist/core/providers/glm/naruto/glm-naruto-orchestrator.js +0 -486
  567. package/dist/core/providers/glm/naruto/glm-naruto-parallelism-summary.js +0 -54
  568. package/dist/core/providers/glm/naruto/glm-naruto-patch-candidate-gate.js +0 -41
  569. package/dist/core/providers/glm/naruto/glm-naruto-patch-candidate-parser.js +0 -61
  570. package/dist/core/providers/glm/naruto/glm-naruto-patch-envelope.js +0 -54
  571. package/dist/core/providers/glm/naruto/glm-naruto-quorum.js +0 -36
  572. package/dist/core/providers/glm/naruto/glm-naruto-rate-limiter.js +0 -17
  573. package/dist/core/providers/glm/naruto/glm-naruto-repair-wave.js +0 -20
  574. package/dist/core/providers/glm/naruto/glm-naruto-requirement-coverage.js +0 -108
  575. package/dist/core/providers/glm/naruto/glm-naruto-requirement-ledger.js +0 -57
  576. package/dist/core/providers/glm/naruto/glm-naruto-scoreboard.js +0 -74
  577. package/dist/core/providers/glm/naruto/glm-naruto-secret-audit.js +0 -90
  578. package/dist/core/providers/glm/naruto/glm-naruto-session-id.js +0 -9
  579. package/dist/core/providers/glm/naruto/glm-naruto-shard-planner.js +0 -31
  580. package/dist/core/providers/glm/naruto/glm-naruto-stage-scheduler.js +0 -84
  581. package/dist/core/providers/glm/naruto/glm-naruto-targeted-checks.js +0 -75
  582. package/dist/core/providers/glm/naruto/glm-naruto-task-size-classifier.js +0 -11
  583. package/dist/core/providers/glm/naruto/glm-naruto-terminal.js +0 -43
  584. package/dist/core/providers/glm/naruto/glm-naruto-trace.js +0 -173
  585. package/dist/core/providers/glm/naruto/glm-naruto-types.js +0 -36
  586. package/dist/core/providers/glm/naruto/glm-naruto-usage-extractor.js +0 -30
  587. package/dist/core/providers/glm/naruto/glm-naruto-verifier-output.js +0 -30
  588. package/dist/core/providers/glm/naruto/glm-naruto-work-graph.js +0 -1
  589. package/dist/core/providers/glm/naruto/glm-naruto-worker-artifacts.js +0 -55
  590. package/dist/core/providers/glm/naruto/glm-naruto-worker-pool.js +0 -275
  591. package/dist/core/providers/glm/naruto/glm-naruto-worker-runtime.js +0 -421
  592. package/dist/core/providers/glm/naruto/glm-naruto-worker-scheduler.js +0 -177
  593. package/dist/core/providers/glm/naruto/glm-naruto-worker.js +0 -1
  594. package/dist/core/providers/glm/naruto/glm-naruto-worktree-cleanup.js +0 -19
  595. package/dist/core/providers/glm/naruto/glm-naruto-worktree-manager.js +0 -71
  596. package/dist/core/providers/glm/naruto/glm-naruto-worktree-worker.js +0 -73
  597. package/dist/core/providers/glm/naruto/glm-naruto-worktree.js +0 -62
  598. package/schemas/codex/app-server-0.144/codex_app_server_protocol.v2.schemas.json +0 -1
@@ -93,6 +93,7 @@ export async function inspectLaunchdService(env = process.env) {
93
93
  }
94
94
  export async function restartLaunchAgent(paths, env) {
95
95
  const launchctl = env.SKS_MENUBAR_LAUNCHCTL || await which('launchctl').catch(() => null) || '/bin/launchctl';
96
+ const open = env.SKS_MENUBAR_OPEN || await which('open').catch(() => null) || '/usr/bin/open';
96
97
  const service = launchServiceName();
97
98
  const result = await runProcess(launchctl, ['kickstart', '-k', service], {
98
99
  timeoutMs: timeoutFromEnv(env, 'SKS_MENUBAR_KICKSTART_TIMEOUT_MS', 5_000),
@@ -108,11 +109,46 @@ export async function restartLaunchAgent(paths, env) {
108
109
  print_code: probe.code,
109
110
  verified_running_after_timeout: result.timedOut && probe.running,
110
111
  terminal_uncertain: terminalUncertain,
112
+ recovered_via_bootstrap: false,
111
113
  error: probe.running ? null : probe.error || (result.timedOut ? 'launchctl_kickstart_timed_out' : 'launchctl_kickstart_not_running'),
112
114
  paths
113
115
  };
114
116
  }
115
- return { ok: false, code: result.code, timed_out: false, print_code: null, verified_running_after_timeout: false, terminal_uncertain: false, error: String(result.stderr || result.stdout).trim(), paths };
117
+ const kickstartError = String(result.stderr || result.stdout).trim();
118
+ if (await exists(paths.launch_agent_path) && await exists(paths.executable_path) && isUnloadableLaunchdKickstartError(kickstartError)) {
119
+ const launch = await launchMenuBar({ launchctl, open, paths, env });
120
+ return {
121
+ ok: launch.ok,
122
+ code: launch.kickstart_code ?? launch.bootstrap_code ?? result.code,
123
+ timed_out: Boolean(launch.kickstart_timed_out || launch.bootstrap_timed_out),
124
+ print_code: launch.print_code ?? null,
125
+ verified_running_after_timeout: Boolean(launch.verified_running_after_timeout),
126
+ terminal_uncertain: Boolean(launch.terminal_uncertain),
127
+ recovered_via_bootstrap: true,
128
+ error: launch.error ?? (launch.ok ? null : kickstartError),
129
+ paths
130
+ };
131
+ }
132
+ return {
133
+ ok: false,
134
+ code: result.code,
135
+ timed_out: false,
136
+ print_code: null,
137
+ verified_running_after_timeout: false,
138
+ terminal_uncertain: false,
139
+ recovered_via_bootstrap: false,
140
+ error: kickstartError,
141
+ paths
142
+ };
143
+ }
144
+ export function isUnloadableLaunchdKickstartError(text) {
145
+ const normalized = String(text || '').toLowerCase();
146
+ return normalized.includes('could not find service')
147
+ || normalized.includes('could not kickstart service')
148
+ || /\bbad request\b/.test(normalized)
149
+ || normalized.includes('operation not permitted')
150
+ || normalized.includes('no such process')
151
+ || normalized.includes('input/output error');
116
152
  }
117
153
  export async function removeLaunchAgent(paths, env) {
118
154
  const actions = [];
@@ -0,0 +1,152 @@
1
+ import path from 'node:path';
2
+ import os from 'node:os';
3
+ import { ensureDir, readText, nowIso } from '../fsx.js';
4
+ import { resolveOpenRouterApiKey } from '../providers/openrouter/openrouter-secret-store.js';
5
+ import { OPENROUTER_DEFAULT_MODEL, OPENROUTER_PROVIDER_ID, normalizeOpenRouterModelId } from './openrouter-provider.js';
6
+ import { installCodexAppGlmProfile } from './glm-profile-installer.js';
7
+ import { restartCodexApp } from './codex-app-restart.js';
8
+ import { codexLbConfigPath, ensureGlobalCodexAppGlmProfile, unselectCodexLbProvider } from '../../cli/install-helpers.js';
9
+ import { ensureTrailingNewline, safeWriteCodexConfigToml, upsertTopLevelTomlString } from '../codex-runtime/codex-desktop-config-policy.js';
10
+ function topLevelTomlString(text, key) {
11
+ const match = String(text || '').match(new RegExp(`(?:^|\\n)${key}\\s*=\\s*\"([^\"]*)\"`));
12
+ return match?.[1] ?? null;
13
+ }
14
+ export async function openRouterStatus(input = {}) {
15
+ const home = input.home || process.env.HOME || os.homedir();
16
+ const configPath = input.configPath || codexLbConfigPath(home);
17
+ const config = await readText(configPath, '');
18
+ const key = await resolveOpenRouterApiKey({ env: input.env || process.env });
19
+ const providerPresent = new RegExp(`\\[model_providers\\.${OPENROUTER_PROVIDER_ID}\\]`).test(config);
20
+ const selected = topLevelTomlString(config, 'model_provider') === OPENROUTER_PROVIDER_ID;
21
+ const model = topLevelTomlString(config, 'model');
22
+ const blockers = [];
23
+ if (!key.key)
24
+ blockers.push('openrouter_key_missing');
25
+ if (!providerPresent)
26
+ blockers.push('openrouter_provider_missing');
27
+ return {
28
+ schema: 'sks.codex-app-openrouter-status.v1',
29
+ ok: blockers.length === 0 && (selected ? Boolean(model) : true),
30
+ key_present: Boolean(key.key),
31
+ key_source: key.source || null,
32
+ provider_present: providerPresent,
33
+ selected,
34
+ model: model || (selected ? OPENROUTER_DEFAULT_MODEL : null),
35
+ model_source: model ? 'config' : selected ? 'default' : null,
36
+ config_path: configPath,
37
+ blockers,
38
+ warnings: []
39
+ };
40
+ }
41
+ export async function useOpenRouter(input) {
42
+ const model = normalizeOpenRouterModelId(input.model || OPENROUTER_DEFAULT_MODEL);
43
+ if (!model) {
44
+ return {
45
+ schema: 'sks.codex-app-use-openrouter.v1',
46
+ generated_at: nowIso(),
47
+ ok: false,
48
+ status: 'blocked',
49
+ mode: 'openrouter',
50
+ blockers: ['openrouter_model_invalid'],
51
+ warnings: [],
52
+ hint: 'Pass --model <openrouter-model-id>, for example z-ai/glm-5.2'
53
+ };
54
+ }
55
+ const home = input.home || process.env.HOME || os.homedir();
56
+ const configPath = input.configPath || codexLbConfigPath(home);
57
+ const env = input.env || process.env;
58
+ await ensureDir(path.dirname(configPath));
59
+ const key = await resolveOpenRouterApiKey({ env });
60
+ if (!key.key) {
61
+ return {
62
+ schema: 'sks.codex-app-use-openrouter.v1',
63
+ generated_at: nowIso(),
64
+ ok: false,
65
+ status: 'blocked',
66
+ mode: 'openrouter',
67
+ model,
68
+ blockers: ['openrouter_key_missing'],
69
+ warnings: [],
70
+ hint: 'Save a key first: sks codex-app set-openrouter-key --api-key-stdin'
71
+ };
72
+ }
73
+ const profile = await installCodexAppGlmProfile({
74
+ root: input.root,
75
+ apply: true,
76
+ home,
77
+ env,
78
+ configPath
79
+ });
80
+ if (!profile.ok) {
81
+ return {
82
+ schema: 'sks.codex-app-use-openrouter.v1',
83
+ generated_at: nowIso(),
84
+ ok: false,
85
+ status: 'blocked',
86
+ mode: 'openrouter',
87
+ model,
88
+ profile,
89
+ blockers: profile.blockers,
90
+ warnings: profile.warnings || []
91
+ };
92
+ }
93
+ const unselect = await unselectCodexLbProvider({
94
+ home,
95
+ configPath,
96
+ allowActiveSharedAuthTransition: true
97
+ }).catch((err) => ({ ok: false, status: 'failed', provider_error: err?.message || String(err) }));
98
+ const current = await readText(configPath, '');
99
+ let next = upsertTopLevelTomlString(current, 'model_provider', OPENROUTER_PROVIDER_ID);
100
+ next = upsertTopLevelTomlString(next, 'model', model);
101
+ next = ensureTrailingNewline(next);
102
+ const write = await safeWriteCodexConfigToml(configPath, current, next, 'openrouter-use');
103
+ if (!write.ok) {
104
+ return {
105
+ schema: 'sks.codex-app-use-openrouter.v1',
106
+ generated_at: nowIso(),
107
+ ok: false,
108
+ status: 'blocked',
109
+ mode: 'openrouter',
110
+ model,
111
+ write,
112
+ unselect,
113
+ blockers: [String(write.status || 'openrouter_config_write_blocked')],
114
+ warnings: []
115
+ };
116
+ }
117
+ const restart = await restartCodexApp({ enabled: Boolean(input.restartApp) });
118
+ const status = await openRouterStatus({ home, configPath, env });
119
+ const ok = Boolean(status.selected && status.key_present && status.provider_present && status.model === model && restart.ok);
120
+ return {
121
+ schema: 'sks.codex-app-use-openrouter.v1',
122
+ generated_at: nowIso(),
123
+ ok,
124
+ status: ok ? 'active' : 'activation_incomplete',
125
+ mode: 'openrouter',
126
+ model,
127
+ profile,
128
+ unselect,
129
+ write,
130
+ restart_app: restart,
131
+ openrouter: status,
132
+ readiness: {
133
+ selected: status.selected,
134
+ key_present: status.key_present,
135
+ provider_present: status.provider_present,
136
+ model: status.model,
137
+ ok
138
+ },
139
+ blockers: [
140
+ ...(status.selected ? [] : ['openrouter_not_selected']),
141
+ ...(status.model === model ? [] : ['openrouter_model_not_applied']),
142
+ ...(restart.ok ? [] : (restart.blockers || ['openrouter_restart_blocked']))
143
+ ],
144
+ warnings: [
145
+ ...(unselect?.ok === false ? [`codex_lb_unselect:${unselect.provider_error || unselect.status}`] : []),
146
+ ...(profile.warnings || [])
147
+ ]
148
+ };
149
+ }
150
+ export async function ensureOpenRouterProviderInstalled(opts = {}) {
151
+ return ensureGlobalCodexAppGlmProfile(opts);
152
+ }
@@ -0,0 +1,82 @@
1
+ export const OPENROUTER_PROVIDER_ID = 'openrouter';
2
+ export const OPENROUTER_DEFAULT_MODEL = 'z-ai/glm-5.2';
3
+ export const OPENROUTER_DEFAULT_PROFILE_ID = 'sks-openrouter-default';
4
+ export const OPENROUTER_DEFAULT_PROFILE_LABEL = 'OpenRouter (SKS)';
5
+ export const GLM_52_OPENROUTER_MODEL = OPENROUTER_DEFAULT_MODEL;
6
+ export const GLM_CODEX_CONFIG_PROVIDER_ID = OPENROUTER_PROVIDER_ID;
7
+ export const GLM_CODEX_CONFIG_PROFILE_ID = 'sks-glm-52-mad';
8
+ export const GLM_CODEX_APP_PROFILE_ID = 'sks/glm-5.2-mad';
9
+ export const GLM_CODEX_APP_PROFILE_LABEL = 'GLM 5.2 (OpenRouter)';
10
+ export const RETIRED_GLM_DESKTOP_CONFIG_PROFILE_IDS = [
11
+ 'sks-glm-52-mad',
12
+ 'sks-glm-52-minimal',
13
+ 'sks-glm-52-low',
14
+ 'sks-glm-52-medium',
15
+ 'sks-glm-52-high',
16
+ 'sks-glm-52-xhigh'
17
+ ];
18
+ export const OPENROUTER_SELECTABLE_REASONING_EFFORTS = [
19
+ 'none',
20
+ 'minimal',
21
+ 'low',
22
+ 'medium',
23
+ 'high',
24
+ 'xhigh',
25
+ ];
26
+ export const GLM_CODEX_SELECTABLE_REASONING_EFFORTS = OPENROUTER_SELECTABLE_REASONING_EFFORTS;
27
+ export const OPENROUTER_CODEX_REASONING_PROFILES = [];
28
+ export const GLM_CODEX_CONFIG_REASONING_PROFILES = OPENROUTER_CODEX_REASONING_PROFILES;
29
+ export function buildGlmCodexAppModelProfile() {
30
+ return {
31
+ schema: 'sks.codex-app-model-profile.v1',
32
+ id: OPENROUTER_DEFAULT_PROFILE_ID,
33
+ label: OPENROUTER_DEFAULT_PROFILE_LABEL,
34
+ provider: 'openrouter',
35
+ model: OPENROUTER_DEFAULT_MODEL,
36
+ codexConfigProvider: OPENROUTER_PROVIDER_ID,
37
+ codexConfigProfile: OPENROUTER_DEFAULT_PROFILE_ID,
38
+ supportedReasoningEfforts: OPENROUTER_SELECTABLE_REASONING_EFFORTS,
39
+ reasoningProfiles: OPENROUTER_CODEX_REASONING_PROFILES,
40
+ mode: 'openrouter-desktop',
41
+ strictModelLock: false,
42
+ gptFallbackAllowed: false,
43
+ requiresSecret: 'openrouter-api-key',
44
+ defaultProfile: 'speed',
45
+ defaultSettings: {
46
+ temperature: 0.2,
47
+ top_p: 0.85,
48
+ reasoning_effort: null,
49
+ tool_choice: 'none',
50
+ parallel_tool_calls: false,
51
+ max_tokens: 4096,
52
+ provider_sort: 'throughput',
53
+ provider_allow_fallbacks: false,
54
+ provider_require_parameters: false,
55
+ },
56
+ codexCompatibility: {
57
+ target: 'rust-v0.145.0',
58
+ selectedExecutorPluginMcp: 'defer-to-codex-native',
59
+ duplicateAppMcpDeclarations: 'dedupe-by-codex',
60
+ cwdShellPathSemantics: 'preserve-codex-native',
61
+ },
62
+ };
63
+ }
64
+ export function normalizeOpenRouterModelId(value) {
65
+ const model = String(value || '').trim();
66
+ if (!model)
67
+ return null;
68
+ if (model.length > 200)
69
+ return null;
70
+ if (!/^[A-Za-z0-9][A-Za-z0-9._:/-]*$/.test(model))
71
+ return null;
72
+ return model;
73
+ }
74
+ export function retiredGlmDesktopProfileBody(effort) {
75
+ return [
76
+ 'model_provider = "openrouter"',
77
+ `model = "${OPENROUTER_DEFAULT_MODEL}"`,
78
+ `model_reasoning_effort = "${effort}"`,
79
+ 'service_tier = "default"',
80
+ 'approval_policy = "on-request"'
81
+ ].join('\n');
82
+ }
@@ -1,2 +1 @@
1
- /** Compatibility facade retained for the 6.3 release. */
2
1
  export * from './menubar/index.js';
@@ -6,8 +6,7 @@ import { EMPTY_CODEX_INFO, getCodexInfo } from './codex-adapter.js';
6
6
  import { CODEX_CHROME_EXTENSION_DOC_URL, DEFAULT_CODEX_APP_PLUGINS as DEFAULT_CODEX_APP_PLUGIN_TUPLES, RESERVED_CODEX_PLUGIN_SKILL_NAMES } from './routes.js';
7
7
  import { PRODUCT_DESIGN_PLUGIN, normalizeProductDesignPluginEvidence } from './product-design-plugin.js';
8
8
  import { PRODUCT_DESIGN_AUTO_INSTALL_ENV, ensureProductDesignPluginInstalled, productDesignAutoInstallRequested } from './product-design-app-server.js';
9
- import { GLM_CODEX_CONFIG_PROVIDER_ID, GLM_CODEX_CONFIG_REASONING_PROFILES } from './codex-app/glm-model-profile.js';
10
- import { GLM_52_OPENROUTER_MODEL } from './providers/glm/glm-52-settings.js';
9
+ import { GLM_CODEX_CONFIG_PROVIDER_ID, GLM_52_OPENROUTER_MODEL, RETIRED_GLM_DESKTOP_CONFIG_PROFILE_IDS } from './codex-app/openrouter-provider.js';
11
10
  import { resolveOpenRouterApiKey } from './providers/openrouter/openrouter-secret-store.js';
12
11
  import { codexLbEnvPath, loadCodexLbEnv, parseShellEnvValue, readCodexLbModelCatalog } from './codex-lb/codex-lb-env.js';
13
12
  import { codexLbToolCatalogPath, inspectCodexLbToolCatalog } from './codex-lb/codex-lb-tool-catalog.js';
@@ -543,14 +542,14 @@ export function codexAppGuidance({ appInstalled, codex, mcpList, featureList, re
543
542
  lines.push('Run: sks doctor --fix');
544
543
  }
545
544
  if (providerModelUi?.glm?.exposed && providerModelUi.glm.openrouter_key_present) {
546
- lines.push(`GLM model selector profile is exposed: ${providerModelUi.glm.model} via profiles ${providerModelUi.glm.profiles_present.join(', ')}.`);
545
+ lines.push(`OpenRouter provider is ready: ${providerModelUi.glm.model} (activate with ${providerModelUi.glm.install_command}).`);
547
546
  }
548
547
  else if (providerModelUi?.glm?.exposed) {
549
- lines.push(`GLM model selector profile is exposed for ${providerModelUi.glm.model}, but the OpenRouter key is missing.`);
548
+ lines.push(`OpenRouter provider is present for ${providerModelUi.glm.model}, but the OpenRouter key is missing.`);
550
549
  lines.push(`Run: ${providerModelUi.glm.key_command}; restart Codex App if the model picker was already open.`);
551
550
  }
552
551
  else if (providerModelUi?.glm) {
553
- lines.push(`GLM model selector profile is not exposed yet: ${providerModelUi.glm.blockers.join(', ') || 'profile setup required'}.`);
552
+ lines.push(`OpenRouter provider is not ready yet: ${providerModelUi.glm.blockers.join(', ') || 'provider setup required'}.`);
554
553
  lines.push(`Run: ${providerModelUi.glm.key_command}; then ${providerModelUi.glm.install_command}; restart Codex App if the model picker was already open.`);
555
554
  }
556
555
  if (providerModelUi?.codex_lb?.key_entry_visible && providerModelUi.codex_lb.key_present && providerModelUi.codex_lb.provider_present && providerModelUi.codex_lb.provider_contract_ok && providerModelUi.codex_lb.base_url_present) {
@@ -874,7 +873,6 @@ async function codexFastModeConfigStatus(opts = {}) {
874
873
  const line = lines[index] || '';
875
874
  if (!/^\s*model_reasoning_effort\s*=/.test(line))
876
875
  continue;
877
- // Preserve unmarked user reasoning choices. Only SKS-provenanced locks hide Fast UI.
878
876
  if (config.scope === 'global' ? isSksOwnedGlobalUiLock(lines, index) : true) {
879
877
  blockers.push(`${config.scope}:top_level_model_reasoning_effort`);
880
878
  }
@@ -882,9 +880,6 @@ async function codexFastModeConfigStatus(opts = {}) {
882
880
  if (/(^|\n)\s*fast_default_opt_out\s*=\s*true\s*(?:#.*)?(?=\n|$)/.test(tomlTable(config.text, 'notice')))
883
881
  blockers.push(`${config.scope}:fast_default_opt_out`);
884
882
  }
885
- // 2026-07 renewal: [user.fast_mode] left the config schema. Its PRESENCE is now
886
- // the defect (a stale legacy stamp), not its absence — the old visible/enabled
887
- // "missing" blockers inverted into a single legacy-residue blocker.
888
883
  const merged = configs.map((config) => config.text).join('\n');
889
884
  if (tomlTable(merged, 'user.fast_mode').trim())
890
885
  blockers.push('user.fast_mode.legacy_table_present');
@@ -933,20 +928,12 @@ export async function codexProviderModelUiStatus(opts = {}) {
933
928
  const profilesPresent = [];
934
929
  const profilesMissing = [];
935
930
  const glmProfileBlockers = [];
936
- for (const profile of GLM_CODEX_CONFIG_REASONING_PROFILES) {
937
- const body = tomlTableAny(configText, [`profiles.${profile.id}`, `profiles."${profile.id}"`]);
938
- if (!body) {
939
- profilesMissing.push(profile.id);
940
- glmProfileBlockers.push(`glm_profile_missing:${profile.id}`);
931
+ for (const profileId of RETIRED_GLM_DESKTOP_CONFIG_PROFILE_IDS) {
932
+ const body = tomlTableAny(configText, [`profiles.${profileId}`, `profiles."${profileId}"`]);
933
+ if (!body)
941
934
  continue;
942
- }
943
- profilesPresent.push(profile.id);
944
- if (!hasTomlString(body, 'model_provider', GLM_CODEX_CONFIG_PROVIDER_ID))
945
- glmProfileBlockers.push(`glm_profile_provider_invalid:${profile.id}`);
946
- if (!hasTomlString(body, 'model', GLM_52_OPENROUTER_MODEL))
947
- glmProfileBlockers.push(`glm_profile_model_invalid:${profile.id}`);
948
- if (!hasTomlString(body, 'model_reasoning_effort', profile.reasoning_effort))
949
- glmProfileBlockers.push(`glm_profile_reasoning_invalid:${profile.id}`);
935
+ profilesPresent.push(profileId);
936
+ glmProfileBlockers.push(`retired_glm_desktop_profile_present:${profileId}`);
950
937
  }
951
938
  const codexLbProvider = tomlTableAny(configText, ['model_providers.codex-lb', 'model_providers."codex-lb"']);
952
939
  const codexLbProviderPresent = Boolean(codexLbProvider);
@@ -970,8 +957,6 @@ export async function codexProviderModelUiStatus(opts = {}) {
970
957
  const loadedEnv = await loadCodexLbEnv({ home, envPath: codexLbEnvFilePath }).catch(() => null);
971
958
  liveCatalog = loadedEnv ? await readCodexLbModelCatalog({ loadedEnv }).catch(() => null) : null;
972
959
  }
973
- // Prefer the persisted Codex-owned catalog that Desktop actually loads. Live
974
- // /models remains freshness telemetry and a fallback when no managed file exists.
975
960
  const codexLbModelCatalog = opts.codexLbModelCatalog || (persistedCatalog?.ok
976
961
  ? {
977
962
  ok: true,
@@ -1015,14 +1000,11 @@ export async function codexProviderModelUiStatus(opts = {}) {
1015
1000
  ? glmBlockers
1016
1001
  : [...glmBlockers, ...codexLbBlockers];
1017
1002
  const keyCommand = 'sks codex-app set-openrouter-key --api-key-stdin';
1018
- const installCommand = 'sks codex-app glm-profile install';
1003
+ const installCommand = 'sks codex-app use-openrouter --model z-ai/glm-5.2';
1019
1004
  const setupCommand = 'sks codex-lb setup --host <domain> --api-key-stdin --yes';
1020
1005
  const setKeyCommand = 'sks codex-lb set-key --api-key-stdin';
1021
1006
  return {
1022
1007
  schema: 'sks.codex-app-provider-model-ui.v1',
1023
- // The top-level readiness contract is intentionally scoped to the active
1024
- // provider. Optional GLM/OpenRouter and codex-lb setup diagnostics remain
1025
- // visible below without making an unrelated provider selection fail.
1026
1008
  ok: selectedProviderBlockers.length === 0,
1027
1009
  selected_provider_ok: selectedProviderBlockers.length === 0,
1028
1010
  selected_provider: codexLbSelectedDefault ? 'codex-lb' : 'oauth',
@@ -1039,7 +1021,7 @@ export async function codexProviderModelUiStatus(opts = {}) {
1039
1021
  codex_lb_env: codexLbEnvFilePath
1040
1022
  },
1041
1023
  glm: {
1042
- exposed: glmProviderPresent && profilesMissing.length === 0 && glmProfileBlockers.length === 0,
1024
+ exposed: glmProviderPresent && glmProfileBlockers.length === 0,
1043
1025
  provider_present: glmProviderPresent,
1044
1026
  provider: GLM_CODEX_CONFIG_PROVIDER_ID,
1045
1027
  model: GLM_52_OPENROUTER_MODEL,
@@ -1050,7 +1032,7 @@ export async function codexProviderModelUiStatus(opts = {}) {
1050
1032
  openrouter_key_preview: openRouterKey.key_preview || null,
1051
1033
  key_command: keyCommand,
1052
1034
  install_command: installCommand,
1053
- doctor_command: 'sks codex-app glm-profile doctor',
1035
+ doctor_command: 'sks codex-app openrouter-status',
1054
1036
  blockers: glmBlockers
1055
1037
  },
1056
1038
  codex_lb: {
@@ -1170,9 +1152,9 @@ function glmModelUiSummary(status = {}) {
1170
1152
  return 'not checked';
1171
1153
  if (status.exposed) {
1172
1154
  const key = status.openrouter_key_present ? `key ${status.openrouter_key_source || 'present'}` : 'key missing';
1173
- return `ok ${status.model} (${status.profiles_present?.length || 0} profiles, ${key})`;
1155
+ return `ok ${status.model} (${key})`;
1174
1156
  }
1175
- return `setup ${(status.blockers || []).join(', ') || 'profile missing'}; run ${status.key_command || 'sks codex-app set-openrouter-key --api-key-stdin'}`;
1157
+ return `setup ${(status.blockers || []).join(', ') || 'provider missing'}; run ${status.key_command || 'sks codex-app set-openrouter-key --api-key-stdin'}`;
1176
1158
  }
1177
1159
  function codexLbKeyUiSummary(status = {}) {
1178
1160
  if (!status)
@@ -0,0 +1,208 @@
1
+ import { runProcess } from '../fsx.js';
2
+ import { CURRENT_CODEX_RELEASE_MANIFEST, NARUTO_REQUIRED_CODEX_VERSION } from './codex-release-manifest.js';
3
+ import { compareSemverLike, parseCodexVersionText } from './codex-version-policy.js';
4
+ export const CODEX_CAPABILITY_MATRIX_SCHEMA = 'sks.codex-capability-matrix.v1';
5
+ export const SKS_CODEX_CAPABILITY_IDS = [
6
+ 'multi_agent_v2',
7
+ 'agents_max_concurrent_threads_per_session',
8
+ 'thread_list_search_read',
9
+ 'mcp_startup_tool_timeouts',
10
+ 'gpt56_terra_luna_sol_routing',
11
+ 'exec_mcp_transient_recovery',
12
+ 'rollout_token_budget'
13
+ ];
14
+ const UPDATE_CTA = 'Update Codex CLI to the preferred latest: `sks codex update` or Menu Bar / SKS Center → Update Codex CLI Now.';
15
+ export function preferredCodexCliVersion() {
16
+ return CURRENT_CODEX_RELEASE_MANIFEST.preferredCliVersion || CURRENT_CODEX_RELEASE_MANIFEST.requiredCliVersion;
17
+ }
18
+ export function softMinimumCodexCliVersion() {
19
+ return CURRENT_CODEX_RELEASE_MANIFEST.minimumSupportedVersion;
20
+ }
21
+ export function narutoCodexFloorVersion() {
22
+ return NARUTO_REQUIRED_CODEX_VERSION;
23
+ }
24
+ export function buildCodexCapabilityMatrix(input = {}) {
25
+ const detected = parseCodexVersionText(input.version) || null;
26
+ const help = String(input.helpText || '');
27
+ const config = String(input.configText || '');
28
+ const schema = String(input.schemaText || '');
29
+ const policies = CURRENT_CODEX_RELEASE_MANIFEST.featurePolicies;
30
+ const warnings = [];
31
+ if (detected && compareSemverLike(detected, preferredCodexCliVersion()) < 0) {
32
+ warnings.push(`detected Codex ${detected} is below preferred ${preferredCodexCliVersion()}; prefer latest via SKS update inducement`);
33
+ }
34
+ const multiAgentV2 = resolveMultiAgentV2({ detected, help, config, schema });
35
+ const agentsConcurrency = resolveAgentsConcurrency({ help, config, multiAgentV2: multiAgentV2.available });
36
+ const threadList = resolveBooleanCapability({
37
+ id: 'thread_list_search_read',
38
+ policy: policies.threadListSearchRead || 'probe',
39
+ markers: [/thread\/list/, /searchTerm/, /ThreadSearchResult/],
40
+ sources: [schema, help]
41
+ });
42
+ const mcpTimeouts = resolveBooleanCapability({
43
+ id: 'mcp_startup_tool_timeouts',
44
+ policy: policies.mcpStartupToolTimeouts || 'wrap',
45
+ markers: [/startup_timeout_sec/, /tool_timeout_sec/],
46
+ sources: [help, config],
47
+ forceAvailable: true
48
+ });
49
+ const gpt56 = resolveBooleanCapability({
50
+ id: 'gpt56_terra_luna_sol_routing',
51
+ policy: policies.gpt56TerraLunaSolRouting || 'delegate',
52
+ markers: [/gpt-5\.6-(?:luna|terra|sol)/],
53
+ sources: [help, config],
54
+ forceAvailable: Boolean(detected)
55
+ });
56
+ const execMcp = resolveBooleanCapability({
57
+ id: 'exec_mcp_transient_recovery',
58
+ policy: policies.execMcpTransientRecovery || 'probe',
59
+ markers: [/mcp.*reconnect|transient|exec_mcp/i],
60
+ sources: [help, schema]
61
+ });
62
+ const rollout = resolveBooleanCapability({
63
+ id: 'rollout_token_budget',
64
+ policy: policies.rolloutTokenBudget || 'probe',
65
+ markers: [/token.?budget|rollout/i],
66
+ sources: [help, schema]
67
+ });
68
+ return {
69
+ schema: CODEX_CAPABILITY_MATRIX_SCHEMA,
70
+ preferred_cli_version: preferredCodexCliVersion(),
71
+ minimum_supported_version: softMinimumCodexCliVersion(),
72
+ detected_version: detected,
73
+ capabilities: {
74
+ multi_agent_v2: multiAgentV2,
75
+ agents_max_concurrent_threads_per_session: agentsConcurrency,
76
+ thread_list_search_read: threadList,
77
+ mcp_startup_tool_timeouts: mcpTimeouts,
78
+ gpt56_terra_luna_sol_routing: gpt56,
79
+ exec_mcp_transient_recovery: execMcp,
80
+ rollout_token_budget: rollout
81
+ },
82
+ warnings
83
+ };
84
+ }
85
+ export function assertNarutoMultiAgentV2Capability(matrix) {
86
+ const state = matrix.capabilities.multi_agent_v2;
87
+ if (state.available) {
88
+ return { ok: true, blockers: [], guidance: [] };
89
+ }
90
+ return {
91
+ ok: false,
92
+ blockers: [
93
+ 'naruto_requires_multi_agent_v2',
94
+ ...(state.blockers.length ? state.blockers : ['multi_agent_v2_unavailable']),
95
+ 'update_codex_cli'
96
+ ],
97
+ guidance: [
98
+ UPDATE_CTA,
99
+ `Naruto needs Codex multi-agent V2 (preferred ${preferredCodexCliVersion()}+; capability floor ${narutoCodexFloorVersion()}+ when present).`
100
+ ]
101
+ };
102
+ }
103
+ export async function probeCodexHelpText(input) {
104
+ const result = await runProcess(input.codexBin, ['--help'], {
105
+ ...(input.env ? { env: input.env } : {}),
106
+ timeoutMs: input.timeoutMs ?? 5_000,
107
+ maxOutputBytes: 256 * 1024
108
+ }).catch(() => null);
109
+ if (!result || result.code !== 0)
110
+ return '';
111
+ return `${result.stdout || ''}${result.stderr || ''}`;
112
+ }
113
+ export async function probeNarutoCodexCapability(input) {
114
+ const helpText = await probeCodexHelpText({
115
+ codexBin: input.codexBin,
116
+ ...(input.env ? { env: input.env } : {})
117
+ });
118
+ const matrix = buildCodexCapabilityMatrix({
119
+ ...(input.version !== undefined ? { version: input.version } : {}),
120
+ helpText
121
+ });
122
+ return { matrix, naruto: assertNarutoMultiAgentV2Capability(matrix) };
123
+ }
124
+ function resolveMultiAgentV2(input) {
125
+ const policy = CURRENT_CODEX_RELEASE_MANIFEST.featurePolicies.multiAgentV2
126
+ || CURRENT_CODEX_RELEASE_MANIFEST.featurePolicies.multiAgentMode
127
+ || 'delegate';
128
+ const evidence = [];
129
+ const helpHit = /\bmulti_agent_v2\b/.test(input.help);
130
+ const configHit = /\[features\.multi_agent_v2\]|features\.multi_agent_v2\b/.test(input.config);
131
+ const schemaHit = /\bMultiAgentMode\b|\bmulti_agent_v2\b/.test(input.schema);
132
+ if (helpHit)
133
+ evidence.push('help_mentions_multi_agent_v2');
134
+ if (configHit)
135
+ evidence.push('config_mentions_multi_agent_v2');
136
+ if (schemaHit)
137
+ evidence.push('schema_mentions_multi_agent_v2');
138
+ if (helpHit || configHit || schemaHit) {
139
+ return {
140
+ id: 'multi_agent_v2',
141
+ available: true,
142
+ policy,
143
+ evidence,
144
+ blockers: [],
145
+ update_cta: null
146
+ };
147
+ }
148
+ if (input.detected && compareSemverLike(input.detected, narutoCodexFloorVersion()) >= 0) {
149
+ return {
150
+ id: 'multi_agent_v2',
151
+ available: true,
152
+ policy,
153
+ evidence: [`version_meets_naruto_floor:${input.detected}`],
154
+ blockers: [],
155
+ update_cta: null
156
+ };
157
+ }
158
+ return {
159
+ id: 'multi_agent_v2',
160
+ available: false,
161
+ policy,
162
+ evidence,
163
+ blockers: input.detected
164
+ ? [`multi_agent_v2_missing_on_codex_${input.detected}`]
165
+ : ['multi_agent_v2_probe_empty'],
166
+ update_cta: UPDATE_CTA
167
+ };
168
+ }
169
+ function resolveAgentsConcurrency(input) {
170
+ const policy = CURRENT_CODEX_RELEASE_MANIFEST.featurePolicies.agentsMaxConcurrentThreads || 'delegate';
171
+ const hit = /max_concurrent_threads_per_session/.test(input.help)
172
+ || /max_concurrent_threads_per_session/.test(input.config);
173
+ const available = hit || input.multiAgentV2;
174
+ return {
175
+ id: 'agents_max_concurrent_threads_per_session',
176
+ available,
177
+ policy,
178
+ evidence: hit
179
+ ? ['mentions_max_concurrent_threads_per_session']
180
+ : input.multiAgentV2
181
+ ? ['inferred_from_multi_agent_v2']
182
+ : [],
183
+ blockers: available ? [] : ['agents_max_concurrent_threads_unavailable'],
184
+ update_cta: available ? null : UPDATE_CTA
185
+ };
186
+ }
187
+ function resolveBooleanCapability(input) {
188
+ if (input.forceAvailable) {
189
+ return {
190
+ id: input.id,
191
+ available: true,
192
+ policy: input.policy,
193
+ evidence: ['sks_owned_surface'],
194
+ blockers: [],
195
+ update_cta: null
196
+ };
197
+ }
198
+ const joined = input.sources.join('\n');
199
+ const hit = input.markers.some((marker) => marker.test(joined));
200
+ return {
201
+ id: input.id,
202
+ available: hit,
203
+ policy: input.policy,
204
+ evidence: hit ? [`marker_hit:${input.id}`] : [],
205
+ blockers: hit ? [] : [`${input.id}_unavailable`],
206
+ update_cta: hit || input.policy === 'disable' ? null : UPDATE_CTA
207
+ };
208
+ }
@@ -1,6 +1,14 @@
1
1
  import {} from './codex-schema-snapshot.js';
2
2
  export function buildPreToolUseContinue(options = {}) {
3
- return withOptionalSystemMessage({ continue: true }, options.systemMessage);
3
+ const output = { continue: true };
4
+ const additionalContext = optionalText(options.additionalContext);
5
+ if (additionalContext) {
6
+ output.hookSpecificOutput = {
7
+ hookEventName: 'PreToolUse',
8
+ additionalContext
9
+ };
10
+ }
11
+ return withOptionalSystemMessage(output, options.systemMessage);
4
12
  }
5
13
  export function buildPreToolUseDeny(reason, options = {}) {
6
14
  const trimmed = requiredReason(reason, 'PreToolUse deny requires a non-empty reason');
@@ -25,7 +25,7 @@ export function normalizeCodexHookOutput(name, result = {}) {
25
25
  }
26
26
  if (decision === 'allow' && out.updatedInput !== undefined)
27
27
  return buildPreToolUseAllowRewrite(out.updatedInput, { systemMessage });
28
- return buildPreToolUseContinue({ systemMessage });
28
+ return buildPreToolUseContinue({ additionalContext: out.additionalContext, systemMessage });
29
29
  }
30
30
  if (eventName === 'PermissionRequest') {
31
31
  if (out.decision === 'deny' || out.permissionDecision === 'deny') {
@@ -98,8 +98,9 @@ function validatePreToolUse(output, issues) {
98
98
  const specific = asRecord(output.hookSpecificOutput);
99
99
  if (!specific)
100
100
  return;
101
- if (specific.additionalContext !== undefined)
102
- pushStrictSubset(issues, 'pretooluse_additional_context', 'PreToolUse additionalContext is schema-compatible but disallowed by the SKS zero-warning strict subset.', '$.hookSpecificOutput.additionalContext');
101
+ if (specific.additionalContext !== undefined && typeof specific.additionalContext !== 'string') {
102
+ pushIssue(issues, 'schema_violation', 'pretooluse_additional_context_type', 'PreToolUse additionalContext must be a string.', '$.hookSpecificOutput.additionalContext', { upstream_supported: false });
103
+ }
103
104
  const decision = specific.permissionDecision;
104
105
  const hasUpdatedInput = Object.prototype.hasOwnProperty.call(specific, 'updatedInput');
105
106
  const hasReason = Object.prototype.hasOwnProperty.call(specific, 'permissionDecisionReason');