@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
@@ -1,12 +1,33 @@
1
+ import process from 'node:process';
1
2
  import { spawn } from 'node:child_process';
3
+ import { fingerprintAuthProvenanceValue } from './authProvenanceFingerprint.js';
4
+ import { resolveCodexCliBin } from './codexCli.js';
5
+ function formatCommandSpawnError(error) {
6
+ if (error instanceof Error) {
7
+ const errno = error;
8
+ const code = typeof errno.code === 'string' ? errno.code : null;
9
+ if (code && !error.message.includes(code)) {
10
+ return `${code}: ${error.message}`;
11
+ }
12
+ return error.message;
13
+ }
14
+ return String(error);
15
+ }
2
16
  function runCommand(command, args, options) {
3
17
  const timeoutMs = options.timeoutMs ?? 10_000;
4
18
  return new Promise((resolve) => {
5
- const child = spawn(command, args, {
6
- cwd: options.cwd,
7
- env: options.env,
8
- stdio: ['ignore', 'pipe', 'pipe']
9
- });
19
+ let child;
20
+ try {
21
+ child = spawn(command, args, {
22
+ cwd: options.cwd,
23
+ env: options.env,
24
+ stdio: ['ignore', 'pipe', 'pipe']
25
+ });
26
+ }
27
+ catch (error) {
28
+ resolve({ exitCode: 1, stdout: '', stderr: formatCommandSpawnError(error) });
29
+ return;
30
+ }
10
31
  let stdout = '';
11
32
  let stderr = '';
12
33
  let settled = false;
@@ -36,7 +57,7 @@ function runCommand(command, args, options) {
36
57
  }
37
58
  settled = true;
38
59
  clearTimeout(timer);
39
- resolve({ exitCode: 1, stdout, stderr: `${stderr}\n${error.message}`.trim() });
60
+ resolve({ exitCode: 1, stdout, stderr: `${stderr}\n${formatCommandSpawnError(error)}`.trim() });
40
61
  });
41
62
  child.once('close', (code) => {
42
63
  if (settled) {
@@ -55,6 +76,243 @@ function normalizeBranch(raw) {
55
76
  }
56
77
  return trimmed.replace(/^refs\/heads\//u, '');
57
78
  }
79
+ function normalizeCloudPreflightRequestValue(raw) {
80
+ const trimmed = String(raw ?? '').trim();
81
+ return trimmed.length > 0 ? trimmed : null;
82
+ }
83
+ function readCloudPreflightCommandOutput(result) {
84
+ const output = [result.stderr, result.stdout]
85
+ .map((value) => value.trim())
86
+ .filter((value) => value.length > 0)
87
+ .join(' ')
88
+ .replace(/\s+/gu, ' ')
89
+ .trim();
90
+ return output || 'no output';
91
+ }
92
+ function readCloudPreflightErrorOutput(result) {
93
+ const output = result.stderr.trim().replace(/\s+/gu, ' ');
94
+ return output || 'no output';
95
+ }
96
+ function compactCloudPreflightOutput(output) {
97
+ return output.length > 500 ? `${output.slice(0, 497)}...` : output;
98
+ }
99
+ function redactCloudPreflightOutput(output) {
100
+ return output
101
+ .replace(/\b(?:authorization|bearer)\s*[:=]\s*bearer\s+[^\s,;]+/giu, 'authorization: Bearer <redacted>')
102
+ .replace(/\bbearer\s+[A-Za-z0-9._~+/-]{10,}/giu, 'Bearer <redacted>')
103
+ .replace(/\b(?:sk|sess|eyJ)[A-Za-z0-9._~+/-]{12,}/gu, '<redacted-token>')
104
+ .replace(/\b(?:CODEX|OPENAI|CHATGPT|GITHUB|GH)_[A-Z0-9_]*(?:API_KEY|AUTH_TOKEN|ACCESS_TOKEN|REFRESH_TOKEN|TOKEN|SECRET|PASSWORD)\s*=\s*[^\s,;]+/gu, (match) => `${match.split('=')[0] ?? 'secret'}=<redacted>`)
105
+ .replace(/\b(?:api[_ -]?key|auth[_ -]?token|access[_ -]?token|refresh[_ -]?token|bearer[_ -]?token|password|secret|credential)\s*[:=]\s*[^\s,;]+/giu, (match) => `${match.split(/[:=]/u)[0]?.trim() ?? 'secret'}=<redacted>`)
106
+ .replace(/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/giu, '<redacted-email>');
107
+ }
108
+ function compactCloudPreflightCommandOutput(result) {
109
+ return compactCloudPreflightOutput(redactCloudPreflightOutput(readCloudPreflightCommandOutput(result)));
110
+ }
111
+ function escapeRegExpLiteral(value) {
112
+ return value.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&');
113
+ }
114
+ function isEnvironmentNotFoundSignal(signal, environmentId) {
115
+ const normalized = signal.toLowerCase();
116
+ const normalizedEnvironmentId = environmentId.toLowerCase();
117
+ if (normalized.includes('environment_not_found')) {
118
+ return true;
119
+ }
120
+ const escapedEnvironmentId = escapeRegExpLiteral(normalizedEnvironmentId);
121
+ return new RegExp(`\\benvironment\\s+(?:(["'])${escapedEnvironmentId}\\1|${escapedEnvironmentId})\\s+not\\s+found\\b`, 'u').test(normalized);
122
+ }
123
+ function maskCloudPreflightEnvironmentIdentifierValues(signal) {
124
+ return signal
125
+ .toLowerCase()
126
+ .replace(/\benvironment\s+(?:['"][^'"]+['"]|[^\s'"]+)\s+not\s+found\b/gu, 'environment <env-id> not found')
127
+ .replace(/\bcodex_cloud_env_id\s+(?:['"][^'"]+['"]|[^\s'"]+)/gu, 'codex_cloud_env_id <env-id>')
128
+ .replace(/\bcodex cloud env id\s+(?:['"][^'"]+['"]|[^\s'"]+)/gu, 'codex cloud env id <env-id>');
129
+ }
130
+ function hasWrappedEnvironmentProbeUnavailableSignal(signal) {
131
+ const normalized = maskCloudPreflightEnvironmentIdentifierValues(signal);
132
+ return (/\b(?:missing[_ -]github[_ -]connector[_ -]link|github connection not found|github connector not found)\b/u.test(normalized) ||
133
+ /\b(?:cloud denial|cloud-denial|cloud_denial|cloud denied|not allowed in cloud|cloud access denied|cloud execution denied)\b/u.test(normalized) ||
134
+ /\b(?:forbidden|unauthorized|not logged in|login required|active account|active profile|account mismatch|profile mismatch|invalid token|expired token|token expired|missing token|token missing|api key|auth token|access token|refresh token|bearer token)\b/u.test(normalized) ||
135
+ /\b(?:rate limit|rate-limit|rate_limited|rate_limit_exceeded|quota|too many requests|usage limit|usage_limit_reached)\b/u.test(normalized) ||
136
+ /\b(?:enotfound|econn|network|timed out|timeout|502|503|504|bad gateway|service unavailable|gateway timeout)\b/u.test(normalized));
137
+ }
138
+ function buildEnvironmentProbeIssue(environmentId, result) {
139
+ const fullDetail = readCloudPreflightCommandOutput(result);
140
+ const detail = compactCloudPreflightCommandOutput(result);
141
+ if (isEnvironmentNotFoundSignal(fullDetail, environmentId) &&
142
+ !hasWrappedEnvironmentProbeUnavailableSignal(fullDetail)) {
143
+ return {
144
+ code: 'environment_not_found',
145
+ message: `Configured CODEX_CLOUD_ENV_ID '${environmentId}' is not visible to codex cloud before codex cloud exec: ${detail}`
146
+ };
147
+ }
148
+ return {
149
+ code: 'environment_unavailable',
150
+ message: `Configured CODEX_CLOUD_ENV_ID '${environmentId}' could not be verified by codex cloud before codex cloud exec: ${detail}`
151
+ };
152
+ }
153
+ function tryParseCloudListJson(stdout) {
154
+ const trimmed = stdout.trim();
155
+ if (!trimmed) {
156
+ return null;
157
+ }
158
+ try {
159
+ return JSON.parse(trimmed);
160
+ }
161
+ catch {
162
+ return null;
163
+ }
164
+ }
165
+ function readCloudListTasks(payload) {
166
+ if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
167
+ return null;
168
+ }
169
+ const record = payload;
170
+ return Array.isArray(record.tasks) ? record.tasks : null;
171
+ }
172
+ function readCloudListTaskEnvironmentIdentities(task) {
173
+ if (!task || typeof task !== 'object') {
174
+ return [];
175
+ }
176
+ const record = task;
177
+ const identities = [];
178
+ for (const key of ['environment_id', 'environmentId', 'cloud_environment_id', 'cloudEnvId']) {
179
+ const value = normalizeCloudPreflightRequestValue(record[key]);
180
+ if (value) {
181
+ identities.push(value);
182
+ }
183
+ }
184
+ for (const key of ['environment_label', 'environmentLabel']) {
185
+ const value = normalizeCloudPreflightRequestValue(record[key]);
186
+ if (value) {
187
+ identities.push(value);
188
+ }
189
+ }
190
+ const environment = record.environment;
191
+ if (environment && typeof environment === 'object') {
192
+ const environmentRecord = environment;
193
+ for (const key of ['id', 'environment_id', 'environmentId', 'cloud_environment_id', 'cloudEnvId']) {
194
+ const value = normalizeCloudPreflightRequestValue(environmentRecord[key]);
195
+ if (value) {
196
+ identities.push(value);
197
+ }
198
+ }
199
+ for (const key of ['label', 'environment_label', 'environmentLabel']) {
200
+ const value = normalizeCloudPreflightRequestValue(environmentRecord[key]);
201
+ if (value) {
202
+ identities.push(value);
203
+ }
204
+ }
205
+ }
206
+ return [...new Set(identities)];
207
+ }
208
+ function normalizeCloudEnvironmentIdentity(value) {
209
+ return value.trim().toLowerCase();
210
+ }
211
+ function buildEnvironmentProbePayloadIssue(environmentId, detail) {
212
+ const safeDetail = compactCloudPreflightOutput(redactCloudPreflightOutput(detail));
213
+ return {
214
+ code: 'environment_unavailable',
215
+ message: `Configured CODEX_CLOUD_ENV_ID '${environmentId}' could not be verified by codex cloud before codex cloud exec: ${safeDetail}`
216
+ };
217
+ }
218
+ function inspectSuccessfulEnvironmentProbe(environmentId, result) {
219
+ const stderrDetail = readCloudPreflightErrorOutput(result);
220
+ if (isEnvironmentNotFoundSignal(stderrDetail, environmentId)) {
221
+ return buildEnvironmentProbeIssue(environmentId, {
222
+ ...result,
223
+ stdout: ''
224
+ });
225
+ }
226
+ const payload = tryParseCloudListJson(result.stdout);
227
+ const tasks = readCloudListTasks(payload);
228
+ if (!tasks) {
229
+ return buildEnvironmentProbePayloadIssue(environmentId, `unexpected codex cloud list JSON payload: ${compactCloudPreflightOutput(result.stdout.trim() || 'no output')}`);
230
+ }
231
+ const taskEnvironmentIdentities = tasks.map((task) => readCloudListTaskEnvironmentIdentities(task));
232
+ const normalizedEnvironmentId = normalizeCloudEnvironmentIdentity(environmentId);
233
+ if (taskEnvironmentIdentities.some((identities) => identities.length === 0)) {
234
+ return buildEnvironmentProbePayloadIssue(environmentId, 'codex cloud list returned task rows without an environment identity');
235
+ }
236
+ const mismatchedEnvironmentIds = taskEnvironmentIdentities
237
+ .filter((identities) => !identities.some((identity) => normalizeCloudEnvironmentIdentity(identity) === normalizedEnvironmentId))
238
+ .flat();
239
+ if (mismatchedEnvironmentIds.length > 0) {
240
+ return buildEnvironmentProbePayloadIssue(environmentId, `codex cloud list returned task rows for a different environment identity: ${[
241
+ ...new Set(mismatchedEnvironmentIds)
242
+ ].join(', ')}`);
243
+ }
244
+ return null;
245
+ }
246
+ function readFirstCloudPreflightEnvValue(env, keys) {
247
+ if (!env) {
248
+ return null;
249
+ }
250
+ for (const key of keys) {
251
+ const value = normalizeCloudPreflightRequestValue(env[key]);
252
+ if (value) {
253
+ return value;
254
+ }
255
+ }
256
+ return null;
257
+ }
258
+ function readFirstCloudPreflightCredentialSource(env) {
259
+ if (!env) {
260
+ return null;
261
+ }
262
+ for (const key of [
263
+ 'CODEX_API_KEY',
264
+ 'OPENAI_API_KEY',
265
+ 'CODEX_AUTH_TOKEN',
266
+ 'OPENAI_AUTH_TOKEN',
267
+ 'CHATGPT_AUTH_TOKEN'
268
+ ]) {
269
+ if (normalizeCloudPreflightRequestValue(env[key])) {
270
+ return `env:${key}`;
271
+ }
272
+ }
273
+ return null;
274
+ }
275
+ export function buildCloudPreflightAuthProvenance(params) {
276
+ const credentialSource = readFirstCloudPreflightCredentialSource(params.env);
277
+ const profile = readFirstCloudPreflightEnvValue(params.env, [
278
+ 'CODEX_AUTH_PROFILE',
279
+ 'CODEX_PROFILE',
280
+ 'OPENAI_PROFILE',
281
+ 'CHATGPT_AUTH_PROFILE',
282
+ 'CHATGPT_PROFILE'
283
+ ]);
284
+ const account = readFirstCloudPreflightEnvValue(params.env, [
285
+ 'CODEX_ACCOUNT_ID',
286
+ 'CODEX_ACCOUNT',
287
+ 'CODEX_ACCOUNT_EMAIL',
288
+ 'OPENAI_ACCOUNT_ID',
289
+ 'OPENAI_ORG_ID',
290
+ 'CHATGPT_ACCOUNT_ID',
291
+ 'CHATGPT_ACCOUNT',
292
+ 'CHATGPT_ACCOUNT_EMAIL'
293
+ ]);
294
+ return {
295
+ providerKind: 'codex_cloud',
296
+ activeProfileFingerprint: fingerprintAuthProvenanceValue(profile, params.env),
297
+ activeAccountFingerprint: fingerprintAuthProvenanceValue(account, params.env),
298
+ cloudEnvId: params.environmentId,
299
+ cloudBranch: params.branch,
300
+ credentialSource,
301
+ authFreshness: credentialSource ? 'env_credential_present' : 'credential_source_unknown'
302
+ };
303
+ }
304
+ export function buildCloudPreflightRequest(params) {
305
+ const env = params.env ?? process.env;
306
+ const branch = normalizeCloudPreflightRequestValue(params.branch)
307
+ ?? normalizeCloudPreflightRequestValue(env.CODEX_CLOUD_BRANCH);
308
+ return {
309
+ repoRoot: params.repoRoot,
310
+ codexBin: resolveCodexCliBin(env),
311
+ environmentId: params.environmentId,
312
+ branch,
313
+ env
314
+ };
315
+ }
58
316
  export async function runCloudPreflight(params) {
59
317
  const issues = [];
60
318
  const branch = normalizeBranch(params.branch);
@@ -74,6 +332,21 @@ export async function runCloudPreflight(params) {
74
332
  message: `Codex CLI is unavailable (${params.codexBin} --version failed).`
75
333
  });
76
334
  }
335
+ if (params.environmentId && codexCheck.exitCode === 0) {
336
+ const environmentCheck = await runCommand(params.codexBin, ['cloud', 'list', '--env', params.environmentId, '--limit', '1', '--json'], {
337
+ cwd: params.repoRoot,
338
+ env: params.env
339
+ });
340
+ if (environmentCheck.exitCode !== 0) {
341
+ issues.push(buildEnvironmentProbeIssue(params.environmentId, environmentCheck));
342
+ }
343
+ else {
344
+ const environmentProbeIssue = inspectSuccessfulEnvironmentProbe(params.environmentId, environmentCheck);
345
+ if (environmentProbeIssue) {
346
+ issues.push(environmentProbeIssue);
347
+ }
348
+ }
349
+ }
77
350
  if (branch) {
78
351
  const gitCheck = await runCommand('git', ['--version'], { cwd: params.repoRoot, env: params.env });
79
352
  if (gitCheck.exitCode !== 0) {
@@ -95,7 +368,12 @@ export async function runCloudPreflight(params) {
95
368
  details: {
96
369
  codexBin: params.codexBin,
97
370
  environmentId: params.environmentId,
98
- branch
371
+ branch,
372
+ authProvenance: buildCloudPreflightAuthProvenance({
373
+ env: params.env,
374
+ environmentId: params.environmentId,
375
+ branch
376
+ })
99
377
  }
100
378
  };
101
379
  }
@@ -0,0 +1,60 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ export function readCodexFeatureProbe(codexBin, env = process.env) {
3
+ const result = spawnSync(codexBin, ['features', 'list'], {
4
+ encoding: 'utf8',
5
+ env,
6
+ stdio: ['ignore', 'pipe', 'pipe'],
7
+ timeout: 5000
8
+ });
9
+ const stderr = String(result.stderr ?? '');
10
+ if (result.error || result.status !== 0) {
11
+ return {
12
+ flags: null,
13
+ stderr,
14
+ error: result.error
15
+ ? result.error.message
16
+ : `codex features list exited with status ${result.status ?? '<unknown>'}`,
17
+ status: result.status
18
+ };
19
+ }
20
+ const stdout = String(result.stdout ?? '');
21
+ return {
22
+ flags: parseFeatureFlagsFromText(stdout),
23
+ stderr,
24
+ error: null,
25
+ status: result.status
26
+ };
27
+ }
28
+ export function codexFeatureProbeRejectsAgentMaxThreads(probe) {
29
+ const text = `${probe.error ?? ''}\n${probe.stderr}`.toLowerCase();
30
+ const mentionsMaxThreads = /\bagents\.max_threads\b/u.test(text) || /\bmax[_\s-]?threads\b/u.test(text);
31
+ return mentionsMaxThreads && /\bmulti_agent_v2\b/u.test(text);
32
+ }
33
+ export function codexFeatureProbeDisablesMultiAgentV2(probe) {
34
+ return probe.flags?.multi_agent_v2 === false;
35
+ }
36
+ function parseFeatureFlagsFromText(stdout) {
37
+ const flags = {};
38
+ for (const line of stdout.split(/\r?\n/u)) {
39
+ const trimmed = line.trim();
40
+ if (!trimmed) {
41
+ continue;
42
+ }
43
+ const tokens = trimmed.split(/\s+/u);
44
+ if (tokens.length < 2) {
45
+ continue;
46
+ }
47
+ const name = tokens[0] ?? '';
48
+ const enabledToken = tokens[tokens.length - 1] ?? '';
49
+ if (!name) {
50
+ continue;
51
+ }
52
+ if (enabledToken === 'true') {
53
+ flags[name] = true;
54
+ }
55
+ else if (enabledToken === 'false') {
56
+ flags[name] = false;
57
+ }
58
+ }
59
+ return flags;
60
+ }
@@ -0,0 +1,250 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { hasMcpServerEntry } from './mcpServerEntry.js';
3
+ export function readDelegationFallbackConfig(configPath) {
4
+ if (!existsSync(configPath)) {
5
+ return null;
6
+ }
7
+ try {
8
+ const raw = readFileSync(configPath, 'utf8');
9
+ if (!hasMcpServerEntry(raw, 'delegation')) {
10
+ return null;
11
+ }
12
+ return {
13
+ command: readDelegationCommandFromConfig(raw),
14
+ args: readDelegationArgsFromConfig(raw),
15
+ envVars: readDelegationEnvVarsFromConfig(raw)
16
+ };
17
+ }
18
+ catch {
19
+ return null;
20
+ }
21
+ }
22
+ function readDelegationCommandFromConfig(raw) {
23
+ const section = readSectionBody(raw, [
24
+ 'mcp_servers.delegation',
25
+ 'mcp_servers."delegation"',
26
+ "mcp_servers.'delegation'"
27
+ ]);
28
+ if (!section) {
29
+ const inlineEntry = readDelegationInlineEntry(raw);
30
+ return inlineEntry ? readInlineQuotedValue(inlineEntry, 'command') : null;
31
+ }
32
+ const commandMatch = section.match(/^\s*command\s*=\s*("(?:\\"|[^"])*"|'(?:\\'|[^'])*')\s*$/mu);
33
+ return commandMatch ? decodeQuotedTomlString(commandMatch[1] ?? '') : null;
34
+ }
35
+ function readDelegationArgsFromConfig(raw) {
36
+ const section = readSectionBody(raw, [
37
+ 'mcp_servers.delegation',
38
+ 'mcp_servers."delegation"',
39
+ "mcp_servers.'delegation'"
40
+ ]);
41
+ if (!section) {
42
+ const inlineEntry = readDelegationInlineEntry(raw);
43
+ return inlineEntry ? readQuotedTokens(readInlinePropertyContents(inlineEntry, 'args', '[', ']')) : [];
44
+ }
45
+ const argsMatch = section.match(/^\s*args\s*=\s*\[([\s\S]*?)\]/mu);
46
+ if (!argsMatch) {
47
+ return [];
48
+ }
49
+ return readQuotedTokens(argsMatch[1] ?? '');
50
+ }
51
+ function readDelegationEnvVarsFromConfig(raw) {
52
+ const envVars = {};
53
+ const section = readSectionBody(raw, [
54
+ 'mcp_servers.delegation.env',
55
+ 'mcp_servers."delegation".env',
56
+ "mcp_servers.'delegation'.env"
57
+ ]);
58
+ if (!section) {
59
+ const inlineEntry = readDelegationInlineEntry(raw);
60
+ return inlineEntry ? readInlineEnvVars(inlineEntry) : envVars;
61
+ }
62
+ const linePattern = /^\s*([A-Za-z0-9_.-]+)\s*=\s*("(?:\\"|[^"])*"|'(?:\\'|[^'])*')\s*$/gmu;
63
+ let match = linePattern.exec(section);
64
+ while (match) {
65
+ const key = match[1];
66
+ const rawValue = match[2];
67
+ const decoded = rawValue ? decodeQuotedTomlString(rawValue) : null;
68
+ if (key && decoded !== null) {
69
+ envVars[key] = decoded;
70
+ }
71
+ match = linePattern.exec(section);
72
+ }
73
+ return envVars;
74
+ }
75
+ function readDelegationInlineEntry(raw) {
76
+ let currentTable = null;
77
+ for (const line of raw.split('\n')) {
78
+ const trimmed = stripTomlComment(line).trim();
79
+ if (!trimmed) {
80
+ continue;
81
+ }
82
+ const tableMatch = trimmed.match(/^\[(.+)\]$/u);
83
+ if (tableMatch) {
84
+ currentTable = tableMatch[1]?.trim() ?? null;
85
+ continue;
86
+ }
87
+ const dottedMatch = trimmed.match(/^mcp_servers\.(?:"delegation"|'delegation'|delegation)\s*=\s*\{([\s\S]*)\}\s*$/u);
88
+ if (dottedMatch) {
89
+ return dottedMatch[1] ?? '';
90
+ }
91
+ if (currentTable === 'mcp_servers') {
92
+ const entryMatch = trimmed.match(/^(?:"delegation"|'delegation'|delegation)\s*=\s*\{([\s\S]*)\}\s*$/u);
93
+ if (entryMatch) {
94
+ return entryMatch[1] ?? '';
95
+ }
96
+ }
97
+ }
98
+ return null;
99
+ }
100
+ function readInlineEnvVars(raw) {
101
+ const envVars = {};
102
+ const envRaw = readInlinePropertyContents(raw, 'env', '{', '}');
103
+ if (!envRaw) {
104
+ return envVars;
105
+ }
106
+ const linePattern = /([A-Za-z0-9_.-]+)\s*=\s*("(?:\\"|[^"])*"|'(?:\\'|[^'])*')/gu;
107
+ let match = linePattern.exec(envRaw);
108
+ while (match) {
109
+ const key = match[1];
110
+ const rawValue = match[2];
111
+ const decoded = rawValue ? decodeQuotedTomlString(rawValue) : null;
112
+ if (key && decoded !== null) {
113
+ envVars[key] = decoded;
114
+ }
115
+ match = linePattern.exec(envRaw);
116
+ }
117
+ return envVars;
118
+ }
119
+ function readInlineQuotedValue(raw, propertyName) {
120
+ const propertyPattern = new RegExp(`\\b${escapeRegExp(propertyName)}\\s*=\\s*("(?:\\\\.|[^"])*"|'(?:\\\\.|[^'])*')`, 'u');
121
+ const propertyMatch = propertyPattern.exec(raw);
122
+ return propertyMatch ? decodeQuotedTomlString(propertyMatch[1] ?? '') : null;
123
+ }
124
+ function readSectionBody(raw, names) {
125
+ let currentTable = null;
126
+ let collecting = false;
127
+ const lines = [];
128
+ for (const line of raw.split('\n')) {
129
+ const trimmed = stripTomlComment(line).trim();
130
+ const tableMatch = trimmed.match(/^\[(.+)\]$/u);
131
+ if (tableMatch) {
132
+ const tableName = tableMatch[1]?.trim() ?? null;
133
+ if (collecting) {
134
+ break;
135
+ }
136
+ currentTable = tableName;
137
+ collecting = currentTable !== null && names.includes(currentTable);
138
+ continue;
139
+ }
140
+ if (collecting) {
141
+ lines.push(line);
142
+ }
143
+ }
144
+ return collecting || lines.length > 0 ? lines.join('\n') : null;
145
+ }
146
+ function readInlinePropertyContents(raw, propertyName, open, close) {
147
+ const propertyPattern = new RegExp(`\\b${escapeRegExp(propertyName)}\\s*=\\s*\\${open}`, 'u');
148
+ const propertyMatch = propertyPattern.exec(raw);
149
+ if (!propertyMatch) {
150
+ return '';
151
+ }
152
+ const openIndex = propertyMatch.index + propertyMatch[0].length - 1;
153
+ return readDelimitedContents(raw, openIndex, open, close);
154
+ }
155
+ function readDelimitedContents(raw, openIndex, open, close) {
156
+ let quote = null;
157
+ let escaped = false;
158
+ let depth = 0;
159
+ let start = -1;
160
+ for (let index = openIndex; index < raw.length; index += 1) {
161
+ const character = raw[index];
162
+ if (escaped) {
163
+ escaped = false;
164
+ continue;
165
+ }
166
+ if (character === '\\' && quote) {
167
+ escaped = true;
168
+ continue;
169
+ }
170
+ if (character === '"' || character === '\'') {
171
+ quote = quote === character ? null : quote ?? character;
172
+ continue;
173
+ }
174
+ if (quote) {
175
+ continue;
176
+ }
177
+ if (character === open) {
178
+ depth += 1;
179
+ if (depth === 1) {
180
+ start = index + 1;
181
+ }
182
+ continue;
183
+ }
184
+ if (character === close) {
185
+ depth -= 1;
186
+ if (depth === 0 && start !== -1) {
187
+ return raw.slice(start, index);
188
+ }
189
+ }
190
+ }
191
+ return '';
192
+ }
193
+ function readQuotedTokens(raw) {
194
+ const tokens = [];
195
+ const tokenPattern = /("(?:\\.|[^"])*"|'(?:\\.|[^'])*')/gu;
196
+ let token = tokenPattern.exec(raw);
197
+ while (token) {
198
+ const decoded = decodeQuotedTomlString(token[1] ?? '');
199
+ if (decoded !== null) {
200
+ tokens.push(decoded);
201
+ }
202
+ token = tokenPattern.exec(raw);
203
+ }
204
+ return tokens;
205
+ }
206
+ function decodeQuotedTomlString(raw) {
207
+ if (!raw || raw.length < 2) {
208
+ return null;
209
+ }
210
+ if (raw.startsWith('"') && raw.endsWith('"')) {
211
+ try {
212
+ return JSON.parse(raw);
213
+ }
214
+ catch {
215
+ const unquoted = raw.slice(1, -1);
216
+ return unquoted
217
+ .replace(/\\\\/gu, '\\')
218
+ .replace(/\\"/gu, '"')
219
+ .replace(/\\'/gu, '\'');
220
+ }
221
+ }
222
+ const unquoted = raw.slice(1, -1);
223
+ return unquoted.replace(/\\'/gu, '\'');
224
+ }
225
+ function stripTomlComment(line) {
226
+ let quote = null;
227
+ let escaped = false;
228
+ for (let index = 0; index < line.length; index += 1) {
229
+ const character = line[index];
230
+ if (escaped) {
231
+ escaped = false;
232
+ continue;
233
+ }
234
+ if (character === '\\' && quote) {
235
+ escaped = true;
236
+ continue;
237
+ }
238
+ if (character === '"' || character === '\'') {
239
+ quote = quote === character ? null : quote ?? character;
240
+ continue;
241
+ }
242
+ if (character === '#' && !quote) {
243
+ return line.slice(0, index);
244
+ }
245
+ }
246
+ return line;
247
+ }
248
+ function escapeRegExp(value) {
249
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
250
+ }