@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,62 @@
1
+ export async function handleConfirmationApproveRequest(context) {
2
+ const method = context.req.method ?? 'GET';
3
+ const pathname = new URL(context.req.url ?? '/', 'http://localhost').pathname;
4
+ if (pathname !== '/confirmations/approve' || method !== 'POST') {
5
+ return false;
6
+ }
7
+ await context.expireConfirmations();
8
+ const body = await context.readRequestBody();
9
+ const requestId = readStringValue(body, 'request_id', 'requestId');
10
+ if (!requestId) {
11
+ writeConfirmationApproveResponse(context.res, 400, { error: 'missing_request_id' });
12
+ return true;
13
+ }
14
+ const actor = readStringValue(body, 'actor') ?? 'ui';
15
+ context.approveConfirmation(requestId, actor);
16
+ const entry = context.readConfirmation(requestId);
17
+ await context.persistConfirmations();
18
+ if (entry && entry.tool.startsWith('ui.') && entry.action === 'cancel') {
19
+ try {
20
+ const nonce = context.issueConfirmation(requestId);
21
+ const validation = context.validateConfirmation({
22
+ confirmNonce: nonce.confirm_nonce,
23
+ tool: entry.tool,
24
+ params: entry.params
25
+ });
26
+ await context.persistConfirmations();
27
+ await context.emitConfirmationResolved({
28
+ request_id: validation.request.request_id,
29
+ nonce_id: validation.nonce_id,
30
+ outcome: 'approved'
31
+ });
32
+ context.updateControlAction({
33
+ action: 'cancel',
34
+ requestedBy: actor,
35
+ requestId
36
+ });
37
+ await context.persistControl();
38
+ context.publishRuntime();
39
+ }
40
+ catch (error) {
41
+ writeConfirmationApproveResponse(context.res, 409, {
42
+ error: error?.message ?? 'confirmation_invalid'
43
+ });
44
+ return true;
45
+ }
46
+ }
47
+ writeConfirmationApproveResponse(context.res, 200, { status: 'approved' });
48
+ return true;
49
+ }
50
+ function writeConfirmationApproveResponse(res, status, body) {
51
+ res.writeHead(status, { 'Content-Type': 'application/json' });
52
+ res.end(JSON.stringify(body));
53
+ }
54
+ function readStringValue(record, ...keys) {
55
+ for (const key of keys) {
56
+ const value = record[key];
57
+ if (typeof value === 'string' && value.trim().length > 0) {
58
+ return value.trim();
59
+ }
60
+ }
61
+ return undefined;
62
+ }
@@ -0,0 +1,69 @@
1
+ export async function handleConfirmationCreateRequest(context) {
2
+ const method = context.req.method ?? 'GET';
3
+ const pathname = new URL(context.req.url ?? '/', 'http://localhost').pathname;
4
+ if (pathname !== '/confirmations/create' || method !== 'POST') {
5
+ return false;
6
+ }
7
+ await context.expireConfirmations();
8
+ const body = await context.readRequestBody();
9
+ const rawAction = readStringValue(body, 'action');
10
+ const action = rawAction === 'cancel' || rawAction === 'merge' ? rawAction : 'other';
11
+ let tool = readStringValue(body, 'tool') ?? 'unknown';
12
+ let params = readRecordValue(body, 'params') ?? {};
13
+ if (context.authKind === 'session') {
14
+ if (rawAction !== 'cancel' || tool !== 'ui.cancel') {
15
+ writeConfirmationCreateResponse(context.res, 403, { error: 'ui_confirmation_disallowed' });
16
+ return true;
17
+ }
18
+ tool = 'ui.cancel';
19
+ params = {};
20
+ }
21
+ const { confirmation, wasCreated } = context.createConfirmation({
22
+ action,
23
+ tool,
24
+ params
25
+ });
26
+ await context.persistConfirmations();
27
+ if (wasCreated) {
28
+ await context.maybeAutoPause(confirmation.request_id);
29
+ }
30
+ const payload = buildConfirmationRequiredPayload(context.readRunId(), confirmation);
31
+ if (wasCreated) {
32
+ await context.emitConfirmationRequired(payload);
33
+ }
34
+ writeConfirmationCreateResponse(context.res, 200, payload);
35
+ return true;
36
+ }
37
+ function buildConfirmationRequiredPayload(runId, result) {
38
+ return {
39
+ request_id: result.request_id,
40
+ confirm_scope: {
41
+ run_id: runId,
42
+ action: result.action,
43
+ action_params_digest: result.action_params_digest
44
+ },
45
+ action_params_digest: result.action_params_digest,
46
+ digest_alg: result.digest_alg,
47
+ confirm_expires_in_ms: Date.parse(result.expires_at) - Date.parse(result.requested_at)
48
+ };
49
+ }
50
+ function writeConfirmationCreateResponse(res, status, body) {
51
+ res.writeHead(status, { 'Content-Type': 'application/json' });
52
+ res.end(JSON.stringify(body));
53
+ }
54
+ function readStringValue(record, ...keys) {
55
+ for (const key of keys) {
56
+ const value = record[key];
57
+ if (typeof value === 'string' && value.trim().length > 0) {
58
+ return value.trim();
59
+ }
60
+ }
61
+ return undefined;
62
+ }
63
+ function readRecordValue(record, key) {
64
+ const value = record[key];
65
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
66
+ return value;
67
+ }
68
+ return undefined;
69
+ }
@@ -0,0 +1,43 @@
1
+ export async function handleConfirmationIssueConsumeRequest(context) {
2
+ const method = context.req.method ?? 'GET';
3
+ const pathname = new URL(context.req.url ?? '/', 'http://localhost').pathname;
4
+ if (!isConfirmationIssueConsumeRoute(pathname) || method !== 'POST') {
5
+ return false;
6
+ }
7
+ await context.expireConfirmations();
8
+ const body = await context.readRequestBody();
9
+ const requestId = readStringValue(body, 'request_id', 'requestId');
10
+ if (!requestId) {
11
+ writeConfirmationResponse(context.res, 400, { error: 'missing_request_id' });
12
+ return true;
13
+ }
14
+ let nonce;
15
+ try {
16
+ nonce = context.issueConfirmation(requestId);
17
+ }
18
+ catch (error) {
19
+ writeConfirmationResponse(context.res, 409, {
20
+ error: error?.message ?? 'confirmation_invalid'
21
+ });
22
+ return true;
23
+ }
24
+ await context.persistConfirmations();
25
+ writeConfirmationResponse(context.res, 200, nonce);
26
+ return true;
27
+ }
28
+ function isConfirmationIssueConsumeRoute(pathname) {
29
+ return pathname === '/confirmations/issue' || pathname === '/confirmations/consume';
30
+ }
31
+ function writeConfirmationResponse(res, status, body) {
32
+ res.writeHead(status, { 'Content-Type': 'application/json' });
33
+ res.end(JSON.stringify(body));
34
+ }
35
+ function readStringValue(record, ...keys) {
36
+ for (const key of keys) {
37
+ const value = record[key];
38
+ if (typeof value === 'string' && value.trim().length > 0) {
39
+ return value.trim();
40
+ }
41
+ }
42
+ return undefined;
43
+ }
@@ -0,0 +1,22 @@
1
+ export async function handleConfirmationListRequest(context) {
2
+ const method = context.req.method ?? 'GET';
3
+ const pathname = new URL(context.req.url ?? '/', 'http://localhost').pathname;
4
+ if (pathname !== '/confirmations' || method !== 'GET') {
5
+ return false;
6
+ }
7
+ await context.expireConfirmations();
8
+ const pending = sanitizeConfirmations(context.listPendingConfirmations());
9
+ writeConfirmationListResponse(context.res, 200, { pending });
10
+ return true;
11
+ }
12
+ function writeConfirmationListResponse(res, status, body) {
13
+ res.writeHead(status, { 'Content-Type': 'application/json' });
14
+ res.end(JSON.stringify(body));
15
+ }
16
+ function sanitizeConfirmations(entries) {
17
+ return entries.map((entry) => {
18
+ const sanitized = { ...entry };
19
+ delete sanitized.params;
20
+ return sanitized;
21
+ });
22
+ }
@@ -0,0 +1,58 @@
1
+ export async function handleConfirmationValidateRequest(context) {
2
+ const method = context.req.method ?? 'GET';
3
+ const pathname = new URL(context.req.url ?? '/', 'http://localhost').pathname;
4
+ if (pathname !== '/confirmations/validate' || method !== 'POST') {
5
+ return false;
6
+ }
7
+ await context.expireConfirmations();
8
+ const body = await context.readRequestBody();
9
+ const confirmNonce = readStringValue(body, 'confirm_nonce', 'confirmNonce');
10
+ if (!confirmNonce) {
11
+ writeConfirmationValidateResponse(context.res, 400, { error: 'missing_confirm_nonce' });
12
+ return true;
13
+ }
14
+ const tool = readStringValue(body, 'tool') ?? 'unknown';
15
+ const params = readRecordValue(body, 'params') ?? {};
16
+ let validation;
17
+ try {
18
+ validation = context.validateConfirmation({ confirmNonce, tool, params });
19
+ }
20
+ catch (error) {
21
+ writeConfirmationValidateResponse(context.res, 409, {
22
+ error: error?.message ?? 'confirmation_invalid'
23
+ });
24
+ return true;
25
+ }
26
+ await context.persistConfirmations();
27
+ await context.emitConfirmationResolved({
28
+ request_id: validation.request.request_id,
29
+ nonce_id: validation.nonce_id,
30
+ outcome: 'approved'
31
+ });
32
+ writeConfirmationValidateResponse(context.res, 200, {
33
+ status: 'valid',
34
+ request_id: validation.request.request_id,
35
+ nonce_id: validation.nonce_id
36
+ });
37
+ return true;
38
+ }
39
+ function writeConfirmationValidateResponse(res, status, body) {
40
+ res.writeHead(status, { 'Content-Type': 'application/json' });
41
+ res.end(JSON.stringify(body));
42
+ }
43
+ function readStringValue(record, ...keys) {
44
+ for (const key of keys) {
45
+ const value = record[key];
46
+ if (typeof value === 'string' && value.trim().length > 0) {
47
+ return value.trim();
48
+ }
49
+ }
50
+ return undefined;
51
+ }
52
+ function readRecordValue(record, key) {
53
+ const value = record[key];
54
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
55
+ return value;
56
+ }
57
+ return undefined;
58
+ }
@@ -1,5 +1,4 @@
1
1
  import { createHash, createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
2
- import canonicalize from 'canonicalize';
3
2
  const NONCE_VERSION = 1;
4
3
  export class ConfirmationStore {
5
4
  runId;
@@ -202,13 +201,36 @@ export class ConfirmationStore {
202
201
  }
203
202
  export function buildActionParamsDigest(input) {
204
203
  const sanitized = stripConfirmNonce({ tool: input.tool, params: input.params });
205
- const canonicalizeFn = canonicalize;
206
- const canonical = canonicalizeFn(sanitized);
204
+ const canonical = canonicalizeJsonValue(sanitized);
207
205
  if (typeof canonical !== 'string') {
208
206
  throw new Error('Unable to canonicalize confirmation params.');
209
207
  }
210
208
  return createHash('sha256').update(canonical).digest('hex');
211
209
  }
210
+ function canonicalizeJsonValue(value) {
211
+ if (value === null) {
212
+ return 'null';
213
+ }
214
+ if (typeof value === 'boolean' || typeof value === 'number' || typeof value === 'string') {
215
+ return JSON.stringify(value);
216
+ }
217
+ if (Array.isArray(value)) {
218
+ return `[${value.map((entry) => canonicalizeJsonValue(entry) ?? 'null').join(',')}]`;
219
+ }
220
+ if (value && typeof value === 'object') {
221
+ const entries = Object.entries(value)
222
+ .sort(([leftKey], [rightKey]) => leftKey.localeCompare(rightKey))
223
+ .flatMap(([key, entry]) => {
224
+ const canonicalEntry = canonicalizeJsonValue(entry);
225
+ if (typeof canonicalEntry === 'undefined') {
226
+ return [];
227
+ }
228
+ return [`${JSON.stringify(key)}:${canonicalEntry}`];
229
+ });
230
+ return `{${entries.join(',')}}`;
231
+ }
232
+ return undefined;
233
+ }
212
234
  function stripConfirmNonce(value) {
213
235
  if (Array.isArray(value)) {
214
236
  return value.map(stripConfirmNonce);
@@ -0,0 +1,65 @@
1
+ import { buildCanonicalTraceability, resolveTransportMutationRequestFromConfirmationScope } from './controlActionPreflight.js';
2
+ export async function resolveCancelConfirmation(input) {
3
+ let validation;
4
+ try {
5
+ validation = input.validateNonce({
6
+ confirmNonce: input.confirmNonce,
7
+ tool: input.tool,
8
+ params: input.params
9
+ });
10
+ }
11
+ catch (error) {
12
+ return {
13
+ ok: false,
14
+ status: 409,
15
+ error: error?.message ?? 'confirmation_invalid'
16
+ };
17
+ }
18
+ const confirmedRequestValue = validation.request.params.request_id ?? validation.request.params.requestId;
19
+ const confirmedRequestId = typeof confirmedRequestValue === 'string' && confirmedRequestValue.trim().length > 0
20
+ ? confirmedRequestValue.trim()
21
+ : undefined;
22
+ const confirmedIntentValue = validation.request.params.intent_id ?? validation.request.params.intentId;
23
+ const confirmedIntentId = typeof confirmedIntentValue === 'string' && confirmedIntentValue.trim().length > 0
24
+ ? confirmedIntentValue.trim()
25
+ : undefined;
26
+ const requestId = confirmedRequestId ?? validation.request.request_id;
27
+ const intentId = confirmedIntentId ?? input.currentIntentId;
28
+ await input.persistConfirmations();
29
+ await input.emitConfirmationResolved({
30
+ request_id: validation.request.request_id,
31
+ nonce_id: validation.nonce_id,
32
+ outcome: 'approved'
33
+ });
34
+ const transportMutationResult = resolveTransportMutationRequestFromConfirmationScope({
35
+ body: input.body,
36
+ params: validation.request.params,
37
+ action: 'cancel'
38
+ });
39
+ if (transportMutationResult.error) {
40
+ return {
41
+ ok: false,
42
+ status: transportMutationResult.status ?? 400,
43
+ error: transportMutationResult.error,
44
+ traceability: buildCanonicalTraceability({
45
+ action: 'cancel',
46
+ decision: 'rejected',
47
+ requestId,
48
+ intentId,
49
+ taskId: input.taskId,
50
+ runId: input.snapshot.run_id,
51
+ manifestPath: input.manifestPath,
52
+ transport: transportMutationResult.partial?.transport ?? null,
53
+ actorId: transportMutationResult.partial?.actorId ?? null,
54
+ actorSource: transportMutationResult.partial?.actorSource ?? null,
55
+ principal: transportMutationResult.partial?.principal ?? null
56
+ })
57
+ };
58
+ }
59
+ return {
60
+ ok: true,
61
+ requestId,
62
+ intentId,
63
+ transportMutation: transportMutationResult.request
64
+ };
65
+ }
@@ -0,0 +1,77 @@
1
+ import { resolveControlActionControllerSequencing } from './controlActionControllerSequencing.js';
2
+ import { normalizeControlActionRequest } from './controlActionPreflight.js';
3
+ export async function handleControlActionRequest(context) {
4
+ const body = await context.readRequestBody();
5
+ const snapshot = context.readInitialSnapshot();
6
+ const normalized = normalizeControlActionRequest({
7
+ body,
8
+ authKind: context.authKind,
9
+ snapshot,
10
+ taskId: context.taskId,
11
+ manifestPath: context.manifestPath
12
+ });
13
+ if (!normalized.ok) {
14
+ context.writeControlError(normalized.status, normalized.error, normalized.traceability);
15
+ return;
16
+ }
17
+ const { action, requestedBy, reason } = normalized.value;
18
+ const tool = readStringValue(body, 'tool') ?? 'delegate.cancel';
19
+ const params = readRecordValue(body, 'params') ?? {};
20
+ const sequencing = await resolveControlActionControllerSequencing({
21
+ body,
22
+ tool,
23
+ params,
24
+ snapshot,
25
+ taskId: context.taskId,
26
+ manifestPath: context.manifestPath,
27
+ normalized: normalized.value,
28
+ isTransportNonceConsumed: context.isTransportNonceConsumed,
29
+ validateConfirmation: context.validateConfirmation,
30
+ persistConfirmations: context.persistConfirmations,
31
+ emitConfirmationResolved: context.emitConfirmationResolved,
32
+ readSnapshot: context.readSnapshot,
33
+ updateAction: context.updateAction
34
+ });
35
+ if (sequencing.kind === 'error') {
36
+ context.writeControlError(sequencing.status, sequencing.error, sequencing.traceability);
37
+ return;
38
+ }
39
+ if (sequencing.plan.persistRequired) {
40
+ await context.persistControlAction({
41
+ action,
42
+ requestId: sequencing.requestId,
43
+ intentId: sequencing.intentId,
44
+ transportMutation: sequencing.transportMutation
45
+ });
46
+ }
47
+ if (sequencing.plan.publishRequired) {
48
+ context.publishRuntime('control.action');
49
+ }
50
+ await context.emitControlActionAuditEvent({
51
+ outcome: sequencing.plan.response.outcome,
52
+ action,
53
+ requestedBy,
54
+ reason: reason ?? null,
55
+ requestId: sequencing.plan.response.requestId,
56
+ intentId: sequencing.plan.response.intentId,
57
+ snapshot: sequencing.plan.snapshot,
58
+ traceability: sequencing.plan.response.traceability
59
+ });
60
+ context.writeControlResponse(sequencing.plan.response);
61
+ }
62
+ function readStringValue(record, ...keys) {
63
+ for (const key of keys) {
64
+ const value = record[key];
65
+ if (typeof value === 'string' && value.trim().length > 0) {
66
+ return value.trim();
67
+ }
68
+ }
69
+ return undefined;
70
+ }
71
+ function readRecordValue(record, key) {
72
+ const value = record[key];
73
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
74
+ return value;
75
+ }
76
+ return undefined;
77
+ }
@@ -0,0 +1,161 @@
1
+ import { resolveCancelConfirmation } from './controlActionCancelConfirmation.js';
2
+ import { executeControlAction, resolveControlActionReplay } from './controlActionExecution.js';
3
+ import { buildExecutionControlActionFinalizationPlan, buildReplayControlActionFinalizationPlan } from './controlActionFinalization.js';
4
+ import { validateTransportMutationPreflight } from './controlActionPreflight.js';
5
+ export async function resolveControlActionControllerSequencing(input) {
6
+ const { normalized } = input;
7
+ let requestId = normalized.requestId;
8
+ let intentId = normalized.intentId;
9
+ let transportMutation = normalized.transportMutation;
10
+ let isTransportMutation = Boolean(transportMutation);
11
+ const transportPreflight = validateTransportMutationPreflight({
12
+ action: normalized.action,
13
+ requestId,
14
+ intentId,
15
+ taskId: input.taskId,
16
+ snapshot: input.snapshot,
17
+ manifestPath: input.manifestPath,
18
+ transportMutation,
19
+ isTransportNonceConsumed: input.isTransportNonceConsumed
20
+ });
21
+ if (!transportPreflight.ok) {
22
+ return {
23
+ kind: 'error',
24
+ status: transportPreflight.status,
25
+ error: transportPreflight.error,
26
+ traceability: transportPreflight.traceability
27
+ };
28
+ }
29
+ if (normalized.action === 'cancel' && !normalized.deferTransportResolutionToConfirmation) {
30
+ const replaySnapshot = input.readSnapshot();
31
+ const replay = resolveControlActionReplay({
32
+ snapshot: replaySnapshot,
33
+ action: normalized.action,
34
+ requestId,
35
+ intentId,
36
+ taskId: input.taskId,
37
+ manifestPath: input.manifestPath,
38
+ transportMutation,
39
+ isTransportMutation
40
+ });
41
+ if (replay.matched) {
42
+ return {
43
+ kind: 'finalize',
44
+ requestId: replay.requestId,
45
+ intentId: replay.intentId,
46
+ transportMutation,
47
+ plan: buildReplayControlActionFinalizationPlan({
48
+ snapshot: replaySnapshot,
49
+ requestId: replay.requestId,
50
+ intentId: replay.intentId,
51
+ traceability: replay.traceability,
52
+ persistRequired: true
53
+ })
54
+ };
55
+ }
56
+ }
57
+ if (normalized.action === 'cancel') {
58
+ if (!normalized.confirmNonce) {
59
+ return { kind: 'error', status: 409, error: 'confirmation_required' };
60
+ }
61
+ const cancelResolution = await resolveCancelConfirmation({
62
+ body: input.body,
63
+ tool: input.tool,
64
+ params: input.params,
65
+ confirmNonce: normalized.confirmNonce,
66
+ currentIntentId: intentId,
67
+ snapshot: input.snapshot,
68
+ taskId: input.taskId,
69
+ manifestPath: input.manifestPath,
70
+ validateNonce: input.validateConfirmation,
71
+ persistConfirmations: input.persistConfirmations,
72
+ emitConfirmationResolved: input.emitConfirmationResolved
73
+ });
74
+ if (!cancelResolution.ok) {
75
+ return {
76
+ kind: 'error',
77
+ status: cancelResolution.status,
78
+ error: cancelResolution.error,
79
+ traceability: cancelResolution.traceability
80
+ };
81
+ }
82
+ requestId = cancelResolution.requestId;
83
+ intentId = cancelResolution.intentId;
84
+ transportMutation = cancelResolution.transportMutation;
85
+ isTransportMutation = Boolean(transportMutation);
86
+ const postConfirmationPreflight = validateTransportMutationPreflight({
87
+ action: normalized.action,
88
+ requestId,
89
+ intentId,
90
+ taskId: input.taskId,
91
+ snapshot: input.snapshot,
92
+ manifestPath: input.manifestPath,
93
+ transportMutation,
94
+ isTransportNonceConsumed: input.isTransportNonceConsumed
95
+ });
96
+ if (!postConfirmationPreflight.ok) {
97
+ return {
98
+ kind: 'error',
99
+ status: postConfirmationPreflight.status,
100
+ error: postConfirmationPreflight.error,
101
+ traceability: postConfirmationPreflight.traceability
102
+ };
103
+ }
104
+ return {
105
+ kind: 'finalize',
106
+ requestId,
107
+ intentId,
108
+ transportMutation,
109
+ plan: buildExecutionControlActionFinalizationPlan({
110
+ action: normalized.action,
111
+ execution: executeControlAction({
112
+ action: normalized.action,
113
+ requestedBy: normalized.requestedBy,
114
+ requestId,
115
+ intentId,
116
+ reason: normalized.reason ?? null,
117
+ taskId: input.taskId,
118
+ manifestPath: input.manifestPath,
119
+ transportMutation,
120
+ isTransportMutation,
121
+ transportIdempotencyWindowMs: postConfirmationPreflight.idempotencyWindowMs,
122
+ readSnapshot: input.readSnapshot,
123
+ updateAction: input.updateAction
124
+ }),
125
+ requestId,
126
+ intentId,
127
+ taskId: input.taskId,
128
+ manifestPath: input.manifestPath,
129
+ transportMutation
130
+ })
131
+ };
132
+ }
133
+ return {
134
+ kind: 'finalize',
135
+ requestId,
136
+ intentId,
137
+ transportMutation,
138
+ plan: buildExecutionControlActionFinalizationPlan({
139
+ action: normalized.action,
140
+ execution: executeControlAction({
141
+ action: normalized.action,
142
+ requestedBy: normalized.requestedBy,
143
+ requestId,
144
+ intentId,
145
+ reason: normalized.reason ?? null,
146
+ taskId: input.taskId,
147
+ manifestPath: input.manifestPath,
148
+ transportMutation,
149
+ isTransportMutation,
150
+ transportIdempotencyWindowMs: transportPreflight.idempotencyWindowMs,
151
+ readSnapshot: input.readSnapshot,
152
+ updateAction: input.updateAction
153
+ }),
154
+ requestId,
155
+ intentId,
156
+ taskId: input.taskId,
157
+ manifestPath: input.manifestPath,
158
+ transportMutation
159
+ })
160
+ };
161
+ }