@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
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { mkdir, stat } from 'node:fs/promises';
|
|
3
|
+
import { dirname, extname, resolve } from 'node:path';
|
|
4
|
+
import process from 'node:process';
|
|
5
|
+
import { setTimeout as sleep } from 'node:timers/promises';
|
|
6
|
+
import { pathToFileURL } from 'node:url';
|
|
7
|
+
import { promisify } from 'node:util';
|
|
8
|
+
const execFileAsync = promisify(execFile);
|
|
9
|
+
const DEFAULT_SCREENSHOT_LABEL = 'Proof screenshot';
|
|
10
|
+
const DEFAULT_SCREENSHOT_MEDIA_TYPE = 'image/png';
|
|
11
|
+
const DEFAULT_PREVIEW_CLEANUP_DELAY_MS = 1_200;
|
|
12
|
+
const SUPPORTED_SCREENSHOT_MEDIA_TYPES = new Map([
|
|
13
|
+
['.png', 'image/png'],
|
|
14
|
+
['.jpg', 'image/jpeg'],
|
|
15
|
+
['.jpeg', 'image/jpeg']
|
|
16
|
+
]);
|
|
17
|
+
const DEFAULT_DEPENDENCIES = {
|
|
18
|
+
platform: process.platform,
|
|
19
|
+
now: () => new Date().toISOString(),
|
|
20
|
+
mkdir,
|
|
21
|
+
stat,
|
|
22
|
+
sleep: async (ms) => {
|
|
23
|
+
await sleep(ms);
|
|
24
|
+
},
|
|
25
|
+
runCommand: async (request) => {
|
|
26
|
+
try {
|
|
27
|
+
const result = await execFileAsync(request.command, request.args, {
|
|
28
|
+
encoding: 'utf8',
|
|
29
|
+
maxBuffer: 10 * 1024 * 1024
|
|
30
|
+
});
|
|
31
|
+
return {
|
|
32
|
+
exit_code: 0,
|
|
33
|
+
stdout: normalizeExecOutput(result.stdout),
|
|
34
|
+
stderr: normalizeExecOutput(result.stderr),
|
|
35
|
+
signal: null,
|
|
36
|
+
command_missing: false,
|
|
37
|
+
error_message: null
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
const commandError = error;
|
|
42
|
+
return {
|
|
43
|
+
exit_code: typeof commandError.code === 'number' ? commandError.code : 1,
|
|
44
|
+
stdout: normalizeExecOutput(commandError.stdout),
|
|
45
|
+
stderr: normalizeExecOutput(commandError.stderr),
|
|
46
|
+
signal: commandError.signal ?? null,
|
|
47
|
+
command_missing: commandError.code === 'ENOENT',
|
|
48
|
+
error_message: normalizeOptionalString(commandError.message)
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
export async function resolveProviderLinearScreenshotProof(input, overrides = {}) {
|
|
54
|
+
const dependencies = { ...DEFAULT_DEPENDENCIES, ...overrides };
|
|
55
|
+
if (dependencies.platform !== 'darwin') {
|
|
56
|
+
return failure('screenshot_proof_platform_unsupported', 'linear screenshot-proof is only supported on macOS.', 422);
|
|
57
|
+
}
|
|
58
|
+
const displayId = normalizeOptionalDigits(input.displayId ?? null);
|
|
59
|
+
if (input.displayId != null && (displayId == null || displayId === '0')) {
|
|
60
|
+
return failure('screenshot_proof_display_id_invalid', '--display-id must be a positive integer when provided.', 422);
|
|
61
|
+
}
|
|
62
|
+
const windowId = normalizeOptionalDigits(input.windowId ?? null);
|
|
63
|
+
if (input.windowId != null && (windowId == null || windowId === '0')) {
|
|
64
|
+
return failure('screenshot_proof_window_id_invalid', '--window-id must be a positive integer when provided.', 422);
|
|
65
|
+
}
|
|
66
|
+
if (displayId && windowId) {
|
|
67
|
+
return failure('screenshot_proof_target_conflict', 'Use either --display-id or --window-id, not both.', 422);
|
|
68
|
+
}
|
|
69
|
+
const openPreview = input.openPreview === true;
|
|
70
|
+
const mode = windowId ? 'window' : 'display';
|
|
71
|
+
const previewProbe = openPreview ? await probePreviewRunning(dependencies) : null;
|
|
72
|
+
const resolvedOutputPathResult = resolveScreenshotOutputPath(input.cwd, input.outputPath ?? null, dependencies.now());
|
|
73
|
+
if (!resolvedOutputPathResult.ok) {
|
|
74
|
+
return failure(resolvedOutputPathResult.error.code, resolvedOutputPathResult.error.message, resolvedOutputPathResult.error.status, resolvedOutputPathResult.error.details);
|
|
75
|
+
}
|
|
76
|
+
const outputPath = resolvedOutputPathResult.output_path;
|
|
77
|
+
const outputDirectory = dirname(outputPath);
|
|
78
|
+
const mediaType = resolvedOutputPathResult.media_type;
|
|
79
|
+
const fileUrl = pathToFileURL(outputPath).toString();
|
|
80
|
+
const embedMarkdown = buildScreenshotEmbedMarkdown(fileUrl);
|
|
81
|
+
const captureCommand = buildCaptureCommand({
|
|
82
|
+
outputPath,
|
|
83
|
+
displayId,
|
|
84
|
+
windowId,
|
|
85
|
+
openPreview
|
|
86
|
+
});
|
|
87
|
+
const baseCapture = buildBaseCaptureRecord({
|
|
88
|
+
mode,
|
|
89
|
+
displayId,
|
|
90
|
+
windowId,
|
|
91
|
+
openPreview,
|
|
92
|
+
outputPath,
|
|
93
|
+
fileUrl,
|
|
94
|
+
embedMarkdown,
|
|
95
|
+
command: captureCommand,
|
|
96
|
+
mediaType
|
|
97
|
+
});
|
|
98
|
+
try {
|
|
99
|
+
await dependencies.mkdir(outputDirectory, { recursive: true });
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
const directoryError = error;
|
|
103
|
+
return failureWithCapture(baseCapture, buildSkippedCleanup('Capture cleanup was skipped because the screenshot output directory could not be prepared.'), 'screenshot_proof_output_directory_prepare_failed', `Screenshot output directory "${outputDirectory}" could not be prepared before capture.`, 422, {
|
|
104
|
+
output_path: outputPath,
|
|
105
|
+
output_directory: outputDirectory,
|
|
106
|
+
error_code: directoryError.code ?? null,
|
|
107
|
+
error_message: normalizeOptionalString(directoryError.message)
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
const captureResult = await dependencies.runCommand({
|
|
111
|
+
command: captureCommand.executable,
|
|
112
|
+
args: captureCommand.args
|
|
113
|
+
});
|
|
114
|
+
if (captureResult.command_missing) {
|
|
115
|
+
return failureWithCapture(baseCapture, buildSkippedCleanup('Capture cleanup was skipped because `screencapture` never started.'), 'screenshot_proof_capture_command_missing', 'macOS `screencapture` is unavailable on this host.', 503);
|
|
116
|
+
}
|
|
117
|
+
if (captureResult.exit_code !== 0) {
|
|
118
|
+
const classifiedError = classifyScreencaptureFailure(captureResult, outputPath);
|
|
119
|
+
return failureWithCapture(baseCapture, buildSkippedCleanup('Capture cleanup was skipped because the screenshot capture did not complete.'), classifiedError.code, classifiedError.message, classifiedError.status, classifiedError.details);
|
|
120
|
+
}
|
|
121
|
+
let fileStats;
|
|
122
|
+
try {
|
|
123
|
+
fileStats = await dependencies.stat(outputPath);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return failureWithCapture(baseCapture, buildSkippedCleanup('Cleanup was skipped because the screenshot file could not be verified after capture.'), 'screenshot_proof_output_unreadable', `Screenshot capture reported success, but "${outputPath}" is not readable.`, 422, {
|
|
127
|
+
output_path: outputPath
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
if (!fileStats.isFile() || fileStats.size <= 0) {
|
|
131
|
+
return failureWithCapture(baseCapture, buildSkippedCleanup('Cleanup was skipped because the screenshot file was empty or not a regular file.'), 'screenshot_proof_output_unreadable', `Screenshot capture must produce a non-empty file at "${outputPath}".`, 422, {
|
|
132
|
+
output_path: outputPath,
|
|
133
|
+
bytes: fileStats.size
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
const successfulCapture = {
|
|
137
|
+
...baseCapture,
|
|
138
|
+
bytes: fileStats.size
|
|
139
|
+
};
|
|
140
|
+
if (!openPreview) {
|
|
141
|
+
return {
|
|
142
|
+
ok: true,
|
|
143
|
+
capture: {
|
|
144
|
+
...successfulCapture,
|
|
145
|
+
cleanup: buildSkippedCleanup('Cleanup skipped because the helper did not open a temporary Preview surface.')
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
if (previewProbe?.kind === 'failed') {
|
|
150
|
+
return failureWithCapture(successfulCapture, previewProbe.cleanup, 'screenshot_proof_cleanup_failed', previewProbe.cleanup.summary, 502, {
|
|
151
|
+
output_path: outputPath,
|
|
152
|
+
cleanup_status: previewProbe.cleanup.status
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
if (previewProbe?.kind === 'running') {
|
|
156
|
+
return {
|
|
157
|
+
ok: true,
|
|
158
|
+
capture: {
|
|
159
|
+
...successfulCapture,
|
|
160
|
+
cleanup: buildSkippedCleanup('Cleanup skipped because Preview was already running before capture, so the helper would not close unrelated Preview documents.')
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
await dependencies.sleep(DEFAULT_PREVIEW_CLEANUP_DELAY_MS);
|
|
165
|
+
const cleanupResult = await resolvePreviewCleanup(dependencies);
|
|
166
|
+
if (cleanupResult.status === 'failed' || cleanupResult.status === 'automation-denied') {
|
|
167
|
+
return failureWithCapture(successfulCapture, cleanupResult, cleanupResult.status === 'automation-denied'
|
|
168
|
+
? 'screenshot_proof_cleanup_automation_denied'
|
|
169
|
+
: 'screenshot_proof_cleanup_failed', cleanupResult.summary, cleanupResult.status === 'automation-denied' ? 422 : 502, {
|
|
170
|
+
output_path: outputPath,
|
|
171
|
+
cleanup_status: cleanupResult.status
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
ok: true,
|
|
176
|
+
capture: {
|
|
177
|
+
...successfulCapture,
|
|
178
|
+
cleanup: cleanupResult
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
function resolveScreenshotOutputPath(cwd, outputPath, now) {
|
|
183
|
+
const normalizedOutputPath = normalizeOptionalString(outputPath);
|
|
184
|
+
const resolved = normalizedOutputPath != null
|
|
185
|
+
? resolve(cwd, normalizedOutputPath)
|
|
186
|
+
: resolve(cwd, '.tmp', `linear-screenshot-proof-${sanitizeTimestamp(now)}.png`);
|
|
187
|
+
const extension = extname(resolved).toLowerCase();
|
|
188
|
+
const mediaType = SUPPORTED_SCREENSHOT_MEDIA_TYPES.get(extension);
|
|
189
|
+
if (!mediaType) {
|
|
190
|
+
return {
|
|
191
|
+
ok: false,
|
|
192
|
+
error: {
|
|
193
|
+
code: 'screenshot_proof_output_extension_invalid',
|
|
194
|
+
message: 'Screenshot output must end in .png, .jpg, or .jpeg so it remains compatible with Linear workpad image embedding.',
|
|
195
|
+
status: 422,
|
|
196
|
+
details: {
|
|
197
|
+
output_path: resolved,
|
|
198
|
+
supported_extensions: [...SUPPORTED_SCREENSHOT_MEDIA_TYPES.keys()]
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
ok: true,
|
|
205
|
+
output_path: resolved,
|
|
206
|
+
media_type: mediaType
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
function buildCaptureCommand(input) {
|
|
210
|
+
const args = ['-x'];
|
|
211
|
+
if (input.openPreview) {
|
|
212
|
+
args.push('-P');
|
|
213
|
+
}
|
|
214
|
+
if (input.displayId) {
|
|
215
|
+
args.push('-D', input.displayId);
|
|
216
|
+
}
|
|
217
|
+
if (input.windowId) {
|
|
218
|
+
args.push('-l', input.windowId);
|
|
219
|
+
}
|
|
220
|
+
args.push(input.outputPath);
|
|
221
|
+
return {
|
|
222
|
+
executable: 'screencapture',
|
|
223
|
+
args
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
function buildBaseCaptureRecord(input) {
|
|
227
|
+
return {
|
|
228
|
+
platform: 'darwin',
|
|
229
|
+
mode: input.mode,
|
|
230
|
+
display_id: input.displayId,
|
|
231
|
+
window_id: input.windowId,
|
|
232
|
+
open_preview: input.openPreview,
|
|
233
|
+
command: input.command,
|
|
234
|
+
output_path: input.outputPath,
|
|
235
|
+
file_url: input.fileUrl,
|
|
236
|
+
embed_markdown: input.embedMarkdown,
|
|
237
|
+
bytes: null,
|
|
238
|
+
media_type: input.mediaType ?? DEFAULT_SCREENSHOT_MEDIA_TYPE,
|
|
239
|
+
cleanup: buildSkippedCleanup('Cleanup status has not been resolved yet.')
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
async function resolvePreviewCleanup(dependencies) {
|
|
243
|
+
const cleanupCommand = {
|
|
244
|
+
executable: 'osascript',
|
|
245
|
+
args: ['-e', buildPreviewCleanupScript()]
|
|
246
|
+
};
|
|
247
|
+
const cleanupResult = await dependencies.runCommand({
|
|
248
|
+
command: cleanupCommand.executable,
|
|
249
|
+
args: cleanupCommand.args
|
|
250
|
+
});
|
|
251
|
+
const stdout = normalizeOptionalString(cleanupResult.stdout);
|
|
252
|
+
const stderr = normalizeOptionalString(cleanupResult.stderr) ?? cleanupResult.error_message;
|
|
253
|
+
if (cleanupResult.command_missing) {
|
|
254
|
+
return {
|
|
255
|
+
attempted: true,
|
|
256
|
+
status: 'failed',
|
|
257
|
+
summary: 'Preview cleanup failed because `osascript` is unavailable on this host.',
|
|
258
|
+
command: cleanupCommand,
|
|
259
|
+
exit_code: cleanupResult.exit_code,
|
|
260
|
+
stdout,
|
|
261
|
+
stderr
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
if (cleanupResult.exit_code !== 0) {
|
|
265
|
+
if (isAutomationDenied(stderr)) {
|
|
266
|
+
return {
|
|
267
|
+
attempted: true,
|
|
268
|
+
status: 'automation-denied',
|
|
269
|
+
summary: 'Preview cleanup was blocked by macOS Automation permission. Grant Apple Events access for this helper or rerun without `--open-preview`.',
|
|
270
|
+
command: cleanupCommand,
|
|
271
|
+
exit_code: cleanupResult.exit_code,
|
|
272
|
+
stdout,
|
|
273
|
+
stderr
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
return {
|
|
277
|
+
attempted: true,
|
|
278
|
+
status: 'failed',
|
|
279
|
+
summary: 'Preview cleanup failed after capture; inspect stderr for the AppleScript error.',
|
|
280
|
+
command: cleanupCommand,
|
|
281
|
+
exit_code: cleanupResult.exit_code,
|
|
282
|
+
stdout,
|
|
283
|
+
stderr
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
if (stdout === 'closed') {
|
|
287
|
+
return {
|
|
288
|
+
attempted: true,
|
|
289
|
+
status: 'succeeded',
|
|
290
|
+
summary: 'Preview cleanup closed the temporary screenshot document after capture.',
|
|
291
|
+
command: cleanupCommand,
|
|
292
|
+
exit_code: 0,
|
|
293
|
+
stdout,
|
|
294
|
+
stderr
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
if (stdout === 'not-running' || stdout === 'not-found') {
|
|
298
|
+
return buildSkippedCleanup('Cleanup skipped because Preview was already closed before the AppleScript cleanup step.');
|
|
299
|
+
}
|
|
300
|
+
if (stdout === 'ambiguous') {
|
|
301
|
+
return buildSkippedCleanup('Cleanup skipped because Preview opened more than one document before the bounded cleanup step, so the helper would not guess which document to close.');
|
|
302
|
+
}
|
|
303
|
+
return {
|
|
304
|
+
attempted: true,
|
|
305
|
+
status: 'failed',
|
|
306
|
+
summary: 'Preview cleanup failed after capture; the AppleScript cleanup step returned an unexpected result.',
|
|
307
|
+
command: cleanupCommand,
|
|
308
|
+
exit_code: 0,
|
|
309
|
+
stdout,
|
|
310
|
+
stderr
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
async function probePreviewRunning(dependencies) {
|
|
314
|
+
const previewCheck = await dependencies.runCommand({
|
|
315
|
+
command: 'pgrep',
|
|
316
|
+
args: ['-x', 'Preview']
|
|
317
|
+
});
|
|
318
|
+
if (previewCheck.command_missing) {
|
|
319
|
+
return {
|
|
320
|
+
kind: 'failed',
|
|
321
|
+
cleanup: {
|
|
322
|
+
attempted: false,
|
|
323
|
+
status: 'failed',
|
|
324
|
+
summary: 'Preview cleanup preflight failed because `pgrep` is unavailable on this host.',
|
|
325
|
+
command: null,
|
|
326
|
+
exit_code: previewCheck.exit_code,
|
|
327
|
+
stdout: normalizeOptionalString(previewCheck.stdout),
|
|
328
|
+
stderr: normalizeOptionalString(previewCheck.stderr) ?? previewCheck.error_message
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
if (previewCheck.exit_code === 1) {
|
|
333
|
+
return { kind: 'not-running' };
|
|
334
|
+
}
|
|
335
|
+
if (previewCheck.exit_code === 0) {
|
|
336
|
+
return { kind: 'running' };
|
|
337
|
+
}
|
|
338
|
+
return {
|
|
339
|
+
kind: 'failed',
|
|
340
|
+
cleanup: {
|
|
341
|
+
attempted: false,
|
|
342
|
+
status: 'failed',
|
|
343
|
+
summary: 'Preview cleanup preflight failed because Preview process discovery did not complete before capture.',
|
|
344
|
+
command: null,
|
|
345
|
+
exit_code: previewCheck.exit_code,
|
|
346
|
+
stdout: normalizeOptionalString(previewCheck.stdout),
|
|
347
|
+
stderr: normalizeOptionalString(previewCheck.stderr) ?? previewCheck.error_message
|
|
348
|
+
}
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
function buildPreviewCleanupScript() {
|
|
352
|
+
return [
|
|
353
|
+
'if application "Preview" is not running then return "not-running"',
|
|
354
|
+
'tell application "Preview"',
|
|
355
|
+
' if (count of documents) is 0 then return "not-found"',
|
|
356
|
+
' if (count of documents) is not 1 then return "ambiguous"',
|
|
357
|
+
' close front document saving no',
|
|
358
|
+
' if (count of documents) is 0 then quit',
|
|
359
|
+
'end tell',
|
|
360
|
+
'return "closed"'
|
|
361
|
+
].join('\n');
|
|
362
|
+
}
|
|
363
|
+
function classifyScreencaptureFailure(result, outputPath) {
|
|
364
|
+
const stderr = normalizeOptionalString(result.stderr) ?? result.error_message;
|
|
365
|
+
if (isScreenRecordingDenied(stderr)) {
|
|
366
|
+
return {
|
|
367
|
+
code: 'screenshot_proof_screen_recording_denied',
|
|
368
|
+
message: 'macOS denied Screen Recording access for `screencapture`. Grant Screen Recording permission or use a machine where this helper is authorized.',
|
|
369
|
+
status: 422,
|
|
370
|
+
details: {
|
|
371
|
+
output_path: outputPath,
|
|
372
|
+
exit_code: result.exit_code,
|
|
373
|
+
stderr
|
|
374
|
+
}
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
return {
|
|
378
|
+
code: 'screenshot_proof_capture_failed',
|
|
379
|
+
message: 'macOS `screencapture` did not produce a screenshot file.',
|
|
380
|
+
status: 502,
|
|
381
|
+
details: {
|
|
382
|
+
output_path: outputPath,
|
|
383
|
+
exit_code: result.exit_code,
|
|
384
|
+
stderr
|
|
385
|
+
}
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
function buildScreenshotEmbedMarkdown(fileUrl) {
|
|
389
|
+
return /[()]/u.test(fileUrl)
|
|
390
|
+
? ``
|
|
391
|
+
: ``;
|
|
392
|
+
}
|
|
393
|
+
function buildSkippedCleanup(summary) {
|
|
394
|
+
return {
|
|
395
|
+
attempted: false,
|
|
396
|
+
status: 'skipped',
|
|
397
|
+
summary,
|
|
398
|
+
command: null,
|
|
399
|
+
exit_code: null,
|
|
400
|
+
stdout: null,
|
|
401
|
+
stderr: null
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
function failure(code, message, status, details) {
|
|
405
|
+
return {
|
|
406
|
+
ok: false,
|
|
407
|
+
capture: null,
|
|
408
|
+
error: {
|
|
409
|
+
code,
|
|
410
|
+
message,
|
|
411
|
+
status,
|
|
412
|
+
...(details ? { details } : {})
|
|
413
|
+
}
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
function failureWithCapture(capture, cleanup, code, message, status, details) {
|
|
417
|
+
return {
|
|
418
|
+
ok: false,
|
|
419
|
+
capture: {
|
|
420
|
+
...capture,
|
|
421
|
+
cleanup
|
|
422
|
+
},
|
|
423
|
+
error: {
|
|
424
|
+
code,
|
|
425
|
+
message,
|
|
426
|
+
status,
|
|
427
|
+
...(details ? { details } : {})
|
|
428
|
+
}
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
function normalizeOptionalDigits(value) {
|
|
432
|
+
const normalized = normalizeOptionalString(value);
|
|
433
|
+
if (!normalized) {
|
|
434
|
+
return null;
|
|
435
|
+
}
|
|
436
|
+
return /^\d+$/u.test(normalized) ? normalized : null;
|
|
437
|
+
}
|
|
438
|
+
function normalizeOptionalString(value) {
|
|
439
|
+
if (typeof value !== 'string') {
|
|
440
|
+
return null;
|
|
441
|
+
}
|
|
442
|
+
const trimmed = value.trim();
|
|
443
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
444
|
+
}
|
|
445
|
+
function normalizeExecOutput(value) {
|
|
446
|
+
if (typeof value === 'string') {
|
|
447
|
+
return value;
|
|
448
|
+
}
|
|
449
|
+
return value ? value.toString('utf8') : '';
|
|
450
|
+
}
|
|
451
|
+
function sanitizeTimestamp(value) {
|
|
452
|
+
return value.replace(/[^0-9A-Za-z]+/gu, '');
|
|
453
|
+
}
|
|
454
|
+
function isScreenRecordingDenied(value) {
|
|
455
|
+
if (!value) {
|
|
456
|
+
return false;
|
|
457
|
+
}
|
|
458
|
+
const normalized = value.toLowerCase();
|
|
459
|
+
return (normalized.includes('screen recording')
|
|
460
|
+
|| normalized.includes('not authorized')
|
|
461
|
+
|| normalized.includes('not permitted')
|
|
462
|
+
|| normalized.includes('windowserver'));
|
|
463
|
+
}
|
|
464
|
+
function isAutomationDenied(value) {
|
|
465
|
+
if (!value) {
|
|
466
|
+
return false;
|
|
467
|
+
}
|
|
468
|
+
const normalized = value.toLowerCase();
|
|
469
|
+
return (normalized.includes('-1743')
|
|
470
|
+
|| normalized.includes('not authorized to send apple events')
|
|
471
|
+
|| normalized.includes('not permitted to send apple events')
|
|
472
|
+
|| normalized.includes('err aeeventnotpermitted'));
|
|
473
|
+
}
|