@kbediako/codex-orchestrator 0.1.38 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/README.md +46 -317
  3. package/bin/codex-orchestrator.js +161 -0
  4. package/codex.orchestrator.json +149 -13
  5. package/dist/bin/codex-orchestrator.js +797 -1154
  6. package/dist/orchestrator/src/cli/adapters/CommandBuilder.js +50 -0
  7. package/dist/orchestrator/src/cli/adapters/CommandPlanner.js +22 -4
  8. package/dist/orchestrator/src/cli/adapters/CommandReviewer.js +3 -3
  9. package/dist/orchestrator/src/cli/adapters/CommandTester.js +2 -2
  10. package/dist/orchestrator/src/cli/adapters/cloudFailureDiagnostics.js +295 -11
  11. package/dist/orchestrator/src/cli/coStatusAttachCliShell.js +402 -0
  12. package/dist/orchestrator/src/cli/coStatusCliShell.js +451 -0
  13. package/dist/orchestrator/src/cli/coStatusOperatorAutopilotCliShell.js +120 -0
  14. package/dist/orchestrator/src/cli/codexCliShell.js +119 -0
  15. package/dist/orchestrator/src/cli/codexDefaultsSetup.js +265 -36
  16. package/dist/orchestrator/src/cli/config/delegationConfig.js +317 -5
  17. package/dist/orchestrator/src/cli/config/repoConfigPolicy.js +2 -3
  18. package/dist/orchestrator/src/cli/config/userConfig.js +28 -13
  19. package/dist/orchestrator/src/cli/control/authenticatedControlRouteGate.js +69 -0
  20. package/dist/orchestrator/src/cli/control/authenticatedRouteComposition.js +267 -0
  21. package/dist/orchestrator/src/cli/control/authenticatedRouteController.js +5 -0
  22. package/dist/orchestrator/src/cli/control/authenticatedRouteDispatcher.js +41 -0
  23. package/dist/orchestrator/src/cli/control/compatibilityIssuePresenter.js +1035 -0
  24. package/dist/orchestrator/src/cli/control/confirmationApproveController.js +62 -0
  25. package/dist/orchestrator/src/cli/control/confirmationCreateController.js +69 -0
  26. package/dist/orchestrator/src/cli/control/confirmationIssueConsumeController.js +43 -0
  27. package/dist/orchestrator/src/cli/control/confirmationListController.js +22 -0
  28. package/dist/orchestrator/src/cli/control/confirmationValidateController.js +58 -0
  29. package/dist/orchestrator/src/cli/control/confirmations.js +25 -3
  30. package/dist/orchestrator/src/cli/control/controlActionCancelConfirmation.js +65 -0
  31. package/dist/orchestrator/src/cli/control/controlActionController.js +77 -0
  32. package/dist/orchestrator/src/cli/control/controlActionControllerSequencing.js +161 -0
  33. package/dist/orchestrator/src/cli/control/controlActionExecution.js +142 -0
  34. package/dist/orchestrator/src/cli/control/controlActionFinalization.js +43 -0
  35. package/dist/orchestrator/src/cli/control/controlActionOutcome.js +60 -0
  36. package/dist/orchestrator/src/cli/control/controlActionPreflight.js +476 -0
  37. package/dist/orchestrator/src/cli/control/controlAuthenticatedRouteHandoff.js +57 -0
  38. package/dist/orchestrator/src/cli/control/controlBootstrapAssembly.js +39 -0
  39. package/dist/orchestrator/src/cli/control/controlBootstrapMetadataPersistence.js +16 -0
  40. package/dist/orchestrator/src/cli/control/controlEventTransport.js +49 -0
  41. package/dist/orchestrator/src/cli/control/controlExpiryLifecycle.js +102 -0
  42. package/dist/orchestrator/src/cli/control/controlHostOwnership.js +480 -0
  43. package/dist/orchestrator/src/cli/control/controlHostSupervision.js +630 -0
  44. package/dist/orchestrator/src/cli/control/controlOversightFacade.js +8 -0
  45. package/dist/orchestrator/src/cli/control/controlOversightReadContract.js +1 -0
  46. package/dist/orchestrator/src/cli/control/controlOversightReadService.js +16 -0
  47. package/dist/orchestrator/src/cli/control/controlOversightUpdateContract.js +1 -0
  48. package/dist/orchestrator/src/cli/control/controlPersistenceFiles.js +6 -0
  49. package/dist/orchestrator/src/cli/control/controlQuestionChildResolution.js +18 -0
  50. package/dist/orchestrator/src/cli/control/controlRequestContext.js +42 -0
  51. package/dist/orchestrator/src/cli/control/controlRequestController.js +9 -0
  52. package/dist/orchestrator/src/cli/control/controlRequestPredispatch.js +17 -0
  53. package/dist/orchestrator/src/cli/control/controlRequestRouteDispatch.js +44 -0
  54. package/dist/orchestrator/src/cli/control/controlRuntime.js +1003 -0
  55. package/dist/orchestrator/src/cli/control/controlServer.js +23 -1456
  56. package/dist/orchestrator/src/cli/control/controlServerAuditAndErrorHelpers.js +115 -0
  57. package/dist/orchestrator/src/cli/control/controlServerAuthenticatedRouteBranch.js +29 -0
  58. package/dist/orchestrator/src/cli/control/controlServerBootstrapLifecycle.js +30 -0
  59. package/dist/orchestrator/src/cli/control/controlServerBootstrapStartSequence.js +21 -0
  60. package/dist/orchestrator/src/cli/control/controlServerOwnedRuntimeLifecycle.js +67 -0
  61. package/dist/orchestrator/src/cli/control/controlServerPublicLifecycle.js +756 -0
  62. package/dist/orchestrator/src/cli/control/controlServerPublicRouteHelpers.js +86 -0
  63. package/dist/orchestrator/src/cli/control/controlServerReadyInstanceLifecycle.js +25 -0
  64. package/dist/orchestrator/src/cli/control/controlServerReadyInstanceStartup.js +18 -0
  65. package/dist/orchestrator/src/cli/control/controlServerRequestBodyHelpers.js +37 -0
  66. package/dist/orchestrator/src/cli/control/controlServerRequestShell.js +40 -0
  67. package/dist/orchestrator/src/cli/control/controlServerRequestShellBinding.js +17 -0
  68. package/dist/orchestrator/src/cli/control/controlServerSeedLoading.js +27 -0
  69. package/dist/orchestrator/src/cli/control/controlServerSeededRuntimeAssembly.js +186 -0
  70. package/dist/orchestrator/src/cli/control/controlServerStartupInputPreparation.js +31 -0
  71. package/dist/orchestrator/src/cli/control/controlServerStartupSequence.js +49 -0
  72. package/dist/orchestrator/src/cli/control/controlState.js +233 -2
  73. package/dist/orchestrator/src/cli/control/controlStatusDashboard.js +1904 -0
  74. package/dist/orchestrator/src/cli/control/controlTelegramBridgeBootstrapLifecycle.js +22 -0
  75. package/dist/orchestrator/src/cli/control/controlTelegramBridgeLifecycle.js +67 -0
  76. package/dist/orchestrator/src/cli/control/controlTelegramBridgeOversightFacadeFactory.js +8 -0
  77. package/dist/orchestrator/src/cli/control/controlTelegramCommandController.js +49 -0
  78. package/dist/orchestrator/src/cli/control/controlTelegramDispatchRead.js +40 -0
  79. package/dist/orchestrator/src/cli/control/controlTelegramPollingController.js +89 -0
  80. package/dist/orchestrator/src/cli/control/controlTelegramProjectionNotificationController.js +29 -0
  81. package/dist/orchestrator/src/cli/control/controlTelegramPushState.js +63 -0
  82. package/dist/orchestrator/src/cli/control/controlTelegramQuestionRead.js +13 -0
  83. package/dist/orchestrator/src/cli/control/controlTelegramReadController.js +216 -0
  84. package/dist/orchestrator/src/cli/control/controlTelegramUpdateHandler.js +63 -0
  85. package/dist/orchestrator/src/cli/control/controlWatcher.js +73 -5
  86. package/dist/orchestrator/src/cli/control/delegationRegisterController.js +35 -0
  87. package/dist/orchestrator/src/cli/control/dynamicToolBridgePolicy.js +139 -0
  88. package/dist/orchestrator/src/cli/control/eventsSseController.js +12 -0
  89. package/dist/orchestrator/src/cli/control/linearBudgetState.js +1789 -0
  90. package/dist/orchestrator/src/cli/control/linearDispatchSource.js +1137 -0
  91. package/dist/orchestrator/src/cli/control/linearGraphqlClient.js +150 -0
  92. package/dist/orchestrator/src/cli/control/linearRateLimit.js +102 -0
  93. package/dist/orchestrator/src/cli/control/linearWebhookController.js +499 -0
  94. package/dist/orchestrator/src/cli/control/liveLinearAdvisoryRuntime.js +70 -0
  95. package/dist/orchestrator/src/cli/control/observabilityApiController.js +173 -0
  96. package/dist/orchestrator/src/cli/control/observabilityReadModel.js +500 -0
  97. package/dist/orchestrator/src/cli/control/observabilitySurface.js +284 -0
  98. package/dist/orchestrator/src/cli/control/observabilityUpdateNotifier.js +22 -0
  99. package/dist/orchestrator/src/cli/control/operatorDashboardPresenter.js +252 -0
  100. package/dist/orchestrator/src/cli/control/providerAgentCapacity.js +70 -0
  101. package/dist/orchestrator/src/cli/control/providerControlHostFreshnessGauge.js +1068 -0
  102. package/dist/orchestrator/src/cli/control/providerIntakeState.js +473 -0
  103. package/dist/orchestrator/src/cli/control/providerIssueHandoff.js +6811 -0
  104. package/dist/orchestrator/src/cli/control/providerIssueObservability.js +1348 -0
  105. package/dist/orchestrator/src/cli/control/providerIssueRetryQueue.js +84 -0
  106. package/dist/orchestrator/src/cli/control/providerLinearRuntimeProof.js +588 -0
  107. package/dist/orchestrator/src/cli/control/providerLinearScreenshotProof.js +473 -0
  108. package/dist/orchestrator/src/cli/control/providerLinearWorkerTruth.js +383 -0
  109. package/dist/orchestrator/src/cli/control/providerLinearWorkflowAudit.js +254 -0
  110. package/dist/orchestrator/src/cli/control/providerLinearWorkflowFacade.js +5573 -0
  111. package/dist/orchestrator/src/cli/control/providerLinearWorkflowStates.js +115 -0
  112. package/dist/orchestrator/src/cli/control/providerMergeCloseout.js +1868 -0
  113. package/dist/orchestrator/src/cli/control/providerOperatorAutopilot.js +1580 -0
  114. package/dist/orchestrator/src/cli/control/providerOperatorAutopilotLifecycle.js +154 -0
  115. package/dist/orchestrator/src/cli/control/providerOperatorAutopilotLocalRolloutExecution.js +1006 -0
  116. package/dist/orchestrator/src/cli/control/providerPollingHealth.js +435 -0
  117. package/dist/orchestrator/src/cli/control/providerTerminalCleanup.js +516 -0
  118. package/dist/orchestrator/src/cli/control/providerWorkerHosts.js +191 -0
  119. package/dist/orchestrator/src/cli/control/providerWorkflowConfigStore.js +515 -0
  120. package/dist/orchestrator/src/cli/control/questionChildResolutionAdapter.js +361 -0
  121. package/dist/orchestrator/src/cli/control/questionQueueController.js +181 -0
  122. package/dist/orchestrator/src/cli/control/questionReadRetryDeduplication.js +9 -0
  123. package/dist/orchestrator/src/cli/control/questionReadSequence.js +10 -0
  124. package/dist/orchestrator/src/cli/control/securityViolationController.js +27 -0
  125. package/dist/orchestrator/src/cli/control/selectedRunProjection.js +1885 -0
  126. package/dist/orchestrator/src/cli/control/telegramOversightApiClient.js +48 -0
  127. package/dist/orchestrator/src/cli/control/telegramOversightBridge.js +180 -0
  128. package/dist/orchestrator/src/cli/control/telegramOversightBridgeProjectionDeliveryQueue.js +25 -0
  129. package/dist/orchestrator/src/cli/control/telegramOversightBridgeRuntimeLifecycle.js +45 -0
  130. package/dist/orchestrator/src/cli/control/telegramOversightBridgeStateStore.js +77 -0
  131. package/dist/orchestrator/src/cli/control/telegramOversightControlActionApiClient.js +45 -0
  132. package/dist/orchestrator/src/cli/control/trackerDispatchPilot.js +439 -0
  133. package/dist/orchestrator/src/cli/control/uiDataController.js +34 -0
  134. package/dist/orchestrator/src/cli/control/uiSessionController.js +100 -0
  135. package/dist/orchestrator/src/cli/controlHostCliShell.js +860 -0
  136. package/dist/orchestrator/src/cli/controlHostFreshnessGaugeCliShell.js +129 -0
  137. package/dist/orchestrator/src/cli/controlHostSupervisionCliShell.js +2127 -0
  138. package/dist/orchestrator/src/cli/delegationCliShell.js +62 -0
  139. package/dist/orchestrator/src/cli/delegationServer.js +567 -678
  140. package/dist/orchestrator/src/cli/delegationServerCliShell.js +52 -0
  141. package/dist/orchestrator/src/cli/delegationServerQuestionFlowShell.js +228 -0
  142. package/dist/orchestrator/src/cli/delegationServerToolDispatchShell.js +411 -0
  143. package/dist/orchestrator/src/cli/delegationServerTransport.js +274 -0
  144. package/dist/orchestrator/src/cli/delegationSetup.js +51 -171
  145. package/dist/orchestrator/src/cli/devtoolsCliShell.js +34 -0
  146. package/dist/orchestrator/src/cli/doctor.js +678 -164
  147. package/dist/orchestrator/src/cli/doctorCliRequestShell.js +72 -0
  148. package/dist/orchestrator/src/cli/doctorCliShell.js +138 -0
  149. package/dist/orchestrator/src/cli/doctorUsage.js +119 -15
  150. package/dist/orchestrator/src/cli/exec/experience.js +16 -2
  151. package/dist/orchestrator/src/cli/exec/summary.js +3 -0
  152. package/dist/orchestrator/src/cli/execCliShell.js +51 -0
  153. package/dist/orchestrator/src/cli/flowCliRequestShell.js +44 -0
  154. package/dist/orchestrator/src/cli/flowCliShell.js +239 -0
  155. package/dist/orchestrator/src/cli/frontendTestCliRequestShell.js +80 -0
  156. package/dist/orchestrator/src/cli/frontendTestCliShell.js +41 -0
  157. package/dist/orchestrator/src/cli/init.js +95 -1
  158. package/dist/orchestrator/src/cli/initCliShell.js +50 -0
  159. package/dist/orchestrator/src/cli/linearCliShell.js +1200 -0
  160. package/dist/orchestrator/src/cli/mcpEnableCliShell.js +132 -0
  161. package/dist/orchestrator/src/cli/metrics/metricsAggregator.js +3 -2
  162. package/dist/orchestrator/src/cli/metrics/metricsRecorder.js +56 -0
  163. package/dist/orchestrator/src/cli/orchestrator.js +66 -1376
  164. package/dist/orchestrator/src/cli/planCliShell.js +19 -0
  165. package/dist/orchestrator/src/cli/prCliShell.js +41 -0
  166. package/dist/orchestrator/src/cli/providerLinearChildLanePhaseContract.js +204 -0
  167. package/dist/orchestrator/src/cli/providerLinearChildLaneRunner.js +1835 -0
  168. package/dist/orchestrator/src/cli/providerLinearChildLaneShell.js +2420 -0
  169. package/dist/orchestrator/src/cli/providerLinearChildStreamShell.js +385 -0
  170. package/dist/orchestrator/src/cli/providerLinearWorkerRunner.js +6834 -0
  171. package/dist/orchestrator/src/cli/resumeCliShell.js +14 -0
  172. package/dist/orchestrator/src/cli/reviewCliLaunchShell.js +72 -0
  173. package/dist/orchestrator/src/cli/rlm/alignment.js +3 -3
  174. package/dist/orchestrator/src/cli/rlm/context.js +94 -7
  175. package/dist/orchestrator/src/cli/rlm/rlmCodexRuntimeShell.js +546 -0
  176. package/dist/orchestrator/src/cli/rlm/symbolic.js +4 -2
  177. package/dist/orchestrator/src/cli/rlmCliRequestShell.js +42 -0
  178. package/dist/orchestrator/src/cli/rlmCompletionCliShell.js +46 -0
  179. package/dist/orchestrator/src/cli/rlmLaunchCliShell.js +51 -0
  180. package/dist/orchestrator/src/cli/rlmRunner.js +83 -523
  181. package/dist/orchestrator/src/cli/run/blockMemory.js +500 -0
  182. package/dist/orchestrator/src/cli/run/manifest.js +410 -73
  183. package/dist/orchestrator/src/cli/run/manifestPersister.js +45 -14
  184. package/dist/orchestrator/src/cli/run/runMemoryController.js +216 -0
  185. package/dist/orchestrator/src/cli/run/source0.js +690 -0
  186. package/dist/orchestrator/src/cli/run/workspacePath.js +101 -0
  187. package/dist/orchestrator/src/cli/runtime/mode.js +2 -1
  188. package/dist/orchestrator/src/cli/runtime/provider.js +39 -2
  189. package/dist/orchestrator/src/cli/selfCheckCliShell.js +12 -0
  190. package/dist/orchestrator/src/cli/services/commandRunner.js +698 -18
  191. package/dist/orchestrator/src/cli/services/execRuntime.js +66 -1
  192. package/dist/orchestrator/src/cli/services/orchestratorAutoScoutEvidenceRecorder.js +71 -0
  193. package/dist/orchestrator/src/cli/services/orchestratorCloudBranchResolution.js +8 -0
  194. package/dist/orchestrator/src/cli/services/orchestratorCloudEnvironmentResolution.js +22 -0
  195. package/dist/orchestrator/src/cli/services/orchestratorCloudExecutionLifecycleShell.js +39 -0
  196. package/dist/orchestrator/src/cli/services/orchestratorCloudPromptBuilder.js +37 -0
  197. package/dist/orchestrator/src/cli/services/orchestratorCloudRouteFallbackContract.js +45 -0
  198. package/dist/orchestrator/src/cli/services/orchestratorCloudRouteShell.js +36 -0
  199. package/dist/orchestrator/src/cli/services/orchestratorCloudTargetExecutor.js +277 -0
  200. package/dist/orchestrator/src/cli/services/orchestratorControlPlaneLifecycle.js +98 -0
  201. package/dist/orchestrator/src/cli/services/orchestratorControlPlaneLifecycleShell.js +54 -0
  202. package/dist/orchestrator/src/cli/services/orchestratorExecutionLifecycle.js +112 -0
  203. package/dist/orchestrator/src/cli/services/orchestratorExecutionModePolicy.js +27 -0
  204. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteAdapterShell.js +59 -0
  205. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteDecisionShell.js +57 -0
  206. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteState.js +21 -0
  207. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouter.js +2 -0
  208. package/dist/orchestrator/src/cli/services/orchestratorLocalPipelineExecutor.js +149 -0
  209. package/dist/orchestrator/src/cli/services/orchestratorLocalRouteShell.js +63 -0
  210. package/dist/orchestrator/src/cli/services/orchestratorPlanShell.js +54 -0
  211. package/dist/orchestrator/src/cli/services/orchestratorPlanTargetTracker.js +16 -0
  212. package/dist/orchestrator/src/cli/services/orchestratorResumePreparationShell.js +84 -0
  213. package/dist/orchestrator/src/cli/services/orchestratorResumeTokenValidation.js +15 -0
  214. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleCompletion.js +31 -0
  215. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleExecutionRegistration.js +37 -0
  216. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleOrchestrationShell.js +83 -0
  217. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleTaskManagerShell.js +37 -0
  218. package/dist/orchestrator/src/cli/services/orchestratorRuntimeManifestMutation.js +20 -0
  219. package/dist/orchestrator/src/cli/services/orchestratorStartPreparationShell.js +56 -0
  220. package/dist/orchestrator/src/cli/services/orchestratorStatusShell.js +70 -0
  221. package/dist/orchestrator/src/cli/services/pipelineResolver.js +7 -3
  222. package/dist/orchestrator/src/cli/services/plannerMemory.js +119 -0
  223. package/dist/orchestrator/src/cli/services/runPreparation.js +7 -3
  224. package/dist/orchestrator/src/cli/services/runSummaryWriter.js +9 -0
  225. package/dist/orchestrator/src/cli/setupBootstrapShell.js +114 -0
  226. package/dist/orchestrator/src/cli/setupCliShell.js +51 -0
  227. package/dist/orchestrator/src/cli/skillsCliShell.js +56 -0
  228. package/dist/orchestrator/src/cli/startCliRequestShell.js +53 -0
  229. package/dist/orchestrator/src/cli/startCliShell.js +68 -0
  230. package/dist/orchestrator/src/cli/statusCliShell.js +22 -0
  231. package/dist/orchestrator/src/cli/utils/authProvenanceFingerprint.js +27 -0
  232. package/dist/orchestrator/src/cli/utils/cloudPreflight.js +285 -7
  233. package/dist/orchestrator/src/cli/utils/codexFeatures.js +60 -0
  234. package/dist/orchestrator/src/cli/utils/delegationConfigParser.js +250 -0
  235. package/dist/orchestrator/src/cli/utils/delegationMcpHealth.js +1382 -0
  236. package/dist/orchestrator/src/cli/utils/devtools.js +2 -54
  237. package/dist/orchestrator/src/cli/utils/mcpServerEntry.js +53 -0
  238. package/dist/orchestrator/src/cli/utils/packageProgramResolver.js +151 -0
  239. package/dist/orchestrator/src/cli/utils/providerOverrideEnv.js +71 -0
  240. package/dist/orchestrator/src/cli/utils/trailingJsonObject.js +59 -0
  241. package/dist/orchestrator/src/learning/crystalizer.js +2 -2
  242. package/dist/orchestrator/src/manager.js +74 -4
  243. package/dist/orchestrator/src/persistence/ExperienceStore.js +233 -49
  244. package/dist/orchestrator/src/persistence/TaskStateStore.js +6 -6
  245. package/dist/orchestrator/src/persistence/lockFile.js +70 -4
  246. package/dist/orchestrator/src/persistence/sanitizeIdentifier.js +39 -0
  247. package/dist/orchestrator/src/sync/createCloudSyncWorker.js +3 -2
  248. package/dist/orchestrator/src/utils/atomicWrite.js +17 -2
  249. package/dist/packages/orchestrator/src/exec/unified-exec.js +99 -6
  250. package/dist/packages/orchestrator/src/instructions/promptPacks.js +150 -19
  251. package/dist/packages/sdk-node/src/orchestrator.js +137 -13
  252. package/dist/packages/shared/config/designConfig.js +8 -1
  253. package/dist/packages/shared/streams/stdio.js +1 -1
  254. package/dist/scripts/design/pipeline/permit.js +15 -0
  255. package/dist/scripts/lib/docs-catalog.js +399 -0
  256. package/dist/scripts/lib/docs-helpers.js +87 -5
  257. package/dist/scripts/lib/pr-watch-merge.js +1088 -80
  258. package/dist/scripts/lib/provider-run-contract.js +26 -0
  259. package/dist/scripts/lib/review-command-intent-classification.js +532 -0
  260. package/dist/scripts/lib/review-command-probe-classification.js +385 -0
  261. package/dist/scripts/lib/review-execution-boundary-preflight.js +279 -0
  262. package/dist/scripts/lib/review-execution-runtime.js +753 -0
  263. package/dist/scripts/lib/review-execution-state.js +1144 -0
  264. package/dist/scripts/lib/review-execution-telemetry.js +215 -0
  265. package/dist/scripts/lib/review-inspection-target-parsing.js +78 -0
  266. package/dist/scripts/lib/review-launch-attempt.js +601 -0
  267. package/dist/scripts/lib/review-meta-surface-boundary-analysis.js +300 -0
  268. package/dist/scripts/lib/review-meta-surface-normalization.js +746 -0
  269. package/dist/scripts/lib/review-non-interactive-handoff.js +61 -0
  270. package/dist/scripts/lib/review-prompt-context.js +376 -0
  271. package/dist/scripts/lib/review-scope-advisory.js +286 -0
  272. package/dist/scripts/lib/review-scope-paths.js +123 -0
  273. package/dist/scripts/lib/review-shell-command-parser.js +389 -0
  274. package/dist/scripts/lib/review-shell-env-interpreter.js +340 -0
  275. package/dist/scripts/lib/run-manifests.js +192 -36
  276. package/dist/scripts/lib/spark-policy-classifier.js +593 -0
  277. package/dist/scripts/run-review.js +507 -1777
  278. package/docs/README.md +43 -20
  279. package/docs/book/README.md +19 -0
  280. package/docs/book/codex-cli-0124-adoption.md +68 -0
  281. package/docs/book/local-hook-impact.md +73 -0
  282. package/docs/book/operations.md +60 -0
  283. package/docs/book/public-posture.md +34 -0
  284. package/docs/book/setup.md +91 -0
  285. package/docs/book/skills.md +11 -0
  286. package/docs/guides/codex-version-policy.md +104 -0
  287. package/docs/public/downstream-setup.md +113 -0
  288. package/docs/public/provider-onboarding.md +173 -0
  289. package/package.json +23 -10
  290. package/plugins/codex-orchestrator/.codex-plugin/plugin.json +30 -0
  291. package/plugins/codex-orchestrator/.mcp.json +13 -0
  292. package/plugins/codex-orchestrator/launcher.mjs +361 -0
  293. package/schemas/manifest.json +411 -0
  294. package/skills/README.md +26 -0
  295. package/skills/collab-subagents-first/SKILL.md +1 -1
  296. package/skills/delegation-usage/DELEGATION_GUIDE.md +30 -12
  297. package/skills/delegation-usage/SKILL.md +25 -14
  298. package/skills/land/SKILL.md +77 -0
  299. package/skills/linear/SKILL.md +255 -0
  300. package/skills/release/SKILL.md +47 -3
  301. package/skills/standalone-review/SKILL.md +6 -1
  302. package/templates/README.md +4 -2
  303. package/templates/codex/.codex/agents/awaiter-high.toml +2 -2
  304. package/templates/codex/.codex/agents/worker-complex.toml +1 -1
  305. package/templates/codex/.codex/config.toml +3 -4
  306. package/templates/codex/.codex/providers/README.md +13 -0
  307. package/templates/codex/.codex/providers/control.example.json +18 -0
  308. package/templates/codex/.codex/providers/provider.env.example +15 -0
  309. package/templates/codex/AGENTS.md +15 -8
  310. package/templates/codex/mcp-client.json +5 -1
  311. package/docs/assets/setup.gif +0 -0
@@ -0,0 +1,439 @@
1
+ import { hasLinearApiCredentials, hasLinearSourceBinding, resolveLinearSourceSetup, resolveLiveLinearDispatchRecommendation } from './linearDispatchSource.js';
2
+ export function evaluateTrackerDispatchPilot(input) {
3
+ const resolved = resolveDispatchPilotPolicy(input.featureToggles ?? null);
4
+ const enabled = readBooleanValue(resolved.policy, 'enabled') ?? false;
5
+ const killSwitch = readBooleanValue(resolved.policy, 'kill_switch', 'killSwitch') ?? false;
6
+ const source = parseDispatchPilotSource(resolved.policy, input.defaultIssueIdentifier ?? null);
7
+ if (!enabled) {
8
+ return buildDisabledEvaluation(resolved.configured, killSwitch);
9
+ }
10
+ if (killSwitch) {
11
+ return buildKillSwitchedEvaluation(resolved.configured, source);
12
+ }
13
+ if (source.kind === 'live_linear') {
14
+ const sourceSetup = resolveLinearSourceSetup(source.sourceSetup, input.env ?? process.env);
15
+ if (!hasLinearSourceBinding(sourceSetup)) {
16
+ return buildFailureEvaluation({
17
+ configured: resolved.configured,
18
+ sourceStatus: 'malformed',
19
+ reason: 'dispatch_source_binding_missing',
20
+ status: 422,
21
+ code: 'dispatch_source_malformed',
22
+ sourceSetup
23
+ });
24
+ }
25
+ if (!hasLinearApiCredentials(input.env)) {
26
+ return buildFailureEvaluation({
27
+ configured: resolved.configured,
28
+ sourceStatus: 'unavailable',
29
+ reason: 'dispatch_source_credentials_missing',
30
+ status: 503,
31
+ code: 'dispatch_source_unavailable',
32
+ sourceSetup
33
+ });
34
+ }
35
+ return buildFailureEvaluation({
36
+ configured: resolved.configured,
37
+ sourceStatus: 'unavailable',
38
+ reason: 'dispatch_source_live_requires_async_evaluation',
39
+ status: 503,
40
+ code: 'dispatch_source_unavailable',
41
+ sourceSetup
42
+ });
43
+ }
44
+ if (source.kind === 'unavailable') {
45
+ return buildFailureEvaluation({
46
+ configured: resolved.configured,
47
+ sourceStatus: 'unavailable',
48
+ reason: 'dispatch_source_unavailable',
49
+ status: 503,
50
+ code: 'dispatch_source_unavailable',
51
+ sourceSetup: null
52
+ });
53
+ }
54
+ if (source.kind === 'malformed') {
55
+ return buildFailureEvaluation({
56
+ configured: resolved.configured,
57
+ sourceStatus: 'malformed',
58
+ reason: source.reason,
59
+ status: 422,
60
+ code: 'dispatch_source_malformed',
61
+ sourceSetup: null
62
+ });
63
+ }
64
+ return buildReadyEvaluation({
65
+ configured: resolved.configured,
66
+ recommendation: source.recommendation,
67
+ sourceSetup: source.sourceSetup
68
+ });
69
+ }
70
+ export function summarizeTrackerDispatchPilotPolicy(input) {
71
+ const resolved = resolveDispatchPilotPolicy(input.featureToggles ?? null);
72
+ const enabled = readBooleanValue(resolved.policy, 'enabled') ?? false;
73
+ const killSwitch = readBooleanValue(resolved.policy, 'kill_switch', 'killSwitch') ?? false;
74
+ const source = parseDispatchPilotSource(resolved.policy, null);
75
+ if (!enabled) {
76
+ return buildDisabledSummary(resolved.configured, killSwitch);
77
+ }
78
+ if (killSwitch) {
79
+ return buildKillSwitchedSummary(resolved.configured, source);
80
+ }
81
+ if (source.kind === 'unavailable') {
82
+ return buildFailureSummary({
83
+ configured: resolved.configured,
84
+ sourceStatus: 'unavailable',
85
+ reason: 'dispatch_source_unavailable',
86
+ sourceSetup: null
87
+ });
88
+ }
89
+ if (source.kind === 'malformed') {
90
+ return buildFailureSummary({
91
+ configured: resolved.configured,
92
+ sourceStatus: 'malformed',
93
+ reason: source.reason,
94
+ sourceSetup: null
95
+ });
96
+ }
97
+ if (source.kind === 'live_linear') {
98
+ const sourceSetup = resolveLinearSourceSetup(source.sourceSetup, input.env ?? process.env);
99
+ if (!hasLinearSourceBinding(sourceSetup)) {
100
+ return buildFailureSummary({
101
+ configured: resolved.configured,
102
+ sourceStatus: 'malformed',
103
+ reason: 'dispatch_source_binding_missing',
104
+ sourceSetup
105
+ });
106
+ }
107
+ if (!hasLinearApiCredentials(input.env)) {
108
+ return buildFailureSummary({
109
+ configured: resolved.configured,
110
+ sourceStatus: 'unavailable',
111
+ reason: 'dispatch_source_credentials_missing',
112
+ sourceSetup
113
+ });
114
+ }
115
+ return buildReadySummary({
116
+ configured: resolved.configured,
117
+ sourceSetup,
118
+ reason: 'dispatch_source_live_deferred'
119
+ });
120
+ }
121
+ return buildReadySummary({
122
+ configured: resolved.configured,
123
+ sourceSetup: source.sourceSetup,
124
+ reason: 'recommendation_available'
125
+ });
126
+ }
127
+ export async function evaluateTrackerDispatchPilotAsync(input) {
128
+ const resolved = resolveDispatchPilotPolicy(input.featureToggles ?? null);
129
+ const enabled = readBooleanValue(resolved.policy, 'enabled') ?? false;
130
+ const killSwitch = readBooleanValue(resolved.policy, 'kill_switch', 'killSwitch') ?? false;
131
+ const source = parseDispatchPilotSource(resolved.policy, input.defaultIssueIdentifier ?? null);
132
+ if (!enabled) {
133
+ return buildDisabledEvaluation(resolved.configured, killSwitch);
134
+ }
135
+ if (killSwitch) {
136
+ return buildKillSwitchedEvaluation(resolved.configured, source);
137
+ }
138
+ if (source.kind === 'unavailable') {
139
+ return buildFailureEvaluation({
140
+ configured: resolved.configured,
141
+ sourceStatus: 'unavailable',
142
+ reason: 'dispatch_source_unavailable',
143
+ status: 503,
144
+ code: 'dispatch_source_unavailable',
145
+ sourceSetup: null
146
+ });
147
+ }
148
+ if (source.kind === 'malformed') {
149
+ return buildFailureEvaluation({
150
+ configured: resolved.configured,
151
+ sourceStatus: 'malformed',
152
+ reason: source.reason,
153
+ status: 422,
154
+ code: 'dispatch_source_malformed',
155
+ sourceSetup: null
156
+ });
157
+ }
158
+ if (source.kind === 'ready') {
159
+ return buildReadyEvaluation({
160
+ configured: resolved.configured,
161
+ recommendation: source.recommendation,
162
+ sourceSetup: source.sourceSetup
163
+ });
164
+ }
165
+ const liveResolution = await resolveLiveLinearDispatchRecommendation({
166
+ source: source.source,
167
+ sourceSetup: source.sourceSetup,
168
+ defaultIssueIdentifier: input.defaultIssueIdentifier ?? null,
169
+ env: input.env,
170
+ fetchImpl: input.fetchImpl
171
+ });
172
+ if (liveResolution.kind !== 'ready') {
173
+ if (liveResolution.kind === 'unavailable' &&
174
+ liveResolution.reason === 'dispatch_source_issue_not_found') {
175
+ return {
176
+ summary: buildReadySummary({
177
+ configured: resolved.configured,
178
+ sourceSetup: source.sourceSetup,
179
+ reason: 'dispatch_source_no_eligible_issue'
180
+ }),
181
+ recommendation: null,
182
+ failure: null
183
+ };
184
+ }
185
+ return buildFailureEvaluation({
186
+ configured: resolved.configured,
187
+ sourceStatus: liveResolution.kind === 'malformed' ? 'malformed' : 'unavailable',
188
+ reason: liveResolution.reason,
189
+ status: liveResolution.status,
190
+ code: liveResolution.code,
191
+ sourceSetup: liveResolution.kind === 'malformed' ? source.sourceSetup : source.sourceSetup
192
+ });
193
+ }
194
+ return buildReadyEvaluation({
195
+ configured: resolved.configured,
196
+ sourceSetup: liveResolution.source_setup,
197
+ recommendation: {
198
+ issue_identifier: liveResolution.tracked_issue.identifier ?? input.defaultIssueIdentifier ?? null,
199
+ dispatch_id: liveResolution.dispatch_id,
200
+ summary: liveResolution.summary,
201
+ rationale: liveResolution.rationale,
202
+ confidence: liveResolution.confidence,
203
+ generated_at: liveResolution.generated_at,
204
+ source_setup: liveResolution.source_setup,
205
+ tracked_issue: liveResolution.tracked_issue
206
+ }
207
+ });
208
+ }
209
+ function buildDisabledEvaluation(configured, killSwitch) {
210
+ return {
211
+ summary: buildDisabledSummary(configured, killSwitch),
212
+ recommendation: null,
213
+ failure: null
214
+ };
215
+ }
216
+ function buildKillSwitchedEvaluation(configured, source) {
217
+ return {
218
+ summary: buildKillSwitchedSummary(configured, source),
219
+ recommendation: null,
220
+ failure: null
221
+ };
222
+ }
223
+ function buildReadyEvaluation(input) {
224
+ return {
225
+ summary: buildReadySummary({
226
+ configured: input.configured,
227
+ sourceSetup: input.sourceSetup,
228
+ reason: 'recommendation_available'
229
+ }),
230
+ recommendation: input.recommendation,
231
+ failure: null
232
+ };
233
+ }
234
+ function buildFailureEvaluation(input) {
235
+ return {
236
+ summary: buildFailureSummary({
237
+ configured: input.configured,
238
+ sourceStatus: input.sourceStatus,
239
+ reason: input.reason,
240
+ sourceSetup: input.sourceSetup
241
+ }),
242
+ recommendation: null,
243
+ failure: {
244
+ status: input.status,
245
+ code: input.code,
246
+ reason: input.reason
247
+ }
248
+ };
249
+ }
250
+ function buildDisabledSummary(configured, killSwitch) {
251
+ return {
252
+ advisory_only: true,
253
+ configured,
254
+ enabled: false,
255
+ kill_switch: killSwitch,
256
+ status: 'disabled',
257
+ source_status: 'disabled',
258
+ reason: 'pilot_disabled_default_off',
259
+ source_setup: null
260
+ };
261
+ }
262
+ function buildKillSwitchedSummary(configured, source) {
263
+ return {
264
+ advisory_only: true,
265
+ configured,
266
+ enabled: true,
267
+ kill_switch: true,
268
+ status: 'kill_switched',
269
+ source_status: 'blocked',
270
+ reason: 'pilot_kill_switch_enabled',
271
+ source_setup: source.kind === 'ready' || source.kind === 'live_linear' ? source.sourceSetup : null
272
+ };
273
+ }
274
+ function buildReadySummary(input) {
275
+ return {
276
+ advisory_only: true,
277
+ configured: input.configured,
278
+ enabled: true,
279
+ kill_switch: false,
280
+ status: 'ready',
281
+ source_status: 'ready',
282
+ reason: input.reason,
283
+ source_setup: input.sourceSetup
284
+ };
285
+ }
286
+ function buildFailureSummary(input) {
287
+ return {
288
+ advisory_only: true,
289
+ configured: input.configured,
290
+ enabled: true,
291
+ kill_switch: false,
292
+ status: input.sourceStatus === 'unavailable' ? 'source_unavailable' : 'source_malformed',
293
+ source_status: input.sourceStatus,
294
+ reason: input.reason,
295
+ source_setup: input.sourceSetup
296
+ };
297
+ }
298
+ function resolveDispatchPilotPolicy(featureToggles) {
299
+ const toggles = featureToggles ?? {};
300
+ const direct = readRecordValue(toggles, 'dispatch_pilot');
301
+ const coordinator = readRecordValue(toggles, 'coordinator');
302
+ const nested = coordinator ? readRecordValue(coordinator, 'dispatch_pilot') : undefined;
303
+ if (nested) {
304
+ return { policy: nested, configured: true };
305
+ }
306
+ if (direct) {
307
+ return { policy: direct, configured: true };
308
+ }
309
+ return { policy: {}, configured: false };
310
+ }
311
+ function parseDispatchPilotSource(policy, defaultIssueIdentifier) {
312
+ if (!Object.prototype.hasOwnProperty.call(policy, 'source')) {
313
+ return { kind: 'unavailable' };
314
+ }
315
+ const rawSource = policy.source;
316
+ if (!rawSource || typeof rawSource !== 'object' || Array.isArray(rawSource)) {
317
+ return { kind: 'malformed', reason: 'dispatch_source_not_object' };
318
+ }
319
+ const source = rawSource;
320
+ const provider = readStringValue(source, 'provider', 'source_provider', 'sourceProvider');
321
+ const normalizedProvider = normalizeDispatchSourceProvider(provider);
322
+ if (!normalizedProvider) {
323
+ return {
324
+ kind: 'malformed',
325
+ reason: provider ? 'dispatch_source_provider_unsupported' : 'dispatch_source_provider_missing'
326
+ };
327
+ }
328
+ const bindingSource = readRecordValue(source, 'linear') ?? source;
329
+ const sourceSetup = {
330
+ provider: normalizedProvider,
331
+ workspace_id: readStringValue(bindingSource, 'workspace_id', 'workspaceId') ?? null,
332
+ team_id: readStringValue(bindingSource, 'team_id', 'teamId') ?? null,
333
+ project_id: readStringValue(bindingSource, 'project_id', 'projectId') ?? null
334
+ };
335
+ const confidence = readNumberValue(source, 'confidence', 'score') ?? null;
336
+ if (confidence !== null && (confidence < 0 || confidence > 1)) {
337
+ return { kind: 'malformed', reason: 'dispatch_source_confidence_out_of_range' };
338
+ }
339
+ if (isLiveDispatchSource(source)) {
340
+ return {
341
+ kind: 'live_linear',
342
+ source,
343
+ sourceSetup
344
+ };
345
+ }
346
+ if (!sourceSetup.workspace_id && !sourceSetup.team_id && !sourceSetup.project_id) {
347
+ return {
348
+ kind: 'malformed',
349
+ reason: 'dispatch_source_binding_missing'
350
+ };
351
+ }
352
+ const summary = readStringValue(source, 'summary', 'dispatch_summary', 'dispatchSummary');
353
+ if (!summary) {
354
+ return { kind: 'malformed', reason: 'dispatch_source_summary_missing' };
355
+ }
356
+ const dispatchId = readStringValue(source, 'dispatch_id', 'dispatchId') ?? 'dispatch-advisory';
357
+ const issueIdentifier = readStringValue(source, 'issue_identifier', 'issueIdentifier') ?? defaultIssueIdentifier;
358
+ const rationale = readStringValue(source, 'rationale', 'reason') ?? null;
359
+ const generatedAtRaw = readStringValue(source, 'generated_at', 'generatedAt');
360
+ let generatedAt = null;
361
+ if (generatedAtRaw) {
362
+ const generatedAtMs = Date.parse(generatedAtRaw);
363
+ if (!Number.isFinite(generatedAtMs)) {
364
+ return { kind: 'malformed', reason: 'dispatch_source_generated_at_invalid' };
365
+ }
366
+ generatedAt = new Date(generatedAtMs).toISOString();
367
+ }
368
+ return {
369
+ kind: 'ready',
370
+ recommendation: {
371
+ issue_identifier: issueIdentifier ?? null,
372
+ dispatch_id: dispatchId,
373
+ summary,
374
+ rationale,
375
+ confidence,
376
+ generated_at: generatedAt,
377
+ source_setup: sourceSetup,
378
+ tracked_issue: null
379
+ },
380
+ sourceSetup
381
+ };
382
+ }
383
+ function isLiveDispatchSource(source) {
384
+ if (readBooleanValue(source, 'live')) {
385
+ return true;
386
+ }
387
+ const mode = readStringValue(source, 'mode', 'source_mode', 'sourceMode');
388
+ return Boolean(mode && mode.trim().toLowerCase() === 'live');
389
+ }
390
+ export function normalizeDispatchSourceProvider(value) {
391
+ if (!value) {
392
+ return null;
393
+ }
394
+ const normalized = value.trim().toLowerCase();
395
+ if (normalized === 'linear' || normalized === 'linear_advisory') {
396
+ return 'linear';
397
+ }
398
+ return null;
399
+ }
400
+ function readStringValue(record, ...keys) {
401
+ for (const key of keys) {
402
+ const value = record[key];
403
+ if (typeof value === 'string' && value.trim().length > 0) {
404
+ return value.trim();
405
+ }
406
+ }
407
+ return undefined;
408
+ }
409
+ function readBooleanValue(record, ...keys) {
410
+ for (const key of keys) {
411
+ const value = record[key];
412
+ if (typeof value === 'boolean') {
413
+ return value;
414
+ }
415
+ }
416
+ return undefined;
417
+ }
418
+ function readNumberValue(record, ...keys) {
419
+ for (const key of keys) {
420
+ const value = record[key];
421
+ if (typeof value === 'number' && Number.isFinite(value)) {
422
+ return value;
423
+ }
424
+ if (typeof value === 'string' && value.trim().length > 0) {
425
+ const parsed = Number(value);
426
+ if (Number.isFinite(parsed)) {
427
+ return parsed;
428
+ }
429
+ }
430
+ }
431
+ return undefined;
432
+ }
433
+ function readRecordValue(record, key) {
434
+ const value = record[key];
435
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
436
+ return value;
437
+ }
438
+ return undefined;
439
+ }
@@ -0,0 +1,34 @@
1
+ import { readUiDataset } from './operatorDashboardPresenter.js';
2
+ import { buildCompatibilityErrorResponse } from './observabilitySurface.js';
3
+ const UI_DATA_PATH = '/ui/data.json';
4
+ const JSON_NO_STORE_HEADERS = { 'Content-Type': 'application/json', 'Cache-Control': 'no-store' };
5
+ export async function handleUiDataRequest(context) {
6
+ const method = context.req.method ?? 'GET';
7
+ const pathname = new URL(context.req.url ?? '/', 'http://localhost').pathname;
8
+ if (pathname !== UI_DATA_PATH) {
9
+ return false;
10
+ }
11
+ if (method !== 'GET') {
12
+ writeUiDataResponse(context.res, buildCompatibilityErrorResponse({
13
+ status: 405,
14
+ code: 'method_not_allowed',
15
+ message: 'Method not allowed',
16
+ details: {
17
+ surface: 'ui',
18
+ route: UI_DATA_PATH,
19
+ allowed_method: 'GET'
20
+ }
21
+ }));
22
+ return true;
23
+ }
24
+ writeUiDataResponse(context.res, {
25
+ status: 200,
26
+ headers: JSON_NO_STORE_HEADERS,
27
+ body: await readUiDataset(context.presenterContext)
28
+ });
29
+ return true;
30
+ }
31
+ function writeUiDataResponse(res, response) {
32
+ res.writeHead(response.status, response.headers);
33
+ res.end(JSON.stringify(response.body));
34
+ }
@@ -0,0 +1,100 @@
1
+ const UI_SESSION_PATH = '/auth/session';
2
+ const JSON_HEADERS = { 'Content-Type': 'application/json' };
3
+ const JSON_NO_STORE_HEADERS = { ...JSON_HEADERS, 'Cache-Control': 'no-store' };
4
+ const LOOPBACK_HOSTS = new Set(['127.0.0.1', 'localhost', '::1']);
5
+ export function handleControlUiSessionAdmission(context) {
6
+ return handleUiSessionRequest({
7
+ req: context.req,
8
+ res: context.res,
9
+ allowedHosts: normalizeAllowedHosts(context.allowedBindHosts),
10
+ issueSession: context.issueSession,
11
+ isLoopbackAddress
12
+ });
13
+ }
14
+ export function handleUiSessionRequest(context) {
15
+ const method = context.req.method ?? 'GET';
16
+ const pathname = new URL(context.req.url ?? '/', 'http://localhost').pathname;
17
+ if (pathname !== UI_SESSION_PATH || (method !== 'GET' && method !== 'POST')) {
18
+ return false;
19
+ }
20
+ if (!context.isLoopbackAddress(context.req.socket.remoteAddress)) {
21
+ writeJsonResponse(context.res, 403, { error: 'loopback_only' });
22
+ return true;
23
+ }
24
+ const hostHeader = parseHostHeader(context.req.headers.host);
25
+ if (!hostHeader || !context.allowedHosts.has(hostHeader)) {
26
+ writeJsonResponse(context.res, 403, { error: 'host_not_allowed' });
27
+ return true;
28
+ }
29
+ const originHost = parseOriginHost(context.req.headers.origin);
30
+ if (originHost) {
31
+ if (!context.allowedHosts.has(originHost)) {
32
+ writeJsonResponse(context.res, 403, { error: 'origin_not_allowed' });
33
+ return true;
34
+ }
35
+ }
36
+ else if (method !== 'GET') {
37
+ writeJsonResponse(context.res, 403, { error: 'origin_required' });
38
+ return true;
39
+ }
40
+ const session = context.issueSession();
41
+ writeJsonResponse(context.res, 200, {
42
+ token: session.token,
43
+ expires_at: session.expiresAt
44
+ }, JSON_NO_STORE_HEADERS);
45
+ return true;
46
+ }
47
+ export function isLoopbackAddress(address) {
48
+ if (!address) {
49
+ return false;
50
+ }
51
+ if (LOOPBACK_HOSTS.has(address)) {
52
+ return true;
53
+ }
54
+ if (address.startsWith('::ffff:')) {
55
+ return address.slice(7) === '127.0.0.1';
56
+ }
57
+ return false;
58
+ }
59
+ function writeJsonResponse(res, statusCode, body, headers = JSON_HEADERS) {
60
+ res.writeHead(statusCode, headers);
61
+ res.end(JSON.stringify(body));
62
+ }
63
+ function parseHostHeader(value) {
64
+ if (!value) {
65
+ return null;
66
+ }
67
+ const trimmed = value.trim();
68
+ if (!trimmed) {
69
+ return null;
70
+ }
71
+ if (trimmed.startsWith('[')) {
72
+ const end = trimmed.indexOf(']');
73
+ if (end === -1) {
74
+ return null;
75
+ }
76
+ return trimmed.slice(1, end).toLowerCase();
77
+ }
78
+ const parts = trimmed.split(':');
79
+ if (parts.length > 2) {
80
+ return trimmed.toLowerCase();
81
+ }
82
+ const host = parts[0]?.trim();
83
+ return host ? host.toLowerCase() : null;
84
+ }
85
+ function parseOriginHost(value) {
86
+ if (!value) {
87
+ return null;
88
+ }
89
+ try {
90
+ const parsed = new URL(value);
91
+ return parsed.hostname.toLowerCase();
92
+ }
93
+ catch {
94
+ return null;
95
+ }
96
+ }
97
+ function normalizeAllowedHosts(allowedHosts) {
98
+ const values = allowedHosts && allowedHosts.length > 0 ? allowedHosts : Array.from(LOOPBACK_HOSTS);
99
+ return new Set(values.map((entry) => entry.toLowerCase()));
100
+ }