@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.
- package/.agents/plugins/marketplace.json +20 -0
- package/README.md +46 -317
- package/bin/codex-orchestrator.js +161 -0
- package/codex.orchestrator.json +149 -13
- package/dist/bin/codex-orchestrator.js +797 -1154
- package/dist/orchestrator/src/cli/adapters/CommandBuilder.js +50 -0
- 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 +295 -11
- package/dist/orchestrator/src/cli/coStatusAttachCliShell.js +402 -0
- package/dist/orchestrator/src/cli/coStatusCliShell.js +451 -0
- package/dist/orchestrator/src/cli/coStatusOperatorAutopilotCliShell.js +120 -0
- package/dist/orchestrator/src/cli/codexCliShell.js +119 -0
- package/dist/orchestrator/src/cli/codexDefaultsSetup.js +265 -36
- 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 +630 -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 +1003 -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 +1904 -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 +1885 -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 +678 -164
- 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 +95 -1
- 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 +1835 -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 +6834 -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 +698 -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 +285 -7
- package/dist/orchestrator/src/cli/utils/codexFeatures.js +60 -0
- 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/manager.js +74 -4
- 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 +399 -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/README.md +43 -20
- package/docs/book/README.md +19 -0
- package/docs/book/codex-cli-0124-adoption.md +68 -0
- package/docs/book/local-hook-impact.md +73 -0
- package/docs/book/operations.md +60 -0
- package/docs/book/public-posture.md +34 -0
- package/docs/book/setup.md +91 -0
- package/docs/book/skills.md +11 -0
- package/docs/guides/codex-version-policy.md +104 -0
- package/docs/public/downstream-setup.md +113 -0
- package/docs/public/provider-onboarding.md +173 -0
- package/package.json +23 -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 +361 -0
- package/schemas/manifest.json +411 -0
- package/skills/README.md +26 -0
- package/skills/collab-subagents-first/SKILL.md +1 -1
- package/skills/delegation-usage/DELEGATION_GUIDE.md +30 -12
- package/skills/delegation-usage/SKILL.md +25 -14
- 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 +15 -8
- package/templates/codex/mcp-client.json +5 -1
- package/docs/assets/setup.gif +0 -0
|
@@ -1,12 +1,33 @@
|
|
|
1
|
+
import process from 'node:process';
|
|
1
2
|
import { spawn } from 'node:child_process';
|
|
3
|
+
import { fingerprintAuthProvenanceValue } from './authProvenanceFingerprint.js';
|
|
4
|
+
import { resolveCodexCliBin } from './codexCli.js';
|
|
5
|
+
function formatCommandSpawnError(error) {
|
|
6
|
+
if (error instanceof Error) {
|
|
7
|
+
const errno = error;
|
|
8
|
+
const code = typeof errno.code === 'string' ? errno.code : null;
|
|
9
|
+
if (code && !error.message.includes(code)) {
|
|
10
|
+
return `${code}: ${error.message}`;
|
|
11
|
+
}
|
|
12
|
+
return error.message;
|
|
13
|
+
}
|
|
14
|
+
return String(error);
|
|
15
|
+
}
|
|
2
16
|
function runCommand(command, args, options) {
|
|
3
17
|
const timeoutMs = options.timeoutMs ?? 10_000;
|
|
4
18
|
return new Promise((resolve) => {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
19
|
+
let child;
|
|
20
|
+
try {
|
|
21
|
+
child = spawn(command, args, {
|
|
22
|
+
cwd: options.cwd,
|
|
23
|
+
env: options.env,
|
|
24
|
+
stdio: ['ignore', 'pipe', 'pipe']
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
resolve({ exitCode: 1, stdout: '', stderr: formatCommandSpawnError(error) });
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
10
31
|
let stdout = '';
|
|
11
32
|
let stderr = '';
|
|
12
33
|
let settled = false;
|
|
@@ -36,7 +57,7 @@ function runCommand(command, args, options) {
|
|
|
36
57
|
}
|
|
37
58
|
settled = true;
|
|
38
59
|
clearTimeout(timer);
|
|
39
|
-
resolve({ exitCode: 1, stdout, stderr: `${stderr}\n${error
|
|
60
|
+
resolve({ exitCode: 1, stdout, stderr: `${stderr}\n${formatCommandSpawnError(error)}`.trim() });
|
|
40
61
|
});
|
|
41
62
|
child.once('close', (code) => {
|
|
42
63
|
if (settled) {
|
|
@@ -55,6 +76,243 @@ function normalizeBranch(raw) {
|
|
|
55
76
|
}
|
|
56
77
|
return trimmed.replace(/^refs\/heads\//u, '');
|
|
57
78
|
}
|
|
79
|
+
function normalizeCloudPreflightRequestValue(raw) {
|
|
80
|
+
const trimmed = String(raw ?? '').trim();
|
|
81
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
82
|
+
}
|
|
83
|
+
function readCloudPreflightCommandOutput(result) {
|
|
84
|
+
const output = [result.stderr, result.stdout]
|
|
85
|
+
.map((value) => value.trim())
|
|
86
|
+
.filter((value) => value.length > 0)
|
|
87
|
+
.join(' ')
|
|
88
|
+
.replace(/\s+/gu, ' ')
|
|
89
|
+
.trim();
|
|
90
|
+
return output || 'no output';
|
|
91
|
+
}
|
|
92
|
+
function readCloudPreflightErrorOutput(result) {
|
|
93
|
+
const output = result.stderr.trim().replace(/\s+/gu, ' ');
|
|
94
|
+
return output || 'no output';
|
|
95
|
+
}
|
|
96
|
+
function compactCloudPreflightOutput(output) {
|
|
97
|
+
return output.length > 500 ? `${output.slice(0, 497)}...` : output;
|
|
98
|
+
}
|
|
99
|
+
function redactCloudPreflightOutput(output) {
|
|
100
|
+
return output
|
|
101
|
+
.replace(/\b(?:authorization|bearer)\s*[:=]\s*bearer\s+[^\s,;]+/giu, 'authorization: Bearer <redacted>')
|
|
102
|
+
.replace(/\bbearer\s+[A-Za-z0-9._~+/-]{10,}/giu, 'Bearer <redacted>')
|
|
103
|
+
.replace(/\b(?:sk|sess|eyJ)[A-Za-z0-9._~+/-]{12,}/gu, '<redacted-token>')
|
|
104
|
+
.replace(/\b(?:CODEX|OPENAI|CHATGPT|GITHUB|GH)_[A-Z0-9_]*(?:API_KEY|AUTH_TOKEN|ACCESS_TOKEN|REFRESH_TOKEN|TOKEN|SECRET|PASSWORD)\s*=\s*[^\s,;]+/gu, (match) => `${match.split('=')[0] ?? 'secret'}=<redacted>`)
|
|
105
|
+
.replace(/\b(?:api[_ -]?key|auth[_ -]?token|access[_ -]?token|refresh[_ -]?token|bearer[_ -]?token|password|secret|credential)\s*[:=]\s*[^\s,;]+/giu, (match) => `${match.split(/[:=]/u)[0]?.trim() ?? 'secret'}=<redacted>`)
|
|
106
|
+
.replace(/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/giu, '<redacted-email>');
|
|
107
|
+
}
|
|
108
|
+
function compactCloudPreflightCommandOutput(result) {
|
|
109
|
+
return compactCloudPreflightOutput(redactCloudPreflightOutput(readCloudPreflightCommandOutput(result)));
|
|
110
|
+
}
|
|
111
|
+
function escapeRegExpLiteral(value) {
|
|
112
|
+
return value.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&');
|
|
113
|
+
}
|
|
114
|
+
function isEnvironmentNotFoundSignal(signal, environmentId) {
|
|
115
|
+
const normalized = signal.toLowerCase();
|
|
116
|
+
const normalizedEnvironmentId = environmentId.toLowerCase();
|
|
117
|
+
if (normalized.includes('environment_not_found')) {
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
const escapedEnvironmentId = escapeRegExpLiteral(normalizedEnvironmentId);
|
|
121
|
+
return new RegExp(`\\benvironment\\s+(?:(["'])${escapedEnvironmentId}\\1|${escapedEnvironmentId})\\s+not\\s+found\\b`, 'u').test(normalized);
|
|
122
|
+
}
|
|
123
|
+
function maskCloudPreflightEnvironmentIdentifierValues(signal) {
|
|
124
|
+
return signal
|
|
125
|
+
.toLowerCase()
|
|
126
|
+
.replace(/\benvironment\s+(?:['"][^'"]+['"]|[^\s'"]+)\s+not\s+found\b/gu, 'environment <env-id> not found')
|
|
127
|
+
.replace(/\bcodex_cloud_env_id\s+(?:['"][^'"]+['"]|[^\s'"]+)/gu, 'codex_cloud_env_id <env-id>')
|
|
128
|
+
.replace(/\bcodex cloud env id\s+(?:['"][^'"]+['"]|[^\s'"]+)/gu, 'codex cloud env id <env-id>');
|
|
129
|
+
}
|
|
130
|
+
function hasWrappedEnvironmentProbeUnavailableSignal(signal) {
|
|
131
|
+
const normalized = maskCloudPreflightEnvironmentIdentifierValues(signal);
|
|
132
|
+
return (/\b(?:missing[_ -]github[_ -]connector[_ -]link|github connection not found|github connector not found)\b/u.test(normalized) ||
|
|
133
|
+
/\b(?:cloud denial|cloud-denial|cloud_denial|cloud denied|not allowed in cloud|cloud access denied|cloud execution denied)\b/u.test(normalized) ||
|
|
134
|
+
/\b(?:forbidden|unauthorized|not logged in|login required|active account|active profile|account mismatch|profile mismatch|invalid token|expired token|token expired|missing token|token missing|api key|auth token|access token|refresh token|bearer token)\b/u.test(normalized) ||
|
|
135
|
+
/\b(?:rate limit|rate-limit|rate_limited|rate_limit_exceeded|quota|too many requests|usage limit|usage_limit_reached)\b/u.test(normalized) ||
|
|
136
|
+
/\b(?:enotfound|econn|network|timed out|timeout|502|503|504|bad gateway|service unavailable|gateway timeout)\b/u.test(normalized));
|
|
137
|
+
}
|
|
138
|
+
function buildEnvironmentProbeIssue(environmentId, result) {
|
|
139
|
+
const fullDetail = readCloudPreflightCommandOutput(result);
|
|
140
|
+
const detail = compactCloudPreflightCommandOutput(result);
|
|
141
|
+
if (isEnvironmentNotFoundSignal(fullDetail, environmentId) &&
|
|
142
|
+
!hasWrappedEnvironmentProbeUnavailableSignal(fullDetail)) {
|
|
143
|
+
return {
|
|
144
|
+
code: 'environment_not_found',
|
|
145
|
+
message: `Configured CODEX_CLOUD_ENV_ID '${environmentId}' is not visible to codex cloud before codex cloud exec: ${detail}`
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
code: 'environment_unavailable',
|
|
150
|
+
message: `Configured CODEX_CLOUD_ENV_ID '${environmentId}' could not be verified by codex cloud before codex cloud exec: ${detail}`
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
function tryParseCloudListJson(stdout) {
|
|
154
|
+
const trimmed = stdout.trim();
|
|
155
|
+
if (!trimmed) {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
return JSON.parse(trimmed);
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function readCloudListTasks(payload) {
|
|
166
|
+
if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
const record = payload;
|
|
170
|
+
return Array.isArray(record.tasks) ? record.tasks : null;
|
|
171
|
+
}
|
|
172
|
+
function readCloudListTaskEnvironmentIdentities(task) {
|
|
173
|
+
if (!task || typeof task !== 'object') {
|
|
174
|
+
return [];
|
|
175
|
+
}
|
|
176
|
+
const record = task;
|
|
177
|
+
const identities = [];
|
|
178
|
+
for (const key of ['environment_id', 'environmentId', 'cloud_environment_id', 'cloudEnvId']) {
|
|
179
|
+
const value = normalizeCloudPreflightRequestValue(record[key]);
|
|
180
|
+
if (value) {
|
|
181
|
+
identities.push(value);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
for (const key of ['environment_label', 'environmentLabel']) {
|
|
185
|
+
const value = normalizeCloudPreflightRequestValue(record[key]);
|
|
186
|
+
if (value) {
|
|
187
|
+
identities.push(value);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
const environment = record.environment;
|
|
191
|
+
if (environment && typeof environment === 'object') {
|
|
192
|
+
const environmentRecord = environment;
|
|
193
|
+
for (const key of ['id', 'environment_id', 'environmentId', 'cloud_environment_id', 'cloudEnvId']) {
|
|
194
|
+
const value = normalizeCloudPreflightRequestValue(environmentRecord[key]);
|
|
195
|
+
if (value) {
|
|
196
|
+
identities.push(value);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
for (const key of ['label', 'environment_label', 'environmentLabel']) {
|
|
200
|
+
const value = normalizeCloudPreflightRequestValue(environmentRecord[key]);
|
|
201
|
+
if (value) {
|
|
202
|
+
identities.push(value);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return [...new Set(identities)];
|
|
207
|
+
}
|
|
208
|
+
function normalizeCloudEnvironmentIdentity(value) {
|
|
209
|
+
return value.trim().toLowerCase();
|
|
210
|
+
}
|
|
211
|
+
function buildEnvironmentProbePayloadIssue(environmentId, detail) {
|
|
212
|
+
const safeDetail = compactCloudPreflightOutput(redactCloudPreflightOutput(detail));
|
|
213
|
+
return {
|
|
214
|
+
code: 'environment_unavailable',
|
|
215
|
+
message: `Configured CODEX_CLOUD_ENV_ID '${environmentId}' could not be verified by codex cloud before codex cloud exec: ${safeDetail}`
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
function inspectSuccessfulEnvironmentProbe(environmentId, result) {
|
|
219
|
+
const stderrDetail = readCloudPreflightErrorOutput(result);
|
|
220
|
+
if (isEnvironmentNotFoundSignal(stderrDetail, environmentId)) {
|
|
221
|
+
return buildEnvironmentProbeIssue(environmentId, {
|
|
222
|
+
...result,
|
|
223
|
+
stdout: ''
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
const payload = tryParseCloudListJson(result.stdout);
|
|
227
|
+
const tasks = readCloudListTasks(payload);
|
|
228
|
+
if (!tasks) {
|
|
229
|
+
return buildEnvironmentProbePayloadIssue(environmentId, `unexpected codex cloud list JSON payload: ${compactCloudPreflightOutput(result.stdout.trim() || 'no output')}`);
|
|
230
|
+
}
|
|
231
|
+
const taskEnvironmentIdentities = tasks.map((task) => readCloudListTaskEnvironmentIdentities(task));
|
|
232
|
+
const normalizedEnvironmentId = normalizeCloudEnvironmentIdentity(environmentId);
|
|
233
|
+
if (taskEnvironmentIdentities.some((identities) => identities.length === 0)) {
|
|
234
|
+
return buildEnvironmentProbePayloadIssue(environmentId, 'codex cloud list returned task rows without an environment identity');
|
|
235
|
+
}
|
|
236
|
+
const mismatchedEnvironmentIds = taskEnvironmentIdentities
|
|
237
|
+
.filter((identities) => !identities.some((identity) => normalizeCloudEnvironmentIdentity(identity) === normalizedEnvironmentId))
|
|
238
|
+
.flat();
|
|
239
|
+
if (mismatchedEnvironmentIds.length > 0) {
|
|
240
|
+
return buildEnvironmentProbePayloadIssue(environmentId, `codex cloud list returned task rows for a different environment identity: ${[
|
|
241
|
+
...new Set(mismatchedEnvironmentIds)
|
|
242
|
+
].join(', ')}`);
|
|
243
|
+
}
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
function readFirstCloudPreflightEnvValue(env, keys) {
|
|
247
|
+
if (!env) {
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
for (const key of keys) {
|
|
251
|
+
const value = normalizeCloudPreflightRequestValue(env[key]);
|
|
252
|
+
if (value) {
|
|
253
|
+
return value;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
function readFirstCloudPreflightCredentialSource(env) {
|
|
259
|
+
if (!env) {
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
for (const key of [
|
|
263
|
+
'CODEX_API_KEY',
|
|
264
|
+
'OPENAI_API_KEY',
|
|
265
|
+
'CODEX_AUTH_TOKEN',
|
|
266
|
+
'OPENAI_AUTH_TOKEN',
|
|
267
|
+
'CHATGPT_AUTH_TOKEN'
|
|
268
|
+
]) {
|
|
269
|
+
if (normalizeCloudPreflightRequestValue(env[key])) {
|
|
270
|
+
return `env:${key}`;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
export function buildCloudPreflightAuthProvenance(params) {
|
|
276
|
+
const credentialSource = readFirstCloudPreflightCredentialSource(params.env);
|
|
277
|
+
const profile = readFirstCloudPreflightEnvValue(params.env, [
|
|
278
|
+
'CODEX_AUTH_PROFILE',
|
|
279
|
+
'CODEX_PROFILE',
|
|
280
|
+
'OPENAI_PROFILE',
|
|
281
|
+
'CHATGPT_AUTH_PROFILE',
|
|
282
|
+
'CHATGPT_PROFILE'
|
|
283
|
+
]);
|
|
284
|
+
const account = readFirstCloudPreflightEnvValue(params.env, [
|
|
285
|
+
'CODEX_ACCOUNT_ID',
|
|
286
|
+
'CODEX_ACCOUNT',
|
|
287
|
+
'CODEX_ACCOUNT_EMAIL',
|
|
288
|
+
'OPENAI_ACCOUNT_ID',
|
|
289
|
+
'OPENAI_ORG_ID',
|
|
290
|
+
'CHATGPT_ACCOUNT_ID',
|
|
291
|
+
'CHATGPT_ACCOUNT',
|
|
292
|
+
'CHATGPT_ACCOUNT_EMAIL'
|
|
293
|
+
]);
|
|
294
|
+
return {
|
|
295
|
+
providerKind: 'codex_cloud',
|
|
296
|
+
activeProfileFingerprint: fingerprintAuthProvenanceValue(profile, params.env),
|
|
297
|
+
activeAccountFingerprint: fingerprintAuthProvenanceValue(account, params.env),
|
|
298
|
+
cloudEnvId: params.environmentId,
|
|
299
|
+
cloudBranch: params.branch,
|
|
300
|
+
credentialSource,
|
|
301
|
+
authFreshness: credentialSource ? 'env_credential_present' : 'credential_source_unknown'
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
export function buildCloudPreflightRequest(params) {
|
|
305
|
+
const env = params.env ?? process.env;
|
|
306
|
+
const branch = normalizeCloudPreflightRequestValue(params.branch)
|
|
307
|
+
?? normalizeCloudPreflightRequestValue(env.CODEX_CLOUD_BRANCH);
|
|
308
|
+
return {
|
|
309
|
+
repoRoot: params.repoRoot,
|
|
310
|
+
codexBin: resolveCodexCliBin(env),
|
|
311
|
+
environmentId: params.environmentId,
|
|
312
|
+
branch,
|
|
313
|
+
env
|
|
314
|
+
};
|
|
315
|
+
}
|
|
58
316
|
export async function runCloudPreflight(params) {
|
|
59
317
|
const issues = [];
|
|
60
318
|
const branch = normalizeBranch(params.branch);
|
|
@@ -74,6 +332,21 @@ export async function runCloudPreflight(params) {
|
|
|
74
332
|
message: `Codex CLI is unavailable (${params.codexBin} --version failed).`
|
|
75
333
|
});
|
|
76
334
|
}
|
|
335
|
+
if (params.environmentId && codexCheck.exitCode === 0) {
|
|
336
|
+
const environmentCheck = await runCommand(params.codexBin, ['cloud', 'list', '--env', params.environmentId, '--limit', '1', '--json'], {
|
|
337
|
+
cwd: params.repoRoot,
|
|
338
|
+
env: params.env
|
|
339
|
+
});
|
|
340
|
+
if (environmentCheck.exitCode !== 0) {
|
|
341
|
+
issues.push(buildEnvironmentProbeIssue(params.environmentId, environmentCheck));
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
const environmentProbeIssue = inspectSuccessfulEnvironmentProbe(params.environmentId, environmentCheck);
|
|
345
|
+
if (environmentProbeIssue) {
|
|
346
|
+
issues.push(environmentProbeIssue);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
77
350
|
if (branch) {
|
|
78
351
|
const gitCheck = await runCommand('git', ['--version'], { cwd: params.repoRoot, env: params.env });
|
|
79
352
|
if (gitCheck.exitCode !== 0) {
|
|
@@ -95,7 +368,12 @@ export async function runCloudPreflight(params) {
|
|
|
95
368
|
details: {
|
|
96
369
|
codexBin: params.codexBin,
|
|
97
370
|
environmentId: params.environmentId,
|
|
98
|
-
branch
|
|
371
|
+
branch,
|
|
372
|
+
authProvenance: buildCloudPreflightAuthProvenance({
|
|
373
|
+
env: params.env,
|
|
374
|
+
environmentId: params.environmentId,
|
|
375
|
+
branch
|
|
376
|
+
})
|
|
99
377
|
}
|
|
100
378
|
};
|
|
101
379
|
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
export function readCodexFeatureProbe(codexBin, env = process.env) {
|
|
3
|
+
const result = spawnSync(codexBin, ['features', 'list'], {
|
|
4
|
+
encoding: 'utf8',
|
|
5
|
+
env,
|
|
6
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
7
|
+
timeout: 5000
|
|
8
|
+
});
|
|
9
|
+
const stderr = String(result.stderr ?? '');
|
|
10
|
+
if (result.error || result.status !== 0) {
|
|
11
|
+
return {
|
|
12
|
+
flags: null,
|
|
13
|
+
stderr,
|
|
14
|
+
error: result.error
|
|
15
|
+
? result.error.message
|
|
16
|
+
: `codex features list exited with status ${result.status ?? '<unknown>'}`,
|
|
17
|
+
status: result.status
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
const stdout = String(result.stdout ?? '');
|
|
21
|
+
return {
|
|
22
|
+
flags: parseFeatureFlagsFromText(stdout),
|
|
23
|
+
stderr,
|
|
24
|
+
error: null,
|
|
25
|
+
status: result.status
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export function codexFeatureProbeRejectsAgentMaxThreads(probe) {
|
|
29
|
+
const text = `${probe.error ?? ''}\n${probe.stderr}`.toLowerCase();
|
|
30
|
+
const mentionsMaxThreads = /\bagents\.max_threads\b/u.test(text) || /\bmax[_\s-]?threads\b/u.test(text);
|
|
31
|
+
return mentionsMaxThreads && /\bmulti_agent_v2\b/u.test(text);
|
|
32
|
+
}
|
|
33
|
+
export function codexFeatureProbeDisablesMultiAgentV2(probe) {
|
|
34
|
+
return probe.flags?.multi_agent_v2 === false;
|
|
35
|
+
}
|
|
36
|
+
function parseFeatureFlagsFromText(stdout) {
|
|
37
|
+
const flags = {};
|
|
38
|
+
for (const line of stdout.split(/\r?\n/u)) {
|
|
39
|
+
const trimmed = line.trim();
|
|
40
|
+
if (!trimmed) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const tokens = trimmed.split(/\s+/u);
|
|
44
|
+
if (tokens.length < 2) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const name = tokens[0] ?? '';
|
|
48
|
+
const enabledToken = tokens[tokens.length - 1] ?? '';
|
|
49
|
+
if (!name) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (enabledToken === 'true') {
|
|
53
|
+
flags[name] = true;
|
|
54
|
+
}
|
|
55
|
+
else if (enabledToken === 'false') {
|
|
56
|
+
flags[name] = false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return flags;
|
|
60
|
+
}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { hasMcpServerEntry } from './mcpServerEntry.js';
|
|
3
|
+
export function readDelegationFallbackConfig(configPath) {
|
|
4
|
+
if (!existsSync(configPath)) {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
try {
|
|
8
|
+
const raw = readFileSync(configPath, 'utf8');
|
|
9
|
+
if (!hasMcpServerEntry(raw, 'delegation')) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
command: readDelegationCommandFromConfig(raw),
|
|
14
|
+
args: readDelegationArgsFromConfig(raw),
|
|
15
|
+
envVars: readDelegationEnvVarsFromConfig(raw)
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function readDelegationCommandFromConfig(raw) {
|
|
23
|
+
const section = readSectionBody(raw, [
|
|
24
|
+
'mcp_servers.delegation',
|
|
25
|
+
'mcp_servers."delegation"',
|
|
26
|
+
"mcp_servers.'delegation'"
|
|
27
|
+
]);
|
|
28
|
+
if (!section) {
|
|
29
|
+
const inlineEntry = readDelegationInlineEntry(raw);
|
|
30
|
+
return inlineEntry ? readInlineQuotedValue(inlineEntry, 'command') : null;
|
|
31
|
+
}
|
|
32
|
+
const commandMatch = section.match(/^\s*command\s*=\s*("(?:\\"|[^"])*"|'(?:\\'|[^'])*')\s*$/mu);
|
|
33
|
+
return commandMatch ? decodeQuotedTomlString(commandMatch[1] ?? '') : null;
|
|
34
|
+
}
|
|
35
|
+
function readDelegationArgsFromConfig(raw) {
|
|
36
|
+
const section = readSectionBody(raw, [
|
|
37
|
+
'mcp_servers.delegation',
|
|
38
|
+
'mcp_servers."delegation"',
|
|
39
|
+
"mcp_servers.'delegation'"
|
|
40
|
+
]);
|
|
41
|
+
if (!section) {
|
|
42
|
+
const inlineEntry = readDelegationInlineEntry(raw);
|
|
43
|
+
return inlineEntry ? readQuotedTokens(readInlinePropertyContents(inlineEntry, 'args', '[', ']')) : [];
|
|
44
|
+
}
|
|
45
|
+
const argsMatch = section.match(/^\s*args\s*=\s*\[([\s\S]*?)\]/mu);
|
|
46
|
+
if (!argsMatch) {
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
return readQuotedTokens(argsMatch[1] ?? '');
|
|
50
|
+
}
|
|
51
|
+
function readDelegationEnvVarsFromConfig(raw) {
|
|
52
|
+
const envVars = {};
|
|
53
|
+
const section = readSectionBody(raw, [
|
|
54
|
+
'mcp_servers.delegation.env',
|
|
55
|
+
'mcp_servers."delegation".env',
|
|
56
|
+
"mcp_servers.'delegation'.env"
|
|
57
|
+
]);
|
|
58
|
+
if (!section) {
|
|
59
|
+
const inlineEntry = readDelegationInlineEntry(raw);
|
|
60
|
+
return inlineEntry ? readInlineEnvVars(inlineEntry) : envVars;
|
|
61
|
+
}
|
|
62
|
+
const linePattern = /^\s*([A-Za-z0-9_.-]+)\s*=\s*("(?:\\"|[^"])*"|'(?:\\'|[^'])*')\s*$/gmu;
|
|
63
|
+
let match = linePattern.exec(section);
|
|
64
|
+
while (match) {
|
|
65
|
+
const key = match[1];
|
|
66
|
+
const rawValue = match[2];
|
|
67
|
+
const decoded = rawValue ? decodeQuotedTomlString(rawValue) : null;
|
|
68
|
+
if (key && decoded !== null) {
|
|
69
|
+
envVars[key] = decoded;
|
|
70
|
+
}
|
|
71
|
+
match = linePattern.exec(section);
|
|
72
|
+
}
|
|
73
|
+
return envVars;
|
|
74
|
+
}
|
|
75
|
+
function readDelegationInlineEntry(raw) {
|
|
76
|
+
let currentTable = null;
|
|
77
|
+
for (const line of raw.split('\n')) {
|
|
78
|
+
const trimmed = stripTomlComment(line).trim();
|
|
79
|
+
if (!trimmed) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const tableMatch = trimmed.match(/^\[(.+)\]$/u);
|
|
83
|
+
if (tableMatch) {
|
|
84
|
+
currentTable = tableMatch[1]?.trim() ?? null;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const dottedMatch = trimmed.match(/^mcp_servers\.(?:"delegation"|'delegation'|delegation)\s*=\s*\{([\s\S]*)\}\s*$/u);
|
|
88
|
+
if (dottedMatch) {
|
|
89
|
+
return dottedMatch[1] ?? '';
|
|
90
|
+
}
|
|
91
|
+
if (currentTable === 'mcp_servers') {
|
|
92
|
+
const entryMatch = trimmed.match(/^(?:"delegation"|'delegation'|delegation)\s*=\s*\{([\s\S]*)\}\s*$/u);
|
|
93
|
+
if (entryMatch) {
|
|
94
|
+
return entryMatch[1] ?? '';
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
function readInlineEnvVars(raw) {
|
|
101
|
+
const envVars = {};
|
|
102
|
+
const envRaw = readInlinePropertyContents(raw, 'env', '{', '}');
|
|
103
|
+
if (!envRaw) {
|
|
104
|
+
return envVars;
|
|
105
|
+
}
|
|
106
|
+
const linePattern = /([A-Za-z0-9_.-]+)\s*=\s*("(?:\\"|[^"])*"|'(?:\\'|[^'])*')/gu;
|
|
107
|
+
let match = linePattern.exec(envRaw);
|
|
108
|
+
while (match) {
|
|
109
|
+
const key = match[1];
|
|
110
|
+
const rawValue = match[2];
|
|
111
|
+
const decoded = rawValue ? decodeQuotedTomlString(rawValue) : null;
|
|
112
|
+
if (key && decoded !== null) {
|
|
113
|
+
envVars[key] = decoded;
|
|
114
|
+
}
|
|
115
|
+
match = linePattern.exec(envRaw);
|
|
116
|
+
}
|
|
117
|
+
return envVars;
|
|
118
|
+
}
|
|
119
|
+
function readInlineQuotedValue(raw, propertyName) {
|
|
120
|
+
const propertyPattern = new RegExp(`\\b${escapeRegExp(propertyName)}\\s*=\\s*("(?:\\\\.|[^"])*"|'(?:\\\\.|[^'])*')`, 'u');
|
|
121
|
+
const propertyMatch = propertyPattern.exec(raw);
|
|
122
|
+
return propertyMatch ? decodeQuotedTomlString(propertyMatch[1] ?? '') : null;
|
|
123
|
+
}
|
|
124
|
+
function readSectionBody(raw, names) {
|
|
125
|
+
let currentTable = null;
|
|
126
|
+
let collecting = false;
|
|
127
|
+
const lines = [];
|
|
128
|
+
for (const line of raw.split('\n')) {
|
|
129
|
+
const trimmed = stripTomlComment(line).trim();
|
|
130
|
+
const tableMatch = trimmed.match(/^\[(.+)\]$/u);
|
|
131
|
+
if (tableMatch) {
|
|
132
|
+
const tableName = tableMatch[1]?.trim() ?? null;
|
|
133
|
+
if (collecting) {
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
currentTable = tableName;
|
|
137
|
+
collecting = currentTable !== null && names.includes(currentTable);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (collecting) {
|
|
141
|
+
lines.push(line);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return collecting || lines.length > 0 ? lines.join('\n') : null;
|
|
145
|
+
}
|
|
146
|
+
function readInlinePropertyContents(raw, propertyName, open, close) {
|
|
147
|
+
const propertyPattern = new RegExp(`\\b${escapeRegExp(propertyName)}\\s*=\\s*\\${open}`, 'u');
|
|
148
|
+
const propertyMatch = propertyPattern.exec(raw);
|
|
149
|
+
if (!propertyMatch) {
|
|
150
|
+
return '';
|
|
151
|
+
}
|
|
152
|
+
const openIndex = propertyMatch.index + propertyMatch[0].length - 1;
|
|
153
|
+
return readDelimitedContents(raw, openIndex, open, close);
|
|
154
|
+
}
|
|
155
|
+
function readDelimitedContents(raw, openIndex, open, close) {
|
|
156
|
+
let quote = null;
|
|
157
|
+
let escaped = false;
|
|
158
|
+
let depth = 0;
|
|
159
|
+
let start = -1;
|
|
160
|
+
for (let index = openIndex; index < raw.length; index += 1) {
|
|
161
|
+
const character = raw[index];
|
|
162
|
+
if (escaped) {
|
|
163
|
+
escaped = false;
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (character === '\\' && quote) {
|
|
167
|
+
escaped = true;
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
if (character === '"' || character === '\'') {
|
|
171
|
+
quote = quote === character ? null : quote ?? character;
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
if (quote) {
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
if (character === open) {
|
|
178
|
+
depth += 1;
|
|
179
|
+
if (depth === 1) {
|
|
180
|
+
start = index + 1;
|
|
181
|
+
}
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
if (character === close) {
|
|
185
|
+
depth -= 1;
|
|
186
|
+
if (depth === 0 && start !== -1) {
|
|
187
|
+
return raw.slice(start, index);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return '';
|
|
192
|
+
}
|
|
193
|
+
function readQuotedTokens(raw) {
|
|
194
|
+
const tokens = [];
|
|
195
|
+
const tokenPattern = /("(?:\\.|[^"])*"|'(?:\\.|[^'])*')/gu;
|
|
196
|
+
let token = tokenPattern.exec(raw);
|
|
197
|
+
while (token) {
|
|
198
|
+
const decoded = decodeQuotedTomlString(token[1] ?? '');
|
|
199
|
+
if (decoded !== null) {
|
|
200
|
+
tokens.push(decoded);
|
|
201
|
+
}
|
|
202
|
+
token = tokenPattern.exec(raw);
|
|
203
|
+
}
|
|
204
|
+
return tokens;
|
|
205
|
+
}
|
|
206
|
+
function decodeQuotedTomlString(raw) {
|
|
207
|
+
if (!raw || raw.length < 2) {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
if (raw.startsWith('"') && raw.endsWith('"')) {
|
|
211
|
+
try {
|
|
212
|
+
return JSON.parse(raw);
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
const unquoted = raw.slice(1, -1);
|
|
216
|
+
return unquoted
|
|
217
|
+
.replace(/\\\\/gu, '\\')
|
|
218
|
+
.replace(/\\"/gu, '"')
|
|
219
|
+
.replace(/\\'/gu, '\'');
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
const unquoted = raw.slice(1, -1);
|
|
223
|
+
return unquoted.replace(/\\'/gu, '\'');
|
|
224
|
+
}
|
|
225
|
+
function stripTomlComment(line) {
|
|
226
|
+
let quote = null;
|
|
227
|
+
let escaped = false;
|
|
228
|
+
for (let index = 0; index < line.length; index += 1) {
|
|
229
|
+
const character = line[index];
|
|
230
|
+
if (escaped) {
|
|
231
|
+
escaped = false;
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
if (character === '\\' && quote) {
|
|
235
|
+
escaped = true;
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
if (character === '"' || character === '\'') {
|
|
239
|
+
quote = quote === character ? null : quote ?? character;
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
if (character === '#' && !quote) {
|
|
243
|
+
return line.slice(0, index);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return line;
|
|
247
|
+
}
|
|
248
|
+
function escapeRegExp(value) {
|
|
249
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
250
|
+
}
|