@kbediako/codex-orchestrator 0.1.38 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/README.md +46 -317
  3. package/bin/codex-orchestrator.js +161 -0
  4. package/codex.orchestrator.json +149 -13
  5. package/dist/bin/codex-orchestrator.js +797 -1154
  6. package/dist/orchestrator/src/cli/adapters/CommandBuilder.js +50 -0
  7. package/dist/orchestrator/src/cli/adapters/CommandPlanner.js +22 -4
  8. package/dist/orchestrator/src/cli/adapters/CommandReviewer.js +3 -3
  9. package/dist/orchestrator/src/cli/adapters/CommandTester.js +2 -2
  10. package/dist/orchestrator/src/cli/adapters/cloudFailureDiagnostics.js +295 -11
  11. package/dist/orchestrator/src/cli/coStatusAttachCliShell.js +402 -0
  12. package/dist/orchestrator/src/cli/coStatusCliShell.js +451 -0
  13. package/dist/orchestrator/src/cli/coStatusOperatorAutopilotCliShell.js +120 -0
  14. package/dist/orchestrator/src/cli/codexCliShell.js +119 -0
  15. package/dist/orchestrator/src/cli/codexDefaultsSetup.js +265 -36
  16. package/dist/orchestrator/src/cli/config/delegationConfig.js +317 -5
  17. package/dist/orchestrator/src/cli/config/repoConfigPolicy.js +2 -3
  18. package/dist/orchestrator/src/cli/config/userConfig.js +28 -13
  19. package/dist/orchestrator/src/cli/control/authenticatedControlRouteGate.js +69 -0
  20. package/dist/orchestrator/src/cli/control/authenticatedRouteComposition.js +267 -0
  21. package/dist/orchestrator/src/cli/control/authenticatedRouteController.js +5 -0
  22. package/dist/orchestrator/src/cli/control/authenticatedRouteDispatcher.js +41 -0
  23. package/dist/orchestrator/src/cli/control/compatibilityIssuePresenter.js +1035 -0
  24. package/dist/orchestrator/src/cli/control/confirmationApproveController.js +62 -0
  25. package/dist/orchestrator/src/cli/control/confirmationCreateController.js +69 -0
  26. package/dist/orchestrator/src/cli/control/confirmationIssueConsumeController.js +43 -0
  27. package/dist/orchestrator/src/cli/control/confirmationListController.js +22 -0
  28. package/dist/orchestrator/src/cli/control/confirmationValidateController.js +58 -0
  29. package/dist/orchestrator/src/cli/control/confirmations.js +25 -3
  30. package/dist/orchestrator/src/cli/control/controlActionCancelConfirmation.js +65 -0
  31. package/dist/orchestrator/src/cli/control/controlActionController.js +77 -0
  32. package/dist/orchestrator/src/cli/control/controlActionControllerSequencing.js +161 -0
  33. package/dist/orchestrator/src/cli/control/controlActionExecution.js +142 -0
  34. package/dist/orchestrator/src/cli/control/controlActionFinalization.js +43 -0
  35. package/dist/orchestrator/src/cli/control/controlActionOutcome.js +60 -0
  36. package/dist/orchestrator/src/cli/control/controlActionPreflight.js +476 -0
  37. package/dist/orchestrator/src/cli/control/controlAuthenticatedRouteHandoff.js +57 -0
  38. package/dist/orchestrator/src/cli/control/controlBootstrapAssembly.js +39 -0
  39. package/dist/orchestrator/src/cli/control/controlBootstrapMetadataPersistence.js +16 -0
  40. package/dist/orchestrator/src/cli/control/controlEventTransport.js +49 -0
  41. package/dist/orchestrator/src/cli/control/controlExpiryLifecycle.js +102 -0
  42. package/dist/orchestrator/src/cli/control/controlHostOwnership.js +480 -0
  43. package/dist/orchestrator/src/cli/control/controlHostSupervision.js +630 -0
  44. package/dist/orchestrator/src/cli/control/controlOversightFacade.js +8 -0
  45. package/dist/orchestrator/src/cli/control/controlOversightReadContract.js +1 -0
  46. package/dist/orchestrator/src/cli/control/controlOversightReadService.js +16 -0
  47. package/dist/orchestrator/src/cli/control/controlOversightUpdateContract.js +1 -0
  48. package/dist/orchestrator/src/cli/control/controlPersistenceFiles.js +6 -0
  49. package/dist/orchestrator/src/cli/control/controlQuestionChildResolution.js +18 -0
  50. package/dist/orchestrator/src/cli/control/controlRequestContext.js +42 -0
  51. package/dist/orchestrator/src/cli/control/controlRequestController.js +9 -0
  52. package/dist/orchestrator/src/cli/control/controlRequestPredispatch.js +17 -0
  53. package/dist/orchestrator/src/cli/control/controlRequestRouteDispatch.js +44 -0
  54. package/dist/orchestrator/src/cli/control/controlRuntime.js +1003 -0
  55. package/dist/orchestrator/src/cli/control/controlServer.js +23 -1456
  56. package/dist/orchestrator/src/cli/control/controlServerAuditAndErrorHelpers.js +115 -0
  57. package/dist/orchestrator/src/cli/control/controlServerAuthenticatedRouteBranch.js +29 -0
  58. package/dist/orchestrator/src/cli/control/controlServerBootstrapLifecycle.js +30 -0
  59. package/dist/orchestrator/src/cli/control/controlServerBootstrapStartSequence.js +21 -0
  60. package/dist/orchestrator/src/cli/control/controlServerOwnedRuntimeLifecycle.js +67 -0
  61. package/dist/orchestrator/src/cli/control/controlServerPublicLifecycle.js +756 -0
  62. package/dist/orchestrator/src/cli/control/controlServerPublicRouteHelpers.js +86 -0
  63. package/dist/orchestrator/src/cli/control/controlServerReadyInstanceLifecycle.js +25 -0
  64. package/dist/orchestrator/src/cli/control/controlServerReadyInstanceStartup.js +18 -0
  65. package/dist/orchestrator/src/cli/control/controlServerRequestBodyHelpers.js +37 -0
  66. package/dist/orchestrator/src/cli/control/controlServerRequestShell.js +40 -0
  67. package/dist/orchestrator/src/cli/control/controlServerRequestShellBinding.js +17 -0
  68. package/dist/orchestrator/src/cli/control/controlServerSeedLoading.js +27 -0
  69. package/dist/orchestrator/src/cli/control/controlServerSeededRuntimeAssembly.js +186 -0
  70. package/dist/orchestrator/src/cli/control/controlServerStartupInputPreparation.js +31 -0
  71. package/dist/orchestrator/src/cli/control/controlServerStartupSequence.js +49 -0
  72. package/dist/orchestrator/src/cli/control/controlState.js +233 -2
  73. package/dist/orchestrator/src/cli/control/controlStatusDashboard.js +1904 -0
  74. package/dist/orchestrator/src/cli/control/controlTelegramBridgeBootstrapLifecycle.js +22 -0
  75. package/dist/orchestrator/src/cli/control/controlTelegramBridgeLifecycle.js +67 -0
  76. package/dist/orchestrator/src/cli/control/controlTelegramBridgeOversightFacadeFactory.js +8 -0
  77. package/dist/orchestrator/src/cli/control/controlTelegramCommandController.js +49 -0
  78. package/dist/orchestrator/src/cli/control/controlTelegramDispatchRead.js +40 -0
  79. package/dist/orchestrator/src/cli/control/controlTelegramPollingController.js +89 -0
  80. package/dist/orchestrator/src/cli/control/controlTelegramProjectionNotificationController.js +29 -0
  81. package/dist/orchestrator/src/cli/control/controlTelegramPushState.js +63 -0
  82. package/dist/orchestrator/src/cli/control/controlTelegramQuestionRead.js +13 -0
  83. package/dist/orchestrator/src/cli/control/controlTelegramReadController.js +216 -0
  84. package/dist/orchestrator/src/cli/control/controlTelegramUpdateHandler.js +63 -0
  85. package/dist/orchestrator/src/cli/control/controlWatcher.js +73 -5
  86. package/dist/orchestrator/src/cli/control/delegationRegisterController.js +35 -0
  87. package/dist/orchestrator/src/cli/control/dynamicToolBridgePolicy.js +139 -0
  88. package/dist/orchestrator/src/cli/control/eventsSseController.js +12 -0
  89. package/dist/orchestrator/src/cli/control/linearBudgetState.js +1789 -0
  90. package/dist/orchestrator/src/cli/control/linearDispatchSource.js +1137 -0
  91. package/dist/orchestrator/src/cli/control/linearGraphqlClient.js +150 -0
  92. package/dist/orchestrator/src/cli/control/linearRateLimit.js +102 -0
  93. package/dist/orchestrator/src/cli/control/linearWebhookController.js +499 -0
  94. package/dist/orchestrator/src/cli/control/liveLinearAdvisoryRuntime.js +70 -0
  95. package/dist/orchestrator/src/cli/control/observabilityApiController.js +173 -0
  96. package/dist/orchestrator/src/cli/control/observabilityReadModel.js +500 -0
  97. package/dist/orchestrator/src/cli/control/observabilitySurface.js +284 -0
  98. package/dist/orchestrator/src/cli/control/observabilityUpdateNotifier.js +22 -0
  99. package/dist/orchestrator/src/cli/control/operatorDashboardPresenter.js +252 -0
  100. package/dist/orchestrator/src/cli/control/providerAgentCapacity.js +70 -0
  101. package/dist/orchestrator/src/cli/control/providerControlHostFreshnessGauge.js +1068 -0
  102. package/dist/orchestrator/src/cli/control/providerIntakeState.js +473 -0
  103. package/dist/orchestrator/src/cli/control/providerIssueHandoff.js +6811 -0
  104. package/dist/orchestrator/src/cli/control/providerIssueObservability.js +1348 -0
  105. package/dist/orchestrator/src/cli/control/providerIssueRetryQueue.js +84 -0
  106. package/dist/orchestrator/src/cli/control/providerLinearRuntimeProof.js +588 -0
  107. package/dist/orchestrator/src/cli/control/providerLinearScreenshotProof.js +473 -0
  108. package/dist/orchestrator/src/cli/control/providerLinearWorkerTruth.js +383 -0
  109. package/dist/orchestrator/src/cli/control/providerLinearWorkflowAudit.js +254 -0
  110. package/dist/orchestrator/src/cli/control/providerLinearWorkflowFacade.js +5573 -0
  111. package/dist/orchestrator/src/cli/control/providerLinearWorkflowStates.js +115 -0
  112. package/dist/orchestrator/src/cli/control/providerMergeCloseout.js +1868 -0
  113. package/dist/orchestrator/src/cli/control/providerOperatorAutopilot.js +1580 -0
  114. package/dist/orchestrator/src/cli/control/providerOperatorAutopilotLifecycle.js +154 -0
  115. package/dist/orchestrator/src/cli/control/providerOperatorAutopilotLocalRolloutExecution.js +1006 -0
  116. package/dist/orchestrator/src/cli/control/providerPollingHealth.js +435 -0
  117. package/dist/orchestrator/src/cli/control/providerTerminalCleanup.js +516 -0
  118. package/dist/orchestrator/src/cli/control/providerWorkerHosts.js +191 -0
  119. package/dist/orchestrator/src/cli/control/providerWorkflowConfigStore.js +515 -0
  120. package/dist/orchestrator/src/cli/control/questionChildResolutionAdapter.js +361 -0
  121. package/dist/orchestrator/src/cli/control/questionQueueController.js +181 -0
  122. package/dist/orchestrator/src/cli/control/questionReadRetryDeduplication.js +9 -0
  123. package/dist/orchestrator/src/cli/control/questionReadSequence.js +10 -0
  124. package/dist/orchestrator/src/cli/control/securityViolationController.js +27 -0
  125. package/dist/orchestrator/src/cli/control/selectedRunProjection.js +1885 -0
  126. package/dist/orchestrator/src/cli/control/telegramOversightApiClient.js +48 -0
  127. package/dist/orchestrator/src/cli/control/telegramOversightBridge.js +180 -0
  128. package/dist/orchestrator/src/cli/control/telegramOversightBridgeProjectionDeliveryQueue.js +25 -0
  129. package/dist/orchestrator/src/cli/control/telegramOversightBridgeRuntimeLifecycle.js +45 -0
  130. package/dist/orchestrator/src/cli/control/telegramOversightBridgeStateStore.js +77 -0
  131. package/dist/orchestrator/src/cli/control/telegramOversightControlActionApiClient.js +45 -0
  132. package/dist/orchestrator/src/cli/control/trackerDispatchPilot.js +439 -0
  133. package/dist/orchestrator/src/cli/control/uiDataController.js +34 -0
  134. package/dist/orchestrator/src/cli/control/uiSessionController.js +100 -0
  135. package/dist/orchestrator/src/cli/controlHostCliShell.js +860 -0
  136. package/dist/orchestrator/src/cli/controlHostFreshnessGaugeCliShell.js +129 -0
  137. package/dist/orchestrator/src/cli/controlHostSupervisionCliShell.js +2127 -0
  138. package/dist/orchestrator/src/cli/delegationCliShell.js +62 -0
  139. package/dist/orchestrator/src/cli/delegationServer.js +567 -678
  140. package/dist/orchestrator/src/cli/delegationServerCliShell.js +52 -0
  141. package/dist/orchestrator/src/cli/delegationServerQuestionFlowShell.js +228 -0
  142. package/dist/orchestrator/src/cli/delegationServerToolDispatchShell.js +411 -0
  143. package/dist/orchestrator/src/cli/delegationServerTransport.js +274 -0
  144. package/dist/orchestrator/src/cli/delegationSetup.js +51 -171
  145. package/dist/orchestrator/src/cli/devtoolsCliShell.js +34 -0
  146. package/dist/orchestrator/src/cli/doctor.js +678 -164
  147. package/dist/orchestrator/src/cli/doctorCliRequestShell.js +72 -0
  148. package/dist/orchestrator/src/cli/doctorCliShell.js +138 -0
  149. package/dist/orchestrator/src/cli/doctorUsage.js +119 -15
  150. package/dist/orchestrator/src/cli/exec/experience.js +16 -2
  151. package/dist/orchestrator/src/cli/exec/summary.js +3 -0
  152. package/dist/orchestrator/src/cli/execCliShell.js +51 -0
  153. package/dist/orchestrator/src/cli/flowCliRequestShell.js +44 -0
  154. package/dist/orchestrator/src/cli/flowCliShell.js +239 -0
  155. package/dist/orchestrator/src/cli/frontendTestCliRequestShell.js +80 -0
  156. package/dist/orchestrator/src/cli/frontendTestCliShell.js +41 -0
  157. package/dist/orchestrator/src/cli/init.js +95 -1
  158. package/dist/orchestrator/src/cli/initCliShell.js +50 -0
  159. package/dist/orchestrator/src/cli/linearCliShell.js +1200 -0
  160. package/dist/orchestrator/src/cli/mcpEnableCliShell.js +132 -0
  161. package/dist/orchestrator/src/cli/metrics/metricsAggregator.js +3 -2
  162. package/dist/orchestrator/src/cli/metrics/metricsRecorder.js +56 -0
  163. package/dist/orchestrator/src/cli/orchestrator.js +66 -1376
  164. package/dist/orchestrator/src/cli/planCliShell.js +19 -0
  165. package/dist/orchestrator/src/cli/prCliShell.js +41 -0
  166. package/dist/orchestrator/src/cli/providerLinearChildLanePhaseContract.js +204 -0
  167. package/dist/orchestrator/src/cli/providerLinearChildLaneRunner.js +1835 -0
  168. package/dist/orchestrator/src/cli/providerLinearChildLaneShell.js +2420 -0
  169. package/dist/orchestrator/src/cli/providerLinearChildStreamShell.js +385 -0
  170. package/dist/orchestrator/src/cli/providerLinearWorkerRunner.js +6834 -0
  171. package/dist/orchestrator/src/cli/resumeCliShell.js +14 -0
  172. package/dist/orchestrator/src/cli/reviewCliLaunchShell.js +72 -0
  173. package/dist/orchestrator/src/cli/rlm/alignment.js +3 -3
  174. package/dist/orchestrator/src/cli/rlm/context.js +94 -7
  175. package/dist/orchestrator/src/cli/rlm/rlmCodexRuntimeShell.js +546 -0
  176. package/dist/orchestrator/src/cli/rlm/symbolic.js +4 -2
  177. package/dist/orchestrator/src/cli/rlmCliRequestShell.js +42 -0
  178. package/dist/orchestrator/src/cli/rlmCompletionCliShell.js +46 -0
  179. package/dist/orchestrator/src/cli/rlmLaunchCliShell.js +51 -0
  180. package/dist/orchestrator/src/cli/rlmRunner.js +83 -523
  181. package/dist/orchestrator/src/cli/run/blockMemory.js +500 -0
  182. package/dist/orchestrator/src/cli/run/manifest.js +410 -73
  183. package/dist/orchestrator/src/cli/run/manifestPersister.js +45 -14
  184. package/dist/orchestrator/src/cli/run/runMemoryController.js +216 -0
  185. package/dist/orchestrator/src/cli/run/source0.js +690 -0
  186. package/dist/orchestrator/src/cli/run/workspacePath.js +101 -0
  187. package/dist/orchestrator/src/cli/runtime/mode.js +2 -1
  188. package/dist/orchestrator/src/cli/runtime/provider.js +39 -2
  189. package/dist/orchestrator/src/cli/selfCheckCliShell.js +12 -0
  190. package/dist/orchestrator/src/cli/services/commandRunner.js +698 -18
  191. package/dist/orchestrator/src/cli/services/execRuntime.js +66 -1
  192. package/dist/orchestrator/src/cli/services/orchestratorAutoScoutEvidenceRecorder.js +71 -0
  193. package/dist/orchestrator/src/cli/services/orchestratorCloudBranchResolution.js +8 -0
  194. package/dist/orchestrator/src/cli/services/orchestratorCloudEnvironmentResolution.js +22 -0
  195. package/dist/orchestrator/src/cli/services/orchestratorCloudExecutionLifecycleShell.js +39 -0
  196. package/dist/orchestrator/src/cli/services/orchestratorCloudPromptBuilder.js +37 -0
  197. package/dist/orchestrator/src/cli/services/orchestratorCloudRouteFallbackContract.js +45 -0
  198. package/dist/orchestrator/src/cli/services/orchestratorCloudRouteShell.js +36 -0
  199. package/dist/orchestrator/src/cli/services/orchestratorCloudTargetExecutor.js +277 -0
  200. package/dist/orchestrator/src/cli/services/orchestratorControlPlaneLifecycle.js +98 -0
  201. package/dist/orchestrator/src/cli/services/orchestratorControlPlaneLifecycleShell.js +54 -0
  202. package/dist/orchestrator/src/cli/services/orchestratorExecutionLifecycle.js +112 -0
  203. package/dist/orchestrator/src/cli/services/orchestratorExecutionModePolicy.js +27 -0
  204. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteAdapterShell.js +59 -0
  205. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteDecisionShell.js +57 -0
  206. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteState.js +21 -0
  207. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouter.js +2 -0
  208. package/dist/orchestrator/src/cli/services/orchestratorLocalPipelineExecutor.js +149 -0
  209. package/dist/orchestrator/src/cli/services/orchestratorLocalRouteShell.js +63 -0
  210. package/dist/orchestrator/src/cli/services/orchestratorPlanShell.js +54 -0
  211. package/dist/orchestrator/src/cli/services/orchestratorPlanTargetTracker.js +16 -0
  212. package/dist/orchestrator/src/cli/services/orchestratorResumePreparationShell.js +84 -0
  213. package/dist/orchestrator/src/cli/services/orchestratorResumeTokenValidation.js +15 -0
  214. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleCompletion.js +31 -0
  215. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleExecutionRegistration.js +37 -0
  216. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleOrchestrationShell.js +83 -0
  217. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleTaskManagerShell.js +37 -0
  218. package/dist/orchestrator/src/cli/services/orchestratorRuntimeManifestMutation.js +20 -0
  219. package/dist/orchestrator/src/cli/services/orchestratorStartPreparationShell.js +56 -0
  220. package/dist/orchestrator/src/cli/services/orchestratorStatusShell.js +70 -0
  221. package/dist/orchestrator/src/cli/services/pipelineResolver.js +7 -3
  222. package/dist/orchestrator/src/cli/services/plannerMemory.js +119 -0
  223. package/dist/orchestrator/src/cli/services/runPreparation.js +7 -3
  224. package/dist/orchestrator/src/cli/services/runSummaryWriter.js +9 -0
  225. package/dist/orchestrator/src/cli/setupBootstrapShell.js +114 -0
  226. package/dist/orchestrator/src/cli/setupCliShell.js +51 -0
  227. package/dist/orchestrator/src/cli/skillsCliShell.js +56 -0
  228. package/dist/orchestrator/src/cli/startCliRequestShell.js +53 -0
  229. package/dist/orchestrator/src/cli/startCliShell.js +68 -0
  230. package/dist/orchestrator/src/cli/statusCliShell.js +22 -0
  231. package/dist/orchestrator/src/cli/utils/authProvenanceFingerprint.js +27 -0
  232. package/dist/orchestrator/src/cli/utils/cloudPreflight.js +285 -7
  233. package/dist/orchestrator/src/cli/utils/codexFeatures.js +60 -0
  234. package/dist/orchestrator/src/cli/utils/delegationConfigParser.js +250 -0
  235. package/dist/orchestrator/src/cli/utils/delegationMcpHealth.js +1382 -0
  236. package/dist/orchestrator/src/cli/utils/devtools.js +2 -54
  237. package/dist/orchestrator/src/cli/utils/mcpServerEntry.js +53 -0
  238. package/dist/orchestrator/src/cli/utils/packageProgramResolver.js +151 -0
  239. package/dist/orchestrator/src/cli/utils/providerOverrideEnv.js +71 -0
  240. package/dist/orchestrator/src/cli/utils/trailingJsonObject.js +59 -0
  241. package/dist/orchestrator/src/learning/crystalizer.js +2 -2
  242. package/dist/orchestrator/src/manager.js +74 -4
  243. package/dist/orchestrator/src/persistence/ExperienceStore.js +233 -49
  244. package/dist/orchestrator/src/persistence/TaskStateStore.js +6 -6
  245. package/dist/orchestrator/src/persistence/lockFile.js +70 -4
  246. package/dist/orchestrator/src/persistence/sanitizeIdentifier.js +39 -0
  247. package/dist/orchestrator/src/sync/createCloudSyncWorker.js +3 -2
  248. package/dist/orchestrator/src/utils/atomicWrite.js +17 -2
  249. package/dist/packages/orchestrator/src/exec/unified-exec.js +99 -6
  250. package/dist/packages/orchestrator/src/instructions/promptPacks.js +150 -19
  251. package/dist/packages/sdk-node/src/orchestrator.js +137 -13
  252. package/dist/packages/shared/config/designConfig.js +8 -1
  253. package/dist/packages/shared/streams/stdio.js +1 -1
  254. package/dist/scripts/design/pipeline/permit.js +15 -0
  255. package/dist/scripts/lib/docs-catalog.js +399 -0
  256. package/dist/scripts/lib/docs-helpers.js +87 -5
  257. package/dist/scripts/lib/pr-watch-merge.js +1088 -80
  258. package/dist/scripts/lib/provider-run-contract.js +26 -0
  259. package/dist/scripts/lib/review-command-intent-classification.js +532 -0
  260. package/dist/scripts/lib/review-command-probe-classification.js +385 -0
  261. package/dist/scripts/lib/review-execution-boundary-preflight.js +279 -0
  262. package/dist/scripts/lib/review-execution-runtime.js +753 -0
  263. package/dist/scripts/lib/review-execution-state.js +1144 -0
  264. package/dist/scripts/lib/review-execution-telemetry.js +215 -0
  265. package/dist/scripts/lib/review-inspection-target-parsing.js +78 -0
  266. package/dist/scripts/lib/review-launch-attempt.js +601 -0
  267. package/dist/scripts/lib/review-meta-surface-boundary-analysis.js +300 -0
  268. package/dist/scripts/lib/review-meta-surface-normalization.js +746 -0
  269. package/dist/scripts/lib/review-non-interactive-handoff.js +61 -0
  270. package/dist/scripts/lib/review-prompt-context.js +376 -0
  271. package/dist/scripts/lib/review-scope-advisory.js +286 -0
  272. package/dist/scripts/lib/review-scope-paths.js +123 -0
  273. package/dist/scripts/lib/review-shell-command-parser.js +389 -0
  274. package/dist/scripts/lib/review-shell-env-interpreter.js +340 -0
  275. package/dist/scripts/lib/run-manifests.js +192 -36
  276. package/dist/scripts/lib/spark-policy-classifier.js +593 -0
  277. package/dist/scripts/run-review.js +507 -1777
  278. package/docs/README.md +43 -20
  279. package/docs/book/README.md +19 -0
  280. package/docs/book/codex-cli-0124-adoption.md +68 -0
  281. package/docs/book/local-hook-impact.md +73 -0
  282. package/docs/book/operations.md +60 -0
  283. package/docs/book/public-posture.md +34 -0
  284. package/docs/book/setup.md +91 -0
  285. package/docs/book/skills.md +11 -0
  286. package/docs/guides/codex-version-policy.md +104 -0
  287. package/docs/public/downstream-setup.md +113 -0
  288. package/docs/public/provider-onboarding.md +173 -0
  289. package/package.json +23 -10
  290. package/plugins/codex-orchestrator/.codex-plugin/plugin.json +30 -0
  291. package/plugins/codex-orchestrator/.mcp.json +13 -0
  292. package/plugins/codex-orchestrator/launcher.mjs +361 -0
  293. package/schemas/manifest.json +411 -0
  294. package/skills/README.md +26 -0
  295. package/skills/collab-subagents-first/SKILL.md +1 -1
  296. package/skills/delegation-usage/DELEGATION_GUIDE.md +30 -12
  297. package/skills/delegation-usage/SKILL.md +25 -14
  298. package/skills/land/SKILL.md +77 -0
  299. package/skills/linear/SKILL.md +255 -0
  300. package/skills/release/SKILL.md +47 -3
  301. package/skills/standalone-review/SKILL.md +6 -1
  302. package/templates/README.md +4 -2
  303. package/templates/codex/.codex/agents/awaiter-high.toml +2 -2
  304. package/templates/codex/.codex/agents/worker-complex.toml +1 -1
  305. package/templates/codex/.codex/config.toml +3 -4
  306. package/templates/codex/.codex/providers/README.md +13 -0
  307. package/templates/codex/.codex/providers/control.example.json +18 -0
  308. package/templates/codex/.codex/providers/provider.env.example +15 -0
  309. package/templates/codex/AGENTS.md +15 -8
  310. package/templates/codex/mcp-client.json +5 -1
  311. package/docs/assets/setup.gif +0 -0
@@ -0,0 +1,173 @@
1
+ import { buildCompatibilityErrorResponse, buildCompatibilityIssueNotFoundResponse, buildCompatibilityMethodNotAllowedResponse, buildCompatibilityNotFoundResponse, buildCompatibilityRefreshRejectedResponse, buildCompatibilityTraceability, readCompatibilityIssue, readCompatibilityRefresh, readCompatibilityState, readDispatchExtension } from './observabilitySurface.js';
2
+ const COMPATIBILITY_API_PREFIX = '/api/v1';
3
+ const COMPATIBILITY_STATE_PATH = `${COMPATIBILITY_API_PREFIX}/state`;
4
+ const COMPATIBILITY_REFRESH_PATH = `${COMPATIBILITY_API_PREFIX}/refresh`;
5
+ const COMPATIBILITY_DISPATCH_EXTENSION_PATH = `${COMPATIBILITY_API_PREFIX}/dispatch`;
6
+ const SYMPHONY_COMPATIBILITY_CORE_SEGMENTS = new Set(['state', 'refresh']);
7
+ const CO_COMPATIBILITY_EXTENSION_SEGMENTS = new Set(['dispatch']);
8
+ const JSON_HEADERS = { 'Content-Type': 'application/json' };
9
+ const JSON_NO_STORE_HEADERS = { 'Content-Type': 'application/json', 'Cache-Control': 'no-store' };
10
+ export async function handleObservabilityApiRequest(context) {
11
+ const method = context.req.method ?? 'GET';
12
+ const pathname = new URL(context.req.url ?? '/', 'http://localhost').pathname;
13
+ const route = resolveObservabilityApiRoute(pathname);
14
+ switch (route.kind) {
15
+ case 'none':
16
+ return false;
17
+ case 'state':
18
+ if (method !== 'GET') {
19
+ writeObservabilityResponse(context.res, buildCompatibilityMethodNotAllowedResponse(context.presenterContext, 'GET'));
20
+ return true;
21
+ }
22
+ writeObservabilityResponse(context.res, {
23
+ status: 200,
24
+ headers: JSON_NO_STORE_HEADERS,
25
+ body: await readCompatibilityState(context.presenterContext)
26
+ });
27
+ return true;
28
+ case 'dispatch': {
29
+ if (method !== 'GET') {
30
+ writeDispatchExtensionMethodNotAllowed(context.res, context.presenterContext);
31
+ return true;
32
+ }
33
+ const result = await readDispatchExtension({
34
+ readDispatchEvaluation: context.readDispatchEvaluation
35
+ });
36
+ if (context.onDispatchEvaluated) {
37
+ await context.onDispatchEvaluated({
38
+ surface: 'api_v1_dispatch',
39
+ evaluation: result.evaluation,
40
+ issueIdentifier: result.issueIdentifier
41
+ });
42
+ }
43
+ const traceability = buildCompatibilityTraceability(context.presenterContext, {
44
+ decision: result.kind === 'fail_closed' ? 'rejected' : 'acknowledged',
45
+ reason: result.kind === 'fail_closed'
46
+ ? result.evaluation.failure?.reason ?? result.evaluation.summary.reason
47
+ : result.evaluation.summary.reason,
48
+ issueIdentifier: result.issueIdentifier
49
+ });
50
+ if (result.kind === 'fail_closed') {
51
+ writeObservabilityResponse(context.res, buildCompatibilityErrorResponse({
52
+ status: result.failure.status,
53
+ code: result.failure.code,
54
+ message: 'Dispatch pilot evaluation failed closed.',
55
+ details: result.details,
56
+ traceability
57
+ }));
58
+ return true;
59
+ }
60
+ writeObservabilityResponse(context.res, {
61
+ status: 200,
62
+ headers: JSON_NO_STORE_HEADERS,
63
+ body: {
64
+ ...result.payload,
65
+ traceability
66
+ }
67
+ });
68
+ return true;
69
+ }
70
+ case 'refresh': {
71
+ if (method !== 'POST') {
72
+ writeObservabilityResponse(context.res, buildCompatibilityMethodNotAllowedResponse(context.presenterContext, 'POST'));
73
+ return true;
74
+ }
75
+ const result = await readCompatibilityRefresh({
76
+ controlStore: context.presenterContext.controlStore,
77
+ paths: context.presenterContext.paths,
78
+ requestRefresh: context.requestRefresh
79
+ }, await context.readRequestBody());
80
+ if (result.kind === 'rejected') {
81
+ writeObservabilityResponse(context.res, buildCompatibilityRefreshRejectedResponse(context.presenterContext, result));
82
+ return true;
83
+ }
84
+ writeObservabilityResponse(context.res, {
85
+ status: 202,
86
+ headers: JSON_HEADERS,
87
+ body: result.payload
88
+ });
89
+ return true;
90
+ }
91
+ case 'issue': {
92
+ if (method !== 'GET') {
93
+ writeObservabilityResponse(context.res, buildCompatibilityMethodNotAllowedResponse(context.presenterContext, 'GET', route.issueIdentifier));
94
+ return true;
95
+ }
96
+ const result = await readCompatibilityIssue(context.presenterContext, route.issueIdentifier);
97
+ if (result.kind === 'issue_not_found') {
98
+ writeObservabilityResponse(context.res, buildCompatibilityIssueNotFoundResponse(context.presenterContext, route.issueIdentifier));
99
+ return true;
100
+ }
101
+ writeObservabilityResponse(context.res, {
102
+ status: 200,
103
+ headers: JSON_NO_STORE_HEADERS,
104
+ body: result.payload
105
+ });
106
+ return true;
107
+ }
108
+ case 'not_found':
109
+ writeObservabilityResponse(context.res, buildCompatibilityNotFoundResponse(context.presenterContext));
110
+ return true;
111
+ }
112
+ }
113
+ export function resolveObservabilityApiRoute(pathname) {
114
+ if (pathname === COMPATIBILITY_STATE_PATH) {
115
+ return { kind: 'state' };
116
+ }
117
+ if (pathname === COMPATIBILITY_DISPATCH_EXTENSION_PATH) {
118
+ return { kind: 'dispatch' };
119
+ }
120
+ if (pathname === COMPATIBILITY_REFRESH_PATH) {
121
+ return { kind: 'refresh' };
122
+ }
123
+ const issueIdentifier = resolveCompatibilityIssueIdentifierFromPath(pathname);
124
+ if (issueIdentifier !== null) {
125
+ return { kind: 'issue', issueIdentifier };
126
+ }
127
+ if (pathname === COMPATIBILITY_API_PREFIX || pathname.startsWith(`${COMPATIBILITY_API_PREFIX}/`)) {
128
+ return { kind: 'not_found' };
129
+ }
130
+ return { kind: 'none' };
131
+ }
132
+ function resolveCompatibilityIssueIdentifierFromPath(pathname) {
133
+ if (!pathname.startsWith(`${COMPATIBILITY_API_PREFIX}/`)) {
134
+ return null;
135
+ }
136
+ const suffix = pathname.slice(`${COMPATIBILITY_API_PREFIX}/`.length);
137
+ if (!suffix || suffix.includes('/')) {
138
+ return null;
139
+ }
140
+ try {
141
+ const decoded = decodeURIComponent(suffix);
142
+ const normalized = decoded.toLowerCase();
143
+ if (!decoded ||
144
+ decoded.includes('/') ||
145
+ SYMPHONY_COMPATIBILITY_CORE_SEGMENTS.has(normalized) ||
146
+ CO_COMPATIBILITY_EXTENSION_SEGMENTS.has(normalized)) {
147
+ return null;
148
+ }
149
+ return decoded;
150
+ }
151
+ catch {
152
+ return null;
153
+ }
154
+ }
155
+ function writeObservabilityResponse(res, response) {
156
+ res.writeHead(response.status, response.headers);
157
+ res.end(JSON.stringify(response.body));
158
+ }
159
+ function writeDispatchExtensionMethodNotAllowed(res, context) {
160
+ writeObservabilityResponse(res, buildCompatibilityErrorResponse({
161
+ status: 405,
162
+ code: 'method_not_allowed',
163
+ message: 'Method not allowed',
164
+ details: {
165
+ surface: 'api_v1',
166
+ allowed_method: 'GET'
167
+ },
168
+ traceability: buildCompatibilityTraceability(context, {
169
+ decision: 'rejected',
170
+ reason: 'method_not_allowed'
171
+ })
172
+ }));
173
+ }
@@ -0,0 +1,500 @@
1
+ import { isProviderLinearWorkerProofFreshForStage } from './providerLinearWorkerTruth.js';
2
+ import { normalizeProviderWorkerHostName } from './providerWorkerHosts.js';
3
+ export function buildTrackedPayloadEnvelope(tracked) {
4
+ return tracked ?? { linear: null };
5
+ }
6
+ export function buildTrackedLinearPayload(trackedIssue) {
7
+ if (!trackedIssue) {
8
+ return null;
9
+ }
10
+ return {
11
+ linear: {
12
+ provider: trackedIssue.provider,
13
+ id: trackedIssue.id,
14
+ identifier: trackedIssue.identifier,
15
+ title: trackedIssue.title,
16
+ url: trackedIssue.url,
17
+ state: trackedIssue.state,
18
+ state_type: trackedIssue.state_type,
19
+ workspace_id: trackedIssue.workspace_id,
20
+ team_id: trackedIssue.team_id,
21
+ team_key: trackedIssue.team_key,
22
+ team_name: trackedIssue.team_name,
23
+ project_id: trackedIssue.project_id,
24
+ project_name: trackedIssue.project_name,
25
+ updated_at: trackedIssue.updated_at,
26
+ recent_activity: trackedIssue.recent_activity
27
+ }
28
+ };
29
+ }
30
+ export function buildSelectedRunQuestionSummaryPayload(summary) {
31
+ return {
32
+ queued_count: summary.queuedCount,
33
+ latest_question: summary.latestQuestion
34
+ ? {
35
+ question_id: summary.latestQuestion.questionId,
36
+ prompt: summary.latestQuestion.prompt,
37
+ urgency: summary.latestQuestion.urgency,
38
+ queued_at: summary.latestQuestion.queuedAt
39
+ }
40
+ : null
41
+ };
42
+ }
43
+ export function buildSelectedRunLatestEventPayload(latestEvent, options = {}) {
44
+ if (!latestEvent) {
45
+ return null;
46
+ }
47
+ return {
48
+ at: latestEvent.at,
49
+ event: latestEvent.event,
50
+ message: latestEvent.message,
51
+ source: latestEvent.source ?? null,
52
+ message_recorded_at: latestEvent.messageRecordedAt ?? null,
53
+ source_updated_at: latestEvent.sourceUpdatedAt ?? null,
54
+ candidates: latestEvent.candidates ?? [],
55
+ ...(options.includeRequestMetadata
56
+ ? {
57
+ requested_by: latestEvent.requestedBy,
58
+ reason: latestEvent.reason
59
+ }
60
+ : {})
61
+ };
62
+ }
63
+ export function readProviderLinearWorkerHost(proof, stageStartedAt) {
64
+ if (!proof
65
+ || !isProviderLinearWorkerProofFreshForStage(proof, stageStartedAt ?? null)) {
66
+ return { kind: 'missing' };
67
+ }
68
+ return readResolvedWorkerHost(proof);
69
+ }
70
+ export function resolveProviderWorkerHost(input) {
71
+ const claimLaunchStartedAt = input.providerDebugSnapshot?.claim?.launch_started_at ?? null;
72
+ const stageStartedAt = claimLaunchStartedAt
73
+ ?? input.stageStartedAt
74
+ ?? null;
75
+ const claimHost = readResolvedWorkerHost(input.providerDebugSnapshot?.claim);
76
+ if (claimHost.kind === 'host') {
77
+ return claimHost.value;
78
+ }
79
+ if (claimHost.kind === 'cleared') {
80
+ return null;
81
+ }
82
+ const proofHost = readProviderLinearWorkerHost(input.providerLinearWorkerProof, stageStartedAt);
83
+ if (proofHost.kind === 'host') {
84
+ return proofHost.value;
85
+ }
86
+ if (proofHost.kind === 'cleared') {
87
+ return null;
88
+ }
89
+ const selectedClaim = input.providerIntake?.selected_claim ?? null;
90
+ if (!selectedClaim) {
91
+ return null;
92
+ }
93
+ const issueIdentifier = input.issueIdentifier ?? null;
94
+ const issueId = input.issueId ?? null;
95
+ if (issueIdentifier !== null
96
+ && selectedClaim.issue_identifier !== issueIdentifier
97
+ && issueId !== null
98
+ && selectedClaim.issue_id !== issueId) {
99
+ return null;
100
+ }
101
+ if (issueIdentifier !== null
102
+ && selectedClaim.issue_identifier !== issueIdentifier
103
+ && issueId === null) {
104
+ return null;
105
+ }
106
+ if (issueId !== null
107
+ && selectedClaim.issue_id !== issueId
108
+ && issueIdentifier === null) {
109
+ return null;
110
+ }
111
+ return normalizeProviderWorkerHostName(selectedClaim.worker_host);
112
+ }
113
+ function readResolvedWorkerHost(source) {
114
+ if (!source
115
+ || !Object.prototype.hasOwnProperty.call(source, 'worker_host')
116
+ || source.worker_host === undefined) {
117
+ return { kind: 'missing' };
118
+ }
119
+ const workerHost = normalizeProviderWorkerHostName(source.worker_host);
120
+ return workerHost === null
121
+ ? { kind: 'cleared' }
122
+ : { kind: 'host', value: workerHost };
123
+ }
124
+ export function buildProjectionSelectedPayload(selected, providerIntake = null) {
125
+ const workerHost = resolveProviderWorkerHost({
126
+ providerLinearWorkerProof: selected.providerLinearWorkerProof,
127
+ providerDebugSnapshot: selected.providerDebugSnapshot,
128
+ providerIntake,
129
+ issueIdentifier: selected.issueIdentifier,
130
+ issueId: selected.issueId,
131
+ stageStartedAt: selected.startedAt
132
+ });
133
+ return {
134
+ issue_id: selected.issueId,
135
+ issue_identifier: selected.issueIdentifier,
136
+ task_id: selected.taskId,
137
+ run_id: selected.runId,
138
+ raw_status: selected.rawStatus,
139
+ display_status: selected.displayStatus,
140
+ status_reason: selected.statusReason,
141
+ started_at: selected.startedAt,
142
+ updated_at: selected.updatedAt,
143
+ completed_at: selected.completedAt,
144
+ summary: selected.summary,
145
+ last_error: selected.lastError,
146
+ latest_action: selected.latestAction,
147
+ latest_event: buildSelectedRunLatestEventPayload(selected.latestEvent, {
148
+ includeRequestMetadata: true
149
+ }),
150
+ workspace: {
151
+ path: selected.workspacePath
152
+ },
153
+ ...(workerHost !== null ? { worker_host: workerHost } : {}),
154
+ question_summary: buildSelectedRunQuestionSummaryPayload(selected.questionSummary),
155
+ tracked: buildTrackedPayloadEnvelope(selected.tracked),
156
+ ...(selected.providerLinearWorkerProof
157
+ ? {
158
+ provider_linear_worker_proof: selected.providerLinearWorkerProof
159
+ }
160
+ : {}),
161
+ ...(selected.providerDebugSnapshot
162
+ ? {
163
+ provider_debug_snapshot: selected.providerDebugSnapshot
164
+ }
165
+ : {})
166
+ };
167
+ }
168
+ export function serializeProviderIntakeSummary(providerIntake) {
169
+ return {
170
+ summary_scope: providerIntake.summary_scope,
171
+ selection_strategy: providerIntake.selection_strategy,
172
+ claim_count: providerIntake.claim_count,
173
+ active_claim_count: providerIntake.active_claim_count,
174
+ running_claim_count: providerIntake.running_claim_count,
175
+ active_issue_identifiers: [...providerIntake.active_issue_identifiers],
176
+ running_issue_identifiers: [...providerIntake.running_issue_identifiers],
177
+ selected_claim: {
178
+ issue_identifier: providerIntake.selected_claim.issue_identifier,
179
+ task_id: providerIntake.selected_claim.task_id,
180
+ state: providerIntake.selected_claim.state,
181
+ reason: providerIntake.selected_claim.reason,
182
+ run_id: providerIntake.selected_claim.run_id,
183
+ freshness: providerIntake.selected_claim.freshness,
184
+ retry: providerIntake.selected_claim.retry,
185
+ worker_host: providerIntake.selected_claim.worker_host ?? null
186
+ },
187
+ rehydrated_at: providerIntake.rehydrated_at,
188
+ is_rehydrated: providerIntake.is_rehydrated,
189
+ updated_at: providerIntake.updated_at
190
+ };
191
+ }
192
+ export function buildSelectedRunRuntimeFingerprintInput(snapshot) {
193
+ const selected = snapshot.selected ?? null;
194
+ const dispatchPilot = snapshot.dispatchPilot ?? null;
195
+ const trackedLinear = selected?.tracked?.linear ?? snapshot.tracked?.linear ?? null;
196
+ const providerIntake = snapshot.providerIntake ?? null;
197
+ const providerWorkflow = snapshot.providerWorkflow ?? null;
198
+ const questionSummary = selected?.questionSummary ?? null;
199
+ if (!selected && !trackedLinear && !dispatchPilot && !questionSummary && !providerIntake && !providerWorkflow) {
200
+ return null;
201
+ }
202
+ return {
203
+ selected: selected
204
+ ? {
205
+ issue_identifier: selected.issueIdentifier,
206
+ run_id: selected.runId,
207
+ raw_status: selected.rawStatus,
208
+ display_status: selected.displayStatus,
209
+ status_reason: selected.statusReason,
210
+ summary: selected.summary,
211
+ latest_event: selected.latestEvent
212
+ ? {
213
+ event: selected.latestEvent.event,
214
+ message: selected.latestEvent.message,
215
+ at: selected.latestEvent.at
216
+ }
217
+ : null,
218
+ provider_linear_worker_proof: selected.providerLinearWorkerProof ?? null,
219
+ provider_debug_snapshot: selected.providerDebugSnapshot ?? null,
220
+ provider_retry_state: selected.providerRetryState ?? null,
221
+ question_summary: questionSummary
222
+ ? {
223
+ queued_count: questionSummary.queuedCount,
224
+ latest_question_id: questionSummary.latestQuestion?.questionId ?? null,
225
+ latest_question_prompt: questionSummary.latestQuestion?.prompt ?? null,
226
+ latest_question_urgency: questionSummary.latestQuestion?.urgency ?? null
227
+ }
228
+ : null
229
+ }
230
+ : null,
231
+ dispatch_pilot: dispatchPilot
232
+ ? {
233
+ status: dispatchPilot.status ?? null,
234
+ source_status: dispatchPilot.source_status ?? null,
235
+ reason: dispatchPilot.reason ?? null
236
+ }
237
+ : null,
238
+ tracked_linear: trackedLinear
239
+ ? {
240
+ identifier: trackedLinear.identifier,
241
+ title: trackedLinear.title,
242
+ state: trackedLinear.state,
243
+ url: trackedLinear.url,
244
+ team_key: trackedLinear.team_key
245
+ }
246
+ : null,
247
+ provider_intake: providerIntake ? serializeProviderIntakeSummary(providerIntake) : null,
248
+ provider_workflow: providerWorkflow
249
+ ? {
250
+ status: providerWorkflow.status,
251
+ pipeline_id: providerWorkflow.pipeline_id,
252
+ source_path: providerWorkflow.source_path,
253
+ snapshot_path: providerWorkflow.snapshot_path,
254
+ last_reload_attempt_at: providerWorkflow.last_reload_attempt_at,
255
+ last_success_at: providerWorkflow.last_success_at,
256
+ last_error_at: providerWorkflow.last_error_at,
257
+ last_error: providerWorkflow.last_error,
258
+ terminal_cleanup: providerWorkflow.terminal_cleanup
259
+ ? {
260
+ enabled: providerWorkflow.terminal_cleanup.enabled,
261
+ close_attached_pr: {
262
+ enabled: providerWorkflow.terminal_cleanup.close_attached_pr.enabled,
263
+ comment_template: providerWorkflow.terminal_cleanup.close_attached_pr.comment_template
264
+ },
265
+ last_result: providerWorkflow.terminal_cleanup.last_result
266
+ ? {
267
+ attempted_at: providerWorkflow.terminal_cleanup.last_result.attempted_at,
268
+ status: providerWorkflow.terminal_cleanup.last_result.status,
269
+ summary: providerWorkflow.terminal_cleanup.last_result.summary,
270
+ error: providerWorkflow.terminal_cleanup.last_result.error,
271
+ issue_id: providerWorkflow.terminal_cleanup.last_result.issue_id,
272
+ issue_identifier: providerWorkflow.terminal_cleanup.last_result.issue_identifier,
273
+ workspace_path: providerWorkflow.terminal_cleanup.last_result.workspace_path,
274
+ branch: providerWorkflow.terminal_cleanup.last_result.branch,
275
+ attached_pr_urls: [
276
+ ...providerWorkflow.terminal_cleanup.last_result.attached_pr_urls
277
+ ],
278
+ matching_open_pr_urls: [
279
+ ...providerWorkflow.terminal_cleanup.last_result.matching_open_pr_urls
280
+ ],
281
+ closed_pr_urls: [
282
+ ...providerWorkflow.terminal_cleanup.last_result.closed_pr_urls
283
+ ]
284
+ }
285
+ : null
286
+ }
287
+ : null,
288
+ worker_hosts: Array.isArray(providerWorkflow.worker_hosts)
289
+ ? providerWorkflow.worker_hosts.map((host) => ({
290
+ ...host,
291
+ ssh_options: [...host.ssh_options]
292
+ }))
293
+ : [],
294
+ operator_autopilot: providerWorkflow.operator_autopilot
295
+ ? {
296
+ enabled: providerWorkflow.operator_autopilot.enabled,
297
+ backlog_promotion: {
298
+ enabled: providerWorkflow.operator_autopilot.backlog_promotion.enabled,
299
+ state_name: providerWorkflow.operator_autopilot.backlog_promotion.state_name,
300
+ target_state_name: providerWorkflow.operator_autopilot.backlog_promotion.target_state_name,
301
+ snapshot_retention: {
302
+ max_untracked_cycles: providerWorkflow.operator_autopilot.backlog_promotion
303
+ .snapshot_retention?.max_untracked_cycles ?? 3,
304
+ terminal_state_types: [
305
+ ...(providerWorkflow.operator_autopilot.backlog_promotion
306
+ .snapshot_retention?.terminal_state_types ?? [
307
+ 'completed',
308
+ 'canceled'
309
+ ])
310
+ ]
311
+ }
312
+ },
313
+ review_handoff_rework: {
314
+ enabled: providerWorkflow.operator_autopilot.review_handoff_rework.enabled,
315
+ target_state_name: providerWorkflow.operator_autopilot.review_handoff_rework.target_state_name,
316
+ excluded_action_required_reasons: [
317
+ ...providerWorkflow.operator_autopilot.review_handoff_rework.excluded_action_required_reasons
318
+ ]
319
+ },
320
+ post_merge_rollout: {
321
+ enabled: providerWorkflow.operator_autopilot.post_merge_rollout.enabled,
322
+ summary: providerWorkflow.operator_autopilot.post_merge_rollout.summary,
323
+ execution: providerWorkflow.operator_autopilot.post_merge_rollout.execution
324
+ },
325
+ audit_path: providerWorkflow.operator_autopilot.audit_path,
326
+ lifecycle_path: providerWorkflow.operator_autopilot.lifecycle_path,
327
+ execution_path: providerWorkflow.operator_autopilot.execution_path,
328
+ last_result: providerWorkflow.operator_autopilot.last_result
329
+ ? {
330
+ recorded_at: providerWorkflow.operator_autopilot.last_result.recorded_at,
331
+ status: providerWorkflow.operator_autopilot.last_result.status,
332
+ summary: providerWorkflow.operator_autopilot.last_result.summary,
333
+ error: providerWorkflow.operator_autopilot.last_result.error,
334
+ actions: providerWorkflow.operator_autopilot.last_result.actions.map((action) => ({
335
+ kind: action.kind,
336
+ issue_id: action.issue_id,
337
+ issue_identifier: action.issue_identifier,
338
+ reason: action.reason,
339
+ summary: action.summary,
340
+ transition: {
341
+ status: action.transition.status,
342
+ attempted_at: action.transition.attempted_at,
343
+ previous_state: action.transition.previous_state,
344
+ target_state: action.transition.target_state,
345
+ issue_state: action.transition.issue_state,
346
+ issue_state_type: action.transition.issue_state_type,
347
+ issue_updated_at: action.transition.issue_updated_at,
348
+ force_path_used: action.transition.force_path_used ?? false,
349
+ error: action.transition.error
350
+ },
351
+ action_required_reasons: [...action.action_required_reasons]
352
+ })),
353
+ holds: providerWorkflow.operator_autopilot.last_result.holds.map((hold) => ({
354
+ kind: hold.kind,
355
+ issue_id: hold.issue_id,
356
+ issue_identifier: hold.issue_identifier,
357
+ issue_state: hold.issue_state ?? null,
358
+ issue_state_type: hold.issue_state_type ?? null,
359
+ issue_updated_at: hold.issue_updated_at ?? null,
360
+ promotion_attempted_at: hold.promotion_attempted_at ?? null,
361
+ promotion_issue_updated_at: hold.promotion_issue_updated_at ?? null,
362
+ force_path_used: hold.force_path_used ?? false,
363
+ reason: hold.reason,
364
+ summary: hold.summary,
365
+ action_required_reasons: [...hold.action_required_reasons]
366
+ })),
367
+ pending_actions: providerWorkflow.operator_autopilot.last_result.pending_actions.map((pendingAction) => ({
368
+ kind: pendingAction.kind,
369
+ action_instance_id: pendingAction.action_instance_id,
370
+ issue_id: pendingAction.issue_id,
371
+ issue_identifier: pendingAction.issue_identifier,
372
+ summary: pendingAction.summary,
373
+ merge_closeout_recorded_at: pendingAction.merge_closeout_recorded_at,
374
+ merge_closeout_reason: pendingAction.merge_closeout_reason,
375
+ shared_root_status: pendingAction.shared_root_status,
376
+ linear_transition_status: pendingAction.linear_transition_status,
377
+ executable_action_ids: [
378
+ ...(pendingAction.executable_action_ids ?? [])
379
+ ],
380
+ lifecycle_state: pendingAction.lifecycle_state,
381
+ lifecycle_actor: pendingAction.lifecycle_actor,
382
+ lifecycle_reason: pendingAction.lifecycle_reason,
383
+ lifecycle_recorded_at: pendingAction.lifecycle_recorded_at
384
+ })),
385
+ terminal_blocker_advisories: (providerWorkflow.operator_autopilot.last_result
386
+ .terminal_blocker_advisories ?? []).map((advisory) => ({
387
+ kind: advisory.kind,
388
+ issue_id: advisory.issue_id,
389
+ issue_identifier: advisory.issue_identifier,
390
+ issue_state: advisory.issue_state,
391
+ issue_state_type: advisory.issue_state_type,
392
+ issue_updated_at: advisory.issue_updated_at,
393
+ blockers: advisory.blockers.map((blocker) => ({
394
+ id: blocker.id,
395
+ identifier: blocker.identifier,
396
+ state: blocker.state,
397
+ state_type: blocker.state_type
398
+ })),
399
+ canonical_owner_hints: [...advisory.canonical_owner_hints],
400
+ duplicate_hints: [...advisory.duplicate_hints],
401
+ recommended_action: advisory.recommended_action,
402
+ summary: advisory.summary
403
+ })),
404
+ resolved_actions: (providerWorkflow.operator_autopilot.last_result.resolved_actions ?? []).map((resolvedAction) => ({
405
+ kind: resolvedAction.kind,
406
+ action_instance_id: resolvedAction.action_instance_id,
407
+ issue_id: resolvedAction.issue_id,
408
+ issue_identifier: resolvedAction.issue_identifier,
409
+ summary: resolvedAction.summary,
410
+ merge_closeout_recorded_at: resolvedAction.merge_closeout_recorded_at,
411
+ merge_closeout_reason: resolvedAction.merge_closeout_reason,
412
+ shared_root_status: resolvedAction.shared_root_status,
413
+ linear_transition_status: resolvedAction.linear_transition_status,
414
+ executable_action_ids: [
415
+ ...(resolvedAction.executable_action_ids ?? [])
416
+ ],
417
+ lifecycle_state: resolvedAction.lifecycle_state,
418
+ lifecycle_actor: resolvedAction.lifecycle_actor,
419
+ lifecycle_reason: resolvedAction.lifecycle_reason,
420
+ lifecycle_recorded_at: resolvedAction.lifecycle_recorded_at
421
+ })),
422
+ lifecycle_records: (providerWorkflow.operator_autopilot.last_result.lifecycle_records ?? []).map((record) => ({
423
+ action_instance_id: record.action_instance_id,
424
+ kind: record.kind,
425
+ issue_id: record.issue_id,
426
+ issue_identifier: record.issue_identifier,
427
+ state: record.state,
428
+ actor: record.actor,
429
+ reason: record.reason,
430
+ recorded_at: record.recorded_at,
431
+ source: record.source
432
+ })),
433
+ local_rollout_execution_attempts: (providerWorkflow.operator_autopilot.last_result
434
+ .local_rollout_execution_attempts ?? []).map((attempt) => ({
435
+ action_instance_id: attempt.action_instance_id,
436
+ record_kind: attempt.record_kind,
437
+ action_id: attempt.action_id,
438
+ issue_id: attempt.issue_id,
439
+ issue_identifier: attempt.issue_identifier,
440
+ preflight: {
441
+ status: attempt.preflight.status,
442
+ reason: attempt.preflight.reason,
443
+ checked_at: attempt.preflight.checked_at,
444
+ summary: attempt.preflight.summary
445
+ },
446
+ started_at: attempt.started_at,
447
+ ended_at: attempt.ended_at,
448
+ terminal_state: attempt.terminal_state,
449
+ reason: attempt.reason,
450
+ summary: attempt.summary,
451
+ command: {
452
+ runner: attempt.command.runner,
453
+ command: attempt.command.command,
454
+ args: [...attempt.command.args],
455
+ cwd: attempt.command.cwd,
456
+ timeout_ms: attempt.command.timeout_ms
457
+ },
458
+ exit_code: attempt.exit_code,
459
+ stdout: attempt.stdout,
460
+ stderr: attempt.stderr
461
+ })),
462
+ backlog_promotion_snapshots: (providerWorkflow.operator_autopilot.last_result
463
+ .backlog_promotion_snapshots ?? []).map((snapshot) => ({
464
+ issue_id: snapshot.issue_id,
465
+ issue_identifier: snapshot.issue_identifier,
466
+ target_state: snapshot.target_state,
467
+ attempted_at: snapshot.attempted_at,
468
+ issue_updated_at: snapshot.issue_updated_at,
469
+ force_path_used: snapshot.force_path_used,
470
+ untracked_cycles: snapshot.untracked_cycles ?? 0
471
+ })),
472
+ backlog_promotion_snapshot_retention_records: (providerWorkflow.operator_autopilot.last_result
473
+ .backlog_promotion_snapshot_retention_records ?? []).map((record) => ({
474
+ issue_id: record.issue_id,
475
+ issue_identifier: record.issue_identifier,
476
+ target_state: record.target_state,
477
+ attempted_at: record.attempted_at,
478
+ issue_updated_at: record.issue_updated_at,
479
+ evaluated_at: record.evaluated_at,
480
+ decision: record.decision,
481
+ reason: record.reason,
482
+ age_ms: record.age_ms,
483
+ untracked_cycles: record.untracked_cycles,
484
+ max_untracked_cycles: record.max_untracked_cycles,
485
+ issue_state: record.issue_state,
486
+ issue_state_type: record.issue_state_type,
487
+ issue_archived_at: record.issue_archived_at,
488
+ issue_trashed: record.issue_trashed,
489
+ issue_observed_updated_at: record.issue_observed_updated_at,
490
+ terminal_state_evidence: record.terminal_state_evidence,
491
+ force_path_used: record.force_path_used
492
+ }))
493
+ }
494
+ : null
495
+ }
496
+ : null
497
+ }
498
+ : null
499
+ };
500
+ }