@kbediako/codex-orchestrator 0.1.38 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/plugins/marketplace.json +20 -0
- package/README.md +70 -301
- package/bin/codex-orchestrator.js +161 -0
- package/codex.orchestrator.json +149 -13
- package/dist/bin/codex-orchestrator.js +795 -1154
- package/dist/orchestrator/src/cli/adapters/CommandPlanner.js +22 -4
- package/dist/orchestrator/src/cli/adapters/CommandReviewer.js +3 -3
- package/dist/orchestrator/src/cli/adapters/CommandTester.js +2 -2
- package/dist/orchestrator/src/cli/adapters/cloudFailureDiagnostics.js +183 -11
- package/dist/orchestrator/src/cli/coStatusAttachCliShell.js +402 -0
- package/dist/orchestrator/src/cli/coStatusCliShell.js +429 -0
- package/dist/orchestrator/src/cli/coStatusOperatorAutopilotCliShell.js +120 -0
- package/dist/orchestrator/src/cli/codexCliShell.js +72 -0
- package/dist/orchestrator/src/cli/codexDefaultsSetup.js +49 -11
- package/dist/orchestrator/src/cli/config/delegationConfig.js +317 -5
- package/dist/orchestrator/src/cli/config/repoConfigPolicy.js +2 -3
- package/dist/orchestrator/src/cli/config/userConfig.js +28 -13
- package/dist/orchestrator/src/cli/control/authenticatedControlRouteGate.js +69 -0
- package/dist/orchestrator/src/cli/control/authenticatedRouteComposition.js +267 -0
- package/dist/orchestrator/src/cli/control/authenticatedRouteController.js +5 -0
- package/dist/orchestrator/src/cli/control/authenticatedRouteDispatcher.js +41 -0
- package/dist/orchestrator/src/cli/control/compatibilityIssuePresenter.js +1035 -0
- package/dist/orchestrator/src/cli/control/confirmationApproveController.js +62 -0
- package/dist/orchestrator/src/cli/control/confirmationCreateController.js +69 -0
- package/dist/orchestrator/src/cli/control/confirmationIssueConsumeController.js +43 -0
- package/dist/orchestrator/src/cli/control/confirmationListController.js +22 -0
- package/dist/orchestrator/src/cli/control/confirmationValidateController.js +58 -0
- package/dist/orchestrator/src/cli/control/confirmations.js +25 -3
- package/dist/orchestrator/src/cli/control/controlActionCancelConfirmation.js +65 -0
- package/dist/orchestrator/src/cli/control/controlActionController.js +77 -0
- package/dist/orchestrator/src/cli/control/controlActionControllerSequencing.js +161 -0
- package/dist/orchestrator/src/cli/control/controlActionExecution.js +142 -0
- package/dist/orchestrator/src/cli/control/controlActionFinalization.js +43 -0
- package/dist/orchestrator/src/cli/control/controlActionOutcome.js +60 -0
- package/dist/orchestrator/src/cli/control/controlActionPreflight.js +476 -0
- package/dist/orchestrator/src/cli/control/controlAuthenticatedRouteHandoff.js +57 -0
- package/dist/orchestrator/src/cli/control/controlBootstrapAssembly.js +39 -0
- package/dist/orchestrator/src/cli/control/controlBootstrapMetadataPersistence.js +16 -0
- package/dist/orchestrator/src/cli/control/controlEventTransport.js +49 -0
- package/dist/orchestrator/src/cli/control/controlExpiryLifecycle.js +102 -0
- package/dist/orchestrator/src/cli/control/controlHostOwnership.js +480 -0
- package/dist/orchestrator/src/cli/control/controlHostSupervision.js +608 -0
- package/dist/orchestrator/src/cli/control/controlOversightFacade.js +8 -0
- package/dist/orchestrator/src/cli/control/controlOversightReadContract.js +1 -0
- package/dist/orchestrator/src/cli/control/controlOversightReadService.js +16 -0
- package/dist/orchestrator/src/cli/control/controlOversightUpdateContract.js +1 -0
- package/dist/orchestrator/src/cli/control/controlPersistenceFiles.js +6 -0
- package/dist/orchestrator/src/cli/control/controlQuestionChildResolution.js +18 -0
- package/dist/orchestrator/src/cli/control/controlRequestContext.js +42 -0
- package/dist/orchestrator/src/cli/control/controlRequestController.js +9 -0
- package/dist/orchestrator/src/cli/control/controlRequestPredispatch.js +17 -0
- package/dist/orchestrator/src/cli/control/controlRequestRouteDispatch.js +44 -0
- package/dist/orchestrator/src/cli/control/controlRuntime.js +992 -0
- package/dist/orchestrator/src/cli/control/controlServer.js +23 -1456
- package/dist/orchestrator/src/cli/control/controlServerAuditAndErrorHelpers.js +115 -0
- package/dist/orchestrator/src/cli/control/controlServerAuthenticatedRouteBranch.js +29 -0
- package/dist/orchestrator/src/cli/control/controlServerBootstrapLifecycle.js +30 -0
- package/dist/orchestrator/src/cli/control/controlServerBootstrapStartSequence.js +21 -0
- package/dist/orchestrator/src/cli/control/controlServerOwnedRuntimeLifecycle.js +67 -0
- package/dist/orchestrator/src/cli/control/controlServerPublicLifecycle.js +756 -0
- package/dist/orchestrator/src/cli/control/controlServerPublicRouteHelpers.js +86 -0
- package/dist/orchestrator/src/cli/control/controlServerReadyInstanceLifecycle.js +25 -0
- package/dist/orchestrator/src/cli/control/controlServerReadyInstanceStartup.js +18 -0
- package/dist/orchestrator/src/cli/control/controlServerRequestBodyHelpers.js +37 -0
- package/dist/orchestrator/src/cli/control/controlServerRequestShell.js +40 -0
- package/dist/orchestrator/src/cli/control/controlServerRequestShellBinding.js +17 -0
- package/dist/orchestrator/src/cli/control/controlServerSeedLoading.js +27 -0
- package/dist/orchestrator/src/cli/control/controlServerSeededRuntimeAssembly.js +186 -0
- package/dist/orchestrator/src/cli/control/controlServerStartupInputPreparation.js +31 -0
- package/dist/orchestrator/src/cli/control/controlServerStartupSequence.js +49 -0
- package/dist/orchestrator/src/cli/control/controlState.js +233 -2
- package/dist/orchestrator/src/cli/control/controlStatusDashboard.js +1899 -0
- package/dist/orchestrator/src/cli/control/controlTelegramBridgeBootstrapLifecycle.js +22 -0
- package/dist/orchestrator/src/cli/control/controlTelegramBridgeLifecycle.js +67 -0
- package/dist/orchestrator/src/cli/control/controlTelegramBridgeOversightFacadeFactory.js +8 -0
- package/dist/orchestrator/src/cli/control/controlTelegramCommandController.js +49 -0
- package/dist/orchestrator/src/cli/control/controlTelegramDispatchRead.js +40 -0
- package/dist/orchestrator/src/cli/control/controlTelegramPollingController.js +89 -0
- package/dist/orchestrator/src/cli/control/controlTelegramProjectionNotificationController.js +29 -0
- package/dist/orchestrator/src/cli/control/controlTelegramPushState.js +63 -0
- package/dist/orchestrator/src/cli/control/controlTelegramQuestionRead.js +13 -0
- package/dist/orchestrator/src/cli/control/controlTelegramReadController.js +216 -0
- package/dist/orchestrator/src/cli/control/controlTelegramUpdateHandler.js +63 -0
- package/dist/orchestrator/src/cli/control/controlWatcher.js +73 -5
- package/dist/orchestrator/src/cli/control/delegationRegisterController.js +35 -0
- package/dist/orchestrator/src/cli/control/dynamicToolBridgePolicy.js +139 -0
- package/dist/orchestrator/src/cli/control/eventsSseController.js +12 -0
- package/dist/orchestrator/src/cli/control/linearBudgetState.js +1789 -0
- package/dist/orchestrator/src/cli/control/linearDispatchSource.js +1137 -0
- package/dist/orchestrator/src/cli/control/linearGraphqlClient.js +150 -0
- package/dist/orchestrator/src/cli/control/linearRateLimit.js +102 -0
- package/dist/orchestrator/src/cli/control/linearWebhookController.js +499 -0
- package/dist/orchestrator/src/cli/control/liveLinearAdvisoryRuntime.js +70 -0
- package/dist/orchestrator/src/cli/control/observabilityApiController.js +173 -0
- package/dist/orchestrator/src/cli/control/observabilityReadModel.js +500 -0
- package/dist/orchestrator/src/cli/control/observabilitySurface.js +284 -0
- package/dist/orchestrator/src/cli/control/observabilityUpdateNotifier.js +22 -0
- package/dist/orchestrator/src/cli/control/operatorDashboardPresenter.js +252 -0
- package/dist/orchestrator/src/cli/control/providerAgentCapacity.js +70 -0
- package/dist/orchestrator/src/cli/control/providerControlHostFreshnessGauge.js +1068 -0
- package/dist/orchestrator/src/cli/control/providerIntakeState.js +473 -0
- package/dist/orchestrator/src/cli/control/providerIssueHandoff.js +6811 -0
- package/dist/orchestrator/src/cli/control/providerIssueObservability.js +1348 -0
- package/dist/orchestrator/src/cli/control/providerIssueRetryQueue.js +84 -0
- package/dist/orchestrator/src/cli/control/providerLinearRuntimeProof.js +588 -0
- package/dist/orchestrator/src/cli/control/providerLinearScreenshotProof.js +473 -0
- package/dist/orchestrator/src/cli/control/providerLinearWorkerTruth.js +383 -0
- package/dist/orchestrator/src/cli/control/providerLinearWorkflowAudit.js +254 -0
- package/dist/orchestrator/src/cli/control/providerLinearWorkflowFacade.js +5573 -0
- package/dist/orchestrator/src/cli/control/providerLinearWorkflowStates.js +115 -0
- package/dist/orchestrator/src/cli/control/providerMergeCloseout.js +1868 -0
- package/dist/orchestrator/src/cli/control/providerOperatorAutopilot.js +1580 -0
- package/dist/orchestrator/src/cli/control/providerOperatorAutopilotLifecycle.js +154 -0
- package/dist/orchestrator/src/cli/control/providerOperatorAutopilotLocalRolloutExecution.js +1006 -0
- package/dist/orchestrator/src/cli/control/providerPollingHealth.js +435 -0
- package/dist/orchestrator/src/cli/control/providerTerminalCleanup.js +516 -0
- package/dist/orchestrator/src/cli/control/providerWorkerHosts.js +191 -0
- package/dist/orchestrator/src/cli/control/providerWorkflowConfigStore.js +515 -0
- package/dist/orchestrator/src/cli/control/questionChildResolutionAdapter.js +361 -0
- package/dist/orchestrator/src/cli/control/questionQueueController.js +181 -0
- package/dist/orchestrator/src/cli/control/questionReadRetryDeduplication.js +9 -0
- package/dist/orchestrator/src/cli/control/questionReadSequence.js +10 -0
- package/dist/orchestrator/src/cli/control/securityViolationController.js +27 -0
- package/dist/orchestrator/src/cli/control/selectedRunProjection.js +1838 -0
- package/dist/orchestrator/src/cli/control/telegramOversightApiClient.js +48 -0
- package/dist/orchestrator/src/cli/control/telegramOversightBridge.js +180 -0
- package/dist/orchestrator/src/cli/control/telegramOversightBridgeProjectionDeliveryQueue.js +25 -0
- package/dist/orchestrator/src/cli/control/telegramOversightBridgeRuntimeLifecycle.js +45 -0
- package/dist/orchestrator/src/cli/control/telegramOversightBridgeStateStore.js +77 -0
- package/dist/orchestrator/src/cli/control/telegramOversightControlActionApiClient.js +45 -0
- package/dist/orchestrator/src/cli/control/trackerDispatchPilot.js +439 -0
- package/dist/orchestrator/src/cli/control/uiDataController.js +34 -0
- package/dist/orchestrator/src/cli/control/uiSessionController.js +100 -0
- package/dist/orchestrator/src/cli/controlHostCliShell.js +860 -0
- package/dist/orchestrator/src/cli/controlHostFreshnessGaugeCliShell.js +129 -0
- package/dist/orchestrator/src/cli/controlHostSupervisionCliShell.js +2127 -0
- package/dist/orchestrator/src/cli/delegationCliShell.js +62 -0
- package/dist/orchestrator/src/cli/delegationServer.js +567 -678
- package/dist/orchestrator/src/cli/delegationServerCliShell.js +52 -0
- package/dist/orchestrator/src/cli/delegationServerQuestionFlowShell.js +228 -0
- package/dist/orchestrator/src/cli/delegationServerToolDispatchShell.js +411 -0
- package/dist/orchestrator/src/cli/delegationServerTransport.js +274 -0
- package/dist/orchestrator/src/cli/delegationSetup.js +51 -171
- package/dist/orchestrator/src/cli/devtoolsCliShell.js +34 -0
- package/dist/orchestrator/src/cli/doctor.js +542 -122
- package/dist/orchestrator/src/cli/doctorCliRequestShell.js +72 -0
- package/dist/orchestrator/src/cli/doctorCliShell.js +138 -0
- package/dist/orchestrator/src/cli/doctorUsage.js +119 -15
- package/dist/orchestrator/src/cli/exec/experience.js +16 -2
- package/dist/orchestrator/src/cli/exec/summary.js +3 -0
- package/dist/orchestrator/src/cli/execCliShell.js +51 -0
- package/dist/orchestrator/src/cli/flowCliRequestShell.js +44 -0
- package/dist/orchestrator/src/cli/flowCliShell.js +239 -0
- package/dist/orchestrator/src/cli/frontendTestCliRequestShell.js +80 -0
- package/dist/orchestrator/src/cli/frontendTestCliShell.js +41 -0
- package/dist/orchestrator/src/cli/init.js +1 -0
- package/dist/orchestrator/src/cli/initCliShell.js +50 -0
- package/dist/orchestrator/src/cli/linearCliShell.js +1200 -0
- package/dist/orchestrator/src/cli/mcpEnableCliShell.js +132 -0
- package/dist/orchestrator/src/cli/metrics/metricsAggregator.js +3 -2
- package/dist/orchestrator/src/cli/metrics/metricsRecorder.js +56 -0
- package/dist/orchestrator/src/cli/orchestrator.js +66 -1376
- package/dist/orchestrator/src/cli/planCliShell.js +19 -0
- package/dist/orchestrator/src/cli/prCliShell.js +41 -0
- package/dist/orchestrator/src/cli/providerLinearChildLanePhaseContract.js +204 -0
- package/dist/orchestrator/src/cli/providerLinearChildLaneRunner.js +1772 -0
- package/dist/orchestrator/src/cli/providerLinearChildLaneShell.js +2420 -0
- package/dist/orchestrator/src/cli/providerLinearChildStreamShell.js +385 -0
- package/dist/orchestrator/src/cli/providerLinearWorkerRunner.js +5738 -0
- package/dist/orchestrator/src/cli/resumeCliShell.js +14 -0
- package/dist/orchestrator/src/cli/reviewCliLaunchShell.js +72 -0
- package/dist/orchestrator/src/cli/rlm/alignment.js +3 -3
- package/dist/orchestrator/src/cli/rlm/context.js +94 -7
- package/dist/orchestrator/src/cli/rlm/rlmCodexRuntimeShell.js +546 -0
- package/dist/orchestrator/src/cli/rlm/symbolic.js +4 -2
- package/dist/orchestrator/src/cli/rlmCliRequestShell.js +42 -0
- package/dist/orchestrator/src/cli/rlmCompletionCliShell.js +46 -0
- package/dist/orchestrator/src/cli/rlmLaunchCliShell.js +51 -0
- package/dist/orchestrator/src/cli/rlmRunner.js +83 -523
- package/dist/orchestrator/src/cli/run/blockMemory.js +500 -0
- package/dist/orchestrator/src/cli/run/manifest.js +410 -73
- package/dist/orchestrator/src/cli/run/manifestPersister.js +45 -14
- package/dist/orchestrator/src/cli/run/runMemoryController.js +216 -0
- package/dist/orchestrator/src/cli/run/source0.js +690 -0
- package/dist/orchestrator/src/cli/run/workspacePath.js +101 -0
- package/dist/orchestrator/src/cli/runtime/mode.js +2 -1
- package/dist/orchestrator/src/cli/runtime/provider.js +39 -2
- package/dist/orchestrator/src/cli/selfCheckCliShell.js +12 -0
- package/dist/orchestrator/src/cli/services/commandRunner.js +667 -18
- package/dist/orchestrator/src/cli/services/execRuntime.js +66 -1
- package/dist/orchestrator/src/cli/services/orchestratorAutoScoutEvidenceRecorder.js +71 -0
- package/dist/orchestrator/src/cli/services/orchestratorCloudBranchResolution.js +8 -0
- package/dist/orchestrator/src/cli/services/orchestratorCloudEnvironmentResolution.js +22 -0
- package/dist/orchestrator/src/cli/services/orchestratorCloudExecutionLifecycleShell.js +39 -0
- package/dist/orchestrator/src/cli/services/orchestratorCloudPromptBuilder.js +37 -0
- package/dist/orchestrator/src/cli/services/orchestratorCloudRouteFallbackContract.js +45 -0
- package/dist/orchestrator/src/cli/services/orchestratorCloudRouteShell.js +36 -0
- package/dist/orchestrator/src/cli/services/orchestratorCloudTargetExecutor.js +277 -0
- package/dist/orchestrator/src/cli/services/orchestratorControlPlaneLifecycle.js +98 -0
- package/dist/orchestrator/src/cli/services/orchestratorControlPlaneLifecycleShell.js +54 -0
- package/dist/orchestrator/src/cli/services/orchestratorExecutionLifecycle.js +112 -0
- package/dist/orchestrator/src/cli/services/orchestratorExecutionModePolicy.js +27 -0
- package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteAdapterShell.js +59 -0
- package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteDecisionShell.js +57 -0
- package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteState.js +21 -0
- package/dist/orchestrator/src/cli/services/orchestratorExecutionRouter.js +2 -0
- package/dist/orchestrator/src/cli/services/orchestratorLocalPipelineExecutor.js +149 -0
- package/dist/orchestrator/src/cli/services/orchestratorLocalRouteShell.js +63 -0
- package/dist/orchestrator/src/cli/services/orchestratorPlanShell.js +54 -0
- package/dist/orchestrator/src/cli/services/orchestratorPlanTargetTracker.js +16 -0
- package/dist/orchestrator/src/cli/services/orchestratorResumePreparationShell.js +84 -0
- package/dist/orchestrator/src/cli/services/orchestratorResumeTokenValidation.js +15 -0
- package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleCompletion.js +31 -0
- package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleExecutionRegistration.js +37 -0
- package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleOrchestrationShell.js +83 -0
- package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleTaskManagerShell.js +37 -0
- package/dist/orchestrator/src/cli/services/orchestratorRuntimeManifestMutation.js +20 -0
- package/dist/orchestrator/src/cli/services/orchestratorStartPreparationShell.js +56 -0
- package/dist/orchestrator/src/cli/services/orchestratorStatusShell.js +70 -0
- package/dist/orchestrator/src/cli/services/pipelineResolver.js +7 -3
- package/dist/orchestrator/src/cli/services/plannerMemory.js +119 -0
- package/dist/orchestrator/src/cli/services/runPreparation.js +7 -3
- package/dist/orchestrator/src/cli/services/runSummaryWriter.js +9 -0
- package/dist/orchestrator/src/cli/setupBootstrapShell.js +114 -0
- package/dist/orchestrator/src/cli/setupCliShell.js +51 -0
- package/dist/orchestrator/src/cli/skillsCliShell.js +56 -0
- package/dist/orchestrator/src/cli/startCliRequestShell.js +53 -0
- package/dist/orchestrator/src/cli/startCliShell.js +68 -0
- package/dist/orchestrator/src/cli/statusCliShell.js +22 -0
- package/dist/orchestrator/src/cli/utils/authProvenanceFingerprint.js +27 -0
- package/dist/orchestrator/src/cli/utils/cloudPreflight.js +83 -1
- package/dist/orchestrator/src/cli/utils/delegationConfigParser.js +250 -0
- package/dist/orchestrator/src/cli/utils/delegationMcpHealth.js +1382 -0
- package/dist/orchestrator/src/cli/utils/devtools.js +2 -54
- package/dist/orchestrator/src/cli/utils/mcpServerEntry.js +53 -0
- package/dist/orchestrator/src/cli/utils/packageProgramResolver.js +151 -0
- package/dist/orchestrator/src/cli/utils/providerOverrideEnv.js +71 -0
- package/dist/orchestrator/src/cli/utils/trailingJsonObject.js +59 -0
- package/dist/orchestrator/src/learning/crystalizer.js +2 -2
- package/dist/orchestrator/src/persistence/ExperienceStore.js +233 -49
- package/dist/orchestrator/src/persistence/TaskStateStore.js +6 -6
- package/dist/orchestrator/src/persistence/lockFile.js +70 -4
- package/dist/orchestrator/src/persistence/sanitizeIdentifier.js +39 -0
- package/dist/orchestrator/src/sync/createCloudSyncWorker.js +3 -2
- package/dist/orchestrator/src/utils/atomicWrite.js +17 -2
- package/dist/packages/orchestrator/src/exec/unified-exec.js +99 -6
- package/dist/packages/orchestrator/src/instructions/promptPacks.js +150 -19
- package/dist/packages/sdk-node/src/orchestrator.js +137 -13
- package/dist/packages/shared/config/designConfig.js +8 -1
- package/dist/packages/shared/streams/stdio.js +1 -1
- package/dist/scripts/design/pipeline/permit.js +15 -0
- package/dist/scripts/lib/docs-catalog.js +365 -0
- package/dist/scripts/lib/docs-helpers.js +87 -5
- package/dist/scripts/lib/pr-watch-merge.js +1088 -80
- package/dist/scripts/lib/provider-run-contract.js +26 -0
- package/dist/scripts/lib/review-command-intent-classification.js +532 -0
- package/dist/scripts/lib/review-command-probe-classification.js +385 -0
- package/dist/scripts/lib/review-execution-boundary-preflight.js +279 -0
- package/dist/scripts/lib/review-execution-runtime.js +753 -0
- package/dist/scripts/lib/review-execution-state.js +1144 -0
- package/dist/scripts/lib/review-execution-telemetry.js +215 -0
- package/dist/scripts/lib/review-inspection-target-parsing.js +78 -0
- package/dist/scripts/lib/review-launch-attempt.js +601 -0
- package/dist/scripts/lib/review-meta-surface-boundary-analysis.js +300 -0
- package/dist/scripts/lib/review-meta-surface-normalization.js +746 -0
- package/dist/scripts/lib/review-non-interactive-handoff.js +61 -0
- package/dist/scripts/lib/review-prompt-context.js +376 -0
- package/dist/scripts/lib/review-scope-advisory.js +286 -0
- package/dist/scripts/lib/review-scope-paths.js +123 -0
- package/dist/scripts/lib/review-shell-command-parser.js +389 -0
- package/dist/scripts/lib/review-shell-env-interpreter.js +340 -0
- package/dist/scripts/lib/run-manifests.js +192 -36
- package/dist/scripts/lib/spark-policy-classifier.js +593 -0
- package/dist/scripts/run-review.js +507 -1777
- package/docs/public/downstream-setup.md +106 -0
- package/docs/public/provider-onboarding.md +173 -0
- package/package.json +20 -10
- package/plugins/codex-orchestrator/.codex-plugin/plugin.json +30 -0
- package/plugins/codex-orchestrator/.mcp.json +13 -0
- package/plugins/codex-orchestrator/launcher.mjs +359 -0
- package/schemas/manifest.json +394 -0
- package/skills/collab-subagents-first/SKILL.md +1 -1
- package/skills/delegation-usage/DELEGATION_GUIDE.md +24 -11
- package/skills/delegation-usage/SKILL.md +19 -13
- package/skills/land/SKILL.md +77 -0
- package/skills/linear/SKILL.md +255 -0
- package/skills/release/SKILL.md +47 -3
- package/skills/standalone-review/SKILL.md +6 -1
- package/templates/README.md +4 -2
- package/templates/codex/.codex/agents/awaiter-high.toml +2 -2
- package/templates/codex/.codex/agents/worker-complex.toml +1 -1
- package/templates/codex/.codex/config.toml +3 -4
- package/templates/codex/.codex/providers/README.md +13 -0
- package/templates/codex/.codex/providers/control.example.json +18 -0
- package/templates/codex/.codex/providers/provider.env.example +15 -0
- package/templates/codex/AGENTS.md +12 -7
- package/templates/codex/mcp-client.json +5 -1
- package/docs/README.md +0 -310
- package/docs/assets/setup.gif +0 -0
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
export function createEmptyReviewShellEnvState(initialEnvVarPaths = new Map()) {
|
|
2
|
+
const shellVars = new Map();
|
|
3
|
+
for (const [envVar, envPath] of initialEnvVarPaths.entries()) {
|
|
4
|
+
shellVars.set(envVar, envPath);
|
|
5
|
+
}
|
|
6
|
+
return {
|
|
7
|
+
shellVars,
|
|
8
|
+
exportedVars: new Set(shellVars.keys()),
|
|
9
|
+
blockedEnvVars: new Set()
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export function buildCommandEnvAssignments(shellEnvState, rawTokens, dependencies) {
|
|
13
|
+
const envAssignments = commandUsesCleanEnvironment(rawTokens, dependencies)
|
|
14
|
+
? new Map()
|
|
15
|
+
: mergeEnvAssignments(shellEnvState.shellVars, new Map());
|
|
16
|
+
for (const envVar of shellEnvState.blockedEnvVars) {
|
|
17
|
+
envAssignments.delete(envVar);
|
|
18
|
+
}
|
|
19
|
+
return mergeEnvAssignments(envAssignments, collectInlineEnvAssignments(rawTokens, dependencies));
|
|
20
|
+
}
|
|
21
|
+
export function buildNestedShellEnvState(shellEnvState, rawTokens, dependencies) {
|
|
22
|
+
const blockedEnvVars = buildBlockedEnvVarSet(shellEnvState, rawTokens, dependencies);
|
|
23
|
+
const usesCleanEnvironment = commandUsesCleanEnvironment(rawTokens, dependencies);
|
|
24
|
+
const shellVars = new Map();
|
|
25
|
+
if (!usesCleanEnvironment) {
|
|
26
|
+
for (const envVar of shellEnvState.exportedVars) {
|
|
27
|
+
if (blockedEnvVars.has(envVar)) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const value = shellEnvState.shellVars.get(envVar);
|
|
31
|
+
if (value !== undefined) {
|
|
32
|
+
shellVars.set(envVar, value);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
for (const [key, value] of collectInlineEnvAssignments(rawTokens, dependencies).entries()) {
|
|
37
|
+
shellVars.set(key, value);
|
|
38
|
+
blockedEnvVars.delete(key);
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
shellVars,
|
|
42
|
+
exportedVars: new Set(shellVars.keys()),
|
|
43
|
+
blockedEnvVars
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export function updateReviewShellEnvStateForSegment(shellEnvState, rawTokens, dependencies, shellDialect = 'other') {
|
|
47
|
+
const nextState = cloneReviewShellEnvState(shellEnvState);
|
|
48
|
+
const leadingAssignments = collectLeadingShellAssignments(rawTokens);
|
|
49
|
+
const strippedTokens = dependencies.stripLeadingEnvAssignments(rawTokens);
|
|
50
|
+
if (strippedTokens.length === 0) {
|
|
51
|
+
for (const [key, value] of leadingAssignments.entries()) {
|
|
52
|
+
nextState.shellVars.set(key, value);
|
|
53
|
+
nextState.blockedEnvVars.delete(key);
|
|
54
|
+
}
|
|
55
|
+
return nextState;
|
|
56
|
+
}
|
|
57
|
+
const tokens = dependencies.unwrapEnvCommandTokens(strippedTokens);
|
|
58
|
+
if (tokens.length === 0) {
|
|
59
|
+
return nextState;
|
|
60
|
+
}
|
|
61
|
+
const command = dependencies.normalizeCommandToken(tokens[0] ?? '');
|
|
62
|
+
if (command === 'export') {
|
|
63
|
+
const exportTokens = tokens.slice(1);
|
|
64
|
+
const bashLikeUnexportMode = shellDialect === 'bashlike' && exportTokens.includes('-n');
|
|
65
|
+
if (shellDialect === 'bashlike' && !bashLikeUnexportMode) {
|
|
66
|
+
applyBashLikeLeadingBareExportAssignments(nextState, exportTokens, leadingAssignments);
|
|
67
|
+
}
|
|
68
|
+
applyExportTokensToReviewShellEnvState(nextState, exportTokens, leadingAssignments, dependencies, shellDialect);
|
|
69
|
+
return nextState;
|
|
70
|
+
}
|
|
71
|
+
if (command === 'unset') {
|
|
72
|
+
applyUnsetTokensToReviewShellEnvState(nextState, tokens.slice(1));
|
|
73
|
+
return nextState;
|
|
74
|
+
}
|
|
75
|
+
return nextState;
|
|
76
|
+
}
|
|
77
|
+
export function collectInlineEnvAssignments(tokens, dependencies) {
|
|
78
|
+
const assignments = new Map();
|
|
79
|
+
let index = 0;
|
|
80
|
+
while (index < tokens.length && /^[A-Za-z_][A-Za-z0-9_]*=.*/u.test(tokens[index] ?? '')) {
|
|
81
|
+
recordInlineEnvAssignment(assignments, tokens[index] ?? '');
|
|
82
|
+
index += 1;
|
|
83
|
+
}
|
|
84
|
+
if (dependencies.normalizeCommandToken(tokens[index] ?? '') !== 'env') {
|
|
85
|
+
return assignments;
|
|
86
|
+
}
|
|
87
|
+
index += 1;
|
|
88
|
+
while (index < tokens.length) {
|
|
89
|
+
const token = tokens[index] ?? '';
|
|
90
|
+
const normalized = token.toLowerCase();
|
|
91
|
+
if (token === '--') {
|
|
92
|
+
index += 1;
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
if (/^[A-Za-z_][A-Za-z0-9_]*=.*/u.test(token)) {
|
|
96
|
+
recordInlineEnvAssignment(assignments, token);
|
|
97
|
+
index += 1;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (normalized === '-u' || normalized === '--unset') {
|
|
101
|
+
index += 2;
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (normalized.startsWith('--unset=')) {
|
|
105
|
+
index += 1;
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (token.startsWith('-')) {
|
|
109
|
+
index += 1;
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
return assignments;
|
|
115
|
+
}
|
|
116
|
+
function cloneReviewShellEnvState(shellEnvState) {
|
|
117
|
+
return {
|
|
118
|
+
shellVars: new Map(shellEnvState.shellVars),
|
|
119
|
+
exportedVars: new Set(shellEnvState.exportedVars),
|
|
120
|
+
blockedEnvVars: new Set(shellEnvState.blockedEnvVars)
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function buildBlockedEnvVarSet(shellEnvState, rawTokens, dependencies) {
|
|
124
|
+
const blockedEnvVars = new Set(shellEnvState.blockedEnvVars);
|
|
125
|
+
for (const envVar of collectInlineEnvUnsetVars(rawTokens, dependencies)) {
|
|
126
|
+
blockedEnvVars.add(envVar);
|
|
127
|
+
}
|
|
128
|
+
for (const envVar of collectInlineEnvAssignments(rawTokens, dependencies).keys()) {
|
|
129
|
+
blockedEnvVars.delete(envVar);
|
|
130
|
+
}
|
|
131
|
+
return blockedEnvVars;
|
|
132
|
+
}
|
|
133
|
+
function collectLeadingShellAssignments(tokens) {
|
|
134
|
+
const assignments = new Map();
|
|
135
|
+
let index = 0;
|
|
136
|
+
while (index < tokens.length && /^[A-Za-z_][A-Za-z0-9_]*=.*/u.test(tokens[index] ?? '')) {
|
|
137
|
+
recordInlineEnvAssignment(assignments, tokens[index] ?? '');
|
|
138
|
+
index += 1;
|
|
139
|
+
}
|
|
140
|
+
return assignments;
|
|
141
|
+
}
|
|
142
|
+
function applyBashLikeLeadingBareExportAssignments(shellEnvState, tokens, leadingAssignments) {
|
|
143
|
+
if (leadingAssignments.size === 0) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const bareExportTargets = new Set();
|
|
147
|
+
for (const token of tokens) {
|
|
148
|
+
if (!token || token.startsWith('-') || /^[A-Za-z_][A-Za-z0-9_]*=.*/u.test(token)) {
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
const normalized = token.trim().replace(/^\$/u, '').replace(/[{}]/gu, '').toUpperCase();
|
|
152
|
+
if (normalized) {
|
|
153
|
+
bareExportTargets.add(normalized);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
for (const [key, value] of leadingAssignments.entries()) {
|
|
157
|
+
if (!bareExportTargets.has(key)) {
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
shellEnvState.shellVars.set(key, value);
|
|
161
|
+
shellEnvState.exportedVars.add(key);
|
|
162
|
+
shellEnvState.blockedEnvVars.delete(key);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function applyExportTokensToReviewShellEnvState(shellEnvState, tokens, leadingAssignments, dependencies, shellDialect) {
|
|
166
|
+
let bashLikeExportMode = 'export';
|
|
167
|
+
for (const token of tokens) {
|
|
168
|
+
if (!token) {
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
if (shellDialect === 'bashlike' && token === '-n') {
|
|
172
|
+
bashLikeExportMode = 'unexport';
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
if (token === '--') {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
if (/^[A-Za-z_][A-Za-z0-9_]*=.*/u.test(token)) {
|
|
179
|
+
if (bashLikeExportMode === 'unexport') {
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
const assignments = new Map();
|
|
183
|
+
recordInlineEnvAssignment(assignments, token);
|
|
184
|
+
for (const [key, value] of assignments.entries()) {
|
|
185
|
+
let resolvedValue = value;
|
|
186
|
+
const normalizedInlineEnvVar = dependencies.normalizeAuditMetaSurfaceEnvVar(value);
|
|
187
|
+
if (normalizedInlineEnvVar) {
|
|
188
|
+
const expansionEnv = new Map(shellEnvState.shellVars);
|
|
189
|
+
for (const [leadingKey, leadingValue] of leadingAssignments.entries()) {
|
|
190
|
+
if (leadingKey !== key) {
|
|
191
|
+
expansionEnv.set(leadingKey, leadingValue);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const currentValue = expansionEnv.get(normalizedInlineEnvVar);
|
|
195
|
+
resolvedValue = currentValue ?? '';
|
|
196
|
+
}
|
|
197
|
+
shellEnvState.shellVars.set(key, resolvedValue);
|
|
198
|
+
shellEnvState.exportedVars.add(key);
|
|
199
|
+
shellEnvState.blockedEnvVars.delete(key);
|
|
200
|
+
}
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
if (token.startsWith('-')) {
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
const normalized = token.trim().replace(/^\$/u, '').replace(/[{}]/gu, '').toUpperCase();
|
|
207
|
+
if (!normalized) {
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
if (bashLikeExportMode === 'unexport') {
|
|
211
|
+
shellEnvState.exportedVars.delete(normalized);
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
if (shellEnvState.shellVars.has(normalized)) {
|
|
215
|
+
shellEnvState.exportedVars.add(normalized);
|
|
216
|
+
shellEnvState.blockedEnvVars.delete(normalized);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
function applyUnsetTokensToReviewShellEnvState(shellEnvState, tokens) {
|
|
221
|
+
for (const token of tokens) {
|
|
222
|
+
if (!token || token.startsWith('-')) {
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
const normalized = token.trim().replace(/^\$/u, '').replace(/[{}]/gu, '').toUpperCase();
|
|
226
|
+
if (!normalized) {
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
shellEnvState.shellVars.delete(normalized);
|
|
230
|
+
shellEnvState.exportedVars.delete(normalized);
|
|
231
|
+
shellEnvState.blockedEnvVars.add(normalized);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
function commandUsesCleanEnvironment(tokens, dependencies) {
|
|
235
|
+
let index = 0;
|
|
236
|
+
while (index < tokens.length && /^[A-Za-z_][A-Za-z0-9_]*=.*/u.test(tokens[index] ?? '')) {
|
|
237
|
+
index += 1;
|
|
238
|
+
}
|
|
239
|
+
if (dependencies.normalizeCommandToken(tokens[index] ?? '') !== 'env') {
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
index += 1;
|
|
243
|
+
while (index < tokens.length) {
|
|
244
|
+
const token = tokens[index] ?? '';
|
|
245
|
+
const normalized = token.toLowerCase();
|
|
246
|
+
if (token === '--') {
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
if (/^[A-Za-z_][A-Za-z0-9_]*=.*/u.test(token)) {
|
|
250
|
+
index += 1;
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
if (normalized === '-i' || normalized === '--ignore-environment') {
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
if ((normalized === '-u' || normalized === '--unset') && index + 1 < tokens.length) {
|
|
257
|
+
index += 2;
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
if (normalized.startsWith('--unset=')) {
|
|
261
|
+
index += 1;
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
if (token.startsWith('-')) {
|
|
265
|
+
index += 1;
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
function collectInlineEnvUnsetVars(tokens, dependencies) {
|
|
273
|
+
const unsetVars = new Set();
|
|
274
|
+
let index = 0;
|
|
275
|
+
while (index < tokens.length && /^[A-Za-z_][A-Za-z0-9_]*=.*/u.test(tokens[index] ?? '')) {
|
|
276
|
+
index += 1;
|
|
277
|
+
}
|
|
278
|
+
if (dependencies.normalizeCommandToken(tokens[index] ?? '') !== 'env') {
|
|
279
|
+
return unsetVars;
|
|
280
|
+
}
|
|
281
|
+
index += 1;
|
|
282
|
+
while (index < tokens.length) {
|
|
283
|
+
const token = tokens[index] ?? '';
|
|
284
|
+
const normalized = token.toLowerCase();
|
|
285
|
+
if (token === '--') {
|
|
286
|
+
index += 1;
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
if (/^[A-Za-z_][A-Za-z0-9_]*=.*/u.test(token)) {
|
|
290
|
+
index += 1;
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
if ((normalized === '-u' || normalized === '--unset') && index + 1 < tokens.length) {
|
|
294
|
+
const envVar = tokens[index + 1]?.trim().replace(/^\$/u, '').replace(/[{}]/gu, '').toUpperCase();
|
|
295
|
+
if (envVar) {
|
|
296
|
+
unsetVars.add(envVar);
|
|
297
|
+
}
|
|
298
|
+
index += 2;
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
if (normalized.startsWith('--unset=')) {
|
|
302
|
+
const envVar = normalized
|
|
303
|
+
.slice('--unset='.length)
|
|
304
|
+
.trim()
|
|
305
|
+
.replace(/^\$/u, '')
|
|
306
|
+
.replace(/[{}]/gu, '')
|
|
307
|
+
.toUpperCase();
|
|
308
|
+
if (envVar) {
|
|
309
|
+
unsetVars.add(envVar);
|
|
310
|
+
}
|
|
311
|
+
index += 1;
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
if (token.startsWith('-')) {
|
|
315
|
+
index += 1;
|
|
316
|
+
continue;
|
|
317
|
+
}
|
|
318
|
+
break;
|
|
319
|
+
}
|
|
320
|
+
return unsetVars;
|
|
321
|
+
}
|
|
322
|
+
function recordInlineEnvAssignment(assignments, token) {
|
|
323
|
+
const separatorIndex = token.indexOf('=');
|
|
324
|
+
if (separatorIndex <= 0) {
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
const key = token.slice(0, separatorIndex).trim().toUpperCase();
|
|
328
|
+
const value = token.slice(separatorIndex + 1).trim();
|
|
329
|
+
if (!key || !value) {
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
assignments.set(key, value);
|
|
333
|
+
}
|
|
334
|
+
function mergeEnvAssignments(inheritedEnvAssignments, nextEnvAssignments) {
|
|
335
|
+
const merged = new Map(inheritedEnvAssignments);
|
|
336
|
+
for (const [key, value] of nextEnvAssignments.entries()) {
|
|
337
|
+
merged.set(key, value);
|
|
338
|
+
}
|
|
339
|
+
return merged;
|
|
340
|
+
}
|
|
@@ -1,39 +1,191 @@
|
|
|
1
1
|
import { access, readdir } from 'node:fs/promises';
|
|
2
|
-
import {
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
3
4
|
import process from 'node:process';
|
|
4
5
|
const DEFAULT_TASK_ID = '0101';
|
|
5
6
|
const DEFAULT_RUN_LAYOUT = 'cli';
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
const PROVIDER_WORKSPACE_ROOT_DIRNAME = '.workspaces';
|
|
8
|
+
const PROVIDER_LINEAR_WORKER_PIPELINE_ID = 'provider-linear-worker';
|
|
9
|
+
const PRESERVE_PROVIDER_ARTIFACT_ROOTS_ENV = 'CODEX_ORCHESTRATOR_PRESERVE_PROVIDER_ARTIFACT_ROOTS';
|
|
10
|
+
function resolveConfiguredPath(configured, cwd) {
|
|
11
|
+
if (isAbsolute(configured)) {
|
|
12
|
+
return resolve(configured);
|
|
13
|
+
}
|
|
14
|
+
return resolve(cwd, configured);
|
|
15
|
+
}
|
|
16
|
+
function normalizeTaskId(value) { return typeof value === 'string' && value.trim().length > 0 ? value.trim() : null; }
|
|
17
|
+
function resolveConfiguredTaskId(env) { return normalizeTaskId(env.MCP_RUNNER_TASK_ID) ?? normalizeTaskId(env.CODEX_ORCHESTRATOR_TASK_ID) ?? normalizeTaskId(env.TASK); }
|
|
18
|
+
function resolveProviderTaskId(env, cwd) { const cwdRoot = resolve(cwd), cwdTask = basename(dirname(cwdRoot)) === PROVIDER_WORKSPACE_ROOT_DIRNAME ? basename(cwdRoot) : null; return cwdTask && [normalizeTaskId(env.CODEX_ORCHESTRATOR_TASK_ID), normalizeTaskId(env.MCP_RUNNER_TASK_ID), normalizeTaskId(env.TASK)].includes(cwdTask) ? cwdTask : resolveConfiguredTaskId(env); }
|
|
19
|
+
function isProviderIssueWorkspaceRootForTask(candidate, taskId) {
|
|
20
|
+
return (typeof candidate === 'string' &&
|
|
21
|
+
candidate.length > 0 &&
|
|
22
|
+
basename(candidate) === taskId &&
|
|
23
|
+
basename(dirname(candidate)) === PROVIDER_WORKSPACE_ROOT_DIRNAME);
|
|
24
|
+
}
|
|
25
|
+
function providerIssueWorkspaceOverrideForCwd(configuredRoot, env, cwd) {
|
|
26
|
+
if (env.CODEX_ORCHESTRATOR_PIPELINE_ID !== PROVIDER_LINEAR_WORKER_PIPELINE_ID) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const taskId = resolveProviderTaskId(env, cwd);
|
|
30
|
+
if (!taskId) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
const resolvedCwd = resolve(cwd);
|
|
34
|
+
if (!isProviderIssueWorkspaceRootForTask(resolvedCwd, taskId)) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
const sharedRoot = dirname(dirname(resolvedCwd));
|
|
38
|
+
return sharedRoot === configuredRoot ? resolvedCwd : null;
|
|
39
|
+
}
|
|
40
|
+
function resolveRepoRoot(env, cwd) {
|
|
41
|
+
const configured = env.CODEX_ORCHESTRATOR_ROOT;
|
|
8
42
|
if (!configured) {
|
|
9
|
-
return
|
|
43
|
+
return cwd;
|
|
10
44
|
}
|
|
11
|
-
|
|
12
|
-
|
|
45
|
+
const configuredRoot = resolveConfiguredPath(configured, cwd);
|
|
46
|
+
return providerIssueWorkspaceOverrideForCwd(configuredRoot, env, cwd) ?? configuredRoot;
|
|
47
|
+
}
|
|
48
|
+
function resolveProviderSharedRootForIssueWorkspace(repoRoot, env, cwd) {
|
|
49
|
+
const taskId = resolveProviderTaskId(env, repoRoot);
|
|
50
|
+
if (!taskId || !isProviderIssueWorkspaceRootForTask(repoRoot, taskId)) {
|
|
51
|
+
return null;
|
|
13
52
|
}
|
|
14
|
-
|
|
53
|
+
const configured = env.CODEX_ORCHESTRATOR_ROOT;
|
|
54
|
+
if (!configured) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
const configuredRoot = resolveConfiguredPath(configured, cwd);
|
|
58
|
+
const sharedRoot = dirname(dirname(repoRoot));
|
|
59
|
+
return configuredRoot === sharedRoot ? sharedRoot : null;
|
|
15
60
|
}
|
|
16
|
-
function
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
61
|
+
function isPathWithinRoot(root, candidate) {
|
|
62
|
+
const relativePath = relative(root, candidate);
|
|
63
|
+
return (relativePath === '' ||
|
|
64
|
+
(!relativePath.startsWith('..') &&
|
|
65
|
+
!relativePath.startsWith(`..${sep}`) &&
|
|
66
|
+
!isAbsolute(relativePath)));
|
|
67
|
+
}
|
|
68
|
+
function firstPathSegment(relativePath) {
|
|
69
|
+
return relativePath.split(sep).filter((segment) => segment.length > 0)[0] ?? '';
|
|
70
|
+
}
|
|
71
|
+
function isDefaultRunsLayoutSegment(segment) {
|
|
72
|
+
return segment === '.runs' || segment === 'runs';
|
|
73
|
+
}
|
|
74
|
+
function resolveConfiguredArtifactRoot(baseRoot, configured, fallbackDirname) {
|
|
75
|
+
if (!configured) {
|
|
76
|
+
return resolve(baseRoot, fallbackDirname);
|
|
20
77
|
}
|
|
21
|
-
return resolve(
|
|
78
|
+
return isAbsolute(configured) ? resolve(configured) : resolve(baseRoot, configured);
|
|
22
79
|
}
|
|
23
|
-
function
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
return configured;
|
|
80
|
+
function resolveWorkspaceArtifactRootForSharedRoot(repoRoot, sharedRoot, sharedArtifactRoot, fallbackDirname, allowCustomCounterpart = false) {
|
|
81
|
+
if (!sharedRoot || !isPathWithinRoot(sharedRoot, sharedArtifactRoot)) {
|
|
82
|
+
return null;
|
|
27
83
|
}
|
|
28
|
-
|
|
84
|
+
const relativeArtifactRoot = relative(sharedRoot, sharedArtifactRoot);
|
|
85
|
+
const firstSegment = firstPathSegment(relativeArtifactRoot);
|
|
86
|
+
if ((fallbackDirname === '.runs' && isDefaultRunsLayoutSegment(firstSegment)) ||
|
|
87
|
+
firstSegment === fallbackDirname ||
|
|
88
|
+
allowCustomCounterpart) {
|
|
89
|
+
return resolve(repoRoot, relativeArtifactRoot);
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
29
92
|
}
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
93
|
+
function resolveProviderWorkspaceManifestCounterpartPath(repoRoot, env, cwd) {
|
|
94
|
+
const manifestPath = env.CODEX_ORCHESTRATOR_MANIFEST_PATH || env.MANIFEST;
|
|
95
|
+
if (!manifestPath) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
const inheritedSharedRoot = resolveProviderSharedRootForIssueWorkspace(repoRoot, env, cwd);
|
|
99
|
+
const sharedRoot = dirname(dirname(repoRoot));
|
|
100
|
+
const resolvedManifestPath = resolveConfiguredPath(manifestPath, inheritedSharedRoot ?? repoRoot);
|
|
101
|
+
if (isPathWithinRoot(repoRoot, resolvedManifestPath)) {
|
|
102
|
+
return resolvedManifestPath;
|
|
103
|
+
}
|
|
104
|
+
const sharedRunsRoot = resolveConfiguredArtifactRoot(inheritedSharedRoot ?? sharedRoot, env.CODEX_ORCHESTRATOR_RUNS_DIR || '.runs', '.runs');
|
|
105
|
+
if (!isPathWithinRoot(sharedRunsRoot, resolvedManifestPath)) {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
const workspaceRunsRoot = resolveWorkspaceArtifactRootForSharedRoot(repoRoot, sharedRoot, sharedRunsRoot, '.runs', true);
|
|
109
|
+
if (!workspaceRunsRoot) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
const workspaceManifestPath = resolve(workspaceRunsRoot, relative(sharedRunsRoot, resolvedManifestPath));
|
|
113
|
+
return existsSync(workspaceManifestPath) ? workspaceManifestPath : null;
|
|
114
|
+
}
|
|
115
|
+
function shouldScopeProviderArtifactDirs(repoRoot, env, cwd) {
|
|
116
|
+
if (env.CODEX_ORCHESTRATOR_PIPELINE_ID !== PROVIDER_LINEAR_WORKER_PIPELINE_ID) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
const taskId = resolveProviderTaskId(env, repoRoot);
|
|
120
|
+
if (!taskId || !isProviderIssueWorkspaceRootForTask(repoRoot, taskId)) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
if (env[PRESERVE_PROVIDER_ARTIFACT_ROOTS_ENV] === '1' &&
|
|
124
|
+
!providerWorkspaceManifestCounterpartExists(repoRoot, env, cwd)) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
function providerWorkspaceManifestCounterpartExists(repoRoot, env, cwd) {
|
|
130
|
+
const manifestPath = env.CODEX_ORCHESTRATOR_MANIFEST_PATH || env.MANIFEST;
|
|
131
|
+
if (!manifestPath) {
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
const counterpartPath = resolveProviderWorkspaceManifestCounterpartPath(repoRoot, env, cwd);
|
|
135
|
+
if (counterpartPath) {
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
const inheritedSharedRoot = resolveProviderSharedRootForIssueWorkspace(repoRoot, env, cwd);
|
|
139
|
+
const sharedRoot = dirname(dirname(repoRoot));
|
|
140
|
+
const resolvedManifestPath = resolveConfiguredPath(manifestPath, inheritedSharedRoot ?? repoRoot);
|
|
141
|
+
if (isPathWithinRoot(repoRoot, resolvedManifestPath)) {
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
const sharedRunsRoot = resolveConfiguredArtifactRoot(inheritedSharedRoot ?? sharedRoot, env.CODEX_ORCHESTRATOR_RUNS_DIR || '.runs', '.runs');
|
|
145
|
+
if (!isPathWithinRoot(sharedRunsRoot, resolvedManifestPath)) {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
function resolveArtifactDir(repoRoot, configured, fallbackDirname, scopeToRepoRoot, baseRoot = repoRoot, hasProviderWorkspaceManifestCounterpart = false, sharedRootForCounterpart = baseRoot) {
|
|
151
|
+
const relativeBaseRoot = scopeToRepoRoot ? repoRoot : baseRoot;
|
|
152
|
+
const fallback = resolve(relativeBaseRoot, fallbackDirname);
|
|
153
|
+
if (!configured) {
|
|
154
|
+
return fallback;
|
|
155
|
+
}
|
|
156
|
+
const candidate = scopeToRepoRoot && !isAbsolute(configured)
|
|
157
|
+
? resolve(repoRoot, configured)
|
|
158
|
+
: resolveConfiguredArtifactRoot(baseRoot, configured, fallbackDirname);
|
|
159
|
+
if (scopeToRepoRoot && !isPathWithinRoot(repoRoot, candidate)) {
|
|
160
|
+
const workspaceArtifactRoot = resolveWorkspaceArtifactRootForSharedRoot(repoRoot, sharedRootForCounterpart, candidate, fallbackDirname, hasProviderWorkspaceManifestCounterpart);
|
|
161
|
+
if (workspaceArtifactRoot) {
|
|
162
|
+
return workspaceArtifactRoot;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return candidate;
|
|
166
|
+
}
|
|
167
|
+
function resolveRunsDir(repoRoot, env, scopeToRepoRoot, baseRoot = repoRoot, hasProviderWorkspaceManifestCounterpart = false, sharedRootForCounterpart = baseRoot) {
|
|
168
|
+
return resolveArtifactDir(repoRoot, env.CODEX_ORCHESTRATOR_RUNS_DIR || '.runs', '.runs', scopeToRepoRoot, baseRoot, hasProviderWorkspaceManifestCounterpart, sharedRootForCounterpart);
|
|
169
|
+
}
|
|
170
|
+
function resolveOutDir(repoRoot, env, scopeToRepoRoot, baseRoot = repoRoot, hasProviderWorkspaceManifestCounterpart = false, sharedRootForCounterpart = baseRoot) {
|
|
171
|
+
return resolveArtifactDir(repoRoot, env.CODEX_ORCHESTRATOR_OUT_DIR || 'out', 'out', scopeToRepoRoot, baseRoot, hasProviderWorkspaceManifestCounterpart, sharedRootForCounterpart);
|
|
172
|
+
}
|
|
173
|
+
export function resolveEnvironmentPathsForProcess(env = process.env, cwd = process.cwd()) {
|
|
174
|
+
const repoRoot = resolveRepoRoot(env, cwd);
|
|
175
|
+
const providerSharedRoot = resolveProviderSharedRootForIssueWorkspace(repoRoot, env, cwd);
|
|
176
|
+
const providerWorkspaceManifestCounterpartPath = resolveProviderWorkspaceManifestCounterpartPath(repoRoot, env, cwd);
|
|
177
|
+
const scopeProviderArtifacts = shouldScopeProviderArtifactDirs(repoRoot, env, cwd);
|
|
178
|
+
const artifactBaseRoot = providerSharedRoot ?? repoRoot;
|
|
179
|
+
const sharedRootForCounterpart = providerSharedRoot ?? dirname(dirname(repoRoot));
|
|
180
|
+
const hasProviderWorkspaceManifestCounterpart = Boolean(providerWorkspaceManifestCounterpartPath);
|
|
181
|
+
const runsRoot = resolveRunsDir(repoRoot, env, scopeProviderArtifacts, artifactBaseRoot, hasProviderWorkspaceManifestCounterpart, sharedRootForCounterpart);
|
|
182
|
+
const outRoot = resolveOutDir(repoRoot, env, scopeProviderArtifacts, artifactBaseRoot, hasProviderWorkspaceManifestCounterpart, sharedRootForCounterpart);
|
|
183
|
+
const taskId = (env.CODEX_ORCHESTRATOR_PIPELINE_ID === PROVIDER_LINEAR_WORKER_PIPELINE_ID ? resolveProviderTaskId(env, repoRoot) : resolveConfiguredTaskId(env)) ?? DEFAULT_TASK_ID;
|
|
35
184
|
return { repoRoot, runsRoot, outRoot, taskId };
|
|
36
185
|
}
|
|
186
|
+
export function resolveEnvironmentPaths() {
|
|
187
|
+
return resolveEnvironmentPathsForProcess(process.env, process.cwd());
|
|
188
|
+
}
|
|
37
189
|
export function resolveRunDir(options) {
|
|
38
190
|
const { runsRoot, taskId, runId, layout = DEFAULT_RUN_LAYOUT } = options ?? {};
|
|
39
191
|
if (!runsRoot || !taskId || !runId) {
|
|
@@ -88,9 +240,9 @@ export function pickLatestRunId(runIds) {
|
|
|
88
240
|
}
|
|
89
241
|
export async function collectManifests(runsDir, taskFilter) {
|
|
90
242
|
const results = [];
|
|
91
|
-
let
|
|
243
|
+
let taskEntries = [];
|
|
92
244
|
try {
|
|
93
|
-
|
|
245
|
+
taskEntries = await readdir(runsDir, { withFileTypes: true });
|
|
94
246
|
}
|
|
95
247
|
catch (error) {
|
|
96
248
|
if (error?.code === 'ENOENT') {
|
|
@@ -98,7 +250,11 @@ export async function collectManifests(runsDir, taskFilter) {
|
|
|
98
250
|
}
|
|
99
251
|
throw error;
|
|
100
252
|
}
|
|
101
|
-
for (const
|
|
253
|
+
for (const taskEntry of taskEntries) {
|
|
254
|
+
if (!taskEntry.isDirectory()) {
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
const taskId = taskEntry.name;
|
|
102
258
|
if (taskFilter && taskFilter !== taskId) {
|
|
103
259
|
continue;
|
|
104
260
|
}
|
|
@@ -106,26 +262,26 @@ export async function collectManifests(runsDir, taskFilter) {
|
|
|
106
262
|
const cliPath = join(taskPath, 'cli');
|
|
107
263
|
const legacyPath = taskPath;
|
|
108
264
|
const candidates = [];
|
|
109
|
-
|
|
110
|
-
|
|
265
|
+
const cliRunIds = await listDirectories(cliPath);
|
|
266
|
+
if (cliRunIds.length > 0) {
|
|
111
267
|
candidates.push({ root: cliPath, runIds: cliRunIds });
|
|
112
268
|
}
|
|
113
|
-
catch {
|
|
114
|
-
// Ignore missing CLI directory; fall back to legacy layout.
|
|
115
|
-
}
|
|
116
269
|
if (candidates.length === 0) {
|
|
117
|
-
|
|
118
|
-
|
|
270
|
+
const legacyRunIds = (await listDirectories(legacyPath)).filter((name) => name !== 'cli');
|
|
271
|
+
if (legacyRunIds.length > 0) {
|
|
119
272
|
candidates.push({ root: legacyPath, runIds: legacyRunIds });
|
|
120
273
|
}
|
|
121
|
-
catch {
|
|
122
|
-
continue;
|
|
123
|
-
}
|
|
124
274
|
}
|
|
125
275
|
for (const candidate of candidates) {
|
|
126
276
|
for (const runId of candidate.runIds) {
|
|
127
277
|
const manifestPath = join(candidate.root, runId, 'manifest.json');
|
|
128
|
-
|
|
278
|
+
try {
|
|
279
|
+
await access(manifestPath);
|
|
280
|
+
results.push(manifestPath);
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
// Only return manifest paths that exist on disk.
|
|
284
|
+
}
|
|
129
285
|
}
|
|
130
286
|
}
|
|
131
287
|
}
|