sneakoscope 6.0.3 → 6.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. package/README.md +29 -12
  2. package/config/codex-releases/{rust-v0.142.0.json → rust-v0.144.1.json} +6 -6
  3. package/crates/sks-core/Cargo.lock +1 -1
  4. package/crates/sks-core/Cargo.toml +1 -1
  5. package/dist/bin/fast-inline.js +18 -14
  6. package/dist/bin/sks-dispatch.js +2 -4
  7. package/dist/cli/args.js +2 -0
  8. package/dist/cli/command-manifest-lite.js +2 -3
  9. package/dist/cli/command-registry.js +3 -4
  10. package/dist/cli/help-fast.js +1 -1
  11. package/dist/cli/install-helpers.js +348 -763
  12. package/dist/cli/install-tool-helpers.js +287 -0
  13. package/dist/cli/router.js +91 -6
  14. package/dist/commands/codex-lb.js +188 -53
  15. package/dist/commands/codex.js +44 -5
  16. package/dist/commands/doctor.js +302 -46
  17. package/dist/commands/tmux.js +5 -1
  18. package/dist/commands/versioning.js +7 -0
  19. package/dist/commands/zellij-monitor-pane.js +2 -0
  20. package/dist/commands/zellij-viewport-pane.js +3 -1
  21. package/dist/commands/zellij.js +1 -1
  22. package/dist/config/skills-manifest.json +59 -59
  23. package/dist/core/agent-bridge/agent-manifest.js +48 -0
  24. package/dist/core/agents/agent-central-ledger.js +9 -0
  25. package/dist/core/agents/agent-cleanup-executor.js +334 -41
  26. package/dist/core/agents/agent-cleanup.js +20 -1
  27. package/dist/core/agents/agent-command-surface.js +3 -1
  28. package/dist/core/agents/agent-effort-policy.js +30 -38
  29. package/dist/core/agents/agent-janitor.js +9 -10
  30. package/dist/core/agents/agent-namespace-safety.js +56 -0
  31. package/dist/core/agents/agent-orchestrator.js +25 -3
  32. package/dist/core/agents/agent-output-validator.js +1 -1
  33. package/dist/core/agents/agent-plan.js +100 -21
  34. package/dist/core/agents/agent-role-config.js +43 -49
  35. package/dist/core/agents/agent-runner-codex-exec.js +18 -3
  36. package/dist/core/agents/agent-runner-process.js +1 -0
  37. package/dist/core/agents/agent-schema.js +3 -2
  38. package/dist/core/agents/fast-mode-policy.js +3 -5
  39. package/dist/core/agents/native-cli-session-swarm.js +1 -1
  40. package/dist/core/agents/native-worker-backend-router.js +2 -1
  41. package/dist/core/agents/work-partition/repo-inventory.js +68 -7
  42. package/dist/core/agents/zellij-right-lane-cockpit.js +2 -2
  43. package/dist/core/code-structure.js +5 -4
  44. package/dist/core/codex/agent-config-file-repair.js +94 -193
  45. package/dist/core/codex/codex-cli-update.js +723 -0
  46. package/dist/core/codex/codex-config-guard.js +38 -11
  47. package/dist/core/codex/codex-project-config-policy.js +3 -6
  48. package/dist/core/codex/codex-startup-config-postcheck.js +52 -42
  49. package/dist/core/codex-adapter.js +35 -22
  50. package/dist/core/codex-app/codex-agent-role-sync.js +13 -54
  51. package/dist/core/codex-app/codex-app-fast-ui-repair.js +51 -20
  52. package/dist/core/codex-app/codex-app-launcher.js +48 -17
  53. package/dist/core/codex-app/codex-app-restart.js +23 -2
  54. package/dist/core/codex-app/codex-app-ui-state-snapshot.js +11 -3
  55. package/dist/core/codex-app/sks-menubar.js +136 -5
  56. package/dist/core/codex-app.js +35 -14
  57. package/dist/core/codex-compat/codex-hook-warning-detector.js +10 -1
  58. package/dist/core/codex-compat/codex-release-manifest.js +6 -6
  59. package/dist/core/codex-control/codex-0139-doctor-real-probe.js +7 -1
  60. package/dist/core/codex-control/codex-0139-image-path-real-probe.js +29 -12
  61. package/dist/core/codex-control/codex-0139-probe-runner.js +103 -28
  62. package/dist/core/codex-control/codex-0139-real-probe-summary.js +7 -3
  63. package/dist/core/codex-control/codex-0139-real-probes.js +21 -6
  64. package/dist/core/codex-control/codex-0139-sandbox-real-probe.js +39 -13
  65. package/dist/core/codex-control/codex-0139-web-search-probe.js +28 -14
  66. package/dist/core/codex-control/{codex-0142-capability.js → codex-0144-capability.js} +22 -22
  67. package/dist/core/codex-control/codex-0144-collab-agent-real-probe.js +63 -0
  68. package/dist/core/codex-control/codex-lb-launch-recovery.js +278 -0
  69. package/dist/core/codex-control/codex-multi-agent-event-normalizer.js +5 -1
  70. package/dist/core/codex-control/codex-reliability-shield.js +93 -30
  71. package/dist/core/codex-control/codex-sdk-adapter.js +96 -13
  72. package/dist/core/codex-control/codex-sdk-config-policy.js +2 -1
  73. package/dist/core/codex-control/codex-sdk-sandbox-policy.js +6 -3
  74. package/dist/core/codex-control/codex-task-runner.js +62 -9
  75. package/dist/core/codex-control/python-codex-sdk-adapter.js +30 -3
  76. package/dist/core/codex-exec-output-schema.js +35 -6
  77. package/dist/core/codex-lb/codex-lb-env.js +30 -1
  78. package/dist/core/codex-lb/codex-lb-tool-catalog.js +478 -0
  79. package/dist/core/codex-lb/codex-lb-tool-output-recovery.js +291 -0
  80. package/dist/core/codex-native/codex-native-feature-broker.js +31 -38
  81. package/dist/core/codex-native/codex-native-feature-matrix.js +2 -2
  82. package/dist/core/codex-native/codex-native-repair-transaction.js +1 -1
  83. package/dist/core/codex-native/core-skill-manifest.js +8 -4
  84. package/dist/core/codex-native/native-capability-postcheck.js +16 -8
  85. package/dist/core/codex-native/native-capability-repair-matrix.js +76 -27
  86. package/dist/core/codex-plugins/codex-plugin-json.js +67 -21
  87. package/dist/core/codex-plugins/codex-plugin-repair.js +118 -0
  88. package/dist/core/codex-runtime/codex-desktop-config-policy.js +305 -0
  89. package/dist/core/commands/agent-bridge-command.js +23 -2
  90. package/dist/core/commands/agent-command.js +38 -5
  91. package/dist/core/commands/basic-cli.js +77 -30
  92. package/dist/core/commands/command-utils.js +1 -1
  93. package/dist/core/commands/gc-command.js +27 -4
  94. package/dist/core/commands/image-ux-review-command.js +55 -24
  95. package/dist/core/commands/mad-sks-command.js +182 -137
  96. package/dist/core/commands/naruto-command.js +643 -1153
  97. package/dist/core/commands/pipeline-command.js +1 -0
  98. package/dist/core/commands/research-command.js +293 -231
  99. package/dist/core/commands/run-command.js +100 -23
  100. package/dist/core/commands/team-command.js +2 -3
  101. package/dist/core/commands/team-legacy-observe-command.js +94 -359
  102. package/dist/core/commands/wiki-command.js +179 -83
  103. package/dist/core/computer-use-live-evidence.js +166 -3
  104. package/dist/core/computer-use-status.js +5 -2
  105. package/dist/core/daemon/sksd-hook-daemon-entrypoint.js +2 -2
  106. package/dist/core/daemon/sksd-hook-daemon.js +171 -28
  107. package/dist/core/daemon/sksd-hook-dispatch.js +2 -2
  108. package/dist/core/db-safety.js +2 -2
  109. package/dist/core/decision-lattice.js +6 -6
  110. package/dist/core/dfix/verification-selector.js +6 -4
  111. package/dist/core/doctor/browser-use-repair.js +54 -13
  112. package/dist/core/doctor/codex-0139-doctor.js +3 -2
  113. package/dist/core/doctor/codex-startup-config-repair.js +8 -3
  114. package/dist/core/doctor/computer-use-repair.js +28 -39
  115. package/dist/core/doctor/doctor-codex-startup-repair.js +24 -149
  116. package/dist/core/doctor/doctor-context7-repair.js +1 -1
  117. package/dist/core/doctor/doctor-dirty-planner.js +1 -1
  118. package/dist/core/doctor/doctor-native-capability-repair.js +74 -3
  119. package/dist/core/doctor/imagegen-repair.js +47 -12
  120. package/dist/core/doctor/legacy-global-hook-cleanup.js +179 -0
  121. package/dist/core/feature-fixture-executor.js +71 -7
  122. package/dist/core/feature-fixture-runner.js +53 -12
  123. package/dist/core/feature-fixtures.js +47 -14
  124. package/dist/core/feature-registry.js +53 -58
  125. package/dist/core/fsx.js +54 -6
  126. package/dist/core/harness-conflicts.js +19 -10
  127. package/dist/core/hooks-runtime/code-pack-freshness-preflight.js +5 -4
  128. package/dist/core/hooks-runtime/hook-invocation-dedupe.js +147 -0
  129. package/dist/core/hooks-runtime/hook-io.js +14 -4
  130. package/dist/core/hooks-runtime/light-turn.js +70 -0
  131. package/dist/core/hooks-runtime/payload-signals.js +270 -0
  132. package/dist/core/hooks-runtime/team-digest.js +0 -1
  133. package/dist/core/hooks-runtime/tool-output-quarantine.js +93 -0
  134. package/dist/core/hooks-runtime.js +418 -250
  135. package/dist/core/image/image-artifact-path-contract.js +8 -6
  136. package/dist/core/image/image-artifact-registry.js +5 -1
  137. package/dist/core/image-ux-review/imagegen-adapter.js +5 -2
  138. package/dist/core/imagegen/imagegen-capability.js +10 -13
  139. package/dist/core/imagegen/require-imagegen.js +37 -11
  140. package/dist/core/init/skills.js +16 -30
  141. package/dist/core/init.js +144 -36
  142. package/dist/core/managed-assets/managed-assets-manifest.js +417 -14
  143. package/dist/core/mission.js +24 -1
  144. package/dist/core/naruto/naruto-work-graph.js +70 -4
  145. package/dist/core/ops/reporting.js +3 -0
  146. package/dist/core/pipeline-internals/runtime-core.js +578 -180
  147. package/dist/core/pipeline-internals/runtime-gates.js +191 -49
  148. package/dist/core/ppt/style-tokens.js +1 -1
  149. package/dist/core/ppt-review/index.js +1 -1
  150. package/dist/core/ppt-review/slide-exporter.js +23 -17
  151. package/dist/core/ppt-review/slide-imagegen-review.js +1 -1
  152. package/dist/core/ppt-review/slide-issue-extraction.js +4 -2
  153. package/dist/core/preflight/parallel-preflight-engine.js +50 -1
  154. package/dist/core/product-design-plugin.js +2 -2
  155. package/dist/core/proof/route-finalizer.js +1 -1
  156. package/dist/core/proof/route-proof-gate.js +7 -2
  157. package/dist/core/proof-field.js +3 -3
  158. package/dist/core/provider/model-router.js +38 -32
  159. package/dist/core/recallpulse/policy.js +12 -28
  160. package/dist/core/recallpulse.js +11 -6
  161. package/dist/core/release/gate-manifest.js +18 -12
  162. package/dist/core/release/gate-pack-manifest.js +1 -1
  163. package/dist/core/release/npm-pack-proof.js +247 -0
  164. package/dist/core/release/package-dist-snapshot.js +151 -0
  165. package/dist/core/release/package-size-budget.js +5 -0
  166. package/dist/core/release/release-authorization-snapshot.js +115 -0
  167. package/dist/core/release/release-gate-affected-selector.js +15 -3
  168. package/dist/core/release/release-gate-cache-v2.js +30 -0
  169. package/dist/core/release/release-gate-contract.js +161 -0
  170. package/dist/core/release/release-gate-dag.js +44 -3
  171. package/dist/core/release/release-gate-hermetic-env.js +28 -17
  172. package/dist/core/release/release-real-contract.js +496 -0
  173. package/dist/core/release-parallel-full-coverage.js +31 -143
  174. package/dist/core/research/claim-evidence-matrix.js +41 -6
  175. package/dist/core/research/experiment-plan.js +14 -10
  176. package/dist/core/research/falsification.js +9 -2
  177. package/dist/core/research/implementation-blueprint-densifier.js +82 -60
  178. package/dist/core/research/implementation-blueprint.js +32 -26
  179. package/dist/core/research/mock-result.js +122 -11
  180. package/dist/core/research/replication-pack.js +15 -8
  181. package/dist/core/research/research-adversarial-review.js +1068 -0
  182. package/dist/core/research/research-claim-builder.js +69 -17
  183. package/dist/core/research/research-claim-synthesizer.js +343 -0
  184. package/dist/core/research/research-cycle-runner.js +53 -3
  185. package/dist/core/research/research-falsification-runner.js +176 -0
  186. package/dist/core/research/research-final-reviewer.js +44 -125
  187. package/dist/core/research/research-realistic-report.js +14 -6
  188. package/dist/core/research/research-review-artifact-digest.js +66 -0
  189. package/dist/core/research/research-source-evidence.js +144 -0
  190. package/dist/core/research/research-source-layer-catalog.js +68 -0
  191. package/dist/core/research/research-source-ledger-merge.js +250 -12
  192. package/dist/core/research/research-source-shards.js +26 -70
  193. package/dist/core/research/research-stage-runner.js +237 -247
  194. package/dist/core/research/research-super-search.js +184 -0
  195. package/dist/core/research/research-synthesis-prompt.js +20 -1
  196. package/dist/core/research/research-synthesis-writer.js +86 -5
  197. package/dist/core/research/research-work-graph.js +25 -18
  198. package/dist/core/research/source-quality-report.js +21 -0
  199. package/dist/core/research.js +429 -280
  200. package/dist/core/retention/retention-budget.js +25 -6
  201. package/dist/core/retention.js +980 -101
  202. package/dist/core/routes/constants.js +1 -1
  203. package/dist/core/routes/dollar-manifest-lite.js +11 -11
  204. package/dist/core/routes/evidence.js +4 -4
  205. package/dist/core/routes/ppt-policy.js +1 -1
  206. package/dist/core/routes.js +92 -64
  207. package/dist/core/runtime/task-profile.js +66 -0
  208. package/dist/core/runtime/verification-budget.js +12 -0
  209. package/dist/core/secret-redaction.js +4 -0
  210. package/dist/core/security/high-risk-contracts.js +6 -6
  211. package/dist/core/stop-gate/stop-gate-check.js +49 -12
  212. package/dist/core/subagents/agent-catalog.js +215 -0
  213. package/dist/core/subagents/model-policy.js +118 -0
  214. package/dist/core/subagents/naruto-help-contract.js +40 -0
  215. package/dist/core/subagents/official-subagent-config.js +488 -0
  216. package/dist/core/subagents/official-subagent-preparation.js +251 -0
  217. package/dist/core/subagents/official-subagent-prompt.js +137 -0
  218. package/dist/core/subagents/official-subagent-runner.js +129 -0
  219. package/dist/core/subagents/subagent-evidence.js +663 -0
  220. package/dist/core/subagents/terminology.js +16 -0
  221. package/dist/core/subagents/thread-budget.js +21 -0
  222. package/dist/core/subagents/triwiki-attention.js +65 -0
  223. package/dist/core/super-search/runtime-helpers.js +173 -19
  224. package/dist/core/super-search/runtime.js +140 -15
  225. package/dist/core/super-search/source-records.js +49 -8
  226. package/dist/core/team-review-policy.js +15 -0
  227. package/dist/core/triwiki/code-pack.js +8 -2
  228. package/dist/core/triwiki/triwiki-cache-key.js +108 -29
  229. package/dist/core/triwiki/triwiki-module-card.js +1 -1
  230. package/dist/core/triwiki-attention.js +13 -6
  231. package/dist/core/triwiki-provenance.js +274 -0
  232. package/dist/core/triwiki-runtime.js +21 -7
  233. package/dist/core/triwiki-wrongness/wrongness-ledger.js +187 -61
  234. package/dist/core/triwiki-wrongness/wrongness-retrieval.js +11 -2
  235. package/dist/core/triwiki-wrongness/wrongness-trust-policy.js +2 -0
  236. package/dist/core/update-check.js +23 -15
  237. package/dist/core/version-manager.js +51 -1
  238. package/dist/core/version.js +1 -1
  239. package/dist/core/wiki-coordinate.js +128 -12
  240. package/dist/core/work-order-ledger.js +208 -10
  241. package/dist/core/zellij/zellij-command.js +12 -1
  242. package/dist/core/zellij/zellij-dashboard-pane.js +3 -3
  243. package/dist/core/zellij/zellij-fake-adapter.js +3 -1
  244. package/dist/core/zellij/zellij-launcher.js +51 -21
  245. package/dist/core/zellij/zellij-layout-builder.js +14 -5
  246. package/dist/core/zellij/zellij-official-subagent-activity.js +477 -0
  247. package/dist/core/zellij/zellij-official-subagent-telemetry.js +264 -0
  248. package/dist/core/zellij/zellij-pane-proof.js +32 -6
  249. package/dist/core/zellij/zellij-slot-pane-renderer.js +17 -5
  250. package/dist/core/zellij/zellij-slot-telemetry.js +15 -3
  251. package/dist/core/zellij/zellij-ui-mode.js +1 -1
  252. package/dist/core/zellij/zellij-viewport-binder.js +3 -0
  253. package/dist/core/zellij/zellij-worker-pane-manager.js +5 -3
  254. package/dist/scripts/agent-fast-mode-default-check.js +48 -29
  255. package/dist/scripts/agent-role-config-repair-check.js +34 -15
  256. package/dist/scripts/agent-wiki-context-proof-check.js +16 -2
  257. package/dist/scripts/all-feature-deep-completion-check.js +14 -4
  258. package/dist/scripts/architecture-guard-check.js +8 -1
  259. package/dist/scripts/build-dist.js +17 -5
  260. package/dist/scripts/canonical-test-runner.js +188 -0
  261. package/dist/scripts/check-command-module-budget.js +38 -16
  262. package/dist/scripts/check-legacy-free.js +1 -1
  263. package/dist/scripts/check-route-modularity.js +0 -1
  264. package/dist/scripts/check-ts-contracts.js +1 -1
  265. package/dist/scripts/codex-0139-interrupt-agent-check.js +5 -1
  266. package/dist/scripts/{codex-0142-app-server-v2-check.js → codex-0144-app-server-v2-check.js} +11 -10
  267. package/dist/scripts/{codex-0142-binary-identity-check.js → codex-0144-binary-identity-check.js} +4 -4
  268. package/dist/scripts/codex-0144-capability-check.js +21 -0
  269. package/dist/scripts/{codex-0139-real-probes-check.js → codex-0144-core-real-probes-check.js} +19 -5
  270. package/dist/scripts/{codex-0142-doctor-wiring-check.js → codex-0144-doctor-wiring-check.js} +6 -6
  271. package/dist/scripts/{codex-0142-manifest-check.js → codex-0144-manifest-check.js} +11 -3
  272. package/dist/scripts/{codex-0142-policy-check.js → codex-0144-policy-check.js} +2 -2
  273. package/dist/scripts/{codex-0142-thread-store-check.js → codex-0144-thread-store-check.js} +3 -3
  274. package/dist/scripts/codex-app-provider-model-ui-check.js +53 -19
  275. package/dist/scripts/codex-app-ui-preservation-check.js +35 -4
  276. package/dist/scripts/codex-control-all-pipelines-check.js +7 -3
  277. package/dist/scripts/codex-control-side-effect-scope-check.js +2 -2
  278. package/dist/scripts/codex-control-tool-output-continuity-audit-check.js +27 -0
  279. package/dist/scripts/codex-effort-auto-discovery-check.js +1 -1
  280. package/dist/scripts/codex-lb-fast-mode-truth-check.js +1 -0
  281. package/dist/scripts/{codex-lb-gpt55-fast-profile-check.js → codex-lb-gpt56-fast-profile-check.js} +56 -5
  282. package/dist/scripts/codex-model-metadata-check.js +1 -1
  283. package/dist/scripts/codex-native-agent-role-content-check.js +15 -7
  284. package/dist/scripts/codex-native-repair-transaction-check.js +3 -1
  285. package/dist/scripts/codex-sdk-all-pipelines-check.js +7 -4
  286. package/dist/scripts/codex-sdk-research-pipeline-check.js +30 -8
  287. package/dist/scripts/codex-sdk-sandbox-policy-check.js +5 -1
  288. package/dist/scripts/codex-sdk-version-compat-check.js +2 -1
  289. package/dist/scripts/db-route-materialization-check.js +33 -0
  290. package/dist/scripts/dfix-fixture-check.js +1 -1
  291. package/dist/scripts/docs-truthfulness-check.js +4 -2
  292. package/dist/scripts/doctor-codex-startup-repair-check.js +47 -25
  293. package/dist/scripts/doctor-context7-repair-check.js +2 -1
  294. package/dist/scripts/doctor-fix-production-blackbox.js +12 -2
  295. package/dist/scripts/doctor-fixes-codex-app-fast-ui-check.js +34 -7
  296. package/dist/scripts/doctor-imagegen-repair-check.js +14 -4
  297. package/dist/scripts/doctor-startup-config-repair-blackbox.js +9 -3
  298. package/dist/scripts/doctor-startup-config-repair-check.js +13 -3
  299. package/dist/scripts/install-update-preserves-config-check.js +7 -2
  300. package/dist/scripts/legacy-gate-inventory-check.js +7 -5
  301. package/dist/scripts/legacy-strong-inventory-check.js +7 -5
  302. package/dist/scripts/legacy-upgrade-matrix-check.js +4 -4
  303. package/dist/scripts/lib/native-cli-session-swarm-check-lib.js +173 -13
  304. package/dist/scripts/mad-sks-app-ui-no-mutation-check.js +165 -6
  305. package/dist/scripts/managed-role-manifest-parity-check.js +5 -4
  306. package/dist/scripts/mutation-callsite-coverage-check.js +0 -11
  307. package/dist/scripts/naruto-codex-e2e-check.js +14 -7
  308. package/dist/scripts/naruto-shadow-clone-swarm-check.js +4 -201
  309. package/dist/scripts/npm-publish-performance-check.js +20 -12
  310. package/dist/scripts/official-subagent-workflow-check.js +145 -0
  311. package/dist/scripts/package-published-contract-check.js +6 -20
  312. package/dist/scripts/packlist-performance-check.js +17 -3
  313. package/dist/scripts/parallel-verification-engine-check.js +2 -2
  314. package/dist/scripts/postinstall-safe-side-effects-check.js +8 -3
  315. package/dist/scripts/ppt-no-mock-as-real-check.js +3 -1
  316. package/dist/scripts/prepublish-release-check-or-fast.js +23 -86
  317. package/dist/scripts/product-design-plugin-routing-check.js +1 -1
  318. package/dist/scripts/release-affected-selector-check.js +74 -1
  319. package/dist/scripts/release-check-stamp.js +324 -239
  320. package/dist/scripts/release-dag-full-coverage-check.js +7 -15
  321. package/dist/scripts/release-dynamic-presets-check.js +10 -1
  322. package/dist/scripts/release-gate-dag-runner-check.js +3 -3
  323. package/dist/scripts/release-gate-dag-runner.js +35 -11
  324. package/dist/scripts/release-gate-existence-audit.js +1 -2
  325. package/dist/scripts/release-gate-script-parity-check.js +1 -1
  326. package/dist/scripts/release-parallel-full-coverage-check.js +12 -6
  327. package/dist/scripts/release-parallel-speed-budget-check.js +18 -2
  328. package/dist/scripts/release-real-check.js +390 -157
  329. package/dist/scripts/release-registry-check.js +61 -16
  330. package/dist/scripts/release-runtime-truth-matrix-check.js +22 -0
  331. package/dist/scripts/research-blueprint-densifier-check.js +2 -2
  332. package/dist/scripts/research-real-cycle-no-legacy-final-md-check.js +11 -7
  333. package/dist/scripts/route-proof-artifact-structure-check.js +1 -0
  334. package/dist/scripts/search-visibility-gate-lib.js +1 -1
  335. package/dist/scripts/seo-geo-route-identity-check.js +30 -4
  336. package/dist/scripts/sizecheck.js +4 -4
  337. package/dist/scripts/sks-1-11-gate-lib.js +53 -6
  338. package/dist/scripts/sks-3-1-4-directive-check-lib.js +8 -2
  339. package/dist/scripts/sks-3-1-5-directive-check-lib.js +3 -2
  340. package/dist/scripts/sks-3-1-6-directive-check-lib.js +5 -3
  341. package/dist/scripts/sks-menubar-install-check.js +8 -0
  342. package/dist/scripts/sks-uninstall-regression-check.js +1 -1
  343. package/dist/scripts/sksd-daemon-check.js +16 -6
  344. package/dist/scripts/trust-fixture-check.js +32 -10
  345. package/dist/scripts/write-build-manifest.js +2 -1
  346. package/dist/scripts/wrongness-fixture-check.js +1 -1
  347. package/dist/scripts/zellij-layout-valid-check.js +36 -11
  348. package/dist/scripts/zellij-pane-proof-check.js +33 -2
  349. package/dist/scripts/zellij-real-session-cleanup-check.js +122 -2
  350. package/dist/scripts/zellij-real-session-launch-check.js +76 -5
  351. package/dist/scripts/zellij-slot-pane-renderer-check.js +4 -4
  352. package/dist/scripts/zellij-spawn-on-demand-layout-check.js +3 -3
  353. package/docs/demo.tape +1 -1
  354. package/infra-harness-gates.json +1486 -0
  355. package/package.json +32 -19
  356. package/release-gates.v2.json +4060 -0
  357. package/runtime-required-scripts.json +9 -0
  358. package/schemas/codex/{app-server-0.142 → app-server-0.144}/codex_app_server_protocol.v2.schemas.json +1146 -781
  359. package/schemas/codex/codex-0139-real-probe-result.schema.json +39 -5
  360. package/schemas/codex/ppt-slide-issue-ledger.schema.json +2 -1
  361. package/dist/commands/db.js +0 -6
  362. package/dist/core/codex-control/codex-0139-multi-agent-real-probe.js +0 -107
  363. package/dist/core/commands/db-command.js +0 -146
  364. package/dist/core/research/prompt.js +0 -15
  365. package/dist/scripts/agent-native-release-gate.js +0 -274
  366. package/dist/scripts/codex-0142-capability-check.js +0 -21
  367. package/dist/scripts/codex-control-tool-call-sequence-repair-check.js +0 -14
  368. package/dist/scripts/command-performance-scorecard-check.js +0 -204
  369. package/dist/scripts/config-managed-merge-callsite-coverage-check.js +0 -212
  370. package/dist/scripts/dollar-performance-scorecard-check.js +0 -257
  371. package/dist/scripts/gate-timing-check.js +0 -16
  372. package/dist/scripts/ops-maturity-scorecard-check.js +0 -12
  373. package/dist/scripts/performance-baseline-check.js +0 -12
  374. package/dist/scripts/performance-improvement-report-check.js +0 -58
  375. package/dist/scripts/release-parallel-check.js +0 -389
  376. package/dist/scripts/release-runner-efficiency-check.js +0 -15
  377. package/dist/scripts/retention-long-run-smoke-check.js +0 -299
  378. package/docs/assets/sneakoscope-architecture-pipeline.jpg +0 -0
@@ -17,13 +17,21 @@ export async function buildNativeCapabilityRepairMatrix(input) {
17
17
  const root = path.resolve(input.root);
18
18
  const selected = new Set(input.capabilities || NATIVE_CAPABILITY_IDS);
19
19
  const fixture = input.fixture || false;
20
+ const needsImageCapability = selected.has('image_generation');
20
21
  const imageCapability = fixture
21
22
  ? fixtureImageCapability(fixture)
22
- : await detectImagegenCapability({ timeoutMs: 2500 }).catch((err) => ({ blockers: [messageOf(err)], auth_readiness: null, codex_app: { available: false } }));
23
+ : needsImageCapability
24
+ ? await detectImagegenCapability({ timeoutMs: 2500 }).catch((err) => ({ blockers: [messageOf(err)], auth_readiness: null, codex_app: { available: false } }))
25
+ : { blockers: [], auth_readiness: null, codex_app: { available: false } };
26
+ const needsNativeFeatureMatrix = selected.has('app_handoff') || selected.has('image_path_exposure');
23
27
  const nativeFeatureMatrix = fixture
24
28
  ? fixtureNativeFeatureMatrix(fixture)
25
- : await buildCodexNativeFeatureMatrix({ root, mode: 'read-only' }).catch((err) => ({ ok: false, features: {}, blockers: [messageOf(err)], invocation_defaults: {} }));
26
- const states = await Promise.all(NATIVE_CAPABILITY_IDS.filter((id) => selected.has(id)).map((id) => stateForCapability(root, id, imageCapability, nativeFeatureMatrix)));
29
+ : needsNativeFeatureMatrix
30
+ ? await buildCodexNativeFeatureMatrix({ root, mode: 'read-only' }).catch((err) => ({ ok: false, features: {}, blockers: [messageOf(err)], invocation_defaults: {} }))
31
+ : { ok: true, features: {}, blockers: [], invocation_defaults: {} };
32
+ const states = await Promise.all(NATIVE_CAPABILITY_IDS
33
+ .filter((id) => selected.has(id))
34
+ .map((id) => stateForCapability(root, id, imageCapability, nativeFeatureMatrix, fixture)));
27
35
  const coreBlockers = states.flatMap((state) => state.core_blockers || state.blockers);
28
36
  const routeBlockers = mergeRouteBlockers(states);
29
37
  const warnings = states.flatMap((state) => state.warnings);
@@ -47,24 +55,47 @@ export async function buildNativeCapabilityRepairMatrix(input) {
47
55
  await writeJsonAtomic(reportPath, matrix).catch(() => undefined);
48
56
  return matrix;
49
57
  }
50
- async function stateForCapability(root, id, imageCapability, nativeFeatureMatrix) {
58
+ async function stateForCapability(root, id, imageCapability, nativeFeatureMatrix, fixture) {
51
59
  const reports = path.join(root, '.sneakoscope', 'reports');
52
60
  if (id === 'image_generation') {
53
- const verified = imageCapability?.codex_app?.available === true || imageCapability?.auth_readiness?.headless_auto_available === true;
61
+ const fixtureVerified = fixture === 'all-repairable';
62
+ const builtInConfigured = imageCapability?.codex_app?.available === true;
63
+ const authReady = imageCapability?.auth_readiness?.headless_auto_available === true;
64
+ const realOutputVerified = (builtInConfigured
65
+ && imageCapability?.real_generation_available === true
66
+ && imageCapability?.real_output_verified_by_capability_check === true
67
+ && fixture === false);
68
+ const verified = fixtureVerified || realOutputVerified;
69
+ const routeBlocker = builtInConfigured
70
+ ? 'codex_imagegen_real_output_unverified'
71
+ : 'codex_app_builtin_imagegen_capability_missing';
54
72
  return {
55
73
  id,
56
- before: verified ? 'verified' : 'blocked',
74
+ before: verified ? 'verified' : builtInConfigured ? 'degraded' : 'blocked',
57
75
  repairability: verified ? 'auto' : 'manual-required',
58
76
  availability: verified ? 'verified' : 'manual-required',
59
77
  required_for: ['route-image'],
60
- repair_actions: verified ? ['postcheck-imagegen-path-contract'] : ['Sign in to Codex App and enable/use the built-in $imagegen / gpt-image-2 surface, then rerun `sks doctor --capabilities --yes`.'],
78
+ repair_actions: verified
79
+ ? ['postcheck-imagegen-path-contract']
80
+ : builtInConfigured
81
+ ? ['Invoke Codex App $imagegen with gpt-image-2 in a fresh task and record the selected raster output path before retrying the image route.']
82
+ : ['Sign in to Codex App, enable the built-in $imagegen / gpt-image-2 surface, then verify it with a real generated raster output before retrying the image route.'],
61
83
  after: null,
62
84
  artifact_path: path.join(reports, 'native-capability-repair-matrix.json'),
63
85
  core_blockers: [],
64
- route_blockers: verified ? {} : { 'route-image': ['imagegen_auth_or_codex_app_builtin_missing'] },
65
- manual_actions: verified ? [] : ['Sign in to Codex App and enable/use the built-in $imagegen / gpt-image-2 surface before image routes.'],
86
+ route_blockers: verified ? {} : { 'route-image': [routeBlocker] },
87
+ manual_actions: verified ? [] : [
88
+ builtInConfigured
89
+ ? 'Generate one real raster with Codex App $imagegen / gpt-image-2 and bind its output path to the route evidence.'
90
+ : 'Sign in to Codex App and enable/use the built-in $imagegen / gpt-image-2 surface before image routes.'
91
+ ],
66
92
  blockers: [],
67
- warnings: verified ? [] : ['image_generation_not_verified_without_real_capability']
93
+ warnings: verified ? [] : [
94
+ 'image_generation_not_verified_without_real_capability',
95
+ ...(authReady && !builtInConfigured ? ['imagegen_auth_readiness_is_not_builtin_output_proof'] : [])
96
+ ],
97
+ evidence_level: fixtureVerified ? 'fixture' : realOutputVerified ? 'real-interaction' : builtInConfigured ? 'configuration' : authReady ? 'environment-hint' : 'none',
98
+ real_interaction_verified: realOutputVerified
68
99
  };
69
100
  }
70
101
  if (id === 'image_followup_edit') {
@@ -118,38 +149,50 @@ async function stateForCapability(root, id, imageCapability, nativeFeatureMatrix
118
149
  };
119
150
  }
120
151
  if (id === 'computer_use') {
121
- const envVerified = process.env.SKS_COMPUTER_USE_CAPABILITY === 'verified';
152
+ const fixtureVerified = fixture === 'all-repairable';
153
+ const envHint = process.env.SKS_COMPUTER_USE_CAPABILITY === 'verified';
122
154
  return {
123
155
  id,
124
- before: envVerified ? 'verified' : 'unknown',
125
- availability: envVerified ? 'verified' : 'manual-required',
156
+ before: fixtureVerified ? 'verified' : envHint ? 'degraded' : 'unknown',
157
+ availability: fixtureVerified ? 'verified' : 'manual-required',
126
158
  required_for: ['route-computer-use'],
127
- repairability: envVerified ? 'auto' : 'manual-required',
128
- repair_actions: envVerified ? ['postcheck-computer-use'] : ['Enable Codex Computer Use and macOS Screen Recording/Accessibility permissions; run `$CU doctor` for native capability diagnostics, then rerun `sks doctor --capabilities --yes`.'],
159
+ repairability: fixtureVerified ? 'auto' : 'manual-required',
160
+ repair_actions: fixtureVerified ? ['postcheck-computer-use'] : ['Enable Codex Computer Use and macOS Screen Recording/Accessibility permissions; execute a real native interaction, then rerun `sks doctor --capabilities --yes`.'],
129
161
  after: null,
130
162
  artifact_path: path.join(reports, 'native-capability-repair-matrix.json'),
131
163
  core_blockers: [],
132
- route_blockers: envVerified ? {} : { 'route-computer-use': ['computer_use_os_permission_or_capability_unknown'] },
133
- manual_actions: envVerified ? [] : ['Enable Codex Computer Use and macOS Screen Recording/Accessibility permissions before `$CU` routes.'],
164
+ route_blockers: fixtureVerified ? {} : { 'route-computer-use': ['computer_use_os_permission_or_capability_unknown'] },
165
+ manual_actions: fixtureVerified ? [] : ['Enable Codex Computer Use and macOS Screen Recording/Accessibility permissions and verify a real interaction before `$CU` routes.'],
134
166
  blockers: [],
135
- warnings: envVerified ? [] : ['manual_os_permission_required']
167
+ warnings: fixtureVerified ? [] : [
168
+ 'manual_os_permission_required',
169
+ ...(envHint ? ['computer_use_environment_hint_is_not_interaction_proof'] : [])
170
+ ],
171
+ evidence_level: fixtureVerified ? 'fixture' : envHint ? 'environment-hint' : 'none',
172
+ real_interaction_verified: false
136
173
  };
137
174
  }
138
- const chromeReady = process.env.SKS_CHROME_EXTENSION_READY === '1';
175
+ const fixtureVerified = fixture === 'all-repairable';
176
+ const chromeHint = process.env.SKS_CHROME_EXTENSION_READY === '1';
139
177
  return {
140
178
  id,
141
- before: chromeReady ? 'verified' : 'unknown',
142
- availability: chromeReady ? 'verified' : 'manual-required',
179
+ before: fixtureVerified ? 'verified' : chromeHint ? 'degraded' : 'unknown',
180
+ availability: fixtureVerified ? 'verified' : 'manual-required',
143
181
  required_for: ['route-chrome-web-review'],
144
- repairability: chromeReady ? 'auto' : 'manual-required',
145
- repair_actions: chromeReady ? ['postcheck-chrome-extension-readiness'] : ['Install/enable the official Codex Chrome Extension, approve it in Codex App, then rerun `sks doctor --capabilities --yes`; web/browser/localhost verification must use the Chrome extension path first.'],
182
+ repairability: fixtureVerified ? 'auto' : 'manual-required',
183
+ repair_actions: fixtureVerified ? ['postcheck-chrome-extension-readiness'] : ['Install/enable the official Codex Chrome Extension, approve it in Codex App, then verify a real browser interaction; web/browser/localhost verification must use the Chrome extension path first.'],
146
184
  after: null,
147
185
  artifact_path: path.join(reports, 'native-capability-repair-matrix.json'),
148
186
  core_blockers: [],
149
- route_blockers: chromeReady ? {} : { 'route-chrome-web-review': ['codex_chrome_extension_readiness_not_verified'] },
150
- manual_actions: chromeReady ? [] : ['Install/enable the official Codex Chrome Extension before browser/web review routes.'],
187
+ route_blockers: fixtureVerified ? {} : { 'route-chrome-web-review': ['codex_chrome_extension_readiness_not_verified'] },
188
+ manual_actions: fixtureVerified ? [] : ['Install/enable the official Codex Chrome Extension and verify a real interaction before browser/web review routes.'],
151
189
  blockers: [],
152
- warnings: chromeReady ? [] : ['manual_chrome_extension_setup_required']
190
+ warnings: fixtureVerified ? [] : [
191
+ 'manual_chrome_extension_setup_required',
192
+ ...(chromeHint ? ['chrome_extension_environment_hint_is_not_interaction_proof'] : [])
193
+ ],
194
+ evidence_level: fixtureVerified ? 'fixture' : chromeHint ? 'environment-hint' : 'none',
195
+ real_interaction_verified: false
153
196
  };
154
197
  }
155
198
  export async function writeSavedArtifactPathContract(root) {
@@ -253,7 +296,13 @@ async function dirWritable(dir) {
253
296
  }
254
297
  function fixtureImageCapability(mode) {
255
298
  return mode === 'all-repairable'
256
- ? { codex_app: { available: true }, auth_readiness: { headless_auto_available: true }, blockers: [] }
299
+ ? {
300
+ codex_app: { available: true },
301
+ auth_readiness: { headless_auto_available: true },
302
+ real_generation_available: true,
303
+ real_output_verified_by_capability_check: false,
304
+ blockers: []
305
+ }
257
306
  : { codex_app: { available: false }, auth_readiness: { headless_auto_available: false }, blockers: ['fixture_manual_required'] };
258
307
  }
259
308
  function fixtureNativeFeatureMatrix(mode) {
@@ -2,31 +2,36 @@ import path from 'node:path';
2
2
  import { findCodexBinary } from '../codex-adapter.js';
3
3
  import { detectCodex0138Capability } from '../codex-control/codex-0138-capability.js';
4
4
  import { nowIso, runProcess, writeJsonAtomic } from '../fsx.js';
5
- export async function runCodexPluginListJson() {
5
+ import { redactSecrets, redactString } from '../secret-redaction.js';
6
+ export async function runCodexPluginListJson(codexBin) {
6
7
  if (process.env.SKS_CODEX_PLUGIN_JSON_FAKE === '1')
7
8
  return fakePluginList();
8
- const bin = await findCodexBinary();
9
+ const bin = codexBin === undefined ? await findCodexBinary() : codexBin;
9
10
  if (!bin)
10
11
  return { plugins: [], blockers: ['codex_cli_missing'] };
11
12
  return runCodexJson(bin, ['plugin', 'list', '--json']);
12
13
  }
13
- export async function runCodexPluginDetailJson(pluginId) {
14
+ export async function runCodexPluginDetailJson(pluginId, codexBin) {
14
15
  if (process.env.SKS_CODEX_PLUGIN_JSON_FAKE === '1')
15
16
  return fakePluginDetail(pluginId);
16
- const bin = await findCodexBinary();
17
+ const bin = codexBin === undefined ? await findCodexBinary() : codexBin;
17
18
  if (!bin)
18
19
  return { blockers: ['codex_cli_missing'] };
19
20
  return runCodexJson(bin, ['plugin', 'detail', pluginId, '--json']);
20
21
  }
21
- export async function buildCodexPluginInventory() {
22
+ export async function buildCodexPluginInventory(input = {}) {
22
23
  const started = Date.now();
23
24
  const capability = await detectCodex0138Capability();
24
- const listJson = await runCodexPluginListJson();
25
+ const codexBin = input.codexBin === undefined ? await findCodexBinary() : input.codexBin;
26
+ const listJson = input.listJson === undefined ? await runCodexPluginListJson(codexBin) : input.listJson;
25
27
  const summaries = normalizePluginList(listJson);
26
28
  const concurrency = Math.max(1, Number(process.env.SKS_CODEX_PLUGIN_DETAIL_CONCURRENCY || 6) || 6);
29
+ const detailJsonSupported = input.detailJsonSupported ?? await codexPluginDetailJsonSupported(codexBin);
27
30
  let failed = 0;
28
31
  const plugins = await mapWithConcurrency(summaries, concurrency, async (summary) => {
29
- const detail = await runCodexPluginDetailJson(summary.id || summary.name).catch((err) => ({ error: err?.message || String(err) }));
32
+ const detail = detailJsonSupported
33
+ ? await runCodexPluginDetailJson(pluginSelector(summary), codexBin).catch((err) => ({ error: err?.message || String(err) }))
34
+ : {};
30
35
  if (detail?.error || normalizeList(detail?.blockers).length > 0)
31
36
  failed += 1;
32
37
  return normalizePlugin(summary, detail);
@@ -36,18 +41,19 @@ export async function buildCodexPluginInventory() {
36
41
  ...normalizeList(listJson?.blockers),
37
42
  ...(process.env.SKS_CODEX_PLUGIN_JSON_FAKE_NO_MCP === '1' ? ['fixture_mcp_candidates_disabled'] : [])
38
43
  ];
39
- return {
44
+ return redactSecrets({
40
45
  schema: 'sks.codex-plugin-inventory.v1',
41
46
  generated_at: nowIso(),
42
47
  codex_0138_capability: capability,
43
48
  fetch_concurrency: concurrency,
44
- detail_fetch_count: summaries.length,
49
+ detail_fetch_count: detailJsonSupported ? summaries.length : 0,
45
50
  detail_fetch_failed_count: failed,
51
+ detail_json_supported: detailJsonSupported,
46
52
  duration_ms: Date.now() - started,
47
53
  plugins,
48
- marketplace_available: plugins.some((plugin) => plugin.source === 'marketplace' || plugin.source === 'remote') || Boolean(listJson?.marketplace_available || listJson?.marketplaceAvailable),
54
+ marketplace_available: plugins.some((plugin) => plugin.source === 'marketplace' || plugin.source === 'remote' || plugin.marketplace) || Boolean(listJson?.marketplace_available || listJson?.marketplaceAvailable),
49
55
  blockers
50
- };
56
+ });
51
57
  }
52
58
  export async function mapWithConcurrency(items, concurrency, fn) {
53
59
  const limit = Math.max(1, Math.floor(concurrency || 1));
@@ -93,39 +99,79 @@ async function runCodexJson(bin, args) {
93
99
  return text ? JSON.parse(text) : {};
94
100
  }
95
101
  catch {
96
- return { raw_text: text, blockers: [`codex_plugin_json_parse_failed:${args.join(' ')}`] };
102
+ return { raw_text: redactString(text), blockers: [`codex_plugin_json_parse_failed:${args.join(' ')}`] };
97
103
  }
98
104
  }
99
- function normalizePluginList(value) {
105
+ export function normalizePluginList(value) {
100
106
  if (Array.isArray(value))
101
107
  return value;
102
- for (const key of ['plugins', 'installed_plugins', 'installedPlugins', 'items']) {
103
- if (Array.isArray(value?.[key]))
104
- return value[key];
108
+ const rows = [];
109
+ const append = (items, installed = null) => {
110
+ if (!Array.isArray(items))
111
+ return;
112
+ for (const item of items)
113
+ rows.push(installed === null ? item : { ...item, installed: item?.installed ?? installed });
114
+ };
115
+ append(value?.installed, true);
116
+ append(value?.available, false);
117
+ for (const key of ['plugins', 'installed_plugins', 'installedPlugins', 'items'])
118
+ append(value?.[key]);
119
+ const deduped = new Map();
120
+ for (const row of rows) {
121
+ const selector = pluginSelector(row);
122
+ const current = deduped.get(selector);
123
+ if (!current || (row?.installed === true && current?.installed !== true))
124
+ deduped.set(selector, row);
105
125
  }
106
- return [];
126
+ return [...deduped.values()];
107
127
  }
108
128
  function normalizePlugin(summary, detail) {
109
129
  const raw = { summary, detail };
110
- const id = String(detail?.id || summary?.id || summary?.plugin_id || summary?.name || 'unknown');
130
+ const id = String(detail?.id || detail?.pluginId || summary?.id || summary?.pluginId || summary?.plugin_id || pluginSelector(summary) || summary?.name || 'unknown');
111
131
  const name = String(detail?.name || summary?.name || id);
112
- const sourceText = String(detail?.source || detail?.marketplaceSource || summary?.source || summary?.marketplaceSource || '').toLowerCase();
132
+ const marketplace = stringOrNull(detail?.marketplaceName || detail?.marketplace || summary?.marketplaceName || summary?.marketplace);
133
+ const sourceText = sourceValue(detail?.source || detail?.marketplaceSource || summary?.source || summary?.marketplaceSource).toLowerCase();
113
134
  const source = sourceText.includes('marketplace') ? 'marketplace'
114
135
  : sourceText.includes('remote') ? 'remote'
115
136
  : sourceText.includes('local') ? 'local'
116
137
  : 'unknown';
138
+ const installed = boolish(detail?.installed ?? summary?.installed, false);
117
139
  return {
118
140
  id,
119
141
  name,
120
142
  source,
121
- installed: boolish(detail?.installed ?? summary?.installed, true),
122
- enabled: boolish(detail?.enabled ?? summary?.enabled, true),
143
+ marketplace,
144
+ version: stringOrNull(detail?.version || summary?.version),
145
+ installed,
146
+ enabled: boolish(detail?.enabled ?? summary?.enabled, installed),
123
147
  default_prompts: normalizeList(detail?.default_prompts || detail?.defaultPrompts || detail?.prompts),
124
148
  remote_mcp_servers: normalizeMcpServers(detail?.remote_mcp_servers || detail?.remoteMcpServers || detail?.mcp_servers || detail?.mcpServers),
125
149
  unavailable_app_templates: normalizeList(detail?.unavailable_app_templates || detail?.unavailableAppTemplates || detail?.app_templates_unavailable),
126
150
  raw
127
151
  };
128
152
  }
153
+ function pluginSelector(value) {
154
+ const explicit = String(value?.pluginId || value?.plugin_id || value?.id || '').trim();
155
+ if (explicit)
156
+ return explicit;
157
+ const name = String(value?.name || '').trim();
158
+ const marketplace = String(value?.marketplaceName || value?.marketplace || '').trim();
159
+ return name && marketplace ? `${name}@${marketplace}` : name;
160
+ }
161
+ function sourceValue(value) {
162
+ if (value && typeof value === 'object') {
163
+ return String(value.source || value.sourceType || value.type || value.path || '');
164
+ }
165
+ return String(value || '');
166
+ }
167
+ async function codexPluginDetailJsonSupported(codexBin) {
168
+ if (process.env.SKS_CODEX_PLUGIN_JSON_FAKE === '1')
169
+ return true;
170
+ if (!codexBin)
171
+ return false;
172
+ const help = await runProcess(codexBin, ['plugin', '--help'], { timeoutMs: 5000, maxOutputBytes: 32 * 1024 }).catch(() => null);
173
+ return help?.code === 0 && /^\s*detail\s+/m.test(`${help.stdout || ''}\n${help.stderr || ''}`);
174
+ }
129
175
  function normalizeMcpServers(value) {
130
176
  const rows = Array.isArray(value) ? value : value && typeof value === 'object' ? Object.entries(value).map(([name, row]) => ({ name, ...(row || {}) })) : [];
131
177
  return rows.map((row, index) => ({
@@ -0,0 +1,118 @@
1
+ import { findCodexBinary } from '../codex-adapter.js';
2
+ import { nowIso, runProcess } from '../fsx.js';
3
+ import { redactSecrets, redactString } from '../secret-redaction.js';
4
+ import { buildCodexPluginInventory } from './codex-plugin-json.js';
5
+ export const CODEX_PLUGIN_REPAIR_SCHEMA = 'sks.codex-plugin-repair.v1';
6
+ export async function ensureCodexPlugins(input) {
7
+ const pluginIds = [...new Set((input.pluginIds || []).map(String))];
8
+ const invalid = pluginIds.filter((id) => !/^[a-z0-9][a-z0-9._-]*@[a-z0-9][a-z0-9._-]*$/i.test(id));
9
+ if (invalid.length) {
10
+ return report({
11
+ ok: false,
12
+ apply: input.apply === true,
13
+ codexBin: null,
14
+ pluginIds,
15
+ before: null,
16
+ after: null,
17
+ installs: [],
18
+ blockers: invalid.map((id) => `invalid_plugin_selector:${id}`)
19
+ });
20
+ }
21
+ const codexBin = input.codexBin === undefined ? await findCodexBinary() : input.codexBin;
22
+ const inventory = input.inventoryFactory || (() => buildCodexPluginInventory({ codexBin }));
23
+ const before = await inventory().catch((err) => failedInventory(err));
24
+ const missingBefore = pluginIds.filter((id) => !pluginReady(before, id));
25
+ const installs = [];
26
+ if (input.apply === true && codexBin) {
27
+ const run = input.run || (async (bin, args) => runProcess(bin, args, {
28
+ timeoutMs: input.timeoutMs || 30_000,
29
+ maxOutputBytes: 128 * 1024
30
+ }));
31
+ for (const pluginId of missingBefore) {
32
+ const result = await run(codexBin, ['plugin', 'add', pluginId, '--json']).catch((err) => ({
33
+ code: 1,
34
+ stdout: '',
35
+ stderr: messageOf(err)
36
+ }));
37
+ installs.push({
38
+ plugin_id: pluginId,
39
+ attempted: true,
40
+ ok: result.code === 0,
41
+ command: `${codexBin} plugin add ${pluginId} --json`,
42
+ exit_code: result.code,
43
+ stdout_tail: tail(result.stdout),
44
+ stderr_tail: tail(result.stderr)
45
+ });
46
+ }
47
+ }
48
+ const after = installs.length ? await inventory().catch((err) => failedInventory(err)) : before;
49
+ const missingAfter = pluginIds.filter((id) => !pluginReady(after, id));
50
+ const blockers = [
51
+ ...(!codexBin && missingAfter.length ? ['codex_cli_missing'] : []),
52
+ ...(input.apply !== true ? missingAfter.map((id) => `codex_plugin_repair_not_applied:${id}`) : []),
53
+ ...missingAfter.map((id) => `codex_plugin_not_ready_after_recheck:${id}`),
54
+ ...installs.filter((step) => !step.ok).map((step) => `codex_plugin_add_failed:${step.plugin_id}`)
55
+ ];
56
+ return report({
57
+ ok: missingAfter.length === 0,
58
+ apply: input.apply === true,
59
+ codexBin,
60
+ pluginIds,
61
+ before,
62
+ after,
63
+ installs,
64
+ blockers: [...new Set(blockers)]
65
+ });
66
+ }
67
+ function report(input) {
68
+ const changed = input.installs.some((step) => step.ok);
69
+ return redactSecrets({
70
+ schema: CODEX_PLUGIN_REPAIR_SCHEMA,
71
+ generated_at: nowIso(),
72
+ ok: input.ok,
73
+ apply: input.apply,
74
+ codex_bin: input.codexBin,
75
+ plugin_ids: input.pluginIds,
76
+ before: input.before,
77
+ after: input.after,
78
+ installs: input.installs,
79
+ changed,
80
+ rechecked_after_install: input.installs.length > 0,
81
+ current_task_tool_manifest_verified: false,
82
+ requires_new_task: changed,
83
+ restart_app_if_stale: changed,
84
+ next_actions: changed
85
+ ? [
86
+ 'Start a new Codex/Work task so the repaired plugin skills and tools are attached to a fresh task manifest.',
87
+ 'If the plugin is still missing in the new task, restart the ChatGPT/Codex desktop app and re-run `sks doctor --fix --repair-native-capabilities --yes`.'
88
+ ]
89
+ : [],
90
+ blockers: input.blockers
91
+ });
92
+ }
93
+ function pluginReady(inventory, pluginId) {
94
+ return inventory.plugins.some((plugin) => plugin.id === pluginId && plugin.installed === true && plugin.enabled === true);
95
+ }
96
+ function failedInventory(err) {
97
+ return {
98
+ schema: 'sks.codex-plugin-inventory.v1',
99
+ generated_at: nowIso(),
100
+ codex_0138_capability: null,
101
+ fetch_concurrency: 0,
102
+ detail_fetch_count: 0,
103
+ detail_fetch_failed_count: 0,
104
+ detail_json_supported: false,
105
+ duration_ms: 0,
106
+ plugins: [],
107
+ marketplace_available: false,
108
+ blockers: [`codex_plugin_inventory_failed:${redactString(messageOf(err))}`]
109
+ };
110
+ }
111
+ function tail(value, max = 2000) {
112
+ const text = redactString(String(value || ''));
113
+ return text.length > max ? text.slice(-max) : text;
114
+ }
115
+ function messageOf(err) {
116
+ return err instanceof Error ? err.message : String(err);
117
+ }
118
+ //# sourceMappingURL=codex-plugin-repair.js.map