@kbediako/codex-orchestrator 0.1.37 → 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 (302) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/README.md +73 -291
  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 +136 -16
  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 +668 -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 +30 -11
  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 +395 -0
  282. package/skills/chrome-devtools/SKILL.md +1 -1
  283. package/skills/codex-orchestrator/SKILL.md +83 -0
  284. package/skills/collab-subagents-first/SKILL.md +2 -1
  285. package/skills/delegation-usage/DELEGATION_GUIDE.md +24 -11
  286. package/skills/delegation-usage/SKILL.md +20 -13
  287. package/skills/land/SKILL.md +77 -0
  288. package/skills/linear/SKILL.md +255 -0
  289. package/skills/release/SKILL.md +47 -3
  290. package/skills/standalone-review/SKILL.md +6 -1
  291. package/templates/README.md +4 -2
  292. package/templates/codex/.codex/agents/awaiter-high.toml +2 -2
  293. package/templates/codex/.codex/agents/explorer-fast.toml +1 -0
  294. package/templates/codex/.codex/agents/worker-complex.toml +1 -1
  295. package/templates/codex/.codex/config.toml +3 -4
  296. package/templates/codex/.codex/providers/README.md +13 -0
  297. package/templates/codex/.codex/providers/control.example.json +18 -0
  298. package/templates/codex/.codex/providers/provider.env.example +15 -0
  299. package/templates/codex/AGENTS.md +12 -7
  300. package/templates/codex/mcp-client.json +5 -1
  301. package/docs/README.md +0 -307
  302. package/docs/assets/setup.gif +0 -0
@@ -0,0 +1,515 @@
1
+ import { mkdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';
2
+ import { dirname, join } from 'node:path';
3
+ import { logger } from '../../logger.js';
4
+ import { findPipeline, parseUserConfigRaw, resolveRepoConfigPath } from '../config/userConfig.js';
5
+ import { isoTimestamp } from '../utils/time.js';
6
+ import { resolveProviderOperatorAutopilotAuditPath, resolveProviderOperatorAutopilotConfig } from './providerOperatorAutopilot.js';
7
+ import { resolveProviderOperatorAutopilotLifecyclePath } from './providerOperatorAutopilotLifecycle.js';
8
+ import { resolveProviderOperatorAutopilotLocalRolloutExecutionPath } from './providerOperatorAutopilotLocalRolloutExecution.js';
9
+ import { resolveProviderTerminalCleanupConfig } from './providerTerminalCleanup.js';
10
+ import { cloneProviderWorkerHostConfigs, resolveProviderWorkerHostConfig } from './providerWorkerHosts.js';
11
+ const PROVIDER_WORKFLOW_SNAPSHOT_FILE = 'provider-workflow.last-known-good.json';
12
+ export function createProviderWorkflowConfigStore(createOptions) {
13
+ const cloneState = (value) => JSON.parse(JSON.stringify(value));
14
+ const sourcePath = resolveRepoConfigPath(createOptions.env);
15
+ const snapshotPath = join(createOptions.runDir, PROVIDER_WORKFLOW_SNAPSHOT_FILE);
16
+ // This store assumes serialized access from the single-threaded control-host
17
+ // runtime loop. Public reload helpers still take an explicit lock because
18
+ // observability reads and provider launches can overlap through async call
19
+ // paths even on a single Node event loop.
20
+ let bootstrapped = false;
21
+ let lastObservedRevision = null;
22
+ let reloadQueue = Promise.resolve();
23
+ let state = {
24
+ status: 'reload_failed',
25
+ pipeline_id: createOptions.pipelineId,
26
+ source_path: sourcePath,
27
+ snapshot_path: null,
28
+ last_reload_attempt_at: null,
29
+ last_success_at: null,
30
+ last_error_at: null,
31
+ last_error: null,
32
+ terminal_cleanup: buildDefaultTerminalCleanupPayload(),
33
+ worker_hosts: [],
34
+ operator_autopilot: buildDefaultOperatorAutopilotPayload(createOptions.runDir)
35
+ };
36
+ async function snapshotIsUsable(path) {
37
+ if (!path) {
38
+ return false;
39
+ }
40
+ try {
41
+ if (!(await stat(path)).isFile()) {
42
+ return false;
43
+ }
44
+ const raw = await readFile(path, 'utf8');
45
+ const config = parseUserConfigRaw(raw, 'repo');
46
+ const pipeline = config ? findPipeline(config, createOptions.pipelineId) : null;
47
+ if (!pipeline) {
48
+ return false;
49
+ }
50
+ buildWorkerHostsPayload(pipeline.metadata);
51
+ return true;
52
+ }
53
+ catch {
54
+ return false;
55
+ }
56
+ }
57
+ async function replaceSnapshotAtomically(raw) {
58
+ const tempSnapshotPath = `${snapshotPath}.tmp`;
59
+ try {
60
+ await writeFile(tempSnapshotPath, raw, 'utf8');
61
+ await rename(tempSnapshotPath, snapshotPath);
62
+ }
63
+ catch (error) {
64
+ await rm(tempSnapshotPath, { force: true }).catch(() => undefined);
65
+ throw error;
66
+ }
67
+ }
68
+ async function runWithReloadLock(action) {
69
+ const previous = reloadQueue;
70
+ let release;
71
+ reloadQueue = new Promise((resolve) => {
72
+ release = resolve;
73
+ });
74
+ await previous.catch(() => undefined);
75
+ try {
76
+ return await action();
77
+ }
78
+ finally {
79
+ release();
80
+ }
81
+ }
82
+ async function bootstrapUnlocked() {
83
+ const nextState = await attemptReload({ startup: true });
84
+ bootstrapped = true;
85
+ return nextState;
86
+ }
87
+ async function refreshUnlocked() {
88
+ if (!bootstrapped) {
89
+ return await bootstrapUnlocked();
90
+ }
91
+ return await attemptReload({ startup: false });
92
+ }
93
+ async function bootstrap() {
94
+ return cloneState(await runWithReloadLock(() => bootstrapUnlocked()));
95
+ }
96
+ async function refresh() {
97
+ return cloneState(await runWithReloadLock(() => refreshUnlocked()));
98
+ }
99
+ async function getLaunchConfigPath() {
100
+ return await runWithReloadLock(async () => {
101
+ let nextState = await refreshUnlocked();
102
+ if (!(await snapshotIsUsable(nextState.snapshot_path))) {
103
+ nextState = await attemptReload({
104
+ startup: false,
105
+ forceSnapshotRewrite: true
106
+ });
107
+ }
108
+ if (!nextState.snapshot_path || !(await snapshotIsUsable(nextState.snapshot_path))) {
109
+ throw new Error(nextState.last_error
110
+ ? `Provider workflow config snapshot is unavailable: ${nextState.last_error}`
111
+ : 'Provider workflow config snapshot is unavailable.');
112
+ }
113
+ return nextState.snapshot_path;
114
+ });
115
+ }
116
+ async function attemptReload(reloadOptions) {
117
+ const attemptedAt = isoTimestamp();
118
+ let revision = null;
119
+ try {
120
+ const sourceStat = await stat(sourcePath);
121
+ revision = `${sourceStat.mtimeMs}:${sourceStat.size}`;
122
+ // Only short-circuit when the current revision is healthy. Failed reloads
123
+ // must be retried even if `mtime:size` is unchanged so transient errors or
124
+ // same-metadata repairs can recover.
125
+ if (!reloadOptions.startup &&
126
+ !reloadOptions.forceSnapshotRewrite &&
127
+ revision === lastObservedRevision &&
128
+ state.status === 'ready' &&
129
+ (await snapshotIsUsable(state.snapshot_path))) {
130
+ return state;
131
+ }
132
+ const raw = await readFile(sourcePath, 'utf8');
133
+ const pipeline = parseRequiredPipelineFromRaw(raw, sourcePath, createOptions.pipelineId);
134
+ const nextTerminalCleanup = buildTerminalCleanupPayload(pipeline.metadata, state.terminal_cleanup?.last_result ?? null);
135
+ const nextWorkerHosts = buildWorkerHostsPayload(pipeline.metadata);
136
+ await mkdir(dirname(snapshotPath), { recursive: true });
137
+ await replaceSnapshotAtomically(raw);
138
+ lastObservedRevision = revision;
139
+ const previousStatus = state.status;
140
+ state = {
141
+ status: 'ready',
142
+ pipeline_id: createOptions.pipelineId,
143
+ source_path: sourcePath,
144
+ snapshot_path: snapshotPath,
145
+ last_reload_attempt_at: attemptedAt,
146
+ last_success_at: attemptedAt,
147
+ last_error_at: null,
148
+ last_error: null,
149
+ terminal_cleanup: nextTerminalCleanup,
150
+ worker_hosts: nextWorkerHosts,
151
+ operator_autopilot: buildOperatorAutopilotPayload(pipeline.metadata, state.operator_autopilot?.last_result ?? null, createOptions.runDir)
152
+ };
153
+ if (!reloadOptions.startup && previousStatus === 'reload_failed') {
154
+ logger.info(`[provider-workflow] Reloaded config from ${sourcePath}; cleared prior reload error.`);
155
+ }
156
+ return state;
157
+ }
158
+ catch (error) {
159
+ const reason = error.message;
160
+ lastObservedRevision = revision ?? 'missing';
161
+ const fallbackSnapshotPath = await resolveUsableSnapshotPath(state.snapshot_path, snapshotPath);
162
+ if (fallbackSnapshotPath) {
163
+ logger.error(`[provider-workflow] Failed to reload config path=${sourcePath} reason=${reason}; keeping last known good configuration`);
164
+ const snapshotRaw = await readFile(fallbackSnapshotPath, 'utf8');
165
+ const pipeline = parseRequiredPipelineFromRaw(snapshotRaw, fallbackSnapshotPath, createOptions.pipelineId);
166
+ state = {
167
+ ...state,
168
+ status: 'reload_failed',
169
+ pipeline_id: createOptions.pipelineId,
170
+ source_path: sourcePath,
171
+ snapshot_path: fallbackSnapshotPath,
172
+ last_reload_attempt_at: attemptedAt,
173
+ last_success_at: state.last_success_at ?? attemptedAt,
174
+ last_error_at: attemptedAt,
175
+ last_error: reason,
176
+ terminal_cleanup: buildTerminalCleanupPayload(pipeline.metadata, state.terminal_cleanup?.last_result ?? null),
177
+ worker_hosts: buildWorkerHostsPayload(pipeline.metadata),
178
+ operator_autopilot: buildOperatorAutopilotPayload(pipeline.metadata, state.operator_autopilot?.last_result ?? null, createOptions.runDir)
179
+ };
180
+ return state;
181
+ }
182
+ if (reloadOptions.startup) {
183
+ throw new Error(`Failed to load provider workflow config path=${sourcePath}: ${reason}`);
184
+ }
185
+ state = {
186
+ ...state,
187
+ status: 'reload_failed',
188
+ last_reload_attempt_at: attemptedAt,
189
+ last_error_at: attemptedAt,
190
+ last_error: reason
191
+ };
192
+ return state;
193
+ }
194
+ }
195
+ async function resolveUsableSnapshotPath(preferredPath, defaultPath) {
196
+ if (await snapshotIsUsable(preferredPath)) {
197
+ return preferredPath;
198
+ }
199
+ return (await snapshotIsUsable(defaultPath)) ? defaultPath : null;
200
+ }
201
+ return {
202
+ bootstrap,
203
+ refresh,
204
+ snapshot: () => cloneState(state),
205
+ getLaunchConfigPath,
206
+ recordTerminalCleanupResult: (result) => {
207
+ state = {
208
+ ...state,
209
+ terminal_cleanup: {
210
+ ...(state.terminal_cleanup ?? buildDefaultTerminalCleanupPayload()),
211
+ last_result: mapTerminalCleanupResult(result)
212
+ }
213
+ };
214
+ },
215
+ recordOperatorAutopilotResult: (result) => {
216
+ state = {
217
+ ...state,
218
+ operator_autopilot: {
219
+ ...(state.operator_autopilot ?? buildDefaultOperatorAutopilotPayload(createOptions.runDir)),
220
+ last_result: cloneOperatorAutopilotLastResult(result)
221
+ }
222
+ };
223
+ }
224
+ };
225
+ }
226
+ function buildDefaultTerminalCleanupPayload() {
227
+ return {
228
+ enabled: false,
229
+ close_attached_pr: {
230
+ enabled: false,
231
+ comment_template: resolveProviderTerminalCleanupConfig(null).closeAttachedPr.commentTemplate
232
+ },
233
+ last_result: null
234
+ };
235
+ }
236
+ function buildDefaultOperatorAutopilotPayload(runDir) {
237
+ const config = resolveProviderOperatorAutopilotConfig(null);
238
+ return {
239
+ enabled: config.enabled,
240
+ backlog_promotion: {
241
+ enabled: config.backlog_promotion.enabled,
242
+ state_name: config.backlog_promotion.state_name,
243
+ target_state_name: config.backlog_promotion.target_state_name,
244
+ snapshot_retention: {
245
+ max_untracked_cycles: config.backlog_promotion.snapshot_retention.max_untracked_cycles,
246
+ terminal_state_types: [
247
+ ...config.backlog_promotion.snapshot_retention.terminal_state_types
248
+ ]
249
+ }
250
+ },
251
+ review_handoff_rework: {
252
+ enabled: config.review_handoff_rework.enabled,
253
+ target_state_name: config.review_handoff_rework.target_state_name,
254
+ excluded_action_required_reasons: [
255
+ ...config.review_handoff_rework.excluded_action_required_reasons
256
+ ]
257
+ },
258
+ post_merge_rollout: {
259
+ enabled: config.post_merge_rollout.enabled,
260
+ summary: config.post_merge_rollout.summary,
261
+ execution: config.post_merge_rollout.execution
262
+ },
263
+ audit_path: resolveProviderOperatorAutopilotAuditPath(runDir),
264
+ lifecycle_path: resolveProviderOperatorAutopilotLifecyclePath(runDir),
265
+ execution_path: resolveProviderOperatorAutopilotLocalRolloutExecutionPath(runDir),
266
+ last_result: null
267
+ };
268
+ }
269
+ function parseRequiredPipelineFromRaw(raw, path, pipelineId) {
270
+ const config = parseUserConfigRaw(raw, 'repo');
271
+ if (!config) {
272
+ throw new Error(`Missing codex.orchestrator.json at ${path}`);
273
+ }
274
+ const pipeline = findPipeline(config, pipelineId);
275
+ if (!pipeline) {
276
+ throw new Error(`Repo-local codex.orchestrator.json is missing required pipeline "${pipelineId}".`);
277
+ }
278
+ return pipeline;
279
+ }
280
+ function buildTerminalCleanupPayload(metadata, lastResult) {
281
+ const config = resolveProviderTerminalCleanupConfig(metadata);
282
+ return {
283
+ enabled: config.enabled,
284
+ close_attached_pr: {
285
+ enabled: config.closeAttachedPr.enabled,
286
+ comment_template: config.closeAttachedPr.commentTemplate
287
+ },
288
+ last_result: lastResult ? cloneTerminalCleanupLastResult(lastResult) : null
289
+ };
290
+ }
291
+ function buildOperatorAutopilotPayload(metadata, lastResult, runDir) {
292
+ const config = resolveProviderOperatorAutopilotConfig(metadata);
293
+ return {
294
+ enabled: config.enabled,
295
+ backlog_promotion: {
296
+ enabled: config.backlog_promotion.enabled,
297
+ state_name: config.backlog_promotion.state_name,
298
+ target_state_name: config.backlog_promotion.target_state_name,
299
+ snapshot_retention: {
300
+ max_untracked_cycles: config.backlog_promotion.snapshot_retention.max_untracked_cycles,
301
+ terminal_state_types: [
302
+ ...config.backlog_promotion.snapshot_retention.terminal_state_types
303
+ ]
304
+ }
305
+ },
306
+ review_handoff_rework: {
307
+ enabled: config.review_handoff_rework.enabled,
308
+ target_state_name: config.review_handoff_rework.target_state_name,
309
+ excluded_action_required_reasons: [
310
+ ...config.review_handoff_rework.excluded_action_required_reasons
311
+ ]
312
+ },
313
+ post_merge_rollout: {
314
+ enabled: config.post_merge_rollout.enabled,
315
+ summary: config.post_merge_rollout.summary,
316
+ execution: config.post_merge_rollout.execution
317
+ },
318
+ audit_path: resolveProviderOperatorAutopilotAuditPath(runDir),
319
+ lifecycle_path: resolveProviderOperatorAutopilotLifecyclePath(runDir),
320
+ execution_path: resolveProviderOperatorAutopilotLocalRolloutExecutionPath(runDir),
321
+ last_result: lastResult ? cloneOperatorAutopilotLastResult(lastResult) : null
322
+ };
323
+ }
324
+ function mapTerminalCleanupResult(result) {
325
+ return {
326
+ attempted_at: result.attemptedAt,
327
+ status: result.status,
328
+ summary: result.summary,
329
+ error: result.error,
330
+ issue_id: result.issueId,
331
+ issue_identifier: result.issueIdentifier,
332
+ workspace_path: result.workspacePath,
333
+ branch: result.branch,
334
+ attached_pr_urls: [...result.attachedPrUrls],
335
+ matching_open_pr_urls: [...result.matchingOpenPrUrls],
336
+ closed_pr_urls: [...result.closedPrUrls]
337
+ };
338
+ }
339
+ function cloneTerminalCleanupLastResult(result) {
340
+ return {
341
+ attempted_at: result.attempted_at,
342
+ status: result.status,
343
+ summary: result.summary,
344
+ error: result.error,
345
+ issue_id: result.issue_id,
346
+ issue_identifier: result.issue_identifier,
347
+ workspace_path: result.workspace_path,
348
+ branch: result.branch,
349
+ attached_pr_urls: [...result.attached_pr_urls],
350
+ matching_open_pr_urls: [...result.matching_open_pr_urls],
351
+ closed_pr_urls: [...result.closed_pr_urls]
352
+ };
353
+ }
354
+ function buildWorkerHostsPayload(metadata) {
355
+ return cloneProviderWorkerHostConfigs(resolveProviderWorkerHostConfig(metadata));
356
+ }
357
+ function cloneOperatorAutopilotLastResult(result) {
358
+ return {
359
+ recorded_at: result.recorded_at,
360
+ status: result.status,
361
+ summary: result.summary,
362
+ error: result.error,
363
+ actions: result.actions.map((action) => ({
364
+ kind: action.kind,
365
+ issue_id: action.issue_id,
366
+ issue_identifier: action.issue_identifier,
367
+ reason: action.reason,
368
+ summary: action.summary,
369
+ transition: {
370
+ status: action.transition.status,
371
+ attempted_at: action.transition.attempted_at,
372
+ previous_state: action.transition.previous_state,
373
+ target_state: action.transition.target_state,
374
+ issue_state: action.transition.issue_state,
375
+ issue_state_type: action.transition.issue_state_type,
376
+ issue_updated_at: action.transition.issue_updated_at,
377
+ force_path_used: action.transition.force_path_used ?? false,
378
+ error: action.transition.error
379
+ },
380
+ action_required_reasons: [...action.action_required_reasons]
381
+ })),
382
+ holds: result.holds.map((hold) => ({
383
+ kind: hold.kind,
384
+ issue_id: hold.issue_id,
385
+ issue_identifier: hold.issue_identifier,
386
+ issue_state: hold.issue_state ?? null,
387
+ issue_state_type: hold.issue_state_type ?? null,
388
+ issue_updated_at: hold.issue_updated_at ?? null,
389
+ promotion_attempted_at: hold.promotion_attempted_at ?? null,
390
+ promotion_issue_updated_at: hold.promotion_issue_updated_at ?? null,
391
+ force_path_used: hold.force_path_used ?? false,
392
+ reason: hold.reason,
393
+ summary: hold.summary,
394
+ action_required_reasons: [...hold.action_required_reasons]
395
+ })),
396
+ pending_actions: result.pending_actions.map((pendingAction) => ({
397
+ kind: pendingAction.kind,
398
+ action_instance_id: pendingAction.action_instance_id,
399
+ issue_id: pendingAction.issue_id,
400
+ issue_identifier: pendingAction.issue_identifier,
401
+ summary: pendingAction.summary,
402
+ merge_closeout_recorded_at: pendingAction.merge_closeout_recorded_at,
403
+ merge_closeout_reason: pendingAction.merge_closeout_reason,
404
+ shared_root_status: pendingAction.shared_root_status,
405
+ linear_transition_status: pendingAction.linear_transition_status,
406
+ executable_action_ids: [...(pendingAction.executable_action_ids ?? [])],
407
+ lifecycle_state: pendingAction.lifecycle_state,
408
+ lifecycle_actor: pendingAction.lifecycle_actor,
409
+ lifecycle_reason: pendingAction.lifecycle_reason,
410
+ lifecycle_recorded_at: pendingAction.lifecycle_recorded_at
411
+ })),
412
+ terminal_blocker_advisories: (result.terminal_blocker_advisories ?? []).map((advisory) => ({
413
+ kind: advisory.kind,
414
+ issue_id: advisory.issue_id,
415
+ issue_identifier: advisory.issue_identifier,
416
+ issue_state: advisory.issue_state,
417
+ issue_state_type: advisory.issue_state_type,
418
+ issue_updated_at: advisory.issue_updated_at,
419
+ blockers: advisory.blockers.map((blocker) => ({
420
+ id: blocker.id,
421
+ identifier: blocker.identifier,
422
+ state: blocker.state,
423
+ state_type: blocker.state_type
424
+ })),
425
+ canonical_owner_hints: [...advisory.canonical_owner_hints],
426
+ duplicate_hints: [...advisory.duplicate_hints],
427
+ recommended_action: advisory.recommended_action,
428
+ summary: advisory.summary
429
+ })),
430
+ resolved_actions: (result.resolved_actions ?? []).map((resolvedAction) => ({
431
+ kind: resolvedAction.kind,
432
+ action_instance_id: resolvedAction.action_instance_id,
433
+ issue_id: resolvedAction.issue_id,
434
+ issue_identifier: resolvedAction.issue_identifier,
435
+ summary: resolvedAction.summary,
436
+ merge_closeout_recorded_at: resolvedAction.merge_closeout_recorded_at,
437
+ merge_closeout_reason: resolvedAction.merge_closeout_reason,
438
+ shared_root_status: resolvedAction.shared_root_status,
439
+ linear_transition_status: resolvedAction.linear_transition_status,
440
+ executable_action_ids: [...(resolvedAction.executable_action_ids ?? [])],
441
+ lifecycle_state: resolvedAction.lifecycle_state,
442
+ lifecycle_actor: resolvedAction.lifecycle_actor,
443
+ lifecycle_reason: resolvedAction.lifecycle_reason,
444
+ lifecycle_recorded_at: resolvedAction.lifecycle_recorded_at
445
+ })),
446
+ lifecycle_records: (result.lifecycle_records ?? []).map((record) => ({
447
+ action_instance_id: record.action_instance_id,
448
+ kind: record.kind,
449
+ issue_id: record.issue_id,
450
+ issue_identifier: record.issue_identifier,
451
+ state: record.state,
452
+ actor: record.actor,
453
+ reason: record.reason,
454
+ recorded_at: record.recorded_at,
455
+ source: record.source
456
+ })),
457
+ local_rollout_execution_attempts: (result.local_rollout_execution_attempts ?? []).map((attempt) => ({
458
+ record_kind: attempt.record_kind,
459
+ action_instance_id: attempt.action_instance_id,
460
+ action_id: attempt.action_id,
461
+ issue_id: attempt.issue_id,
462
+ issue_identifier: attempt.issue_identifier,
463
+ preflight: {
464
+ status: attempt.preflight.status,
465
+ reason: attempt.preflight.reason,
466
+ checked_at: attempt.preflight.checked_at,
467
+ summary: attempt.preflight.summary
468
+ },
469
+ started_at: attempt.started_at,
470
+ ended_at: attempt.ended_at,
471
+ terminal_state: attempt.terminal_state,
472
+ reason: attempt.reason,
473
+ summary: attempt.summary,
474
+ command: {
475
+ runner: attempt.command.runner,
476
+ command: attempt.command.command,
477
+ args: [...attempt.command.args],
478
+ cwd: attempt.command.cwd,
479
+ timeout_ms: attempt.command.timeout_ms
480
+ },
481
+ exit_code: attempt.exit_code,
482
+ stdout: attempt.stdout,
483
+ stderr: attempt.stderr
484
+ })),
485
+ backlog_promotion_snapshots: (result.backlog_promotion_snapshots ?? []).map((snapshot) => ({
486
+ issue_id: snapshot.issue_id,
487
+ issue_identifier: snapshot.issue_identifier,
488
+ target_state: snapshot.target_state,
489
+ attempted_at: snapshot.attempted_at,
490
+ issue_updated_at: snapshot.issue_updated_at,
491
+ force_path_used: snapshot.force_path_used ?? false,
492
+ untracked_cycles: snapshot.untracked_cycles ?? 0
493
+ })),
494
+ backlog_promotion_snapshot_retention_records: (result.backlog_promotion_snapshot_retention_records ?? []).map((record) => ({
495
+ issue_id: record.issue_id,
496
+ issue_identifier: record.issue_identifier,
497
+ target_state: record.target_state,
498
+ attempted_at: record.attempted_at,
499
+ issue_updated_at: record.issue_updated_at,
500
+ evaluated_at: record.evaluated_at,
501
+ decision: record.decision,
502
+ reason: record.reason,
503
+ age_ms: record.age_ms,
504
+ untracked_cycles: record.untracked_cycles,
505
+ max_untracked_cycles: record.max_untracked_cycles,
506
+ issue_state: record.issue_state,
507
+ issue_state_type: record.issue_state_type,
508
+ issue_archived_at: record.issue_archived_at,
509
+ issue_trashed: record.issue_trashed,
510
+ issue_observed_updated_at: record.issue_observed_updated_at,
511
+ terminal_state_evidence: record.terminal_state_evidence,
512
+ force_path_used: record.force_path_used ?? false
513
+ }))
514
+ };
515
+ }