@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
@@ -0,0 +1,385 @@
1
+ import { REVIEW_SHELL_COMMANDS, extractShellCommandPayload, normalizeCommandToken, normalizeShellCommandPathSeparators, splitShellControlSegments, splitShellControlSegmentsDetailed, stripLeadingEnvAssignments, tokenizeShellSegment, unwrapEnvCommandTokens } from './review-shell-command-parser.js';
2
+ export const REVIEW_HEAVY_SCRIPT_TARGETS = new Set([
3
+ 'test',
4
+ 'lint',
5
+ 'build',
6
+ 'typecheck',
7
+ 'check',
8
+ 'docs:check',
9
+ 'docs:freshness',
10
+ 'docs:freshness:maintain'
11
+ ]);
12
+ const REVIEW_PACKAGE_RUN_SUBCOMMAND_ALIASES = new Set(['run', 'run-script', 'rum', 'urn']);
13
+ const REVIEW_PACKAGE_TEST_SUBCOMMAND_ALIASES = new Set(['test', 't', 'tst']);
14
+ const REVIEW_SHELL_PROBE_ENV_VARS = new Set(['MANIFEST', 'RUNNER_LOG', 'RUN_LOG']);
15
+ const REVIEW_DIRECT_VALIDATION_RUNNERS = new Set(['vitest', 'jest', 'pytest']);
16
+ const REVIEW_LIKELY_COMMANDS = new Set([
17
+ 'npm',
18
+ 'pnpm',
19
+ 'yarn',
20
+ 'bun',
21
+ 'npx',
22
+ 'bunx',
23
+ 'git',
24
+ 'bash',
25
+ 'sh',
26
+ 'zsh',
27
+ 'ksh',
28
+ 'fish',
29
+ 'python',
30
+ 'python3',
31
+ 'py',
32
+ 'pytest',
33
+ 'go',
34
+ 'cargo',
35
+ 'mvn',
36
+ 'mvnw',
37
+ 'gradle',
38
+ 'gradlew',
39
+ 'node',
40
+ 'codex',
41
+ 'codex-orchestrator',
42
+ 'cmd',
43
+ 'powershell',
44
+ 'pwsh',
45
+ 'sed',
46
+ 'rg',
47
+ 'grep',
48
+ 'cat',
49
+ 'head',
50
+ 'tail',
51
+ 'nl',
52
+ 'awk',
53
+ 'find',
54
+ 'ls'
55
+ ]);
56
+ function normalizeReviewCommandLine(line) {
57
+ const trimmed = line.trim();
58
+ if (!trimmed) {
59
+ return '';
60
+ }
61
+ const succeededIndex = trimmed.indexOf(' succeeded in ');
62
+ if (succeededIndex >= 0) {
63
+ return trimmed.slice(0, succeededIndex).trimEnd();
64
+ }
65
+ const exitedIndex = trimmed.indexOf(' exited ');
66
+ if (exitedIndex >= 0) {
67
+ return trimmed.slice(0, exitedIndex).trimEnd();
68
+ }
69
+ return trimmed;
70
+ }
71
+ function packageOptionConsumesValue(option) {
72
+ if (/^--(?:prefix|workspace|filter|cwd)$/iu.test(option)) {
73
+ return true;
74
+ }
75
+ if (/^-(?:C|w)$/iu.test(option)) {
76
+ return true;
77
+ }
78
+ return false;
79
+ }
80
+ export function resolvePackageScriptTarget(args) {
81
+ let index = 0;
82
+ while (index < args.length) {
83
+ const token = args[index] ?? '';
84
+ const normalized = token.toLowerCase();
85
+ if (normalized === '--') {
86
+ const fallback = args[index + 1];
87
+ return fallback ? fallback.toLowerCase() : null;
88
+ }
89
+ if (REVIEW_PACKAGE_TEST_SUBCOMMAND_ALIASES.has(normalized)) {
90
+ return 'test';
91
+ }
92
+ if (REVIEW_PACKAGE_RUN_SUBCOMMAND_ALIASES.has(normalized)) {
93
+ index += 1;
94
+ while (index < args.length) {
95
+ const candidate = args[index] ?? '';
96
+ const candidateNormalized = candidate.toLowerCase();
97
+ if (candidateNormalized === '--') {
98
+ index += 1;
99
+ continue;
100
+ }
101
+ if (candidate.startsWith('-')) {
102
+ index += packageOptionConsumesValue(candidate) ? 2 : 1;
103
+ continue;
104
+ }
105
+ return candidateNormalized;
106
+ }
107
+ return null;
108
+ }
109
+ if (token.startsWith('-')) {
110
+ index += packageOptionConsumesValue(token) ? 2 : 1;
111
+ continue;
112
+ }
113
+ return normalized;
114
+ }
115
+ return null;
116
+ }
117
+ function hasHeavyCommandTokens(tokens) {
118
+ if (tokens.length === 0) {
119
+ return false;
120
+ }
121
+ const unwrappedTokens = unwrapEnvCommandTokens(tokens);
122
+ if (unwrappedTokens.length === 0) {
123
+ return false;
124
+ }
125
+ if (unwrappedTokens.length !== tokens.length) {
126
+ return hasHeavyCommandTokens(unwrappedTokens);
127
+ }
128
+ const command = normalizeCommandToken(unwrappedTokens[0] ?? '');
129
+ const args = unwrappedTokens.slice(1);
130
+ if (REVIEW_DIRECT_VALIDATION_RUNNERS.has(command)) {
131
+ return true;
132
+ }
133
+ if (command === 'npm' || command === 'pnpm' || command === 'yarn' || command === 'bun') {
134
+ const scriptTarget = resolvePackageScriptTarget(args);
135
+ return scriptTarget !== null && REVIEW_HEAVY_SCRIPT_TARGETS.has(scriptTarget);
136
+ }
137
+ const launcherTarget = resolveValidationLauncherTarget(command, args);
138
+ if (launcherTarget !== null && REVIEW_DIRECT_VALIDATION_RUNNERS.has(launcherTarget)) {
139
+ return true;
140
+ }
141
+ if (command === 'python' || command === 'python3' || command === 'py') {
142
+ for (let index = 0; index < args.length - 1; index += 1) {
143
+ if ((args[index] ?? '').toLowerCase() !== '-m') {
144
+ continue;
145
+ }
146
+ if (normalizeCommandToken(args[index + 1] ?? '') === 'pytest') {
147
+ return true;
148
+ }
149
+ }
150
+ }
151
+ const firstArg = normalizeCommandToken(args[0] ?? '');
152
+ if (command === 'go' && firstArg === 'test') {
153
+ return true;
154
+ }
155
+ if (command === 'cargo' && firstArg === 'test') {
156
+ return true;
157
+ }
158
+ if (command === 'mvn' || command === 'mvnw' || command === 'gradle' || command === 'gradlew') {
159
+ return args.some((arg) => {
160
+ const normalized = normalizeCommandToken(arg);
161
+ return normalized === 'test' || normalized.endsWith(':test');
162
+ });
163
+ }
164
+ return false;
165
+ }
166
+ function resolveValidationLauncherTarget(command, args) {
167
+ if (command === 'npx' || command === 'bunx') {
168
+ return resolveFirstBinaryLauncherTarget(args);
169
+ }
170
+ const firstArg = normalizeCommandToken(args[0] ?? '');
171
+ if (command === 'npm' && firstArg === 'exec') {
172
+ return resolveFirstBinaryLauncherTarget(args.slice(1), { skipDlx: false });
173
+ }
174
+ if (command === 'pnpm' && (firstArg === 'dlx' || firstArg === 'exec')) {
175
+ return resolveFirstBinaryLauncherTarget(args.slice(1), { skipDlx: false });
176
+ }
177
+ if (command === 'yarn' && (firstArg === 'dlx' || firstArg === 'exec')) {
178
+ return resolveFirstBinaryLauncherTarget(args.slice(1), { skipDlx: false });
179
+ }
180
+ if (command === 'bun' && firstArg === 'x') {
181
+ return resolveFirstBinaryLauncherTarget(args.slice(1), { skipDlx: false });
182
+ }
183
+ return null;
184
+ }
185
+ function resolveFirstBinaryLauncherTarget(args, options = {}) {
186
+ let index = 0;
187
+ while (index < args.length) {
188
+ const token = args[index] ?? '';
189
+ const normalized = token.toLowerCase();
190
+ if (normalized === '--') {
191
+ const target = args[index + 1];
192
+ return target ? normalizeCommandToken(target) : null;
193
+ }
194
+ if (options.skipDlx !== false && (normalized === 'dlx' || normalized === 'exec')) {
195
+ index += 1;
196
+ continue;
197
+ }
198
+ if (token.startsWith('-')) {
199
+ index += binaryLauncherOptionExpectsValue(token) && !token.includes('=') ? 2 : 1;
200
+ continue;
201
+ }
202
+ return normalizeCommandToken(token);
203
+ }
204
+ return null;
205
+ }
206
+ function binaryLauncherOptionExpectsValue(option) {
207
+ const normalized = option.toLowerCase();
208
+ return (normalized === '-p' ||
209
+ normalized === '--package' ||
210
+ normalized === '-c' ||
211
+ normalized === '--call' ||
212
+ normalized === '--node-options');
213
+ }
214
+ function detectHeavyReviewCommandFromSegment(segment, depth = 0) {
215
+ const tokens = stripLeadingEnvAssignments(tokenizeShellSegment(segment));
216
+ if (tokens.length === 0) {
217
+ return null;
218
+ }
219
+ if (depth < 3) {
220
+ const payload = extractShellCommandPayload(tokens);
221
+ if (payload) {
222
+ const nestedSegments = splitShellControlSegments(normalizeShellCommandPathSeparators(payload));
223
+ for (const nestedSegment of nestedSegments) {
224
+ const nestedHeavyCommand = detectHeavyReviewCommandFromSegment(nestedSegment, depth + 1);
225
+ if (nestedHeavyCommand) {
226
+ return nestedHeavyCommand;
227
+ }
228
+ }
229
+ }
230
+ }
231
+ return hasHeavyCommandTokens(tokens) ? segment.trim() : null;
232
+ }
233
+ export function detectHeavyReviewCommand(commandLine) {
234
+ const normalized = normalizeShellCommandPathSeparators(normalizeReviewCommandLine(commandLine));
235
+ const segments = splitShellControlSegments(normalized);
236
+ for (const segment of segments) {
237
+ const heavyCommand = detectHeavyReviewCommandFromSegment(segment);
238
+ if (heavyCommand) {
239
+ return heavyCommand;
240
+ }
241
+ }
242
+ return null;
243
+ }
244
+ export function tokenReferencesReviewShellProbeEnvVar(token) {
245
+ const normalized = token.trim().toUpperCase();
246
+ if (!normalized) {
247
+ return false;
248
+ }
249
+ for (const envVar of REVIEW_SHELL_PROBE_ENV_VARS) {
250
+ if (normalized === envVar) {
251
+ return true;
252
+ }
253
+ if (new RegExp(`\\$${envVar}(?=$|[^A-Z0-9_])`, 'u').test(normalized)) {
254
+ return true;
255
+ }
256
+ if (new RegExp(`\\$\\{${envVar}(?=$|[:}?+\\-/])`, 'u').test(normalized)) {
257
+ return true;
258
+ }
259
+ if (new RegExp(`(^|[^A-Z0-9_])${envVar}(?=$|[^A-Z0-9_])`, 'u').test(normalized)) {
260
+ return true;
261
+ }
262
+ }
263
+ return false;
264
+ }
265
+ function grepOptionConsumesValue(option) {
266
+ const normalized = option.toLowerCase();
267
+ return (normalized === '-e' ||
268
+ normalized === '-f' ||
269
+ normalized === '-m' ||
270
+ normalized === '--regexp' ||
271
+ normalized === '--file' ||
272
+ normalized === '--max-count' ||
273
+ normalized === '--after-context' ||
274
+ normalized === '--before-context' ||
275
+ normalized === '--context');
276
+ }
277
+ export function grepSegmentUsesExplicitSearchTargets(args) {
278
+ let patternConsumed = false;
279
+ for (let index = 0; index < args.length; index += 1) {
280
+ const arg = args[index] ?? '';
281
+ if (!patternConsumed) {
282
+ if (arg === '--') {
283
+ continue;
284
+ }
285
+ if (grepOptionConsumesValue(arg)) {
286
+ if (index + 1 < args.length) {
287
+ if (arg === '-e' || arg === '--regexp') {
288
+ patternConsumed = true;
289
+ }
290
+ index += 1;
291
+ }
292
+ continue;
293
+ }
294
+ if (arg.startsWith('-') && arg !== '-') {
295
+ continue;
296
+ }
297
+ patternConsumed = true;
298
+ continue;
299
+ }
300
+ if (arg === '--') {
301
+ continue;
302
+ }
303
+ if (arg.startsWith('<')) {
304
+ continue;
305
+ }
306
+ return true;
307
+ }
308
+ return false;
309
+ }
310
+ function segmentLooksLikeShellProbe(rawTokens, depth = 0) {
311
+ const strippedTokens = stripLeadingEnvAssignments(rawTokens);
312
+ if (strippedTokens.length === 0) {
313
+ return false;
314
+ }
315
+ const tokens = unwrapEnvCommandTokens(strippedTokens);
316
+ if (tokens.length === 0) {
317
+ return false;
318
+ }
319
+ const command = normalizeCommandToken(tokens[0] ?? '');
320
+ const args = tokens.slice(1);
321
+ if (depth < 3 && REVIEW_SHELL_COMMANDS.has(command)) {
322
+ const nestedPayload = extractShellCommandPayload(tokens);
323
+ return nestedPayload ? payloadContainsShellProbe(nestedPayload, depth + 1) : false;
324
+ }
325
+ const referencesReviewEnvVar = args.some((token) => tokenReferencesReviewShellProbeEnvVar(token));
326
+ if (!referencesReviewEnvVar) {
327
+ return false;
328
+ }
329
+ if (command === 'printf' || command === 'echo' || command === 'printenv') {
330
+ return true;
331
+ }
332
+ if (command === 'grep') {
333
+ return !grepSegmentUsesExplicitSearchTargets(args);
334
+ }
335
+ if (command === 'declare' || command === 'typeset') {
336
+ return args.some((arg) => arg === '-p' || arg === '-xp' || arg === '-px');
337
+ }
338
+ return false;
339
+ }
340
+ function payloadContainsShellProbe(payload, depth = 0) {
341
+ const segments = splitShellControlSegmentsDetailed(normalizeShellCommandPathSeparators(payload));
342
+ for (const { segment } of segments) {
343
+ if (segmentLooksLikeShellProbe(tokenizeShellSegment(segment), depth)) {
344
+ return true;
345
+ }
346
+ }
347
+ return false;
348
+ }
349
+ export function classifyShellProbeCommandLine(commandLine) {
350
+ const normalized = normalizeShellCommandPathSeparators(normalizeReviewCommandLine(commandLine));
351
+ if (detectHeavyReviewCommand(normalized)) {
352
+ return null;
353
+ }
354
+ const shellTokens = stripLeadingEnvAssignments(tokenizeShellSegment(normalized));
355
+ const payload = extractShellCommandPayload(shellTokens);
356
+ if (!payload) {
357
+ return null;
358
+ }
359
+ return payloadContainsShellProbe(payload) ? normalized : null;
360
+ }
361
+ export function isLikelyReviewCommandLine(line) {
362
+ const normalized = normalizeShellCommandPathSeparators(normalizeReviewCommandLine(line));
363
+ if (!normalized) {
364
+ return false;
365
+ }
366
+ if (detectHeavyReviewCommand(normalized)) {
367
+ return true;
368
+ }
369
+ const segments = splitShellControlSegments(normalized);
370
+ for (const segment of segments) {
371
+ const shellTokens = stripLeadingEnvAssignments(tokenizeShellSegment(segment));
372
+ if (extractShellCommandPayload(shellTokens)) {
373
+ return true;
374
+ }
375
+ const unwrappedTokens = unwrapEnvCommandTokens(shellTokens);
376
+ const command = normalizeCommandToken(unwrappedTokens[0] ?? shellTokens[0] ?? '');
377
+ if (REVIEW_LIKELY_COMMANDS.has(command)) {
378
+ return true;
379
+ }
380
+ }
381
+ if (normalized.includes(' in ') && /\s-\w+\s+/u.test(normalized)) {
382
+ return true;
383
+ }
384
+ return false;
385
+ }
@@ -0,0 +1,279 @@
1
+ import path from 'node:path';
2
+ import { formatRuntimeSelectionSummary } from '../../orchestrator/src/cli/runtime/index.js';
3
+ import { ARCHITECTURE_ALLOWED_META_SURFACE_KINDS, AUDIT_ALLOWED_META_SURFACE_KINDS, formatDurationMs } from './review-execution-state.js';
4
+ import { resolveReviewRuntimeContext } from './review-launch-attempt.js';
5
+ export const DEFAULT_REVIEW_STARTUP_LOOP_MIN_EVENTS = 8;
6
+ export const DEFAULT_REVIEW_MONITOR_INTERVAL_SECONDS = 60;
7
+ export const REVIEW_MONITOR_INTERVAL_ENV_KEY = 'CODEX_REVIEW_MONITOR_INTERVAL_SECONDS';
8
+ export const REVIEW_ALLOW_HEAVY_COMMANDS_ENV_KEY = 'CODEX_REVIEW_ALLOW_HEAVY_COMMANDS';
9
+ export const REVIEW_ENFORCE_BOUNDED_MODE_ENV_KEY = 'CODEX_REVIEW_ENFORCE_BOUNDED_MODE';
10
+ export const REVIEW_LOW_SIGNAL_TIMEOUT_ENV_KEY = 'CODEX_REVIEW_LOW_SIGNAL_TIMEOUT_SECONDS';
11
+ export const REVIEW_VERDICT_STABILITY_TIMEOUT_ENV_KEY = 'CODEX_REVIEW_VERDICT_STABILITY_TIMEOUT_SECONDS';
12
+ export const REVIEW_META_SURFACE_TIMEOUT_ENV_KEY = 'CODEX_REVIEW_META_SURFACE_TIMEOUT_SECONDS';
13
+ export function allowHeavyReviewCommands(env = process.env) {
14
+ return envFlagEnabled(env[REVIEW_ALLOW_HEAVY_COMMANDS_ENV_KEY]);
15
+ }
16
+ export function enforceBoundedReviewMode(env = process.env) {
17
+ return envFlagEnabled(env[REVIEW_ENFORCE_BOUNDED_MODE_ENV_KEY]);
18
+ }
19
+ export async function prepareReviewExecutionBoundaryPreflight(options) {
20
+ const resolveRuntimeContext = options.resolveReviewRuntimeContextFn ?? resolveReviewRuntimeContext;
21
+ const runtimeContext = await resolveRuntimeContext({
22
+ options: options.cliOptions,
23
+ manifestPath: options.manifestPath,
24
+ env: options.env,
25
+ repoRoot: options.repoRoot
26
+ });
27
+ console.log(`[run-review] ${formatRuntimeSelectionSummary(runtimeContext.runtime)}.`);
28
+ const timeoutMs = resolveReviewTimeoutMs(options.env);
29
+ if (timeoutMs !== null) {
30
+ console.log(`[run-review] enforcing codex review timeout at ${Math.round(timeoutMs / 1000)}s (configured via CODEX_REVIEW_TIMEOUT_SECONDS).`);
31
+ }
32
+ const stallTimeoutMs = resolveReviewStallTimeoutMs(options.env);
33
+ if (stallTimeoutMs !== null) {
34
+ console.log(`[run-review] enforcing codex review stall timeout at ${Math.round(stallTimeoutMs / 1000)}s of no output (configured via CODEX_REVIEW_STALL_TIMEOUT_SECONDS).`);
35
+ }
36
+ const startupLoopTimeoutMs = resolveReviewStartupLoopTimeoutMs(options.env);
37
+ const startupLoopMinEvents = resolveReviewStartupLoopMinEvents(options.env);
38
+ if (startupLoopTimeoutMs !== null) {
39
+ console.log(`[run-review] enforcing delegation-startup loop timeout at ${Math.round(startupLoopTimeoutMs / 1000)}s after ${startupLoopMinEvents} startup events (configured via CODEX_REVIEW_STARTUP_LOOP_TIMEOUT_SECONDS).`);
40
+ }
41
+ const monitorIntervalMs = resolveReviewMonitorIntervalMs(options.env);
42
+ if (monitorIntervalMs === null) {
43
+ console.log('[run-review] patience-first monitor checkpoints disabled (configured via CODEX_REVIEW_MONITOR_INTERVAL_SECONDS=0).');
44
+ }
45
+ else {
46
+ console.log(`[run-review] patience-first monitor checkpoints every ${formatDurationMs(monitorIntervalMs)} (set CODEX_REVIEW_MONITOR_INTERVAL_SECONDS=0 to disable).`);
47
+ }
48
+ const lowSignalTimeoutMs = options.allowHeavyCommands
49
+ ? null
50
+ : resolveReviewLowSignalTimeoutMs(options.env);
51
+ const verdictStabilityTimeoutMs = options.allowHeavyCommands
52
+ ? null
53
+ : resolveReviewVerdictStabilityTimeoutMs(options.env);
54
+ const metaSurfaceTimeoutMs = options.allowHeavyCommands
55
+ ? null
56
+ : resolveReviewMetaSurfaceTimeoutMs(options.env);
57
+ const allowedMetaSurfaceKinds = options.reviewSurface === 'audit'
58
+ ? AUDIT_ALLOWED_META_SURFACE_KINDS
59
+ : options.reviewSurface === 'architecture'
60
+ ? ARCHITECTURE_ALLOWED_META_SURFACE_KINDS
61
+ : [];
62
+ const architectureRelevantPaths = options.reviewSurface === 'architecture'
63
+ ? options.architectureSurfacePaths
64
+ .map((entry) => path.relative(options.repoRoot, entry))
65
+ .filter((entry) => entry.length > 0)
66
+ : [];
67
+ const touchedPaths = options.reviewSurface === 'architecture'
68
+ ? [...new Set([...options.scopeTouchedPaths, ...architectureRelevantPaths])]
69
+ : [...options.scopeTouchedPaths];
70
+ const startupAnchorMode = options.allowHeavyCommands
71
+ ? null
72
+ : options.reviewSurface === 'audit'
73
+ ? 'audit'
74
+ : options.reviewSurface === 'diff' && touchedPaths.length > 0
75
+ ? 'diff'
76
+ : null;
77
+ const enforceStartupAnchorBoundary = startupAnchorMode !== null;
78
+ const enforceActiveCloseoutBundleRereadBoundary = options.reviewSurface === 'diff' &&
79
+ !options.allowHeavyCommands &&
80
+ options.activeCloseoutBundleRoots.length > 0;
81
+ const announceRelevantReinspectionDwellBoundary = (options.reviewSurface === 'diff' || options.reviewSurface === 'architecture') &&
82
+ !options.allowHeavyCommands &&
83
+ touchedPaths.length > 0;
84
+ const enforceRelevantReinspectionDwellBoundary = announceRelevantReinspectionDwellBoundary && lowSignalTimeoutMs !== null;
85
+ const auditStartupAnchorPaths = options.reviewSurface === 'audit'
86
+ ? [options.manifestPath, ...(options.runnerLogExists ? [options.runnerLogPath] : [])]
87
+ : [];
88
+ const allowedMetaSurfacePaths = options.reviewSurface === 'audit'
89
+ ? [...auditStartupAnchorPaths]
90
+ : options.reviewSurface === 'architecture'
91
+ ? [...options.architectureSurfacePaths]
92
+ : [];
93
+ const auditStartupAnchorEnvVarPaths = options.reviewSurface === 'audit'
94
+ ? {
95
+ MANIFEST: options.manifestPath,
96
+ ...(options.runnerLogExists
97
+ ? { RUNNER_LOG: options.runnerLogPath, RUN_LOG: options.runnerLogPath }
98
+ : {})
99
+ }
100
+ : {};
101
+ const allowedMetaSurfaceEnvVarPaths = options.reviewSurface === 'audit' ? { ...auditStartupAnchorEnvVarPaths } : {};
102
+ if (!options.allowHeavyCommands) {
103
+ if (lowSignalTimeoutMs === null) {
104
+ console.log(`[run-review] low-signal drift guard disabled (${REVIEW_LOW_SIGNAL_TIMEOUT_ENV_KEY}=0).`);
105
+ }
106
+ else {
107
+ console.log(`[run-review] low-signal drift guard enabled after ${formatDurationMs(lowSignalTimeoutMs)} of repetitive bounded activity (set ${REVIEW_LOW_SIGNAL_TIMEOUT_ENV_KEY}=0 to disable).`);
108
+ }
109
+ if (verdictStabilityTimeoutMs === null) {
110
+ console.log(`[run-review] verdict-stability guard disabled (${REVIEW_VERDICT_STABILITY_TIMEOUT_ENV_KEY}=0).`);
111
+ }
112
+ else {
113
+ console.log(`[run-review] verdict-stability guard enabled after ${formatDurationMs(verdictStabilityTimeoutMs)} of repeated speculative no-progress output (set ${REVIEW_VERDICT_STABILITY_TIMEOUT_ENV_KEY}=0 to disable).`);
114
+ }
115
+ if (metaSurfaceTimeoutMs === null) {
116
+ console.log(`[run-review] meta-surface expansion guard disabled (${REVIEW_META_SURFACE_TIMEOUT_ENV_KEY}=0).`);
117
+ }
118
+ else if (allowedMetaSurfaceKinds.length > 0) {
119
+ const allowedMetaSurfaceLabel = options.reviewSurface === 'audit'
120
+ ? 'allowed audit meta surfaces'
121
+ : 'allowed architecture meta surfaces';
122
+ console.log(`[run-review] meta-surface expansion guard enabled after ${formatDurationMs(metaSurfaceTimeoutMs)} of sustained off-task meta activity; ${allowedMetaSurfaceLabel}: ${allowedMetaSurfaceKinds.join(', ')} (set ${REVIEW_META_SURFACE_TIMEOUT_ENV_KEY}=0 to disable).`);
123
+ }
124
+ else {
125
+ console.log(`[run-review] meta-surface expansion guard enabled after ${formatDurationMs(metaSurfaceTimeoutMs)} of sustained off-task meta activity (set ${REVIEW_META_SURFACE_TIMEOUT_ENV_KEY}=0 to disable).`);
126
+ }
127
+ if (startupAnchorMode === 'diff') {
128
+ console.log('[run-review] startup-anchor boundary enabled for diff mode; repeated memory/skills/review-docs/manifest/review-artifact reads before the first startup anchor will terminate the review.');
129
+ }
130
+ else if (startupAnchorMode === 'audit') {
131
+ console.log('[run-review] startup-anchor boundary enabled for audit mode; repeated memory/skills/review-doc reads before the first manifest/runner-log startup anchor will terminate the review.');
132
+ }
133
+ if (announceRelevantReinspectionDwellBoundary) {
134
+ if (lowSignalTimeoutMs === null) {
135
+ console.log(`[run-review] bounded relevant reinspection dwell boundary disabled (${REVIEW_LOW_SIGNAL_TIMEOUT_ENV_KEY}=0).`);
136
+ }
137
+ else {
138
+ console.log(`[run-review] bounded relevant reinspection dwell boundary enabled after ${formatDurationMs(lowSignalTimeoutMs)} of repetitive on-task reinspection without concrete findings (set ${REVIEW_LOW_SIGNAL_TIMEOUT_ENV_KEY}=0 to disable).`);
139
+ }
140
+ }
141
+ }
142
+ return {
143
+ runtimeContext,
144
+ timeoutMs,
145
+ stallTimeoutMs,
146
+ startupLoopTimeoutMs,
147
+ startupLoopMinEvents,
148
+ monitorIntervalMs,
149
+ lowSignalTimeoutMs,
150
+ verdictStabilityTimeoutMs,
151
+ metaSurfaceTimeoutMs,
152
+ allowedMetaSurfaceKinds: [...allowedMetaSurfaceKinds],
153
+ touchedPaths,
154
+ startupAnchorMode,
155
+ enforceStartupAnchorBoundary,
156
+ enforceActiveCloseoutBundleRereadBoundary,
157
+ enforceRelevantReinspectionDwellBoundary,
158
+ auditStartupAnchorPaths,
159
+ allowedMetaSurfacePaths,
160
+ auditStartupAnchorEnvVarPaths,
161
+ allowedMetaSurfaceEnvVarPaths
162
+ };
163
+ }
164
+ export function resolveReviewTimeoutMs(env = process.env) {
165
+ const configured = env.CODEX_REVIEW_TIMEOUT_SECONDS?.trim();
166
+ if (!configured) {
167
+ return null;
168
+ }
169
+ const parsedSeconds = Number(configured);
170
+ if (!Number.isFinite(parsedSeconds)) {
171
+ throw new Error('CODEX_REVIEW_TIMEOUT_SECONDS must be a finite number.');
172
+ }
173
+ if (parsedSeconds <= 0) {
174
+ return null;
175
+ }
176
+ return Math.round(parsedSeconds * 1000);
177
+ }
178
+ export function resolveReviewStallTimeoutMs(env = process.env) {
179
+ const configured = env.CODEX_REVIEW_STALL_TIMEOUT_SECONDS?.trim();
180
+ if (!configured) {
181
+ return null;
182
+ }
183
+ const parsedSeconds = Number(configured);
184
+ if (!Number.isFinite(parsedSeconds)) {
185
+ throw new Error('CODEX_REVIEW_STALL_TIMEOUT_SECONDS must be a finite number.');
186
+ }
187
+ if (parsedSeconds <= 0) {
188
+ return null;
189
+ }
190
+ return Math.round(parsedSeconds * 1000);
191
+ }
192
+ export function resolveReviewStartupLoopTimeoutMs(env = process.env) {
193
+ const configured = env.CODEX_REVIEW_STARTUP_LOOP_TIMEOUT_SECONDS?.trim();
194
+ if (!configured) {
195
+ return null;
196
+ }
197
+ const parsedSeconds = Number(configured);
198
+ if (!Number.isFinite(parsedSeconds)) {
199
+ throw new Error('CODEX_REVIEW_STARTUP_LOOP_TIMEOUT_SECONDS must be a finite number.');
200
+ }
201
+ if (parsedSeconds <= 0) {
202
+ return null;
203
+ }
204
+ return Math.round(parsedSeconds * 1000);
205
+ }
206
+ export function resolveReviewStartupLoopMinEvents(env = process.env) {
207
+ const configured = env.CODEX_REVIEW_STARTUP_LOOP_MIN_EVENTS?.trim();
208
+ if (!configured) {
209
+ return DEFAULT_REVIEW_STARTUP_LOOP_MIN_EVENTS;
210
+ }
211
+ const parsed = Number(configured);
212
+ if (!Number.isFinite(parsed) || !Number.isInteger(parsed) || parsed < 1) {
213
+ throw new Error('CODEX_REVIEW_STARTUP_LOOP_MIN_EVENTS must be a positive integer.');
214
+ }
215
+ return parsed;
216
+ }
217
+ export function resolveReviewMonitorIntervalMs(env = process.env) {
218
+ const configured = env[REVIEW_MONITOR_INTERVAL_ENV_KEY]?.trim();
219
+ if (!configured) {
220
+ return DEFAULT_REVIEW_MONITOR_INTERVAL_SECONDS * 1000;
221
+ }
222
+ const parsedSeconds = Number(configured);
223
+ if (!Number.isFinite(parsedSeconds)) {
224
+ throw new Error(`${REVIEW_MONITOR_INTERVAL_ENV_KEY} must be a finite number.`);
225
+ }
226
+ if (parsedSeconds <= 0) {
227
+ return null;
228
+ }
229
+ return Math.round(parsedSeconds * 1000);
230
+ }
231
+ export function resolveReviewLowSignalTimeoutMs(env = process.env) {
232
+ const configured = env[REVIEW_LOW_SIGNAL_TIMEOUT_ENV_KEY]?.trim();
233
+ if (!configured) {
234
+ return 180_000;
235
+ }
236
+ const parsedSeconds = Number(configured);
237
+ if (!Number.isFinite(parsedSeconds)) {
238
+ throw new Error(`${REVIEW_LOW_SIGNAL_TIMEOUT_ENV_KEY} must be a finite number.`);
239
+ }
240
+ if (parsedSeconds <= 0) {
241
+ return null;
242
+ }
243
+ return Math.round(parsedSeconds * 1000);
244
+ }
245
+ export function resolveReviewVerdictStabilityTimeoutMs(env = process.env) {
246
+ const configured = env[REVIEW_VERDICT_STABILITY_TIMEOUT_ENV_KEY]?.trim();
247
+ if (!configured) {
248
+ return 180_000;
249
+ }
250
+ const parsedSeconds = Number(configured);
251
+ if (!Number.isFinite(parsedSeconds)) {
252
+ throw new Error(`${REVIEW_VERDICT_STABILITY_TIMEOUT_ENV_KEY} must be a finite number.`);
253
+ }
254
+ if (parsedSeconds <= 0) {
255
+ return null;
256
+ }
257
+ return Math.round(parsedSeconds * 1000);
258
+ }
259
+ export function resolveReviewMetaSurfaceTimeoutMs(env = process.env) {
260
+ const configured = env[REVIEW_META_SURFACE_TIMEOUT_ENV_KEY]?.trim();
261
+ if (!configured) {
262
+ return 180_000;
263
+ }
264
+ const parsedSeconds = Number(configured);
265
+ if (!Number.isFinite(parsedSeconds)) {
266
+ throw new Error(`${REVIEW_META_SURFACE_TIMEOUT_ENV_KEY} must be a finite number.`);
267
+ }
268
+ if (parsedSeconds <= 0) {
269
+ return null;
270
+ }
271
+ return Math.round(parsedSeconds * 1000);
272
+ }
273
+ function envFlagEnabled(value) {
274
+ if (!value) {
275
+ return false;
276
+ }
277
+ const normalized = value.trim().toLowerCase();
278
+ return normalized === '1' || normalized === 'true' || normalized === 'yes';
279
+ }