@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,340 @@
1
+ export function createEmptyReviewShellEnvState(initialEnvVarPaths = new Map()) {
2
+ const shellVars = new Map();
3
+ for (const [envVar, envPath] of initialEnvVarPaths.entries()) {
4
+ shellVars.set(envVar, envPath);
5
+ }
6
+ return {
7
+ shellVars,
8
+ exportedVars: new Set(shellVars.keys()),
9
+ blockedEnvVars: new Set()
10
+ };
11
+ }
12
+ export function buildCommandEnvAssignments(shellEnvState, rawTokens, dependencies) {
13
+ const envAssignments = commandUsesCleanEnvironment(rawTokens, dependencies)
14
+ ? new Map()
15
+ : mergeEnvAssignments(shellEnvState.shellVars, new Map());
16
+ for (const envVar of shellEnvState.blockedEnvVars) {
17
+ envAssignments.delete(envVar);
18
+ }
19
+ return mergeEnvAssignments(envAssignments, collectInlineEnvAssignments(rawTokens, dependencies));
20
+ }
21
+ export function buildNestedShellEnvState(shellEnvState, rawTokens, dependencies) {
22
+ const blockedEnvVars = buildBlockedEnvVarSet(shellEnvState, rawTokens, dependencies);
23
+ const usesCleanEnvironment = commandUsesCleanEnvironment(rawTokens, dependencies);
24
+ const shellVars = new Map();
25
+ if (!usesCleanEnvironment) {
26
+ for (const envVar of shellEnvState.exportedVars) {
27
+ if (blockedEnvVars.has(envVar)) {
28
+ continue;
29
+ }
30
+ const value = shellEnvState.shellVars.get(envVar);
31
+ if (value !== undefined) {
32
+ shellVars.set(envVar, value);
33
+ }
34
+ }
35
+ }
36
+ for (const [key, value] of collectInlineEnvAssignments(rawTokens, dependencies).entries()) {
37
+ shellVars.set(key, value);
38
+ blockedEnvVars.delete(key);
39
+ }
40
+ return {
41
+ shellVars,
42
+ exportedVars: new Set(shellVars.keys()),
43
+ blockedEnvVars
44
+ };
45
+ }
46
+ export function updateReviewShellEnvStateForSegment(shellEnvState, rawTokens, dependencies, shellDialect = 'other') {
47
+ const nextState = cloneReviewShellEnvState(shellEnvState);
48
+ const leadingAssignments = collectLeadingShellAssignments(rawTokens);
49
+ const strippedTokens = dependencies.stripLeadingEnvAssignments(rawTokens);
50
+ if (strippedTokens.length === 0) {
51
+ for (const [key, value] of leadingAssignments.entries()) {
52
+ nextState.shellVars.set(key, value);
53
+ nextState.blockedEnvVars.delete(key);
54
+ }
55
+ return nextState;
56
+ }
57
+ const tokens = dependencies.unwrapEnvCommandTokens(strippedTokens);
58
+ if (tokens.length === 0) {
59
+ return nextState;
60
+ }
61
+ const command = dependencies.normalizeCommandToken(tokens[0] ?? '');
62
+ if (command === 'export') {
63
+ const exportTokens = tokens.slice(1);
64
+ const bashLikeUnexportMode = shellDialect === 'bashlike' && exportTokens.includes('-n');
65
+ if (shellDialect === 'bashlike' && !bashLikeUnexportMode) {
66
+ applyBashLikeLeadingBareExportAssignments(nextState, exportTokens, leadingAssignments);
67
+ }
68
+ applyExportTokensToReviewShellEnvState(nextState, exportTokens, leadingAssignments, dependencies, shellDialect);
69
+ return nextState;
70
+ }
71
+ if (command === 'unset') {
72
+ applyUnsetTokensToReviewShellEnvState(nextState, tokens.slice(1));
73
+ return nextState;
74
+ }
75
+ return nextState;
76
+ }
77
+ export function collectInlineEnvAssignments(tokens, dependencies) {
78
+ const assignments = new Map();
79
+ let index = 0;
80
+ while (index < tokens.length && /^[A-Za-z_][A-Za-z0-9_]*=.*/u.test(tokens[index] ?? '')) {
81
+ recordInlineEnvAssignment(assignments, tokens[index] ?? '');
82
+ index += 1;
83
+ }
84
+ if (dependencies.normalizeCommandToken(tokens[index] ?? '') !== 'env') {
85
+ return assignments;
86
+ }
87
+ index += 1;
88
+ while (index < tokens.length) {
89
+ const token = tokens[index] ?? '';
90
+ const normalized = token.toLowerCase();
91
+ if (token === '--') {
92
+ index += 1;
93
+ break;
94
+ }
95
+ if (/^[A-Za-z_][A-Za-z0-9_]*=.*/u.test(token)) {
96
+ recordInlineEnvAssignment(assignments, token);
97
+ index += 1;
98
+ continue;
99
+ }
100
+ if (normalized === '-u' || normalized === '--unset') {
101
+ index += 2;
102
+ continue;
103
+ }
104
+ if (normalized.startsWith('--unset=')) {
105
+ index += 1;
106
+ continue;
107
+ }
108
+ if (token.startsWith('-')) {
109
+ index += 1;
110
+ continue;
111
+ }
112
+ break;
113
+ }
114
+ return assignments;
115
+ }
116
+ function cloneReviewShellEnvState(shellEnvState) {
117
+ return {
118
+ shellVars: new Map(shellEnvState.shellVars),
119
+ exportedVars: new Set(shellEnvState.exportedVars),
120
+ blockedEnvVars: new Set(shellEnvState.blockedEnvVars)
121
+ };
122
+ }
123
+ function buildBlockedEnvVarSet(shellEnvState, rawTokens, dependencies) {
124
+ const blockedEnvVars = new Set(shellEnvState.blockedEnvVars);
125
+ for (const envVar of collectInlineEnvUnsetVars(rawTokens, dependencies)) {
126
+ blockedEnvVars.add(envVar);
127
+ }
128
+ for (const envVar of collectInlineEnvAssignments(rawTokens, dependencies).keys()) {
129
+ blockedEnvVars.delete(envVar);
130
+ }
131
+ return blockedEnvVars;
132
+ }
133
+ function collectLeadingShellAssignments(tokens) {
134
+ const assignments = new Map();
135
+ let index = 0;
136
+ while (index < tokens.length && /^[A-Za-z_][A-Za-z0-9_]*=.*/u.test(tokens[index] ?? '')) {
137
+ recordInlineEnvAssignment(assignments, tokens[index] ?? '');
138
+ index += 1;
139
+ }
140
+ return assignments;
141
+ }
142
+ function applyBashLikeLeadingBareExportAssignments(shellEnvState, tokens, leadingAssignments) {
143
+ if (leadingAssignments.size === 0) {
144
+ return;
145
+ }
146
+ const bareExportTargets = new Set();
147
+ for (const token of tokens) {
148
+ if (!token || token.startsWith('-') || /^[A-Za-z_][A-Za-z0-9_]*=.*/u.test(token)) {
149
+ continue;
150
+ }
151
+ const normalized = token.trim().replace(/^\$/u, '').replace(/[{}]/gu, '').toUpperCase();
152
+ if (normalized) {
153
+ bareExportTargets.add(normalized);
154
+ }
155
+ }
156
+ for (const [key, value] of leadingAssignments.entries()) {
157
+ if (!bareExportTargets.has(key)) {
158
+ continue;
159
+ }
160
+ shellEnvState.shellVars.set(key, value);
161
+ shellEnvState.exportedVars.add(key);
162
+ shellEnvState.blockedEnvVars.delete(key);
163
+ }
164
+ }
165
+ function applyExportTokensToReviewShellEnvState(shellEnvState, tokens, leadingAssignments, dependencies, shellDialect) {
166
+ let bashLikeExportMode = 'export';
167
+ for (const token of tokens) {
168
+ if (!token) {
169
+ continue;
170
+ }
171
+ if (shellDialect === 'bashlike' && token === '-n') {
172
+ bashLikeExportMode = 'unexport';
173
+ continue;
174
+ }
175
+ if (token === '--') {
176
+ continue;
177
+ }
178
+ if (/^[A-Za-z_][A-Za-z0-9_]*=.*/u.test(token)) {
179
+ if (bashLikeExportMode === 'unexport') {
180
+ continue;
181
+ }
182
+ const assignments = new Map();
183
+ recordInlineEnvAssignment(assignments, token);
184
+ for (const [key, value] of assignments.entries()) {
185
+ let resolvedValue = value;
186
+ const normalizedInlineEnvVar = dependencies.normalizeAuditMetaSurfaceEnvVar(value);
187
+ if (normalizedInlineEnvVar) {
188
+ const expansionEnv = new Map(shellEnvState.shellVars);
189
+ for (const [leadingKey, leadingValue] of leadingAssignments.entries()) {
190
+ if (leadingKey !== key) {
191
+ expansionEnv.set(leadingKey, leadingValue);
192
+ }
193
+ }
194
+ const currentValue = expansionEnv.get(normalizedInlineEnvVar);
195
+ resolvedValue = currentValue ?? '';
196
+ }
197
+ shellEnvState.shellVars.set(key, resolvedValue);
198
+ shellEnvState.exportedVars.add(key);
199
+ shellEnvState.blockedEnvVars.delete(key);
200
+ }
201
+ continue;
202
+ }
203
+ if (token.startsWith('-')) {
204
+ continue;
205
+ }
206
+ const normalized = token.trim().replace(/^\$/u, '').replace(/[{}]/gu, '').toUpperCase();
207
+ if (!normalized) {
208
+ continue;
209
+ }
210
+ if (bashLikeExportMode === 'unexport') {
211
+ shellEnvState.exportedVars.delete(normalized);
212
+ continue;
213
+ }
214
+ if (shellEnvState.shellVars.has(normalized)) {
215
+ shellEnvState.exportedVars.add(normalized);
216
+ shellEnvState.blockedEnvVars.delete(normalized);
217
+ }
218
+ }
219
+ }
220
+ function applyUnsetTokensToReviewShellEnvState(shellEnvState, tokens) {
221
+ for (const token of tokens) {
222
+ if (!token || token.startsWith('-')) {
223
+ continue;
224
+ }
225
+ const normalized = token.trim().replace(/^\$/u, '').replace(/[{}]/gu, '').toUpperCase();
226
+ if (!normalized) {
227
+ continue;
228
+ }
229
+ shellEnvState.shellVars.delete(normalized);
230
+ shellEnvState.exportedVars.delete(normalized);
231
+ shellEnvState.blockedEnvVars.add(normalized);
232
+ }
233
+ }
234
+ function commandUsesCleanEnvironment(tokens, dependencies) {
235
+ let index = 0;
236
+ while (index < tokens.length && /^[A-Za-z_][A-Za-z0-9_]*=.*/u.test(tokens[index] ?? '')) {
237
+ index += 1;
238
+ }
239
+ if (dependencies.normalizeCommandToken(tokens[index] ?? '') !== 'env') {
240
+ return false;
241
+ }
242
+ index += 1;
243
+ while (index < tokens.length) {
244
+ const token = tokens[index] ?? '';
245
+ const normalized = token.toLowerCase();
246
+ if (token === '--') {
247
+ return false;
248
+ }
249
+ if (/^[A-Za-z_][A-Za-z0-9_]*=.*/u.test(token)) {
250
+ index += 1;
251
+ continue;
252
+ }
253
+ if (normalized === '-i' || normalized === '--ignore-environment') {
254
+ return true;
255
+ }
256
+ if ((normalized === '-u' || normalized === '--unset') && index + 1 < tokens.length) {
257
+ index += 2;
258
+ continue;
259
+ }
260
+ if (normalized.startsWith('--unset=')) {
261
+ index += 1;
262
+ continue;
263
+ }
264
+ if (token.startsWith('-')) {
265
+ index += 1;
266
+ continue;
267
+ }
268
+ return false;
269
+ }
270
+ return false;
271
+ }
272
+ function collectInlineEnvUnsetVars(tokens, dependencies) {
273
+ const unsetVars = new Set();
274
+ let index = 0;
275
+ while (index < tokens.length && /^[A-Za-z_][A-Za-z0-9_]*=.*/u.test(tokens[index] ?? '')) {
276
+ index += 1;
277
+ }
278
+ if (dependencies.normalizeCommandToken(tokens[index] ?? '') !== 'env') {
279
+ return unsetVars;
280
+ }
281
+ index += 1;
282
+ while (index < tokens.length) {
283
+ const token = tokens[index] ?? '';
284
+ const normalized = token.toLowerCase();
285
+ if (token === '--') {
286
+ index += 1;
287
+ break;
288
+ }
289
+ if (/^[A-Za-z_][A-Za-z0-9_]*=.*/u.test(token)) {
290
+ index += 1;
291
+ continue;
292
+ }
293
+ if ((normalized === '-u' || normalized === '--unset') && index + 1 < tokens.length) {
294
+ const envVar = tokens[index + 1]?.trim().replace(/^\$/u, '').replace(/[{}]/gu, '').toUpperCase();
295
+ if (envVar) {
296
+ unsetVars.add(envVar);
297
+ }
298
+ index += 2;
299
+ continue;
300
+ }
301
+ if (normalized.startsWith('--unset=')) {
302
+ const envVar = normalized
303
+ .slice('--unset='.length)
304
+ .trim()
305
+ .replace(/^\$/u, '')
306
+ .replace(/[{}]/gu, '')
307
+ .toUpperCase();
308
+ if (envVar) {
309
+ unsetVars.add(envVar);
310
+ }
311
+ index += 1;
312
+ continue;
313
+ }
314
+ if (token.startsWith('-')) {
315
+ index += 1;
316
+ continue;
317
+ }
318
+ break;
319
+ }
320
+ return unsetVars;
321
+ }
322
+ function recordInlineEnvAssignment(assignments, token) {
323
+ const separatorIndex = token.indexOf('=');
324
+ if (separatorIndex <= 0) {
325
+ return;
326
+ }
327
+ const key = token.slice(0, separatorIndex).trim().toUpperCase();
328
+ const value = token.slice(separatorIndex + 1).trim();
329
+ if (!key || !value) {
330
+ return;
331
+ }
332
+ assignments.set(key, value);
333
+ }
334
+ function mergeEnvAssignments(inheritedEnvAssignments, nextEnvAssignments) {
335
+ const merged = new Map(inheritedEnvAssignments);
336
+ for (const [key, value] of nextEnvAssignments.entries()) {
337
+ merged.set(key, value);
338
+ }
339
+ return merged;
340
+ }
@@ -1,39 +1,191 @@
1
1
  import { access, readdir } from 'node:fs/promises';
2
- import { isAbsolute, join, resolve } from 'node:path';
2
+ import { existsSync } from 'node:fs';
3
+ import { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
3
4
  import process from 'node:process';
4
5
  const DEFAULT_TASK_ID = '0101';
5
6
  const DEFAULT_RUN_LAYOUT = 'cli';
6
- function resolveRepoRoot() {
7
- const configured = process.env.CODEX_ORCHESTRATOR_ROOT;
7
+ const PROVIDER_WORKSPACE_ROOT_DIRNAME = '.workspaces';
8
+ const PROVIDER_LINEAR_WORKER_PIPELINE_ID = 'provider-linear-worker';
9
+ const PRESERVE_PROVIDER_ARTIFACT_ROOTS_ENV = 'CODEX_ORCHESTRATOR_PRESERVE_PROVIDER_ARTIFACT_ROOTS';
10
+ function resolveConfiguredPath(configured, cwd) {
11
+ if (isAbsolute(configured)) {
12
+ return resolve(configured);
13
+ }
14
+ return resolve(cwd, configured);
15
+ }
16
+ function normalizeTaskId(value) { return typeof value === 'string' && value.trim().length > 0 ? value.trim() : null; }
17
+ function resolveConfiguredTaskId(env) { return normalizeTaskId(env.MCP_RUNNER_TASK_ID) ?? normalizeTaskId(env.CODEX_ORCHESTRATOR_TASK_ID) ?? normalizeTaskId(env.TASK); }
18
+ function resolveProviderTaskId(env, cwd) { const cwdRoot = resolve(cwd), cwdTask = basename(dirname(cwdRoot)) === PROVIDER_WORKSPACE_ROOT_DIRNAME ? basename(cwdRoot) : null; return cwdTask && [normalizeTaskId(env.CODEX_ORCHESTRATOR_TASK_ID), normalizeTaskId(env.MCP_RUNNER_TASK_ID), normalizeTaskId(env.TASK)].includes(cwdTask) ? cwdTask : resolveConfiguredTaskId(env); }
19
+ function isProviderIssueWorkspaceRootForTask(candidate, taskId) {
20
+ return (typeof candidate === 'string' &&
21
+ candidate.length > 0 &&
22
+ basename(candidate) === taskId &&
23
+ basename(dirname(candidate)) === PROVIDER_WORKSPACE_ROOT_DIRNAME);
24
+ }
25
+ function providerIssueWorkspaceOverrideForCwd(configuredRoot, env, cwd) {
26
+ if (env.CODEX_ORCHESTRATOR_PIPELINE_ID !== PROVIDER_LINEAR_WORKER_PIPELINE_ID) {
27
+ return null;
28
+ }
29
+ const taskId = resolveProviderTaskId(env, cwd);
30
+ if (!taskId) {
31
+ return null;
32
+ }
33
+ const resolvedCwd = resolve(cwd);
34
+ if (!isProviderIssueWorkspaceRootForTask(resolvedCwd, taskId)) {
35
+ return null;
36
+ }
37
+ const sharedRoot = dirname(dirname(resolvedCwd));
38
+ return sharedRoot === configuredRoot ? resolvedCwd : null;
39
+ }
40
+ function resolveRepoRoot(env, cwd) {
41
+ const configured = env.CODEX_ORCHESTRATOR_ROOT;
8
42
  if (!configured) {
9
- return process.cwd();
43
+ return cwd;
10
44
  }
11
- if (isAbsolute(configured)) {
12
- return configured;
45
+ const configuredRoot = resolveConfiguredPath(configured, cwd);
46
+ return providerIssueWorkspaceOverrideForCwd(configuredRoot, env, cwd) ?? configuredRoot;
47
+ }
48
+ function resolveProviderSharedRootForIssueWorkspace(repoRoot, env, cwd) {
49
+ const taskId = resolveProviderTaskId(env, repoRoot);
50
+ if (!taskId || !isProviderIssueWorkspaceRootForTask(repoRoot, taskId)) {
51
+ return null;
13
52
  }
14
- return resolve(process.cwd(), configured);
53
+ const configured = env.CODEX_ORCHESTRATOR_ROOT;
54
+ if (!configured) {
55
+ return null;
56
+ }
57
+ const configuredRoot = resolveConfiguredPath(configured, cwd);
58
+ const sharedRoot = dirname(dirname(repoRoot));
59
+ return configuredRoot === sharedRoot ? sharedRoot : null;
15
60
  }
16
- function resolveRunsDir(repoRoot) {
17
- const configured = process.env.CODEX_ORCHESTRATOR_RUNS_DIR || '.runs';
18
- if (isAbsolute(configured)) {
19
- return configured;
61
+ function isPathWithinRoot(root, candidate) {
62
+ const relativePath = relative(root, candidate);
63
+ return (relativePath === '' ||
64
+ (!relativePath.startsWith('..') &&
65
+ !relativePath.startsWith(`..${sep}`) &&
66
+ !isAbsolute(relativePath)));
67
+ }
68
+ function firstPathSegment(relativePath) {
69
+ return relativePath.split(sep).filter((segment) => segment.length > 0)[0] ?? '';
70
+ }
71
+ function isDefaultRunsLayoutSegment(segment) {
72
+ return segment === '.runs' || segment === 'runs';
73
+ }
74
+ function resolveConfiguredArtifactRoot(baseRoot, configured, fallbackDirname) {
75
+ if (!configured) {
76
+ return resolve(baseRoot, fallbackDirname);
20
77
  }
21
- return resolve(repoRoot, configured);
78
+ return isAbsolute(configured) ? resolve(configured) : resolve(baseRoot, configured);
22
79
  }
23
- function resolveOutDir(repoRoot) {
24
- const configured = process.env.CODEX_ORCHESTRATOR_OUT_DIR || 'out';
25
- if (isAbsolute(configured)) {
26
- return configured;
80
+ function resolveWorkspaceArtifactRootForSharedRoot(repoRoot, sharedRoot, sharedArtifactRoot, fallbackDirname, allowCustomCounterpart = false) {
81
+ if (!sharedRoot || !isPathWithinRoot(sharedRoot, sharedArtifactRoot)) {
82
+ return null;
27
83
  }
28
- return resolve(repoRoot, configured);
84
+ const relativeArtifactRoot = relative(sharedRoot, sharedArtifactRoot);
85
+ const firstSegment = firstPathSegment(relativeArtifactRoot);
86
+ if ((fallbackDirname === '.runs' && isDefaultRunsLayoutSegment(firstSegment)) ||
87
+ firstSegment === fallbackDirname ||
88
+ allowCustomCounterpart) {
89
+ return resolve(repoRoot, relativeArtifactRoot);
90
+ }
91
+ return null;
29
92
  }
30
- export function resolveEnvironmentPaths() {
31
- const repoRoot = resolveRepoRoot();
32
- const runsRoot = resolveRunsDir(repoRoot);
33
- const outRoot = resolveOutDir(repoRoot);
34
- const taskId = process.env.MCP_RUNNER_TASK_ID ?? DEFAULT_TASK_ID;
93
+ function resolveProviderWorkspaceManifestCounterpartPath(repoRoot, env, cwd) {
94
+ const manifestPath = env.CODEX_ORCHESTRATOR_MANIFEST_PATH || env.MANIFEST;
95
+ if (!manifestPath) {
96
+ return null;
97
+ }
98
+ const inheritedSharedRoot = resolveProviderSharedRootForIssueWorkspace(repoRoot, env, cwd);
99
+ const sharedRoot = dirname(dirname(repoRoot));
100
+ const resolvedManifestPath = resolveConfiguredPath(manifestPath, inheritedSharedRoot ?? repoRoot);
101
+ if (isPathWithinRoot(repoRoot, resolvedManifestPath)) {
102
+ return resolvedManifestPath;
103
+ }
104
+ const sharedRunsRoot = resolveConfiguredArtifactRoot(inheritedSharedRoot ?? sharedRoot, env.CODEX_ORCHESTRATOR_RUNS_DIR || '.runs', '.runs');
105
+ if (!isPathWithinRoot(sharedRunsRoot, resolvedManifestPath)) {
106
+ return null;
107
+ }
108
+ const workspaceRunsRoot = resolveWorkspaceArtifactRootForSharedRoot(repoRoot, sharedRoot, sharedRunsRoot, '.runs', true);
109
+ if (!workspaceRunsRoot) {
110
+ return null;
111
+ }
112
+ const workspaceManifestPath = resolve(workspaceRunsRoot, relative(sharedRunsRoot, resolvedManifestPath));
113
+ return existsSync(workspaceManifestPath) ? workspaceManifestPath : null;
114
+ }
115
+ function shouldScopeProviderArtifactDirs(repoRoot, env, cwd) {
116
+ if (env.CODEX_ORCHESTRATOR_PIPELINE_ID !== PROVIDER_LINEAR_WORKER_PIPELINE_ID) {
117
+ return false;
118
+ }
119
+ const taskId = resolveProviderTaskId(env, repoRoot);
120
+ if (!taskId || !isProviderIssueWorkspaceRootForTask(repoRoot, taskId)) {
121
+ return false;
122
+ }
123
+ if (env[PRESERVE_PROVIDER_ARTIFACT_ROOTS_ENV] === '1' &&
124
+ !providerWorkspaceManifestCounterpartExists(repoRoot, env, cwd)) {
125
+ return false;
126
+ }
127
+ return true;
128
+ }
129
+ function providerWorkspaceManifestCounterpartExists(repoRoot, env, cwd) {
130
+ const manifestPath = env.CODEX_ORCHESTRATOR_MANIFEST_PATH || env.MANIFEST;
131
+ if (!manifestPath) {
132
+ return true;
133
+ }
134
+ const counterpartPath = resolveProviderWorkspaceManifestCounterpartPath(repoRoot, env, cwd);
135
+ if (counterpartPath) {
136
+ return true;
137
+ }
138
+ const inheritedSharedRoot = resolveProviderSharedRootForIssueWorkspace(repoRoot, env, cwd);
139
+ const sharedRoot = dirname(dirname(repoRoot));
140
+ const resolvedManifestPath = resolveConfiguredPath(manifestPath, inheritedSharedRoot ?? repoRoot);
141
+ if (isPathWithinRoot(repoRoot, resolvedManifestPath)) {
142
+ return true;
143
+ }
144
+ const sharedRunsRoot = resolveConfiguredArtifactRoot(inheritedSharedRoot ?? sharedRoot, env.CODEX_ORCHESTRATOR_RUNS_DIR || '.runs', '.runs');
145
+ if (!isPathWithinRoot(sharedRunsRoot, resolvedManifestPath)) {
146
+ return false;
147
+ }
148
+ return false;
149
+ }
150
+ function resolveArtifactDir(repoRoot, configured, fallbackDirname, scopeToRepoRoot, baseRoot = repoRoot, hasProviderWorkspaceManifestCounterpart = false, sharedRootForCounterpart = baseRoot) {
151
+ const relativeBaseRoot = scopeToRepoRoot ? repoRoot : baseRoot;
152
+ const fallback = resolve(relativeBaseRoot, fallbackDirname);
153
+ if (!configured) {
154
+ return fallback;
155
+ }
156
+ const candidate = scopeToRepoRoot && !isAbsolute(configured)
157
+ ? resolve(repoRoot, configured)
158
+ : resolveConfiguredArtifactRoot(baseRoot, configured, fallbackDirname);
159
+ if (scopeToRepoRoot && !isPathWithinRoot(repoRoot, candidate)) {
160
+ const workspaceArtifactRoot = resolveWorkspaceArtifactRootForSharedRoot(repoRoot, sharedRootForCounterpart, candidate, fallbackDirname, hasProviderWorkspaceManifestCounterpart);
161
+ if (workspaceArtifactRoot) {
162
+ return workspaceArtifactRoot;
163
+ }
164
+ }
165
+ return candidate;
166
+ }
167
+ function resolveRunsDir(repoRoot, env, scopeToRepoRoot, baseRoot = repoRoot, hasProviderWorkspaceManifestCounterpart = false, sharedRootForCounterpart = baseRoot) {
168
+ return resolveArtifactDir(repoRoot, env.CODEX_ORCHESTRATOR_RUNS_DIR || '.runs', '.runs', scopeToRepoRoot, baseRoot, hasProviderWorkspaceManifestCounterpart, sharedRootForCounterpart);
169
+ }
170
+ function resolveOutDir(repoRoot, env, scopeToRepoRoot, baseRoot = repoRoot, hasProviderWorkspaceManifestCounterpart = false, sharedRootForCounterpart = baseRoot) {
171
+ return resolveArtifactDir(repoRoot, env.CODEX_ORCHESTRATOR_OUT_DIR || 'out', 'out', scopeToRepoRoot, baseRoot, hasProviderWorkspaceManifestCounterpart, sharedRootForCounterpart);
172
+ }
173
+ export function resolveEnvironmentPathsForProcess(env = process.env, cwd = process.cwd()) {
174
+ const repoRoot = resolveRepoRoot(env, cwd);
175
+ const providerSharedRoot = resolveProviderSharedRootForIssueWorkspace(repoRoot, env, cwd);
176
+ const providerWorkspaceManifestCounterpartPath = resolveProviderWorkspaceManifestCounterpartPath(repoRoot, env, cwd);
177
+ const scopeProviderArtifacts = shouldScopeProviderArtifactDirs(repoRoot, env, cwd);
178
+ const artifactBaseRoot = providerSharedRoot ?? repoRoot;
179
+ const sharedRootForCounterpart = providerSharedRoot ?? dirname(dirname(repoRoot));
180
+ const hasProviderWorkspaceManifestCounterpart = Boolean(providerWorkspaceManifestCounterpartPath);
181
+ const runsRoot = resolveRunsDir(repoRoot, env, scopeProviderArtifacts, artifactBaseRoot, hasProviderWorkspaceManifestCounterpart, sharedRootForCounterpart);
182
+ const outRoot = resolveOutDir(repoRoot, env, scopeProviderArtifacts, artifactBaseRoot, hasProviderWorkspaceManifestCounterpart, sharedRootForCounterpart);
183
+ const taskId = (env.CODEX_ORCHESTRATOR_PIPELINE_ID === PROVIDER_LINEAR_WORKER_PIPELINE_ID ? resolveProviderTaskId(env, repoRoot) : resolveConfiguredTaskId(env)) ?? DEFAULT_TASK_ID;
35
184
  return { repoRoot, runsRoot, outRoot, taskId };
36
185
  }
186
+ export function resolveEnvironmentPaths() {
187
+ return resolveEnvironmentPathsForProcess(process.env, process.cwd());
188
+ }
37
189
  export function resolveRunDir(options) {
38
190
  const { runsRoot, taskId, runId, layout = DEFAULT_RUN_LAYOUT } = options ?? {};
39
191
  if (!runsRoot || !taskId || !runId) {
@@ -88,9 +240,9 @@ export function pickLatestRunId(runIds) {
88
240
  }
89
241
  export async function collectManifests(runsDir, taskFilter) {
90
242
  const results = [];
91
- let taskIds = [];
243
+ let taskEntries = [];
92
244
  try {
93
- taskIds = await readdir(runsDir);
245
+ taskEntries = await readdir(runsDir, { withFileTypes: true });
94
246
  }
95
247
  catch (error) {
96
248
  if (error?.code === 'ENOENT') {
@@ -98,7 +250,11 @@ export async function collectManifests(runsDir, taskFilter) {
98
250
  }
99
251
  throw error;
100
252
  }
101
- for (const taskId of taskIds) {
253
+ for (const taskEntry of taskEntries) {
254
+ if (!taskEntry.isDirectory()) {
255
+ continue;
256
+ }
257
+ const taskId = taskEntry.name;
102
258
  if (taskFilter && taskFilter !== taskId) {
103
259
  continue;
104
260
  }
@@ -106,26 +262,26 @@ export async function collectManifests(runsDir, taskFilter) {
106
262
  const cliPath = join(taskPath, 'cli');
107
263
  const legacyPath = taskPath;
108
264
  const candidates = [];
109
- try {
110
- const cliRunIds = await readdir(cliPath);
265
+ const cliRunIds = await listDirectories(cliPath);
266
+ if (cliRunIds.length > 0) {
111
267
  candidates.push({ root: cliPath, runIds: cliRunIds });
112
268
  }
113
- catch {
114
- // Ignore missing CLI directory; fall back to legacy layout.
115
- }
116
269
  if (candidates.length === 0) {
117
- try {
118
- const legacyRunIds = await readdir(legacyPath);
270
+ const legacyRunIds = (await listDirectories(legacyPath)).filter((name) => name !== 'cli');
271
+ if (legacyRunIds.length > 0) {
119
272
  candidates.push({ root: legacyPath, runIds: legacyRunIds });
120
273
  }
121
- catch {
122
- continue;
123
- }
124
274
  }
125
275
  for (const candidate of candidates) {
126
276
  for (const runId of candidate.runIds) {
127
277
  const manifestPath = join(candidate.root, runId, 'manifest.json');
128
- results.push(manifestPath);
278
+ try {
279
+ await access(manifestPath);
280
+ results.push(manifestPath);
281
+ }
282
+ catch {
283
+ // Only return manifest paths that exist on disk.
284
+ }
129
285
  }
130
286
  }
131
287
  }