@kbediako/codex-orchestrator 0.1.38 → 0.2.1

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 (311) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/README.md +46 -317
  3. package/bin/codex-orchestrator.js +161 -0
  4. package/codex.orchestrator.json +149 -13
  5. package/dist/bin/codex-orchestrator.js +797 -1154
  6. package/dist/orchestrator/src/cli/adapters/CommandBuilder.js +50 -0
  7. package/dist/orchestrator/src/cli/adapters/CommandPlanner.js +22 -4
  8. package/dist/orchestrator/src/cli/adapters/CommandReviewer.js +3 -3
  9. package/dist/orchestrator/src/cli/adapters/CommandTester.js +2 -2
  10. package/dist/orchestrator/src/cli/adapters/cloudFailureDiagnostics.js +295 -11
  11. package/dist/orchestrator/src/cli/coStatusAttachCliShell.js +402 -0
  12. package/dist/orchestrator/src/cli/coStatusCliShell.js +451 -0
  13. package/dist/orchestrator/src/cli/coStatusOperatorAutopilotCliShell.js +120 -0
  14. package/dist/orchestrator/src/cli/codexCliShell.js +119 -0
  15. package/dist/orchestrator/src/cli/codexDefaultsSetup.js +265 -36
  16. package/dist/orchestrator/src/cli/config/delegationConfig.js +317 -5
  17. package/dist/orchestrator/src/cli/config/repoConfigPolicy.js +2 -3
  18. package/dist/orchestrator/src/cli/config/userConfig.js +28 -13
  19. package/dist/orchestrator/src/cli/control/authenticatedControlRouteGate.js +69 -0
  20. package/dist/orchestrator/src/cli/control/authenticatedRouteComposition.js +267 -0
  21. package/dist/orchestrator/src/cli/control/authenticatedRouteController.js +5 -0
  22. package/dist/orchestrator/src/cli/control/authenticatedRouteDispatcher.js +41 -0
  23. package/dist/orchestrator/src/cli/control/compatibilityIssuePresenter.js +1035 -0
  24. package/dist/orchestrator/src/cli/control/confirmationApproveController.js +62 -0
  25. package/dist/orchestrator/src/cli/control/confirmationCreateController.js +69 -0
  26. package/dist/orchestrator/src/cli/control/confirmationIssueConsumeController.js +43 -0
  27. package/dist/orchestrator/src/cli/control/confirmationListController.js +22 -0
  28. package/dist/orchestrator/src/cli/control/confirmationValidateController.js +58 -0
  29. package/dist/orchestrator/src/cli/control/confirmations.js +25 -3
  30. package/dist/orchestrator/src/cli/control/controlActionCancelConfirmation.js +65 -0
  31. package/dist/orchestrator/src/cli/control/controlActionController.js +77 -0
  32. package/dist/orchestrator/src/cli/control/controlActionControllerSequencing.js +161 -0
  33. package/dist/orchestrator/src/cli/control/controlActionExecution.js +142 -0
  34. package/dist/orchestrator/src/cli/control/controlActionFinalization.js +43 -0
  35. package/dist/orchestrator/src/cli/control/controlActionOutcome.js +60 -0
  36. package/dist/orchestrator/src/cli/control/controlActionPreflight.js +476 -0
  37. package/dist/orchestrator/src/cli/control/controlAuthenticatedRouteHandoff.js +57 -0
  38. package/dist/orchestrator/src/cli/control/controlBootstrapAssembly.js +39 -0
  39. package/dist/orchestrator/src/cli/control/controlBootstrapMetadataPersistence.js +16 -0
  40. package/dist/orchestrator/src/cli/control/controlEventTransport.js +49 -0
  41. package/dist/orchestrator/src/cli/control/controlExpiryLifecycle.js +102 -0
  42. package/dist/orchestrator/src/cli/control/controlHostOwnership.js +480 -0
  43. package/dist/orchestrator/src/cli/control/controlHostSupervision.js +630 -0
  44. package/dist/orchestrator/src/cli/control/controlOversightFacade.js +8 -0
  45. package/dist/orchestrator/src/cli/control/controlOversightReadContract.js +1 -0
  46. package/dist/orchestrator/src/cli/control/controlOversightReadService.js +16 -0
  47. package/dist/orchestrator/src/cli/control/controlOversightUpdateContract.js +1 -0
  48. package/dist/orchestrator/src/cli/control/controlPersistenceFiles.js +6 -0
  49. package/dist/orchestrator/src/cli/control/controlQuestionChildResolution.js +18 -0
  50. package/dist/orchestrator/src/cli/control/controlRequestContext.js +42 -0
  51. package/dist/orchestrator/src/cli/control/controlRequestController.js +9 -0
  52. package/dist/orchestrator/src/cli/control/controlRequestPredispatch.js +17 -0
  53. package/dist/orchestrator/src/cli/control/controlRequestRouteDispatch.js +44 -0
  54. package/dist/orchestrator/src/cli/control/controlRuntime.js +1003 -0
  55. package/dist/orchestrator/src/cli/control/controlServer.js +23 -1456
  56. package/dist/orchestrator/src/cli/control/controlServerAuditAndErrorHelpers.js +115 -0
  57. package/dist/orchestrator/src/cli/control/controlServerAuthenticatedRouteBranch.js +29 -0
  58. package/dist/orchestrator/src/cli/control/controlServerBootstrapLifecycle.js +30 -0
  59. package/dist/orchestrator/src/cli/control/controlServerBootstrapStartSequence.js +21 -0
  60. package/dist/orchestrator/src/cli/control/controlServerOwnedRuntimeLifecycle.js +67 -0
  61. package/dist/orchestrator/src/cli/control/controlServerPublicLifecycle.js +756 -0
  62. package/dist/orchestrator/src/cli/control/controlServerPublicRouteHelpers.js +86 -0
  63. package/dist/orchestrator/src/cli/control/controlServerReadyInstanceLifecycle.js +25 -0
  64. package/dist/orchestrator/src/cli/control/controlServerReadyInstanceStartup.js +18 -0
  65. package/dist/orchestrator/src/cli/control/controlServerRequestBodyHelpers.js +37 -0
  66. package/dist/orchestrator/src/cli/control/controlServerRequestShell.js +40 -0
  67. package/dist/orchestrator/src/cli/control/controlServerRequestShellBinding.js +17 -0
  68. package/dist/orchestrator/src/cli/control/controlServerSeedLoading.js +27 -0
  69. package/dist/orchestrator/src/cli/control/controlServerSeededRuntimeAssembly.js +186 -0
  70. package/dist/orchestrator/src/cli/control/controlServerStartupInputPreparation.js +31 -0
  71. package/dist/orchestrator/src/cli/control/controlServerStartupSequence.js +49 -0
  72. package/dist/orchestrator/src/cli/control/controlState.js +233 -2
  73. package/dist/orchestrator/src/cli/control/controlStatusDashboard.js +1904 -0
  74. package/dist/orchestrator/src/cli/control/controlTelegramBridgeBootstrapLifecycle.js +22 -0
  75. package/dist/orchestrator/src/cli/control/controlTelegramBridgeLifecycle.js +67 -0
  76. package/dist/orchestrator/src/cli/control/controlTelegramBridgeOversightFacadeFactory.js +8 -0
  77. package/dist/orchestrator/src/cli/control/controlTelegramCommandController.js +49 -0
  78. package/dist/orchestrator/src/cli/control/controlTelegramDispatchRead.js +40 -0
  79. package/dist/orchestrator/src/cli/control/controlTelegramPollingController.js +89 -0
  80. package/dist/orchestrator/src/cli/control/controlTelegramProjectionNotificationController.js +29 -0
  81. package/dist/orchestrator/src/cli/control/controlTelegramPushState.js +63 -0
  82. package/dist/orchestrator/src/cli/control/controlTelegramQuestionRead.js +13 -0
  83. package/dist/orchestrator/src/cli/control/controlTelegramReadController.js +216 -0
  84. package/dist/orchestrator/src/cli/control/controlTelegramUpdateHandler.js +63 -0
  85. package/dist/orchestrator/src/cli/control/controlWatcher.js +73 -5
  86. package/dist/orchestrator/src/cli/control/delegationRegisterController.js +35 -0
  87. package/dist/orchestrator/src/cli/control/dynamicToolBridgePolicy.js +139 -0
  88. package/dist/orchestrator/src/cli/control/eventsSseController.js +12 -0
  89. package/dist/orchestrator/src/cli/control/linearBudgetState.js +1789 -0
  90. package/dist/orchestrator/src/cli/control/linearDispatchSource.js +1137 -0
  91. package/dist/orchestrator/src/cli/control/linearGraphqlClient.js +150 -0
  92. package/dist/orchestrator/src/cli/control/linearRateLimit.js +102 -0
  93. package/dist/orchestrator/src/cli/control/linearWebhookController.js +499 -0
  94. package/dist/orchestrator/src/cli/control/liveLinearAdvisoryRuntime.js +70 -0
  95. package/dist/orchestrator/src/cli/control/observabilityApiController.js +173 -0
  96. package/dist/orchestrator/src/cli/control/observabilityReadModel.js +500 -0
  97. package/dist/orchestrator/src/cli/control/observabilitySurface.js +284 -0
  98. package/dist/orchestrator/src/cli/control/observabilityUpdateNotifier.js +22 -0
  99. package/dist/orchestrator/src/cli/control/operatorDashboardPresenter.js +252 -0
  100. package/dist/orchestrator/src/cli/control/providerAgentCapacity.js +70 -0
  101. package/dist/orchestrator/src/cli/control/providerControlHostFreshnessGauge.js +1068 -0
  102. package/dist/orchestrator/src/cli/control/providerIntakeState.js +473 -0
  103. package/dist/orchestrator/src/cli/control/providerIssueHandoff.js +6811 -0
  104. package/dist/orchestrator/src/cli/control/providerIssueObservability.js +1348 -0
  105. package/dist/orchestrator/src/cli/control/providerIssueRetryQueue.js +84 -0
  106. package/dist/orchestrator/src/cli/control/providerLinearRuntimeProof.js +588 -0
  107. package/dist/orchestrator/src/cli/control/providerLinearScreenshotProof.js +473 -0
  108. package/dist/orchestrator/src/cli/control/providerLinearWorkerTruth.js +383 -0
  109. package/dist/orchestrator/src/cli/control/providerLinearWorkflowAudit.js +254 -0
  110. package/dist/orchestrator/src/cli/control/providerLinearWorkflowFacade.js +5573 -0
  111. package/dist/orchestrator/src/cli/control/providerLinearWorkflowStates.js +115 -0
  112. package/dist/orchestrator/src/cli/control/providerMergeCloseout.js +1868 -0
  113. package/dist/orchestrator/src/cli/control/providerOperatorAutopilot.js +1580 -0
  114. package/dist/orchestrator/src/cli/control/providerOperatorAutopilotLifecycle.js +154 -0
  115. package/dist/orchestrator/src/cli/control/providerOperatorAutopilotLocalRolloutExecution.js +1006 -0
  116. package/dist/orchestrator/src/cli/control/providerPollingHealth.js +435 -0
  117. package/dist/orchestrator/src/cli/control/providerTerminalCleanup.js +516 -0
  118. package/dist/orchestrator/src/cli/control/providerWorkerHosts.js +191 -0
  119. package/dist/orchestrator/src/cli/control/providerWorkflowConfigStore.js +515 -0
  120. package/dist/orchestrator/src/cli/control/questionChildResolutionAdapter.js +361 -0
  121. package/dist/orchestrator/src/cli/control/questionQueueController.js +181 -0
  122. package/dist/orchestrator/src/cli/control/questionReadRetryDeduplication.js +9 -0
  123. package/dist/orchestrator/src/cli/control/questionReadSequence.js +10 -0
  124. package/dist/orchestrator/src/cli/control/securityViolationController.js +27 -0
  125. package/dist/orchestrator/src/cli/control/selectedRunProjection.js +1885 -0
  126. package/dist/orchestrator/src/cli/control/telegramOversightApiClient.js +48 -0
  127. package/dist/orchestrator/src/cli/control/telegramOversightBridge.js +180 -0
  128. package/dist/orchestrator/src/cli/control/telegramOversightBridgeProjectionDeliveryQueue.js +25 -0
  129. package/dist/orchestrator/src/cli/control/telegramOversightBridgeRuntimeLifecycle.js +45 -0
  130. package/dist/orchestrator/src/cli/control/telegramOversightBridgeStateStore.js +77 -0
  131. package/dist/orchestrator/src/cli/control/telegramOversightControlActionApiClient.js +45 -0
  132. package/dist/orchestrator/src/cli/control/trackerDispatchPilot.js +439 -0
  133. package/dist/orchestrator/src/cli/control/uiDataController.js +34 -0
  134. package/dist/orchestrator/src/cli/control/uiSessionController.js +100 -0
  135. package/dist/orchestrator/src/cli/controlHostCliShell.js +860 -0
  136. package/dist/orchestrator/src/cli/controlHostFreshnessGaugeCliShell.js +129 -0
  137. package/dist/orchestrator/src/cli/controlHostSupervisionCliShell.js +2127 -0
  138. package/dist/orchestrator/src/cli/delegationCliShell.js +62 -0
  139. package/dist/orchestrator/src/cli/delegationServer.js +567 -678
  140. package/dist/orchestrator/src/cli/delegationServerCliShell.js +52 -0
  141. package/dist/orchestrator/src/cli/delegationServerQuestionFlowShell.js +228 -0
  142. package/dist/orchestrator/src/cli/delegationServerToolDispatchShell.js +411 -0
  143. package/dist/orchestrator/src/cli/delegationServerTransport.js +274 -0
  144. package/dist/orchestrator/src/cli/delegationSetup.js +51 -171
  145. package/dist/orchestrator/src/cli/devtoolsCliShell.js +34 -0
  146. package/dist/orchestrator/src/cli/doctor.js +678 -164
  147. package/dist/orchestrator/src/cli/doctorCliRequestShell.js +72 -0
  148. package/dist/orchestrator/src/cli/doctorCliShell.js +138 -0
  149. package/dist/orchestrator/src/cli/doctorUsage.js +119 -15
  150. package/dist/orchestrator/src/cli/exec/experience.js +16 -2
  151. package/dist/orchestrator/src/cli/exec/summary.js +3 -0
  152. package/dist/orchestrator/src/cli/execCliShell.js +51 -0
  153. package/dist/orchestrator/src/cli/flowCliRequestShell.js +44 -0
  154. package/dist/orchestrator/src/cli/flowCliShell.js +239 -0
  155. package/dist/orchestrator/src/cli/frontendTestCliRequestShell.js +80 -0
  156. package/dist/orchestrator/src/cli/frontendTestCliShell.js +41 -0
  157. package/dist/orchestrator/src/cli/init.js +95 -1
  158. package/dist/orchestrator/src/cli/initCliShell.js +50 -0
  159. package/dist/orchestrator/src/cli/linearCliShell.js +1200 -0
  160. package/dist/orchestrator/src/cli/mcpEnableCliShell.js +132 -0
  161. package/dist/orchestrator/src/cli/metrics/metricsAggregator.js +3 -2
  162. package/dist/orchestrator/src/cli/metrics/metricsRecorder.js +56 -0
  163. package/dist/orchestrator/src/cli/orchestrator.js +66 -1376
  164. package/dist/orchestrator/src/cli/planCliShell.js +19 -0
  165. package/dist/orchestrator/src/cli/prCliShell.js +41 -0
  166. package/dist/orchestrator/src/cli/providerLinearChildLanePhaseContract.js +204 -0
  167. package/dist/orchestrator/src/cli/providerLinearChildLaneRunner.js +1835 -0
  168. package/dist/orchestrator/src/cli/providerLinearChildLaneShell.js +2420 -0
  169. package/dist/orchestrator/src/cli/providerLinearChildStreamShell.js +385 -0
  170. package/dist/orchestrator/src/cli/providerLinearWorkerRunner.js +6834 -0
  171. package/dist/orchestrator/src/cli/resumeCliShell.js +14 -0
  172. package/dist/orchestrator/src/cli/reviewCliLaunchShell.js +72 -0
  173. package/dist/orchestrator/src/cli/rlm/alignment.js +3 -3
  174. package/dist/orchestrator/src/cli/rlm/context.js +94 -7
  175. package/dist/orchestrator/src/cli/rlm/rlmCodexRuntimeShell.js +546 -0
  176. package/dist/orchestrator/src/cli/rlm/symbolic.js +4 -2
  177. package/dist/orchestrator/src/cli/rlmCliRequestShell.js +42 -0
  178. package/dist/orchestrator/src/cli/rlmCompletionCliShell.js +46 -0
  179. package/dist/orchestrator/src/cli/rlmLaunchCliShell.js +51 -0
  180. package/dist/orchestrator/src/cli/rlmRunner.js +83 -523
  181. package/dist/orchestrator/src/cli/run/blockMemory.js +500 -0
  182. package/dist/orchestrator/src/cli/run/manifest.js +410 -73
  183. package/dist/orchestrator/src/cli/run/manifestPersister.js +45 -14
  184. package/dist/orchestrator/src/cli/run/runMemoryController.js +216 -0
  185. package/dist/orchestrator/src/cli/run/source0.js +690 -0
  186. package/dist/orchestrator/src/cli/run/workspacePath.js +101 -0
  187. package/dist/orchestrator/src/cli/runtime/mode.js +2 -1
  188. package/dist/orchestrator/src/cli/runtime/provider.js +39 -2
  189. package/dist/orchestrator/src/cli/selfCheckCliShell.js +12 -0
  190. package/dist/orchestrator/src/cli/services/commandRunner.js +698 -18
  191. package/dist/orchestrator/src/cli/services/execRuntime.js +66 -1
  192. package/dist/orchestrator/src/cli/services/orchestratorAutoScoutEvidenceRecorder.js +71 -0
  193. package/dist/orchestrator/src/cli/services/orchestratorCloudBranchResolution.js +8 -0
  194. package/dist/orchestrator/src/cli/services/orchestratorCloudEnvironmentResolution.js +22 -0
  195. package/dist/orchestrator/src/cli/services/orchestratorCloudExecutionLifecycleShell.js +39 -0
  196. package/dist/orchestrator/src/cli/services/orchestratorCloudPromptBuilder.js +37 -0
  197. package/dist/orchestrator/src/cli/services/orchestratorCloudRouteFallbackContract.js +45 -0
  198. package/dist/orchestrator/src/cli/services/orchestratorCloudRouteShell.js +36 -0
  199. package/dist/orchestrator/src/cli/services/orchestratorCloudTargetExecutor.js +277 -0
  200. package/dist/orchestrator/src/cli/services/orchestratorControlPlaneLifecycle.js +98 -0
  201. package/dist/orchestrator/src/cli/services/orchestratorControlPlaneLifecycleShell.js +54 -0
  202. package/dist/orchestrator/src/cli/services/orchestratorExecutionLifecycle.js +112 -0
  203. package/dist/orchestrator/src/cli/services/orchestratorExecutionModePolicy.js +27 -0
  204. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteAdapterShell.js +59 -0
  205. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteDecisionShell.js +57 -0
  206. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteState.js +21 -0
  207. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouter.js +2 -0
  208. package/dist/orchestrator/src/cli/services/orchestratorLocalPipelineExecutor.js +149 -0
  209. package/dist/orchestrator/src/cli/services/orchestratorLocalRouteShell.js +63 -0
  210. package/dist/orchestrator/src/cli/services/orchestratorPlanShell.js +54 -0
  211. package/dist/orchestrator/src/cli/services/orchestratorPlanTargetTracker.js +16 -0
  212. package/dist/orchestrator/src/cli/services/orchestratorResumePreparationShell.js +84 -0
  213. package/dist/orchestrator/src/cli/services/orchestratorResumeTokenValidation.js +15 -0
  214. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleCompletion.js +31 -0
  215. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleExecutionRegistration.js +37 -0
  216. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleOrchestrationShell.js +83 -0
  217. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleTaskManagerShell.js +37 -0
  218. package/dist/orchestrator/src/cli/services/orchestratorRuntimeManifestMutation.js +20 -0
  219. package/dist/orchestrator/src/cli/services/orchestratorStartPreparationShell.js +56 -0
  220. package/dist/orchestrator/src/cli/services/orchestratorStatusShell.js +70 -0
  221. package/dist/orchestrator/src/cli/services/pipelineResolver.js +7 -3
  222. package/dist/orchestrator/src/cli/services/plannerMemory.js +119 -0
  223. package/dist/orchestrator/src/cli/services/runPreparation.js +7 -3
  224. package/dist/orchestrator/src/cli/services/runSummaryWriter.js +9 -0
  225. package/dist/orchestrator/src/cli/setupBootstrapShell.js +114 -0
  226. package/dist/orchestrator/src/cli/setupCliShell.js +51 -0
  227. package/dist/orchestrator/src/cli/skillsCliShell.js +56 -0
  228. package/dist/orchestrator/src/cli/startCliRequestShell.js +53 -0
  229. package/dist/orchestrator/src/cli/startCliShell.js +68 -0
  230. package/dist/orchestrator/src/cli/statusCliShell.js +22 -0
  231. package/dist/orchestrator/src/cli/utils/authProvenanceFingerprint.js +27 -0
  232. package/dist/orchestrator/src/cli/utils/cloudPreflight.js +285 -7
  233. package/dist/orchestrator/src/cli/utils/codexFeatures.js +60 -0
  234. package/dist/orchestrator/src/cli/utils/delegationConfigParser.js +250 -0
  235. package/dist/orchestrator/src/cli/utils/delegationMcpHealth.js +1382 -0
  236. package/dist/orchestrator/src/cli/utils/devtools.js +2 -54
  237. package/dist/orchestrator/src/cli/utils/mcpServerEntry.js +53 -0
  238. package/dist/orchestrator/src/cli/utils/packageProgramResolver.js +151 -0
  239. package/dist/orchestrator/src/cli/utils/providerOverrideEnv.js +71 -0
  240. package/dist/orchestrator/src/cli/utils/trailingJsonObject.js +59 -0
  241. package/dist/orchestrator/src/learning/crystalizer.js +2 -2
  242. package/dist/orchestrator/src/manager.js +74 -4
  243. package/dist/orchestrator/src/persistence/ExperienceStore.js +233 -49
  244. package/dist/orchestrator/src/persistence/TaskStateStore.js +6 -6
  245. package/dist/orchestrator/src/persistence/lockFile.js +70 -4
  246. package/dist/orchestrator/src/persistence/sanitizeIdentifier.js +39 -0
  247. package/dist/orchestrator/src/sync/createCloudSyncWorker.js +3 -2
  248. package/dist/orchestrator/src/utils/atomicWrite.js +17 -2
  249. package/dist/packages/orchestrator/src/exec/unified-exec.js +99 -6
  250. package/dist/packages/orchestrator/src/instructions/promptPacks.js +150 -19
  251. package/dist/packages/sdk-node/src/orchestrator.js +137 -13
  252. package/dist/packages/shared/config/designConfig.js +8 -1
  253. package/dist/packages/shared/streams/stdio.js +1 -1
  254. package/dist/scripts/design/pipeline/permit.js +15 -0
  255. package/dist/scripts/lib/docs-catalog.js +399 -0
  256. package/dist/scripts/lib/docs-helpers.js +87 -5
  257. package/dist/scripts/lib/pr-watch-merge.js +1088 -80
  258. package/dist/scripts/lib/provider-run-contract.js +26 -0
  259. package/dist/scripts/lib/review-command-intent-classification.js +532 -0
  260. package/dist/scripts/lib/review-command-probe-classification.js +385 -0
  261. package/dist/scripts/lib/review-execution-boundary-preflight.js +279 -0
  262. package/dist/scripts/lib/review-execution-runtime.js +753 -0
  263. package/dist/scripts/lib/review-execution-state.js +1144 -0
  264. package/dist/scripts/lib/review-execution-telemetry.js +215 -0
  265. package/dist/scripts/lib/review-inspection-target-parsing.js +78 -0
  266. package/dist/scripts/lib/review-launch-attempt.js +601 -0
  267. package/dist/scripts/lib/review-meta-surface-boundary-analysis.js +300 -0
  268. package/dist/scripts/lib/review-meta-surface-normalization.js +746 -0
  269. package/dist/scripts/lib/review-non-interactive-handoff.js +61 -0
  270. package/dist/scripts/lib/review-prompt-context.js +376 -0
  271. package/dist/scripts/lib/review-scope-advisory.js +286 -0
  272. package/dist/scripts/lib/review-scope-paths.js +123 -0
  273. package/dist/scripts/lib/review-shell-command-parser.js +389 -0
  274. package/dist/scripts/lib/review-shell-env-interpreter.js +340 -0
  275. package/dist/scripts/lib/run-manifests.js +192 -36
  276. package/dist/scripts/lib/spark-policy-classifier.js +593 -0
  277. package/dist/scripts/run-review.js +507 -1777
  278. package/docs/README.md +43 -20
  279. package/docs/book/README.md +19 -0
  280. package/docs/book/codex-cli-0124-adoption.md +68 -0
  281. package/docs/book/local-hook-impact.md +73 -0
  282. package/docs/book/operations.md +60 -0
  283. package/docs/book/public-posture.md +34 -0
  284. package/docs/book/setup.md +91 -0
  285. package/docs/book/skills.md +11 -0
  286. package/docs/guides/codex-version-policy.md +104 -0
  287. package/docs/public/downstream-setup.md +113 -0
  288. package/docs/public/provider-onboarding.md +173 -0
  289. package/package.json +23 -10
  290. package/plugins/codex-orchestrator/.codex-plugin/plugin.json +30 -0
  291. package/plugins/codex-orchestrator/.mcp.json +13 -0
  292. package/plugins/codex-orchestrator/launcher.mjs +361 -0
  293. package/schemas/manifest.json +411 -0
  294. package/skills/README.md +26 -0
  295. package/skills/collab-subagents-first/SKILL.md +1 -1
  296. package/skills/delegation-usage/DELEGATION_GUIDE.md +30 -12
  297. package/skills/delegation-usage/SKILL.md +25 -14
  298. package/skills/land/SKILL.md +77 -0
  299. package/skills/linear/SKILL.md +255 -0
  300. package/skills/release/SKILL.md +47 -3
  301. package/skills/standalone-review/SKILL.md +6 -1
  302. package/templates/README.md +4 -2
  303. package/templates/codex/.codex/agents/awaiter-high.toml +2 -2
  304. package/templates/codex/.codex/agents/worker-complex.toml +1 -1
  305. package/templates/codex/.codex/config.toml +3 -4
  306. package/templates/codex/.codex/providers/README.md +13 -0
  307. package/templates/codex/.codex/providers/control.example.json +18 -0
  308. package/templates/codex/.codex/providers/provider.env.example +15 -0
  309. package/templates/codex/AGENTS.md +15 -8
  310. package/templates/codex/mcp-client.json +5 -1
  311. package/docs/assets/setup.gif +0 -0
@@ -4,23 +4,29 @@ import { createRequire } from 'node:module';
4
4
  import { join } from 'node:path';
5
5
  import process from 'node:process';
6
6
  import { resolveCodexHome } from './utils/codexPaths.js';
7
+ import { resolveCodexCliBin } from './utils/codexCli.js';
8
+ import { codexFeatureProbeDisablesMultiAgentV2, codexFeatureProbeRejectsAgentMaxThreads, readCodexFeatureProbe } from './utils/codexFeatures.js';
7
9
  import { findPackageRoot } from './utils/packageInfo.js';
8
10
  import { writeAtomicFile } from '../utils/atomicWrite.js';
9
11
  const require = createRequire(import.meta.url);
10
- const toml = require('@iarna/toml');
11
- const canonicalize = require('canonicalize');
12
- export const BASELINE_MODEL = 'gpt-5.3-codex';
12
+ let tomlLibrary;
13
+ export const BASELINE_MODEL = 'gpt-5.4';
14
+ export const BASELINE_REVIEW_MODEL = BASELINE_MODEL;
15
+ export const CURRENT_CHATGPT_MODEL = 'gpt-5.5';
13
16
  export const BASELINE_REASONING = 'xhigh';
14
17
  export const BASELINE_REASONING_MINIMUM = 'high';
15
18
  export const BASELINE_AGENTS = {
16
19
  max_threads: 12,
17
- max_depth: 4,
18
- max_spawn_depth: 4
20
+ max_depth: 4
19
21
  };
22
+ export const LOCAL_MODEL_OPT_INS = [CURRENT_CHATGPT_MODEL];
23
+ const LOCAL_MODEL_OPT_IN_SET = new Set(LOCAL_MODEL_OPT_INS);
24
+ const CODEX_ORCHESTRATOR_CONFIG_KEY = 'codex_orchestrator';
25
+ const LOCAL_MODEL_OPT_IN_CONFIG_KEY = 'local_model_opt_in';
20
26
  const ROLE_DEFINITIONS = [
21
27
  {
22
28
  key: 'explorer_fast',
23
- description: 'Fast explorer (spark text-only).',
29
+ description: 'Fast explorer (spark file/codebase search only).',
24
30
  fileName: 'explorer-fast.toml',
25
31
  configFile: './agents/explorer-fast.toml',
26
32
  templatePath: join('templates', 'codex', '.codex', 'agents', 'explorer-fast.toml')
@@ -30,26 +36,45 @@ const ROLE_DEFINITIONS = [
30
36
  description: 'Complex implementation role.',
31
37
  fileName: 'worker-complex.toml',
32
38
  configFile: './agents/worker-complex.toml',
33
- templatePath: join('templates', 'codex', '.codex', 'agents', 'worker-complex.toml')
39
+ templatePath: join('templates', 'codex', '.codex', 'agents', 'worker-complex.toml'),
40
+ managedMigrationBaselines: [{ model: 'gpt-5.5', modelReasoningEffort: 'xhigh' }]
34
41
  },
35
42
  {
36
43
  key: 'awaiter',
37
44
  description: 'Awaiter override (keeps awaiter behavior with latest codex/high reasoning).',
38
45
  fileName: 'awaiter-high.toml',
39
46
  configFile: './agents/awaiter-high.toml',
40
- templatePath: join('templates', 'codex', '.codex', 'agents', 'awaiter-high.toml')
47
+ templatePath: join('templates', 'codex', '.codex', 'agents', 'awaiter-high.toml'),
48
+ managedMigrationBaselines: [{ model: 'gpt-5.5', modelReasoningEffort: 'xhigh' }],
49
+ managedMigrationContentVariants: [
50
+ {
51
+ model: 'gpt-5.5',
52
+ modelReasoningEffort: 'high',
53
+ overrideComment: '# with CO portable override to use gpt-5.4 at high reasoning.'
54
+ }
55
+ ]
41
56
  }
42
57
  ];
43
58
  export async function runCodexDefaultsSetup(options = {}) {
44
59
  const env = options.env ?? process.env;
45
60
  const force = Boolean(options.force);
46
61
  const apply = Boolean(options.apply);
47
- const plan = buildPlan(env, force);
62
+ const configState = await loadConfigState(buildConfigPath(env));
63
+ const topLevelLocalModelOptIn = resolveRequestedLocalModelOptIn(configState.parsed, options.authScope);
64
+ const roleAndReviewLocalModelOptIn = resolveRoleAndReviewLocalModelOptIn(configState.parsed, topLevelLocalModelOptIn, options.authScope);
65
+ const authScope = topLevelLocalModelOptIn ? 'chatgpt' : 'portable';
66
+ const plan = buildPlan(env, force, authScope);
48
67
  const roleDefinitions = await loadRoleDefinitions();
49
- const configState = await loadConfigState(plan.configPath);
50
- const nextConfig = mergeBaselineDefaults(configState.parsed, roleDefinitions);
51
- const configChanged = canonicalize(configState.parsed) !== canonicalize(nextConfig);
52
- const roleChanges = await planRoleChanges(plan.agentsDir, force, roleDefinitions);
68
+ const featureProbe = readCodexFeatureProbe(resolveCodexCliBin(env), env);
69
+ const nextConfig = mergeBaselineDefaults(configState.parsed, roleDefinitions, {
70
+ topLevelLocalModelOptIn,
71
+ reviewModelOptIn: roleAndReviewLocalModelOptIn,
72
+ requestedAuthScope: options.authScope,
73
+ featureProbe
74
+ });
75
+ const activeRoleDefinitions = buildActiveRoleDefinitions(roleDefinitions, roleAndReviewLocalModelOptIn);
76
+ const configChanged = canonicalizeConfigValue(configState.parsed) !== canonicalizeConfigValue(nextConfig);
77
+ const roleChanges = await planRoleChanges(plan.agentsDir, force, activeRoleDefinitions);
53
78
  if (!apply) {
54
79
  const changes = buildPlannedChanges({
55
80
  configPath: plan.configPath,
@@ -65,7 +90,7 @@ export async function runCodexDefaultsSetup(options = {}) {
65
90
  }
66
91
  const changes = [];
67
92
  if (configChanged || !configState.exists) {
68
- const rendered = `${toml.stringify(nextConfig)}\n`;
93
+ const rendered = `${getTomlLibrary().stringify(nextConfig)}\n`;
69
94
  await writeAtomicFile(plan.configPath, rendered, { ensureDir: true, encoding: 'utf8' });
70
95
  changes.push({
71
96
  target: 'config',
@@ -73,7 +98,7 @@ export async function runCodexDefaultsSetup(options = {}) {
73
98
  path: plan.configPath,
74
99
  status: configState.exists ? 'updated' : 'created',
75
100
  detail: configState.exists
76
- ? 'Updated CO baseline defaults additively and preserved unrelated keys.'
101
+ ? 'Updated CO-compatible baseline defaults and preserved unrelated keys.'
77
102
  : 'Created config.toml with CO baseline defaults.'
78
103
  });
79
104
  }
@@ -88,9 +113,7 @@ export async function runCodexDefaultsSetup(options = {}) {
88
113
  }
89
114
  await mkdir(plan.agentsDir, { recursive: true });
90
115
  for (const roleChange of roleChanges) {
91
- const shouldWrite = roleChange.existingContent === null
92
- || (force && roleChange.existingContent !== roleChange.definition.content);
93
- if (shouldWrite) {
116
+ if (roleChange.writeReason) {
94
117
  await writeAtomicFile(roleChange.path, roleChange.definition.content, {
95
118
  ensureDir: true,
96
119
  encoding: 'utf8'
@@ -100,9 +123,7 @@ export async function runCodexDefaultsSetup(options = {}) {
100
123
  name: roleChange.definition.key,
101
124
  path: roleChange.path,
102
125
  status: roleChange.existingContent === null ? 'created' : 'updated',
103
- detail: roleChange.existingContent === null
104
- ? `Created ${roleChange.definition.fileName}.`
105
- : `Overwrote ${roleChange.definition.fileName} because --force was set.`
126
+ detail: formatAppliedRoleWriteDetail(roleChange)
106
127
  });
107
128
  continue;
108
129
  }
@@ -127,6 +148,7 @@ export function formatCodexDefaultsSetupSummary(result) {
127
148
  lines.push(`- Config: ${result.plan.configPath}`);
128
149
  lines.push(`- Agents dir: ${result.plan.agentsDir}`);
129
150
  lines.push(`- Force overwrite: ${result.plan.force ? 'yes' : 'no'}`);
151
+ lines.push(`- Auth scope: ${result.plan.authScope}`);
130
152
  lines.push('- Changes:');
131
153
  for (const change of result.changes) {
132
154
  lines.push(` - ${change.target}:${change.name} -> ${change.status} (${change.path})`);
@@ -137,13 +159,18 @@ export function formatCodexDefaultsSetupSummary(result) {
137
159
  }
138
160
  return lines;
139
161
  }
140
- function buildPlan(env, force) {
162
+ function buildConfigPath(env) {
163
+ return join(resolveCodexHome(env), 'config.toml');
164
+ }
165
+ function buildPlan(env, force, authScope) {
166
+ const configPath = buildConfigPath(env);
141
167
  const codexHome = resolveCodexHome(env);
142
168
  return {
143
169
  codexHome,
144
- configPath: join(codexHome, 'config.toml'),
170
+ configPath,
145
171
  agentsDir: join(codexHome, 'agents'),
146
- force
172
+ force,
173
+ authScope
147
174
  };
148
175
  }
149
176
  async function loadConfigState(configPath) {
@@ -152,7 +179,7 @@ async function loadConfigState(configPath) {
152
179
  }
153
180
  const raw = await readFile(configPath, 'utf8');
154
181
  try {
155
- const parsed = toml.parse(raw);
182
+ const parsed = getTomlLibrary().parse(raw);
156
183
  if (!isRecord(parsed)) {
157
184
  throw new Error('top-level TOML document must be a table.');
158
185
  }
@@ -163,14 +190,59 @@ async function loadConfigState(configPath) {
163
190
  throw new Error(`Failed to parse Codex config TOML at ${configPath}: ${reason}`);
164
191
  }
165
192
  }
166
- function mergeBaselineDefaults(existing, roleDefinitions) {
193
+ function getTomlLibrary() {
194
+ if (tomlLibrary) {
195
+ return tomlLibrary;
196
+ }
197
+ if (tomlLibrary === null) {
198
+ throw new Error('Failed to load @iarna/toml.');
199
+ }
200
+ try {
201
+ tomlLibrary = require('@iarna/toml');
202
+ return tomlLibrary;
203
+ }
204
+ catch (error) {
205
+ tomlLibrary = null;
206
+ throw error;
207
+ }
208
+ }
209
+ function canonicalizeConfigValue(value) {
210
+ if (value === null) {
211
+ return 'null';
212
+ }
213
+ if (typeof value === 'boolean' || typeof value === 'number' || typeof value === 'string') {
214
+ return JSON.stringify(value);
215
+ }
216
+ if (Array.isArray(value)) {
217
+ return `[${value.map((entry) => canonicalizeConfigValue(entry) ?? 'null').join(',')}]`;
218
+ }
219
+ if (value && typeof value === 'object') {
220
+ const entries = Object.entries(value)
221
+ .sort(([leftKey], [rightKey]) => leftKey.localeCompare(rightKey))
222
+ .flatMap(([key, entry]) => {
223
+ const canonicalEntry = canonicalizeConfigValue(entry);
224
+ if (typeof canonicalEntry === 'undefined') {
225
+ return [];
226
+ }
227
+ return [`${JSON.stringify(key)}:${canonicalEntry}`];
228
+ });
229
+ return `{${entries.join(',')}}`;
230
+ }
231
+ return undefined;
232
+ }
233
+ function mergeBaselineDefaults(existing, roleDefinitions, options) {
167
234
  const next = structuredClone(existing);
168
- next.model = BASELINE_MODEL;
235
+ next.model = resolveModelDefault(options.topLevelLocalModelOptIn, BASELINE_MODEL);
236
+ next.review_model = resolveModelDefault(options.reviewModelOptIn, BASELINE_REVIEW_MODEL);
169
237
  next.model_reasoning_effort = BASELINE_REASONING;
238
+ removeLegacyLocalModelOptInMarker(next);
170
239
  const agents = isRecord(next.agents) ? structuredClone(next.agents) : {};
171
- agents.max_threads = BASELINE_AGENTS.max_threads;
172
- agents.max_depth = BASELINE_AGENTS.max_depth;
173
- agents.max_spawn_depth = BASELINE_AGENTS.max_spawn_depth;
240
+ if (isMultiAgentV2Enabled(next, options.featureProbe)) {
241
+ delete agents.max_threads;
242
+ }
243
+ else {
244
+ agents.max_threads = BASELINE_AGENTS.max_threads;
245
+ }
174
246
  for (const role of roleDefinitions) {
175
247
  const existingRole = isRecord(agents[role.key])
176
248
  ? structuredClone(agents[role.key])
@@ -182,6 +254,71 @@ function mergeBaselineDefaults(existing, roleDefinitions) {
182
254
  next.agents = agents;
183
255
  return next;
184
256
  }
257
+ export function isLocalModelOptIn(value) {
258
+ return typeof value === 'string' && LOCAL_MODEL_OPT_IN_SET.has(value);
259
+ }
260
+ export function resolveLocalModelOptIn(existing) {
261
+ const localConfig = isRecord(existing[CODEX_ORCHESTRATOR_CONFIG_KEY])
262
+ ? existing[CODEX_ORCHESTRATOR_CONFIG_KEY]
263
+ : null;
264
+ const configuredModel = localConfig?.[LOCAL_MODEL_OPT_IN_CONFIG_KEY];
265
+ return isLocalModelOptIn(configuredModel) ? configuredModel : null;
266
+ }
267
+ function resolveRequestedLocalModelOptIn(existing, requestedAuthScope) {
268
+ if (requestedAuthScope === 'portable') {
269
+ return null;
270
+ }
271
+ if (requestedAuthScope === 'chatgpt') {
272
+ return CURRENT_CHATGPT_MODEL;
273
+ }
274
+ const model = readOptionalString(existing.model);
275
+ const reviewModel = readOptionalString(existing.review_model);
276
+ if (isLocalModelOptIn(model)) {
277
+ return model;
278
+ }
279
+ if (isLocalModelOptIn(reviewModel)) {
280
+ return reviewModel;
281
+ }
282
+ return null;
283
+ }
284
+ function resolveRoleAndReviewLocalModelOptIn(existing, topLevelLocalModelOptIn, requestedAuthScope) {
285
+ if (requestedAuthScope === 'portable') {
286
+ return null;
287
+ }
288
+ if (topLevelLocalModelOptIn) {
289
+ return topLevelLocalModelOptIn;
290
+ }
291
+ const reviewModel = readOptionalString(existing.review_model);
292
+ const existingLocalModelOptIn = resolveLocalModelOptIn(existing);
293
+ return existingLocalModelOptIn === topLevelLocalModelOptIn
294
+ && reviewModel === topLevelLocalModelOptIn
295
+ && isLocalModelOptIn(reviewModel)
296
+ ? reviewModel
297
+ : null;
298
+ }
299
+ function readOptionalString(value) {
300
+ return typeof value === 'string' ? value : undefined;
301
+ }
302
+ function removeLegacyLocalModelOptInMarker(next) {
303
+ const existingConfig = isRecord(next[CODEX_ORCHESTRATOR_CONFIG_KEY])
304
+ ? structuredClone(next[CODEX_ORCHESTRATOR_CONFIG_KEY])
305
+ : {};
306
+ if (LOCAL_MODEL_OPT_IN_CONFIG_KEY in existingConfig) {
307
+ delete existingConfig[LOCAL_MODEL_OPT_IN_CONFIG_KEY];
308
+ if (Object.keys(existingConfig).length > 0) {
309
+ next[CODEX_ORCHESTRATOR_CONFIG_KEY] = existingConfig;
310
+ }
311
+ else {
312
+ delete next[CODEX_ORCHESTRATOR_CONFIG_KEY];
313
+ }
314
+ }
315
+ }
316
+ export function formatModelDefaultExpectation(baseline) {
317
+ return `${CURRENT_CHATGPT_MODEL} when ChatGPT-auth access is verified (fallback: ${baseline})`;
318
+ }
319
+ function resolveModelDefault(localModelOptIn, baseline) {
320
+ return localModelOptIn ?? baseline;
321
+ }
185
322
  async function planRoleChanges(agentsDir, force, roleDefinitions) {
186
323
  const changes = [];
187
324
  for (const definition of roleDefinitions) {
@@ -192,7 +329,8 @@ async function planRoleChanges(agentsDir, force, roleDefinitions) {
192
329
  path,
193
330
  existingContent: null,
194
331
  currentStatus: 'pending',
195
- detail: `Will create ${definition.fileName}.`
332
+ detail: `Will create ${definition.fileName}.`,
333
+ writeReason: 'create'
196
334
  });
197
335
  continue;
198
336
  }
@@ -203,7 +341,8 @@ async function planRoleChanges(agentsDir, force, roleDefinitions) {
203
341
  path,
204
342
  existingContent: current,
205
343
  currentStatus: 'unchanged',
206
- detail: `${definition.fileName} already matches CO baseline defaults.`
344
+ detail: `${definition.fileName} already matches CO baseline defaults.`,
345
+ writeReason: null
207
346
  });
208
347
  continue;
209
348
  }
@@ -213,7 +352,19 @@ async function planRoleChanges(agentsDir, force, roleDefinitions) {
213
352
  path,
214
353
  existingContent: current,
215
354
  currentStatus: 'pending',
216
- detail: `Will overwrite ${definition.fileName} because --force is set.`
355
+ detail: `Will overwrite ${definition.fileName} because --force is set.`,
356
+ writeReason: 'force'
357
+ });
358
+ continue;
359
+ }
360
+ if (definition.managedMigrationContents.includes(current)) {
361
+ changes.push({
362
+ definition,
363
+ path,
364
+ existingContent: current,
365
+ currentStatus: 'pending',
366
+ detail: `Will update ${definition.fileName} from a prior CO-managed model baseline.`,
367
+ writeReason: 'managed_migration'
217
368
  });
218
369
  continue;
219
370
  }
@@ -222,7 +373,8 @@ async function planRoleChanges(agentsDir, force, roleDefinitions) {
222
373
  path,
223
374
  existingContent: current,
224
375
  currentStatus: 'preserved',
225
- detail: `${definition.fileName} already exists; preserving without --force.`
376
+ detail: `${definition.fileName} already exists; preserving without --force.`,
377
+ writeReason: null
226
378
  });
227
379
  }
228
380
  return changes;
@@ -240,10 +392,69 @@ async function loadRoleDefinitions() {
240
392
  const reason = error?.message ?? String(error);
241
393
  throw new Error(`Unable to read role template ${templateFile}: ${reason}`);
242
394
  }
243
- loaded.push({ ...definition, content });
395
+ loaded.push({
396
+ ...definition,
397
+ content,
398
+ managedMigrationContents: buildManagedMigrationContents(content, definition)
399
+ });
244
400
  }
245
401
  return loaded;
246
402
  }
403
+ function buildActiveRoleDefinitions(roleDefinitions, localModelOptIn) {
404
+ if (!localModelOptIn) {
405
+ return [...roleDefinitions];
406
+ }
407
+ return roleDefinitions.map((definition) => {
408
+ const matchingOptInBaseline = definition.managedMigrationBaselines?.find((baseline) => baseline.model === localModelOptIn);
409
+ if (!matchingOptInBaseline) {
410
+ return definition;
411
+ }
412
+ const optInContent = applyRoleBaselineOverrides(definition.content, definition.fileName, matchingOptInBaseline);
413
+ return {
414
+ ...definition,
415
+ content: optInContent,
416
+ managedMigrationContents: uniqueRoleContents([
417
+ definition.content,
418
+ ...definition.managedMigrationContents
419
+ ]).filter((migrationContent) => migrationContent !== optInContent)
420
+ };
421
+ });
422
+ }
423
+ function buildManagedMigrationContents(content, definition) {
424
+ const migrationContents = [
425
+ ...(definition.managedMigrationBaselines ?? []),
426
+ ...(definition.managedMigrationContentVariants ?? [])
427
+ ].map((baseline) => applyRoleBaselineOverrides(content, definition.fileName, baseline));
428
+ return uniqueRoleContents(migrationContents).filter((migrationContent) => migrationContent !== content);
429
+ }
430
+ function uniqueRoleContents(contents) {
431
+ return [...new Set(contents)];
432
+ }
433
+ function formatAppliedRoleWriteDetail(roleChange) {
434
+ switch (roleChange.writeReason) {
435
+ case 'create':
436
+ return `Created ${roleChange.definition.fileName}.`;
437
+ case 'force':
438
+ return `Overwrote ${roleChange.definition.fileName} because --force was set.`;
439
+ case 'managed_migration':
440
+ return `Updated ${roleChange.definition.fileName} from a prior CO-managed model baseline.`;
441
+ case null:
442
+ return roleChange.detail;
443
+ }
444
+ }
445
+ function applyRoleBaselineOverrides(content, fileName, baseline) {
446
+ let next = replaceRoleTomlString(content, 'model', baseline.model, fileName);
447
+ next = replaceRoleTomlString(next, 'model_reasoning_effort', baseline.modelReasoningEffort, fileName);
448
+ return next.replace(/^# with CO override to use .+ at .+ reasoning\.$/m, baseline.overrideComment
449
+ ?? `# with CO override to use ${baseline.model} at ${baseline.modelReasoningEffort} reasoning.`);
450
+ }
451
+ function replaceRoleTomlString(content, key, value, fileName) {
452
+ const pattern = new RegExp(`^(${key}\\s*=\\s*)"[^"]*"$`, 'm');
453
+ if (!pattern.test(content)) {
454
+ throw new Error(`Role template ${fileName} is missing a ${key} assignment.`);
455
+ }
456
+ return content.replace(pattern, (_match, prefix) => `${prefix}"${value}"`);
457
+ }
247
458
  function buildPlannedChanges(params) {
248
459
  const changes = [];
249
460
  const configStatus = params.configChanged || !params.configExists ? 'pending' : 'unchanged';
@@ -254,7 +465,7 @@ function buildPlannedChanges(params) {
254
465
  status: configStatus,
255
466
  detail: configStatus === 'pending'
256
467
  ? params.configExists
257
- ? 'Will update CO baseline defaults additively while preserving unrelated keys.'
468
+ ? 'Will update CO-compatible baseline defaults while preserving unrelated keys.'
258
469
  : 'Will create config.toml with CO baseline defaults.'
259
470
  : 'CO baseline defaults already present.'
260
471
  });
@@ -272,3 +483,21 @@ function buildPlannedChanges(params) {
272
483
  function isRecord(value) {
273
484
  return typeof value === 'object' && value !== null && !Array.isArray(value) && (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null);
274
485
  }
486
+ function isMultiAgentV2Enabled(config, featureProbe) {
487
+ if (featureProbe.flags?.multi_agent_v2 === true) {
488
+ return true;
489
+ }
490
+ if (codexFeatureProbeDisablesMultiAgentV2(featureProbe)) {
491
+ return false;
492
+ }
493
+ if (codexFeatureProbeRejectsAgentMaxThreads(featureProbe)) {
494
+ return true;
495
+ }
496
+ if (!isRecord(config.features)) {
497
+ return false;
498
+ }
499
+ return readBooleanValue(config.features.multi_agent_v2) === true;
500
+ }
501
+ function readBooleanValue(value) {
502
+ return typeof value === 'boolean' ? value : null;
503
+ }