@kbediako/codex-orchestrator 0.1.38 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/README.md +70 -301
  3. package/bin/codex-orchestrator.js +161 -0
  4. package/codex.orchestrator.json +149 -13
  5. package/dist/bin/codex-orchestrator.js +795 -1154
  6. package/dist/orchestrator/src/cli/adapters/CommandPlanner.js +22 -4
  7. package/dist/orchestrator/src/cli/adapters/CommandReviewer.js +3 -3
  8. package/dist/orchestrator/src/cli/adapters/CommandTester.js +2 -2
  9. package/dist/orchestrator/src/cli/adapters/cloudFailureDiagnostics.js +183 -11
  10. package/dist/orchestrator/src/cli/coStatusAttachCliShell.js +402 -0
  11. package/dist/orchestrator/src/cli/coStatusCliShell.js +429 -0
  12. package/dist/orchestrator/src/cli/coStatusOperatorAutopilotCliShell.js +120 -0
  13. package/dist/orchestrator/src/cli/codexCliShell.js +72 -0
  14. package/dist/orchestrator/src/cli/codexDefaultsSetup.js +49 -11
  15. package/dist/orchestrator/src/cli/config/delegationConfig.js +317 -5
  16. package/dist/orchestrator/src/cli/config/repoConfigPolicy.js +2 -3
  17. package/dist/orchestrator/src/cli/config/userConfig.js +28 -13
  18. package/dist/orchestrator/src/cli/control/authenticatedControlRouteGate.js +69 -0
  19. package/dist/orchestrator/src/cli/control/authenticatedRouteComposition.js +267 -0
  20. package/dist/orchestrator/src/cli/control/authenticatedRouteController.js +5 -0
  21. package/dist/orchestrator/src/cli/control/authenticatedRouteDispatcher.js +41 -0
  22. package/dist/orchestrator/src/cli/control/compatibilityIssuePresenter.js +1035 -0
  23. package/dist/orchestrator/src/cli/control/confirmationApproveController.js +62 -0
  24. package/dist/orchestrator/src/cli/control/confirmationCreateController.js +69 -0
  25. package/dist/orchestrator/src/cli/control/confirmationIssueConsumeController.js +43 -0
  26. package/dist/orchestrator/src/cli/control/confirmationListController.js +22 -0
  27. package/dist/orchestrator/src/cli/control/confirmationValidateController.js +58 -0
  28. package/dist/orchestrator/src/cli/control/confirmations.js +25 -3
  29. package/dist/orchestrator/src/cli/control/controlActionCancelConfirmation.js +65 -0
  30. package/dist/orchestrator/src/cli/control/controlActionController.js +77 -0
  31. package/dist/orchestrator/src/cli/control/controlActionControllerSequencing.js +161 -0
  32. package/dist/orchestrator/src/cli/control/controlActionExecution.js +142 -0
  33. package/dist/orchestrator/src/cli/control/controlActionFinalization.js +43 -0
  34. package/dist/orchestrator/src/cli/control/controlActionOutcome.js +60 -0
  35. package/dist/orchestrator/src/cli/control/controlActionPreflight.js +476 -0
  36. package/dist/orchestrator/src/cli/control/controlAuthenticatedRouteHandoff.js +57 -0
  37. package/dist/orchestrator/src/cli/control/controlBootstrapAssembly.js +39 -0
  38. package/dist/orchestrator/src/cli/control/controlBootstrapMetadataPersistence.js +16 -0
  39. package/dist/orchestrator/src/cli/control/controlEventTransport.js +49 -0
  40. package/dist/orchestrator/src/cli/control/controlExpiryLifecycle.js +102 -0
  41. package/dist/orchestrator/src/cli/control/controlHostOwnership.js +480 -0
  42. package/dist/orchestrator/src/cli/control/controlHostSupervision.js +608 -0
  43. package/dist/orchestrator/src/cli/control/controlOversightFacade.js +8 -0
  44. package/dist/orchestrator/src/cli/control/controlOversightReadContract.js +1 -0
  45. package/dist/orchestrator/src/cli/control/controlOversightReadService.js +16 -0
  46. package/dist/orchestrator/src/cli/control/controlOversightUpdateContract.js +1 -0
  47. package/dist/orchestrator/src/cli/control/controlPersistenceFiles.js +6 -0
  48. package/dist/orchestrator/src/cli/control/controlQuestionChildResolution.js +18 -0
  49. package/dist/orchestrator/src/cli/control/controlRequestContext.js +42 -0
  50. package/dist/orchestrator/src/cli/control/controlRequestController.js +9 -0
  51. package/dist/orchestrator/src/cli/control/controlRequestPredispatch.js +17 -0
  52. package/dist/orchestrator/src/cli/control/controlRequestRouteDispatch.js +44 -0
  53. package/dist/orchestrator/src/cli/control/controlRuntime.js +992 -0
  54. package/dist/orchestrator/src/cli/control/controlServer.js +23 -1456
  55. package/dist/orchestrator/src/cli/control/controlServerAuditAndErrorHelpers.js +115 -0
  56. package/dist/orchestrator/src/cli/control/controlServerAuthenticatedRouteBranch.js +29 -0
  57. package/dist/orchestrator/src/cli/control/controlServerBootstrapLifecycle.js +30 -0
  58. package/dist/orchestrator/src/cli/control/controlServerBootstrapStartSequence.js +21 -0
  59. package/dist/orchestrator/src/cli/control/controlServerOwnedRuntimeLifecycle.js +67 -0
  60. package/dist/orchestrator/src/cli/control/controlServerPublicLifecycle.js +756 -0
  61. package/dist/orchestrator/src/cli/control/controlServerPublicRouteHelpers.js +86 -0
  62. package/dist/orchestrator/src/cli/control/controlServerReadyInstanceLifecycle.js +25 -0
  63. package/dist/orchestrator/src/cli/control/controlServerReadyInstanceStartup.js +18 -0
  64. package/dist/orchestrator/src/cli/control/controlServerRequestBodyHelpers.js +37 -0
  65. package/dist/orchestrator/src/cli/control/controlServerRequestShell.js +40 -0
  66. package/dist/orchestrator/src/cli/control/controlServerRequestShellBinding.js +17 -0
  67. package/dist/orchestrator/src/cli/control/controlServerSeedLoading.js +27 -0
  68. package/dist/orchestrator/src/cli/control/controlServerSeededRuntimeAssembly.js +186 -0
  69. package/dist/orchestrator/src/cli/control/controlServerStartupInputPreparation.js +31 -0
  70. package/dist/orchestrator/src/cli/control/controlServerStartupSequence.js +49 -0
  71. package/dist/orchestrator/src/cli/control/controlState.js +233 -2
  72. package/dist/orchestrator/src/cli/control/controlStatusDashboard.js +1899 -0
  73. package/dist/orchestrator/src/cli/control/controlTelegramBridgeBootstrapLifecycle.js +22 -0
  74. package/dist/orchestrator/src/cli/control/controlTelegramBridgeLifecycle.js +67 -0
  75. package/dist/orchestrator/src/cli/control/controlTelegramBridgeOversightFacadeFactory.js +8 -0
  76. package/dist/orchestrator/src/cli/control/controlTelegramCommandController.js +49 -0
  77. package/dist/orchestrator/src/cli/control/controlTelegramDispatchRead.js +40 -0
  78. package/dist/orchestrator/src/cli/control/controlTelegramPollingController.js +89 -0
  79. package/dist/orchestrator/src/cli/control/controlTelegramProjectionNotificationController.js +29 -0
  80. package/dist/orchestrator/src/cli/control/controlTelegramPushState.js +63 -0
  81. package/dist/orchestrator/src/cli/control/controlTelegramQuestionRead.js +13 -0
  82. package/dist/orchestrator/src/cli/control/controlTelegramReadController.js +216 -0
  83. package/dist/orchestrator/src/cli/control/controlTelegramUpdateHandler.js +63 -0
  84. package/dist/orchestrator/src/cli/control/controlWatcher.js +73 -5
  85. package/dist/orchestrator/src/cli/control/delegationRegisterController.js +35 -0
  86. package/dist/orchestrator/src/cli/control/dynamicToolBridgePolicy.js +139 -0
  87. package/dist/orchestrator/src/cli/control/eventsSseController.js +12 -0
  88. package/dist/orchestrator/src/cli/control/linearBudgetState.js +1789 -0
  89. package/dist/orchestrator/src/cli/control/linearDispatchSource.js +1137 -0
  90. package/dist/orchestrator/src/cli/control/linearGraphqlClient.js +150 -0
  91. package/dist/orchestrator/src/cli/control/linearRateLimit.js +102 -0
  92. package/dist/orchestrator/src/cli/control/linearWebhookController.js +499 -0
  93. package/dist/orchestrator/src/cli/control/liveLinearAdvisoryRuntime.js +70 -0
  94. package/dist/orchestrator/src/cli/control/observabilityApiController.js +173 -0
  95. package/dist/orchestrator/src/cli/control/observabilityReadModel.js +500 -0
  96. package/dist/orchestrator/src/cli/control/observabilitySurface.js +284 -0
  97. package/dist/orchestrator/src/cli/control/observabilityUpdateNotifier.js +22 -0
  98. package/dist/orchestrator/src/cli/control/operatorDashboardPresenter.js +252 -0
  99. package/dist/orchestrator/src/cli/control/providerAgentCapacity.js +70 -0
  100. package/dist/orchestrator/src/cli/control/providerControlHostFreshnessGauge.js +1068 -0
  101. package/dist/orchestrator/src/cli/control/providerIntakeState.js +473 -0
  102. package/dist/orchestrator/src/cli/control/providerIssueHandoff.js +6811 -0
  103. package/dist/orchestrator/src/cli/control/providerIssueObservability.js +1348 -0
  104. package/dist/orchestrator/src/cli/control/providerIssueRetryQueue.js +84 -0
  105. package/dist/orchestrator/src/cli/control/providerLinearRuntimeProof.js +588 -0
  106. package/dist/orchestrator/src/cli/control/providerLinearScreenshotProof.js +473 -0
  107. package/dist/orchestrator/src/cli/control/providerLinearWorkerTruth.js +383 -0
  108. package/dist/orchestrator/src/cli/control/providerLinearWorkflowAudit.js +254 -0
  109. package/dist/orchestrator/src/cli/control/providerLinearWorkflowFacade.js +5573 -0
  110. package/dist/orchestrator/src/cli/control/providerLinearWorkflowStates.js +115 -0
  111. package/dist/orchestrator/src/cli/control/providerMergeCloseout.js +1868 -0
  112. package/dist/orchestrator/src/cli/control/providerOperatorAutopilot.js +1580 -0
  113. package/dist/orchestrator/src/cli/control/providerOperatorAutopilotLifecycle.js +154 -0
  114. package/dist/orchestrator/src/cli/control/providerOperatorAutopilotLocalRolloutExecution.js +1006 -0
  115. package/dist/orchestrator/src/cli/control/providerPollingHealth.js +435 -0
  116. package/dist/orchestrator/src/cli/control/providerTerminalCleanup.js +516 -0
  117. package/dist/orchestrator/src/cli/control/providerWorkerHosts.js +191 -0
  118. package/dist/orchestrator/src/cli/control/providerWorkflowConfigStore.js +515 -0
  119. package/dist/orchestrator/src/cli/control/questionChildResolutionAdapter.js +361 -0
  120. package/dist/orchestrator/src/cli/control/questionQueueController.js +181 -0
  121. package/dist/orchestrator/src/cli/control/questionReadRetryDeduplication.js +9 -0
  122. package/dist/orchestrator/src/cli/control/questionReadSequence.js +10 -0
  123. package/dist/orchestrator/src/cli/control/securityViolationController.js +27 -0
  124. package/dist/orchestrator/src/cli/control/selectedRunProjection.js +1838 -0
  125. package/dist/orchestrator/src/cli/control/telegramOversightApiClient.js +48 -0
  126. package/dist/orchestrator/src/cli/control/telegramOversightBridge.js +180 -0
  127. package/dist/orchestrator/src/cli/control/telegramOversightBridgeProjectionDeliveryQueue.js +25 -0
  128. package/dist/orchestrator/src/cli/control/telegramOversightBridgeRuntimeLifecycle.js +45 -0
  129. package/dist/orchestrator/src/cli/control/telegramOversightBridgeStateStore.js +77 -0
  130. package/dist/orchestrator/src/cli/control/telegramOversightControlActionApiClient.js +45 -0
  131. package/dist/orchestrator/src/cli/control/trackerDispatchPilot.js +439 -0
  132. package/dist/orchestrator/src/cli/control/uiDataController.js +34 -0
  133. package/dist/orchestrator/src/cli/control/uiSessionController.js +100 -0
  134. package/dist/orchestrator/src/cli/controlHostCliShell.js +860 -0
  135. package/dist/orchestrator/src/cli/controlHostFreshnessGaugeCliShell.js +129 -0
  136. package/dist/orchestrator/src/cli/controlHostSupervisionCliShell.js +2127 -0
  137. package/dist/orchestrator/src/cli/delegationCliShell.js +62 -0
  138. package/dist/orchestrator/src/cli/delegationServer.js +567 -678
  139. package/dist/orchestrator/src/cli/delegationServerCliShell.js +52 -0
  140. package/dist/orchestrator/src/cli/delegationServerQuestionFlowShell.js +228 -0
  141. package/dist/orchestrator/src/cli/delegationServerToolDispatchShell.js +411 -0
  142. package/dist/orchestrator/src/cli/delegationServerTransport.js +274 -0
  143. package/dist/orchestrator/src/cli/delegationSetup.js +51 -171
  144. package/dist/orchestrator/src/cli/devtoolsCliShell.js +34 -0
  145. package/dist/orchestrator/src/cli/doctor.js +542 -122
  146. package/dist/orchestrator/src/cli/doctorCliRequestShell.js +72 -0
  147. package/dist/orchestrator/src/cli/doctorCliShell.js +138 -0
  148. package/dist/orchestrator/src/cli/doctorUsage.js +119 -15
  149. package/dist/orchestrator/src/cli/exec/experience.js +16 -2
  150. package/dist/orchestrator/src/cli/exec/summary.js +3 -0
  151. package/dist/orchestrator/src/cli/execCliShell.js +51 -0
  152. package/dist/orchestrator/src/cli/flowCliRequestShell.js +44 -0
  153. package/dist/orchestrator/src/cli/flowCliShell.js +239 -0
  154. package/dist/orchestrator/src/cli/frontendTestCliRequestShell.js +80 -0
  155. package/dist/orchestrator/src/cli/frontendTestCliShell.js +41 -0
  156. package/dist/orchestrator/src/cli/init.js +1 -0
  157. package/dist/orchestrator/src/cli/initCliShell.js +50 -0
  158. package/dist/orchestrator/src/cli/linearCliShell.js +1200 -0
  159. package/dist/orchestrator/src/cli/mcpEnableCliShell.js +132 -0
  160. package/dist/orchestrator/src/cli/metrics/metricsAggregator.js +3 -2
  161. package/dist/orchestrator/src/cli/metrics/metricsRecorder.js +56 -0
  162. package/dist/orchestrator/src/cli/orchestrator.js +66 -1376
  163. package/dist/orchestrator/src/cli/planCliShell.js +19 -0
  164. package/dist/orchestrator/src/cli/prCliShell.js +41 -0
  165. package/dist/orchestrator/src/cli/providerLinearChildLanePhaseContract.js +204 -0
  166. package/dist/orchestrator/src/cli/providerLinearChildLaneRunner.js +1772 -0
  167. package/dist/orchestrator/src/cli/providerLinearChildLaneShell.js +2420 -0
  168. package/dist/orchestrator/src/cli/providerLinearChildStreamShell.js +385 -0
  169. package/dist/orchestrator/src/cli/providerLinearWorkerRunner.js +5738 -0
  170. package/dist/orchestrator/src/cli/resumeCliShell.js +14 -0
  171. package/dist/orchestrator/src/cli/reviewCliLaunchShell.js +72 -0
  172. package/dist/orchestrator/src/cli/rlm/alignment.js +3 -3
  173. package/dist/orchestrator/src/cli/rlm/context.js +94 -7
  174. package/dist/orchestrator/src/cli/rlm/rlmCodexRuntimeShell.js +546 -0
  175. package/dist/orchestrator/src/cli/rlm/symbolic.js +4 -2
  176. package/dist/orchestrator/src/cli/rlmCliRequestShell.js +42 -0
  177. package/dist/orchestrator/src/cli/rlmCompletionCliShell.js +46 -0
  178. package/dist/orchestrator/src/cli/rlmLaunchCliShell.js +51 -0
  179. package/dist/orchestrator/src/cli/rlmRunner.js +83 -523
  180. package/dist/orchestrator/src/cli/run/blockMemory.js +500 -0
  181. package/dist/orchestrator/src/cli/run/manifest.js +410 -73
  182. package/dist/orchestrator/src/cli/run/manifestPersister.js +45 -14
  183. package/dist/orchestrator/src/cli/run/runMemoryController.js +216 -0
  184. package/dist/orchestrator/src/cli/run/source0.js +690 -0
  185. package/dist/orchestrator/src/cli/run/workspacePath.js +101 -0
  186. package/dist/orchestrator/src/cli/runtime/mode.js +2 -1
  187. package/dist/orchestrator/src/cli/runtime/provider.js +39 -2
  188. package/dist/orchestrator/src/cli/selfCheckCliShell.js +12 -0
  189. package/dist/orchestrator/src/cli/services/commandRunner.js +667 -18
  190. package/dist/orchestrator/src/cli/services/execRuntime.js +66 -1
  191. package/dist/orchestrator/src/cli/services/orchestratorAutoScoutEvidenceRecorder.js +71 -0
  192. package/dist/orchestrator/src/cli/services/orchestratorCloudBranchResolution.js +8 -0
  193. package/dist/orchestrator/src/cli/services/orchestratorCloudEnvironmentResolution.js +22 -0
  194. package/dist/orchestrator/src/cli/services/orchestratorCloudExecutionLifecycleShell.js +39 -0
  195. package/dist/orchestrator/src/cli/services/orchestratorCloudPromptBuilder.js +37 -0
  196. package/dist/orchestrator/src/cli/services/orchestratorCloudRouteFallbackContract.js +45 -0
  197. package/dist/orchestrator/src/cli/services/orchestratorCloudRouteShell.js +36 -0
  198. package/dist/orchestrator/src/cli/services/orchestratorCloudTargetExecutor.js +277 -0
  199. package/dist/orchestrator/src/cli/services/orchestratorControlPlaneLifecycle.js +98 -0
  200. package/dist/orchestrator/src/cli/services/orchestratorControlPlaneLifecycleShell.js +54 -0
  201. package/dist/orchestrator/src/cli/services/orchestratorExecutionLifecycle.js +112 -0
  202. package/dist/orchestrator/src/cli/services/orchestratorExecutionModePolicy.js +27 -0
  203. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteAdapterShell.js +59 -0
  204. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteDecisionShell.js +57 -0
  205. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteState.js +21 -0
  206. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouter.js +2 -0
  207. package/dist/orchestrator/src/cli/services/orchestratorLocalPipelineExecutor.js +149 -0
  208. package/dist/orchestrator/src/cli/services/orchestratorLocalRouteShell.js +63 -0
  209. package/dist/orchestrator/src/cli/services/orchestratorPlanShell.js +54 -0
  210. package/dist/orchestrator/src/cli/services/orchestratorPlanTargetTracker.js +16 -0
  211. package/dist/orchestrator/src/cli/services/orchestratorResumePreparationShell.js +84 -0
  212. package/dist/orchestrator/src/cli/services/orchestratorResumeTokenValidation.js +15 -0
  213. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleCompletion.js +31 -0
  214. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleExecutionRegistration.js +37 -0
  215. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleOrchestrationShell.js +83 -0
  216. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleTaskManagerShell.js +37 -0
  217. package/dist/orchestrator/src/cli/services/orchestratorRuntimeManifestMutation.js +20 -0
  218. package/dist/orchestrator/src/cli/services/orchestratorStartPreparationShell.js +56 -0
  219. package/dist/orchestrator/src/cli/services/orchestratorStatusShell.js +70 -0
  220. package/dist/orchestrator/src/cli/services/pipelineResolver.js +7 -3
  221. package/dist/orchestrator/src/cli/services/plannerMemory.js +119 -0
  222. package/dist/orchestrator/src/cli/services/runPreparation.js +7 -3
  223. package/dist/orchestrator/src/cli/services/runSummaryWriter.js +9 -0
  224. package/dist/orchestrator/src/cli/setupBootstrapShell.js +114 -0
  225. package/dist/orchestrator/src/cli/setupCliShell.js +51 -0
  226. package/dist/orchestrator/src/cli/skillsCliShell.js +56 -0
  227. package/dist/orchestrator/src/cli/startCliRequestShell.js +53 -0
  228. package/dist/orchestrator/src/cli/startCliShell.js +68 -0
  229. package/dist/orchestrator/src/cli/statusCliShell.js +22 -0
  230. package/dist/orchestrator/src/cli/utils/authProvenanceFingerprint.js +27 -0
  231. package/dist/orchestrator/src/cli/utils/cloudPreflight.js +83 -1
  232. package/dist/orchestrator/src/cli/utils/delegationConfigParser.js +250 -0
  233. package/dist/orchestrator/src/cli/utils/delegationMcpHealth.js +1382 -0
  234. package/dist/orchestrator/src/cli/utils/devtools.js +2 -54
  235. package/dist/orchestrator/src/cli/utils/mcpServerEntry.js +53 -0
  236. package/dist/orchestrator/src/cli/utils/packageProgramResolver.js +151 -0
  237. package/dist/orchestrator/src/cli/utils/providerOverrideEnv.js +71 -0
  238. package/dist/orchestrator/src/cli/utils/trailingJsonObject.js +59 -0
  239. package/dist/orchestrator/src/learning/crystalizer.js +2 -2
  240. package/dist/orchestrator/src/persistence/ExperienceStore.js +233 -49
  241. package/dist/orchestrator/src/persistence/TaskStateStore.js +6 -6
  242. package/dist/orchestrator/src/persistence/lockFile.js +70 -4
  243. package/dist/orchestrator/src/persistence/sanitizeIdentifier.js +39 -0
  244. package/dist/orchestrator/src/sync/createCloudSyncWorker.js +3 -2
  245. package/dist/orchestrator/src/utils/atomicWrite.js +17 -2
  246. package/dist/packages/orchestrator/src/exec/unified-exec.js +99 -6
  247. package/dist/packages/orchestrator/src/instructions/promptPacks.js +150 -19
  248. package/dist/packages/sdk-node/src/orchestrator.js +137 -13
  249. package/dist/packages/shared/config/designConfig.js +8 -1
  250. package/dist/packages/shared/streams/stdio.js +1 -1
  251. package/dist/scripts/design/pipeline/permit.js +15 -0
  252. package/dist/scripts/lib/docs-catalog.js +365 -0
  253. package/dist/scripts/lib/docs-helpers.js +87 -5
  254. package/dist/scripts/lib/pr-watch-merge.js +1088 -80
  255. package/dist/scripts/lib/provider-run-contract.js +26 -0
  256. package/dist/scripts/lib/review-command-intent-classification.js +532 -0
  257. package/dist/scripts/lib/review-command-probe-classification.js +385 -0
  258. package/dist/scripts/lib/review-execution-boundary-preflight.js +279 -0
  259. package/dist/scripts/lib/review-execution-runtime.js +753 -0
  260. package/dist/scripts/lib/review-execution-state.js +1144 -0
  261. package/dist/scripts/lib/review-execution-telemetry.js +215 -0
  262. package/dist/scripts/lib/review-inspection-target-parsing.js +78 -0
  263. package/dist/scripts/lib/review-launch-attempt.js +601 -0
  264. package/dist/scripts/lib/review-meta-surface-boundary-analysis.js +300 -0
  265. package/dist/scripts/lib/review-meta-surface-normalization.js +746 -0
  266. package/dist/scripts/lib/review-non-interactive-handoff.js +61 -0
  267. package/dist/scripts/lib/review-prompt-context.js +376 -0
  268. package/dist/scripts/lib/review-scope-advisory.js +286 -0
  269. package/dist/scripts/lib/review-scope-paths.js +123 -0
  270. package/dist/scripts/lib/review-shell-command-parser.js +389 -0
  271. package/dist/scripts/lib/review-shell-env-interpreter.js +340 -0
  272. package/dist/scripts/lib/run-manifests.js +192 -36
  273. package/dist/scripts/lib/spark-policy-classifier.js +593 -0
  274. package/dist/scripts/run-review.js +507 -1777
  275. package/docs/public/downstream-setup.md +106 -0
  276. package/docs/public/provider-onboarding.md +173 -0
  277. package/package.json +20 -10
  278. package/plugins/codex-orchestrator/.codex-plugin/plugin.json +30 -0
  279. package/plugins/codex-orchestrator/.mcp.json +13 -0
  280. package/plugins/codex-orchestrator/launcher.mjs +359 -0
  281. package/schemas/manifest.json +394 -0
  282. package/skills/collab-subagents-first/SKILL.md +1 -1
  283. package/skills/delegation-usage/DELEGATION_GUIDE.md +24 -11
  284. package/skills/delegation-usage/SKILL.md +19 -13
  285. package/skills/land/SKILL.md +77 -0
  286. package/skills/linear/SKILL.md +255 -0
  287. package/skills/release/SKILL.md +47 -3
  288. package/skills/standalone-review/SKILL.md +6 -1
  289. package/templates/README.md +4 -2
  290. package/templates/codex/.codex/agents/awaiter-high.toml +2 -2
  291. package/templates/codex/.codex/agents/worker-complex.toml +1 -1
  292. package/templates/codex/.codex/config.toml +3 -4
  293. package/templates/codex/.codex/providers/README.md +13 -0
  294. package/templates/codex/.codex/providers/control.example.json +18 -0
  295. package/templates/codex/.codex/providers/provider.env.example +15 -0
  296. package/templates/codex/AGENTS.md +12 -7
  297. package/templates/codex/mcp-client.json +5 -1
  298. package/docs/README.md +0 -310
  299. package/docs/assets/setup.gif +0 -0
@@ -0,0 +1,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
+ }