@kbediako/codex-orchestrator 0.1.38 → 0.2.0

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 (299) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/README.md +70 -301
  3. package/bin/codex-orchestrator.js +161 -0
  4. package/codex.orchestrator.json +149 -13
  5. package/dist/bin/codex-orchestrator.js +795 -1154
  6. package/dist/orchestrator/src/cli/adapters/CommandPlanner.js +22 -4
  7. package/dist/orchestrator/src/cli/adapters/CommandReviewer.js +3 -3
  8. package/dist/orchestrator/src/cli/adapters/CommandTester.js +2 -2
  9. package/dist/orchestrator/src/cli/adapters/cloudFailureDiagnostics.js +183 -11
  10. package/dist/orchestrator/src/cli/coStatusAttachCliShell.js +402 -0
  11. package/dist/orchestrator/src/cli/coStatusCliShell.js +429 -0
  12. package/dist/orchestrator/src/cli/coStatusOperatorAutopilotCliShell.js +120 -0
  13. package/dist/orchestrator/src/cli/codexCliShell.js +72 -0
  14. package/dist/orchestrator/src/cli/codexDefaultsSetup.js +49 -11
  15. package/dist/orchestrator/src/cli/config/delegationConfig.js +317 -5
  16. package/dist/orchestrator/src/cli/config/repoConfigPolicy.js +2 -3
  17. package/dist/orchestrator/src/cli/config/userConfig.js +28 -13
  18. package/dist/orchestrator/src/cli/control/authenticatedControlRouteGate.js +69 -0
  19. package/dist/orchestrator/src/cli/control/authenticatedRouteComposition.js +267 -0
  20. package/dist/orchestrator/src/cli/control/authenticatedRouteController.js +5 -0
  21. package/dist/orchestrator/src/cli/control/authenticatedRouteDispatcher.js +41 -0
  22. package/dist/orchestrator/src/cli/control/compatibilityIssuePresenter.js +1035 -0
  23. package/dist/orchestrator/src/cli/control/confirmationApproveController.js +62 -0
  24. package/dist/orchestrator/src/cli/control/confirmationCreateController.js +69 -0
  25. package/dist/orchestrator/src/cli/control/confirmationIssueConsumeController.js +43 -0
  26. package/dist/orchestrator/src/cli/control/confirmationListController.js +22 -0
  27. package/dist/orchestrator/src/cli/control/confirmationValidateController.js +58 -0
  28. package/dist/orchestrator/src/cli/control/confirmations.js +25 -3
  29. package/dist/orchestrator/src/cli/control/controlActionCancelConfirmation.js +65 -0
  30. package/dist/orchestrator/src/cli/control/controlActionController.js +77 -0
  31. package/dist/orchestrator/src/cli/control/controlActionControllerSequencing.js +161 -0
  32. package/dist/orchestrator/src/cli/control/controlActionExecution.js +142 -0
  33. package/dist/orchestrator/src/cli/control/controlActionFinalization.js +43 -0
  34. package/dist/orchestrator/src/cli/control/controlActionOutcome.js +60 -0
  35. package/dist/orchestrator/src/cli/control/controlActionPreflight.js +476 -0
  36. package/dist/orchestrator/src/cli/control/controlAuthenticatedRouteHandoff.js +57 -0
  37. package/dist/orchestrator/src/cli/control/controlBootstrapAssembly.js +39 -0
  38. package/dist/orchestrator/src/cli/control/controlBootstrapMetadataPersistence.js +16 -0
  39. package/dist/orchestrator/src/cli/control/controlEventTransport.js +49 -0
  40. package/dist/orchestrator/src/cli/control/controlExpiryLifecycle.js +102 -0
  41. package/dist/orchestrator/src/cli/control/controlHostOwnership.js +480 -0
  42. package/dist/orchestrator/src/cli/control/controlHostSupervision.js +608 -0
  43. package/dist/orchestrator/src/cli/control/controlOversightFacade.js +8 -0
  44. package/dist/orchestrator/src/cli/control/controlOversightReadContract.js +1 -0
  45. package/dist/orchestrator/src/cli/control/controlOversightReadService.js +16 -0
  46. package/dist/orchestrator/src/cli/control/controlOversightUpdateContract.js +1 -0
  47. package/dist/orchestrator/src/cli/control/controlPersistenceFiles.js +6 -0
  48. package/dist/orchestrator/src/cli/control/controlQuestionChildResolution.js +18 -0
  49. package/dist/orchestrator/src/cli/control/controlRequestContext.js +42 -0
  50. package/dist/orchestrator/src/cli/control/controlRequestController.js +9 -0
  51. package/dist/orchestrator/src/cli/control/controlRequestPredispatch.js +17 -0
  52. package/dist/orchestrator/src/cli/control/controlRequestRouteDispatch.js +44 -0
  53. package/dist/orchestrator/src/cli/control/controlRuntime.js +992 -0
  54. package/dist/orchestrator/src/cli/control/controlServer.js +23 -1456
  55. package/dist/orchestrator/src/cli/control/controlServerAuditAndErrorHelpers.js +115 -0
  56. package/dist/orchestrator/src/cli/control/controlServerAuthenticatedRouteBranch.js +29 -0
  57. package/dist/orchestrator/src/cli/control/controlServerBootstrapLifecycle.js +30 -0
  58. package/dist/orchestrator/src/cli/control/controlServerBootstrapStartSequence.js +21 -0
  59. package/dist/orchestrator/src/cli/control/controlServerOwnedRuntimeLifecycle.js +67 -0
  60. package/dist/orchestrator/src/cli/control/controlServerPublicLifecycle.js +756 -0
  61. package/dist/orchestrator/src/cli/control/controlServerPublicRouteHelpers.js +86 -0
  62. package/dist/orchestrator/src/cli/control/controlServerReadyInstanceLifecycle.js +25 -0
  63. package/dist/orchestrator/src/cli/control/controlServerReadyInstanceStartup.js +18 -0
  64. package/dist/orchestrator/src/cli/control/controlServerRequestBodyHelpers.js +37 -0
  65. package/dist/orchestrator/src/cli/control/controlServerRequestShell.js +40 -0
  66. package/dist/orchestrator/src/cli/control/controlServerRequestShellBinding.js +17 -0
  67. package/dist/orchestrator/src/cli/control/controlServerSeedLoading.js +27 -0
  68. package/dist/orchestrator/src/cli/control/controlServerSeededRuntimeAssembly.js +186 -0
  69. package/dist/orchestrator/src/cli/control/controlServerStartupInputPreparation.js +31 -0
  70. package/dist/orchestrator/src/cli/control/controlServerStartupSequence.js +49 -0
  71. package/dist/orchestrator/src/cli/control/controlState.js +233 -2
  72. package/dist/orchestrator/src/cli/control/controlStatusDashboard.js +1899 -0
  73. package/dist/orchestrator/src/cli/control/controlTelegramBridgeBootstrapLifecycle.js +22 -0
  74. package/dist/orchestrator/src/cli/control/controlTelegramBridgeLifecycle.js +67 -0
  75. package/dist/orchestrator/src/cli/control/controlTelegramBridgeOversightFacadeFactory.js +8 -0
  76. package/dist/orchestrator/src/cli/control/controlTelegramCommandController.js +49 -0
  77. package/dist/orchestrator/src/cli/control/controlTelegramDispatchRead.js +40 -0
  78. package/dist/orchestrator/src/cli/control/controlTelegramPollingController.js +89 -0
  79. package/dist/orchestrator/src/cli/control/controlTelegramProjectionNotificationController.js +29 -0
  80. package/dist/orchestrator/src/cli/control/controlTelegramPushState.js +63 -0
  81. package/dist/orchestrator/src/cli/control/controlTelegramQuestionRead.js +13 -0
  82. package/dist/orchestrator/src/cli/control/controlTelegramReadController.js +216 -0
  83. package/dist/orchestrator/src/cli/control/controlTelegramUpdateHandler.js +63 -0
  84. package/dist/orchestrator/src/cli/control/controlWatcher.js +73 -5
  85. package/dist/orchestrator/src/cli/control/delegationRegisterController.js +35 -0
  86. package/dist/orchestrator/src/cli/control/dynamicToolBridgePolicy.js +139 -0
  87. package/dist/orchestrator/src/cli/control/eventsSseController.js +12 -0
  88. package/dist/orchestrator/src/cli/control/linearBudgetState.js +1789 -0
  89. package/dist/orchestrator/src/cli/control/linearDispatchSource.js +1137 -0
  90. package/dist/orchestrator/src/cli/control/linearGraphqlClient.js +150 -0
  91. package/dist/orchestrator/src/cli/control/linearRateLimit.js +102 -0
  92. package/dist/orchestrator/src/cli/control/linearWebhookController.js +499 -0
  93. package/dist/orchestrator/src/cli/control/liveLinearAdvisoryRuntime.js +70 -0
  94. package/dist/orchestrator/src/cli/control/observabilityApiController.js +173 -0
  95. package/dist/orchestrator/src/cli/control/observabilityReadModel.js +500 -0
  96. package/dist/orchestrator/src/cli/control/observabilitySurface.js +284 -0
  97. package/dist/orchestrator/src/cli/control/observabilityUpdateNotifier.js +22 -0
  98. package/dist/orchestrator/src/cli/control/operatorDashboardPresenter.js +252 -0
  99. package/dist/orchestrator/src/cli/control/providerAgentCapacity.js +70 -0
  100. package/dist/orchestrator/src/cli/control/providerControlHostFreshnessGauge.js +1068 -0
  101. package/dist/orchestrator/src/cli/control/providerIntakeState.js +473 -0
  102. package/dist/orchestrator/src/cli/control/providerIssueHandoff.js +6811 -0
  103. package/dist/orchestrator/src/cli/control/providerIssueObservability.js +1348 -0
  104. package/dist/orchestrator/src/cli/control/providerIssueRetryQueue.js +84 -0
  105. package/dist/orchestrator/src/cli/control/providerLinearRuntimeProof.js +588 -0
  106. package/dist/orchestrator/src/cli/control/providerLinearScreenshotProof.js +473 -0
  107. package/dist/orchestrator/src/cli/control/providerLinearWorkerTruth.js +383 -0
  108. package/dist/orchestrator/src/cli/control/providerLinearWorkflowAudit.js +254 -0
  109. package/dist/orchestrator/src/cli/control/providerLinearWorkflowFacade.js +5573 -0
  110. package/dist/orchestrator/src/cli/control/providerLinearWorkflowStates.js +115 -0
  111. package/dist/orchestrator/src/cli/control/providerMergeCloseout.js +1868 -0
  112. package/dist/orchestrator/src/cli/control/providerOperatorAutopilot.js +1580 -0
  113. package/dist/orchestrator/src/cli/control/providerOperatorAutopilotLifecycle.js +154 -0
  114. package/dist/orchestrator/src/cli/control/providerOperatorAutopilotLocalRolloutExecution.js +1006 -0
  115. package/dist/orchestrator/src/cli/control/providerPollingHealth.js +435 -0
  116. package/dist/orchestrator/src/cli/control/providerTerminalCleanup.js +516 -0
  117. package/dist/orchestrator/src/cli/control/providerWorkerHosts.js +191 -0
  118. package/dist/orchestrator/src/cli/control/providerWorkflowConfigStore.js +515 -0
  119. package/dist/orchestrator/src/cli/control/questionChildResolutionAdapter.js +361 -0
  120. package/dist/orchestrator/src/cli/control/questionQueueController.js +181 -0
  121. package/dist/orchestrator/src/cli/control/questionReadRetryDeduplication.js +9 -0
  122. package/dist/orchestrator/src/cli/control/questionReadSequence.js +10 -0
  123. package/dist/orchestrator/src/cli/control/securityViolationController.js +27 -0
  124. package/dist/orchestrator/src/cli/control/selectedRunProjection.js +1838 -0
  125. package/dist/orchestrator/src/cli/control/telegramOversightApiClient.js +48 -0
  126. package/dist/orchestrator/src/cli/control/telegramOversightBridge.js +180 -0
  127. package/dist/orchestrator/src/cli/control/telegramOversightBridgeProjectionDeliveryQueue.js +25 -0
  128. package/dist/orchestrator/src/cli/control/telegramOversightBridgeRuntimeLifecycle.js +45 -0
  129. package/dist/orchestrator/src/cli/control/telegramOversightBridgeStateStore.js +77 -0
  130. package/dist/orchestrator/src/cli/control/telegramOversightControlActionApiClient.js +45 -0
  131. package/dist/orchestrator/src/cli/control/trackerDispatchPilot.js +439 -0
  132. package/dist/orchestrator/src/cli/control/uiDataController.js +34 -0
  133. package/dist/orchestrator/src/cli/control/uiSessionController.js +100 -0
  134. package/dist/orchestrator/src/cli/controlHostCliShell.js +860 -0
  135. package/dist/orchestrator/src/cli/controlHostFreshnessGaugeCliShell.js +129 -0
  136. package/dist/orchestrator/src/cli/controlHostSupervisionCliShell.js +2127 -0
  137. package/dist/orchestrator/src/cli/delegationCliShell.js +62 -0
  138. package/dist/orchestrator/src/cli/delegationServer.js +567 -678
  139. package/dist/orchestrator/src/cli/delegationServerCliShell.js +52 -0
  140. package/dist/orchestrator/src/cli/delegationServerQuestionFlowShell.js +228 -0
  141. package/dist/orchestrator/src/cli/delegationServerToolDispatchShell.js +411 -0
  142. package/dist/orchestrator/src/cli/delegationServerTransport.js +274 -0
  143. package/dist/orchestrator/src/cli/delegationSetup.js +51 -171
  144. package/dist/orchestrator/src/cli/devtoolsCliShell.js +34 -0
  145. package/dist/orchestrator/src/cli/doctor.js +542 -122
  146. package/dist/orchestrator/src/cli/doctorCliRequestShell.js +72 -0
  147. package/dist/orchestrator/src/cli/doctorCliShell.js +138 -0
  148. package/dist/orchestrator/src/cli/doctorUsage.js +119 -15
  149. package/dist/orchestrator/src/cli/exec/experience.js +16 -2
  150. package/dist/orchestrator/src/cli/exec/summary.js +3 -0
  151. package/dist/orchestrator/src/cli/execCliShell.js +51 -0
  152. package/dist/orchestrator/src/cli/flowCliRequestShell.js +44 -0
  153. package/dist/orchestrator/src/cli/flowCliShell.js +239 -0
  154. package/dist/orchestrator/src/cli/frontendTestCliRequestShell.js +80 -0
  155. package/dist/orchestrator/src/cli/frontendTestCliShell.js +41 -0
  156. package/dist/orchestrator/src/cli/init.js +1 -0
  157. package/dist/orchestrator/src/cli/initCliShell.js +50 -0
  158. package/dist/orchestrator/src/cli/linearCliShell.js +1200 -0
  159. package/dist/orchestrator/src/cli/mcpEnableCliShell.js +132 -0
  160. package/dist/orchestrator/src/cli/metrics/metricsAggregator.js +3 -2
  161. package/dist/orchestrator/src/cli/metrics/metricsRecorder.js +56 -0
  162. package/dist/orchestrator/src/cli/orchestrator.js +66 -1376
  163. package/dist/orchestrator/src/cli/planCliShell.js +19 -0
  164. package/dist/orchestrator/src/cli/prCliShell.js +41 -0
  165. package/dist/orchestrator/src/cli/providerLinearChildLanePhaseContract.js +204 -0
  166. package/dist/orchestrator/src/cli/providerLinearChildLaneRunner.js +1772 -0
  167. package/dist/orchestrator/src/cli/providerLinearChildLaneShell.js +2420 -0
  168. package/dist/orchestrator/src/cli/providerLinearChildStreamShell.js +385 -0
  169. package/dist/orchestrator/src/cli/providerLinearWorkerRunner.js +5738 -0
  170. package/dist/orchestrator/src/cli/resumeCliShell.js +14 -0
  171. package/dist/orchestrator/src/cli/reviewCliLaunchShell.js +72 -0
  172. package/dist/orchestrator/src/cli/rlm/alignment.js +3 -3
  173. package/dist/orchestrator/src/cli/rlm/context.js +94 -7
  174. package/dist/orchestrator/src/cli/rlm/rlmCodexRuntimeShell.js +546 -0
  175. package/dist/orchestrator/src/cli/rlm/symbolic.js +4 -2
  176. package/dist/orchestrator/src/cli/rlmCliRequestShell.js +42 -0
  177. package/dist/orchestrator/src/cli/rlmCompletionCliShell.js +46 -0
  178. package/dist/orchestrator/src/cli/rlmLaunchCliShell.js +51 -0
  179. package/dist/orchestrator/src/cli/rlmRunner.js +83 -523
  180. package/dist/orchestrator/src/cli/run/blockMemory.js +500 -0
  181. package/dist/orchestrator/src/cli/run/manifest.js +410 -73
  182. package/dist/orchestrator/src/cli/run/manifestPersister.js +45 -14
  183. package/dist/orchestrator/src/cli/run/runMemoryController.js +216 -0
  184. package/dist/orchestrator/src/cli/run/source0.js +690 -0
  185. package/dist/orchestrator/src/cli/run/workspacePath.js +101 -0
  186. package/dist/orchestrator/src/cli/runtime/mode.js +2 -1
  187. package/dist/orchestrator/src/cli/runtime/provider.js +39 -2
  188. package/dist/orchestrator/src/cli/selfCheckCliShell.js +12 -0
  189. package/dist/orchestrator/src/cli/services/commandRunner.js +667 -18
  190. package/dist/orchestrator/src/cli/services/execRuntime.js +66 -1
  191. package/dist/orchestrator/src/cli/services/orchestratorAutoScoutEvidenceRecorder.js +71 -0
  192. package/dist/orchestrator/src/cli/services/orchestratorCloudBranchResolution.js +8 -0
  193. package/dist/orchestrator/src/cli/services/orchestratorCloudEnvironmentResolution.js +22 -0
  194. package/dist/orchestrator/src/cli/services/orchestratorCloudExecutionLifecycleShell.js +39 -0
  195. package/dist/orchestrator/src/cli/services/orchestratorCloudPromptBuilder.js +37 -0
  196. package/dist/orchestrator/src/cli/services/orchestratorCloudRouteFallbackContract.js +45 -0
  197. package/dist/orchestrator/src/cli/services/orchestratorCloudRouteShell.js +36 -0
  198. package/dist/orchestrator/src/cli/services/orchestratorCloudTargetExecutor.js +277 -0
  199. package/dist/orchestrator/src/cli/services/orchestratorControlPlaneLifecycle.js +98 -0
  200. package/dist/orchestrator/src/cli/services/orchestratorControlPlaneLifecycleShell.js +54 -0
  201. package/dist/orchestrator/src/cli/services/orchestratorExecutionLifecycle.js +112 -0
  202. package/dist/orchestrator/src/cli/services/orchestratorExecutionModePolicy.js +27 -0
  203. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteAdapterShell.js +59 -0
  204. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteDecisionShell.js +57 -0
  205. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteState.js +21 -0
  206. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouter.js +2 -0
  207. package/dist/orchestrator/src/cli/services/orchestratorLocalPipelineExecutor.js +149 -0
  208. package/dist/orchestrator/src/cli/services/orchestratorLocalRouteShell.js +63 -0
  209. package/dist/orchestrator/src/cli/services/orchestratorPlanShell.js +54 -0
  210. package/dist/orchestrator/src/cli/services/orchestratorPlanTargetTracker.js +16 -0
  211. package/dist/orchestrator/src/cli/services/orchestratorResumePreparationShell.js +84 -0
  212. package/dist/orchestrator/src/cli/services/orchestratorResumeTokenValidation.js +15 -0
  213. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleCompletion.js +31 -0
  214. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleExecutionRegistration.js +37 -0
  215. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleOrchestrationShell.js +83 -0
  216. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleTaskManagerShell.js +37 -0
  217. package/dist/orchestrator/src/cli/services/orchestratorRuntimeManifestMutation.js +20 -0
  218. package/dist/orchestrator/src/cli/services/orchestratorStartPreparationShell.js +56 -0
  219. package/dist/orchestrator/src/cli/services/orchestratorStatusShell.js +70 -0
  220. package/dist/orchestrator/src/cli/services/pipelineResolver.js +7 -3
  221. package/dist/orchestrator/src/cli/services/plannerMemory.js +119 -0
  222. package/dist/orchestrator/src/cli/services/runPreparation.js +7 -3
  223. package/dist/orchestrator/src/cli/services/runSummaryWriter.js +9 -0
  224. package/dist/orchestrator/src/cli/setupBootstrapShell.js +114 -0
  225. package/dist/orchestrator/src/cli/setupCliShell.js +51 -0
  226. package/dist/orchestrator/src/cli/skillsCliShell.js +56 -0
  227. package/dist/orchestrator/src/cli/startCliRequestShell.js +53 -0
  228. package/dist/orchestrator/src/cli/startCliShell.js +68 -0
  229. package/dist/orchestrator/src/cli/statusCliShell.js +22 -0
  230. package/dist/orchestrator/src/cli/utils/authProvenanceFingerprint.js +27 -0
  231. package/dist/orchestrator/src/cli/utils/cloudPreflight.js +83 -1
  232. package/dist/orchestrator/src/cli/utils/delegationConfigParser.js +250 -0
  233. package/dist/orchestrator/src/cli/utils/delegationMcpHealth.js +1382 -0
  234. package/dist/orchestrator/src/cli/utils/devtools.js +2 -54
  235. package/dist/orchestrator/src/cli/utils/mcpServerEntry.js +53 -0
  236. package/dist/orchestrator/src/cli/utils/packageProgramResolver.js +151 -0
  237. package/dist/orchestrator/src/cli/utils/providerOverrideEnv.js +71 -0
  238. package/dist/orchestrator/src/cli/utils/trailingJsonObject.js +59 -0
  239. package/dist/orchestrator/src/learning/crystalizer.js +2 -2
  240. package/dist/orchestrator/src/persistence/ExperienceStore.js +233 -49
  241. package/dist/orchestrator/src/persistence/TaskStateStore.js +6 -6
  242. package/dist/orchestrator/src/persistence/lockFile.js +70 -4
  243. package/dist/orchestrator/src/persistence/sanitizeIdentifier.js +39 -0
  244. package/dist/orchestrator/src/sync/createCloudSyncWorker.js +3 -2
  245. package/dist/orchestrator/src/utils/atomicWrite.js +17 -2
  246. package/dist/packages/orchestrator/src/exec/unified-exec.js +99 -6
  247. package/dist/packages/orchestrator/src/instructions/promptPacks.js +150 -19
  248. package/dist/packages/sdk-node/src/orchestrator.js +137 -13
  249. package/dist/packages/shared/config/designConfig.js +8 -1
  250. package/dist/packages/shared/streams/stdio.js +1 -1
  251. package/dist/scripts/design/pipeline/permit.js +15 -0
  252. package/dist/scripts/lib/docs-catalog.js +365 -0
  253. package/dist/scripts/lib/docs-helpers.js +87 -5
  254. package/dist/scripts/lib/pr-watch-merge.js +1088 -80
  255. package/dist/scripts/lib/provider-run-contract.js +26 -0
  256. package/dist/scripts/lib/review-command-intent-classification.js +532 -0
  257. package/dist/scripts/lib/review-command-probe-classification.js +385 -0
  258. package/dist/scripts/lib/review-execution-boundary-preflight.js +279 -0
  259. package/dist/scripts/lib/review-execution-runtime.js +753 -0
  260. package/dist/scripts/lib/review-execution-state.js +1144 -0
  261. package/dist/scripts/lib/review-execution-telemetry.js +215 -0
  262. package/dist/scripts/lib/review-inspection-target-parsing.js +78 -0
  263. package/dist/scripts/lib/review-launch-attempt.js +601 -0
  264. package/dist/scripts/lib/review-meta-surface-boundary-analysis.js +300 -0
  265. package/dist/scripts/lib/review-meta-surface-normalization.js +746 -0
  266. package/dist/scripts/lib/review-non-interactive-handoff.js +61 -0
  267. package/dist/scripts/lib/review-prompt-context.js +376 -0
  268. package/dist/scripts/lib/review-scope-advisory.js +286 -0
  269. package/dist/scripts/lib/review-scope-paths.js +123 -0
  270. package/dist/scripts/lib/review-shell-command-parser.js +389 -0
  271. package/dist/scripts/lib/review-shell-env-interpreter.js +340 -0
  272. package/dist/scripts/lib/run-manifests.js +192 -36
  273. package/dist/scripts/lib/spark-policy-classifier.js +593 -0
  274. package/dist/scripts/run-review.js +507 -1777
  275. package/docs/public/downstream-setup.md +106 -0
  276. package/docs/public/provider-onboarding.md +173 -0
  277. package/package.json +20 -10
  278. package/plugins/codex-orchestrator/.codex-plugin/plugin.json +30 -0
  279. package/plugins/codex-orchestrator/.mcp.json +13 -0
  280. package/plugins/codex-orchestrator/launcher.mjs +359 -0
  281. package/schemas/manifest.json +394 -0
  282. package/skills/collab-subagents-first/SKILL.md +1 -1
  283. package/skills/delegation-usage/DELEGATION_GUIDE.md +24 -11
  284. package/skills/delegation-usage/SKILL.md +19 -13
  285. package/skills/land/SKILL.md +77 -0
  286. package/skills/linear/SKILL.md +255 -0
  287. package/skills/release/SKILL.md +47 -3
  288. package/skills/standalone-review/SKILL.md +6 -1
  289. package/templates/README.md +4 -2
  290. package/templates/codex/.codex/agents/awaiter-high.toml +2 -2
  291. package/templates/codex/.codex/agents/worker-complex.toml +1 -1
  292. package/templates/codex/.codex/config.toml +3 -4
  293. package/templates/codex/.codex/providers/README.md +13 -0
  294. package/templates/codex/.codex/providers/control.example.json +18 -0
  295. package/templates/codex/.codex/providers/provider.env.example +15 -0
  296. package/templates/codex/AGENTS.md +12 -7
  297. package/templates/codex/mcp-client.json +5 -1
  298. package/docs/README.md +0 -310
  299. package/docs/assets/setup.gif +0 -0
@@ -0,0 +1,429 @@
1
+ /* eslint-disable patterns/prefer-logger-over-console */
2
+ import { join, resolve, sep } from 'node:path';
3
+ import { readUiDatasetWithEndpointRecovery, resolveAttachTarget, runCoStatusAttachCliShell } from './coStatusAttachCliShell.js';
4
+ import { readControlServerSeeds } from './control/controlServerSeedLoading.js';
5
+ import { ControlStateStore } from './control/controlState.js';
6
+ import { createControlRuntime } from './control/controlRuntime.js';
7
+ import { normalizeLinearAdvisoryState } from './control/linearWebhookController.js';
8
+ import { readUiDataset } from './control/operatorDashboardPresenter.js';
9
+ import { evaluateProviderControlHostFreshnessGauge } from './control/providerControlHostFreshnessGauge.js';
10
+ import { normalizeProviderIntakeState } from './control/providerIntakeState.js';
11
+ const CO_STATUS_ATTACH_UNSUPPORTED_FLAGS = ['pipeline'];
12
+ const LOCAL_DEGRADED_FALLBACK_ALLOWED_VERDICTS = new Set([
13
+ 'healthy',
14
+ 'degraded'
15
+ ]);
16
+ const LOCAL_DEGRADED_FALLBACK_ALLOWED_FINDING_CODES = new Set(['active_worker_proof_missing']);
17
+ export async function runCoStatusCliShell(params) {
18
+ if (params.flags.help !== undefined) {
19
+ params.printHelp();
20
+ return;
21
+ }
22
+ assertAttachCompatibleFlags(params.flags);
23
+ const format = readStringFlag(params.flags, 'format') === 'json' ? 'json' : 'text';
24
+ if (format !== 'json') {
25
+ await runCoStatusAttachCliShell(params);
26
+ return;
27
+ }
28
+ const dataset = await readCoStatusJsonDataset({ flags: params.flags });
29
+ console.log(JSON.stringify(dataset, null, 2));
30
+ }
31
+ export async function readCoStatusJsonDataset(input) {
32
+ let target = await resolveAttachTarget(input.flags);
33
+ try {
34
+ return await readUiDatasetWithEndpointRecovery({
35
+ flags: input.flags,
36
+ getTarget: () => target,
37
+ setTarget: (nextTarget) => {
38
+ target = nextTarget;
39
+ },
40
+ requestTimeoutMs: input.requestTimeoutMs,
41
+ recoverSameEndpointTimeout: true
42
+ });
43
+ }
44
+ catch (error) {
45
+ const degradedDataset = await tryReadLocalDegradedUiDataset({
46
+ error,
47
+ target
48
+ });
49
+ if (degradedDataset) {
50
+ return degradedDataset;
51
+ }
52
+ throw error;
53
+ }
54
+ }
55
+ function readStringFlag(flags, key) {
56
+ const value = flags[key];
57
+ if (typeof value !== 'string') {
58
+ return undefined;
59
+ }
60
+ const trimmed = value.trim();
61
+ return trimmed.length > 0 ? trimmed : undefined;
62
+ }
63
+ function assertAttachCompatibleFlags(flags) {
64
+ const unsupported = CO_STATUS_ATTACH_UNSUPPORTED_FLAGS.filter((flag) => flags[flag] !== undefined);
65
+ if (unsupported.length === 0) {
66
+ return;
67
+ }
68
+ const renderedFlags = unsupported.map((flag) => `--${flag}`).join(', ');
69
+ throw new Error(`co-status attaches to an existing control host and does not accept launch-only flags: ${renderedFlags}. Use \`control-host\` to start a control host with launch settings.`);
70
+ }
71
+ async function tryReadLocalDegradedUiDataset(input) {
72
+ if (!isUiRequestTimeoutError(input.error)) {
73
+ return null;
74
+ }
75
+ const freshnessReport = await evaluateProviderControlHostFreshnessGauge({
76
+ artifactRoot: input.target.runDir
77
+ });
78
+ const refreshAgeVerdict = freshnessReport.metrics.last_successful_refresh_age_ms.verdict;
79
+ if (!isEligibleLocalDegradedFallbackFreshnessReport(freshnessReport) ||
80
+ !LOCAL_DEGRADED_FALLBACK_ALLOWED_VERDICTS.has(refreshAgeVerdict)) {
81
+ return null;
82
+ }
83
+ const localDataset = await readLocalUiDataset(input.target);
84
+ const dataset = applyProviderIntakeTruthOverlay(localDataset.dataset, input.target, localDataset.providerIntakeState);
85
+ const providerIntake = dataset.provider_intake ?? null;
86
+ if (!providerIntake || providerIntake.active_claim_count < 1) {
87
+ return null;
88
+ }
89
+ return {
90
+ ...dataset,
91
+ degraded_read: buildDegradedReadPayload(input.target, freshnessReport)
92
+ };
93
+ }
94
+ function isUiRequestTimeoutError(error) {
95
+ const message = error?.message ?? String(error);
96
+ return message.includes('control-host ui request timeout after');
97
+ }
98
+ function isEligibleLocalDegradedFallbackFreshnessReport(report) {
99
+ if (LOCAL_DEGRADED_FALLBACK_ALLOWED_VERDICTS.has(report.verdict)) {
100
+ return true;
101
+ }
102
+ if (report.verdict !== 'unknown') {
103
+ return false;
104
+ }
105
+ return (report.findings.length > 0 &&
106
+ report.findings.every((finding) => LOCAL_DEGRADED_FALLBACK_ALLOWED_FINDING_CODES.has(finding.code)));
107
+ }
108
+ function buildDegradedReadPayload(target, report) {
109
+ return {
110
+ reason: 'ui_request_timeout',
111
+ source: 'local_seeded_runtime',
112
+ freshness_verdict: report.verdict,
113
+ artifact_root: target.runDir,
114
+ finding_codes: report.findings.map((finding) => finding.code)
115
+ };
116
+ }
117
+ function applyProviderIntakeTruthOverlay(dataset, target, providerIntakeState) {
118
+ const providerIntake = dataset.provider_intake ?? null;
119
+ const selectedClaim = selectDegradedOverlayClaim(providerIntakeState, providerIntake?.selected_claim.issue_identifier);
120
+ if (!selectedClaim) {
121
+ return dataset;
122
+ }
123
+ const activeClaims = [...providerIntakeState.claims]
124
+ .sort(compareDegradedClaims)
125
+ .filter(isDegradedActiveClaim);
126
+ const runningClaims = activeClaims.filter((claim) => resolveDegradedClaimState(claim) === 'running');
127
+ const status = resolveDegradedClaimStatus(resolveDegradedClaimState(selectedClaim));
128
+ const selected = buildDegradedSelectedPayload(dataset.selected, selectedClaim, target, status);
129
+ const runningEntries = runningClaims.map((claim) => buildDegradedRunningSessionPayload(claim, selected, dataset.host));
130
+ const synthesizedIssues = activeClaims.length > 0 ? activeClaims : [selectedClaim];
131
+ const issues = [
132
+ ...synthesizedIssues.map((claim) => buildDegradedIssuePayload(dataset.issues.find((entry) => entry.issue_identifier === claim.issue_identifier) ?? null, claim, selected, dataset.host, resolveDegradedClaimStatus(resolveDegradedClaimState(claim)))),
133
+ ...dataset.issues.filter((entry) => entry.issue_identifier !== selected.issue_identifier &&
134
+ !synthesizedIssues.some((claim) => claim.issue_identifier === entry.issue_identifier) &&
135
+ !isDegradedPlaceholderIssue(entry, target))
136
+ ].map((entry) => ({
137
+ ...entry,
138
+ is_selected: entry.issue_identifier === selected.issue_identifier
139
+ }));
140
+ return {
141
+ ...dataset,
142
+ counts: {
143
+ ...dataset.counts,
144
+ running: runningEntries.length > 0 ? runningEntries.length : dataset.counts.running,
145
+ issues: issues.length
146
+ },
147
+ selected_issue_identifier: selected.issue_identifier,
148
+ selected,
149
+ running: runningEntries.length > 0 ? runningEntries : dataset.running,
150
+ issues
151
+ };
152
+ }
153
+ function selectDegradedOverlayClaim(state, selectedIssueIdentifier) {
154
+ const activeClaims = [...state.claims].sort(compareDegradedClaims).filter(isDegradedActiveClaim);
155
+ const preferred = typeof selectedIssueIdentifier === 'string'
156
+ ? activeClaims.find((claim) => claim.issue_identifier === selectedIssueIdentifier) ??
157
+ state.claims.find((claim) => claim.issue_identifier === selectedIssueIdentifier) ??
158
+ null
159
+ : null;
160
+ return preferred ?? activeClaims[0] ?? state.claims[0] ?? null;
161
+ }
162
+ function isDegradedActiveClaim(claim) {
163
+ switch (claim.state) {
164
+ case 'accepted':
165
+ case 'starting':
166
+ case 'running':
167
+ case 'resuming':
168
+ case 'resumable':
169
+ case 'handoff_failed':
170
+ return true;
171
+ default:
172
+ return false;
173
+ }
174
+ }
175
+ function compareDegradedClaims(left, right) {
176
+ return rankDegradedClaimState(right.state) - rankDegradedClaimState(left.state)
177
+ || Date.parse(right.updated_at) - Date.parse(left.updated_at);
178
+ }
179
+ function rankDegradedClaimState(state) {
180
+ switch (state) {
181
+ case 'running':
182
+ return 9;
183
+ case 'resuming':
184
+ return 8;
185
+ case 'starting':
186
+ return 7;
187
+ case 'resumable':
188
+ return 6;
189
+ case 'accepted':
190
+ return 5;
191
+ case 'released':
192
+ return 4;
193
+ case 'handoff_failed':
194
+ return 3;
195
+ case 'completed':
196
+ return 2;
197
+ case 'duplicate':
198
+ return 1;
199
+ case 'stale':
200
+ return 0;
201
+ case 'ignored':
202
+ default:
203
+ return -1;
204
+ }
205
+ }
206
+ function isDegradedPlaceholderIssue(issue, target) {
207
+ return (issue.task_id === (target.taskId ?? issue.task_id) &&
208
+ issue.run_id === (target.runId ?? issue.run_id) &&
209
+ (issue.issue_identifier === (target.taskId ?? null) ||
210
+ issue.issue_identifier === (target.runId ?? null)));
211
+ }
212
+ function buildDegradedSelectedPayload(existing, claim, target, status) {
213
+ const latestEvent = buildDegradedLatestEvent(claim);
214
+ return {
215
+ issue_id: claim.issue_id,
216
+ issue_identifier: claim.issue_identifier,
217
+ task_id: claim.task_id,
218
+ run_id: claim.run_id,
219
+ raw_status: status.raw_status,
220
+ display_status: status.display_status,
221
+ status_reason: claim.reason,
222
+ started_at: existing?.started_at ?? null,
223
+ updated_at: claim.updated_at,
224
+ completed_at: null,
225
+ summary: claim.issue_title,
226
+ last_error: existing?.last_error ?? null,
227
+ latest_action: existing?.latest_action ?? null,
228
+ latest_event: latestEvent,
229
+ workspace: {
230
+ path: existing?.workspace.path ?? resolve(target.runDir, '..', '..', '..')
231
+ },
232
+ ...(claim.worker_host !== undefined ? { worker_host: claim.worker_host ?? null } : {}),
233
+ question_summary: existing?.question_summary ?? {
234
+ queued_count: 0,
235
+ latest_question: null
236
+ },
237
+ tracked: existing?.tracked ?? { linear: null }
238
+ };
239
+ }
240
+ function buildDegradedIssuePayload(existing, claim, selected, host, status) {
241
+ const running = resolveDegradedClaimState(claim) === 'running' ? buildDegradedRunningPayload(claim) : null;
242
+ return {
243
+ issue_identifier: claim.issue_identifier,
244
+ issue_id: claim.issue_id,
245
+ task_id: claim.task_id,
246
+ run_id: claim.run_id,
247
+ status: status.issue_status,
248
+ raw_status: status.raw_status,
249
+ display_status: status.display_status,
250
+ status_reason: claim.reason,
251
+ title: claim.issue_title,
252
+ url: existing?.url ?? null,
253
+ workspace: {
254
+ path: selected.workspace.path,
255
+ host
256
+ },
257
+ ...(claim.worker_host !== undefined ? { worker_host: claim.worker_host ?? null } : {}),
258
+ session: {
259
+ session_id: existing?.session.session_id ?? null,
260
+ thread_id: existing?.session.thread_id ?? null,
261
+ turn_count: existing?.session.turn_count ?? null
262
+ },
263
+ owner: existing?.owner ?? {
264
+ phase: null,
265
+ status: null
266
+ },
267
+ tokens: existing?.tokens ?? null,
268
+ rate_limits: existing?.rate_limits ?? null,
269
+ summary: claim.issue_title,
270
+ last_error: existing?.last_error ?? null,
271
+ latest_event: buildDegradedLatestEvent(claim),
272
+ recent_agent_activity: existing?.recent_agent_activity ?? [],
273
+ linear_activity: existing?.linear_activity ?? [],
274
+ running,
275
+ retry: existing?.retry ?? null,
276
+ attempts: existing?.attempts ?? {
277
+ restart_count: null,
278
+ current_retry_attempt: claim.retry_attempt ?? null
279
+ },
280
+ tracked: existing?.tracked ?? selected.tracked,
281
+ provider_linear_worker_proof: existing?.provider_linear_worker_proof ?? null,
282
+ provider_debug_snapshot: existing?.provider_debug_snapshot ?? null,
283
+ is_selected: true
284
+ };
285
+ }
286
+ function buildDegradedRunningPayload(claim) {
287
+ return {
288
+ issue_id: claim.issue_id,
289
+ issue_identifier: claim.issue_identifier,
290
+ state: 'running',
291
+ display_state: 'running',
292
+ status_reason: claim.reason,
293
+ pid: null,
294
+ ...(claim.worker_host !== undefined ? { worker_host: claim.worker_host ?? null } : {}),
295
+ session_id: null,
296
+ turn_count: null,
297
+ last_event: 'provider_intake_refresh',
298
+ last_message: claim.reason,
299
+ display_event: 'provider_intake_refresh',
300
+ event_source: 'provider_intake_state',
301
+ message_recorded_at: claim.updated_at,
302
+ source_updated_at: claim.updated_at,
303
+ started_at: null,
304
+ last_event_at: claim.updated_at,
305
+ tokens: {
306
+ input_tokens: null,
307
+ output_tokens: null,
308
+ total_tokens: null
309
+ }
310
+ };
311
+ }
312
+ function buildDegradedRunningSessionPayload(claim, selected, host) {
313
+ return {
314
+ issue_identifier: claim.issue_identifier,
315
+ issue_id: claim.issue_id,
316
+ id: claim.issue_identifier,
317
+ bucket: 'running',
318
+ state: 'running',
319
+ reason: claim.reason,
320
+ aliases: [claim.task_id, claim.run_id].filter((value) => Boolean(value)),
321
+ task_id: claim.task_id,
322
+ run_id: claim.run_id,
323
+ summary: claim.issue_title,
324
+ display_state: 'running',
325
+ status_reason: claim.reason,
326
+ pid: null,
327
+ session_id: null,
328
+ thread_id: null,
329
+ turn_count: null,
330
+ workspace_path: selected.workspace.path,
331
+ host,
332
+ ...(claim.worker_host !== undefined ? { worker_host: claim.worker_host ?? null } : {}),
333
+ last_event: 'provider_intake_refresh',
334
+ last_message: claim.reason,
335
+ display_event: 'provider_intake_refresh',
336
+ started_at: null,
337
+ last_event_at: claim.updated_at,
338
+ tokens: {
339
+ input_tokens: null,
340
+ output_tokens: null,
341
+ total_tokens: null
342
+ }
343
+ };
344
+ }
345
+ function buildDegradedLatestEvent(claim) {
346
+ return {
347
+ event: 'provider_intake_refresh',
348
+ message: claim.reason,
349
+ at: claim.updated_at
350
+ };
351
+ }
352
+ function resolveDegradedClaimStatus(state) {
353
+ if (state === 'running') {
354
+ return {
355
+ raw_status: 'in_progress',
356
+ display_status: 'running',
357
+ issue_status: 'running'
358
+ };
359
+ }
360
+ return {
361
+ raw_status: state,
362
+ display_status: state,
363
+ issue_status: state
364
+ };
365
+ }
366
+ function resolveDegradedClaimState(claim) {
367
+ return claim.state === 'handoff_failed' && claim.reason === 'provider_issue_handoff_owned'
368
+ ? 'handoff_owned'
369
+ : claim.state;
370
+ }
371
+ async function readLocalUiDataset(target) {
372
+ const paths = buildRunPathsFromTarget(target);
373
+ const { controlSeed, linearAdvisorySeed, providerIntakeSeed } = await readControlServerSeeds(paths);
374
+ const providerIntakeState = normalizeProviderIntakeState(providerIntakeSeed);
375
+ const controlStore = new ControlStateStore({
376
+ runId: target.runId ?? 'control-host',
377
+ controlSeq: controlSeed?.control_seq ?? 0,
378
+ latestAction: controlSeed?.latest_action ?? null,
379
+ featureToggles: controlSeed?.feature_toggles ?? null,
380
+ transportMutation: controlSeed?.transport_mutation ?? null
381
+ });
382
+ const runtime = createControlRuntime({
383
+ controlStore,
384
+ questionQueue: { list: () => [] },
385
+ paths,
386
+ linearAdvisoryState: normalizeLinearAdvisoryState(linearAdvisorySeed),
387
+ providerIntakeState
388
+ });
389
+ return {
390
+ dataset: await readUiDataset({
391
+ readCompatibilityProjection: () => runtime.snapshot().readCompatibilityProjection()
392
+ }),
393
+ providerIntakeState
394
+ };
395
+ }
396
+ function buildRunPathsFromTarget(target) {
397
+ const runDir = resolve(target.runDir);
398
+ const manifestPath = resolve(target.manifestPath);
399
+ return {
400
+ runDir,
401
+ manifestPath,
402
+ heartbeatPath: join(runDir, '.heartbeat'),
403
+ resumeTokenPath: join(runDir, '.resume-token'),
404
+ logPath: join(runDir, 'runner.ndjson'),
405
+ eventsPath: join(runDir, 'events.jsonl'),
406
+ controlPath: join(runDir, 'control.json'),
407
+ controlAuthPath: join(runDir, 'control_auth.json'),
408
+ controlEndpointPath: join(runDir, 'control_endpoint.json'),
409
+ confirmationsPath: join(runDir, 'confirmations.json'),
410
+ questionsPath: join(runDir, 'questions.json'),
411
+ delegationTokensPath: join(runDir, 'delegation_tokens.json'),
412
+ commandsDir: join(runDir, 'commands'),
413
+ errorsDir: join(runDir, 'errors'),
414
+ compatDir: join(findTaskCliDir(runDir), 'mcp', target.runId ?? 'control-host'),
415
+ compatManifestPath: join(findTaskCliDir(runDir), 'mcp', target.runId ?? 'control-host', 'manifest.json'),
416
+ localCompatDir: join(findRunsRoot(runDir), 'local-mcp', target.runId ?? 'control-host')
417
+ };
418
+ }
419
+ function findTaskCliDir(runDir) {
420
+ return resolve(runDir, '..', '..');
421
+ }
422
+ function findRunsRoot(runDir) {
423
+ const parts = resolve(runDir).split(sep);
424
+ const runsIndex = parts.lastIndexOf('.runs');
425
+ if (runsIndex <= 0) {
426
+ return resolve(runDir, '..', '..', '..');
427
+ }
428
+ return parts.slice(0, runsIndex + 1).join(sep) || sep;
429
+ }
@@ -0,0 +1,120 @@
1
+ /* eslint-disable patterns/prefer-logger-over-console */
2
+ import process from 'node:process';
3
+ import { isoTimestamp } from './utils/time.js';
4
+ import { fetchUiDataset, resolveAttachTarget } from './coStatusAttachCliShell.js';
5
+ import { appendProviderOperatorAutopilotLifecycleRecord, resolveProviderOperatorAutopilotLifecyclePath } from './control/providerOperatorAutopilotLifecycle.js';
6
+ export async function runCoStatusOperatorAutopilotCliShell(params) {
7
+ if (params.flags.help !== undefined) {
8
+ params.printHelp();
9
+ return;
10
+ }
11
+ const [surface, actionName, ...unexpected] = params.positionals;
12
+ if (surface !== 'local-rollout' || !isLifecycleCommand(actionName)) {
13
+ throw new Error('co-status operator-autopilot requires: local-rollout <acknowledge|clear|dismiss>.');
14
+ }
15
+ if (unexpected.length > 0) {
16
+ throw new Error(`Unknown co-status operator-autopilot argument(s): ${unexpected.join(' ')}`);
17
+ }
18
+ const actionIdSelector = readStringFlag(params.flags, 'action-id');
19
+ const issueSelector = readStringFlag(params.flags, 'issue');
20
+ if (actionIdSelector && issueSelector) {
21
+ throw new Error('co-status operator-autopilot local-rollout accepts exactly one selector: --issue or --action-id.');
22
+ }
23
+ const selector = actionIdSelector ?? issueSelector;
24
+ if (!selector) {
25
+ throw new Error('co-status operator-autopilot local-rollout accepts exactly one selector: --issue or --action-id.');
26
+ }
27
+ const actor = readStringFlag(params.flags, 'actor') ??
28
+ normalizeOptionalString(process.env.USER) ??
29
+ 'operator';
30
+ const reason = readStringFlag(params.flags, 'reason');
31
+ if (!reason) {
32
+ throw new Error('co-status operator-autopilot local-rollout requires --reason.');
33
+ }
34
+ const format = readStringFlag(params.flags, 'format') === 'json' ? 'json' : 'text';
35
+ const state = mapLifecycleCommand(actionName);
36
+ const target = await resolveAttachTarget(params.flags);
37
+ const dataset = await fetchUiDataset(target.baseUrl, target.token);
38
+ const operatorAutopilot = dataset.provider_workflow?.operator_autopilot ?? null;
39
+ const pendingActions = operatorAutopilot?.last_result?.pending_actions ?? [];
40
+ const pendingAction = selectPendingLocalRolloutAction({
41
+ pendingActions,
42
+ selector,
43
+ selectorKind: actionIdSelector ? 'action-id' : 'issue'
44
+ });
45
+ if (!pendingAction.action_instance_id) {
46
+ throw new Error('Matched pending local rollout action is missing action_instance_id; wait for a fresh operator-autopilot evaluation.');
47
+ }
48
+ const lifecyclePath = readLifecyclePath(operatorAutopilot) ??
49
+ resolveProviderOperatorAutopilotLifecyclePath(target.runDir);
50
+ const record = {
51
+ action_instance_id: pendingAction.action_instance_id,
52
+ kind: 'local_rollout',
53
+ issue_id: pendingAction.issue_id,
54
+ issue_identifier: pendingAction.issue_identifier,
55
+ state,
56
+ actor,
57
+ reason,
58
+ recorded_at: isoTimestamp(),
59
+ source: 'co-status'
60
+ };
61
+ const store = await appendProviderOperatorAutopilotLifecycleRecord(lifecyclePath, record);
62
+ const payload = {
63
+ status: 'recorded',
64
+ lifecycle_path: lifecyclePath,
65
+ state,
66
+ action: actionName,
67
+ record,
68
+ record_count: store.records.length,
69
+ pending_action: pendingAction
70
+ };
71
+ if (format === 'json') {
72
+ console.log(JSON.stringify(payload, null, 2));
73
+ return;
74
+ }
75
+ console.log(`Recorded ${state} lifecycle for ${pendingAction.issue_identifier ?? pendingAction.issue_id} (${pendingAction.action_instance_id}).`);
76
+ console.log(`Lifecycle path: ${lifecyclePath}`);
77
+ }
78
+ function selectPendingLocalRolloutAction(input) {
79
+ const selector = input.selector.trim();
80
+ const normalizedSelector = selector.toLowerCase();
81
+ const matches = input.pendingActions.filter((pendingAction) => {
82
+ if (input.selectorKind === 'action-id') {
83
+ return pendingAction.action_instance_id === selector;
84
+ }
85
+ return (pendingAction.issue_id === selector ||
86
+ pendingAction.issue_identifier?.toLowerCase() === normalizedSelector);
87
+ });
88
+ if (matches.length === 0) {
89
+ throw new Error(`No pending local rollout action matched ${selector}.`);
90
+ }
91
+ if (matches.length > 1) {
92
+ throw new Error(`Multiple pending local rollout actions matched ${selector}; retry with --action-id.`);
93
+ }
94
+ return matches[0];
95
+ }
96
+ function readLifecyclePath(operatorAutopilot) {
97
+ const lifecyclePath = operatorAutopilot?.lifecycle_path;
98
+ return typeof lifecyclePath === 'string' && lifecyclePath.trim().length > 0
99
+ ? lifecyclePath
100
+ : null;
101
+ }
102
+ function isLifecycleCommand(value) {
103
+ return value === 'acknowledge' || value === 'clear' || value === 'dismiss';
104
+ }
105
+ function mapLifecycleCommand(command) {
106
+ if (command === 'acknowledge') {
107
+ return 'acknowledged';
108
+ }
109
+ return command === 'clear' ? 'cleared' : 'dismissed';
110
+ }
111
+ function readStringFlag(flags, key) {
112
+ return normalizeOptionalString(flags[key]);
113
+ }
114
+ function normalizeOptionalString(value) {
115
+ if (typeof value !== 'string') {
116
+ return undefined;
117
+ }
118
+ const trimmed = value.trim();
119
+ return trimmed.length > 0 ? trimmed : undefined;
120
+ }
@@ -0,0 +1,72 @@
1
+ /* eslint-disable patterns/prefer-logger-over-console */
2
+ import { formatCodexCliSetupSummary, runCodexCliSetup } from './codexCliSetup.js';
3
+ import { formatCodexDefaultsSetupSummary, runCodexDefaultsSetup } from './codexDefaultsSetup.js';
4
+ const DEFAULT_DEPENDENCIES = {
5
+ runCodexCliSetup,
6
+ runCodexDefaultsSetup,
7
+ formatCodexCliSetupSummary,
8
+ formatCodexDefaultsSetupSummary,
9
+ log: (line) => console.log(line)
10
+ };
11
+ export async function runCodexCliShell(params, overrides = {}) {
12
+ const dependencies = { ...DEFAULT_DEPENDENCIES, ...overrides };
13
+ const positionals = [...params.positionals];
14
+ const subcommand = positionals.shift();
15
+ const wantsHelp = params.flags['help'] === true
16
+ || params.flags['--help'] === true
17
+ || params.flags['h'] === true
18
+ || !subcommand
19
+ || subcommand === 'help'
20
+ || subcommand === '--help'
21
+ || subcommand === '-h';
22
+ if (wantsHelp) {
23
+ params.printHelp();
24
+ return;
25
+ }
26
+ if (subcommand === 'setup') {
27
+ const format = resolveOutputFormat(params.flags);
28
+ const apply = Boolean(params.flags['yes']);
29
+ const force = Boolean(params.flags['force']);
30
+ const result = await dependencies.runCodexCliSetup({
31
+ apply,
32
+ force,
33
+ source: readStringFlag(params.flags, 'source'),
34
+ ref: readStringFlag(params.flags, 'ref'),
35
+ downloadUrl: readStringFlag(params.flags, 'download-url'),
36
+ downloadSha256: readStringFlag(params.flags, 'download-sha256')
37
+ });
38
+ if (format === 'json') {
39
+ dependencies.log(JSON.stringify(result, null, 2));
40
+ return;
41
+ }
42
+ for (const line of dependencies.formatCodexCliSetupSummary(result)) {
43
+ dependencies.log(line);
44
+ }
45
+ return;
46
+ }
47
+ if (subcommand === 'defaults') {
48
+ const format = resolveOutputFormat(params.flags);
49
+ const apply = Boolean(params.flags['yes']);
50
+ const force = Boolean(params.flags['force']);
51
+ const result = await dependencies.runCodexDefaultsSetup({
52
+ apply,
53
+ force
54
+ });
55
+ if (format === 'json') {
56
+ dependencies.log(JSON.stringify(result, null, 2));
57
+ return;
58
+ }
59
+ for (const line of dependencies.formatCodexDefaultsSetupSummary(result)) {
60
+ dependencies.log(line);
61
+ }
62
+ return;
63
+ }
64
+ throw new Error(`Unknown codex subcommand: ${subcommand}`);
65
+ }
66
+ function resolveOutputFormat(flags) {
67
+ return flags['format'] === 'json' ? 'json' : 'text';
68
+ }
69
+ function readStringFlag(flags, key) {
70
+ const value = flags[key];
71
+ return typeof value === 'string' ? value : undefined;
72
+ }