@kbediako/codex-orchestrator 0.1.37 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/README.md +73 -291
  3. package/bin/codex-orchestrator.js +161 -0
  4. package/codex.orchestrator.json +149 -13
  5. package/dist/bin/codex-orchestrator.js +795 -1154
  6. package/dist/orchestrator/src/cli/adapters/CommandPlanner.js +22 -4
  7. package/dist/orchestrator/src/cli/adapters/CommandReviewer.js +3 -3
  8. package/dist/orchestrator/src/cli/adapters/CommandTester.js +2 -2
  9. package/dist/orchestrator/src/cli/adapters/cloudFailureDiagnostics.js +183 -11
  10. package/dist/orchestrator/src/cli/coStatusAttachCliShell.js +402 -0
  11. package/dist/orchestrator/src/cli/coStatusCliShell.js +429 -0
  12. package/dist/orchestrator/src/cli/coStatusOperatorAutopilotCliShell.js +120 -0
  13. package/dist/orchestrator/src/cli/codexCliShell.js +72 -0
  14. package/dist/orchestrator/src/cli/codexDefaultsSetup.js +49 -11
  15. package/dist/orchestrator/src/cli/config/delegationConfig.js +317 -5
  16. package/dist/orchestrator/src/cli/config/repoConfigPolicy.js +2 -3
  17. package/dist/orchestrator/src/cli/config/userConfig.js +28 -13
  18. package/dist/orchestrator/src/cli/control/authenticatedControlRouteGate.js +69 -0
  19. package/dist/orchestrator/src/cli/control/authenticatedRouteComposition.js +267 -0
  20. package/dist/orchestrator/src/cli/control/authenticatedRouteController.js +5 -0
  21. package/dist/orchestrator/src/cli/control/authenticatedRouteDispatcher.js +41 -0
  22. package/dist/orchestrator/src/cli/control/compatibilityIssuePresenter.js +1035 -0
  23. package/dist/orchestrator/src/cli/control/confirmationApproveController.js +62 -0
  24. package/dist/orchestrator/src/cli/control/confirmationCreateController.js +69 -0
  25. package/dist/orchestrator/src/cli/control/confirmationIssueConsumeController.js +43 -0
  26. package/dist/orchestrator/src/cli/control/confirmationListController.js +22 -0
  27. package/dist/orchestrator/src/cli/control/confirmationValidateController.js +58 -0
  28. package/dist/orchestrator/src/cli/control/confirmations.js +25 -3
  29. package/dist/orchestrator/src/cli/control/controlActionCancelConfirmation.js +65 -0
  30. package/dist/orchestrator/src/cli/control/controlActionController.js +77 -0
  31. package/dist/orchestrator/src/cli/control/controlActionControllerSequencing.js +161 -0
  32. package/dist/orchestrator/src/cli/control/controlActionExecution.js +142 -0
  33. package/dist/orchestrator/src/cli/control/controlActionFinalization.js +43 -0
  34. package/dist/orchestrator/src/cli/control/controlActionOutcome.js +60 -0
  35. package/dist/orchestrator/src/cli/control/controlActionPreflight.js +476 -0
  36. package/dist/orchestrator/src/cli/control/controlAuthenticatedRouteHandoff.js +57 -0
  37. package/dist/orchestrator/src/cli/control/controlBootstrapAssembly.js +39 -0
  38. package/dist/orchestrator/src/cli/control/controlBootstrapMetadataPersistence.js +16 -0
  39. package/dist/orchestrator/src/cli/control/controlEventTransport.js +49 -0
  40. package/dist/orchestrator/src/cli/control/controlExpiryLifecycle.js +102 -0
  41. package/dist/orchestrator/src/cli/control/controlHostOwnership.js +480 -0
  42. package/dist/orchestrator/src/cli/control/controlHostSupervision.js +608 -0
  43. package/dist/orchestrator/src/cli/control/controlOversightFacade.js +8 -0
  44. package/dist/orchestrator/src/cli/control/controlOversightReadContract.js +1 -0
  45. package/dist/orchestrator/src/cli/control/controlOversightReadService.js +16 -0
  46. package/dist/orchestrator/src/cli/control/controlOversightUpdateContract.js +1 -0
  47. package/dist/orchestrator/src/cli/control/controlPersistenceFiles.js +6 -0
  48. package/dist/orchestrator/src/cli/control/controlQuestionChildResolution.js +18 -0
  49. package/dist/orchestrator/src/cli/control/controlRequestContext.js +42 -0
  50. package/dist/orchestrator/src/cli/control/controlRequestController.js +9 -0
  51. package/dist/orchestrator/src/cli/control/controlRequestPredispatch.js +17 -0
  52. package/dist/orchestrator/src/cli/control/controlRequestRouteDispatch.js +44 -0
  53. package/dist/orchestrator/src/cli/control/controlRuntime.js +992 -0
  54. package/dist/orchestrator/src/cli/control/controlServer.js +23 -1456
  55. package/dist/orchestrator/src/cli/control/controlServerAuditAndErrorHelpers.js +115 -0
  56. package/dist/orchestrator/src/cli/control/controlServerAuthenticatedRouteBranch.js +29 -0
  57. package/dist/orchestrator/src/cli/control/controlServerBootstrapLifecycle.js +30 -0
  58. package/dist/orchestrator/src/cli/control/controlServerBootstrapStartSequence.js +21 -0
  59. package/dist/orchestrator/src/cli/control/controlServerOwnedRuntimeLifecycle.js +67 -0
  60. package/dist/orchestrator/src/cli/control/controlServerPublicLifecycle.js +756 -0
  61. package/dist/orchestrator/src/cli/control/controlServerPublicRouteHelpers.js +86 -0
  62. package/dist/orchestrator/src/cli/control/controlServerReadyInstanceLifecycle.js +25 -0
  63. package/dist/orchestrator/src/cli/control/controlServerReadyInstanceStartup.js +18 -0
  64. package/dist/orchestrator/src/cli/control/controlServerRequestBodyHelpers.js +37 -0
  65. package/dist/orchestrator/src/cli/control/controlServerRequestShell.js +40 -0
  66. package/dist/orchestrator/src/cli/control/controlServerRequestShellBinding.js +17 -0
  67. package/dist/orchestrator/src/cli/control/controlServerSeedLoading.js +27 -0
  68. package/dist/orchestrator/src/cli/control/controlServerSeededRuntimeAssembly.js +186 -0
  69. package/dist/orchestrator/src/cli/control/controlServerStartupInputPreparation.js +31 -0
  70. package/dist/orchestrator/src/cli/control/controlServerStartupSequence.js +49 -0
  71. package/dist/orchestrator/src/cli/control/controlState.js +233 -2
  72. package/dist/orchestrator/src/cli/control/controlStatusDashboard.js +1899 -0
  73. package/dist/orchestrator/src/cli/control/controlTelegramBridgeBootstrapLifecycle.js +22 -0
  74. package/dist/orchestrator/src/cli/control/controlTelegramBridgeLifecycle.js +67 -0
  75. package/dist/orchestrator/src/cli/control/controlTelegramBridgeOversightFacadeFactory.js +8 -0
  76. package/dist/orchestrator/src/cli/control/controlTelegramCommandController.js +49 -0
  77. package/dist/orchestrator/src/cli/control/controlTelegramDispatchRead.js +40 -0
  78. package/dist/orchestrator/src/cli/control/controlTelegramPollingController.js +89 -0
  79. package/dist/orchestrator/src/cli/control/controlTelegramProjectionNotificationController.js +29 -0
  80. package/dist/orchestrator/src/cli/control/controlTelegramPushState.js +63 -0
  81. package/dist/orchestrator/src/cli/control/controlTelegramQuestionRead.js +13 -0
  82. package/dist/orchestrator/src/cli/control/controlTelegramReadController.js +216 -0
  83. package/dist/orchestrator/src/cli/control/controlTelegramUpdateHandler.js +63 -0
  84. package/dist/orchestrator/src/cli/control/controlWatcher.js +73 -5
  85. package/dist/orchestrator/src/cli/control/delegationRegisterController.js +35 -0
  86. package/dist/orchestrator/src/cli/control/dynamicToolBridgePolicy.js +139 -0
  87. package/dist/orchestrator/src/cli/control/eventsSseController.js +12 -0
  88. package/dist/orchestrator/src/cli/control/linearBudgetState.js +1789 -0
  89. package/dist/orchestrator/src/cli/control/linearDispatchSource.js +1137 -0
  90. package/dist/orchestrator/src/cli/control/linearGraphqlClient.js +150 -0
  91. package/dist/orchestrator/src/cli/control/linearRateLimit.js +102 -0
  92. package/dist/orchestrator/src/cli/control/linearWebhookController.js +499 -0
  93. package/dist/orchestrator/src/cli/control/liveLinearAdvisoryRuntime.js +70 -0
  94. package/dist/orchestrator/src/cli/control/observabilityApiController.js +173 -0
  95. package/dist/orchestrator/src/cli/control/observabilityReadModel.js +500 -0
  96. package/dist/orchestrator/src/cli/control/observabilitySurface.js +284 -0
  97. package/dist/orchestrator/src/cli/control/observabilityUpdateNotifier.js +22 -0
  98. package/dist/orchestrator/src/cli/control/operatorDashboardPresenter.js +252 -0
  99. package/dist/orchestrator/src/cli/control/providerAgentCapacity.js +70 -0
  100. package/dist/orchestrator/src/cli/control/providerControlHostFreshnessGauge.js +1068 -0
  101. package/dist/orchestrator/src/cli/control/providerIntakeState.js +473 -0
  102. package/dist/orchestrator/src/cli/control/providerIssueHandoff.js +6811 -0
  103. package/dist/orchestrator/src/cli/control/providerIssueObservability.js +1348 -0
  104. package/dist/orchestrator/src/cli/control/providerIssueRetryQueue.js +84 -0
  105. package/dist/orchestrator/src/cli/control/providerLinearRuntimeProof.js +588 -0
  106. package/dist/orchestrator/src/cli/control/providerLinearScreenshotProof.js +473 -0
  107. package/dist/orchestrator/src/cli/control/providerLinearWorkerTruth.js +383 -0
  108. package/dist/orchestrator/src/cli/control/providerLinearWorkflowAudit.js +254 -0
  109. package/dist/orchestrator/src/cli/control/providerLinearWorkflowFacade.js +5573 -0
  110. package/dist/orchestrator/src/cli/control/providerLinearWorkflowStates.js +115 -0
  111. package/dist/orchestrator/src/cli/control/providerMergeCloseout.js +1868 -0
  112. package/dist/orchestrator/src/cli/control/providerOperatorAutopilot.js +1580 -0
  113. package/dist/orchestrator/src/cli/control/providerOperatorAutopilotLifecycle.js +154 -0
  114. package/dist/orchestrator/src/cli/control/providerOperatorAutopilotLocalRolloutExecution.js +1006 -0
  115. package/dist/orchestrator/src/cli/control/providerPollingHealth.js +435 -0
  116. package/dist/orchestrator/src/cli/control/providerTerminalCleanup.js +516 -0
  117. package/dist/orchestrator/src/cli/control/providerWorkerHosts.js +191 -0
  118. package/dist/orchestrator/src/cli/control/providerWorkflowConfigStore.js +515 -0
  119. package/dist/orchestrator/src/cli/control/questionChildResolutionAdapter.js +361 -0
  120. package/dist/orchestrator/src/cli/control/questionQueueController.js +181 -0
  121. package/dist/orchestrator/src/cli/control/questionReadRetryDeduplication.js +9 -0
  122. package/dist/orchestrator/src/cli/control/questionReadSequence.js +10 -0
  123. package/dist/orchestrator/src/cli/control/securityViolationController.js +27 -0
  124. package/dist/orchestrator/src/cli/control/selectedRunProjection.js +1838 -0
  125. package/dist/orchestrator/src/cli/control/telegramOversightApiClient.js +48 -0
  126. package/dist/orchestrator/src/cli/control/telegramOversightBridge.js +180 -0
  127. package/dist/orchestrator/src/cli/control/telegramOversightBridgeProjectionDeliveryQueue.js +25 -0
  128. package/dist/orchestrator/src/cli/control/telegramOversightBridgeRuntimeLifecycle.js +45 -0
  129. package/dist/orchestrator/src/cli/control/telegramOversightBridgeStateStore.js +77 -0
  130. package/dist/orchestrator/src/cli/control/telegramOversightControlActionApiClient.js +45 -0
  131. package/dist/orchestrator/src/cli/control/trackerDispatchPilot.js +439 -0
  132. package/dist/orchestrator/src/cli/control/uiDataController.js +34 -0
  133. package/dist/orchestrator/src/cli/control/uiSessionController.js +100 -0
  134. package/dist/orchestrator/src/cli/controlHostCliShell.js +860 -0
  135. package/dist/orchestrator/src/cli/controlHostFreshnessGaugeCliShell.js +129 -0
  136. package/dist/orchestrator/src/cli/controlHostSupervisionCliShell.js +2127 -0
  137. package/dist/orchestrator/src/cli/delegationCliShell.js +62 -0
  138. package/dist/orchestrator/src/cli/delegationServer.js +567 -678
  139. package/dist/orchestrator/src/cli/delegationServerCliShell.js +52 -0
  140. package/dist/orchestrator/src/cli/delegationServerQuestionFlowShell.js +228 -0
  141. package/dist/orchestrator/src/cli/delegationServerToolDispatchShell.js +411 -0
  142. package/dist/orchestrator/src/cli/delegationServerTransport.js +274 -0
  143. package/dist/orchestrator/src/cli/delegationSetup.js +51 -171
  144. package/dist/orchestrator/src/cli/devtoolsCliShell.js +34 -0
  145. package/dist/orchestrator/src/cli/doctor.js +542 -122
  146. package/dist/orchestrator/src/cli/doctorCliRequestShell.js +72 -0
  147. package/dist/orchestrator/src/cli/doctorCliShell.js +138 -0
  148. package/dist/orchestrator/src/cli/doctorUsage.js +136 -16
  149. package/dist/orchestrator/src/cli/exec/experience.js +16 -2
  150. package/dist/orchestrator/src/cli/exec/summary.js +3 -0
  151. package/dist/orchestrator/src/cli/execCliShell.js +51 -0
  152. package/dist/orchestrator/src/cli/flowCliRequestShell.js +44 -0
  153. package/dist/orchestrator/src/cli/flowCliShell.js +239 -0
  154. package/dist/orchestrator/src/cli/frontendTestCliRequestShell.js +80 -0
  155. package/dist/orchestrator/src/cli/frontendTestCliShell.js +41 -0
  156. package/dist/orchestrator/src/cli/init.js +1 -0
  157. package/dist/orchestrator/src/cli/initCliShell.js +50 -0
  158. package/dist/orchestrator/src/cli/linearCliShell.js +1200 -0
  159. package/dist/orchestrator/src/cli/mcpEnableCliShell.js +132 -0
  160. package/dist/orchestrator/src/cli/metrics/metricsAggregator.js +3 -2
  161. package/dist/orchestrator/src/cli/metrics/metricsRecorder.js +56 -0
  162. package/dist/orchestrator/src/cli/orchestrator.js +66 -1376
  163. package/dist/orchestrator/src/cli/planCliShell.js +19 -0
  164. package/dist/orchestrator/src/cli/prCliShell.js +41 -0
  165. package/dist/orchestrator/src/cli/providerLinearChildLanePhaseContract.js +204 -0
  166. package/dist/orchestrator/src/cli/providerLinearChildLaneRunner.js +1772 -0
  167. package/dist/orchestrator/src/cli/providerLinearChildLaneShell.js +2420 -0
  168. package/dist/orchestrator/src/cli/providerLinearChildStreamShell.js +385 -0
  169. package/dist/orchestrator/src/cli/providerLinearWorkerRunner.js +5738 -0
  170. package/dist/orchestrator/src/cli/resumeCliShell.js +14 -0
  171. package/dist/orchestrator/src/cli/reviewCliLaunchShell.js +72 -0
  172. package/dist/orchestrator/src/cli/rlm/alignment.js +3 -3
  173. package/dist/orchestrator/src/cli/rlm/context.js +94 -7
  174. package/dist/orchestrator/src/cli/rlm/rlmCodexRuntimeShell.js +546 -0
  175. package/dist/orchestrator/src/cli/rlm/symbolic.js +4 -2
  176. package/dist/orchestrator/src/cli/rlmCliRequestShell.js +42 -0
  177. package/dist/orchestrator/src/cli/rlmCompletionCliShell.js +46 -0
  178. package/dist/orchestrator/src/cli/rlmLaunchCliShell.js +51 -0
  179. package/dist/orchestrator/src/cli/rlmRunner.js +83 -523
  180. package/dist/orchestrator/src/cli/run/blockMemory.js +500 -0
  181. package/dist/orchestrator/src/cli/run/manifest.js +410 -73
  182. package/dist/orchestrator/src/cli/run/manifestPersister.js +45 -14
  183. package/dist/orchestrator/src/cli/run/runMemoryController.js +216 -0
  184. package/dist/orchestrator/src/cli/run/source0.js +690 -0
  185. package/dist/orchestrator/src/cli/run/workspacePath.js +101 -0
  186. package/dist/orchestrator/src/cli/runtime/mode.js +2 -1
  187. package/dist/orchestrator/src/cli/runtime/provider.js +39 -2
  188. package/dist/orchestrator/src/cli/selfCheckCliShell.js +12 -0
  189. package/dist/orchestrator/src/cli/services/commandRunner.js +668 -18
  190. package/dist/orchestrator/src/cli/services/execRuntime.js +66 -1
  191. package/dist/orchestrator/src/cli/services/orchestratorAutoScoutEvidenceRecorder.js +71 -0
  192. package/dist/orchestrator/src/cli/services/orchestratorCloudBranchResolution.js +8 -0
  193. package/dist/orchestrator/src/cli/services/orchestratorCloudEnvironmentResolution.js +22 -0
  194. package/dist/orchestrator/src/cli/services/orchestratorCloudExecutionLifecycleShell.js +39 -0
  195. package/dist/orchestrator/src/cli/services/orchestratorCloudPromptBuilder.js +37 -0
  196. package/dist/orchestrator/src/cli/services/orchestratorCloudRouteFallbackContract.js +45 -0
  197. package/dist/orchestrator/src/cli/services/orchestratorCloudRouteShell.js +36 -0
  198. package/dist/orchestrator/src/cli/services/orchestratorCloudTargetExecutor.js +277 -0
  199. package/dist/orchestrator/src/cli/services/orchestratorControlPlaneLifecycle.js +98 -0
  200. package/dist/orchestrator/src/cli/services/orchestratorControlPlaneLifecycleShell.js +54 -0
  201. package/dist/orchestrator/src/cli/services/orchestratorExecutionLifecycle.js +112 -0
  202. package/dist/orchestrator/src/cli/services/orchestratorExecutionModePolicy.js +27 -0
  203. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteAdapterShell.js +59 -0
  204. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteDecisionShell.js +57 -0
  205. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteState.js +21 -0
  206. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouter.js +2 -0
  207. package/dist/orchestrator/src/cli/services/orchestratorLocalPipelineExecutor.js +149 -0
  208. package/dist/orchestrator/src/cli/services/orchestratorLocalRouteShell.js +63 -0
  209. package/dist/orchestrator/src/cli/services/orchestratorPlanShell.js +54 -0
  210. package/dist/orchestrator/src/cli/services/orchestratorPlanTargetTracker.js +16 -0
  211. package/dist/orchestrator/src/cli/services/orchestratorResumePreparationShell.js +84 -0
  212. package/dist/orchestrator/src/cli/services/orchestratorResumeTokenValidation.js +15 -0
  213. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleCompletion.js +31 -0
  214. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleExecutionRegistration.js +37 -0
  215. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleOrchestrationShell.js +83 -0
  216. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleTaskManagerShell.js +37 -0
  217. package/dist/orchestrator/src/cli/services/orchestratorRuntimeManifestMutation.js +20 -0
  218. package/dist/orchestrator/src/cli/services/orchestratorStartPreparationShell.js +56 -0
  219. package/dist/orchestrator/src/cli/services/orchestratorStatusShell.js +70 -0
  220. package/dist/orchestrator/src/cli/services/pipelineResolver.js +7 -3
  221. package/dist/orchestrator/src/cli/services/plannerMemory.js +119 -0
  222. package/dist/orchestrator/src/cli/services/runPreparation.js +7 -3
  223. package/dist/orchestrator/src/cli/services/runSummaryWriter.js +9 -0
  224. package/dist/orchestrator/src/cli/setupBootstrapShell.js +114 -0
  225. package/dist/orchestrator/src/cli/setupCliShell.js +51 -0
  226. package/dist/orchestrator/src/cli/skillsCliShell.js +56 -0
  227. package/dist/orchestrator/src/cli/startCliRequestShell.js +53 -0
  228. package/dist/orchestrator/src/cli/startCliShell.js +68 -0
  229. package/dist/orchestrator/src/cli/statusCliShell.js +22 -0
  230. package/dist/orchestrator/src/cli/utils/authProvenanceFingerprint.js +27 -0
  231. package/dist/orchestrator/src/cli/utils/cloudPreflight.js +83 -1
  232. package/dist/orchestrator/src/cli/utils/delegationConfigParser.js +250 -0
  233. package/dist/orchestrator/src/cli/utils/delegationMcpHealth.js +1382 -0
  234. package/dist/orchestrator/src/cli/utils/devtools.js +2 -54
  235. package/dist/orchestrator/src/cli/utils/mcpServerEntry.js +53 -0
  236. package/dist/orchestrator/src/cli/utils/packageProgramResolver.js +151 -0
  237. package/dist/orchestrator/src/cli/utils/providerOverrideEnv.js +71 -0
  238. package/dist/orchestrator/src/cli/utils/trailingJsonObject.js +59 -0
  239. package/dist/orchestrator/src/learning/crystalizer.js +2 -2
  240. package/dist/orchestrator/src/persistence/ExperienceStore.js +233 -49
  241. package/dist/orchestrator/src/persistence/TaskStateStore.js +6 -6
  242. package/dist/orchestrator/src/persistence/lockFile.js +70 -4
  243. package/dist/orchestrator/src/persistence/sanitizeIdentifier.js +39 -0
  244. package/dist/orchestrator/src/sync/createCloudSyncWorker.js +3 -2
  245. package/dist/orchestrator/src/utils/atomicWrite.js +17 -2
  246. package/dist/packages/orchestrator/src/exec/unified-exec.js +99 -6
  247. package/dist/packages/orchestrator/src/instructions/promptPacks.js +150 -19
  248. package/dist/packages/sdk-node/src/orchestrator.js +137 -13
  249. package/dist/packages/shared/config/designConfig.js +8 -1
  250. package/dist/packages/shared/streams/stdio.js +1 -1
  251. package/dist/scripts/design/pipeline/permit.js +15 -0
  252. package/dist/scripts/lib/docs-catalog.js +365 -0
  253. package/dist/scripts/lib/docs-helpers.js +87 -5
  254. package/dist/scripts/lib/pr-watch-merge.js +1088 -80
  255. package/dist/scripts/lib/provider-run-contract.js +26 -0
  256. package/dist/scripts/lib/review-command-intent-classification.js +532 -0
  257. package/dist/scripts/lib/review-command-probe-classification.js +385 -0
  258. package/dist/scripts/lib/review-execution-boundary-preflight.js +279 -0
  259. package/dist/scripts/lib/review-execution-runtime.js +753 -0
  260. package/dist/scripts/lib/review-execution-state.js +1144 -0
  261. package/dist/scripts/lib/review-execution-telemetry.js +215 -0
  262. package/dist/scripts/lib/review-inspection-target-parsing.js +78 -0
  263. package/dist/scripts/lib/review-launch-attempt.js +601 -0
  264. package/dist/scripts/lib/review-meta-surface-boundary-analysis.js +300 -0
  265. package/dist/scripts/lib/review-meta-surface-normalization.js +746 -0
  266. package/dist/scripts/lib/review-non-interactive-handoff.js +61 -0
  267. package/dist/scripts/lib/review-prompt-context.js +376 -0
  268. package/dist/scripts/lib/review-scope-advisory.js +286 -0
  269. package/dist/scripts/lib/review-scope-paths.js +123 -0
  270. package/dist/scripts/lib/review-shell-command-parser.js +389 -0
  271. package/dist/scripts/lib/review-shell-env-interpreter.js +340 -0
  272. package/dist/scripts/lib/run-manifests.js +192 -36
  273. package/dist/scripts/lib/spark-policy-classifier.js +593 -0
  274. package/dist/scripts/run-review.js +507 -1777
  275. package/docs/public/downstream-setup.md +106 -0
  276. package/docs/public/provider-onboarding.md +173 -0
  277. package/package.json +30 -11
  278. package/plugins/codex-orchestrator/.codex-plugin/plugin.json +30 -0
  279. package/plugins/codex-orchestrator/.mcp.json +13 -0
  280. package/plugins/codex-orchestrator/launcher.mjs +359 -0
  281. package/schemas/manifest.json +395 -0
  282. package/skills/chrome-devtools/SKILL.md +1 -1
  283. package/skills/codex-orchestrator/SKILL.md +83 -0
  284. package/skills/collab-subagents-first/SKILL.md +2 -1
  285. package/skills/delegation-usage/DELEGATION_GUIDE.md +24 -11
  286. package/skills/delegation-usage/SKILL.md +20 -13
  287. package/skills/land/SKILL.md +77 -0
  288. package/skills/linear/SKILL.md +255 -0
  289. package/skills/release/SKILL.md +47 -3
  290. package/skills/standalone-review/SKILL.md +6 -1
  291. package/templates/README.md +4 -2
  292. package/templates/codex/.codex/agents/awaiter-high.toml +2 -2
  293. package/templates/codex/.codex/agents/explorer-fast.toml +1 -0
  294. package/templates/codex/.codex/agents/worker-complex.toml +1 -1
  295. package/templates/codex/.codex/config.toml +3 -4
  296. package/templates/codex/.codex/providers/README.md +13 -0
  297. package/templates/codex/.codex/providers/control.example.json +18 -0
  298. package/templates/codex/.codex/providers/provider.env.example +15 -0
  299. package/templates/codex/AGENTS.md +12 -7
  300. package/templates/codex/mcp-client.json +5 -1
  301. package/docs/README.md +0 -307
  302. package/docs/assets/setup.gif +0 -0
@@ -0,0 +1,72 @@
1
+ /* eslint-disable patterns/prefer-logger-over-console */
2
+ import process from 'node:process';
3
+ import { runDoctorCliShell } from './doctorCliShell.js';
4
+ const DEFAULT_DEPENDENCIES = {
5
+ runDoctorCliShell,
6
+ getCwd: () => process.cwd()
7
+ };
8
+ export async function runDoctorCliRequestShell(params, overrides = {}) {
9
+ const dependencies = { ...DEFAULT_DEPENDENCIES, ...overrides };
10
+ const format = resolveOutputFormat(params.flags);
11
+ const includeUsage = Boolean(params.flags['usage']);
12
+ const includeCloudPreflight = Boolean(params.flags['cloud-preflight']);
13
+ const includeIssueLog = Boolean(params.flags['issue-log']);
14
+ const cloudEnvIdOverride = readStringFlag(params.flags, 'cloud-env-id');
15
+ const cloudBranchOverride = readStringFlag(params.flags, 'cloud-branch');
16
+ const issueTitle = readStringFlag(params.flags, 'issue-title');
17
+ const issueNotes = readStringFlag(params.flags, 'issue-notes');
18
+ const issueLogPath = readStringFlag(params.flags, 'issue-log-path');
19
+ if (!includeCloudPreflight && (cloudEnvIdOverride || cloudBranchOverride)) {
20
+ throw new Error('--cloud-env-id/--cloud-branch require --cloud-preflight.');
21
+ }
22
+ if (!includeIssueLog && (issueTitle || issueNotes || issueLogPath)) {
23
+ throw new Error('--issue-title/--issue-notes/--issue-log-path require --issue-log.');
24
+ }
25
+ const wantsApply = Boolean(params.flags['apply']);
26
+ const apply = Boolean(params.flags['yes']);
27
+ if (wantsApply && format === 'json') {
28
+ throw new Error('doctor --apply does not support --format json.');
29
+ }
30
+ const windowDays = parseWindowDays(readStringFlag(params.flags, 'window-days'));
31
+ const taskFilter = readStringFlag(params.flags, 'task') ?? null;
32
+ await dependencies.runDoctorCliShell({
33
+ format,
34
+ includeUsage,
35
+ includeCloudPreflight,
36
+ includeIssueLog,
37
+ cloudEnvIdOverride: cloudEnvIdOverride ?? undefined,
38
+ cloudBranchOverride: cloudBranchOverride ?? undefined,
39
+ issueTitle: issueTitle ?? undefined,
40
+ issueNotes: issueNotes ?? undefined,
41
+ issueLogPath: issueLogPath ?? undefined,
42
+ wantsApply,
43
+ apply,
44
+ windowDays,
45
+ taskFilter,
46
+ repoRoot: dependencies.getCwd()
47
+ });
48
+ }
49
+ function resolveOutputFormat(flags) {
50
+ return flags['format'] === 'json' ? 'json' : 'text';
51
+ }
52
+ function readStringFlag(flags, key) {
53
+ const value = flags[key];
54
+ if (typeof value !== 'string') {
55
+ return undefined;
56
+ }
57
+ const trimmed = value.trim();
58
+ return trimmed.length > 0 ? trimmed : undefined;
59
+ }
60
+ function parseWindowDays(windowDaysRaw) {
61
+ if (!windowDaysRaw) {
62
+ return undefined;
63
+ }
64
+ if (!/^\d+$/u.test(windowDaysRaw)) {
65
+ throw new Error(`Invalid --window-days value '${windowDaysRaw}'. Expected a positive integer.`);
66
+ }
67
+ const parsed = Number(windowDaysRaw);
68
+ if (!Number.isInteger(parsed) || parsed <= 0) {
69
+ throw new Error(`Invalid --window-days value '${windowDaysRaw}'. Expected a positive integer.`);
70
+ }
71
+ return parsed;
72
+ }
@@ -0,0 +1,138 @@
1
+ /* eslint-disable patterns/prefer-logger-over-console */
2
+ import { formatDoctorCloudPreflightSummary, formatDoctorSummary, runDoctor, runDoctorCloudPreflight } from './doctor.js';
3
+ import { formatDoctorUsageSummary, runDoctorUsage } from './doctorUsage.js';
4
+ import { formatDoctorIssueLogSummary, writeDoctorIssueLog } from './doctorIssueLog.js';
5
+ import { formatDevtoolsSetupSummary, runDevtoolsSetup } from './devtoolsSetup.js';
6
+ import { formatDelegationSetupSummary, runDelegationSetup } from './delegationSetup.js';
7
+ import { formatSkillsInstallSummary, installSkills } from './skills.js';
8
+ const DEFAULT_DEPENDENCIES = {
9
+ runDoctor,
10
+ runDoctorUsage,
11
+ runDoctorCloudPreflight,
12
+ writeDoctorIssueLog,
13
+ runDelegationSetup,
14
+ runDevtoolsSetup,
15
+ installSkills,
16
+ formatDoctorSummary,
17
+ formatDoctorUsageSummary,
18
+ formatDoctorCloudPreflightSummary,
19
+ formatDoctorIssueLogSummary,
20
+ formatSkillsInstallSummary,
21
+ formatDelegationSetupSummary,
22
+ formatDevtoolsSetupSummary,
23
+ log: (line) => console.log(line)
24
+ };
25
+ export async function runDoctorCliShell(params, overrides = {}) {
26
+ const dependencies = { ...DEFAULT_DEPENDENCIES, ...overrides };
27
+ const doctorResult = dependencies.runDoctor(params.repoRoot);
28
+ const usageResult = params.includeUsage
29
+ ? await dependencies.runDoctorUsage({ windowDays: params.windowDays, taskFilter: params.taskFilter })
30
+ : null;
31
+ const cloudPreflightResult = params.includeCloudPreflight
32
+ ? await dependencies.runDoctorCloudPreflight({
33
+ cwd: params.repoRoot,
34
+ environmentId: params.cloudEnvIdOverride,
35
+ branch: params.cloudBranchOverride,
36
+ taskId: params.taskFilter
37
+ })
38
+ : null;
39
+ const issueLogResult = params.includeIssueLog
40
+ ? await dependencies.writeDoctorIssueLog({
41
+ doctor: doctorResult,
42
+ usage: usageResult,
43
+ cloudPreflight: cloudPreflightResult,
44
+ issueTitle: params.issueTitle,
45
+ issueNotes: params.issueNotes,
46
+ issueLogPath: params.issueLogPath,
47
+ taskFilter: params.taskFilter
48
+ })
49
+ : null;
50
+ if (params.format === 'json') {
51
+ const payload = { ...doctorResult };
52
+ if (usageResult) {
53
+ payload.usage = usageResult;
54
+ }
55
+ if (cloudPreflightResult) {
56
+ payload.cloud_preflight = cloudPreflightResult;
57
+ }
58
+ if (issueLogResult) {
59
+ payload.issue_log = issueLogResult;
60
+ }
61
+ dependencies.log(JSON.stringify(payload, null, 2));
62
+ return;
63
+ }
64
+ for (const line of dependencies.formatDoctorSummary(doctorResult)) {
65
+ dependencies.log(line);
66
+ }
67
+ if (usageResult) {
68
+ for (const line of dependencies.formatDoctorUsageSummary(usageResult)) {
69
+ dependencies.log(line);
70
+ }
71
+ }
72
+ if (cloudPreflightResult) {
73
+ for (const line of dependencies.formatDoctorCloudPreflightSummary(cloudPreflightResult)) {
74
+ dependencies.log(line);
75
+ }
76
+ }
77
+ if (issueLogResult) {
78
+ for (const line of dependencies.formatDoctorIssueLogSummary(issueLogResult)) {
79
+ dependencies.log(line);
80
+ }
81
+ }
82
+ if (!params.wantsApply) {
83
+ return;
84
+ }
85
+ const delegationPlan = await dependencies.runDelegationSetup({ repoRoot: params.repoRoot });
86
+ const devtoolsPlan = await dependencies.runDevtoolsSetup();
87
+ const needsDelegation = !delegationPlan.readiness.configured;
88
+ const needsDevtoolsSkill = devtoolsPlan.readiness.skill.status !== 'ok';
89
+ const devtoolsConfigStatus = devtoolsPlan.readiness.config.status;
90
+ const needsDevtoolsConfig = devtoolsConfigStatus === 'missing';
91
+ const hasInvalidDevtoolsConfig = devtoolsConfigStatus === 'invalid';
92
+ if (!needsDelegation && !needsDevtoolsSkill && !needsDevtoolsConfig && !hasInvalidDevtoolsConfig) {
93
+ dependencies.log('Doctor apply: nothing to do.');
94
+ return;
95
+ }
96
+ dependencies.log('Doctor apply plan:');
97
+ if (needsDevtoolsSkill) {
98
+ dependencies.log('- Install skill: chrome-devtools (codex-orchestrator skills install --only chrome-devtools)');
99
+ }
100
+ if (hasInvalidDevtoolsConfig) {
101
+ dependencies.log(`- DevTools MCP config is invalid: ${devtoolsPlan.readiness.config.path} (fix config.toml then rerun doctor --apply)`);
102
+ }
103
+ if (needsDevtoolsConfig) {
104
+ dependencies.log('- Configure DevTools MCP: codex-orchestrator devtools setup --yes');
105
+ }
106
+ if (needsDelegation) {
107
+ dependencies.log('- Configure delegation MCP: codex-orchestrator delegation setup --yes');
108
+ }
109
+ if (!params.apply) {
110
+ dependencies.log('Run with --apply --yes to apply these fixes.');
111
+ return;
112
+ }
113
+ if (needsDevtoolsSkill) {
114
+ const skills = await dependencies.installSkills({ only: ['chrome-devtools'] });
115
+ for (const line of dependencies.formatSkillsInstallSummary(skills)) {
116
+ dependencies.log(line);
117
+ }
118
+ }
119
+ if (needsDelegation) {
120
+ const delegation = await dependencies.runDelegationSetup({ apply: true, repoRoot: params.repoRoot });
121
+ for (const line of dependencies.formatDelegationSetupSummary(delegation)) {
122
+ dependencies.log(line);
123
+ }
124
+ }
125
+ if (hasInvalidDevtoolsConfig) {
126
+ dependencies.log(`DevTools setup: skipped (config.toml is invalid: ${devtoolsPlan.readiness.config.path}). Fix it and rerun doctor --apply --yes.`);
127
+ }
128
+ else if (needsDevtoolsConfig) {
129
+ const devtools = await dependencies.runDevtoolsSetup({ apply: true });
130
+ for (const line of dependencies.formatDevtoolsSetupSummary(devtools)) {
131
+ dependencies.log(line);
132
+ }
133
+ }
134
+ const doctorAfter = dependencies.runDoctor(params.repoRoot);
135
+ for (const line of dependencies.formatDoctorSummary(doctorAfter)) {
136
+ dependencies.log(line);
137
+ }
138
+ }
@@ -31,6 +31,9 @@ export async function runDoctorUsage(options = {}) {
31
31
  const collabByEventType = {};
32
32
  const collabTools = new Map();
33
33
  const collabCaptureDisabled = String(process.env.CODEX_ORCHESTRATOR_COLLAB_MAX_EVENTS ?? '').trim() === '0';
34
+ let collabSpawnForkContextTrue = 0;
35
+ let collabSpawnForkContextFalse = 0;
36
+ let collabSpawnForkContextUnknown = 0;
34
37
  let collabRunsWithUnclosedSpawnAgents = 0;
35
38
  let collabUnclosedSpawnAgents = 0;
36
39
  let collabRunsWithSpawnThreadLimitFailures = 0;
@@ -133,8 +136,8 @@ export async function runDoctorUsage(options = {}) {
133
136
  if (collabEventsPossiblyTruncated) {
134
137
  collabRunsWithPotentiallyTruncatedToolCalls += 1;
135
138
  }
136
- const spawnedAgents = new Set();
137
- const closedAgents = new Set();
139
+ const spawnedAgentAliases = [];
140
+ const closedSpawnIndexes = new Set();
138
141
  const failedSpawnIds = new Set();
139
142
  let failedSpawnCalls = 0;
140
143
  if (typeof manifest.task_id === 'string' && manifest.task_id) {
@@ -144,11 +147,7 @@ export async function runDoctorUsage(options = {}) {
144
147
  const tool = typeof entry?.tool === 'string' && entry.tool ? entry.tool : 'unknown';
145
148
  const status = typeof entry?.status === 'string' && entry.status ? entry.status : 'unknown';
146
149
  const eventType = typeof entry?.event_type === 'string' && entry.event_type ? entry.event_type : 'unknown';
147
- const receiverThreadIds = Array.isArray(entry?.receiver_thread_ids)
148
- ? entry.receiver_thread_ids
149
- .map((id) => (typeof id === 'string' ? id.trim() : ''))
150
- .filter((id) => id.length > 0)
151
- : [];
150
+ const receiverIdentifierGroups = resolveCollabReceiverIdentifierGroups(entry);
152
151
  const completedEventWithoutStatus = eventType === 'item.completed' && status !== 'failed';
153
152
  const isCompleted = status === 'completed' || completedEventWithoutStatus;
154
153
  const isFailed = status === 'failed';
@@ -160,6 +159,15 @@ export async function runDoctorUsage(options = {}) {
160
159
  continue;
161
160
  }
162
161
  if (tool === 'spawn_agent') {
162
+ if (entry?.fork_context === true) {
163
+ collabSpawnForkContextTrue += 1;
164
+ }
165
+ else if (entry?.fork_context === false) {
166
+ collabSpawnForkContextFalse += 1;
167
+ }
168
+ else {
169
+ collabSpawnForkContextUnknown += 1;
170
+ }
163
171
  if (isFailed) {
164
172
  const rawFailedSpawnId = typeof entry?.item_id === 'string' ? entry.item_id.trim() : '';
165
173
  const failedSpawnId = rawFailedSpawnId.length > 0 && rawFailedSpawnId !== 'unknown'
@@ -174,25 +182,34 @@ export async function runDoctorUsage(options = {}) {
174
182
  if (!isCompleted) {
175
183
  continue;
176
184
  }
177
- if (receiverThreadIds.length > 0) {
178
- for (const id of receiverThreadIds) {
179
- spawnedAgents.add(id);
185
+ if (receiverIdentifierGroups.length > 0) {
186
+ for (const receiverIdentifiers of receiverIdentifierGroups) {
187
+ spawnedAgentAliases.push(new Set(receiverIdentifiers));
180
188
  }
181
189
  }
182
190
  else {
183
- const fallbackId = `spawn@${entry?.item_id ?? entryIndex}`;
184
- spawnedAgents.add(fallbackId);
191
+ spawnedAgentAliases.push(new Set([`spawn@${entry?.item_id ?? entryIndex}`]));
185
192
  }
186
193
  continue;
187
194
  }
188
195
  if (tool === 'close_agent' && isCompleted) {
189
- for (const id of receiverThreadIds) {
190
- closedAgents.add(id);
196
+ if (receiverIdentifierGroups.length === 0) {
197
+ continue;
198
+ }
199
+ for (const receiverIdentifiers of receiverIdentifierGroups) {
200
+ for (const [spawnIndex, aliases] of spawnedAgentAliases.entries()) {
201
+ if (closedSpawnIndexes.has(spawnIndex)) {
202
+ continue;
203
+ }
204
+ if (collabReceiverGroupMatches(receiverIdentifiers, aliases)) {
205
+ closedSpawnIndexes.add(spawnIndex);
206
+ }
207
+ }
191
208
  }
192
209
  }
193
210
  }
194
211
  if (collabCaptureLimitKnown && !collabEventsPossiblyTruncated) {
195
- const unclosedSpawnAgents = [...spawnedAgents].filter((id) => !closedAgents.has(id));
212
+ const unclosedSpawnAgents = spawnedAgentAliases.filter((_aliases, spawnIndex) => !closedSpawnIndexes.has(spawnIndex));
196
213
  if (unclosedSpawnAgents.length > 0) {
197
214
  collabRunsWithUnclosedSpawnAgents += 1;
198
215
  collabUnclosedSpawnAgents += unclosedSpawnAgents.length;
@@ -290,6 +307,9 @@ export async function runDoctorUsage(options = {}) {
290
307
  by_event_type: collabByEventType,
291
308
  top_tools: collabTopTools,
292
309
  capture_disabled: collabCaptureDisabled,
310
+ spawn_agent_fork_context_true: collabSpawnForkContextTrue,
311
+ spawn_agent_fork_context_false: collabSpawnForkContextFalse,
312
+ spawn_agent_fork_context_unknown: collabSpawnForkContextUnknown,
293
313
  runs_with_unclosed_spawn_agents: collabRunsWithUnclosedSpawnAgents,
294
314
  unclosed_spawn_agents: collabUnclosedSpawnAgents,
295
315
  runs_with_spawn_thread_limit_failures: collabRunsWithSpawnThreadLimitFailures,
@@ -357,9 +377,10 @@ export function formatDoctorUsageSummary(result) {
357
377
  const collabLifecycleUnknownSignal = collabLifecycleUnknownRuns > 0
358
378
  ? `, lifecycle_unknown_runs=${collabLifecycleUnknownRuns}`
359
379
  : '';
380
+ const collabForkContextSignal = `, fork_context=${result.collab.spawn_agent_fork_context_true}/${result.collab.spawn_agent_fork_context_false}/${result.collab.spawn_agent_fork_context_unknown}`;
360
381
  const collabToolList = formatTopList(result.collab.top_tools.map((entry) => ({ key: entry.tool, value: entry.calls })), 3, 'tools');
361
382
  lines.push(` - collab: ${result.collab.runs_with_tool_calls} (${formatPercent(result.collab.runs_with_tool_calls, result.runs.total)})${collabSuffix}`
362
- + `${collabTaskSuffix}, events=${result.collab.total_tool_calls}${collabAvg} (ok=${collabOk}, failed=${collabFailed}${collabLeakSignal}${collabThreadLimitSignal}${collabLifecycleUnknownSignal})${collabToolList}`);
383
+ + `${collabTaskSuffix}, events=${result.collab.total_tool_calls}${collabAvg} (ok=${collabOk}, failed=${collabFailed}${collabLeakSignal}${collabThreadLimitSignal}${collabLifecycleUnknownSignal}${collabForkContextSignal})${collabToolList}`);
363
384
  if (result.delegation.active_top_level_tasks > 0) {
364
385
  lines.push(` - delegation: ${result.delegation.active_with_subagents}/${result.delegation.active_top_level_tasks} top-level tasks have subagent manifests (${result.delegation.total_subagent_manifests} total); child_runs=${result.delegation.total_child_runs} over ${result.delegation.tasks_with_child_runs} tasks`);
365
386
  }
@@ -443,6 +464,105 @@ function resolveManifestCollabCaptureLimit(manifest) {
443
464
  }
444
465
  return Math.trunc(value);
445
466
  }
467
+ function resolveCollabReceiverIdentifierGroups(entry) {
468
+ const receiverThreadIdSlots = normalizeCollabAliasSlots('thread', entry?.receiver_thread_ids);
469
+ const receiverAgentPathSlots = normalizeCollabAliasSlots('path', entry?.receiver_agent_paths);
470
+ const receiverAgents = Array.isArray(entry?.receiver_agents) ? entry.receiver_agents : [];
471
+ const groups = [];
472
+ const consumedThreadIndexes = new Set();
473
+ const consumedPathIndexes = new Set();
474
+ if (receiverAgents.length > 0) {
475
+ for (const agent of receiverAgents) {
476
+ const identifiers = dedupeCollabAliases([
477
+ normalizeCollabAlias('thread', agent?.thread_id),
478
+ normalizeCollabAlias('path', agent?.agent_path)
479
+ ]);
480
+ if (identifiers.length > 0) {
481
+ groups.push(identifiers);
482
+ consumeMatchingAliasIndex(receiverThreadIdSlots, identifiers, consumedThreadIndexes);
483
+ consumeMatchingAliasIndex(receiverAgentPathSlots, identifiers, consumedPathIndexes);
484
+ }
485
+ }
486
+ }
487
+ const pairCount = Math.max(receiverThreadIdSlots.length, receiverAgentPathSlots.length);
488
+ for (let index = 0; index < pairCount; index += 1) {
489
+ if (consumedThreadIndexes.has(index) || consumedPathIndexes.has(index)) {
490
+ continue;
491
+ }
492
+ const receiverThreadId = receiverThreadIdSlots[index] ?? null;
493
+ const receiverAgentPath = receiverAgentPathSlots[index] ?? null;
494
+ if (receiverThreadId === null || receiverAgentPath === null) {
495
+ continue;
496
+ }
497
+ const identifiers = dedupeCollabAliases([receiverThreadId, receiverAgentPath]);
498
+ if (identifiers.length > 0) {
499
+ const existingGroup = groups.find((group) => group.includes(receiverThreadId));
500
+ if (existingGroup) {
501
+ for (const identifier of identifiers) {
502
+ if (!existingGroup.includes(identifier)) {
503
+ existingGroup.push(identifier);
504
+ }
505
+ }
506
+ }
507
+ else {
508
+ groups.push(identifiers);
509
+ }
510
+ }
511
+ consumedThreadIndexes.add(index);
512
+ consumedPathIndexes.add(index);
513
+ }
514
+ const groupedAliases = new Set(groups.flat());
515
+ for (const [index, receiverThreadId] of receiverThreadIdSlots.entries()) {
516
+ if (receiverThreadId !== null && !consumedThreadIndexes.has(index) && !groupedAliases.has(receiverThreadId)) {
517
+ groups.push([receiverThreadId]);
518
+ groupedAliases.add(receiverThreadId);
519
+ }
520
+ }
521
+ for (const [index, receiverAgentPath] of receiverAgentPathSlots.entries()) {
522
+ if (receiverAgentPath !== null && !consumedPathIndexes.has(index) && !groupedAliases.has(receiverAgentPath)) {
523
+ groups.push([receiverAgentPath]);
524
+ groupedAliases.add(receiverAgentPath);
525
+ }
526
+ }
527
+ return groups;
528
+ }
529
+ function normalizeCollabAliasSlots(prefix, values) {
530
+ return Array.isArray(values) ? values.map((value) => normalizeCollabAlias(prefix, value)) : [];
531
+ }
532
+ function normalizeCollabAlias(prefix, value) {
533
+ if (typeof value !== 'string') {
534
+ return null;
535
+ }
536
+ const trimmed = value.trim();
537
+ return trimmed ? `${prefix}:${trimmed}` : null;
538
+ }
539
+ function consumeMatchingAliasIndex(slots, aliases, consumedIndexes) {
540
+ for (const alias of aliases) {
541
+ const index = slots.findIndex((slotAlias, slotIndex) => slotAlias === alias && !consumedIndexes.has(slotIndex));
542
+ if (index >= 0) {
543
+ consumedIndexes.add(index);
544
+ }
545
+ }
546
+ }
547
+ function collabReceiverGroupMatches(receiverIdentifiers, aliases) {
548
+ const threadIdentifiers = receiverIdentifiers.filter((identifier) => identifier.startsWith('thread:'));
549
+ if (threadIdentifiers.length > 0) {
550
+ return threadIdentifiers.some((identifier) => aliases.has(identifier));
551
+ }
552
+ return receiverIdentifiers.some((identifier) => aliases.has(identifier));
553
+ }
554
+ function dedupeCollabAliases(values) {
555
+ const seen = new Set();
556
+ const deduped = [];
557
+ for (const value of values) {
558
+ if (!value || seen.has(value)) {
559
+ continue;
560
+ }
561
+ seen.add(value);
562
+ deduped.push(value);
563
+ }
564
+ return deduped;
565
+ }
446
566
  function clampInt(value, min, max) {
447
567
  const rounded = Math.floor(value);
448
568
  if (!Number.isFinite(rounded)) {
@@ -38,16 +38,30 @@ export function framesFromToolMetrics(metrics, representativeEvent) {
38
38
  latencyMs: metric.latencyMs
39
39
  }));
40
40
  }
41
- export function formatExperienceInjections(experiences, slots) {
41
+ export function formatExperienceInjections(experiences, slots, diagnostics) {
42
42
  if (slots <= 0) {
43
43
  return [];
44
44
  }
45
+ const selectedMetadata = new Map((diagnostics?.selected ?? []).map((entry) => [entry.id, entry]));
45
46
  return experiences.slice(0, slots).map((experience) => {
47
+ const selected = selectedMetadata.get(experience.id);
46
48
  const rewardScore = (experience.reward.gtScore + experience.reward.relativeRank).toFixed(2);
47
49
  const statText = experience.toolStats
48
50
  .map((stat) => `${stat.tool}: ${stat.tokens}t/${stat.costUsd.toFixed(3)}usd/${Math.round(stat.latencyMs)}ms`)
49
51
  .join('; ');
50
- return `[exp ${experience.id} | epoch ${experience.epoch ?? 'n/a'} | reward ${rewardScore}] ${experience.summary32} (stats: ${statText})`;
52
+ const metadataParts = [
53
+ `exp ${experience.id}`,
54
+ `epoch ${experience.epoch ?? 'n/a'}`,
55
+ `reward ${rewardScore}`
56
+ ];
57
+ if (selected) {
58
+ metadataParts.push(`source ${selected.source_kind}:${selected.source_key}`);
59
+ metadataParts.push(`competitive ${selected.competitive_score.toFixed(2)}`);
60
+ if (selected.dominance_penalty > 0) {
61
+ metadataParts.push(`anti-dom ${selected.dominance_penalty.toFixed(2)}`);
62
+ }
63
+ }
64
+ return `[${metadataParts.join(' | ')}] ${experience.summary32} (stats: ${statText})`;
51
65
  });
52
66
  }
53
67
  function buildTrajectorySummary(frames, fallback) {
@@ -2,6 +2,7 @@ import { join } from 'node:path';
2
2
  import { relativeToRepo } from '../run/runPaths.js';
3
3
  import { writeJsonAtomic } from '../utils/fs.js';
4
4
  import { persistManifest } from '../run/manifestPersister.js';
5
+ import { refreshRunMemoryObservability } from '../run/source0.js';
5
6
  import { readExecMetadata } from './finalization.js';
6
7
  export function createRunSummaryPayload(params) {
7
8
  const { env, paths, manifest, runStatus, shellCommand, argv, resultSummary, toolRecord, execEvents, exitCode, signal, notificationTargets, cwd, metrics } = params;
@@ -16,6 +17,7 @@ export function createRunSummaryPayload(params) {
16
17
  const persisted = Boolean(execMetadata?.persisted);
17
18
  const metadataSandbox = execMetadata?.sandboxState;
18
19
  const sandboxState = resultSummary?.sandboxState ?? toolRecord?.sandboxState ?? metadataSandbox ?? 'sandboxed';
20
+ refreshRunMemoryObservability(manifest);
19
21
  return {
20
22
  status: runStatus === 'succeeded' ? 'succeeded' : 'failed',
21
23
  run: {
@@ -52,6 +54,7 @@ export function createRunSummaryPayload(params) {
52
54
  },
53
55
  toolRun: toolRecord,
54
56
  metrics: metrics ?? undefined,
57
+ memory: manifest.memory?.observability ?? undefined,
55
58
  notifications: {
56
59
  targets: notificationTargets,
57
60
  delivered: [],
@@ -0,0 +1,51 @@
1
+ /* eslint-disable patterns/prefer-logger-over-console */
2
+ import process from 'node:process';
3
+ import { resolveEnvironmentPaths } from '../../../scripts/lib/run-manifests.js';
4
+ import { executeExecCommand } from './exec/command.js';
5
+ import { normalizeEnvironmentPaths, sanitizeTaskId } from './run/environment.js';
6
+ const DEFAULT_DEPENDENCIES = {
7
+ resolveEnvironmentPaths,
8
+ normalizeEnvironmentPaths,
9
+ sanitizeTaskId,
10
+ executeExecCommand,
11
+ stdout: process.stdout,
12
+ stderr: process.stderr,
13
+ maybeEmitAdoptionHint: async () => undefined,
14
+ setExitCode: (code) => {
15
+ process.exitCode = code;
16
+ }
17
+ };
18
+ export async function runExecCliShell(params, overrides = {}) {
19
+ const dependencies = { ...DEFAULT_DEPENDENCIES, ...overrides };
20
+ if (params.commandTokens.length === 0) {
21
+ throw new Error('exec requires a command to run.');
22
+ }
23
+ const isInteractive = dependencies.stdout.isTTY === true && dependencies.stderr.isTTY === true;
24
+ const outputMode = params.requestedMode ?? (isInteractive ? 'interactive' : 'jsonl');
25
+ const env = dependencies.normalizeEnvironmentPaths(dependencies.resolveEnvironmentPaths());
26
+ if (params.taskId) {
27
+ env.taskId = dependencies.sanitizeTaskId(params.taskId);
28
+ }
29
+ const result = await dependencies.executeExecCommand({
30
+ env,
31
+ stdout: dependencies.stdout,
32
+ stderr: dependencies.stderr
33
+ }, {
34
+ command: params.commandTokens[0],
35
+ args: params.commandTokens.slice(1),
36
+ cwd: params.cwd,
37
+ outputMode,
38
+ notifyTargets: params.notifyTargets,
39
+ otelEndpoint: params.otelEndpoint,
40
+ jsonPretty: params.jsonPretty
41
+ });
42
+ if (result.exitCode !== null) {
43
+ dependencies.setExitCode(result.exitCode);
44
+ }
45
+ else if (result.status !== 'succeeded') {
46
+ dependencies.setExitCode(1);
47
+ }
48
+ if (outputMode === 'interactive') {
49
+ await dependencies.maybeEmitAdoptionHint(env.taskId);
50
+ }
51
+ }
@@ -0,0 +1,44 @@
1
+ import { runFlowCliShell } from './flowCliShell.js';
2
+ const DEFAULT_DEPENDENCIES = {
3
+ runFlowCliShell
4
+ };
5
+ export async function runFlowCliRequestShell(params, overrides = {}) {
6
+ const dependencies = { ...DEFAULT_DEPENDENCIES, ...overrides };
7
+ if (params.positionals.length > 0) {
8
+ throw new Error(`flow does not accept positional arguments: ${params.positionals.join(' ')}`);
9
+ }
10
+ const format = resolveOutputFormat(params.flags);
11
+ const executionMode = params.resolveExecutionModeFlag(params.flags);
12
+ const runtimeMode = params.resolveRuntimeModeFlag(params.flags);
13
+ params.applyRepoConfigRequiredPolicy(params.flags);
14
+ const autoIssueLogEnabled = params.resolveAutoIssueLogEnabled(params.flags);
15
+ await dependencies.runFlowCliShell({
16
+ orchestrator: params.orchestrator,
17
+ format,
18
+ executionMode,
19
+ runtimeMode,
20
+ autoIssueLogEnabled,
21
+ taskId: readStringFlagValue(params.flags['task']),
22
+ parentRunId: readStringFlagValue(params.flags['parent-run']),
23
+ approvalPolicy: readStringFlagValue(params.flags['approval-policy']),
24
+ targetStageId: params.resolveTargetStageId(params.flags),
25
+ runWithUi: async (action) => await params.runWithUi(format, action),
26
+ emitRunOutput: params.emitRunOutput,
27
+ formatIssueLogSummary: params.formatIssueLogSummary,
28
+ toRunOutputPayload: params.toRunOutputPayload,
29
+ maybeCaptureAutoIssueLog: params.maybeCaptureAutoIssueLog,
30
+ resolveTaskFilter: params.resolveTaskFilter,
31
+ withAutoIssueLogContext: params.withAutoIssueLogContext,
32
+ maybeEmitRunAdoptionHint: params.maybeEmitRunAdoptionHint
33
+ });
34
+ }
35
+ function resolveOutputFormat(flags) {
36
+ return flags['format'] === 'json' ? 'json' : 'text';
37
+ }
38
+ function readStringFlagValue(value) {
39
+ if (typeof value !== 'string') {
40
+ return undefined;
41
+ }
42
+ const trimmed = value.trim();
43
+ return trimmed.length > 0 ? trimmed : undefined;
44
+ }