From 9bd6272fdf4e1f2bbef43ac8c56722cf2ba31641 Mon Sep 17 00:00:00 2001 From: Neil <4138956+nwparker@users.noreply.github.com> Date: Wed, 4 Nov 2026 21:08:19 -0800 Subject: [PATCH] refactor(tooling): organize build, CI, and test owners (#38130) * refactor(tooling): organize test runtime and maintenance owners * test(tooling): preserve relocated runtime fixture dependency edges * refactor(tooling): preserve xterm routing owner checks * ci(tooling): include routing owner in sparse checkout * test(tooling): preserve copied workflow dependency closures * fix(tooling): normalize hashed JSON assets in release parity * fix(tooling): distinguish asset aliases from literal references * fix(tooling): frame normalized asset reference payloads * fix(tooling): normalize decoded JSON asset references * refactor(tooling): organize build, CI and release owners * fix(tooling): align moved generator and workflow path contracts * fix(tooling): update generated plugin bundle owner banners * test(tooling): create relocated mobile verifier fixture directories * test(tooling): copy headless detector dependency closure * test(tooling): align native batch policy fixtures with owner path * fix(tooling): link moved reliability command to historical evidence * fix(tooling): preserve nested sandbox owners and canonical guide source * fix(tooling): target release version owners in checkout fixture --- .github/CONTRIBUTING.md | 2 +- .../actions/prepare-native-runtime/action.yml | 10 +- .../prepare-orcad-prebuilds/action.yml | 8 +- .../prepare-wayland-clipboard/action.yml | 2 +- .../build-or-validate.sh | 4 +- .../prepare-windows-agent-hook/action.yml | 6 +- .../prepare-windows-cli-launcher/action.yml | 6 +- .../prepare-xterm-dependencies/action.yml | 2 +- .../scripts/render-readme-downloads-badge.mjs | 2 +- .github/workflows/adhoc-mac-build.yml | 22 +- .../ci-cache-warmup-platform-jobs.yml | 20 +- .../workflows/ci-cache-warmup-platforms.yml | 57 +-- .github/workflows/ci-cache-warmup.yml | 28 +- .github/workflows/ci-runner-demand.yml | 2 +- .github/workflows/ci-xterm-cache.yml | 6 +- .github/workflows/computer-e2e.yml | 14 +- .github/workflows/computer-macos-native.yml | 10 +- .github/workflows/daily-mac-build.yml | 4 +- .github/workflows/dependency-security.yml | 2 +- .github/workflows/dev-channel-win-build.yml | 10 +- .github/workflows/e2e.yml | 63 ++- .github/workflows/hourly-mac-build.yml | 4 +- .github/workflows/macos-updater-tests.yml | 2 +- .github/workflows/mobile.yml | 25 +- .github/workflows/node-server-tests.yml | 40 +- .github/workflows/packaged-browser-e2e.yml | 2 +- .github/workflows/pr.yml | 91 ++-- .github/workflows/preflight-benchmark.yml | 10 +- .../preflight-critical-path-benchmark.yml | 4 +- .../workflows/qualified-orcad-template.yml | 2 +- .github/workflows/release-cut.yml | 30 +- .../release-javascript-benchmark.yml | 19 +- .github/workflows/release-javascript.yml | 17 +- .github/workflows/release-mac-build.yml | 10 +- .github/workflows/release-policy.yml | 2 +- .github/workflows/ssh-hostile-hosts.yml | 19 +- .github/workflows/ssh-windows-hosts.yml | 28 +- .github/workflows/terminal-perf.yml | 4 +- .github/workflows/unit-plan.yml | 6 +- .github/workflows/unit-selection-evidence.yml | 6 +- .github/workflows/unit-tests.yml | 14 +- .github/workflows/win-crash-survival-e2e.yml | 2 +- .../workflows/win-orcad-serve-switch-e2e.yml | 8 +- .github/workflows/win-update-survival-e2e.yml | 2 +- .../windows-native-preparation-benchmark.yml | 2 +- .../workflows/windows-signing-rehearsal.yml | 4 +- .../workflows/windows-typecheck-parity.yml | 8 +- .github/workflows/wsl-orcad-e2e.yml | 2 +- .gitignore | 1 + .../build-plugins/process-host-dev-rebuild.ts | 2 +- .../build-plugins/sandboxed-script-bundles.ts | 2 +- config/build-plugins/vite-cache-retention.ts | 2 +- .../invoke-windows-host-cells.ps1 | 2 +- config/electron-builder.config.cjs | 38 +- config/flaky-test-pattern-baseline.txt | 8 +- config/legacy-relay-compat-tags-baseline.txt | 4 +- config/main-sync-spawn-baseline.txt | 2 +- config/packaged-native-build-entries.cjs | 2 +- config/packaged-runtime-node-modules.cjs | 7 +- .../packaged-windows-only-runtime-files.cjs | 2 +- config/patches/xterm-upstream.json | 2 +- config/path-literal-baseline.txt | 14 +- config/reliability-gates.jsonc | 19 +- .../agent-lineage-cycle-cleanup-benchmark.mjs | 2 +- .../agent-lineage-reachability-benchmark.mjs | 4 +- config/scripts/agent-state-rules-bundle.mjs | 2 +- .../scripts/agent-state-rules-bundle.test.mjs | 2 +- config/scripts/agent-typescript-lsp.mjs | 7 +- .../zip-extractor-command.test.mjs | 5 +- .../shared-tree-publish.mjs | 0 .../shared-tree-publish.test.mjs | 0 .../reflink-copy}/space-sharing-copy.mjs | 0 .../reflink-copy}/space-sharing-copy.test.ts | 0 config/scripts/ast-grep-gates.mjs | 2 +- .../scripts/audit-localization-coverage.mjs | 2 +- .../benchmark-windows-security-reuse.mjs | 30 +- .../build-source-commit.mjs | 0 .../build-mobile-web-app-bundle.mjs | 16 +- .../build-mobile-web-app-bundle.test.mjs | 10 +- .../mobile-entry-static-closure.test.mjs | 0 .../mobile-web-bundle-fixture-tree.mjs | 0 .../mobile-web-bundle-manifest.mjs | 4 +- .../mobile-web-bundle-manifest.test.mjs | 2 +- ...bile-web-bundle-serializer-parity.test.mjs | 6 +- .../mobile-web-page-routes.mjs | 0 .../mobile-web-page-routes.test.mjs | 4 +- .../mobile-web-source-line-endings.mjs | 0 .../mobile-web-source-line-endings.test.mjs | 2 +- .../verify-mobile-web-app-bundle.mjs | 6 +- .../scripts/capture-agent-pty-transcript.mjs | 2 +- config/scripts/capture-live-input-lag.mjs | 2 +- .../scripts/check-compat-boundary-imports.mjs | 6 +- .../check-daemon-blocking-call-ratchet.mjs | 9 +- .../check-daemon-protocol-crossing.mjs | 2 +- .../check-daemon-protocol-crossing.test.mjs | 2 +- config/scripts/check-dependency-security.mjs | 2 +- .../check-direct-link-open-ratchet.mjs | 5 +- .../scripts/check-e2e-typecheck-ratchet.mjs | 2 +- .../check-flaky-test-pattern-ratchet.mjs | 9 +- config/scripts/check-focus-read-ratchet.mjs | 2 +- .../check-host-list-render-ratchet.mjs | 5 +- .../check-id-only-store-write-ratchet.mjs | 5 +- config/scripts/check-import-boundaries.mjs | 4 +- .../scripts/check-import-boundaries.test.mjs | 2 +- .../scripts/check-layout-writer-ratchets.mjs | 2 +- .../check-legacy-relay-fence-ratchet.mjs | 7 +- config/scripts/check-max-lines-ratchet.mjs | 5 +- .../scripts/check-max-lines-ratchet.test.mjs | 2 +- ...ck-memo-translate-subscription-ratchet.mjs | 5 +- config/scripts/check-node-runtime-pin.mjs | 7 +- config/scripts/check-path-literal-ratchet.mjs | 6 +- .../check-path-literal-ratchet.test.mjs | 4 +- config/scripts/check-react-doctor-changed.mjs | 7 +- .../check-react-doctor-changed.test.mjs | 2 +- .../scripts/check-repo-host-read-ratchet.mjs | 5 +- .../check-runtime-electron-ratchet.mjs | 7 +- ...heck-runtime-launcher-protocol-ratchet.mjs | 13 +- ...runtime-launcher-protocol-ratchet.test.mjs | 4 +- config/scripts/check-test-file-runners.mjs | 2 +- .../scripts/check-test-file-runners.test.mjs | 2 +- config/scripts/check-ts-nocheck-ratchet.mjs | 5 +- .../check-unproven-pty-retirement-ratchet.mjs | 5 +- .../check-workspace-record-read-ratchet.mjs | 5 +- .../check-worktree-id-composer-ratchet.mjs | 5 +- config/scripts/ci-shard-timings.json | 444 +++++++++--------- .../ci-pnpm-store-benchmark.mjs | 6 +- .../ci-pnpm-store-mode.test.mjs | 0 .../e2e-failures}/ci-e2e-failure-summary.mjs | 2 +- .../ci-e2e-failure-summary.test.mjs | 0 .../e2e-failures}/ci-e2e-failure-tracking.mjs | 0 .../e2e-selection}/ci-e2e-job-selection.mjs | 0 .../ci-e2e-job-selection.test.mjs | 2 +- .../e2e-selection}/ci-e2e-shard-plan.mjs | 2 +- .../ci-e2e-shard-selection.test.mjs | 2 +- .../runner-capacity}/ci-job-executions.mjs | 0 .../runner-capacity}/ci-runner-demand.mjs | 0 .../runner-capacity}/ci-runner-metrics.mjs | 0 .../ci-runner-metrics.test.mjs | 0 .../{ => ci/sharding}/ci-shard-assignment.mjs | 2 +- .../sharding}/ci-shard-assignment.test.mjs | 6 +- .../sharding}/ci-shard-timing-import.mjs | 0 .../{ => ci/sharding}/ci-shard-timings.md | 6 +- .../{ => ci/sharding}/ci-unit-sequencer.mjs | 2 +- .../sharding}/ci-unit-sequencer.test.mjs | 0 .../sharding}/ci-unit-timing-import.mjs | 0 .../sharding}/ci-unit-timing-reporter.mjs | 2 +- .../ci-unit-timing-reporter.test.mjs | 0 .../ci-unit-module-cache-contents.mjs | 0 .../ci-unit-module-cache-contents.test.mjs | 0 .../ci-unit-module-cache-trailer.mjs | 0 .../unit-cache}/ci-unit-module-cache.mjs | 18 +- .../unit-cache}/ci-unit-module-cache.test.mjs | 0 .../unit-selection}/ci-unit-matrix.mjs | 0 .../{ => ci/unit-selection}/ci-unit-plan.mjs | 6 +- .../unit-selection}/ci-unit-plan.test.mjs | 2 +- .../ci-unit-selection-review.mjs | 0 .../ci-unit-selection-review.test.mjs | 0 .../unit-selection}/ci-unit-selection.mjs | 15 +- .../ci-unit-selection.test.mjs | 18 +- .../ci-unit-dependency-graph.mjs | 10 +- .../ci-unit-dependency-graph.test.mjs | 2 +- .../ci-unit-exclusion-coverage.test.mjs | 2 +- .../dependency-graph}/ci-unit-files.mjs | 14 +- .../ci-unit-indirect-inputs.mjs | 6 +- .../ci-unit-indirect-inputs.test.mjs | 2 +- .../ci-unit-input-ownership.json | 0 .../ci-unit-input-ownership.mjs | 8 +- .../ci-unit-input-ownership.test.mjs | 7 +- .../ci-branch-cache-sweep.test.mjs | 0 .../ci-closed-pr-caches.test.mjs | 0 .../ci-closed-pr-cancellation.test.mjs | 0 .../ci-draft-pr-admission.test.mjs | 2 +- .../ci-managed-ssh-execution.test.mjs | 11 +- .../ci-native-cache.test.mjs | 0 .../ci-native-toolchain.test.mjs | 8 +- .../ci-pr-concurrency-keys.test.mjs | 0 .../scripts/claude-usage-append-benchmark.mjs | 2 +- .../claude-usage-benchmark-scanner.mjs | 2 +- .../claude-usage-hardening-cost-benchmark.mjs | 2 +- config/scripts/{ => cli-build}/build-cli.mjs | 10 +- .../{ => cli-build}/build-cli.test.mjs | 6 +- .../codex-usage-parser-memory-benchmark.mjs | 12 +- .../scripts/compare-benchmark-artifacts.mjs | 2 +- config/scripts/computer-use-smoke.mjs | 2 +- .../schema-facts}/daemon-protocol-facts.mjs | 0 .../daemon-protocol-facts.test.mjs | 2 +- .../execution}/run-electron-vite-build.mjs | 11 +- .../electron-vite-output-contract.test.ts | 17 +- .../preload-output-contract.mjs | 1 - .../output-contracts}/renderer-boot-graph.mjs | 0 .../renderer-boot-graph.test.mjs | 0 .../sandbox-preload-imports.mjs | 0 .../linux}/appimage-node-runtime.cjs | 10 +- .../linux}/appimage-node-runtime.test.mjs | 4 +- .../linux}/build-linux-local.mjs | 2 +- .../linux}/build-linux-local.test.mjs | 4 +- .../linux}/package-linux-formats-appimage.mjs | 4 +- .../package-linux-formats-appimage.test.mjs | 0 .../linux}/package-linux-formats.mjs | 2 +- .../linux}/package-linux-formats.test.mjs | 4 +- .../macos}/adhoc-mac-manifests.mjs | 0 .../macos}/adhoc-mac-manifests.test.mjs | 0 .../macos}/build-mac-local.mjs | 0 .../macos}/build-mac-local.test.mjs | 0 .../macos}/build-mac-notarization-overlap.mjs | 2 +- .../build-mac-notarization-overlap.test.mjs | 0 .../macos}/mac-build-compatibility.cjs | 2 +- .../macos}/mac-build-compatibility.test.mjs | 0 ...mac-notarization-builder-contract.test.mjs | 0 .../macos}/sign-mac-app.mjs | 0 .../macos}/sign-mac-app.test.mjs | 4 +- .../electron-builder-config.test.mjs | 22 +- ...ectron-builder-mac-channel-config.test.mjs | 8 +- .../electron-builder-native-rebuild.cjs | 22 +- .../electron-builder-native-rebuild.test.mjs | 26 +- ...lectron-builder-runtime-resources.test.mjs | 8 +- .../electron-builder-speech-config.test.mjs | 2 +- .../packaged-node-pty-prebuild-prune.test.mjs | 4 +- .../packaged-process-host-fixture.mjs | 4 +- .../packaged-process-host.test.mjs | 12 +- ...ckaged-repository-input-exclusion.test.mjs | 2 +- .../packaged-source-map-prune.test.mjs | 2 +- ...ckaged-windows-only-runtime-files.test.mjs | 8 +- .../verify-packaged-browser-participation.mjs | 2 +- ...fy-packaged-browser-participation.test.mjs | 0 .../verify-packaged-daemon-entry.cjs | 6 +- .../verify-packaged-daemon-entry.test.mjs | 0 .../verify-packaged-mobile-web-bundle.cjs | 4 +- ...verify-packaged-mobile-web-bundle.test.mjs | 6 +- ...verify-packaged-node-pty-job-ownership.cjs | 12 +- ...y-packaged-node-pty-job-ownership.test.mjs | 7 +- .../verify-packaged-plugin-resources.cjs | 0 .../verify-packaged-plugin-resources.test.mjs | 0 .../verify-packaged-serve-payload.cjs | 0 .../verify-packaged-serve-payload.test.mjs | 2 +- .../verify-packaged-windows-agent-hook.cjs | 8 +- ...erify-packaged-windows-agent-hook.test.mjs | 2 +- config/scripts/dev-profile-seed.mjs | 4 +- .../dev-electron-bundle-cache.mjs | 0 .../dev-electron-bundle-cache.test.ts | 0 .../dev-instance-isolation.mjs | 0 .../dev-instance-isolation.test.mjs | 0 .../remote-agent-session-process-cleanup.mjs | 0 .../electron-platform-path.mjs | 0 ...-electron-package-binary-test-fixtures.mjs | 40 +- .../install-electron-package-binary.mjs | 8 +- .../install-electron-package-binary.test.mjs | 0 .../shared-electron-dist-cache.mjs | 12 +- .../shared-electron-dist-cache.test.ts | 2 +- .../scripts/generate-rpc-params-catalog.mjs | 2 +- .../generate-skill-bundle-manifest.mjs | 2 +- .../generate-skill-bundle-manifest.test.mjs | 9 +- .../git-pull-request-diff-base.mjs | 0 .../git-pull-request-diff-base.test.mjs | 0 .../headless-detector-compiler-cache.test.mjs | 26 +- .../json-parser-migration-benchmark.mjs | 4 +- .../legacy-alt-screen-scan-benchmark.mjs | 2 +- config/scripts/lint-react-doctor-changed.mjs | 2 +- .../locale-collator-sort-benchmark.mjs | 2 +- .../localization-extraction-change-scope.mjs | 1 + ...alization-extraction-change-scope.test.mjs | 15 +- .../macos-terminal-host-bundle.cjs | 8 +- .../macos-terminal-host-bundle.test.mjs | 10 +- .../managed-data-account-runtime.test.ts | 2 +- .../markdown-note-line-scan-benchmark.mjs | 2 +- config/scripts/mobile-backspace-benchmark.mjs | 4 +- .../scripts/mobile-file-ranking-benchmark.mjs | 6 +- .../mobile-history-scope-paths-benchmark.mjs | 2 +- .../mobile-linear-group-sorted-benchmark.mjs | 2 +- .../scripts/mobile-linear-sort-benchmark.mjs | 2 +- .../mobile-log-revisions-benchmark.mjs | 2 +- config/scripts/mobile-release-check-scope.mjs | 2 +- .../mobile-release-check-scope.test.mjs | 10 +- ...ile-source-control-collation-benchmark.mjs | 2 +- config/scripts/mobile-task-sort-benchmark.mjs | 2 +- config/scripts/mobile-test-change-scope.mjs | 12 +- ...bile-web-app-agent-history-render.test.mjs | 2 +- .../mobile-web-app-agent-icon-render.test.mjs | 2 +- ...obile-web-app-browser-pane-render.test.mjs | 2 +- .../mobile-web-app-bundle-test-fixture.mjs | 5 +- ...app-clipboard-image-resize-render.test.mjs | 2 +- ...le-web-app-composer-sizing-render.test.mjs | 2 +- .../mobile-web-app-drawer-render.test.mjs | 2 +- ...bile-web-app-files-external-links.test.mjs | 2 +- .../mobile-web-app-files-render.test.mjs | 2 +- ...ile-web-app-handoff-grants-render.test.mjs | 2 +- .../mobile-web-app-held-press-render.test.mjs | 2 +- .../mobile-web-app-mermaid-render.test.mjs | 2 +- ...eb-app-module-closure-entrypoints.test.mjs | 2 +- ...bile-web-app-native-parity-render.test.mjs | 2 +- ...ile-web-app-page-closure-families.test.mjs | 2 +- ...ile-web-app-page-grant-call-sites.test.mjs | 4 +- ...le-web-app-push-subsystem-closure.test.mjs | 2 +- ...le-web-app-queued-messages-render.test.mjs | 2 +- .../mobile-web-app-render.test.mjs | 2 +- ...bile-web-app-rich-markdown-render.test.mjs | 2 +- .../mobile-web-app-route-chunk-closure.mjs | 5 +- .../mobile-web-app-route-snapshot.test.mjs | 2 +- .../mobile-web-app-safe-area-render.test.mjs | 2 +- ...ile-web-app-screencast-lane-grant.test.mjs | 4 +- ...web-app-session-dictation-capture.test.mjs | 4 +- ...le-web-app-session-external-links.test.mjs | 2 +- ...bile-web-app-session-media-picker.test.mjs | 2 +- .../mobile-web-app-session-render.test.mjs | 4 +- ...-web-app-session-terminal-closure.test.mjs | 2 +- ...ile-web-app-session-terminal-init.test.mjs | 4 +- ...web-app-session-webview-consumers.test.mjs | 2 +- ...app-source-control-external-links.test.mjs | 2 +- ...e-web-app-source-control-keyboard.test.mjs | 2 +- ...ile-web-app-source-control-render.test.mjs | 2 +- ...eb-app-source-control-text-inputs.test.mjs | 2 +- ...e-web-app-stack-transition-render.test.mjs | 2 +- ...bile-web-app-tasks-external-links.test.mjs | 2 +- .../mobile-web-app-tasks-render.test.mjs | 2 +- ...eb-app-terminal-live-input-render.test.mjs | 2 +- ...mobile-web-app-terminal-render-fixture.mjs | 2 +- ...le-web-app-working-spinner-render.test.mjs | 2 +- .../mobile-web-app-haptics-seam.test.mjs | 4 +- ...-web-app-html-file-preview-render.test.mjs | 4 +- ...obile-web-app-html-preview-render.test.mjs | 2 +- ...bile-web-app-media-preview-render.test.mjs | 4 +- .../preview/mobile-web-app-render-harness.mjs | 2 +- ...mobile-web-app-svg-preview-render.test.mjs | 4 +- ...obile-web-terminal-engine-closure.test.mjs | 2 +- .../run-mobile-web-app-checks.mjs | 10 +- .../build-native-for-platform.mjs | 8 +- .../build-native-for-platform.test.mjs | 16 +- .../linux}/build-wayland-clipboard.mjs | 4 +- .../linux}/build-wayland-clipboard.test.mjs | 8 +- .../linux}/verify-linux-glibc-floor.cjs | 0 .../linux}/verify-linux-glibc-floor.test.mjs | 0 .../verify-linux-glibc-payloads.test.mjs | 0 .../macos}/build-computer-macos.mjs | 2 +- .../macos}/build-keyboard-layout-macos.mjs | 0 .../build-notification-status-macos.mjs | 2 +- .../macos}/build-process-footprint-macos.mjs | 0 .../macos}/swift-cli-helper-macos.mjs | 2 +- ...sure-native-runtime-job-ownership.test.mjs | 4 +- .../node-addons}/ensure-native-runtime.mjs | 16 +- .../ensure-native-runtime.test.mjs | 69 ++- .../node-addons}/native-build-entry-probe.cjs | 4 +- .../node-addons}/native-build-entry.cjs | 0 .../node-addons}/native-build-entry.test.mjs | 4 +- .../native-dependency-lock-digest.mjs | 2 +- .../native-dependency-lock-digest.test.mjs | 0 .../node-addons}/node-pty-job-ownership.cjs | 6 +- .../rebuild-native-deps-node-pty.test.mjs | 2 +- .../rebuild-native-deps-test-fixtures.mjs | 68 ++- ...-native-deps-windows-process-tree.test.mjs | 2 +- .../node-addons}/rebuild-native-deps.mjs | 20 +- .../node-addons}/rebuild-native-deps.test.mjs | 2 +- .../node-addons}/shared-native-build.mjs | 19 +- .../node-addons}/shared-native-build.test.mjs | 2 +- .../benchmark-windows-native-preparation.mjs | 56 ++- .../windows}/build-windows-agent-hook.mjs | 7 +- .../windows}/build-windows-cli-launcher.mjs | 4 +- .../build-windows-cli-launcher.test.mjs | 24 +- .../build-windows-process-tree-addon.mjs | 6 +- .../windows}/build-windows-security-addon.mjs | 10 +- .../build-windows-security-addon.test.mjs | 2 +- .../capture-windows-native-environment.cmd | 0 .../fixtures/DuplicatePathProcessLauncher.cs | 0 .../initialize-windows-native-toolchain.mjs | 2 +- ...itialize-windows-native-toolchain.test.mjs | 0 .../windows}/msbuild-file-tracking.mjs | 0 .../windows}/msbuild-file-tracking.test.mjs | 0 .../windows-native-benchmark-observer.mjs | 0 ...dows-native-preparation-benchmark.test.mjs | 9 +- .../windows}/windows-pe-image-fixture.mjs | 0 .../windows}/windows-pe-imports.mjs | 0 .../windows}/windows-pe-imports.test.mjs | 0 .../windows}/windows-pe-machine.cjs | 0 .../windows}/windows-pe-machine.test.mjs | 0 .../windows-process-tree-creation-time.cjs | 0 ...indows-process-tree-creation-time.test.mjs | 0 .../windows-process-tree-gyp-path.test.mjs | 2 +- .../windows-process-tree-gyp-rebuild.mjs | 4 +- .../windows-process-tree-gyp-rebuild.test.mjs | 4 +- .../windows-process-tree-prepared-addon.mjs | 7 +- ...ndows-process-tree-prepared-addon.test.mjs | 6 +- .../windows}/windows-rust-build-scope.mjs | 2 +- .../windows-rust-executable-build.mjs | 2 +- config/scripts/native-chat-fold-benchmark.mjs | 6 +- .../native-chat-tool-pairing-benchmark.mjs | 4 +- .../store-ancestor-node-modules.mjs | 2 +- .../store-ancestor-node-modules.test.mjs | 0 .../node-dist-archive-name.mjs | 0 .../update-node-runtime-pin.mjs | 16 +- .../update-node-runtime-pin.test.mjs | 4 +- .../scripts/node-server-concurrency.test.mjs | 2 +- .../scripts/node-server-fast-runners.test.mjs | 2 +- ...er-native-compat-cleanup.test-fixture.json | 132 ------ ...r-change-scope-enclosing-checkout.test.mjs | 0 .../node-server-change-scope.mjs | 58 +-- .../node-server-change-scope.test.mjs | 8 +- ...er-native-compat-cleanup.test-fixture.json | 132 ++++++ .../node-server-native-compat-scope.mjs | 16 +- .../node-server-native-compat-scope.test.mjs | 37 +- .../node-server-policy-self-tests.test.mjs | 16 +- .../node-server-qualification.mjs | 1 + .../node-server-qualification.test.mjs | 8 +- .../qualification}/node-server-test-paths.mjs | 2 +- config/scripts/orca-dev.mjs | 2 +- .../prebuilds}/build-orcad-node.mjs | 13 +- .../prebuilds}/build-orcad-prebuilds.mjs | 28 +- .../prebuilds}/build-orcad-prebuilds.test.mjs | 2 +- .../prebuilds}/merge-orcad-prebuilds.mjs | 2 +- .../prebuilds}/merge-orcad-prebuilds.test.mjs | 0 .../orcad-prebuild-compat-addons.mjs | 2 +- .../prebuilds}/orcad-prebuild-node-gyp.mjs | 4 +- .../orcad-prebuild-node-gyp.test.mjs | 0 .../orcad-prebuild-slot-contents.mjs | 7 +- .../orcad-prebuild-slot-contents.test.mjs | 6 +- .../prebuilds}/orcad-prebuild-smoke-child.cjs | 0 .../prebuilds}/orcad-prebuild-smoke.mjs | 2 +- .../orcad-windows-prebuild-cache.mjs | 32 +- .../orcad-windows-prebuild-cache.test.mjs | 11 +- .../orcad-windows-prebuild-workflow.test.mjs | 10 +- .../prebuilds}/pinned-node-downloads.mjs | 12 +- .../prebuilds}/pinned-node-downloads.test.mjs | 0 .../prebuilds}/server-build-target.mjs | 0 .../orcad-daemon-protocol-crossing.test.mjs | 8 +- .../orcad-terminal-smoke-change-scope.mjs | 20 +- ...orcad-terminal-smoke-change-scope.test.mjs | 14 +- .../server-bundle}/build-orcad.mjs | 16 +- .../foreign-sqlite-reader-worker-smoke.mjs | 4 +- ...oreign-sqlite-reader-worker-smoke.test.mjs | 0 .../server-bundle}/orcad-artifact-version.mjs | 2 +- .../orcad-artifact-version.test.mjs | 8 +- .../server-bundle}/orcad-entry-build.mjs | 8 +- .../server-bundle}/orcad-entry-build.test.mjs | 0 .../orcad-linear-sdk-package.mjs | 2 +- .../orcad-linear-sdk-package.test.mjs | 4 +- .../orcad-mobile-web-bundle.mjs | 6 +- .../orcad-mobile-web-bundle.test.mjs | 9 +- .../server-bundle}/orcad-watcher-package.mjs | 4 +- .../orcad-watcher-package.test.mjs | 0 .../orcad-windows-cli-launcher.mjs | 8 +- .../orcad-windows-cli-launcher.test.mjs | 0 .../orcad-windows-process-tree.mjs | 8 +- .../orcad-windows-process-tree.test.mjs | 2 +- .../server-bundle}/orcad-windows-security.mjs | 10 +- .../orcad-windows-security.test.mjs | 2 +- .../profile-state-worker-smoke.mjs | 10 +- .../profile-state-worker-smoke.test.mjs | 0 .../session-scanner-service-smoke.mjs | 6 +- .../session-scanner-service-smoke.test.mjs | 0 .../template}/build-orcad-template.mjs | 18 +- .../template}/build-orcad-template.test.mjs | 2 +- .../compact-packaged-orcad-ripgrep.cjs | 2 +- .../compact-packaged-orcad-ripgrep.test.mjs | 6 +- .../template}/orcad-template-test-fixture.mjs | 4 +- .../template}/packaged-orcad-browser.cjs | 6 +- .../template}/packaged-orcad-browser.test.mjs | 4 +- .../template}/packaged-orcad-template.cjs | 7 +- .../packaged-orcad-template.test.mjs | 2 +- .../verify-packaged-orcad-template.cjs | 4 +- .../verify-packaged-orcad-template.test.mjs | 6 +- ...tched-dependencies-frozen-install.test.mjs | 4 +- .../idle-cpu}/idle-cpu-process-sampling.mjs | 0 .../idle-cpu-process-sampling.test.mjs | 0 .../idle-cpu-renderer-scale-fixture.mjs | 0 .../idle-cpu-renderer-timing-probe.mjs | 0 .../idle-cpu}/idle-cpu-synthetic-spinners.mjs | 0 .../idle-cpu}/run-idle-cpu-benchmark.mjs | 17 +- .../measurement}/benchmark-sample-summary.mjs | 0 .../benchmark-sample-summary.test.mjs | 0 .../counterbalanced-benchmark-schedule.mjs | 0 ...ounterbalanced-benchmark-schedule.test.mjs | 0 ...minal-perf-dependency-preparation.test.mjs | 10 +- .../check-terminal-perf-report-budgets.mjs | 2 +- ...heck-terminal-perf-report-budgets.test.mjs | 3 +- .../generate-terminal-perf-html-report.mjs | 2 +- ...enerate-terminal-perf-html-report.test.mjs | 0 .../summarize-terminal-perf-report.mjs | 2 +- .../summarize-terminal-perf-report.test.mjs | 3 +- .../terminal-perf-report-annotations.mjs | 0 .../terminal-perf-report-annotations.test.mjs | 0 .../terminal-perf-report-budgets.mjs | 0 .../terminal-perf-report-rows.mjs | 0 .../build-plugin-declarative-runtime.mjs | 4 +- .../build-plugin-declarative-runtime.test.mjs | 0 .../plugin-command-bindings-benchmark.mjs | 2 +- .../plugin-message-budget-benchmark.mjs | 2 +- .../plugin-shortcut-conflicts-benchmark.mjs | 2 +- .../pr-auxiliary-preflight-admission.test.mjs | 38 +- .../pr-e2e-managed-ssh-harness-route.test.mjs | 5 +- config/scripts/pr-package-test-paths.mjs | 139 ------ config/scripts/pr-plugin-e2e-routing.test.mjs | 6 +- config/scripts/pr-ready-check-reuse.test.mjs | 2 +- .../scripts/pr-workflow-parallelism.test.mjs | 2 +- .../benchmark-ci-preflight-critical-path.mjs | 116 ++++- .../benchmark-preflight-compat-boundary.mjs | 25 +- .../benchmark-preflight-compilers.mjs | 10 +- ...mark-preflight-localization-extraction.mjs | 8 +- .../benchmark-preflight-static-analysis.mjs | 18 +- .../preflight-benchmark-command.mjs | 0 .../casting-code-quality.test.mjs | 4 +- .../check-changed-code-quality.mjs | 10 +- .../check-changed-code-quality.test.mjs | 12 +- .../check-changed-pass-cache.mjs | 6 +- .../check-changed-pass-cache.test.mjs | 0 .../check-changed-selection.mjs | 32 +- .../check-changed-selection.test.mjs | 2 +- .../changed-checks}/check-changed.mjs | 23 +- .../moved-code-matcher.test.mjs | 4 +- .../scripts/qualified-orcad-template.test.mjs | 2 +- .../raw-markdown-comment-scan-benchmark.mjs | 2 +- config/scripts/release-policy.mjs | 2 +- .../release-tag-pattern-census.test.mjs | 2 +- .../release-javascript-artifact.mjs | 8 +- .../release-javascript-artifact.test.mjs | 0 .../release-javascript-benchmark.mjs | 6 +- .../release-javascript-parity.mjs | 38 +- .../release-javascript-parity.test.mjs | 59 +++ .../versioning}/adhoc-build-version.mjs | 0 .../versioning}/adhoc-build-version.test.mjs | 2 +- .../versioning}/daily-build-version.mjs | 0 .../versioning}/daily-build-version.test.mjs | 2 +- .../versioning}/dev-channel-base-version.mjs | 0 .../dev-channel-base-version.test.mjs | 0 .../versioning}/hourly-build-version.mjs | 0 .../versioning}/hourly-build-version.test.mjs | 2 +- .../versioning}/release-tag-patterns.mjs | 0 .../versioning}/release-title-timestamp.mjs | 0 .../adhoc-build-pinned-commit.test.mjs | 0 .../adhoc-release-waits.test.mjs | 0 .../adhoc-windows-parallelism.test.mjs | 21 +- .../remote-agent-session-authority-repro.mjs | 5 +- .../wsl-guest}/build-wsl-guest.mjs | 6 +- .../review-ack-first-line-benchmark.mjs | 2 +- .../rich-markdown-blank-run-benchmark.mjs | 4 +- .../rich-markdown-comment-scan-benchmark.mjs | 2 +- .../rich-markdown-line-scan-benchmark.mjs | 2 +- config/scripts/run-audit-tool.mjs | 2 +- config/scripts/run-e2e-typecheck.mjs | 6 +- config/scripts/run-e2e-typecheck.test.mjs | 2 +- config/scripts/run-electron-vite-dev.mjs | 21 +- .../run-electron-vite-targets-in-parallel.mjs | 4 +- config/scripts/run-lint.mjs | 4 +- config/scripts/run-node-server-tests.mjs | 12 +- .../scripts/run-terminal-ibus-hangul-e2e.mjs | 2 +- config/scripts/run-terminal-layout-parity.mjs | 13 +- .../run-terminal-scale-perf-report-gate.mjs | 6 +- ...n-terminal-scale-perf-report-gate.test.mjs | 46 +- .../scripts/runtime-serve-terminal-smoke.mjs | 4 +- .../runtime-serve-terminal-smoke.test.mjs | 2 +- .../verify-playwright-participation.mjs | 0 .../skills-cli}/verify-skills-cli-runtime.cjs | 0 .../verify-skills-cli-runtime.test.mjs | 4 +- .../scrcpy-frame-buffering-benchmark.mjs | 4 +- .../session-dedup-batches-benchmark.mjs | 2 +- .../scripts/session-scan-cutoff-benchmark.mjs | 2 +- config/scripts/session-timeline-benchmark.mjs | 4 +- .../skill-source-inventory-benchmark.mjs | 2 +- config/scripts/smoke-process-host-node18.mjs | 2 +- config/scripts/source-tree-walk-benchmark.mjs | 4 +- .../ssh-windows-mobile-bundle.test.mjs | 9 +- .../static-module-specifiers.mjs | 0 .../static-module-specifiers.test.mjs | 2 +- .../check-main-sync-spawn-ratchet.mjs | 6 +- .../check-main-sync-spawn-ratchet.test.mjs | 0 .../check-process-host-imports.mjs | 6 +- .../check-process-host-imports.test.mjs | 2 +- .../gated-call-use-collector.mjs | 6 +- .../test-only-source-path.mjs | 0 .../test-only-source-path.test.mjs | 0 .../ratchet-baseline}/ratchet-baseline.mjs | 0 .../ratchet-baseline.test.mjs | 0 .../ratchet-runner}/run-ratchets.mjs | 0 .../structural-scan}/ast-grep-scan.mjs | 4 +- .../existing-type-assertions.mjs | 0 .../build-serialize-addon-at-ref.mjs | 4 +- .../regenerate-xterm-patches.mjs | 2 +- .../regenerate-xterm-patches.test.mjs | 2 +- ...xterm-image-cell-payload-contract.test.mjs | 4 +- .../xterm-image-kitty-admission.test.mjs | 0 ...image-kitty-coordinate-boundaries.test.mjs | 0 .../xterm-image-kitty-file-transport.test.mjs | 0 ...term-image-kitty-glyph-visibility.test.mjs | 0 ...-image-kitty-placeholder-contract.test.mjs | 0 ...image-kitty-placeholder-lifecycle.test.mjs | 0 .../xterm-image-kitty-retransmit.test.mjs | 0 .../xterm-image-lifecycle-contract.test.mjs | 4 +- .../xterm-image-memory-contract.test.mjs | 4 +- .../xterm-image-resize-contract.test.mjs | 4 +- .../xterm-image-wasm-budget-contract.test.mjs | 4 +- .../xterm-kitty-placeholder-test-terminal.mjs | 4 +- .../xterm-patches}/xterm-patch-text.mjs | 2 +- .../xterm-underline-color-contract.test.mjs | 4 +- .../script-module-dependencies.mjs | 0 .../script-module-dependencies.test.mjs | 0 .../dom}/happy-dom-animation-cancel.ts | 0 ...py-dom-mutation-observer-retention.test.ts | 0 .../happy-dom-mutation-observer-retention.ts | 0 .../dom}/happy-dom-offscreen-canvas.test.ts | 0 .../dom}/happy-dom-offscreen-canvas.ts | 0 .../dom}/vitest-dom-setup.ts | 0 .../environment}/vitest-bun-node-builtins.ts | 0 .../vitest-caller-identity-env-setup.ts | 0 .../environment}/vitest-host-ports-setup.ts | 4 +- .../vitest-inherited-git-env-setup.ts | 0 .../vitest-orcad-feature-readiness-reset.ts | 2 +- ...vitest-real-agent-home-write-guard.test.ts | 0 .../vitest-real-agent-home-write-guard.ts | 0 .../vitest-runtime-boundary.test.ts | 0 .../execution-policy}/run-vitest.mjs | 8 +- .../vitest-changed-precheck.mjs | 0 .../vitest-changed-precheck.test.mjs | 0 .../execution-policy}/vitest-run-filters.mjs | 0 .../vitest-run-filters.test.mjs | 2 +- .../vitest-run-temp-directory.mjs | 0 .../vitest-run-temp-directory.test.mjs | 0 .../vitest-runtime-sequencer.mjs | 2 +- .../vitest-runtime-sequencer.test.mjs | 0 .../vitest-local-module-cache.mjs | 2 +- ...vitest-module-cache-resolution-key.test.ts | 0 .../vitest-module-cache-resolution-key.ts | 0 .../module-cache}/vitest-zod-bundle.mjs | 0 .../module-cache}/vitest-zod-bundle.test.mjs | 0 .../vitest-node-runtime-boundary.test.ts | 4 +- .../vitest-node-runtime-ipc-codec.mjs | 0 .../vitest-node-runtime-pool.test.ts | 0 .../node-worker}/vitest-node-runtime-pool.ts | 5 +- .../vitest-node-runtime-worker.mjs | 0 .../vitest-node-runtime-files.mjs | 10 +- .../vitest-sqlite-runtime-boundary.test.ts | 0 .../vitest-sqlite-runtime-cache.test.ts | 0 .../vitest-sqlite-runtime-scan.mjs | 6 +- .../node-old-space-limit.mjs | 0 .../node-old-space-limit.test.mjs | 0 .../oxc-cli-invocation.mjs | 0 .../oxc-cli-invocation.test.mjs | 2 +- .../oxlint-cli-invocation.mjs | 0 .../pinned-bun-executable.mjs | 0 .../pinned-bun-executable.test.mjs | 0 .../pnpm-cli-invocation.mjs | 0 .../pnpm-cli-invocation.test.mjs | 0 .../process-failure-message.mjs | 0 .../process-failure-message.test.mjs | 0 .../rolldown-thread-limit.mjs | 0 .../script-entry-detection.mjs | 0 .../script-entry-detection.test.mjs | 0 .../transcript-stream-fragments-benchmark.mjs | 2 +- .../run-typecheck-bun-queue.test.mjs | 0 .../run-typecheck-projects-in-parallel.mjs | 7 +- ...un-typecheck-projects-in-parallel.test.mjs | 4 +- .../tsrs-typecheck-compiler.mjs | 0 .../tsrs-typecheck-compiler.test.mjs | 4 +- .../typecheck-project-coverage.test.mjs | 2 +- config/scripts/verify-cli-bin.mjs | 2 +- .../verify-linux-wayland-gpu-sandbox.mjs | 5 +- .../verify-localization-extraction.mjs | 4 +- config/scripts/verify-renderer-boot-graph.mjs | 2 +- .../scripts/verify-wsl-e2e-participation.mjs | 2 +- ...y-wsl-no-background-boot-participation.mjs | 2 +- .../execution}/run-vite-web-build.mjs | 4 +- .../win32-test-lane-registration.test.mjs | 10 +- ...dows-native-batch-reference-policy.test.ts | 29 +- .../windows-native-batch-reference-policy.ts | 34 +- .../windows-security-reuse-benchmark.test.mjs | 8 +- .../workflow-ref-mirror-case-safety.test.mjs | 2 +- .../pr-aggregate-gate-context.mjs | 2 +- .../pr-admission}/pr-aggregate-gate.test.mjs | 0 .../pr-ready-check-gate.test.mjs | 0 .../pr-browser-e2e-source-routes.mjs | 0 ...-scope-cross-version-launch-route.test.mjs | 0 ...nge-scope-cross-version-send-path.test.mjs | 0 ...code-change-scope-daemon-protocol.test.mjs | 2 +- ...pr-code-change-scope-format-route.test.mjs | 0 ...pr-code-change-scope-process-host.test.mjs | 2 +- ...-code-change-scope-released-phone.test.mjs | 0 .../pr-code-change-scope-test-inputs.test.mjs | 13 +- ...hange-scope-windows-process-probe.test.mjs | 8 +- .../source-routing}/pr-code-change-scope.mjs | 136 ++---- .../pr-code-change-scope.test.mjs | 21 +- .../pr-codex-unit-only-selection.test.mjs | 0 .../pr-e2e-gate-contract.test.mjs | 0 .../source-routing}/pr-e2e-source-routing.mjs | 4 +- .../pr-editor-preview-e2e-source-routes.mjs | 0 .../pr-feature-area-e2e-source-routes.mjs | 0 .../pr-layout-oracle-route.mjs | 4 +- .../source-routing/pr-package-test-paths.mjs | 266 +++++++++++ .../pr-plugin-e2e-source-routes.mjs | 0 .../pr-shell-contract-prefixes.mjs | 4 +- .../pr-unit-support-routing.test.mjs | 7 +- .../pr-wsl-e2e-source-routes.mjs | 2 +- .../pr-xterm-patch-prefixes.mjs | 7 + .../windows-native-toolchain-routing.test.mjs | 8 +- .../wsl-e2e-lane-contract.test.mjs | 2 +- .../build-workspace-packages.mjs | 4 +- .../workspace-source-exports.mjs | 0 .../workspace-source-exports.test.mjs | 0 .../dev-storage-reclaim.mjs | 0 .../dev-storage-reclaim.test.mjs | 2 +- .../local-repository-worktrees.mjs | 2 +- .../reclaim-dev-electron-bundles.mjs | 2 +- .../reclaim-dev-electron-bundles.test.ts | 2 +- .../reclaim-dev-worktree-profiles.mjs | 9 +- .../reclaim-dev-worktree-profiles.test.mjs | 2 +- .../reclaim-electron-dists.mjs | 4 +- .../reclaim-electron-dists.test.ts | 2 +- .../reclaim-release-test-caches.mjs | 8 +- .../reclaim-release-test-caches.test.ts | 4 +- .../reclaim-vite-caches.mjs | 2 +- .../reclaim-vite-caches.test.mjs | 2 +- .../reclaim-vitest-module-caches.mjs | 2 +- .../reclaim-vitest-module-caches.test.mjs | 2 +- .../reclaim-worktree-command.mjs | 0 .../reclaim-worktree-command.test.mjs | 0 .../reclaim-worktree-generated-files.mjs | 0 .../reclaim-worktree-generated-files.test.mjs | 0 .../reclaim-worktree-space.mjs | 0 .../reclaim-worktree-space.test.mjs | 0 .../vite-cache-activity.mjs | 0 .../worktree-recent-activity.mjs | 2 +- config/scripts/wsl-git-shell-benchmark.mjs | 4 +- .../wsl-hook-relay-reattach-benchmark.mjs | 10 +- .../wsl-orcad-workflow-qualification.test.mjs | 2 +- config/scripts/zip-extractor-command.mjs | 1 - config/tsconfig.node.json | 22 +- config/vitest.config.ts | 22 +- config/vitest.performance.config.ts | 2 +- config/wayland-clipboard-resources.cjs | 10 +- docs/readme/release-source-sharing.md | 2 +- docs/readme/terminal-perf.md | 2 +- docs/readme/unit-test-input-ownership.md | 2 +- docs/readme/worktree-storage-maintenance.md | 2 +- electron.vite.config.ts | 2 +- mobile/scripts/check-node-tests-typecheck.mjs | 2 +- ...-tests-typecheck-incremental-cache.test.ts | 2 +- mobile/scripts/mobile-typecheck-compiler.mjs | 2 +- native/wayland-clipboard/README.md | 4 +- package.json | 94 ++-- .../plugins/declarative/orca-runtime.mjs | 2 +- .../plugins/declarative/orca-test-hooks.mjs | 2 +- .../declarative/orca-test-register.mjs | 2 +- .../plugins/declarative/orca-testing.mjs | 2 +- .../references/provider-vercel.md | 2 +- src/cli/bundled-skill-guides.ts | 2 +- ...ed-hook-script-refresh-main-thread.test.ts | 2 +- .../windows-native-hook-exe.test-fixture.ts | 11 +- .../wsl-hook-relay-live.integration.test.ts | 12 +- .../automation-owner-fencing.test.ts | 2 +- .../automation-update-host-retarget.test.ts | 2 +- ...omation-workspace-host-attribution.test.ts | 2 +- src/main/automations/service-precheck.test.ts | 2 +- src/main/cli/orca-cli-child-path.test.ts | 2 +- src/main/cli/packaged-cli-assets.test.ts | 2 +- src/main/cli/wsl-managed-cli.wsl.test.ts | 2 +- .../runtime-home-catalog-account-key.test.ts | 2 +- .../runtime-home-catalog-probe-prep.test.ts | 2 +- ...ntime-home-history-sharing-opt-out.test.ts | 2 +- .../runtime-home-legacy-migration.test.ts | 2 +- ...runtime-home-managed-auth-recovery.test.ts | 2 +- .../runtime-home-mirror-login-copy.test.ts | 2 +- .../runtime-home-per-account-homes.test.ts | 2 +- ...e-home-read-only-launch-resolution.test.ts | 2 +- ...untime-home-real-home-lane-routing.test.ts | 2 +- ...runtime-home-resume-selection-gate.test.ts | 2 +- ...time-home-retained-auth-provenance.test.ts | 2 +- ...home-service-per-account-migration.test.ts | 2 +- ...e-home-session-discovery-read-only.test.ts | 2 +- ...ome-system-default-mirror-readback.test.ts | 2 +- ...ntime-home-system-default-snapshot.test.ts | 2 +- .../service-account-add-login.test.ts | 2 +- ...vice-account-selection-and-removal.test.ts | 2 +- .../service-device-code-login.test.ts | 2 +- .../service-managed-home-identity.test.ts | 2 +- .../service-reauthenticate-activation.test.ts | 2 +- .../service-reset-credit-durability.test.ts | 2 +- ...ervice-reset-credit-home-ownership.test.ts | 2 +- ...service-reset-credit-retry-routing.test.ts | 2 +- ...ervice-reset-credit-target-routing.test.ts | 2 +- .../service-system-default-identity.test.ts | 2 +- src/main/codex-accounts/service.test.ts | 2 +- ...sta-4422-transient-ownership-error.test.ts | 2 +- ...ollback-deletes-authenticated-home.test.ts | 2 +- .../local-file-access-resolution.test.ts | 2 +- .../ipc/floating-workspace-directory.test.ts | 2 +- src/main/ipc/profiles/orca-profiles.test.ts | 2 +- src/main/ipc/pty/pty-ipc-suite-environment.ts | 2 +- .../orca-profiles/profile-index-store.test.ts | 2 +- src/main/orcad/orcad-account-services.test.ts | 2 +- .../orcad-bundle-native-load-order.test.ts | 4 +- .../orcad-cli-launcher.integration.test.ts | 2 +- src/main/orcad/orcad-help.integration.test.ts | 4 +- ...cad-launcher-isolation.integration.test.ts | 4 +- .../orcad-runtime-entry-artifacts.test.ts | 8 +- src/main/orcad/orcad-speech-services.test.ts | 2 +- .../persistence-ui-state.test.ts | 2 +- ...tence-protected-secret-fail-closed.test.ts | 2 +- .../persistence-proxy-secret-recovery.test.ts | 2 +- .../persistence-single-serialize.test.ts | 2 +- .../persistence/persistence-test-harness.ts | 2 +- .../profile-state-access-process.test.ts | 2 +- .../profile-state-recovery-crash-process.ts | 2 +- ...sh-readoption-automation-migration.test.ts | 2 +- ...tence-duplicate-repo-id-host-scope.test.ts | 2 +- ...-workspace-pinned-automation-fence.test.ts | 2 +- ...e-workspace-repin-automation-owner.test.ts | 2 +- ...tence-workspace-session-scrollback.test.ts | 2 +- ...rsistence-worktree-name-retirement.test.ts | 2 +- .../titlebar-extension-overlay-path.test.ts | 2 +- .../pi/titlebar-extension-service.test.ts | 2 +- .../terminal-history-async-delete.test.ts | 2 +- .../terminal-history-gc-fs-call-count.test.ts | 2 +- .../pty/history/terminal-history-gc.test.ts | 2 +- .../terminal-history-tombstone-retry.test.ts | 2 +- ...rminal-history-tombstone-scan-cost.test.ts | 2 +- src/main/pty/history/terminal-history.test.ts | 2 +- .../agent-state-rules-live-update.test.ts | 2 +- .../automation-change-publication.test.ts | 2 +- .../claude-agent-teams-shim-env.test.ts | 2 +- .../mobile-pairing-userdata-path.test.ts | 2 +- .../orca-runtime-agent-skill-share.test.ts | 2 +- .../imported-values.spec.ts | 2 +- .../methods/mobile-web-bundle.test-fixture.ts | 2 +- .../structured-chat-tab-compatibility.test.ts | 2 +- .../structured-session-child-env.test.ts | 2 +- ...ctured-session-login-shell-test-harness.ts | 2 +- .../speech/model-manager-windows-path.test.ts | 2 +- src/main/speech/stt-worker-paths.test.ts | 2 +- .../stats/agent-session-stats-feed.test.ts | 2 +- .../window/clipboard-ipc-handlers.test.ts | 2 +- .../clipboard-macos-image-paste.test.ts | 2 +- .../window/native-chat-paste-files.test.ts | 2 +- .../native-chat-pasted-text-file.test.ts | 2 +- .../wsl-orcad-update-move-hold-driver.test.ts | 2 +- src/shared/node-runtime-pin.ts | 2 +- src/shared/orca-cli-command-name.test.ts | 2 +- .../ai-vault-account-stream-test-fixture.ts | 2 +- .../release-checkout-tree.ts | 2 +- .../release-source-cache.ts | 2 +- tests/e2e/spinner-workspace-fixture.ts | 2 +- ...ctured-chat-tab-lifetime-cost.unit.test.ts | 5 +- tests/playwright.config.ts | 2 +- ...ackaged-node-pty-capability-probe.test.mjs | 2 +- vite.web.config.ts | 2 +- 839 files changed, 3187 insertions(+), 2283 deletions(-) rename config/scripts/{ => archives/platform-command}/zip-extractor-command.test.mjs (96%) rename config/scripts/{ => artifact-storage/atomic-publication}/shared-tree-publish.mjs (100%) rename config/scripts/{ => artifact-storage/atomic-publication}/shared-tree-publish.test.mjs (100%) rename config/scripts/{ => artifact-storage/reflink-copy}/space-sharing-copy.mjs (100%) rename config/scripts/{ => artifact-storage/reflink-copy}/space-sharing-copy.test.ts (100%) rename config/scripts/{ => build-identity}/build-source-commit.mjs (100%) rename config/scripts/{ => build/mobile-web-app}/build-mobile-web-app-bundle.mjs (97%) rename config/scripts/{ => build/mobile-web-app}/build-mobile-web-app-bundle.test.mjs (97%) rename config/scripts/{ => build/mobile-web-app}/mobile-entry-static-closure.test.mjs (100%) rename config/scripts/{ => build/mobile-web-app}/mobile-web-bundle-fixture-tree.mjs (100%) rename config/scripts/{ => build/mobile-web-app}/mobile-web-bundle-manifest.mjs (97%) rename config/scripts/{ => build/mobile-web-app}/mobile-web-bundle-manifest.test.mjs (98%) rename config/scripts/{ => build/mobile-web-app}/mobile-web-bundle-serializer-parity.test.mjs (95%) rename config/scripts/{ => build/mobile-web-app}/mobile-web-page-routes.mjs (100%) rename config/scripts/{ => build/mobile-web-app}/mobile-web-page-routes.test.mjs (96%) rename config/scripts/{ => build/mobile-web-app}/mobile-web-source-line-endings.mjs (100%) rename config/scripts/{ => build/mobile-web-app}/mobile-web-source-line-endings.test.mjs (98%) rename config/scripts/{ => build/mobile-web-app}/verify-mobile-web-app-bundle.mjs (97%) rename config/scripts/{ => ci/dependency-cache}/ci-pnpm-store-benchmark.mjs (95%) rename config/scripts/{ => ci/dependency-cache}/ci-pnpm-store-mode.test.mjs (100%) rename config/scripts/{ => ci/e2e-failures}/ci-e2e-failure-summary.mjs (97%) rename config/scripts/{ => ci/e2e-failures}/ci-e2e-failure-summary.test.mjs (100%) rename config/scripts/{ => ci/e2e-failures}/ci-e2e-failure-tracking.mjs (100%) rename config/scripts/{ => ci/e2e-selection}/ci-e2e-job-selection.mjs (100%) rename config/scripts/{ => ci/e2e-selection}/ci-e2e-job-selection.test.mjs (97%) rename config/scripts/{ => ci/e2e-selection}/ci-e2e-shard-plan.mjs (98%) rename config/scripts/{ => ci/e2e-selection}/ci-e2e-shard-selection.test.mjs (96%) rename config/scripts/{ => ci/runner-capacity}/ci-job-executions.mjs (100%) rename config/scripts/{ => ci/runner-capacity}/ci-runner-demand.mjs (100%) rename config/scripts/{ => ci/runner-capacity}/ci-runner-metrics.mjs (100%) rename config/scripts/{ => ci/runner-capacity}/ci-runner-metrics.test.mjs (100%) rename config/scripts/{ => ci/sharding}/ci-shard-assignment.mjs (96%) rename config/scripts/{ => ci/sharding}/ci-shard-assignment.test.mjs (97%) rename config/scripts/{ => ci/sharding}/ci-shard-timing-import.mjs (100%) rename config/scripts/{ => ci/sharding}/ci-shard-timings.md (97%) rename config/scripts/{ => ci/sharding}/ci-unit-sequencer.mjs (95%) rename config/scripts/{ => ci/sharding}/ci-unit-sequencer.test.mjs (100%) rename config/scripts/{ => ci/sharding}/ci-unit-timing-import.mjs (100%) rename config/scripts/{ => ci/sharding}/ci-unit-timing-reporter.mjs (98%) rename config/scripts/{ => ci/sharding}/ci-unit-timing-reporter.test.mjs (100%) rename config/scripts/{ => ci/unit-cache}/ci-unit-module-cache-contents.mjs (100%) rename config/scripts/{ => ci/unit-cache}/ci-unit-module-cache-contents.test.mjs (100%) rename config/scripts/{ => ci/unit-cache}/ci-unit-module-cache-trailer.mjs (100%) rename config/scripts/{ => ci/unit-cache}/ci-unit-module-cache.mjs (91%) rename config/scripts/{ => ci/unit-cache}/ci-unit-module-cache.test.mjs (100%) rename config/scripts/{ => ci/unit-selection}/ci-unit-matrix.mjs (100%) rename config/scripts/{ => ci/unit-selection}/ci-unit-plan.mjs (88%) rename config/scripts/{ => ci/unit-selection}/ci-unit-plan.test.mjs (99%) rename config/scripts/{ => ci/unit-selection}/ci-unit-selection-review.mjs (100%) rename config/scripts/{ => ci/unit-selection}/ci-unit-selection-review.test.mjs (100%) rename config/scripts/{ => ci/unit-selection}/ci-unit-selection.mjs (84%) rename config/scripts/{ => ci/unit-selection}/ci-unit-selection.test.mjs (94%) rename config/scripts/{ => ci/unit-selection/dependency-graph}/ci-unit-dependency-graph.mjs (93%) rename config/scripts/{ => ci/unit-selection/dependency-graph}/ci-unit-dependency-graph.test.mjs (99%) rename config/scripts/{ => ci/unit-selection/dependency-graph}/ci-unit-exclusion-coverage.test.mjs (97%) rename config/scripts/{ => ci/unit-selection/dependency-graph}/ci-unit-files.mjs (87%) rename config/scripts/{ => ci/unit-selection/dependency-graph}/ci-unit-indirect-inputs.mjs (95%) rename config/scripts/{ => ci/unit-selection/dependency-graph}/ci-unit-indirect-inputs.test.mjs (98%) rename config/scripts/{ => ci/unit-selection/dependency-graph}/ci-unit-input-ownership.json (100%) rename config/scripts/{ => ci/unit-selection/dependency-graph}/ci-unit-input-ownership.mjs (92%) rename config/scripts/{ => ci/unit-selection/dependency-graph}/ci-unit-input-ownership.test.mjs (97%) rename config/scripts/{ => ci/workflow-contracts}/ci-branch-cache-sweep.test.mjs (100%) rename config/scripts/{ => ci/workflow-contracts}/ci-closed-pr-caches.test.mjs (100%) rename config/scripts/{ => ci/workflow-contracts}/ci-closed-pr-cancellation.test.mjs (100%) rename config/scripts/{ => ci/workflow-contracts}/ci-draft-pr-admission.test.mjs (97%) rename config/scripts/{ => ci/workflow-contracts}/ci-managed-ssh-execution.test.mjs (93%) rename config/scripts/{ => ci/workflow-contracts}/ci-native-cache.test.mjs (100%) rename config/scripts/{ => ci/workflow-contracts}/ci-native-toolchain.test.mjs (91%) rename config/scripts/{ => ci/workflow-contracts}/ci-pr-concurrency-keys.test.mjs (100%) rename config/scripts/{ => cli-build}/build-cli.mjs (85%) rename config/scripts/{ => cli-build}/build-cli.test.mjs (95%) rename config/scripts/{ => daemon-protocol/schema-facts}/daemon-protocol-facts.mjs (100%) rename config/scripts/{ => daemon-protocol/schema-facts}/daemon-protocol-facts.test.mjs (98%) rename config/scripts/{ => desktop-build/execution}/run-electron-vite-build.mjs (79%) rename config/scripts/{ => desktop-build/output-contracts}/electron-vite-output-contract.test.ts (94%) rename config/scripts/{ => desktop-build/output-contracts}/preload-output-contract.mjs (97%) rename config/scripts/{ => desktop-build/output-contracts}/renderer-boot-graph.mjs (100%) rename config/scripts/{ => desktop-build/output-contracts}/renderer-boot-graph.test.mjs (100%) rename config/scripts/{ => desktop-build/output-contracts}/sandbox-preload-imports.mjs (100%) rename config/scripts/{ => desktop-distribution/linux}/appimage-node-runtime.cjs (87%) rename config/scripts/{ => desktop-distribution/linux}/appimage-node-runtime.test.mjs (94%) rename config/scripts/{ => desktop-distribution/linux}/build-linux-local.mjs (97%) rename config/scripts/{ => desktop-distribution/linux}/build-linux-local.test.mjs (94%) rename config/scripts/{ => desktop-distribution/linux}/package-linux-formats-appimage.mjs (93%) rename config/scripts/{ => desktop-distribution/linux}/package-linux-formats-appimage.test.mjs (100%) rename config/scripts/{ => desktop-distribution/linux}/package-linux-formats.mjs (98%) rename config/scripts/{ => desktop-distribution/linux}/package-linux-formats.test.mjs (98%) rename config/scripts/{ => desktop-distribution/macos}/adhoc-mac-manifests.mjs (100%) rename config/scripts/{ => desktop-distribution/macos}/adhoc-mac-manifests.test.mjs (100%) rename config/scripts/{ => desktop-distribution/macos}/build-mac-local.mjs (100%) rename config/scripts/{ => desktop-distribution/macos}/build-mac-local.test.mjs (100%) rename config/scripts/{ => desktop-distribution/macos}/build-mac-notarization-overlap.mjs (98%) rename config/scripts/{ => desktop-distribution/macos}/build-mac-notarization-overlap.test.mjs (100%) rename config/scripts/{ => desktop-distribution/macos}/mac-build-compatibility.cjs (89%) rename config/scripts/{ => desktop-distribution/macos}/mac-build-compatibility.test.mjs (100%) rename config/scripts/{ => desktop-distribution/macos}/mac-notarization-builder-contract.test.mjs (100%) rename config/scripts/{ => desktop-distribution/macos}/sign-mac-app.mjs (100%) rename config/scripts/{ => desktop-distribution/macos}/sign-mac-app.test.mjs (96%) rename config/scripts/{ => desktop-distribution/runtime-verification}/electron-builder-config.test.mjs (94%) rename config/scripts/{ => desktop-distribution/runtime-verification}/electron-builder-mac-channel-config.test.mjs (94%) rename config/scripts/{ => desktop-distribution/runtime-verification}/electron-builder-native-rebuild.cjs (81%) rename config/scripts/{ => desktop-distribution/runtime-verification}/electron-builder-native-rebuild.test.mjs (77%) rename config/scripts/{ => desktop-distribution/runtime-verification}/electron-builder-runtime-resources.test.mjs (98%) rename config/scripts/{ => desktop-distribution/runtime-verification}/electron-builder-speech-config.test.mjs (95%) rename config/scripts/{ => desktop-distribution/runtime-verification}/packaged-node-pty-prebuild-prune.test.mjs (96%) rename config/scripts/{ => desktop-distribution/runtime-verification}/packaged-process-host-fixture.mjs (97%) rename config/scripts/{ => desktop-distribution/runtime-verification}/packaged-process-host.test.mjs (91%) rename config/scripts/{ => desktop-distribution/runtime-verification}/packaged-repository-input-exclusion.test.mjs (96%) rename config/scripts/{ => desktop-distribution/runtime-verification}/packaged-source-map-prune.test.mjs (99%) rename config/scripts/{ => desktop-distribution/runtime-verification}/packaged-windows-only-runtime-files.test.mjs (93%) rename config/scripts/{ => desktop-distribution/runtime-verification}/verify-packaged-browser-participation.mjs (85%) rename config/scripts/{ => desktop-distribution/runtime-verification}/verify-packaged-browser-participation.test.mjs (100%) rename config/scripts/{ => desktop-distribution/runtime-verification}/verify-packaged-daemon-entry.cjs (98%) rename config/scripts/{ => desktop-distribution/runtime-verification}/verify-packaged-daemon-entry.test.mjs (100%) rename config/scripts/{ => desktop-distribution/runtime-verification}/verify-packaged-mobile-web-bundle.cjs (98%) rename config/scripts/{ => desktop-distribution/runtime-verification}/verify-packaged-mobile-web-bundle.test.mjs (96%) rename config/scripts/{ => desktop-distribution/runtime-verification}/verify-packaged-node-pty-job-ownership.cjs (94%) rename config/scripts/{ => desktop-distribution/runtime-verification}/verify-packaged-node-pty-job-ownership.test.mjs (98%) rename config/scripts/{ => desktop-distribution/runtime-verification}/verify-packaged-plugin-resources.cjs (100%) rename config/scripts/{ => desktop-distribution/runtime-verification}/verify-packaged-plugin-resources.test.mjs (100%) rename config/scripts/{ => desktop-distribution/runtime-verification}/verify-packaged-serve-payload.cjs (100%) rename config/scripts/{ => desktop-distribution/runtime-verification}/verify-packaged-serve-payload.test.mjs (98%) rename config/scripts/{ => desktop-distribution/runtime-verification}/verify-packaged-windows-agent-hook.cjs (84%) rename config/scripts/{ => desktop-distribution/runtime-verification}/verify-packaged-windows-agent-hook.test.mjs (95%) rename config/scripts/{ => development/electron-bundle-cache}/dev-electron-bundle-cache.mjs (100%) rename config/scripts/{ => development/electron-bundle-cache}/dev-electron-bundle-cache.test.ts (100%) rename config/scripts/{ => development/instance-isolation}/dev-instance-isolation.mjs (100%) rename config/scripts/{ => development/instance-isolation}/dev-instance-isolation.test.mjs (100%) rename config/scripts/{ => development/remote-session-cleanup}/remote-agent-session-process-cleanup.mjs (100%) rename config/scripts/{ => electron-installation/platform-layout}/electron-platform-path.mjs (100%) rename config/scripts/{ => electron-installation/platform-layout}/install-electron-package-binary-test-fixtures.mjs (88%) rename config/scripts/{ => electron-installation/platform-layout}/install-electron-package-binary.mjs (98%) rename config/scripts/{ => electron-installation/platform-layout}/install-electron-package-binary.test.mjs (100%) rename config/scripts/{ => electron-installation/shared-dist-cache}/shared-electron-dist-cache.mjs (93%) rename config/scripts/{ => electron-installation/shared-dist-cache}/shared-electron-dist-cache.test.ts (99%) rename config/scripts/{ => git/pr-diff-base}/git-pull-request-diff-base.mjs (100%) rename config/scripts/{ => git/pr-diff-base}/git-pull-request-diff-base.test.mjs (100%) rename config/scripts/{ => localization/extraction-policy}/localization-extraction-change-scope.mjs (94%) rename config/scripts/{ => localization/extraction-policy}/localization-extraction-change-scope.test.mjs (91%) rename config/scripts/{ => macos/terminal-host-bundle}/macos-terminal-host-bundle.cjs (98%) rename config/scripts/{ => macos/terminal-host-bundle}/macos-terminal-host-bundle.test.mjs (97%) rename config/scripts/{ => mobile-web/check-entry}/run-mobile-web-app-checks.mjs (85%) rename config/scripts/{ => native-build/composition}/build-native-for-platform.mjs (94%) rename config/scripts/{ => native-build/composition}/build-native-for-platform.test.mjs (96%) rename config/scripts/{ => native-build/linux}/build-wayland-clipboard.mjs (96%) rename config/scripts/{ => native-build/linux}/build-wayland-clipboard.test.mjs (96%) rename config/scripts/{ => native-build/linux}/verify-linux-glibc-floor.cjs (100%) rename config/scripts/{ => native-build/linux}/verify-linux-glibc-floor.test.mjs (100%) rename config/scripts/{ => native-build/linux}/verify-linux-glibc-payloads.test.mjs (100%) rename config/scripts/{ => native-build/macos}/build-computer-macos.mjs (98%) rename config/scripts/{ => native-build/macos}/build-keyboard-layout-macos.mjs (100%) rename config/scripts/{ => native-build/macos}/build-notification-status-macos.mjs (97%) rename config/scripts/{ => native-build/macos}/build-process-footprint-macos.mjs (100%) rename config/scripts/{ => native-build/macos}/swift-cli-helper-macos.mjs (97%) rename config/scripts/{ => native-build/node-addons}/ensure-native-runtime-job-ownership.test.mjs (98%) rename config/scripts/{ => native-build/node-addons}/ensure-native-runtime.mjs (96%) rename config/scripts/{ => native-build/node-addons}/ensure-native-runtime.test.mjs (90%) rename config/scripts/{ => native-build/node-addons}/native-build-entry-probe.cjs (93%) rename config/scripts/{ => native-build/node-addons}/native-build-entry.cjs (100%) rename config/scripts/{ => native-build/node-addons}/native-build-entry.test.mjs (97%) rename config/scripts/{ => native-build/node-addons}/native-dependency-lock-digest.mjs (98%) rename config/scripts/{ => native-build/node-addons}/native-dependency-lock-digest.test.mjs (100%) rename config/scripts/{ => native-build/node-addons}/node-pty-job-ownership.cjs (98%) rename config/scripts/{ => native-build/node-addons}/rebuild-native-deps-node-pty.test.mjs (99%) rename config/scripts/{ => native-build/node-addons}/rebuild-native-deps-test-fixtures.mjs (91%) rename config/scripts/{ => native-build/node-addons}/rebuild-native-deps-windows-process-tree.test.mjs (97%) rename config/scripts/{ => native-build/node-addons}/rebuild-native-deps.mjs (96%) rename config/scripts/{ => native-build/node-addons}/rebuild-native-deps.test.mjs (98%) rename config/scripts/{ => native-build/node-addons}/shared-native-build.mjs (93%) rename config/scripts/{ => native-build/node-addons}/shared-native-build.test.mjs (98%) rename config/scripts/{ => native-build/windows}/benchmark-windows-native-preparation.mjs (90%) rename config/scripts/{ => native-build/windows}/build-windows-agent-hook.mjs (82%) rename config/scripts/{ => native-build/windows}/build-windows-cli-launcher.mjs (90%) rename config/scripts/{ => native-build/windows}/build-windows-cli-launcher.test.mjs (96%) rename config/scripts/{ => native-build/windows}/build-windows-process-tree-addon.mjs (98%) rename config/scripts/{ => native-build/windows}/build-windows-security-addon.mjs (92%) rename config/scripts/{ => native-build/windows}/build-windows-security-addon.test.mjs (98%) rename config/scripts/{ => native-build/windows}/capture-windows-native-environment.cmd (100%) rename config/scripts/{ => native-build/windows}/fixtures/DuplicatePathProcessLauncher.cs (100%) rename config/scripts/{ => native-build/windows}/initialize-windows-native-toolchain.mjs (98%) rename config/scripts/{ => native-build/windows}/initialize-windows-native-toolchain.test.mjs (100%) rename config/scripts/{ => native-build/windows}/msbuild-file-tracking.mjs (100%) rename config/scripts/{ => native-build/windows}/msbuild-file-tracking.test.mjs (100%) rename config/scripts/{ => native-build/windows}/windows-native-benchmark-observer.mjs (100%) rename config/scripts/{ => native-build/windows}/windows-native-preparation-benchmark.test.mjs (97%) rename config/scripts/{ => native-build/windows}/windows-pe-image-fixture.mjs (100%) rename config/scripts/{ => native-build/windows}/windows-pe-imports.mjs (100%) rename config/scripts/{ => native-build/windows}/windows-pe-imports.test.mjs (100%) rename config/scripts/{ => native-build/windows}/windows-pe-machine.cjs (100%) rename config/scripts/{ => native-build/windows}/windows-pe-machine.test.mjs (100%) rename config/scripts/{ => native-build/windows}/windows-process-tree-creation-time.cjs (100%) rename config/scripts/{ => native-build/windows}/windows-process-tree-creation-time.test.mjs (100%) rename config/scripts/{ => native-build/windows}/windows-process-tree-gyp-path.test.mjs (93%) rename config/scripts/{ => native-build/windows}/windows-process-tree-gyp-rebuild.mjs (98%) rename config/scripts/{ => native-build/windows}/windows-process-tree-gyp-rebuild.test.mjs (97%) rename config/scripts/{ => native-build/windows}/windows-process-tree-prepared-addon.mjs (82%) rename config/scripts/{ => native-build/windows}/windows-process-tree-prepared-addon.test.mjs (90%) rename config/scripts/{ => native-build/windows}/windows-rust-build-scope.mjs (95%) rename config/scripts/{ => native-build/windows}/windows-rust-executable-build.mjs (98%) rename config/scripts/{ => node-resolution/ancestor-modules}/store-ancestor-node-modules.mjs (94%) rename config/scripts/{ => node-resolution/ancestor-modules}/store-ancestor-node-modules.test.mjs (100%) rename config/scripts/{ => node-runtime/archive-identity}/node-dist-archive-name.mjs (100%) rename config/scripts/{ => node-runtime/archive-identity}/update-node-runtime-pin.mjs (95%) rename config/scripts/{ => node-runtime/archive-identity}/update-node-runtime-pin.test.mjs (97%) delete mode 100644 config/scripts/node-server-native-compat-cleanup.test-fixture.json rename config/scripts/{ => node-server/qualification}/node-server-change-scope-enclosing-checkout.test.mjs (100%) rename config/scripts/{ => node-server/qualification}/node-server-change-scope.mjs (77%) rename config/scripts/{ => node-server/qualification}/node-server-change-scope.test.mjs (98%) create mode 100644 config/scripts/node-server/qualification/node-server-native-compat-cleanup.test-fixture.json rename config/scripts/{ => node-server/qualification}/node-server-native-compat-scope.mjs (70%) rename config/scripts/{ => node-server/qualification}/node-server-native-compat-scope.test.mjs (89%) rename config/scripts/{ => node-server/qualification}/node-server-policy-self-tests.test.mjs (90%) rename config/scripts/{ => node-server/qualification}/node-server-qualification.mjs (97%) rename config/scripts/{ => node-server/qualification}/node-server-qualification.test.mjs (94%) rename config/scripts/{ => node-server/qualification}/node-server-test-paths.mjs (96%) rename config/scripts/{ => orcad-distribution/prebuilds}/build-orcad-node.mjs (89%) rename config/scripts/{ => orcad-distribution/prebuilds}/build-orcad-prebuilds.mjs (94%) rename config/scripts/{ => orcad-distribution/prebuilds}/build-orcad-prebuilds.test.mjs (98%) rename config/scripts/{ => orcad-distribution/prebuilds}/merge-orcad-prebuilds.mjs (98%) rename config/scripts/{ => orcad-distribution/prebuilds}/merge-orcad-prebuilds.test.mjs (100%) rename config/scripts/{ => orcad-distribution/prebuilds}/orcad-prebuild-compat-addons.mjs (96%) rename config/scripts/{ => orcad-distribution/prebuilds}/orcad-prebuild-node-gyp.mjs (92%) rename config/scripts/{ => orcad-distribution/prebuilds}/orcad-prebuild-node-gyp.test.mjs (100%) rename config/scripts/{ => orcad-distribution/prebuilds}/orcad-prebuild-slot-contents.mjs (97%) rename config/scripts/{ => orcad-distribution/prebuilds}/orcad-prebuild-slot-contents.test.mjs (98%) rename config/scripts/{ => orcad-distribution/prebuilds}/orcad-prebuild-smoke-child.cjs (100%) rename config/scripts/{ => orcad-distribution/prebuilds}/orcad-prebuild-smoke.mjs (97%) rename config/scripts/{ => orcad-distribution/prebuilds}/orcad-windows-prebuild-cache.mjs (85%) rename config/scripts/{ => orcad-distribution/prebuilds}/orcad-windows-prebuild-cache.test.mjs (96%) rename config/scripts/{ => orcad-distribution/prebuilds}/orcad-windows-prebuild-workflow.test.mjs (89%) rename config/scripts/{ => orcad-distribution/prebuilds}/pinned-node-downloads.mjs (93%) rename config/scripts/{ => orcad-distribution/prebuilds}/pinned-node-downloads.test.mjs (100%) rename config/scripts/{ => orcad-distribution/prebuilds}/server-build-target.mjs (100%) rename config/scripts/{ => orcad-distribution/qualification}/orcad-daemon-protocol-crossing.test.mjs (90%) rename config/scripts/{ => orcad-distribution/qualification}/orcad-terminal-smoke-change-scope.mjs (72%) rename config/scripts/{ => orcad-distribution/qualification}/orcad-terminal-smoke-change-scope.test.mjs (83%) rename config/scripts/{ => orcad-distribution/server-bundle}/build-orcad.mjs (96%) rename config/scripts/{ => orcad-distribution/server-bundle}/foreign-sqlite-reader-worker-smoke.mjs (94%) rename config/scripts/{ => orcad-distribution/server-bundle}/foreign-sqlite-reader-worker-smoke.test.mjs (100%) rename config/scripts/{ => orcad-distribution/server-bundle}/orcad-artifact-version.mjs (91%) rename config/scripts/{ => orcad-distribution/server-bundle}/orcad-artifact-version.test.mjs (92%) rename config/scripts/{ => orcad-distribution/server-bundle}/orcad-entry-build.mjs (97%) rename config/scripts/{ => orcad-distribution/server-bundle}/orcad-entry-build.test.mjs (100%) rename config/scripts/{ => orcad-distribution/server-bundle}/orcad-linear-sdk-package.mjs (89%) rename config/scripts/{ => orcad-distribution/server-bundle}/orcad-linear-sdk-package.test.mjs (94%) rename config/scripts/{ => orcad-distribution/server-bundle}/orcad-mobile-web-bundle.mjs (86%) rename config/scripts/{ => orcad-distribution/server-bundle}/orcad-mobile-web-bundle.test.mjs (89%) rename config/scripts/{ => orcad-distribution/server-bundle}/orcad-watcher-package.mjs (95%) rename config/scripts/{ => orcad-distribution/server-bundle}/orcad-watcher-package.test.mjs (100%) rename config/scripts/{ => orcad-distribution/server-bundle}/orcad-windows-cli-launcher.mjs (83%) rename config/scripts/{ => orcad-distribution/server-bundle}/orcad-windows-cli-launcher.test.mjs (100%) rename config/scripts/{ => orcad-distribution/server-bundle}/orcad-windows-process-tree.mjs (80%) rename config/scripts/{ => orcad-distribution/server-bundle}/orcad-windows-process-tree.test.mjs (97%) rename config/scripts/{ => orcad-distribution/server-bundle}/orcad-windows-security.mjs (79%) rename config/scripts/{ => orcad-distribution/server-bundle}/orcad-windows-security.test.mjs (96%) rename config/scripts/{ => orcad-distribution/server-bundle}/profile-state-worker-smoke.mjs (93%) rename config/scripts/{ => orcad-distribution/server-bundle}/profile-state-worker-smoke.test.mjs (100%) rename config/scripts/{ => orcad-distribution/server-bundle}/session-scanner-service-smoke.mjs (91%) rename config/scripts/{ => orcad-distribution/server-bundle}/session-scanner-service-smoke.test.mjs (100%) rename config/scripts/{ => orcad-distribution/template}/build-orcad-template.mjs (92%) rename config/scripts/{ => orcad-distribution/template}/build-orcad-template.test.mjs (95%) rename config/scripts/{ => orcad-distribution/template}/compact-packaged-orcad-ripgrep.cjs (98%) rename config/scripts/{ => orcad-distribution/template}/compact-packaged-orcad-ripgrep.test.mjs (97%) rename config/scripts/{ => orcad-distribution/template}/orcad-template-test-fixture.mjs (95%) rename config/scripts/{ => orcad-distribution/template}/packaged-orcad-browser.cjs (91%) rename config/scripts/{ => orcad-distribution/template}/packaged-orcad-browser.test.mjs (93%) rename config/scripts/{ => orcad-distribution/template}/packaged-orcad-template.cjs (97%) rename config/scripts/{ => orcad-distribution/template}/packaged-orcad-template.test.mjs (99%) rename config/scripts/{ => orcad-distribution/template}/verify-packaged-orcad-template.cjs (98%) rename config/scripts/{ => orcad-distribution/template}/verify-packaged-orcad-template.test.mjs (97%) rename config/scripts/{ => performance/idle-cpu}/idle-cpu-process-sampling.mjs (100%) rename config/scripts/{ => performance/idle-cpu}/idle-cpu-process-sampling.test.mjs (100%) rename config/scripts/{ => performance/idle-cpu}/idle-cpu-renderer-scale-fixture.mjs (100%) rename config/scripts/{ => performance/idle-cpu}/idle-cpu-renderer-timing-probe.mjs (100%) rename config/scripts/{ => performance/idle-cpu}/idle-cpu-synthetic-spinners.mjs (100%) rename config/scripts/{ => performance/idle-cpu}/run-idle-cpu-benchmark.mjs (91%) rename config/scripts/{ => performance/measurement}/benchmark-sample-summary.mjs (100%) rename config/scripts/{ => performance/measurement}/benchmark-sample-summary.test.mjs (100%) rename config/scripts/{ => performance/measurement}/counterbalanced-benchmark-schedule.mjs (100%) rename config/scripts/{ => performance/measurement}/counterbalanced-benchmark-schedule.test.mjs (100%) rename config/scripts/{ => performance/terminal-preparation}/terminal-perf-dependency-preparation.test.mjs (94%) rename config/scripts/{ => performance/terminal-reporting}/check-terminal-perf-report-budgets.mjs (96%) rename config/scripts/{ => performance/terminal-reporting}/check-terminal-perf-report-budgets.test.mjs (98%) rename config/scripts/{ => performance/terminal-reporting}/generate-terminal-perf-html-report.mjs (99%) rename config/scripts/{ => performance/terminal-reporting}/generate-terminal-perf-html-report.test.mjs (100%) rename config/scripts/{ => performance/terminal-reporting}/summarize-terminal-perf-report.mjs (95%) rename config/scripts/{ => performance/terminal-reporting}/summarize-terminal-perf-report.test.mjs (94%) rename config/scripts/{ => performance/terminal-reporting}/terminal-perf-report-annotations.mjs (100%) rename config/scripts/{ => performance/terminal-reporting}/terminal-perf-report-annotations.test.mjs (100%) rename config/scripts/{ => performance/terminal-reporting}/terminal-perf-report-budgets.mjs (100%) rename config/scripts/{ => performance/terminal-reporting}/terminal-perf-report-rows.mjs (100%) rename config/scripts/{ => plugin-build/declarative-runtime}/build-plugin-declarative-runtime.mjs (94%) rename config/scripts/{ => plugin-build/declarative-runtime}/build-plugin-declarative-runtime.test.mjs (100%) delete mode 100644 config/scripts/pr-package-test-paths.mjs rename config/scripts/{ => preflight/benchmarks}/benchmark-ci-preflight-critical-path.mjs (62%) rename config/scripts/{ => preflight/benchmarks}/benchmark-preflight-compat-boundary.mjs (82%) rename config/scripts/{ => preflight/benchmarks}/benchmark-preflight-compilers.mjs (95%) rename config/scripts/{ => preflight/benchmarks}/benchmark-preflight-localization-extraction.mjs (89%) rename config/scripts/{ => preflight/benchmarks}/benchmark-preflight-static-analysis.mjs (91%) rename config/scripts/{ => preflight/benchmarks}/preflight-benchmark-command.mjs (100%) rename config/scripts/{ => preflight/changed-checks}/casting-code-quality.test.mjs (97%) rename config/scripts/{ => preflight/changed-checks}/check-changed-code-quality.mjs (97%) rename config/scripts/{ => preflight/changed-checks}/check-changed-code-quality.test.mjs (97%) rename config/scripts/{ => preflight/changed-checks}/check-changed-pass-cache.mjs (92%) rename config/scripts/{ => preflight/changed-checks}/check-changed-pass-cache.test.mjs (100%) rename config/scripts/{ => preflight/changed-checks}/check-changed-selection.mjs (90%) rename config/scripts/{ => preflight/changed-checks}/check-changed-selection.test.mjs (97%) rename config/scripts/{ => preflight/changed-checks}/check-changed.mjs (93%) rename config/scripts/{ => preflight/changed-checks}/moved-code-matcher.test.mjs (96%) rename config/scripts/{ => release/javascript-artifacts}/release-javascript-artifact.mjs (95%) rename config/scripts/{ => release/javascript-artifacts}/release-javascript-artifact.test.mjs (100%) rename config/scripts/{ => release/javascript-artifacts}/release-javascript-benchmark.mjs (96%) rename config/scripts/{ => release/javascript-artifacts}/release-javascript-parity.mjs (83%) rename config/scripts/{ => release/javascript-artifacts}/release-javascript-parity.test.mjs (77%) rename config/scripts/{ => release/versioning}/adhoc-build-version.mjs (100%) rename config/scripts/{ => release/versioning}/adhoc-build-version.test.mjs (98%) rename config/scripts/{ => release/versioning}/daily-build-version.mjs (100%) rename config/scripts/{ => release/versioning}/daily-build-version.test.mjs (98%) rename config/scripts/{ => release/versioning}/dev-channel-base-version.mjs (100%) rename config/scripts/{ => release/versioning}/dev-channel-base-version.test.mjs (100%) rename config/scripts/{ => release/versioning}/hourly-build-version.mjs (100%) rename config/scripts/{ => release/versioning}/hourly-build-version.test.mjs (98%) rename config/scripts/{ => release/versioning}/release-tag-patterns.mjs (100%) rename config/scripts/{ => release/versioning}/release-title-timestamp.mjs (100%) rename config/scripts/{ => release/workflow-contracts}/adhoc-build-pinned-commit.test.mjs (100%) rename config/scripts/{ => release/workflow-contracts}/adhoc-release-waits.test.mjs (100%) rename config/scripts/{ => release/workflow-contracts}/adhoc-windows-parallelism.test.mjs (85%) rename config/scripts/{ => remote-host-build/wsl-guest}/build-wsl-guest.mjs (92%) rename config/scripts/{ => runtime-verification/participation}/verify-playwright-participation.mjs (100%) rename config/scripts/{ => runtime-verification/skills-cli}/verify-skills-cli-runtime.cjs (100%) rename config/scripts/{ => runtime-verification/skills-cli}/verify-skills-cli-runtime.test.mjs (98%) rename config/scripts/{ => static-analysis/module-requests}/static-module-specifiers.mjs (100%) rename config/scripts/{ => static-analysis/module-requests}/static-module-specifiers.test.mjs (98%) rename config/scripts/{ => static-analysis/process-boundaries}/check-main-sync-spawn-ratchet.mjs (95%) rename config/scripts/{ => static-analysis/process-boundaries}/check-main-sync-spawn-ratchet.test.mjs (100%) rename config/scripts/{ => static-analysis/process-boundaries}/check-process-host-imports.mjs (96%) rename config/scripts/{ => static-analysis/process-boundaries}/check-process-host-imports.test.mjs (99%) rename config/scripts/{ => static-analysis/process-boundaries}/gated-call-use-collector.mjs (98%) rename config/scripts/{ => static-analysis/process-boundaries}/test-only-source-path.mjs (100%) rename config/scripts/{ => static-analysis/process-boundaries}/test-only-source-path.test.mjs (100%) rename config/scripts/{ => static-analysis/ratchet-baseline}/ratchet-baseline.mjs (100%) rename config/scripts/{ => static-analysis/ratchet-baseline}/ratchet-baseline.test.mjs (100%) rename config/scripts/{ => static-analysis/ratchet-runner}/run-ratchets.mjs (100%) rename config/scripts/{ => static-analysis/structural-scan}/ast-grep-scan.mjs (91%) rename config/scripts/{ => static-analysis/type-assertion-budget}/existing-type-assertions.mjs (100%) rename config/scripts/{ => terminal-dependencies/serialize-addon}/build-serialize-addon-at-ref.mjs (97%) rename config/scripts/{ => terminal-dependencies/xterm-patches}/regenerate-xterm-patches.mjs (99%) rename config/scripts/{ => terminal-dependencies/xterm-patches}/regenerate-xterm-patches.test.mjs (99%) rename config/scripts/{ => terminal-dependencies/xterm-patches}/xterm-image-cell-payload-contract.test.mjs (98%) rename config/scripts/{ => terminal-dependencies/xterm-patches}/xterm-image-kitty-admission.test.mjs (100%) rename config/scripts/{ => terminal-dependencies/xterm-patches}/xterm-image-kitty-coordinate-boundaries.test.mjs (100%) rename config/scripts/{ => terminal-dependencies/xterm-patches}/xterm-image-kitty-file-transport.test.mjs (100%) rename config/scripts/{ => terminal-dependencies/xterm-patches}/xterm-image-kitty-glyph-visibility.test.mjs (100%) rename config/scripts/{ => terminal-dependencies/xterm-patches}/xterm-image-kitty-placeholder-contract.test.mjs (100%) rename config/scripts/{ => terminal-dependencies/xterm-patches}/xterm-image-kitty-placeholder-lifecycle.test.mjs (100%) rename config/scripts/{ => terminal-dependencies/xterm-patches}/xterm-image-kitty-retransmit.test.mjs (100%) rename config/scripts/{ => terminal-dependencies/xterm-patches}/xterm-image-lifecycle-contract.test.mjs (98%) rename config/scripts/{ => terminal-dependencies/xterm-patches}/xterm-image-memory-contract.test.mjs (97%) rename config/scripts/{ => terminal-dependencies/xterm-patches}/xterm-image-resize-contract.test.mjs (93%) rename config/scripts/{ => terminal-dependencies/xterm-patches}/xterm-image-wasm-budget-contract.test.mjs (97%) rename config/scripts/{ => terminal-dependencies/xterm-patches}/xterm-kitty-placeholder-test-terminal.mjs (96%) rename config/scripts/{ => terminal-dependencies/xterm-patches}/xterm-patch-text.mjs (98%) rename config/scripts/{ => terminal-dependencies/xterm-patches}/xterm-underline-color-contract.test.mjs (90%) rename config/scripts/{ => test-fixtures/script-copy-closure}/script-module-dependencies.mjs (100%) rename config/scripts/{ => test-fixtures/script-copy-closure}/script-module-dependencies.test.mjs (100%) rename config/scripts/{ => test-runtime/dom}/happy-dom-animation-cancel.ts (100%) rename config/scripts/{ => test-runtime/dom}/happy-dom-mutation-observer-retention.test.ts (100%) rename config/scripts/{ => test-runtime/dom}/happy-dom-mutation-observer-retention.ts (100%) rename config/scripts/{ => test-runtime/dom}/happy-dom-offscreen-canvas.test.ts (100%) rename config/scripts/{ => test-runtime/dom}/happy-dom-offscreen-canvas.ts (100%) rename config/scripts/{ => test-runtime/dom}/vitest-dom-setup.ts (100%) rename config/scripts/{ => test-runtime/environment}/vitest-bun-node-builtins.ts (100%) rename config/scripts/{ => test-runtime/environment}/vitest-caller-identity-env-setup.ts (100%) rename config/scripts/{ => test-runtime/environment}/vitest-host-ports-setup.ts (92%) rename config/scripts/{ => test-runtime/environment}/vitest-inherited-git-env-setup.ts (100%) rename config/scripts/{ => test-runtime/environment}/vitest-orcad-feature-readiness-reset.ts (65%) rename config/scripts/{ => test-runtime/environment}/vitest-real-agent-home-write-guard.test.ts (100%) rename config/scripts/{ => test-runtime/environment}/vitest-real-agent-home-write-guard.ts (100%) rename config/scripts/{ => test-runtime/environment}/vitest-runtime-boundary.test.ts (100%) rename config/scripts/{ => test-runtime/execution-policy}/run-vitest.mjs (91%) rename config/scripts/{ => test-runtime/execution-policy}/vitest-changed-precheck.mjs (100%) rename config/scripts/{ => test-runtime/execution-policy}/vitest-changed-precheck.test.mjs (100%) rename config/scripts/{ => test-runtime/execution-policy}/vitest-run-filters.mjs (100%) rename config/scripts/{ => test-runtime/execution-policy}/vitest-run-filters.test.mjs (95%) rename config/scripts/{ => test-runtime/execution-policy}/vitest-run-temp-directory.mjs (100%) rename config/scripts/{ => test-runtime/execution-policy}/vitest-run-temp-directory.test.mjs (100%) rename config/scripts/{ => test-runtime/execution-policy}/vitest-runtime-sequencer.mjs (92%) rename config/scripts/{ => test-runtime/execution-policy}/vitest-runtime-sequencer.test.mjs (100%) rename config/scripts/{ => test-runtime/module-cache}/vitest-local-module-cache.mjs (94%) rename config/scripts/{ => test-runtime/module-cache}/vitest-module-cache-resolution-key.test.ts (100%) rename config/scripts/{ => test-runtime/module-cache}/vitest-module-cache-resolution-key.ts (100%) rename config/scripts/{ => test-runtime/module-cache}/vitest-zod-bundle.mjs (100%) rename config/scripts/{ => test-runtime/module-cache}/vitest-zod-bundle.test.mjs (100%) rename config/scripts/{ => test-runtime/node-worker}/vitest-node-runtime-boundary.test.ts (91%) rename config/scripts/{ => test-runtime/node-worker}/vitest-node-runtime-ipc-codec.mjs (100%) rename config/scripts/{ => test-runtime/node-worker}/vitest-node-runtime-pool.test.ts (100%) rename config/scripts/{ => test-runtime/node-worker}/vitest-node-runtime-pool.ts (96%) rename config/scripts/{ => test-runtime/node-worker}/vitest-node-runtime-worker.mjs (100%) rename config/scripts/{ => test-runtime/sqlite-admission}/vitest-node-runtime-files.mjs (97%) rename config/scripts/{ => test-runtime/sqlite-admission}/vitest-sqlite-runtime-boundary.test.ts (100%) rename config/scripts/{ => test-runtime/sqlite-admission}/vitest-sqlite-runtime-cache.test.ts (100%) rename config/scripts/{ => test-runtime/sqlite-admission}/vitest-sqlite-runtime-scan.mjs (96%) rename config/scripts/{ => tool-invocation}/node-old-space-limit.mjs (100%) rename config/scripts/{ => tool-invocation}/node-old-space-limit.test.mjs (100%) rename config/scripts/{ => tool-invocation}/oxc-cli-invocation.mjs (100%) rename config/scripts/{ => tool-invocation}/oxc-cli-invocation.test.mjs (95%) rename config/scripts/{ => tool-invocation}/oxlint-cli-invocation.mjs (100%) rename config/scripts/{ => tool-invocation}/pinned-bun-executable.mjs (100%) rename config/scripts/{ => tool-invocation}/pinned-bun-executable.test.mjs (100%) rename config/scripts/{ => tool-invocation}/pnpm-cli-invocation.mjs (100%) rename config/scripts/{ => tool-invocation}/pnpm-cli-invocation.test.mjs (100%) rename config/scripts/{ => tool-invocation}/process-failure-message.mjs (100%) rename config/scripts/{ => tool-invocation}/process-failure-message.test.mjs (100%) rename config/scripts/{ => tool-invocation}/rolldown-thread-limit.mjs (100%) rename config/scripts/{ => tool-invocation}/script-entry-detection.mjs (100%) rename config/scripts/{ => tool-invocation}/script-entry-detection.test.mjs (100%) rename config/scripts/{ => typecheck/project-execution}/run-typecheck-bun-queue.test.mjs (100%) rename config/scripts/{ => typecheck/project-execution}/run-typecheck-projects-in-parallel.mjs (98%) rename config/scripts/{ => typecheck/project-execution}/run-typecheck-projects-in-parallel.test.mjs (98%) rename config/scripts/{ => typecheck/project-execution}/tsrs-typecheck-compiler.mjs (100%) rename config/scripts/{ => typecheck/project-execution}/tsrs-typecheck-compiler.test.mjs (97%) rename config/scripts/{ => typecheck/project-execution}/typecheck-project-coverage.test.mjs (97%) rename config/scripts/{ => web-build/execution}/run-vite-web-build.mjs (82%) rename config/scripts/{ => workflow/pr-admission}/pr-aggregate-gate-context.mjs (96%) rename config/scripts/{ => workflow/pr-admission}/pr-aggregate-gate.test.mjs (100%) rename config/scripts/{ => workflow/pr-admission}/pr-ready-check-gate.test.mjs (100%) rename config/scripts/{ => workflow/source-routing}/pr-browser-e2e-source-routes.mjs (100%) rename config/scripts/{ => workflow/source-routing}/pr-code-change-scope-cross-version-launch-route.test.mjs (100%) rename config/scripts/{ => workflow/source-routing}/pr-code-change-scope-cross-version-send-path.test.mjs (100%) rename config/scripts/{ => workflow/source-routing}/pr-code-change-scope-daemon-protocol.test.mjs (90%) rename config/scripts/{ => workflow/source-routing}/pr-code-change-scope-format-route.test.mjs (100%) rename config/scripts/{ => workflow/source-routing}/pr-code-change-scope-process-host.test.mjs (90%) rename config/scripts/{ => workflow/source-routing}/pr-code-change-scope-released-phone.test.mjs (100%) rename config/scripts/{ => workflow/source-routing}/pr-code-change-scope-test-inputs.test.mjs (71%) rename config/scripts/{ => workflow/source-routing}/pr-code-change-scope-windows-process-probe.test.mjs (79%) rename config/scripts/{ => workflow/source-routing}/pr-code-change-scope.mjs (86%) rename config/scripts/{ => workflow/source-routing}/pr-code-change-scope.test.mjs (87%) rename config/scripts/{ => workflow/source-routing}/pr-codex-unit-only-selection.test.mjs (100%) rename config/scripts/{ => workflow/source-routing}/pr-e2e-gate-contract.test.mjs (100%) rename config/scripts/{ => workflow/source-routing}/pr-e2e-source-routing.mjs (99%) rename config/scripts/{ => workflow/source-routing}/pr-editor-preview-e2e-source-routes.mjs (100%) rename config/scripts/{ => workflow/source-routing}/pr-feature-area-e2e-source-routes.mjs (100%) rename config/scripts/{ => workflow/source-routing}/pr-layout-oracle-route.mjs (97%) create mode 100644 config/scripts/workflow/source-routing/pr-package-test-paths.mjs rename config/scripts/{ => workflow/source-routing}/pr-plugin-e2e-source-routes.mjs (100%) rename config/scripts/{ => workflow/source-routing}/pr-shell-contract-prefixes.mjs (85%) rename config/scripts/{ => workflow/source-routing}/pr-unit-support-routing.test.mjs (96%) rename config/scripts/{ => workflow/source-routing}/pr-wsl-e2e-source-routes.mjs (66%) create mode 100644 config/scripts/workflow/source-routing/pr-xterm-patch-prefixes.mjs rename config/scripts/{ => workflow/source-routing}/windows-native-toolchain-routing.test.mjs (81%) rename config/scripts/{ => workflow/source-routing}/wsl-e2e-lane-contract.test.mjs (94%) rename config/scripts/{ => workspace-package-build}/build-workspace-packages.mjs (96%) rename config/scripts/{ => workspace/source-exports}/workspace-source-exports.mjs (100%) rename config/scripts/{ => workspace/source-exports}/workspace-source-exports.test.mjs (100%) rename config/scripts/{ => worktree-storage}/dev-storage-reclaim.mjs (100%) rename config/scripts/{ => worktree-storage}/dev-storage-reclaim.test.mjs (98%) rename config/scripts/{ => worktree-storage}/local-repository-worktrees.mjs (94%) rename config/scripts/{ => worktree-storage}/reclaim-dev-electron-bundles.mjs (98%) rename config/scripts/{ => worktree-storage}/reclaim-dev-electron-bundles.test.ts (98%) rename config/scripts/{ => worktree-storage}/reclaim-dev-worktree-profiles.mjs (92%) rename config/scripts/{ => worktree-storage}/reclaim-dev-worktree-profiles.test.mjs (95%) rename config/scripts/{ => worktree-storage}/reclaim-electron-dists.mjs (97%) rename config/scripts/{ => worktree-storage}/reclaim-electron-dists.test.ts (97%) rename config/scripts/{ => worktree-storage}/reclaim-release-test-caches.mjs (94%) rename config/scripts/{ => worktree-storage}/reclaim-release-test-caches.test.ts (97%) rename config/scripts/{ => worktree-storage}/reclaim-vite-caches.mjs (97%) rename config/scripts/{ => worktree-storage}/reclaim-vite-caches.test.mjs (98%) rename config/scripts/{ => worktree-storage}/reclaim-vitest-module-caches.mjs (95%) rename config/scripts/{ => worktree-storage}/reclaim-vitest-module-caches.test.mjs (94%) rename config/scripts/{ => worktree-storage}/reclaim-worktree-command.mjs (100%) rename config/scripts/{ => worktree-storage}/reclaim-worktree-command.test.mjs (100%) rename config/scripts/{ => worktree-storage}/reclaim-worktree-generated-files.mjs (100%) rename config/scripts/{ => worktree-storage}/reclaim-worktree-generated-files.test.mjs (100%) rename config/scripts/{ => worktree-storage}/reclaim-worktree-space.mjs (100%) rename config/scripts/{ => worktree-storage}/reclaim-worktree-space.test.mjs (100%) rename config/scripts/{ => worktree-storage}/vite-cache-activity.mjs (100%) rename config/scripts/{ => worktree-storage}/worktree-recent-activity.mjs (93%) delete mode 100644 config/scripts/zip-extractor-command.mjs diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index b2dbc010e1c..6d58e961bd6 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -148,7 +148,7 @@ needed. Things to know: dependencies the package never declared and hides missing-dependency bugs; `pnpm install` warns when it finds one. - Native addons are never rebuilt in place in a shared slot: each CPU gets its own build - beside it (see [`native-build-entry.cjs`](../config/scripts/native-build-entry.cjs)), so + beside it (see [`native-build-entry.cjs`](../config/scripts/native-build/node-addons/native-build-entry.cjs)), so cross-arch packaging is safe for other worktrees. - `ORCA_PNPM_GLOBAL_VIRTUAL_STORE=0` opts out. Keep it set in your shell: `pnpm run` re-checks the install and relinks a worktree whose layout no longer diff --git a/.github/actions/prepare-native-runtime/action.yml b/.github/actions/prepare-native-runtime/action.yml index 62763c66c75..c5ca9872691 100644 --- a/.github/actions/prepare-native-runtime/action.yml +++ b/.github/actions/prepare-native-runtime/action.yml @@ -54,7 +54,7 @@ runs: env: NATIVE_RUNTIME: ${{ inputs.native-runtime }} NODE_VERSION: ${{ inputs.node-version }} - NATIVE_SOURCE_HASH: ${{ hashFiles('.npmrc', 'config/pnpmfile.cjs', '.github/actions/prepare-native-runtime/action.yml', 'config/scripts/ensure-native-runtime.mjs', 'config/scripts/initialize-windows-native-toolchain.mjs', 'config/scripts/capture-windows-native-environment.cmd', 'config/scripts/rebuild-native-deps.mjs', 'config/scripts/node-pty-job-ownership.cjs', 'config/scripts/windows-pe-machine.cjs', 'config/scripts/windows-process-tree-gyp-rebuild.mjs', 'config/scripts/windows-process-tree-creation-time.cjs', 'config/scripts/install-electron-package-binary.mjs', 'config/scripts/electron-platform-path.mjs', 'config/scripts/zip-extractor-command.mjs', 'src/shared/zip-extractor-command.ts', 'config/scripts/shared-electron-dist-cache.mjs', 'config/scripts/space-sharing-copy.mjs', 'config/scripts/shared-tree-publish.mjs', 'config/scripts/native-build-entry.cjs', 'config/scripts/native-build-entry-probe.cjs', 'config/scripts/shared-native-build.mjs', 'config/scripts/orcad-prebuild-node-gyp.mjs', 'config/scripts/msbuild-file-tracking.mjs', 'config/scripts/native-dependency-lock-digest.mjs', 'config/patches/node-pty@1.1.0.patch', 'config/patches/@vscode__windows-process-tree@0.8.0.patch', 'native/windows-registry/src/addon.cc', 'native/windows-registry/binding.gyp', 'native/windows-registry/package.json', 'native/windows-registry/index.js', 'native/windows-security/src/addon.cc', 'native/windows-security/src/isolated-spawn.cc', 'native/windows-security/src/isolated-spawn.h', 'native/windows-security/binding.gyp', 'native/windows-security/package.json', 'native/windows-security/index.js') }} + NATIVE_SOURCE_HASH: ${{ hashFiles('.npmrc', 'config/pnpmfile.cjs', '.github/actions/prepare-native-runtime/action.yml', 'config/scripts/native-build/node-addons/ensure-native-runtime.mjs', 'config/scripts/native-build/windows/initialize-windows-native-toolchain.mjs', 'config/scripts/native-build/windows/capture-windows-native-environment.cmd', 'config/scripts/native-build/node-addons/rebuild-native-deps.mjs', 'config/scripts/native-build/node-addons/node-pty-job-ownership.cjs', 'config/scripts/native-build/windows/windows-pe-machine.cjs', 'config/scripts/native-build/windows/windows-process-tree-gyp-rebuild.mjs', 'config/scripts/native-build/windows/windows-process-tree-creation-time.cjs', 'config/scripts/electron-installation/platform-layout/install-electron-package-binary.mjs', 'config/scripts/electron-installation/platform-layout/electron-platform-path.mjs', 'config/scripts/zip-extractor-command.mjs', 'src/shared/zip-extractor-command.ts', 'config/scripts/electron-installation/shared-dist-cache/shared-electron-dist-cache.mjs', 'config/scripts/artifact-storage/reflink-copy/space-sharing-copy.mjs', 'config/scripts/artifact-storage/atomic-publication/shared-tree-publish.mjs', 'config/scripts/native-build/node-addons/native-build-entry.cjs', 'config/scripts/native-build/node-addons/native-build-entry-probe.cjs', 'config/scripts/native-build/node-addons/shared-native-build.mjs', 'config/scripts/orcad-distribution/prebuilds/orcad-prebuild-node-gyp.mjs', 'config/scripts/native-build/windows/msbuild-file-tracking.mjs', 'config/scripts/native-build/node-addons/native-dependency-lock-digest.mjs', 'config/patches/node-pty@1.1.0.patch', 'config/patches/@vscode__windows-process-tree@0.8.0.patch', 'native/windows-registry/src/addon.cc', 'native/windows-registry/binding.gyp', 'native/windows-registry/package.json', 'native/windows-registry/index.js', 'native/windows-security/src/addon.cc', 'native/windows-security/src/isolated-spawn.cc', 'native/windows-security/src/isolated-spawn.h', 'native/windows-security/binding.gyp', 'native/windows-security/package.json', 'native/windows-security/index.js') }} run: | scope="${ImageOS:-$RUNNER_OS}" if [ -r /etc/os-release ]; then @@ -64,7 +64,7 @@ runs: pnpm_version="$(pnpm --version)" test -n "$pnpm_version" # Locked native closures and the Electron release, not the whole lockfile. - lock_digest="$(node config/scripts/native-dependency-lock-digest.mjs)" + lock_digest="$(node config/scripts/native-build/node-addons/native-dependency-lock-digest.mjs)" test -n "$lock_digest" printf 'scope=%s\n' "$scope" >> "$GITHUB_OUTPUT" printf 'key=native-modules-%s-%s-%s-%s-node%s-pnpm%s-%s-%s\n' "$RUNNER_OS" "$scope" "$RUNNER_ARCH" "$NATIVE_RUNTIME" "$NODE_VERSION" "$pnpm_version" "$NATIVE_SOURCE_HASH" "$lock_digest" >> "$GITHUB_OUTPUT" @@ -119,7 +119,7 @@ runs: run: | # A cache hit can contain unusable addons; probe before skipping the rebuild toolchain. if [ "$NATIVE_RUNTIME" = node ] && [ "$NATIVE_CACHE_HIT" = true ] && - node config/scripts/ensure-native-runtime.mjs --check-only; then + node config/scripts/native-build/node-addons/ensure-native-runtime.mjs --check-only; then exit 0 fi npm install -g node-gyp@11.5.0 @@ -132,7 +132,7 @@ runs: NATIVE_RUNTIME: ${{ inputs.native-runtime }} run: | if [ "$RUNNER_OS" = Windows ] && [ "$NATIVE_RUNTIME" = node ]; then - node config/scripts/initialize-windows-native-toolchain.mjs + node config/scripts/native-build/windows/initialize-windows-native-toolchain.mjs else - node config/scripts/ensure-native-runtime.mjs --runtime="$NATIVE_RUNTIME" + node config/scripts/native-build/node-addons/ensure-native-runtime.mjs --runtime="$NATIVE_RUNTIME" fi diff --git a/.github/actions/prepare-orcad-prebuilds/action.yml b/.github/actions/prepare-orcad-prebuilds/action.yml index 126e2b60f40..1c888f93fe6 100644 --- a/.github/actions/prepare-orcad-prebuilds/action.yml +++ b/.github/actions/prepare-orcad-prebuilds/action.yml @@ -33,7 +33,7 @@ runs: (runner.arch == 'X64' || runner.arch == 'ARM64') continue-on-error: true shell: bash - run: node config/scripts/orcad-windows-prebuild-cache.mjs --fingerprint + run: node config/scripts/orcad-distribution/prebuilds/orcad-windows-prebuild-cache.mjs --fingerprint - name: Restore the exact Windows server prebuild id: orcad-prebuild-cache-restore @@ -55,7 +55,7 @@ runs: run: | if [ "$RUNNER_OS" = Windows ] && [ "$WINDOWS_PREBUILD_CACHE_HIT" = true ] && [ "$WINDOWS_PREBUILD_CACHE_RESTORE_OUTCOME" = success ] && - node config/scripts/orcad-windows-prebuild-cache.mjs --validate; then + node config/scripts/orcad-distribution/prebuilds/orcad-windows-prebuild-cache.mjs --validate; then echo 'Using the validated Windows server prebuild' else if [ "$RUNNER_OS" = Windows ]; then @@ -63,5 +63,5 @@ runs: fi pnpm build:orcad-prebuilds fi - node config/scripts/build-orcad-prebuilds.mjs --require-slots "$(node config/scripts/build-orcad-prebuilds.mjs --print-slot)" - node config/scripts/build-orcad-prebuilds.mjs --smoke + node config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs --require-slots "$(node config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs --print-slot)" + node config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs --smoke diff --git a/.github/actions/prepare-wayland-clipboard/action.yml b/.github/actions/prepare-wayland-clipboard/action.yml index c3538271420..343303e6dc7 100644 --- a/.github/actions/prepare-wayland-clipboard/action.yml +++ b/.github/actions/prepare-wayland-clipboard/action.yml @@ -23,7 +23,7 @@ runs: run: | node --input-type=module <<'NODE' import { appendFileSync } from 'node:fs' - import { waylandClipboardFingerprint } from './config/scripts/build-wayland-clipboard.mjs' + import { waylandClipboardFingerprint } from './config/scripts/native-build/linux/build-wayland-clipboard.mjs' const fingerprint = waylandClipboardFingerprint(process.cwd(), process.arch) // Immutable invalid hits need a version bump here before publishing their repair. appendFileSync(process.env.GITHUB_OUTPUT, `key=wayland-clipboard-v1-${process.arch}-${fingerprint}\n`) diff --git a/.github/actions/prepare-wayland-clipboard/build-or-validate.sh b/.github/actions/prepare-wayland-clipboard/build-or-validate.sh index d71b802edc1..69305d6f167 100755 --- a/.github/actions/prepare-wayland-clipboard/build-or-validate.sh +++ b/.github/actions/prepare-wayland-clipboard/build-or-validate.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # Validates a restored helper and rebuilds once from source when the restored copy is unusable. set -e -if node config/scripts/build-wayland-clipboard.mjs; then +if node config/scripts/native-build/linux/build-wayland-clipboard.mjs; then exit 0 fi if [ "${CACHE_HIT:-}" != true ]; then @@ -9,4 +9,4 @@ if [ "${CACHE_HIT:-}" != true ]; then fi echo 'Discarding an unusable Wayland clipboard cache and rebuilding from source.' rm -rf -- native/wayland-clipboard/.build -node config/scripts/build-wayland-clipboard.mjs +node config/scripts/native-build/linux/build-wayland-clipboard.mjs diff --git a/.github/actions/prepare-windows-agent-hook/action.yml b/.github/actions/prepare-windows-agent-hook/action.yml index d06251bfa1d..0fe6ba0fa72 100644 --- a/.github/actions/prepare-windows-agent-hook/action.yml +++ b/.github/actions/prepare-windows-agent-hook/action.yml @@ -8,7 +8,7 @@ runs: id: rust-scope if: runner.os == 'Windows' shell: bash - run: node config/scripts/windows-rust-build-scope.mjs >> "$GITHUB_OUTPUT" + run: node config/scripts/native-build/windows/windows-rust-build-scope.mjs >> "$GITHUB_OUTPUT" # Source globs, not crate/**: target/ and .build/ can already exist when this key is computed. # Real inputs only: older restores are safe because the build re-checks the exe's fingerprint. @@ -20,7 +20,7 @@ runs: native/windows-agent-hook/.build native/windows-agent-hook/target ~/.cargo/registry - key: windows-agent-hook-v2-${{ runner.os }}-${{ runner.arch }}-${{ steps.rust-scope.outputs.toolchain }}-${{ steps.rust-scope.outputs.app-version }}-${{ hashFiles('native/windows-agent-hook/src/**', 'native/windows-agent-hook/build.rs', 'native/windows-agent-hook/Cargo.toml', 'native/windows-agent-hook/Cargo.lock', 'native/windows-agent-hook/app.manifest', 'native/windows-agent-hook/.cargo/**', 'config/scripts/build-windows-agent-hook.mjs', 'config/scripts/windows-rust-executable-build.mjs', 'config/scripts/windows-pe-imports.mjs', 'resources/build/icon.ico') }} + key: windows-agent-hook-v2-${{ runner.os }}-${{ runner.arch }}-${{ steps.rust-scope.outputs.toolchain }}-${{ steps.rust-scope.outputs.app-version }}-${{ hashFiles('native/windows-agent-hook/src/**', 'native/windows-agent-hook/build.rs', 'native/windows-agent-hook/Cargo.toml', 'native/windows-agent-hook/Cargo.lock', 'native/windows-agent-hook/app.manifest', 'native/windows-agent-hook/.cargo/**', 'config/scripts/native-build/windows/build-windows-agent-hook.mjs', 'config/scripts/native-build/windows/windows-rust-executable-build.mjs', 'config/scripts/native-build/windows/windows-pe-imports.mjs', 'resources/build/icon.ico') }} restore-keys: | windows-agent-hook-v2-${{ runner.os }}-${{ runner.arch }}-${{ steps.rust-scope.outputs.toolchain }}- @@ -28,5 +28,5 @@ runs: if: runner.os == 'Windows' shell: pwsh run: | - node config/scripts/build-windows-agent-hook.mjs + node config/scripts/native-build/windows/build-windows-agent-hook.mjs if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } diff --git a/.github/actions/prepare-windows-cli-launcher/action.yml b/.github/actions/prepare-windows-cli-launcher/action.yml index 5a18dc57a49..907fc02927a 100644 --- a/.github/actions/prepare-windows-cli-launcher/action.yml +++ b/.github/actions/prepare-windows-cli-launcher/action.yml @@ -13,7 +13,7 @@ runs: id: rust-scope if: runner.os == 'Windows' shell: bash - run: node config/scripts/windows-rust-build-scope.mjs >> "$GITHUB_OUTPUT" + run: node config/scripts/native-build/windows/windows-rust-build-scope.mjs >> "$GITHUB_OUTPUT" # Source globs, not crate/**: target/ and .build/ can already exist when this key is computed. # Real inputs only: older restores are safe because the build re-checks each exe's fingerprint. @@ -25,7 +25,7 @@ runs: .build/windows-cli-launcher native/windows-cli-launcher/target ~/.cargo/registry - key: orcad-windows-cli-launcher-v2-${{ runner.arch }}-${{ inputs.arches }}-${{ steps.rust-scope.outputs.toolchain }}-${{ steps.rust-scope.outputs.app-version }}-${{ hashFiles('native/windows-cli-launcher/src/**', 'native/windows-cli-launcher/build.rs', 'native/windows-cli-launcher/Cargo.toml', 'native/windows-cli-launcher/Cargo.lock', 'native/windows-cli-launcher/app.manifest', 'native/windows-cli-launcher/.cargo/**', 'config/scripts/build-windows-cli-launcher.mjs', 'config/scripts/windows-rust-executable-build.mjs', 'config/scripts/windows-pe-imports.mjs', 'resources/build/icon.ico') }} + key: orcad-windows-cli-launcher-v2-${{ runner.arch }}-${{ inputs.arches }}-${{ steps.rust-scope.outputs.toolchain }}-${{ steps.rust-scope.outputs.app-version }}-${{ hashFiles('native/windows-cli-launcher/src/**', 'native/windows-cli-launcher/build.rs', 'native/windows-cli-launcher/Cargo.toml', 'native/windows-cli-launcher/Cargo.lock', 'native/windows-cli-launcher/app.manifest', 'native/windows-cli-launcher/.cargo/**', 'config/scripts/native-build/windows/build-windows-cli-launcher.mjs', 'config/scripts/native-build/windows/windows-rust-executable-build.mjs', 'config/scripts/native-build/windows/windows-pe-imports.mjs', 'resources/build/icon.ico') }} restore-keys: | orcad-windows-cli-launcher-v2-${{ runner.arch }}-${{ inputs.arches }}-${{ steps.rust-scope.outputs.toolchain }}- @@ -39,6 +39,6 @@ runs: foreach ($arch in ($env:ARCHES -split ' ' | Where-Object { $_ })) { rustup target add $triples[$arch] if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } - node config/scripts/build-windows-cli-launcher.mjs --arch $arch --output ".build/windows-cli-launcher/$arch/orca.exe" + node config/scripts/native-build/windows/build-windows-cli-launcher.mjs --arch $arch --output ".build/windows-cli-launcher/$arch/orca.exe" if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } } diff --git a/.github/actions/prepare-xterm-dependencies/action.yml b/.github/actions/prepare-xterm-dependencies/action.yml index 8fa54bd85ae..7e3739f0e8f 100644 --- a/.github/actions/prepare-xterm-dependencies/action.yml +++ b/.github/actions/prepare-xterm-dependencies/action.yml @@ -22,7 +22,7 @@ runs: path: | ${{ runner.temp }}/xterm-patch-build/upstream/.git ${{ runner.temp }}/xterm-patch-build/upstream/node_modules - key: xterm-dependencies-v1-${{ runner.os }}-${{ steps.runtime.outputs.image }}-${{ runner.arch }}-${{ steps.runtime.outputs.node }}-${{ hashFiles('config/patches/xterm-upstream.json', 'config/scripts/regenerate-xterm-patches.mjs', 'config/scripts/xterm-patch-text.mjs', '.github/actions/prepare-xterm-dependencies/action.yml') }} + key: xterm-dependencies-v1-${{ runner.os }}-${{ steps.runtime.outputs.image }}-${{ runner.arch }}-${{ steps.runtime.outputs.node }}-${{ hashFiles('config/patches/xterm-upstream.json', 'config/scripts/terminal-dependencies/xterm-patches/regenerate-xterm-patches.mjs', 'config/scripts/terminal-dependencies/xterm-patches/xterm-patch-text.mjs', '.github/actions/prepare-xterm-dependencies/action.yml') }} - name: Restore download cache on an installed-dependency miss if: steps.restore.outputs.cache-hit != 'true' uses: actions/cache/restore@v5 diff --git a/.github/scripts/render-readme-downloads-badge.mjs b/.github/scripts/render-readme-downloads-badge.mjs index 9c98bf9229e..d66b69a095b 100644 --- a/.github/scripts/render-readme-downloads-badge.mjs +++ b/.github/scripts/render-readme-downloads-badge.mjs @@ -1,7 +1,7 @@ import { mkdir, writeFile } from 'node:fs/promises' import { dirname } from 'node:path' import { pathToFileURL } from 'node:url' -import { isAgentStateRulesTag } from '../../config/scripts/release-tag-patterns.mjs' +import { isAgentStateRulesTag } from '../../config/scripts/release/versioning/release-tag-patterns.mjs' const repository = process.env.GITHUB_REPOSITORY ?? 'stablyai/orca' const token = process.env.GITHUB_TOKEN diff --git a/.github/workflows/adhoc-mac-build.yml b/.github/workflows/adhoc-mac-build.yml index fb9cbaff03f..4babea3e568 100644 --- a/.github/workflows/adhoc-mac-build.yml +++ b/.github/workflows/adhoc-mac-build.yml @@ -126,7 +126,7 @@ jobs: id: detect shell: bash run: | - if [[ -f config/scripts/packaged-orcad-template.cjs ]]; then + if [[ -f config/scripts/orcad-distribution/template/packaged-orcad-template.cjs || -f config/scripts/packaged-orcad-template.cjs ]]; then echo "ships=true" >>"$GITHUB_OUTPUT" else echo "ships=false" >>"$GITHUB_OUTPUT" @@ -151,7 +151,7 @@ jobs: set -euo pipefail # Old branch refs may predate adhoc version scripts; report that explicitly. for script in adhoc-build-version dev-channel-base-version; do - if [[ ! -f "config/scripts/$script.mjs" ]]; then + if [[ ! -f "config/scripts/release/versioning/$script.mjs" && ! -f "config/scripts/$script.mjs" ]]; then echo "::error::$REF has no config/scripts/$script.mjs; rebase it onto a main that has the adhoc channel." exit 1 fi @@ -162,7 +162,7 @@ jobs: "repos/$GITHUB_REPOSITORY/git/matching-refs/tags/v" \ --jq '.[].ref | sub("^refs/tags/"; "")' || true)" ORCA_PUBLISHED_VERSIONS="$published" ORCA_ADHOC_LABEL="${LABEL:-$REF}" \ - node config/scripts/adhoc-build-version.mjs \ + node "$(if [ -f config/scripts/release/versioning/adhoc-build-version.mjs ]; then printf %s config/scripts/release/versioning/adhoc-build-version.mjs; else printf %s config/scripts/adhoc-build-version.mjs; fi)" \ >"$RUNNER_TEMP/adhoc-identity.txt" if ! grep -q '^name=' "$RUNNER_TEMP/adhoc-identity.txt"; then echo "::error::adhoc-build-version.mjs emitted no release name; $REF's copy of the script is out of sync with this workflow." @@ -371,7 +371,11 @@ jobs: - name: Build app run: | if [[ "$ORCA_RELEASE_JAVASCRIPT_SOURCE_SHA" != '' ]]; then - node config/scripts/release-javascript-artifact.mjs restore + RELEASE_JAVASCRIPT_ARTIFACT='config/scripts/release/javascript-artifacts/release-javascript-artifact.mjs' + if [ ! -f "$RELEASE_JAVASCRIPT_ARTIFACT" ]; then + RELEASE_JAVASCRIPT_ARTIFACT='config/scripts/release-javascript-artifact.mjs' + fi + node "$RELEASE_JAVASCRIPT_ARTIFACT" restore pnpm run build:release:host else pnpm build:release @@ -397,7 +401,7 @@ jobs: with: ref: ${{ github.workflow_sha }} path: .workflow-tools - sparse-checkout: config/scripts/adhoc-mac-manifests.mjs + sparse-checkout: config/scripts/desktop-distribution/macos/adhoc-mac-manifests.mjs sparse-checkout-cone-mode: false persist-credentials: false @@ -408,7 +412,7 @@ jobs: timeout_minutes: 45 max_attempts: 2 retry_wait_seconds: 30 - command: node --disable-warning=MODULE_TYPELESS_PACKAGE_JSON config/scripts/pinned-node-downloads.mjs darwin-arm64 darwin-x64 && node config/scripts/ensure-native-runtime.mjs --runtime=electron && ORCA_MAC_ADHOC=1 pnpm exec electron-builder --config config/electron-builder.config.cjs --mac dmg zip --${{ matrix.arch }} --publish never + command: node --disable-warning=MODULE_TYPELESS_PACKAGE_JSON "$(if [ -f config/scripts/orcad-distribution/prebuilds/pinned-node-downloads.mjs ]; then printf %s config/scripts/orcad-distribution/prebuilds/pinned-node-downloads.mjs; else printf %s config/scripts/pinned-node-downloads.mjs; fi)" darwin-arm64 darwin-x64 && node "$(if [ -f config/scripts/native-build/node-addons/ensure-native-runtime.mjs ]; then printf %s config/scripts/native-build/node-addons/ensure-native-runtime.mjs; else printf %s config/scripts/ensure-native-runtime.mjs; fi)" --runtime=electron && ORCA_MAC_ADHOC=1 pnpm exec electron-builder --config config/electron-builder.config.cjs --mac dmg zip --${{ matrix.arch }} --publish never env: ORCA_ADHOC_BUILD_VERSION: ${{ needs.orcad-template-support.outputs.version }} ORCA_BUILD_COMMIT: ${{ needs.orcad-template-support.outputs.commit }} @@ -436,7 +440,7 @@ jobs: env: MAC_ARCH: ${{ matrix.arch }} MAC_VERSION: ${{ needs.orcad-template-support.outputs.version }} - run: node .workflow-tools/config/scripts/adhoc-mac-manifests.mjs stage "$MAC_ARCH" "$MAC_VERSION" dist .build/mac-manifests + run: node .workflow-tools/config/scripts/desktop-distribution/macos/adhoc-mac-manifests.mjs stage "$MAC_ARCH" "$MAC_VERSION" dist .build/mac-manifests - name: Mint adhoc repo token id: app_token @@ -501,7 +505,7 @@ jobs: uses: actions/checkout@v6 with: ref: ${{ github.workflow_sha }} - sparse-checkout: config/scripts/adhoc-mac-manifests.mjs + sparse-checkout: config/scripts/desktop-distribution/macos/adhoc-mac-manifests.mjs sparse-checkout-cone-mode: false persist-credentials: false @@ -520,7 +524,7 @@ jobs: run: | set -euo pipefail gh release view "$TAG" --repo "$ADHOC_REPO" --json assets > .build/mac-manifests/assets.json - node config/scripts/adhoc-mac-manifests.mjs merge "$MAC_VERSION" .build/mac-manifests + node "$(if [ -f config/scripts/desktop-distribution/macos/adhoc-mac-manifests.mjs ]; then printf %s config/scripts/desktop-distribution/macos/adhoc-mac-manifests.mjs; else printf %s config/scripts/adhoc-mac-manifests.mjs; fi)" merge "$MAC_VERSION" .build/mac-manifests gh release upload "$TAG" .build/mac-manifests/latest-mac.yml --repo "$ADHOC_REPO" --clobber - name: Confirm final template qualification before publication diff --git a/.github/workflows/ci-cache-warmup-platform-jobs.yml b/.github/workflows/ci-cache-warmup-platform-jobs.yml index 91fa1eac53b..c8aa345bb88 100644 --- a/.github/workflows/ci-cache-warmup-platform-jobs.yml +++ b/.github/workflows/ci-cache-warmup-platform-jobs.yml @@ -41,9 +41,9 @@ jobs: cache-pnpm-store-lookup-only: 'true' - name: Populate shared Electron archive if: startsWith(matrix.runner, 'blacksmith-') - run: node config/scripts/install-electron-package-binary.mjs + run: node config/scripts/electron-installation/platform-layout/install-electron-package-binary.mjs - name: Verify native cache is usable - run: node config/scripts/ensure-native-runtime.mjs --check-only + run: node config/scripts/native-build/node-addons/ensure-native-runtime.mjs --check-only # node-server's hosted macOS lane needs nothing; this serves hosted macOS PR contracts and updater tests. warm-macos-runtime: @@ -67,9 +67,9 @@ jobs: cache-electron-package: 'true' cache-pnpm-store: 'false' - name: Populate shared Electron archive - run: node config/scripts/install-electron-package-binary.mjs + run: node config/scripts/electron-installation/platform-layout/install-electron-package-binary.mjs - name: Verify native cache is usable - run: node config/scripts/ensure-native-runtime.mjs --check-only + run: node config/scripts/native-build/node-addons/ensure-native-runtime.mjs --check-only warm-windows: concurrency: @@ -93,13 +93,13 @@ jobs: # Windows PR consumers download packages directly; retain only the build caches. cache-pnpm-store: 'false' - name: Verify native cache is usable - run: node config/scripts/ensure-native-runtime.mjs --check-only + run: node config/scripts/native-build/node-addons/ensure-native-runtime.mjs --check-only - name: Resolve the Windows Rust build scope id: rust-scope if: runner.arch == 'X64' && matrix.os != 'windows-2025' shell: bash - run: node config/scripts/windows-rust-build-scope.mjs >> "$GITHUB_OUTPUT" + run: node config/scripts/native-build/windows/windows-rust-build-scope.mjs >> "$GITHUB_OUTPUT" - name: Cache Windows CLI launcher if: runner.arch == 'X64' && matrix.os != 'windows-2025' @@ -111,7 +111,7 @@ jobs: native/windows-agent-hook/.build native/windows-agent-hook/target ~/.cargo/registry - key: windows-cli-launcher-v2-${{ runner.os }}-${{ runner.arch }}-${{ steps.rust-scope.outputs.toolchain }}-${{ steps.rust-scope.outputs.app-version }}-${{ hashFiles('native/windows-cli-launcher/src/**', 'native/windows-cli-launcher/build.rs', 'native/windows-cli-launcher/Cargo.toml', 'native/windows-cli-launcher/Cargo.lock', 'native/windows-cli-launcher/app.manifest', 'native/windows-cli-launcher/.cargo/**', 'native/windows-agent-hook/src/**', 'native/windows-agent-hook/build.rs', 'native/windows-agent-hook/Cargo.toml', 'native/windows-agent-hook/Cargo.lock', 'native/windows-agent-hook/app.manifest', 'native/windows-agent-hook/.cargo/**', 'config/scripts/build-windows-cli-launcher.mjs', 'config/scripts/build-windows-agent-hook.mjs', 'config/scripts/windows-rust-executable-build.mjs', 'config/scripts/windows-pe-imports.mjs', 'resources/build/icon.ico') }} + key: windows-cli-launcher-v2-${{ runner.os }}-${{ runner.arch }}-${{ steps.rust-scope.outputs.toolchain }}-${{ steps.rust-scope.outputs.app-version }}-${{ hashFiles('native/windows-cli-launcher/src/**', 'native/windows-cli-launcher/build.rs', 'native/windows-cli-launcher/Cargo.toml', 'native/windows-cli-launcher/Cargo.lock', 'native/windows-cli-launcher/app.manifest', 'native/windows-cli-launcher/.cargo/**', 'native/windows-agent-hook/src/**', 'native/windows-agent-hook/build.rs', 'native/windows-agent-hook/Cargo.toml', 'native/windows-agent-hook/Cargo.lock', 'native/windows-agent-hook/app.manifest', 'native/windows-agent-hook/.cargo/**', 'config/scripts/native-build/windows/build-windows-cli-launcher.mjs', 'config/scripts/native-build/windows/build-windows-agent-hook.mjs', 'config/scripts/native-build/windows/windows-rust-executable-build.mjs', 'config/scripts/native-build/windows/windows-pe-imports.mjs', 'resources/build/icon.ico') }} restore-keys: | windows-cli-launcher-v2-${{ runner.os }}-${{ runner.arch }}-${{ steps.rust-scope.outputs.toolchain }}- @@ -119,9 +119,9 @@ jobs: if: runner.arch == 'X64' && matrix.os != 'windows-2025' shell: pwsh run: | - node config/scripts/build-windows-agent-hook.mjs + node config/scripts/native-build/windows/build-windows-agent-hook.mjs if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } - node config/scripts/build-windows-cli-launcher.mjs + node config/scripts/native-build/windows/build-windows-cli-launcher.mjs if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } - name: Warm the Windows ARM server launcher @@ -153,7 +153,7 @@ jobs: if: >- github.event_name != 'pull_request' && matrix.os != 'windows-2025' && steps.orcad-prebuild.outputs.cache-hit != 'true' && steps.orcad-prebuild.outputs.cache-key != '' - run: node config/scripts/orcad-windows-prebuild-cache.mjs --validate + run: node config/scripts/orcad-distribution/prebuilds/orcad-windows-prebuild-cache.mjs --validate - name: Save the Windows server prebuild if: steps.orcad-prebuild-validate.outcome == 'success' continue-on-error: true diff --git a/.github/workflows/ci-cache-warmup-platforms.yml b/.github/workflows/ci-cache-warmup-platforms.yml index b1d6a7c726b..abb7fff7024 100644 --- a/.github/workflows/ci-cache-warmup-platforms.yml +++ b/.github/workflows/ci-cache-warmup-platforms.yml @@ -12,21 +12,22 @@ on: - '.github/actions/prepare-native-runtime/**' - '.github/actions/prepare-windows-cli-launcher/**' - '.github/actions/prepare-windows-agent-hook/**' - - 'config/scripts/windows-rust-build-scope.mjs' + - 'config/scripts/native-build/windows/windows-rust-build-scope.mjs' - '.github/actions/prepare-orcad-prebuilds/**' - - 'config/scripts/native-dependency-lock-digest.mjs' - - 'config/scripts/orcad-windows-prebuild-cache.mjs' - - 'config/scripts/shared-native-build.mjs' - - 'config/scripts/shared-tree-publish.mjs' + - 'config/scripts/native-build/node-addons/native-dependency-lock-digest.mjs' + - 'config/scripts/orcad-distribution/prebuilds/orcad-windows-prebuild-cache.mjs' + - 'config/scripts/native-build/node-addons/shared-native-build.mjs' + - 'config/scripts/artifact-storage/atomic-publication/shared-tree-publish.mjs' - 'config/scripts/native-build-entry*.cjs' - - 'config/scripts/orcad-prebuild-node-gyp.mjs' - - 'config/scripts/msbuild-file-tracking.mjs' - - 'config/scripts/windows-pe-imports.mjs' - - 'config/scripts/build-orcad-prebuilds.mjs' - - 'config/scripts/orcad-prebuild-slot-contents.mjs' - - 'config/scripts/pinned-node-downloads.mjs' - - 'config/scripts/update-node-runtime-pin.mjs' - - 'config/scripts/build-workspace-packages.mjs' + - 'config/scripts/native-build/node-addons/native-build-entry*.cjs' + - 'config/scripts/orcad-distribution/prebuilds/orcad-prebuild-node-gyp.mjs' + - 'config/scripts/native-build/windows/msbuild-file-tracking.mjs' + - 'config/scripts/native-build/windows/windows-pe-imports.mjs' + - 'config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs' + - 'config/scripts/orcad-distribution/prebuilds/orcad-prebuild-slot-contents.mjs' + - 'config/scripts/orcad-distribution/prebuilds/pinned-node-downloads.mjs' + - 'config/scripts/node-runtime/archive-identity/update-node-runtime-pin.mjs' + - 'config/scripts/workspace-package-build/build-workspace-packages.mjs' - 'src/shared/node-runtime-pin.ts' - 'src/packages/process-host/**' - '.github/actions/prepare-git-compatibility/**' @@ -39,28 +40,28 @@ on: - 'pnpm-workspace.yaml' - '.npmrc' - 'config/pnpmfile.cjs' - - 'config/scripts/ensure-native-runtime.mjs' - - 'config/scripts/initialize-windows-native-toolchain.mjs' - - 'config/scripts/capture-windows-native-environment.cmd' - - 'config/scripts/rebuild-native-deps.mjs' - - 'config/scripts/node-pty-job-ownership.cjs' - - 'config/scripts/windows-pe-machine.cjs' - - 'config/scripts/windows-process-tree-gyp-rebuild.mjs' - - 'config/scripts/windows-process-tree-creation-time.cjs' - - 'config/scripts/install-electron-package-binary.mjs' - - 'config/scripts/electron-platform-path.mjs' + - 'config/scripts/native-build/node-addons/ensure-native-runtime.mjs' + - 'config/scripts/native-build/windows/initialize-windows-native-toolchain.mjs' + - 'config/scripts/native-build/windows/capture-windows-native-environment.cmd' + - 'config/scripts/native-build/node-addons/rebuild-native-deps.mjs' + - 'config/scripts/native-build/node-addons/node-pty-job-ownership.cjs' + - 'config/scripts/native-build/windows/windows-pe-machine.cjs' + - 'config/scripts/native-build/windows/windows-process-tree-gyp-rebuild.mjs' + - 'config/scripts/native-build/windows/windows-process-tree-creation-time.cjs' + - 'config/scripts/electron-installation/platform-layout/install-electron-package-binary.mjs' + - 'config/scripts/electron-installation/platform-layout/electron-platform-path.mjs' - 'config/scripts/zip-extractor-command.mjs' - 'src/shared/zip-extractor-command.ts' - - 'config/scripts/shared-electron-dist-cache.mjs' - - 'config/scripts/space-sharing-copy.mjs' + - 'config/scripts/electron-installation/shared-dist-cache/shared-electron-dist-cache.mjs' + - 'config/scripts/artifact-storage/reflink-copy/space-sharing-copy.mjs' - 'config/patches/**' - 'native/windows-registry/**' - 'native/windows-security/**' - 'native/windows-cli-launcher/**' - 'native/windows-agent-hook/**' - - 'config/scripts/build-windows-cli-launcher.mjs' - - 'config/scripts/build-windows-agent-hook.mjs' - - 'config/scripts/windows-rust-executable-build.mjs' + - 'config/scripts/native-build/windows/build-windows-cli-launcher.mjs' + - 'config/scripts/native-build/windows/build-windows-agent-hook.mjs' + - 'config/scripts/native-build/windows/windows-rust-executable-build.mjs' - 'resources/build/icon.ico' - 'mobile/Gemfile' - 'mobile/Gemfile.lock' diff --git a/.github/workflows/ci-cache-warmup.yml b/.github/workflows/ci-cache-warmup.yml index bebeccef358..89ae707f579 100644 --- a/.github/workflows/ci-cache-warmup.yml +++ b/.github/workflows/ci-cache-warmup.yml @@ -21,7 +21,7 @@ on: - '.github/actions/prepare-linux-package-fixture/**' - '.github/actions/prepare-wayland-clipboard/**' - 'native/wayland-clipboard/**' - - 'config/scripts/build-wayland-clipboard.mjs' + - 'config/scripts/native-build/linux/build-wayland-clipboard.mjs' - 'config/docker/headless-serve-shutdown/**' - 'config/docker/cli-launch-contract/**' - 'config/docker/daemon-shutdown-descendants/**' @@ -30,20 +30,20 @@ on: - 'pnpm-workspace.yaml' - '.npmrc' - 'config/pnpmfile.cjs' - - 'config/scripts/ensure-native-runtime.mjs' - - 'config/scripts/initialize-windows-native-toolchain.mjs' - - 'config/scripts/capture-windows-native-environment.cmd' - - 'config/scripts/rebuild-native-deps.mjs' - - 'config/scripts/node-pty-job-ownership.cjs' - - 'config/scripts/windows-pe-machine.cjs' - - 'config/scripts/windows-process-tree-gyp-rebuild.mjs' - - 'config/scripts/windows-process-tree-creation-time.cjs' - - 'config/scripts/install-electron-package-binary.mjs' - - 'config/scripts/electron-platform-path.mjs' + - 'config/scripts/native-build/node-addons/ensure-native-runtime.mjs' + - 'config/scripts/native-build/windows/initialize-windows-native-toolchain.mjs' + - 'config/scripts/native-build/windows/capture-windows-native-environment.cmd' + - 'config/scripts/native-build/node-addons/rebuild-native-deps.mjs' + - 'config/scripts/native-build/node-addons/node-pty-job-ownership.cjs' + - 'config/scripts/native-build/windows/windows-pe-machine.cjs' + - 'config/scripts/native-build/windows/windows-process-tree-gyp-rebuild.mjs' + - 'config/scripts/native-build/windows/windows-process-tree-creation-time.cjs' + - 'config/scripts/electron-installation/platform-layout/install-electron-package-binary.mjs' + - 'config/scripts/electron-installation/platform-layout/electron-platform-path.mjs' - 'config/scripts/zip-extractor-command.mjs' - 'src/shared/zip-extractor-command.ts' - - 'config/scripts/shared-electron-dist-cache.mjs' - - 'config/scripts/space-sharing-copy.mjs' + - 'config/scripts/electron-installation/shared-dist-cache/shared-electron-dist-cache.mjs' + - 'config/scripts/artifact-storage/reflink-copy/space-sharing-copy.mjs' - 'config/patches/**' - 'native/windows-registry/**' - 'native/windows-security/**' @@ -97,7 +97,7 @@ jobs: seed: 'true' - name: Populate shared Electron archive - run: node config/scripts/install-electron-package-binary.mjs + run: node config/scripts/electron-installation/platform-layout/install-electron-package-binary.mjs - uses: ./.github/actions/prepare-git-compatibility diff --git a/.github/workflows/ci-runner-demand.yml b/.github/workflows/ci-runner-demand.yml index f9f063ff37d..9a9065cf1d7 100644 --- a/.github/workflows/ci-runner-demand.yml +++ b/.github/workflows/ci-runner-demand.yml @@ -25,7 +25,7 @@ jobs: - name: Measure the previous complete 24 hours env: GH_TOKEN: ${{ github.token }} - run: node config/scripts/ci-runner-demand.mjs + run: node config/scripts/ci/runner-capacity/ci-runner-demand.mjs - uses: actions/upload-artifact@v7 with: name: ci-runner-demand-${{ github.run_id }} diff --git a/.github/workflows/ci-xterm-cache.yml b/.github/workflows/ci-xterm-cache.yml index dc0b17bcbcd..8d02e7a5381 100644 --- a/.github/workflows/ci-xterm-cache.yml +++ b/.github/workflows/ci-xterm-cache.yml @@ -6,8 +6,8 @@ on: - '.github/workflows/ci-xterm-cache.yml' - '.github/actions/prepare-xterm-dependencies/**' - 'config/patches/xterm-upstream.json' - - 'config/scripts/regenerate-xterm-patches.mjs' - - 'config/scripts/xterm-patch-text.mjs' + - 'config/scripts/terminal-dependencies/xterm-patches/regenerate-xterm-patches.mjs' + - 'config/scripts/terminal-dependencies/xterm-patches/xterm-patch-text.mjs' - 'package.json' # Refresh after Node patch releases or cache eviction without rebuilding on hits. schedule: @@ -46,7 +46,7 @@ jobs: id: cache - name: Verify and populate dependencies if: steps.cache.outputs.cache-hit != 'true' - run: node config/scripts/regenerate-xterm-patches.mjs --check --work-dir="$RUNNER_TEMP/xterm-patch-build" + run: node config/scripts/terminal-dependencies/xterm-patches/regenerate-xterm-patches.mjs --check --work-dir="$RUNNER_TEMP/xterm-patch-build" - uses: actions/cache/save@v5 if: steps.cache.outputs.cache-hit != 'true' with: diff --git a/.github/workflows/computer-e2e.yml b/.github/workflows/computer-e2e.yml index 15041012d2a..fa2f0b3b7e0 100644 --- a/.github/workflows/computer-e2e.yml +++ b/.github/workflows/computer-e2e.yml @@ -6,13 +6,13 @@ on: paths: - '.github/workflows/computer-e2e.yml' - 'config/electron-builder.config.cjs' - - 'config/scripts/build-computer-macos.mjs' - - 'config/scripts/build-native-for-platform.mjs' - - 'config/scripts/build-native-for-platform.test.mjs' - - 'config/scripts/pnpm-cli-invocation.mjs' - - 'config/scripts/build-windows-cli-launcher.mjs' - - 'config/scripts/windows-rust-executable-build.mjs' - - 'config/scripts/build-windows-cli-launcher.test.mjs' + - 'config/scripts/native-build/macos/build-computer-macos.mjs' + - 'config/scripts/native-build/composition/build-native-for-platform.mjs' + - 'config/scripts/native-build/composition/build-native-for-platform.test.mjs' + - 'config/scripts/tool-invocation/pnpm-cli-invocation.mjs' + - 'config/scripts/native-build/windows/build-windows-cli-launcher.mjs' + - 'config/scripts/native-build/windows/windows-rust-executable-build.mjs' + - 'config/scripts/native-build/windows/build-windows-cli-launcher.test.mjs' - 'config/scripts/macos-computer-helper-owner-loss-benchmark.mjs' - 'config/scripts/macos-computer-helper-owner-loss-group-recovery.test.mjs' - 'config/scripts/macos-computer-helper-owner-loss-metrics.mjs' diff --git a/.github/workflows/computer-macos-native.yml b/.github/workflows/computer-macos-native.yml index 4a49c77c9d7..a18fdb23b8a 100644 --- a/.github/workflows/computer-macos-native.yml +++ b/.github/workflows/computer-macos-native.yml @@ -9,10 +9,10 @@ on: - '.github/workflows/computer-macos-native.yml' - 'electron.vite.config.ts' - 'config/build-plugins/**' - - 'config/scripts/build-computer-macos.mjs' - - 'config/scripts/build-native-for-platform.mjs' - - 'config/scripts/build-native-for-platform.test.mjs' - - 'config/scripts/pnpm-cli-invocation.mjs' + - 'config/scripts/native-build/macos/build-computer-macos.mjs' + - 'config/scripts/native-build/composition/build-native-for-platform.mjs' + - 'config/scripts/native-build/composition/build-native-for-platform.test.mjs' + - 'config/scripts/tool-invocation/pnpm-cli-invocation.mjs' - 'config/scripts/macos-computer-helper-owner-loss-*' - 'config/scripts/verify-computer-native.mjs' - 'native/computer-use-macos/**' @@ -57,7 +57,7 @@ jobs: - name: Parallel native build launcher cancellation run: >- pnpm vitest run --config config/vitest.config.ts - config/scripts/build-native-for-platform.test.mjs + config/scripts/native-build/composition/build-native-for-platform.test.mjs - name: Authenticated helper owner-loss smoke run: pnpm bench:macos-computer-helper-owner-loss --expect reaped --trials 1 - name: Swift tests and signed universal helper verification diff --git a/.github/workflows/daily-mac-build.yml b/.github/workflows/daily-mac-build.yml index 6707a9a7777..b10859e58f4 100644 --- a/.github/workflows/daily-mac-build.yml +++ b/.github/workflows/daily-mac-build.yml @@ -219,7 +219,7 @@ jobs: published="$main_tags"$'\n'"$channel_tags" echo "Published version sources: $(grep -c . <<<"$main_tags" || true) main tags, $(grep -c . <<<"$channel_tags" || true) channel tags" ORCA_PUBLISHED_VERSIONS="$published" ORCA_DAILY_RELEASE_NAMES="$names" \ - node config/scripts/daily-build-version.mjs \ + node "$(if [ -f config/scripts/release/versioning/daily-build-version.mjs ]; then printf %s config/scripts/release/versioning/daily-build-version.mjs; else printf %s config/scripts/daily-build-version.mjs; fi)" \ >"$RUNNER_TEMP/daily-identity.txt" grep -E '^(version|build_number)=' "$RUNNER_TEMP/daily-identity.txt" # Dispatch YAML can be newer than the pinned source’s version script; reject missing output before publishing an untitled release. @@ -304,7 +304,7 @@ jobs: timeout_minutes: 45 max_attempts: 2 retry_wait_seconds: 30 - command: node --disable-warning=MODULE_TYPELESS_PACKAGE_JSON config/scripts/pinned-node-downloads.mjs darwin-arm64 darwin-x64 && node config/scripts/ensure-native-runtime.mjs --runtime=electron && if [ -f config/scripts/build-mac-notarization-overlap.mjs ]; then ORCA_MAC_DAILY=1 node config/scripts/build-mac-notarization-overlap.mjs --publish always; else ORCA_MAC_DAILY=1 pnpm exec electron-builder --config config/electron-builder.config.cjs --mac --publish always; fi + command: node --disable-warning=MODULE_TYPELESS_PACKAGE_JSON "$(if [ -f config/scripts/orcad-distribution/prebuilds/pinned-node-downloads.mjs ]; then printf %s config/scripts/orcad-distribution/prebuilds/pinned-node-downloads.mjs; else printf %s config/scripts/pinned-node-downloads.mjs; fi)" darwin-arm64 darwin-x64 && node "$(if [ -f config/scripts/native-build/node-addons/ensure-native-runtime.mjs ]; then printf %s config/scripts/native-build/node-addons/ensure-native-runtime.mjs; else printf %s config/scripts/ensure-native-runtime.mjs; fi)" --runtime=electron && if { [ -f config/scripts/desktop-distribution/macos/build-mac-notarization-overlap.mjs ] || [ -f config/scripts/build-mac-notarization-overlap.mjs ]; }; then ORCA_MAC_DAILY=1 node "$(if [ -f config/scripts/desktop-distribution/macos/build-mac-notarization-overlap.mjs ]; then printf %s config/scripts/desktop-distribution/macos/build-mac-notarization-overlap.mjs; else printf %s config/scripts/build-mac-notarization-overlap.mjs; fi)" --publish always; else ORCA_MAC_DAILY=1 pnpm exec electron-builder --config config/electron-builder.config.cjs --mac --publish always; fi env: # Give the publisher App write access to its configured orca-daily target. GH_TOKEN: ${{ steps.app_token_publish.outputs.token }} diff --git a/.github/workflows/dependency-security.yml b/.github/workflows/dependency-security.yml index 1e1013b8f04..8db6248c50b 100644 --- a/.github/workflows/dependency-security.yml +++ b/.github/workflows/dependency-security.yml @@ -13,7 +13,7 @@ on: - 'config/dependency-security-exceptions.json' - 'config/cargo-deny.toml' - 'config/scripts/*dependency-security*' - - 'config/scripts/pnpm-cli-invocation.mjs' + - 'config/scripts/tool-invocation/pnpm-cli-invocation.mjs' - 'config/pnpmfile.cjs' - '**/patches/**' - '.github/workflows/dependency-security.yml' diff --git a/.github/workflows/dev-channel-win-build.yml b/.github/workflows/dev-channel-win-build.yml index a7ae8202980..fa141d08ca3 100644 --- a/.github/workflows/dev-channel-win-build.yml +++ b/.github/workflows/dev-channel-win-build.yml @@ -241,7 +241,11 @@ jobs: shell: bash run: | if [[ "$ORCA_RELEASE_JAVASCRIPT_SOURCE_SHA" != '' ]]; then - node config/scripts/release-javascript-artifact.mjs restore + RELEASE_JAVASCRIPT_ARTIFACT='config/scripts/release/javascript-artifacts/release-javascript-artifact.mjs' + if [ ! -f "$RELEASE_JAVASCRIPT_ARTIFACT" ]; then + RELEASE_JAVASCRIPT_ARTIFACT='config/scripts/release-javascript-artifact.mjs' + fi + node "$RELEASE_JAVASCRIPT_ARTIFACT" restore pnpm run build:release:host else pnpm build:release @@ -317,7 +321,7 @@ jobs: timeout_minutes: 30 max_attempts: 2 retry_wait_seconds: 30 - command: node config/scripts/ensure-native-runtime.mjs --runtime=electron; if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }; pnpm exec electron-builder --config config/electron-builder.config.cjs --win --publish always + command: node $(if (Test-Path config/scripts/native-build/node-addons/ensure-native-runtime.mjs) { "config/scripts/native-build/node-addons/ensure-native-runtime.mjs" } else { "config/scripts/ensure-native-runtime.mjs" }) --runtime=electron; if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }; pnpm exec electron-builder --config config/electron-builder.config.cjs --win --publish always env: GH_TOKEN: ${{ steps.app_token.outputs.token }} ORCA_BUILD_COMMIT: ${{ inputs.ref }} @@ -352,7 +356,7 @@ jobs: timeout_minutes: 30 max_attempts: 2 retry_wait_seconds: 30 - command: node config/scripts/ensure-native-runtime.mjs --runtime=electron; if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }; pnpm exec electron-builder --config config/electron-builder.config.cjs --win --publish never + command: node $(if (Test-Path config/scripts/native-build/node-addons/ensure-native-runtime.mjs) { "config/scripts/native-build/node-addons/ensure-native-runtime.mjs" } else { "config/scripts/ensure-native-runtime.mjs" }) --runtime=electron; if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }; pnpm exec electron-builder --config config/electron-builder.config.cjs --win --publish never env: ORCA_BUILD_COMMIT: ${{ inputs.ref }} ORCA_REQUIRE_ORCAD_TEMPLATE: ${{ inputs.orcad_template && '1' || '' }} diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index e263d7046a8..a9901c36161 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -105,7 +105,10 @@ jobs: fi node --input-type=module <<'NODE' import { appendFileSync, existsSync } from 'node:fs' - const modulePath = './config/scripts/ci-e2e-job-selection.mjs' + const canonicalModulePath = './config/scripts/ci/e2e-selection/ci-e2e-job-selection.mjs' + const modulePath = existsSync(canonicalModulePath) + ? canonicalModulePath + : './config/scripts/ci-e2e-job-selection.mjs' const selection = existsSync(modulePath) ? await import(modulePath) : {} const shards = selection.generalE2eShards?.(process.env.TEST_FILES_JSON) ?? ['1/1'] appendFileSync(process.env.GITHUB_OUTPUT, `shards=${JSON.stringify(shards)}\n`) @@ -298,12 +301,16 @@ jobs: ORCA_E2E_FORWARD_APP_LOGS: '1' ORCA_E2E_WEB_CLIENT: '1' run: | + E2E_SHARD_PLAN_SCRIPT=config/scripts/ci/e2e-selection/ci-e2e-shard-plan.mjs + if [ ! -f "$E2E_SHARD_PLAN_SCRIPT" ]; then + E2E_SHARD_PLAN_SCRIPT=config/scripts/ci-e2e-shard-plan.mjs + fi mkdir -p ci-shards pnpm exec playwright test --config tests/playwright.config.ts --project=electron-headless --list --reporter=json > ci-shards/discovery.json export ORCA_SHARD_SOURCE_SHA="$(git rev-parse HEAD)" - node config/scripts/ci-e2e-shard-plan.mjs ci-shards/discovery.json '${{ matrix.shard }}' ci-shards + node "$E2E_SHARD_PLAN_SCRIPT" ci-shards/discovery.json '${{ matrix.shard }}' ci-shards pnpm exec playwright test --config tests/playwright.config.ts --project=electron-headless --test-list=ci-shards/selected.txt --list --reporter=json > ci-shards/selected-discovery.json - node config/scripts/ci-e2e-shard-plan.mjs --verify ci-shards/assignment.json ci-shards/selected-discovery.json + node "$E2E_SHARD_PLAN_SCRIPT" --verify ci-shards/assignment.json ci-shards/selected-discovery.json - name: Run E2E tests (${{ matrix.shard_name }}) env: @@ -313,7 +320,12 @@ jobs: - name: Summarize E2E failures if: always() continue-on-error: true - run: node config/scripts/ci-e2e-failure-summary.mjs ci-shards/results.json + run: | + E2E_FAILURE_SUMMARY_SCRIPT=config/scripts/ci/e2e-failures/ci-e2e-failure-summary.mjs + if [ ! -f "$E2E_FAILURE_SUMMARY_SCRIPT" ]; then + E2E_FAILURE_SUMMARY_SCRIPT=config/scripts/ci-e2e-failure-summary.mjs + fi + node "$E2E_FAILURE_SUMMARY_SCRIPT" ci-shards/results.json - name: Upload E2E shard assignment if: always() @@ -380,8 +392,16 @@ jobs: SHARD: ${{ matrix.shard }} TEST_LEVEL_SHARDS: ${{ inputs.changed_e2e_test_shards != '' }} run: | - if [ -f config/scripts/ci-e2e-job-selection.mjs ]; then - printf '%s\n' "$TEST_FILES_JSON" | node config/scripts/ci-e2e-job-selection.mjs > "$RUNNER_TEMP/general-e2e-specs" + E2E_SELECTION_SCRIPT=config/scripts/ci/e2e-selection/ci-e2e-job-selection.mjs + if [ ! -f "$E2E_SELECTION_SCRIPT" ]; then + E2E_SELECTION_SCRIPT=config/scripts/ci-e2e-job-selection.mjs + fi + E2E_SHARD_PLAN_SCRIPT=config/scripts/ci/e2e-selection/ci-e2e-shard-plan.mjs + if [ ! -f "$E2E_SHARD_PLAN_SCRIPT" ]; then + E2E_SHARD_PLAN_SCRIPT=config/scripts/ci-e2e-shard-plan.mjs + fi + if [ -f "$E2E_SELECTION_SCRIPT" ]; then + printf '%s\n' "$TEST_FILES_JSON" | node "$E2E_SELECTION_SCRIPT" > "$RUNNER_TEMP/general-e2e-specs" else # Dispatching an older ref retains its existing dedicated-owner exclusions. jq -r '.[] | select( @@ -418,13 +438,13 @@ jobs: if [ "$TEST_LEVEL_SHARDS" = true ]; then mkdir -p ci-shards-changed pnpm exec playwright test "${TEST_FILES[@]}" --config tests/playwright.config.ts --project=electron-headless "${E2E_PROJECT_ARGS[@]}" --shard="$SHARD" --list --reporter=json > ci-shards-changed/selected-discovery.json - elif [ -f config/scripts/ci-e2e-shard-plan.mjs ]; then + elif [ -f "$E2E_SHARD_PLAN_SCRIPT" ]; then mkdir -p ci-shards-changed pnpm exec playwright test "${TEST_FILES[@]}" --config tests/playwright.config.ts --project=electron-headless "${E2E_PROJECT_ARGS[@]}" --list --reporter=json > ci-shards-changed/discovery.json export ORCA_SHARD_SOURCE_SHA="$(git rev-parse HEAD)" - node config/scripts/ci-e2e-shard-plan.mjs ci-shards-changed/discovery.json "$SHARD" ci-shards-changed + node "$E2E_SHARD_PLAN_SCRIPT" ci-shards-changed/discovery.json "$SHARD" ci-shards-changed pnpm exec playwright test "${TEST_FILES[@]}" --config tests/playwright.config.ts --project=electron-headless "${E2E_PROJECT_ARGS[@]}" --test-list=ci-shards-changed/selected.txt --list --reporter=json > ci-shards-changed/selected-discovery.json - node config/scripts/ci-e2e-shard-plan.mjs --verify ci-shards-changed/assignment.json ci-shards-changed/selected-discovery.json + node "$E2E_SHARD_PLAN_SCRIPT" --verify ci-shards-changed/assignment.json ci-shards-changed/selected-discovery.json E2E_SELECTION_ARGS=(--test-list=ci-shards-changed/selected.txt) fi xvfb-run --auto-servernum bash .github/scripts/e2e-with-window-manager.sh env "${E2E_ENV[@]}" \ @@ -450,7 +470,11 @@ jobs: for run in $(printf '%s\n' "${runs[@]%.jsonl}" | sed 's/-results\.json$//' | sort -u); do node config/scripts/layout-save-divergence-summary.mjs "$run.jsonl" "$run-summary.json" "$run-results.json" if [ -f "$run-results.json" ]; then - node config/scripts/ci-e2e-failure-summary.mjs "$run-results.json" + E2E_FAILURE_SUMMARY_SCRIPT=config/scripts/ci/e2e-failures/ci-e2e-failure-summary.mjs + if [ ! -f "$E2E_FAILURE_SUMMARY_SCRIPT" ]; then + E2E_FAILURE_SUMMARY_SCRIPT=config/scripts/ci-e2e-failure-summary.mjs + fi + node "$E2E_FAILURE_SUMMARY_SCRIPT" "$run-results.json" fi done @@ -524,19 +548,19 @@ jobs: env: LAYOUT_OWNER: ${{ inputs.layout_owner }} run: | - slot="$(node config/scripts/build-orcad-prebuilds.mjs --print-slot)" + slot="$(node "$(if [ -f config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs ]; then printf %s config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs; else printf %s config/scripts/build-orcad-prebuilds.mjs; fi)" --print-slot)" pnpm build:orcad-prebuilds pnpm build:orcad-prebuilds --require-slots "$slot" # The orcad host and its materialized template must use the Electron host’s layout owner. if [ -n "$LAYOUT_OWNER" ]; then export ORCA_LAYOUT_OWNER="$LAYOUT_OWNER" pnpm build:orcad - node config/scripts/build-orcad-template.mjs --targets "$slot" --dark-test-template + node "$(if [ -f config/scripts/orcad-distribution/template/build-orcad-template.mjs ]; then printf %s config/scripts/orcad-distribution/template/build-orcad-template.mjs; else printf %s config/scripts/build-orcad-template.mjs; fi)" --targets "$slot" --dark-test-template test -f out/orcad/ORCA_LAYOUT_OWNER_MAIN test -f out/orcad-template/ORCA_LAYOUT_OWNER_MAIN else pnpm build:orcad - node config/scripts/build-orcad-template.mjs --targets "$slot" + node "$(if [ -f config/scripts/orcad-distribution/template/build-orcad-template.mjs ]; then printf %s config/scripts/orcad-distribution/template/build-orcad-template.mjs; else printf %s config/scripts/build-orcad-template.mjs; fi)" --targets "$slot" fi - name: Switch serve hosts on one profile if: inputs.test_files == '' || contains(inputs.test_files, 'tests/e2e/orcad-serve-mode-switch.spec.ts') @@ -634,10 +658,10 @@ jobs: pnpm build:orcad-prebuilds pnpm build:orcad-prebuilds --require-slots linux-x64-glibc if [ -n "$LAYOUT_OWNER" ]; then - ORCA_LAYOUT_OWNER="$LAYOUT_OWNER" node config/scripts/build-orcad-template.mjs --targets linux-x64-glibc --dark-test-template + ORCA_LAYOUT_OWNER="$LAYOUT_OWNER" node "$(if [ -f config/scripts/orcad-distribution/template/build-orcad-template.mjs ]; then printf %s config/scripts/orcad-distribution/template/build-orcad-template.mjs; else printf %s config/scripts/build-orcad-template.mjs; fi)" --targets linux-x64-glibc --dark-test-template test -f out/orcad-template/ORCA_LAYOUT_OWNER_MAIN else - node config/scripts/build-orcad-template.mjs --targets linux-x64-glibc + node "$(if [ -f config/scripts/orcad-distribution/template/build-orcad-template.mjs ]; then printf %s config/scripts/orcad-distribution/template/build-orcad-template.mjs; else printf %s config/scripts/build-orcad-template.mjs; fi)" --targets linux-x64-glibc fi mv out/orcad-template "$RUNNER_TEMP/orcad-convert-template" # The Windows CLI matrix collects here too and skips: it needs a Windows host descriptor. @@ -654,7 +678,10 @@ jobs: run: | node --input-type=module <<'NODE' > "$RUNNER_TEMP/managed-ssh-specs" import { existsSync } from 'node:fs' - const modulePath = './config/scripts/ci-e2e-job-selection.mjs' + const canonicalModulePath = './config/scripts/ci/e2e-selection/ci-e2e-job-selection.mjs' + const modulePath = existsSync(canonicalModulePath) + ? canonicalModulePath + : './config/scripts/ci-e2e-job-selection.mjs' const selection = existsSync(modulePath) ? await import(modulePath) : {} // Older checkout refs retain their full-suite behavior. const specs = selection.selectManagedSshE2eSpecs @@ -732,8 +759,8 @@ jobs: pnpm exec electron-vite build --mode e2e pnpm run build:cli pnpm build:orcad - node config/scripts/build-windows-process-tree-addon.mjs --arch=x64 --reuse-prepared-runtime - node config/scripts/build-orcad-template.mjs --targets win32-x64 + node "$(if [ -f config/scripts/native-build/windows/build-windows-process-tree-addon.mjs ]; then printf %s config/scripts/native-build/windows/build-windows-process-tree-addon.mjs; else printf %s config/scripts/build-windows-process-tree-addon.mjs; fi)" --arch=x64 --reuse-prepared-runtime + node "$(if [ -f config/scripts/orcad-distribution/template/build-orcad-template.mjs ]; then printf %s config/scripts/orcad-distribution/template/build-orcad-template.mjs; else printf %s config/scripts/build-orcad-template.mjs; fi)" --targets win32-x64 # A profile-less Windows session has no roaming AppData; Electron 43 used to crash natively there. - name: Start serve with no AppData folder if: inputs.test_files == '' || contains(inputs.test_files, 'tests/e2e/windows-missing-appdata-startup.spec.ts') diff --git a/.github/workflows/hourly-mac-build.yml b/.github/workflows/hourly-mac-build.yml index a20d188d1eb..e74997afb9e 100644 --- a/.github/workflows/hourly-mac-build.yml +++ b/.github/workflows/hourly-mac-build.yml @@ -209,7 +209,7 @@ jobs: published="$main_tags"$'\n'"$channel_tags" echo "Published version sources: $(grep -c . <<<"$main_tags" || true) main tags, $(grep -c . <<<"$channel_tags" || true) channel tags" ORCA_PUBLISHED_VERSIONS="$published" ORCA_HOURLY_RELEASE_NAMES="$names" \ - node config/scripts/hourly-build-version.mjs \ + node "$(if [ -f config/scripts/release/versioning/hourly-build-version.mjs ]; then printf %s config/scripts/release/versioning/hourly-build-version.mjs; else printf %s config/scripts/hourly-build-version.mjs; fi)" \ >"$RUNNER_TEMP/hourly-identity.txt" grep -E '^(version|build_number)=' "$RUNNER_TEMP/hourly-identity.txt" # Dispatch YAML can be newer than the pinned source’s version script; reject missing output before publishing an untitled release. @@ -283,7 +283,7 @@ jobs: timeout_minutes: 45 max_attempts: 2 retry_wait_seconds: 30 - command: node --disable-warning=MODULE_TYPELESS_PACKAGE_JSON config/scripts/pinned-node-downloads.mjs darwin-arm64 darwin-x64 && node config/scripts/ensure-native-runtime.mjs --runtime=electron && if [ -f config/scripts/build-mac-notarization-overlap.mjs ]; then ORCA_MAC_HOURLY=1 node config/scripts/build-mac-notarization-overlap.mjs --publish always; else ORCA_MAC_HOURLY=1 pnpm exec electron-builder --config config/electron-builder.config.cjs --mac --publish always; fi + command: node --disable-warning=MODULE_TYPELESS_PACKAGE_JSON "$(if [ -f config/scripts/orcad-distribution/prebuilds/pinned-node-downloads.mjs ]; then printf %s config/scripts/orcad-distribution/prebuilds/pinned-node-downloads.mjs; else printf %s config/scripts/pinned-node-downloads.mjs; fi)" darwin-arm64 darwin-x64 && node "$(if [ -f config/scripts/native-build/node-addons/ensure-native-runtime.mjs ]; then printf %s config/scripts/native-build/node-addons/ensure-native-runtime.mjs; else printf %s config/scripts/ensure-native-runtime.mjs; fi)" --runtime=electron && if { [ -f config/scripts/desktop-distribution/macos/build-mac-notarization-overlap.mjs ] || [ -f config/scripts/build-mac-notarization-overlap.mjs ]; }; then ORCA_MAC_HOURLY=1 node "$(if [ -f config/scripts/desktop-distribution/macos/build-mac-notarization-overlap.mjs ]; then printf %s config/scripts/desktop-distribution/macos/build-mac-notarization-overlap.mjs; else printf %s config/scripts/build-mac-notarization-overlap.mjs; fi)" --publish always; else ORCA_MAC_HOURLY=1 pnpm exec electron-builder --config config/electron-builder.config.cjs --mac --publish always; fi env: # Give publisher token write access to configured orca-hourly repo. GH_TOKEN: ${{ steps.app_token_publish.outputs.token }} diff --git a/.github/workflows/macos-updater-tests.yml b/.github/workflows/macos-updater-tests.yml index 4cf67ba3d3f..4c06783ae88 100644 --- a/.github/workflows/macos-updater-tests.yml +++ b/.github/workflows/macos-updater-tests.yml @@ -44,7 +44,7 @@ jobs: native-runtime: node cache-electron-package: 'true' - name: Install the pinned Electron binary for native updater probes - run: node config/scripts/install-electron-package-binary.mjs + run: node config/scripts/electron-installation/platform-layout/install-electron-package-binary.mjs - name: Exercise native application registry and update shutdown env: ORCA_BACKGROUND_LAUNCH: '1' diff --git a/.github/workflows/mobile.yml b/.github/workflows/mobile.yml index cf7201aa91a..6779999e30d 100644 --- a/.github/workflows/mobile.yml +++ b/.github/workflows/mobile.yml @@ -46,9 +46,9 @@ on: - 'config/mobile-ci.vitest.config.mjs' - 'config/scripts/run-mobile-ci-tests.mjs' # Mobile typechecks run through the root compiler selection. - - 'config/scripts/run-typecheck-projects-in-parallel.mjs' - - 'config/scripts/tsrs-typecheck-compiler.mjs' - - 'config/scripts/pinned-bun-executable.mjs' + - 'config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.mjs' + - 'config/scripts/typecheck/project-execution/tsrs-typecheck-compiler.mjs' + - 'config/scripts/tool-invocation/pinned-bun-executable.mjs' - 'config/oxlint-code-quality-native-plugins.json' - 'config/.bun-version' - '.github/actions/install-node-dependencies/**' @@ -57,10 +57,11 @@ on: - '.github/workflows/mobile-ios-release.yml' - 'config/scripts/mobile-release-check-scope*' - 'config/scripts/mobile-test-change-scope*' - - 'config/scripts/pr-code-change-scope.mjs' - - 'config/scripts/pr-package-test-paths.mjs' - - 'config/scripts/pr-layout-oracle-route.mjs' - - 'config/scripts/pr-shell-contract-prefixes.mjs' + - 'config/scripts/workflow/source-routing/pr-code-change-scope.mjs' + - 'config/scripts/workflow/source-routing/pr-xterm-patch-prefixes.mjs' + - 'config/scripts/workflow/source-routing/pr-package-test-paths.mjs' + - 'config/scripts/workflow/source-routing/pr-layout-oracle-route.mjs' + - 'config/scripts/workflow/source-routing/pr-shell-contract-prefixes.mjs' # Desktop suites do not feed mobile; keep fixtures and test/toolchain config inputs. - '!src/shared/**/*.test.[jt]s' - '!src/shared/**/*.test.[jt]sx' @@ -108,9 +109,9 @@ on: - '.github/workflows/mobile.yml' - 'config/mobile-ci.vitest.config.mjs' - 'config/scripts/run-mobile-ci-tests.mjs' - - 'config/scripts/run-typecheck-projects-in-parallel.mjs' - - 'config/scripts/tsrs-typecheck-compiler.mjs' - - 'config/scripts/pinned-bun-executable.mjs' + - 'config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.mjs' + - 'config/scripts/typecheck/project-execution/tsrs-typecheck-compiler.mjs' + - 'config/scripts/tool-invocation/pinned-bun-executable.mjs' - 'config/.bun-version' - '.github/actions/install-node-dependencies/**' - '.github/actions/setup-pnpm/**' @@ -224,7 +225,7 @@ jobs: - name: Typecheck id: production-types background: true - run: node ../config/scripts/run-typecheck-projects-in-parallel.mjs --compiler=bun --bun-threads=2 --project=mobile/tsconfig.json + run: node ../config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.mjs --compiler=bun --bun-threads=2 --project=mobile/tsconfig.json # Why a ratchet and not the raw typecheck: mobile/tsconfig.json excludes test files, so until # tsconfig.test.json existed nothing checked them, and at introduction 127 of the 632 had @@ -376,7 +377,7 @@ jobs: - name: Typecheck id: production-types background: true - run: node ../config/scripts/run-typecheck-projects-in-parallel.mjs --compiler=bun --bun-threads=2 --project=mobile/tsconfig.json + run: node ../config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.mjs --compiler=bun --bun-threads=2 --project=mobile/tsconfig.json - name: Typecheck tests (ratchet) id: test-types diff --git a/.github/workflows/node-server-tests.yml b/.github/workflows/node-server-tests.yml index 7fd95253d27..4d704d4437e 100644 --- a/.github/workflows/node-server-tests.yml +++ b/.github/workflows/node-server-tests.yml @@ -93,7 +93,7 @@ jobs: if git fetch --no-tags --depth=1 origin "$PUSH_BASE" && git diff --name-only --no-renames -z "$PUSH_BASE" HEAD > "$RUNNER_TEMP/node-server-changes" && git diff --name-only --no-renames --diff-filter=M -z "$PUSH_BASE" HEAD > "$RUNNER_TEMP/node-server-modified"; then - node config/scripts/node-server-change-scope.mjs "$RUNNER_TEMP/node-server-changes" --defer-graph --full-qualification --modified-paths "$RUNNER_TEMP/node-server-modified" + node config/scripts/node-server/qualification/node-server-change-scope.mjs "$RUNNER_TEMP/node-server-changes" --defer-graph --full-qualification --modified-paths "$RUNNER_TEMP/node-server-modified" else echo 'should_run=true' >> "$GITHUB_OUTPUT" fi @@ -107,7 +107,7 @@ jobs: if git diff --name-only --no-renames -z HEAD^1 HEAD > "$RUNNER_TEMP/node-server-changes" && git diff --name-only --no-renames --diff-filter=M -z HEAD^1 HEAD > "$RUNNER_TEMP/node-server-modified" && git diff --raw --no-renames --no-abbrev -z HEAD^1 HEAD > "$RUNNER_TEMP/node-server-native-diff"; then - node config/scripts/node-server-change-scope.mjs "$RUNNER_TEMP/node-server-changes" --defer-graph --modified-paths "$RUNNER_TEMP/node-server-modified" "${NATIVE_SCOPE_ARGS[@]}" + node config/scripts/node-server/qualification/node-server-change-scope.mjs "$RUNNER_TEMP/node-server-changes" --defer-graph --modified-paths "$RUNNER_TEMP/node-server-modified" "${NATIVE_SCOPE_ARGS[@]}" else echo 'should_run=true' >> "$GITHUB_OUTPUT" fi @@ -127,13 +127,13 @@ jobs: ALLOW_TEST_ONLY_NATIVE_SKIP: ${{ github.event_name == 'pull_request' && !inputs.build_template && inputs.ref == '' }} run: | if [ "$EVENT_NAME" = push ]; then - node config/scripts/node-server-change-scope.mjs "$RUNNER_TEMP/node-server-changes" --full-qualification --modified-paths "$RUNNER_TEMP/node-server-modified" + node config/scripts/node-server/qualification/node-server-change-scope.mjs "$RUNNER_TEMP/node-server-changes" --full-qualification --modified-paths "$RUNNER_TEMP/node-server-modified" else NATIVE_SCOPE_ARGS=() if [ "$ALLOW_TEST_ONLY_NATIVE_SKIP" = true ]; then NATIVE_SCOPE_ARGS=(--pull-request --diff-paths "$RUNNER_TEMP/node-server-native-diff") fi - node config/scripts/node-server-change-scope.mjs "$RUNNER_TEMP/node-server-changes" --modified-paths "$RUNNER_TEMP/node-server-modified" "${NATIVE_SCOPE_ARGS[@]}" + node config/scripts/node-server/qualification/node-server-change-scope.mjs "$RUNNER_TEMP/node-server-changes" --modified-paths "$RUNNER_TEMP/node-server-modified" "${NATIVE_SCOPE_ARGS[@]}" fi persistence: @@ -234,7 +234,7 @@ jobs: BUN_EXECUTABLE: ${{ steps.bun-orcad.outputs.executable }} - name: Build the host-target desktop server template if: runner.os == 'Linux' - run: node config/scripts/build-orcad-template.mjs --targets linux-${{ runner.arch == 'ARM64' && 'arm64' || 'x64' }}-glibc + run: node "$(if [ -f config/scripts/orcad-distribution/template/build-orcad-template.mjs ]; then printf %s config/scripts/orcad-distribution/template/build-orcad-template.mjs; else printf %s config/scripts/build-orcad-template.mjs; fi)" --targets linux-${{ runner.arch == 'ARM64' && 'arm64' || 'x64' }}-glibc - name: Verify a structured chat from the desktop server template if: runner.os == 'Linux' run: pnpm test:node-server --artifact src/main/orcad/orcad-packaged-structured-chat.integration.test.ts --maxWorkers=2 @@ -246,10 +246,10 @@ jobs: if: inputs.build_template && matrix.os == 'windows-2022' shell: bash run: | - node config/scripts/build-windows-process-tree-addon.mjs --arch=x64 - node config/scripts/build-windows-process-tree-addon.mjs --arch=arm64 + node "$(if [ -f config/scripts/native-build/windows/build-windows-process-tree-addon.mjs ]; then printf %s config/scripts/native-build/windows/build-windows-process-tree-addon.mjs; else printf %s config/scripts/build-windows-process-tree-addon.mjs; fi)" --arch=x64 + node "$(if [ -f config/scripts/native-build/windows/build-windows-process-tree-addon.mjs ]; then printf %s config/scripts/native-build/windows/build-windows-process-tree-addon.mjs; else printf %s config/scripts/build-windows-process-tree-addon.mjs; fi)" --arch=arm64 node -e " - const { assertWindowsProcessTreeCreationTime } = require('./config/scripts/windows-process-tree-creation-time.cjs') + const { assertWindowsProcessTreeCreationTime } = require(require('node:fs').existsSync('./config/scripts/native-build/windows/windows-process-tree-creation-time.cjs') ? './config/scripts/native-build/windows/windows-process-tree-creation-time.cjs' : './config/scripts/windows-process-tree-creation-time.cjs') const addon = require('./.build/windows-process-tree/x64/windows-process-tree.node') assertWindowsProcessTreeCreationTime({ module: addon }) const own = addon.getProcessCreationTime(process.pid) @@ -280,14 +280,14 @@ jobs: # orcad's data-root privacy check fails closed without it, so every Windows slot needs one. # Older requested refs use the previous security implementation and have no addon builder. - name: Build the Windows security addons for the desktop template - if: inputs.build_template && matrix.os == 'windows-2022' && hashFiles('config/scripts/build-windows-security-addon.mjs') != '' + if: inputs.build_template && matrix.os == 'windows-2022' && hashFiles('config/scripts/native-build/windows/build-windows-security-addon.mjs', 'config/scripts/build-windows-security-addon.mjs') != '' shell: bash run: | - node config/scripts/build-windows-security-addon.mjs --arch=x64 - node config/scripts/build-windows-security-addon.mjs --arch=arm64 + node "$(if [ -f config/scripts/native-build/windows/build-windows-security-addon.mjs ]; then printf %s config/scripts/native-build/windows/build-windows-security-addon.mjs; else printf %s config/scripts/build-windows-security-addon.mjs; fi)" --arch=x64 + node "$(if [ -f config/scripts/native-build/windows/build-windows-security-addon.mjs ]; then printf %s config/scripts/native-build/windows/build-windows-security-addon.mjs; else printf %s config/scripts/build-windows-security-addon.mjs; fi)" --arch=arm64 node -e "require('./.build/windows-security/x64/windows-security.node').currentUserSid()" - name: Keep the Windows security addons for the desktop template - if: inputs.build_template && matrix.os == 'windows-2022' && hashFiles('config/scripts/build-windows-security-addon.mjs') != '' + if: inputs.build_template && matrix.os == 'windows-2022' && hashFiles('config/scripts/native-build/windows/build-windows-security-addon.mjs', 'config/scripts/build-windows-security-addon.mjs') != '' uses: actions/upload-artifact@v7 with: name: orcad-windows-security @@ -416,7 +416,7 @@ jobs: - name: Build and smoke this runner's node-pty prebuild slot under the pinned Node run: | pnpm build:orcad-prebuilds - pnpm build:orcad-prebuilds --require-slots "$(node config/scripts/build-orcad-prebuilds.mjs --print-slot)" + pnpm build:orcad-prebuilds --require-slots "$(node "$(if [ -f config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs ]; then printf %s config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs; else printf %s config/scripts/build-orcad-prebuilds.mjs; fi)" --print-slot)" pnpm build:orcad-prebuilds --smoke - uses: actions/download-artifact@v8 with: @@ -462,7 +462,7 @@ jobs: # smokes with that Node. devtoolset-10 supplies C++20; the slot links libstdc++ statically. - name: Build and smoke the glibc 2.17 compat slot under the glibc-217 Node run: | - compat_node="$(node config/scripts/build-orcad-prebuilds.mjs --slot=linux-x64-glibc217 --print-runtime)" + compat_node="$(node "$(if [ -f config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs ]; then printf %s config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs; else printf %s config/scripts/build-orcad-prebuilds.mjs; fi)" --slot=linux-x64-glibc217 --print-runtime)" case "$compat_node" in "$GITHUB_WORKSPACE"/*) ;; *) echo "glibc-217 Node cached outside the workspace: $compat_node" >&2; exit 1 ;; @@ -476,10 +476,10 @@ jobs: quay.io/pypa/manylinux2014_x86_64@sha256:6f74cabeac2432570aa4bfdb29f7c1f30313d4d6654d764c44e574b6ffdd4ed5 bash -s <<'GLIBC217_COMPAT_SLOT' set -eu export PATH="$(dirname "$COMPAT_NODE"):$PATH" - node config/scripts/build-orcad-prebuilds.mjs --slot=linux-x64-glibc217 - node config/scripts/build-orcad-prebuilds.mjs --require-slots linux-x64-glibc217 + node "$(if [ -f config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs ]; then printf %s config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs; else printf %s config/scripts/build-orcad-prebuilds.mjs; fi)" --slot=linux-x64-glibc217 + node "$(if [ -f config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs ]; then printf %s config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs; else printf %s config/scripts/build-orcad-prebuilds.mjs; fi)" --require-slots linux-x64-glibc217 # The image's devtoolset LD_LIBRARY_PATH must not stand in for a host C++ runtime. - env -u LD_LIBRARY_PATH node config/scripts/build-orcad-prebuilds.mjs --slot=linux-x64-glibc217 --smoke + env -u LD_LIBRARY_PATH node "$(if [ -f config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs ]; then printf %s config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs; else printf %s config/scripts/build-orcad-prebuilds.mjs; fi)" --slot=linux-x64-glibc217 --smoke GLIBC217_COMPAT_SLOT - name: Keep the glibc 2.17 compat slot for the desktop template if: inputs.build_template @@ -540,7 +540,7 @@ jobs: npm install -g "$(node -p "require('./package.json').packageManager.split('+')[0]")" pnpm install --frozen-lockfile --ignore-scripts pnpm build:orcad-prebuilds - pnpm build:orcad-prebuilds --require-slots "$(node config/scripts/build-orcad-prebuilds.mjs --print-slot)" + pnpm build:orcad-prebuilds --require-slots "$(node "$(if [ -f config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs ]; then printf %s config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs; else printf %s config/scripts/build-orcad-prebuilds.mjs; fi)" --print-slot)" pnpm build:orcad-prebuilds --smoke NODE_SERVER_PREPARATION - uses: actions/download-artifact@v8 @@ -637,7 +637,7 @@ jobs: name: orcad-windows-cli-launcher path: .build/windows-cli-launcher - name: Collect the Windows security addons - if: hashFiles('config/scripts/build-windows-security-addon.mjs') != '' + if: hashFiles('config/scripts/native-build/windows/build-windows-security-addon.mjs', 'config/scripts/build-windows-security-addon.mjs') != '' uses: actions/download-artifact@v8 with: name: orcad-windows-security @@ -645,7 +645,7 @@ jobs: - name: Merge the lanes and gate the full slot matrix shell: bash run: | - node config/scripts/merge-orcad-prebuilds.mjs "$RUNNER_TEMP"/orcad-prebuild-lanes/* + node "$(if [ -f config/scripts/orcad-distribution/prebuilds/merge-orcad-prebuilds.mjs ]; then printf %s config/scripts/orcad-distribution/prebuilds/merge-orcad-prebuilds.mjs; else printf %s config/scripts/merge-orcad-prebuilds.mjs; fi)" "$RUNNER_TEMP"/orcad-prebuild-lanes/* pnpm build:orcad-prebuilds --require-slots pnpm build:orcad-prebuilds --require-slots linux-x64-glibc217 # The page the qualification lanes tested, not a rebuild. diff --git a/.github/workflows/packaged-browser-e2e.yml b/.github/workflows/packaged-browser-e2e.yml index 0ab3e6489ea..06438c5046e 100644 --- a/.github/workflows/packaged-browser-e2e.yml +++ b/.github/workflows/packaged-browser-e2e.yml @@ -59,7 +59,7 @@ jobs: --project=electron-headless --workers=1 --retries=0 --repeat-each=3 --reporter=list,json - name: Require all six compatibility executions if: always() - run: node config/scripts/verify-packaged-browser-participation.mjs test-results/packaged-browser-results.json + run: node "$(if [ -f config/scripts/desktop-distribution/runtime-verification/verify-packaged-browser-participation.mjs ]; then printf %s config/scripts/desktop-distribution/runtime-verification/verify-packaged-browser-participation.mjs; else printf %s config/scripts/verify-packaged-browser-participation.mjs; fi)" test-results/packaged-browser-results.json - uses: actions/upload-artifact@v7 if: always() with: diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 481e4e6ee38..52e22c3f627 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -66,7 +66,7 @@ jobs: fetch-depth: 50 filter: blob:none sparse-checkout: | - /config/scripts/git-pull-request-diff-base.mjs + /config/scripts/git/pr-diff-base/git-pull-request-diff-base.mjs /package.json /README.md /docs/readme/ @@ -75,18 +75,19 @@ jobs: /.github/workflows/ /config/.bun-version /config/scripts/check-readme-local-links.mjs - /config/scripts/pr-code-change-scope.mjs - /config/scripts/pr-shell-contract-prefixes.mjs + /config/scripts/workflow/source-routing/pr-code-change-scope.mjs + /config/scripts/workflow/source-routing/pr-xterm-patch-prefixes.mjs + /config/scripts/workflow/source-routing/pr-shell-contract-prefixes.mjs /.oxfmtrc.json - /config/scripts/pr-package-test-paths.mjs - /config/scripts/pr-layout-oracle-route.mjs - /config/scripts/pr-e2e-source-routing.mjs - /config/scripts/pr-browser-e2e-source-routes.mjs - /config/scripts/pr-editor-preview-e2e-source-routes.mjs - /config/scripts/pr-feature-area-e2e-source-routes.mjs - /config/scripts/pr-plugin-e2e-source-routes.mjs - /config/scripts/pr-wsl-e2e-source-routes.mjs - /config/scripts/ci-e2e-job-selection.mjs + /config/scripts/workflow/source-routing/pr-package-test-paths.mjs + /config/scripts/workflow/source-routing/pr-layout-oracle-route.mjs + /config/scripts/workflow/source-routing/pr-e2e-source-routing.mjs + /config/scripts/workflow/source-routing/pr-browser-e2e-source-routes.mjs + /config/scripts/workflow/source-routing/pr-editor-preview-e2e-source-routes.mjs + /config/scripts/workflow/source-routing/pr-feature-area-e2e-source-routes.mjs + /config/scripts/workflow/source-routing/pr-plugin-e2e-source-routes.mjs + /config/scripts/workflow/source-routing/pr-wsl-e2e-source-routes.mjs + /config/scripts/ci/e2e-selection/ci-e2e-job-selection.mjs /config/scripts/pr-ready-check-reuse.mjs sparse-checkout-cone-mode: false persist-credentials: false @@ -95,7 +96,7 @@ jobs: env: BASE_SHA: ${{ github.event.pull_request.base.sha }} run: | - DIFF_BASE="$(node config/scripts/git-pull-request-diff-base.mjs "$BASE_SHA")" + DIFF_BASE="$(node config/scripts/git/pr-diff-base/git-pull-request-diff-base.mjs "$BASE_SHA")" node .github/scripts/check-root-directory-entries.mjs "$DIFF_BASE" HEAD # The full Git index retains link targets outside the sparse working tree. @@ -127,7 +128,7 @@ jobs: run: | set -euo pipefail # PR merge HEAD’s first parent is the base; --merge-base would require the payload SHA/full history. - DIFF_BASE="$(node config/scripts/git-pull-request-diff-base.mjs "$BASE_SHA")" + DIFF_BASE="$(node config/scripts/git/pr-diff-base/git-pull-request-diff-base.mjs "$BASE_SHA")" # --no-renames retains code-side deletions when files move into docs. CHANGED="$(git diff --name-only --no-renames --diff-filter=ACDMR "$DIFF_BASE" HEAD)" echo "Changed paths:" @@ -136,7 +137,7 @@ jobs: if git diff --quiet --no-renames --diff-filter=ACDRTUXB "$DIFF_BASE" HEAD; then MOBILE_CI_ARGS=(--mobile-ci-tools --daemon-init-test-support) fi - printf '%s\n' "$CHANGED" | node config/scripts/pr-code-change-scope.mjs "${MOBILE_CI_ARGS[@]}" | tee -a "$GITHUB_OUTPUT" + printf '%s\n' "$CHANGED" | node config/scripts/workflow/source-routing/pr-code-change-scope.mjs "${MOBILE_CI_ARGS[@]}" | tee -a "$GITHUB_OUTPUT" # Reuse the path-detector checkout instead of queuing another runner. - name: Filter changed E2E specs @@ -145,24 +146,24 @@ jobs: run: | set -euo pipefail BASE="${{ github.event.pull_request.base.sha }}" - DIFF_BASE="$(node config/scripts/git-pull-request-diff-base.mjs "$BASE")" + DIFF_BASE="$(node config/scripts/git/pr-diff-base/git-pull-request-diff-base.mjs "$BASE")" CHANGED="$(git diff --name-only --diff-filter=AMCR "$DIFF_BASE" HEAD)" E2E_SCOPE_ARGS=() if git diff --quiet --no-renames --diff-filter=ACDRTUXB "$DIFF_BASE" HEAD; then E2E_SCOPE_ARGS=(--daemon-init-test-support) fi # Executable routes let tests prove authorities/exclusions/sentinels without evaluating shell. - TEST_FILES_JSON="$(printf '%s\n' "$CHANGED" | node config/scripts/pr-e2e-source-routing.mjs "${E2E_SCOPE_ARGS[@]}")" + TEST_FILES_JSON="$(printf '%s\n' "$CHANGED" | node config/scripts/workflow/source-routing/pr-e2e-source-routing.mjs "${E2E_SCOPE_ARGS[@]}")" echo "test_files=$TEST_FILES_JSON" >> "$GITHUB_OUTPUT" - printf '%s\n' "$TEST_FILES_JSON" | node config/scripts/ci-e2e-job-selection.mjs --job-outputs >> "$GITHUB_OUTPUT" + printf '%s\n' "$TEST_FILES_JSON" | node config/scripts/ci/e2e-selection/ci-e2e-job-selection.mjs --job-outputs >> "$GITHUB_OUTPUT" # Real IME runs an entire IBus session; route it by IME source, independently of spec lists. - NATIVE_IME_SOURCE_CHANGED="$(printf '%s\n' "$CHANGED" | node config/scripts/pr-e2e-source-routing.mjs --native-ime-source)" + NATIVE_IME_SOURCE_CHANGED="$(printf '%s\n' "$CHANGED" | node config/scripts/workflow/source-routing/pr-e2e-source-routing.mjs --native-ime-source)" echo "native_ime_source_changed=$NATIVE_IME_SOURCE_CHANGED" >> "$GITHUB_OUTPUT" WSL_CHANGED="$(git diff --name-only --no-renames --diff-filter=ACDMR "$DIFF_BASE" HEAD)" - WSL_SOURCE_CHANGED="$(printf '%s\n' "$WSL_CHANGED" | node config/scripts/pr-e2e-source-routing.mjs --wsl-source)" + WSL_SOURCE_CHANGED="$(printf '%s\n' "$WSL_CHANGED" | node config/scripts/workflow/source-routing/pr-e2e-source-routing.mjs --wsl-source)" echo "wsl_source_changed=$WSL_SOURCE_CHANGED" >> "$GITHUB_OUTPUT" echo "Native IME source changed: $NATIVE_IME_SOURCE_CHANGED" - SHOULD_RUN="$(printf '%s\n' "$CHANGED" | node config/scripts/pr-e2e-source-routing.mjs --reusable-workflow "${E2E_SCOPE_ARGS[@]}")" + SHOULD_RUN="$(printf '%s\n' "$CHANGED" | node config/scripts/workflow/source-routing/pr-e2e-source-routing.mjs --reusable-workflow "${E2E_SCOPE_ARGS[@]}")" if [ "$SHOULD_RUN" = true ]; then echo "should_run=true" >> "$GITHUB_OUTPUT" echo "Changed E2E specs: $TEST_FILES_JSON" @@ -248,7 +249,7 @@ jobs: PREFLIGHT_PRIOR_SUCCESS: ${{ job.status == 'success' }} run: | if [ "$PREFLIGHT_PHASE_SELECTED" != true ] || [ "$PREFLIGHT_PRIOR_SUCCESS" != true ]; then exit 0; fi - bun config/scripts/check-main-sync-spawn-ratchet.mjs + bun config/scripts/static-analysis/process-boundaries/check-main-sync-spawn-ratchet.mjs # Keep each check in its own log while sharing this runner. - name: Lint @@ -334,7 +335,7 @@ jobs: PREFLIGHT_PRIOR_SUCCESS: ${{ job.status == 'success' }} run: | if [ "$PREFLIGHT_PHASE_SELECTED" != true ] || [ "$PREFLIGHT_PRIOR_SUCCESS" != true ]; then exit 0; fi - node config/scripts/check-changed-code-quality.mjs "${{ github.event.pull_request.base.sha }}" + node config/scripts/preflight/changed-checks/check-changed-code-quality.mjs "${{ github.event.pull_request.base.sha }}" - name: Verify locked audit tools if: needs.code_paths.outputs.static_analysis == 'true' @@ -373,9 +374,9 @@ jobs: run: | if [ "$PREFLIGHT_PHASE_SELECTED" != true ] || [ "$PREFLIGHT_PRIOR_SUCCESS" != true ]; then exit 0; fi # Detection failures run the full check; renames retain the removed input path. - DIFF_BASE="$(node config/scripts/git-pull-request-diff-base.mjs "$BASE_SHA")" + DIFF_BASE="$(node config/scripts/git/pr-diff-base/git-pull-request-diff-base.mjs "$BASE_SHA")" if git diff --name-only --no-renames -z "$DIFF_BASE" HEAD > "$RUNNER_TEMP/localization-changes" && - scope="$(node config/scripts/localization-extraction-change-scope.mjs "$RUNNER_TEMP/localization-changes")" && [ "$scope" = false ]; then + scope="$(node config/scripts/localization/extraction-policy/localization-extraction-change-scope.mjs "$RUNNER_TEMP/localization-changes")" && [ "$scope" = false ]; then echo "Localization extraction inputs are unchanged." else bun config/scripts/verify-localization-extraction.mjs @@ -392,7 +393,7 @@ jobs: PREFLIGHT_PRIOR_SUCCESS: ${{ job.status == 'success' }} run: | if [ "$PREFLIGHT_PHASE_SELECTED" != true ] || [ "$PREFLIGHT_PRIOR_SUCCESS" != true ]; then exit 0; fi - node config/scripts/run-ratchets.mjs + node config/scripts/static-analysis/ratchet-runner/run-ratchets.mjs - name: Check Zustand selector fan-out budget if: needs.code_paths.outputs.static_analysis == 'true' @@ -415,7 +416,7 @@ jobs: env: BASE_SHA: ${{ github.event.pull_request.base.sha }} run: | - DIFF_BASE="$(node config/scripts/git-pull-request-diff-base.mjs "$BASE_SHA")" + DIFF_BASE="$(node config/scripts/git/pr-diff-base/git-pull-request-diff-base.mjs "$BASE_SHA")" if git diff --quiet "$DIFF_BASE" HEAD -- \ src/shared/ephemeral-vm-runtime-store.ts \ src/shared/ephemeral-vm-runtime-feature-store.ts \ @@ -461,9 +462,9 @@ jobs: BASE_SHA: ${{ github.event.pull_request.base.sha }} run: | # Detection failures run the smoke; renames retain the removed input path. - DIFF_BASE="$(node config/scripts/git-pull-request-diff-base.mjs "$BASE_SHA")" + DIFF_BASE="$(node config/scripts/git/pr-diff-base/git-pull-request-diff-base.mjs "$BASE_SHA")" if git diff --name-only --no-renames -z "$DIFF_BASE" HEAD > "$RUNNER_TEMP/orcad-smoke-changes" && - scope="$(node config/scripts/orcad-terminal-smoke-change-scope.mjs "$RUNNER_TEMP/orcad-smoke-changes")" && [ "$scope" = false ]; then + scope="$(node config/scripts/orcad-distribution/qualification/orcad-terminal-smoke-change-scope.mjs "$RUNNER_TEMP/orcad-smoke-changes")" && [ "$scope" = false ]; then echo "Orcad terminal smoke inputs are unchanged." echo 'run=false' >> "$GITHUB_OUTPUT" else @@ -562,14 +563,14 @@ jobs: ORCA_BACKGROUND_LAUNCH: '1' ORCA_BALANCE_UNIT_SHARDS: '1' run: >- - node config/scripts/run-vitest.mjs run --config config/vitest.config.ts + node config/scripts/test-runtime/execution-policy/run-vitest.mjs run --config config/vitest.config.ts --maxWorkers=4 --isolate --retry=0 --bail=0 config/scripts/mobile-release-check-scope.test.mjs config/scripts/mobile-test-change-scope.test.mjs config/scripts/pr-ready-check-reuse.test.mjs config/scripts/win32-test-lane-registration.test.mjs - config/scripts/vitest-node-runtime-boundary.test.ts - config/scripts/vitest-sqlite-runtime-boundary.test.ts + config/scripts/test-runtime/node-worker/vitest-node-runtime-boundary.test.ts + config/scripts/test-runtime/sqlite-admission/vitest-sqlite-runtime-boundary.test.ts # Report failure through the separate required check without blocking unrelated consumers. - name: Smoke process-host package on Node 18 @@ -757,7 +758,7 @@ jobs: - name: Verify xterm patches match the pinned upstream build env: WORK_DIR: ${{ runner.temp }}/xterm-patch-build - run: node config/scripts/regenerate-xterm-patches.mjs --check --work-dir="$WORK_DIR" + run: node config/scripts/terminal-dependencies/xterm-patches/regenerate-xterm-patches.mjs --check --work-dir="$WORK_DIR" shell_contracts: name: shell contracts @@ -943,7 +944,7 @@ jobs: - name: Prepare mobile route snapshot id: mobile-routes background: true - run: node config/scripts/run-mobile-web-app-checks.mjs --prepare-route-snapshot "$RUNNER_TEMP/mobile-routes.json" + run: node config/scripts/mobile-web/check-entry/run-mobile-web-app-checks.mjs --prepare-route-snapshot "$RUNNER_TEMP/mobile-routes.json" # Require runner Google Chrome: Ubuntu’s AppArmor userns profile covers its .deb, unlike downloaded Chromium; missing render checks must fail. - name: Resolve Chrome for the render check @@ -969,7 +970,7 @@ jobs: ORCA_MOBILE_WEB_APP_DEPS_REQUIRED: '1' ORCA_MOBILE_WEB_PREPARED_ROUTE_SNAPSHOT: ${{ runner.temp }}/mobile-routes.json run: | - node config/scripts/run-mobile-web-app-checks.mjs + node config/scripts/mobile-web/check-entry/run-mobile-web-app-checks.mjs cross-version-wire: name: cross-version wire compatibility @@ -1007,7 +1008,7 @@ jobs: BASE_SHA: ${{ github.event.pull_request.base.sha }} ORCA_ALLOW_RUNTIME_LAUNCHER_PROTOCOL_BUMP: ${{ contains(github.event.pull_request.labels.*.name, 'allow-runtime-launcher-protocol-bump') }} run: | - DIFF_BASE="$(node config/scripts/git-pull-request-diff-base.mjs "$BASE_SHA")" + DIFF_BASE="$(node config/scripts/git/pr-diff-base/git-pull-request-diff-base.mjs "$BASE_SHA")" pnpm run check:runtime-launcher-protocol-ratchet -- --base "$DIFF_BASE" # Run the entire directory; zero matches fail so new contracts cannot be omitted silently. @@ -1215,7 +1216,7 @@ jobs: # Prepare once with every hook, then isolate the format-specific mutations. run: | pnpm exec electron-builder --config config/electron-builder.config.cjs --linux dir --x64 --publish never - node config/scripts/package-linux-formats.mjs + node config/scripts/desktop-distribution/linux/package-linux-formats.mjs - name: Verify root-package marker payloads run: | @@ -1229,7 +1230,7 @@ jobs: rpm_marker="$(rpm2cpio "$rpm" | cpio --quiet --extract --to-stdout ./opt/Orca/resources/package-type)" [[ "$deb_marker" == deb ]] || { echo "Expected deb marker, got: $deb_marker"; exit 1; } [[ "$rpm_marker" == rpm ]] || { echo "Expected rpm marker, got: $rpm_marker"; exit 1; } - # Only the AppImage carries the pinned Node (config/scripts/appimage-node-runtime.cjs). + # Only the AppImage carries the pinned Node (config/scripts/desktop-distribution/linux/appimage-node-runtime.cjs). if dpkg-deb --fsys-tarfile "$deb" | tar -t | grep '/resources/node-runtime' >/dev/null; then echo "The deb must not carry the AppImage's Node"; exit 1 fi @@ -1329,12 +1330,12 @@ jobs: pnpm exec vitest run --config config/vitest.config.ts --no-file-parallelism config/scripts/nsis-process-check.test.mjs - config/scripts/idle-cpu-process-sampling.test.mjs + config/scripts/performance/idle-cpu/idle-cpu-process-sampling.test.mjs - name: Resolve the Windows Rust build scope id: rust-scope shell: bash - run: node config/scripts/windows-rust-build-scope.mjs >> "$GITHUB_OUTPUT" + run: node config/scripts/native-build/windows/windows-rust-build-scope.mjs >> "$GITHUB_OUTPUT" # Real inputs only: older restores are safe because the build re-checks each exe's fingerprint. - name: Cache Windows CLI launcher @@ -1347,7 +1348,7 @@ jobs: native/windows-agent-hook/.build native/windows-agent-hook/target ~/.cargo/registry - key: windows-cli-launcher-v2-${{ runner.os }}-${{ runner.arch }}-${{ steps.rust-scope.outputs.toolchain }}-${{ steps.rust-scope.outputs.app-version }}-${{ hashFiles('native/windows-cli-launcher/src/**', 'native/windows-cli-launcher/build.rs', 'native/windows-cli-launcher/Cargo.toml', 'native/windows-cli-launcher/Cargo.lock', 'native/windows-cli-launcher/app.manifest', 'native/windows-cli-launcher/.cargo/**', 'native/windows-agent-hook/src/**', 'native/windows-agent-hook/build.rs', 'native/windows-agent-hook/Cargo.toml', 'native/windows-agent-hook/Cargo.lock', 'native/windows-agent-hook/app.manifest', 'native/windows-agent-hook/.cargo/**', 'config/scripts/build-windows-cli-launcher.mjs', 'config/scripts/build-windows-agent-hook.mjs', 'config/scripts/windows-rust-executable-build.mjs', 'config/scripts/windows-pe-imports.mjs', 'resources/build/icon.ico') }} + key: windows-cli-launcher-v2-${{ runner.os }}-${{ runner.arch }}-${{ steps.rust-scope.outputs.toolchain }}-${{ steps.rust-scope.outputs.app-version }}-${{ hashFiles('native/windows-cli-launcher/src/**', 'native/windows-cli-launcher/build.rs', 'native/windows-cli-launcher/Cargo.toml', 'native/windows-cli-launcher/Cargo.lock', 'native/windows-cli-launcher/app.manifest', 'native/windows-cli-launcher/.cargo/**', 'native/windows-agent-hook/src/**', 'native/windows-agent-hook/build.rs', 'native/windows-agent-hook/Cargo.toml', 'native/windows-agent-hook/Cargo.lock', 'native/windows-agent-hook/app.manifest', 'native/windows-agent-hook/.cargo/**', 'config/scripts/native-build/windows/build-windows-cli-launcher.mjs', 'config/scripts/native-build/windows/build-windows-agent-hook.mjs', 'config/scripts/native-build/windows/windows-rust-executable-build.mjs', 'config/scripts/native-build/windows/windows-pe-imports.mjs', 'resources/build/icon.ico') }} restore-keys: | windows-cli-launcher-v2-${{ runner.os }}-${{ runner.arch }}-${{ steps.rust-scope.outputs.toolchain }}- @@ -1363,14 +1364,14 @@ jobs: # Build agent-hook once before tests so suites share the binary instead of compiling concurrently. - name: Build the Windows agent hook - run: node config/scripts/build-windows-agent-hook.mjs + run: node config/scripts/native-build/windows/build-windows-agent-hook.mjs - name: Build the Windows CLI launcher - run: node config/scripts/build-windows-cli-launcher.mjs + run: node config/scripts/native-build/windows/build-windows-cli-launcher.mjs # Install Electron once: otherwise each Electron test's require('electron') extracts it into one dist concurrently (EBUSY, 0xC0000005). - name: Install the Electron binary - run: node config/scripts/install-electron-package-binary.mjs + run: node config/scripts/electron-installation/platform-layout/install-electron-package-binary.mjs # Files come from WINDOWS_BOUNDARY_TESTS, the same list that decides whether this job runs. - name: Test Windows-specific boundaries @@ -1378,7 +1379,7 @@ jobs: ORCA_BACKGROUND_LAUNCH: '1' ORCA_REAL_WINDOWS_SKILL_TEST: '1' run: | - $files = node config/scripts/pr-package-test-paths.mjs + $files = node config/scripts/workflow/source-routing/pr-package-test-paths.mjs if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } node node_modules/vitest/vitest.mjs run --config config/vitest.config.ts @files diff --git a/.github/workflows/preflight-benchmark.yml b/.github/workflows/preflight-benchmark.yml index 5f8f0b595d3..1d0961e258c 100644 --- a/.github/workflows/preflight-benchmark.yml +++ b/.github/workflows/preflight-benchmark.yml @@ -5,7 +5,7 @@ on: paths: - .github/workflows/preflight-benchmark.yml - config/scripts/benchmark-preflight-*.mjs - - config/scripts/preflight-benchmark-command.mjs + - config/scripts/preflight/benchmarks/preflight-benchmark-command.mjs workflow_dispatch: permissions: contents: read @@ -34,7 +34,7 @@ jobs: bun-version-file: config/.bun-version no-cache: true - name: Compare native and Bun typechecking - run: node config/scripts/benchmark-preflight-compilers.mjs + run: node config/scripts/preflight/benchmarks/benchmark-preflight-compilers.mjs - uses: actions/upload-artifact@v7 if: always() with: @@ -58,7 +58,7 @@ jobs: bun-version-file: config/.bun-version no-cache: true - name: Compare anti-slop patch and script runtimes - run: node config/scripts/benchmark-preflight-static-analysis.mjs + run: node config/scripts/preflight/benchmarks/benchmark-preflight-static-analysis.mjs - uses: actions/upload-artifact@v7 if: always() with: @@ -83,7 +83,7 @@ jobs: bun-version-file: config/.bun-version no-cache: true - name: Compare compatibility-import scan and runtimes - run: node config/scripts/benchmark-preflight-compat-boundary.mjs + run: node config/scripts/preflight/benchmarks/benchmark-preflight-compat-boundary.mjs - uses: actions/upload-artifact@v7 if: always() with: @@ -107,7 +107,7 @@ jobs: bun-version-file: config/.bun-version no-cache: true - name: Compare localization extraction runtimes and complete catalogs - run: node config/scripts/benchmark-preflight-localization-extraction.mjs + run: node config/scripts/preflight/benchmarks/benchmark-preflight-localization-extraction.mjs - uses: actions/upload-artifact@v7 if: always() with: diff --git a/.github/workflows/preflight-critical-path-benchmark.yml b/.github/workflows/preflight-critical-path-benchmark.yml index c6e8eb44b4a..468151b95d3 100644 --- a/.github/workflows/preflight-critical-path-benchmark.yml +++ b/.github/workflows/preflight-critical-path-benchmark.yml @@ -4,7 +4,7 @@ on: types: [opened, synchronize, reopened, ready_for_review, converted_to_draft] paths: - .github/workflows/preflight-critical-path-benchmark.yml - - config/scripts/benchmark-ci-preflight-critical-path.mjs + - config/scripts/preflight/benchmarks/benchmark-ci-preflight-critical-path.mjs workflow_dispatch: permissions: contents: read @@ -38,7 +38,7 @@ jobs: - uses: ./.github/actions/install-mobile-dependencies if: matrix.comparison == 'smoke' - name: Compare checks and verify their results - run: node config/scripts/benchmark-ci-preflight-critical-path.mjs ${{ matrix.comparison }} + run: node config/scripts/preflight/benchmarks/benchmark-ci-preflight-critical-path.mjs ${{ matrix.comparison }} - uses: actions/upload-artifact@v7 if: always() with: diff --git a/.github/workflows/qualified-orcad-template.yml b/.github/workflows/qualified-orcad-template.yml index 6da722eee92..0c2482308b9 100644 --- a/.github/workflows/qualified-orcad-template.yml +++ b/.github/workflows/qualified-orcad-template.yml @@ -60,7 +60,7 @@ jobs: if: steps.restore.outputs.cache-hit == 'true' && steps.restore.outcome == 'success' shell: bash run: | - if node -e "require('./config/dark-build-switches.cjs').assertNotDarkBuild(['out/orcad-template']); require('./config/scripts/verify-packaged-orcad-template.cjs').verifyPackagedOrcadTemplate('out')"; then + if node -e "require('./config/dark-build-switches.cjs').assertNotDarkBuild(['out/orcad-template']); require(require('node:fs').existsSync('./config/scripts/orcad-distribution/template/verify-packaged-orcad-template.cjs') ? './config/scripts/orcad-distribution/template/verify-packaged-orcad-template.cjs' : './config/scripts/verify-packaged-orcad-template.cjs').verifyPackagedOrcadTemplate('out')"; then echo 'valid=true' >> "$GITHUB_OUTPUT" else rm -rf out/orcad-template diff --git a/.github/workflows/release-cut.yml b/.github/workflows/release-cut.yml index 9f520a1f12f..0963948a4ea 100644 --- a/.github/workflows/release-cut.yml +++ b/.github/workflows/release-cut.yml @@ -641,7 +641,7 @@ jobs: TAG: ${{ steps.tag.outputs.tag || steps.version.outputs.recovered_tag }} run: | set -euo pipefail - if git cat-file -e "refs/tags/${TAG}^{commit}:config/scripts/packaged-orcad-template.cjs" 2>/dev/null; then + if git cat-file -e "refs/tags/${TAG}^{commit}:config/scripts/orcad-distribution/template/packaged-orcad-template.cjs" 2>/dev/null || git cat-file -e "refs/tags/${TAG}^{commit}:config/scripts/packaged-orcad-template.cjs" 2>/dev/null; then echo "ships=true" >>"$GITHUB_OUTPUT" else echo "ships=false" >>"$GITHUB_OUTPUT" @@ -850,7 +850,12 @@ jobs: native-runtime: node - name: Install Electron package binary for tests - run: node config/scripts/install-electron-package-binary.mjs + run: | + ELECTRON_INSTALL_SCRIPT=config/scripts/electron-installation/platform-layout/install-electron-package-binary.mjs + if [ ! -f "$ELECTRON_INSTALL_SCRIPT" ]; then + ELECTRON_INSTALL_SCRIPT=config/scripts/install-electron-package-binary.mjs + fi + node "$ELECTRON_INSTALL_SCRIPT" - name: Run skill package, transaction, and compatibility suites env: @@ -901,7 +906,12 @@ jobs: native-runtime: node - name: Install Electron package binary for tests - run: node config/scripts/install-electron-package-binary.mjs + run: | + ELECTRON_INSTALL_SCRIPT=config/scripts/electron-installation/platform-layout/install-electron-package-binary.mjs + if [ ! -f "$ELECTRON_INSTALL_SCRIPT" ]; then + ELECTRON_INSTALL_SCRIPT=config/scripts/install-electron-package-binary.mjs + fi + node "$ELECTRON_INSTALL_SCRIPT" - name: Run skill package, transaction, and compatibility suites env: @@ -1083,20 +1093,20 @@ jobs: # node-gyp could detect VS 18, breaking native dependency install. - os: windows-2022 platform: win - release_command: 'node config/scripts/ensure-native-runtime.mjs --runtime=electron; if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }; pnpm exec electron-builder --config config/electron-builder.config.cjs --win --publish never' + release_command: 'node $(if (Test-Path config/scripts/native-build/node-addons/ensure-native-runtime.mjs) { "config/scripts/native-build/node-addons/ensure-native-runtime.mjs" } else { "config/scripts/ensure-native-runtime.mjs" }) --runtime=electron; if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }; pnpm exec electron-builder --config config/electron-builder.config.cjs --win --publish never' eb_cache_path: | ~\AppData\Local\electron\Cache ~\AppData\Local\electron-builder\Cache - os: ubuntu-latest platform: linux-x64 - release_command: node config/scripts/ensure-native-runtime.mjs --runtime=electron && pnpm exec electron-builder --config config/electron-builder.config.cjs --linux AppImage deb rpm --x64 --publish always -c.publish.releaseType=draft + release_command: node "$(if [ -f config/scripts/native-build/node-addons/ensure-native-runtime.mjs ]; then printf %s config/scripts/native-build/node-addons/ensure-native-runtime.mjs; else printf %s config/scripts/ensure-native-runtime.mjs; fi)" --runtime=electron && pnpm exec electron-builder --config config/electron-builder.config.cjs --linux AppImage deb rpm --x64 --publish always -c.publish.releaseType=draft unpacked_dir: dist/linux-unpacked eb_cache_path: | ~/.cache/electron ~/.cache/electron-builder - os: ubuntu-24.04-arm platform: linux-arm64 - release_command: node config/scripts/ensure-native-runtime.mjs --runtime=electron && ORCA_LINUX_ARM64_RELEASE=1 pnpm exec electron-builder --config config/electron-builder.config.cjs --linux AppImage deb rpm --arm64 --publish always -c.publish.releaseType=draft + release_command: node "$(if [ -f config/scripts/native-build/node-addons/ensure-native-runtime.mjs ]; then printf %s config/scripts/native-build/node-addons/ensure-native-runtime.mjs; else printf %s config/scripts/ensure-native-runtime.mjs; fi)" --runtime=electron && ORCA_LINUX_ARM64_RELEASE=1 pnpm exec electron-builder --config config/electron-builder.config.cjs --linux AppImage deb rpm --arm64 --publish always -c.publish.releaseType=draft unpacked_dir: dist/linux-arm64-unpacked eb_cache_path: | ~/.cache/electron @@ -1271,7 +1281,11 @@ jobs: shell: bash run: | if [ "$SHARED_JAVASCRIPT" = true ]; then - node config/scripts/release-javascript-artifact.mjs restore + RELEASE_JAVASCRIPT_ARTIFACT='config/scripts/release/javascript-artifacts/release-javascript-artifact.mjs' + if [ ! -f "$RELEASE_JAVASCRIPT_ARTIFACT" ]; then + RELEASE_JAVASCRIPT_ARTIFACT='config/scripts/release-javascript-artifact.mjs' + fi + node "$RELEASE_JAVASCRIPT_ARTIFACT" restore pnpm run build:release:host else pnpm run build:release @@ -1614,7 +1628,7 @@ jobs: - name: Reseal the orcad template over its signed binaries id: reseal-orcad-template if: matrix.platform == 'win' && github.run_attempt == 1 && steps.restore-signed-inner.outcome == 'success' && needs.cut.outputs.ships_orcad_template == 'true' - run: node config/scripts/packaged-orcad-template.cjs --reseal-signed dist/win-unpacked inner-signing-list.txt + run: node $(if (Test-Path config/scripts/orcad-distribution/template/packaged-orcad-template.cjs) { "config/scripts/orcad-distribution/template/packaged-orcad-template.cjs" } else { "config/scripts/packaged-orcad-template.cjs" }) --reseal-signed dist/win-unpacked inner-signing-list.txt # The uninstaller must return signed before rebuilding the installer. - name: Restore signed uninstaller for the installer rebuild diff --git a/.github/workflows/release-javascript-benchmark.yml b/.github/workflows/release-javascript-benchmark.yml index b82ba4046d1..bdc246c16f7 100644 --- a/.github/workflows/release-javascript-benchmark.yml +++ b/.github/workflows/release-javascript-benchmark.yml @@ -69,7 +69,11 @@ jobs: run: | RELEASE_TAG="v$(node -p 'require("./package.json").version')" export RELEASE_TAG - echo "ORCA_BUILD_IDENTITY=$(node config/scripts/release-javascript-artifact.mjs identity)" >> "$GITHUB_ENV" + RELEASE_JAVASCRIPT_ARTIFACT='config/scripts/release/javascript-artifacts/release-javascript-artifact.mjs' + if [ ! -f "$RELEASE_JAVASCRIPT_ARTIFACT" ]; then + RELEASE_JAVASCRIPT_ARTIFACT='config/scripts/release-javascript-artifact.mjs' + fi + echo "ORCA_BUILD_IDENTITY=$(node "$RELEASE_JAVASCRIPT_ARTIFACT" identity)" >> "$GITHUB_ENV" - name: Download shared JavaScript if: matrix.mode == 'shared' uses: actions/download-artifact@v8 @@ -81,7 +85,12 @@ jobs: env: MEASUREMENT_MODE: ${{ matrix.mode }} ORCA_RELEASE_JAVASCRIPT_SOURCE_SHA: ${{ needs.bundle.outputs.source_sha }} - run: node config/scripts/release-javascript-benchmark.mjs "$MEASUREMENT_MODE" + run: | + RELEASE_JAVASCRIPT_BENCHMARK='config/scripts/release/javascript-artifacts/release-javascript-benchmark.mjs' + if [ ! -f "$RELEASE_JAVASCRIPT_BENCHMARK" ]; then + RELEASE_JAVASCRIPT_BENCHMARK='config/scripts/release-javascript-benchmark.mjs' + fi + node "$RELEASE_JAVASCRIPT_BENCHMARK" "$MEASUREMENT_MODE" - uses: actions/upload-artifact@v7 with: name: release-javascript-measurement-${{ matrix.mode }}-${{ matrix.host.platform }}-${{ matrix.host.arch }} @@ -113,7 +122,11 @@ jobs: GH_TOKEN: ${{ github.token }} run: | gh api "repos/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID/jobs?per_page=100" > .build/release-javascript-measurements/jobs.json - node config/scripts/release-javascript-benchmark.mjs summary + RELEASE_JAVASCRIPT_BENCHMARK='config/scripts/release/javascript-artifacts/release-javascript-benchmark.mjs' + if [ ! -f "$RELEASE_JAVASCRIPT_BENCHMARK" ]; then + RELEASE_JAVASCRIPT_BENCHMARK='config/scripts/release-javascript-benchmark.mjs' + fi + node "$RELEASE_JAVASCRIPT_BENCHMARK" summary cat .build/release-javascript-measurements/comparison.md >> "$GITHUB_STEP_SUMMARY" - uses: actions/upload-artifact@v7 if: always() diff --git a/.github/workflows/release-javascript.yml b/.github/workflows/release-javascript.yml index 200bec42481..547794d2ab5 100644 --- a/.github/workflows/release-javascript.yml +++ b/.github/workflows/release-javascript.yml @@ -50,10 +50,13 @@ jobs: node <<'NODE' >> "$GITHUB_OUTPUT" const fs = require('node:fs') const { scripts, devDependencies } = require('./package.json') + const artifactScript = fs.existsSync('config/scripts/release/javascript-artifacts/release-javascript-artifact.mjs') + ? 'config/scripts/release/javascript-artifacts/release-javascript-artifact.mjs' + : 'config/scripts/release-javascript-artifact.mjs' const supported = Boolean(scripts['build:release:javascript'] && scripts['build:release:host']) const devSupported = supported && Boolean( scripts['build:release:javascript:parallel'] && devDependencies?.tsrs && - fs.readFileSync('config/scripts/release-javascript-artifact.mjs', 'utf8') + fs.readFileSync(artifactScript, 'utf8') .includes('ORCA_RELEASE_JAVASCRIPT_BUILD_IDENTITY') ) console.log('supported=' + (process.env.DEV_BUILD === 'true' ? devSupported : supported)) @@ -75,7 +78,11 @@ jobs: run: | RELEASE_TAG="v$(node -p 'require("./package.json").version')" export RELEASE_TAG - echo "value=$(node config/scripts/release-javascript-artifact.mjs identity)" >> "$GITHUB_OUTPUT" + RELEASE_JAVASCRIPT_ARTIFACT='config/scripts/release/javascript-artifacts/release-javascript-artifact.mjs' + if [ ! -f "$RELEASE_JAVASCRIPT_ARTIFACT" ]; then + RELEASE_JAVASCRIPT_ARTIFACT='config/scripts/release-javascript-artifact.mjs' + fi + echo "value=$(node "$RELEASE_JAVASCRIPT_ARTIFACT" identity)" >> "$GITHUB_OUTPUT" - name: Build and archive release JavaScript if: steps.source.outputs.supported == 'true' @@ -89,7 +96,11 @@ jobs: ORCA_POSTHOG_WRITE_KEY: ${{ !inputs.dev_build && secrets.ORCA_POSTHOG_WRITE_KEY || '' }} run: | pnpm run "$JAVASCRIPT_BUILD_SCRIPT" - node config/scripts/release-javascript-artifact.mjs pack + RELEASE_JAVASCRIPT_ARTIFACT='config/scripts/release/javascript-artifacts/release-javascript-artifact.mjs' + if [ ! -f "$RELEASE_JAVASCRIPT_ARTIFACT" ]; then + RELEASE_JAVASCRIPT_ARTIFACT='config/scripts/release-javascript-artifact.mjs' + fi + node "$RELEASE_JAVASCRIPT_ARTIFACT" pack - uses: actions/upload-artifact@v7 if: steps.source.outputs.supported == 'true' diff --git a/.github/workflows/release-mac-build.yml b/.github/workflows/release-mac-build.yml index b6a752f6177..49d0813c761 100644 --- a/.github/workflows/release-mac-build.yml +++ b/.github/workflows/release-mac-build.yml @@ -174,7 +174,11 @@ jobs: - name: Build app run: | if [ -n "$ORCA_RELEASE_JAVASCRIPT_SOURCE_SHA" ]; then - node config/scripts/release-javascript-artifact.mjs restore + RELEASE_JAVASCRIPT_ARTIFACT='config/scripts/release/javascript-artifacts/release-javascript-artifact.mjs' + if [ ! -f "$RELEASE_JAVASCRIPT_ARTIFACT" ]; then + RELEASE_JAVASCRIPT_ARTIFACT='config/scripts/release-javascript-artifact.mjs' + fi + node "$RELEASE_JAVASCRIPT_ARTIFACT" restore pnpm run build:release:host else pnpm run build:release @@ -191,7 +195,7 @@ jobs: # Design D2: the parent release-cut run merged it from every node-server lane at this tag. - name: Download the orcad deployment template from the release run # Why: release-cut skips the template for a tag that predates it. - if: hashFiles('config/scripts/packaged-orcad-template.cjs') != '' + if: hashFiles('config/scripts/orcad-distribution/template/packaged-orcad-template.cjs', 'config/scripts/packaged-orcad-template.cjs') != '' uses: actions/download-artifact@v8 with: name: orcad-template @@ -225,7 +229,7 @@ jobs: timeout_minutes: 45 max_attempts: 3 retry_wait_seconds: 30 - command: node --disable-warning=MODULE_TYPELESS_PACKAGE_JSON config/scripts/pinned-node-downloads.mjs darwin-arm64 darwin-x64 && node config/scripts/ensure-native-runtime.mjs --runtime=electron && if [ -f config/scripts/build-mac-notarization-overlap.mjs ]; then ORCA_MAC_RELEASE=1 node config/scripts/build-mac-notarization-overlap.mjs --publish "$ORCA_MAC_PUBLISH" --draft; else ORCA_MAC_RELEASE=1 pnpm exec electron-builder --config config/electron-builder.config.cjs --mac --publish "$ORCA_MAC_PUBLISH" -c.publish.releaseType=draft; fi + command: node --disable-warning=MODULE_TYPELESS_PACKAGE_JSON "$(if [ -f config/scripts/orcad-distribution/prebuilds/pinned-node-downloads.mjs ]; then printf %s config/scripts/orcad-distribution/prebuilds/pinned-node-downloads.mjs; else printf %s config/scripts/pinned-node-downloads.mjs; fi)" darwin-arm64 darwin-x64 && node "$(if [ -f config/scripts/native-build/node-addons/ensure-native-runtime.mjs ]; then printf %s config/scripts/native-build/node-addons/ensure-native-runtime.mjs; else printf %s config/scripts/ensure-native-runtime.mjs; fi)" --runtime=electron && if { [ -f config/scripts/desktop-distribution/macos/build-mac-notarization-overlap.mjs ] || [ -f config/scripts/build-mac-notarization-overlap.mjs ]; }; then ORCA_MAC_RELEASE=1 node "$(if [ -f config/scripts/desktop-distribution/macos/build-mac-notarization-overlap.mjs ]; then printf %s config/scripts/desktop-distribution/macos/build-mac-notarization-overlap.mjs; else printf %s config/scripts/build-mac-notarization-overlap.mjs; fi)" --publish "$ORCA_MAC_PUBLISH" --draft; else ORCA_MAC_RELEASE=1 pnpm exec electron-builder --config config/electron-builder.config.cjs --mac --publish "$ORCA_MAC_PUBLISH" -c.publish.releaseType=draft; fi env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} ORCA_REQUIRE_ORCAD_TEMPLATE: '1' diff --git a/.github/workflows/release-policy.yml b/.github/workflows/release-policy.yml index bc6bb8136e2..3a581494c4f 100644 --- a/.github/workflows/release-policy.yml +++ b/.github/workflows/release-policy.yml @@ -24,7 +24,7 @@ jobs: with: sparse-checkout: | config/scripts/release-policy.mjs - config/scripts/release-tag-patterns.mjs + config/scripts/release/versioning/release-tag-patterns.mjs sparse-checkout-cone-mode: false persist-credentials: false - name: Enforce release policy diff --git a/.github/workflows/ssh-hostile-hosts.yml b/.github/workflows/ssh-hostile-hosts.yml index a862719e06e..d129bec5c17 100644 --- a/.github/workflows/ssh-hostile-hosts.yml +++ b/.github/workflows/ssh-hostile-hosts.yml @@ -23,8 +23,11 @@ on: - 'src/shared/node-runtime-pin.ts' - 'src/shared/orcad-artifacts.ts' - 'config/scripts/build-orcad-*.mjs' + - 'config/scripts/orcad-distribution/prebuilds/build-orcad-*.mjs' + - 'config/scripts/orcad-distribution/template/build-orcad-*.mjs' - 'config/scripts/orcad-prebuild-*.mjs' - - 'config/scripts/verify-packaged-orcad-template.cjs' + - 'config/scripts/orcad-distribution/prebuilds/orcad-prebuild-*.mjs' + - 'config/scripts/orcad-distribution/template/verify-packaged-orcad-template.cjs' - 'config/patches/node-pty*' # The deploy runs over this SSH transport. - 'src/main/ssh/connection/**' @@ -149,7 +152,7 @@ jobs: - uses: ./.github/actions/install-node-dependencies - name: Build and smoke the glibc 2.17 compat slot under the glibc-217 Node run: | - compat_node="$(node config/scripts/build-orcad-prebuilds.mjs --slot=linux-x64-glibc217 --print-runtime)" + compat_node="$(node config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs --slot=linux-x64-glibc217 --print-runtime)" case "$compat_node" in "$GITHUB_WORKSPACE"/*) ;; *) echo "glibc-217 Node cached outside the workspace: $compat_node" >&2; exit 1 ;; @@ -163,10 +166,10 @@ jobs: quay.io/pypa/manylinux2014_x86_64@sha256:6f74cabeac2432570aa4bfdb29f7c1f30313d4d6654d764c44e574b6ffdd4ed5 bash -s <<'GLIBC217_COMPAT_SLOT' set -eu export PATH="$(dirname "$COMPAT_NODE"):$PATH" - node config/scripts/build-orcad-prebuilds.mjs --slot=linux-x64-glibc217 - node config/scripts/build-orcad-prebuilds.mjs --require-slots linux-x64-glibc217 + node config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs --slot=linux-x64-glibc217 + node config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs --require-slots linux-x64-glibc217 # The image's devtoolset LD_LIBRARY_PATH must not stand in for a host C++ runtime. - env -u LD_LIBRARY_PATH node config/scripts/build-orcad-prebuilds.mjs --slot=linux-x64-glibc217 --smoke + env -u LD_LIBRARY_PATH node config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs --slot=linux-x64-glibc217 --smoke GLIBC217_COMPAT_SLOT - uses: actions/upload-artifact@v7 with: @@ -195,13 +198,13 @@ jobs: path: ${{ runner.temp }}/hostile-host-prebuild-lanes - name: Merge verified Linux slots run: | - node config/scripts/merge-orcad-prebuilds.mjs "$RUNNER_TEMP"/hostile-host-prebuild-lanes/* + node config/scripts/orcad-distribution/prebuilds/merge-orcad-prebuilds.mjs "$RUNNER_TEMP"/hostile-host-prebuild-lanes/* pnpm build:orcad-prebuilds --require-slots linux-x64-glibc,linux-x64-musl,linux-x64-glibc217 # Only the x64 Linux slots exist here, so the template is built for those two, and # glibc217 is staged beside its base. - uses: ./.github/actions/build-mobile-web-bundle - name: Build the orcad template - run: node config/scripts/build-orcad-template.mjs --targets linux-x64-glibc,linux-x64-musl + run: node config/scripts/orcad-distribution/template/build-orcad-template.mjs --targets linux-x64-glibc,linux-x64-musl - name: Run the hostile-host matrix env: ORCA_RUN_SSH_HOSTILE_HOSTS: '1' @@ -240,7 +243,7 @@ jobs: pnpm build:orcad-prebuilds pnpm build:orcad-prebuilds --require-slots ${{ matrix.target }} pnpm build:orcad-prebuilds --smoke - node config/scripts/build-orcad-template.mjs --targets ${{ matrix.target }} + node config/scripts/orcad-distribution/template/build-orcad-template.mjs --targets ${{ matrix.target }} - name: Run the macOS hostile-host cell env: ORCA_RUN_SSH_HOSTILE_HOSTS: '1' diff --git a/.github/workflows/ssh-windows-hosts.yml b/.github/workflows/ssh-windows-hosts.yml index e34a3183812..93b7ef1f134 100644 --- a/.github/workflows/ssh-windows-hosts.yml +++ b/.github/workflows/ssh-windows-hosts.yml @@ -24,22 +24,26 @@ on: - 'src/shared/node-runtime-pin.ts' - 'src/shared/orcad-artifacts.ts' - 'config/scripts/build-orcad-*.mjs' + - 'config/scripts/orcad-distribution/prebuilds/build-orcad-*.mjs' + - 'config/scripts/orcad-distribution/template/build-orcad-*.mjs' - 'config/scripts/orcad-prebuild-*.mjs' - - 'config/scripts/orcad-windows-process-tree.mjs' - - 'config/scripts/orcad-windows-cli-launcher.mjs' - - 'config/scripts/orcad-windows-security.mjs' - - 'config/scripts/build-windows-security-addon.mjs' + - 'config/scripts/orcad-distribution/prebuilds/orcad-prebuild-*.mjs' + - 'config/scripts/orcad-distribution/server-bundle/orcad-windows-process-tree.mjs' + - 'config/scripts/orcad-distribution/server-bundle/orcad-windows-cli-launcher.mjs' + - 'config/scripts/orcad-distribution/server-bundle/orcad-windows-security.mjs' + - 'config/scripts/native-build/windows/build-windows-security-addon.mjs' - 'native/windows-security/**' - - 'config/scripts/build-windows-cli-launcher.mjs' - - 'config/scripts/windows-rust-executable-build.mjs' + - 'config/scripts/native-build/windows/build-windows-cli-launcher.mjs' + - 'config/scripts/native-build/windows/windows-rust-executable-build.mjs' - 'native/windows-cli-launcher/**' - 'src/main/orcad/orcad-cli-launcher.ts' - '.github/actions/prepare-windows-cli-launcher/**' - 'config/patches/node-pty*' - 'config/patches/@vscode__windows-process-tree*' - - 'config/scripts/build-windows-process-tree-addon.mjs' + - 'config/scripts/native-build/windows/build-windows-process-tree-addon.mjs' - 'config/scripts/windows-process-tree-prepared-addon*.mjs' - - 'config/scripts/windows-process-tree-gyp-rebuild.mjs' + - 'config/scripts/native-build/windows/windows-process-tree-prepared-addon*.mjs' + - 'config/scripts/native-build/windows/windows-process-tree-gyp-rebuild.mjs' - 'src/shared/windows-breakaway-launch*.ts' - 'src/main/ipc/ssh/ssh-host-server-*.ts' # The deploy runs over this SSH transport. @@ -61,7 +65,7 @@ on: - '.github/workflows/ssh-windows-hosts.yml' - '.github/actions/prepare-orcad-prebuilds/**' - '.github/actions/restore-pnpm-verification/**' - - 'config/scripts/orcad-windows-prebuild-cache.mjs' + - 'config/scripts/orcad-distribution/prebuilds/orcad-windows-prebuild-cache.mjs' workflow_dispatch: inputs: cells: @@ -181,7 +185,7 @@ jobs: if [ "$REUSE_PREPARED_RUNTIME" = true ]; then reuse_args+=(--reuse-prepared-runtime) fi - node config/scripts/build-windows-process-tree-addon.mjs --arch=${{ matrix.arch }} "${reuse_args[@]}" + node config/scripts/native-build/windows/build-windows-process-tree-addon.mjs --arch=${{ matrix.arch }} "${reuse_args[@]}" - uses: ./.github/actions/prepare-orcad-prebuilds with: resolve-windows-cache: ${{ github.event_name == 'pull_request' }} @@ -200,14 +204,14 @@ jobs: if: steps.mobile-bundle.outcome != 'success' - name: Verify the mobile bundle before staging it shell: bash - run: node -e "require('./config/scripts/verify-packaged-mobile-web-bundle.cjs').assertMobileWebBundleBuilt()" + run: node -e "require('./config/scripts/desktop-distribution/runtime-verification/verify-packaged-mobile-web-bundle.cjs').assertMobileWebBundleBuilt()" - name: Build the win32 template shell: bash env: ORCA_REUSE_PREPARED_WINDOWS_SECURITY: ${{ github.event_name == 'pull_request' && steps.dependencies.outcome == 'success' }} run: | pnpm build:orcad-prebuilds --require-slots "win32-${{ matrix.arch }}" - node config/scripts/build-orcad-template.mjs --targets "win32-${{ matrix.arch }}" + node config/scripts/orcad-distribution/template/build-orcad-template.mjs --targets "win32-${{ matrix.arch }}" - wait: inbox-capability - name: Prepare the Windows inbox SSH capability after the builds if: ${{ matrix.server == 'inbox' && matrix.arch == 'arm64' && env.INBOX_PREPARATION_MODE == 'serial' }} diff --git a/.github/workflows/terminal-perf.yml b/.github/workflows/terminal-perf.yml index 6d46bc984e3..11f6a492667 100644 --- a/.github/workflows/terminal-perf.yml +++ b/.github/workflows/terminal-perf.yml @@ -86,7 +86,9 @@ jobs: const action = fs.existsSync(actionPath) ? fs.readFileSync(actionPath, 'utf8') : '' const inputs = action.split(/^inputs:[ \t]*\r?$/m)[1]?.split(/^\S/m)[0] ?? '' const supportedPostinstalls = [ + 'node config/scripts/native-build/node-addons/rebuild-native-deps.mjs', 'node config/scripts/rebuild-native-deps.mjs', + 'pnpm run build:packages && node config/scripts/native-build/node-addons/rebuild-native-deps.mjs', 'pnpm run build:packages && node config/scripts/rebuild-native-deps.mjs' ] const supportedRunner = process.env.RUNNER_KIND === 'github-hosted' || @@ -98,7 +100,7 @@ jobs: supportedPostinstalls.includes(manifest.scripts?.postinstall) && /^ native-runtime:/m.test(inputs) && /^ cache-pnpm-store-lookup-only:/m.test(inputs) && fs.existsSync('.github/actions/prepare-native-runtime/action.yml') && - fs.existsSync('config/scripts/ensure-native-runtime.mjs') + (fs.existsSync('config/scripts/native-build/node-addons/ensure-native-runtime.mjs') || fs.existsSync('config/scripts/ensure-native-runtime.mjs')) fs.appendFileSync(process.env.GITHUB_OUTPUT, `shared=${shared}\n`) NODE diff --git a/.github/workflows/unit-plan.yml b/.github/workflows/unit-plan.yml index 4c1fddbc7a9..f2a88bd2b97 100644 --- a/.github/workflows/unit-plan.yml +++ b/.github/workflows/unit-plan.yml @@ -38,7 +38,7 @@ jobs: - uses: actions/checkout@v6 with: fetch-depth: 2 - sparse-checkout: ${{ inputs.defer_shadow && '/config/scripts/ci-unit-matrix.mjs' || '' }} + sparse-checkout: ${{ inputs.defer_shadow && '/config/scripts/ci/unit-selection/ci-unit-matrix.mjs' || '' }} sparse-checkout-cone-mode: false persist-credentials: false - uses: ./.github/actions/install-node-dependencies @@ -52,9 +52,9 @@ jobs: ORCA_UNIT_FULL_SHARD_COUNT: ${{ vars.ORCA_UNIT_FULL_SHARD_COUNT || '12' }} run: | if [ "$DEFER_SHADOW" = true ]; then - node config/scripts/ci-unit-matrix.mjs + node config/scripts/ci/unit-selection/ci-unit-matrix.mjs else - node config/scripts/ci-unit-plan.mjs + node config/scripts/ci/unit-selection/ci-unit-plan.mjs fi - uses: actions/upload-artifact@v7 if: env.DEFER_SHADOW != 'true' diff --git a/.github/workflows/unit-selection-evidence.yml b/.github/workflows/unit-selection-evidence.yml index 9979549a11e..0e2904021cb 100644 --- a/.github/workflows/unit-selection-evidence.yml +++ b/.github/workflows/unit-selection-evidence.yml @@ -21,7 +21,7 @@ jobs: - uses: actions/checkout@v6 with: fetch-depth: 2 - sparse-checkout: ${{ !inputs.rebuild_plan && '/config/scripts/ci-unit-selection-review.mjs' || '' }} + sparse-checkout: ${{ !inputs.rebuild_plan && '/config/scripts/ci/unit-selection/ci-unit-selection-review.mjs' || '' }} sparse-checkout-cone-mode: false persist-credentials: false - uses: ./.github/actions/install-node-dependencies @@ -32,7 +32,7 @@ jobs: ORCA_UNIT_SELECTION_MODE: shadow ORCA_PULL_REQUEST_DRAFT: ${{ github.event.pull_request.draft }} ORCA_UNIT_FULL_SHARD_COUNT: ${{ vars.ORCA_UNIT_FULL_SHARD_COUNT || '12' }} - run: node config/scripts/ci-unit-plan.mjs + run: node config/scripts/ci/unit-selection/ci-unit-plan.mjs - uses: actions/download-artifact@v8 with: pattern: unit-shard-node-*-attempt-${{ github.run_attempt }} @@ -48,7 +48,7 @@ jobs: const env = { ...process.env } delete env['INPUT_GITHUB-TOKEN'] const args = [ - 'config/scripts/ci-unit-selection-review.mjs', + 'config/scripts/ci/unit-selection/ci-unit-selection-review.mjs', 'unit-evidence' ] if (env.REBUILD_SELECTION_PLAN === 'true') args.push('ci-shards/unit-selection.json') diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index a9a0c49d77a..a9fedcc18d5 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -93,7 +93,7 @@ jobs: cache-electron-package: 'true' - name: Install Electron package binary for tests - run: node config/scripts/install-electron-package-binary.mjs + run: node config/scripts/electron-installation/platform-layout/install-electron-package-binary.mjs - name: Verify Blacksmith unit runner environment if: runner.os == 'Linux' && startsWith(inputs.runner, 'blacksmith-') @@ -112,7 +112,7 @@ jobs: ORCA_UNIT_SHARD_INDEX: ${{ matrix.shard.index }} ORCA_UNIT_SHARD_COUNT: ${{ matrix.shard.count }} ORCA_UNIT_CACHE_NAMESPACE: ${{ inputs.module_cache_namespace }} - run: node config/scripts/ci-unit-module-cache.mjs identity + run: node config/scripts/ci/unit-cache/ci-unit-module-cache.mjs identity # The key pins config, plugins, lockfile and runtimes; the newest producer for it wins. # Source edits are keyed per module by Vitest plus vitest-module-cache-resolution-key.ts. @@ -131,7 +131,7 @@ jobs: env: ORCA_UNIT_CACHE_RESTORE_HIT: ${{ steps.module-cache-restore.outputs.cache-matched-key != '' }} ORCA_UNIT_CACHE_MODE: ${{ inputs.module_cache }} - run: node config/scripts/ci-unit-module-cache.mjs prepare + run: node config/scripts/ci/unit-cache/ci-unit-module-cache.mjs prepare - uses: actions/download-artifact@v8 if: inputs.download_selection_plan @@ -145,8 +145,8 @@ jobs: continue-on-error: true run: >- node --input-type=module -e ' - import { discoverUnitFiles } from "./config/scripts/ci-unit-files.mjs"; - import { writeAssignment } from "./config/scripts/ci-shard-assignment.mjs"; + import { discoverUnitFiles } from "./config/scripts/ci/unit-selection/dependency-graph/ci-unit-files.mjs"; + import { writeAssignment } from "./config/scripts/ci/sharding/ci-shard-assignment.mjs"; writeAssignment("ci-shards/unit-discovery.json", { files: discoverUnitFiles() });' - name: Test shard @@ -158,7 +158,7 @@ jobs: run: | ORCA_SHARD_SOURCE_SHA="$(git rev-parse HEAD)" export ORCA_SHARD_SOURCE_SHA - node config/scripts/run-vitest.mjs run --config config/vitest.config.ts \ + node config/scripts/test-runtime/execution-policy/run-vitest.mjs run --config config/vitest.config.ts \ --shard=${{ matrix.shard.index }}/${{ matrix.shard.count }} \ ${{ inputs.runner == 'blacksmith-8vcpu-ubuntu-2404' && '--maxWorkers=8' || (runner.arch == 'ARM64' || inputs.runner == 'blacksmith-4vcpu-ubuntu-2404' || inputs.runner == 'ubuntu-24.04') && '--maxWorkers=4' || '' }} @@ -170,7 +170,7 @@ jobs: inputs.module_cache == 'cold' && (github.ref == 'refs/heads/main' && github.event_name != 'pull_request' || inputs.module_cache_seed && github.event_name == 'workflow_dispatch') - run: node config/scripts/ci-unit-module-cache.mjs seal + run: node config/scripts/ci/unit-cache/ci-unit-module-cache.mjs seal - name: Save unit module cache if: steps.module-cache-seal.outputs.ready == 'true' diff --git a/.github/workflows/win-crash-survival-e2e.yml b/.github/workflows/win-crash-survival-e2e.yml index a18a00c6489..0095a9d8116 100644 --- a/.github/workflows/win-crash-survival-e2e.yml +++ b/.github/workflows/win-crash-survival-e2e.yml @@ -119,7 +119,7 @@ jobs: - name: Build Windows installer (unsigned) if: steps.cache-installer.outputs.cache-hit != 'true' run: | - node config/scripts/ensure-native-runtime.mjs --runtime=electron + node config/scripts/native-build/node-addons/ensure-native-runtime.mjs --runtime=electron pnpm run build:desktop pnpm exec electron-builder --config config/electron-builder.config.cjs --win --publish never diff --git a/.github/workflows/win-orcad-serve-switch-e2e.yml b/.github/workflows/win-orcad-serve-switch-e2e.yml index 2ece63d61e7..a36e170843c 100644 --- a/.github/workflows/win-orcad-serve-switch-e2e.yml +++ b/.github/workflows/win-orcad-serve-switch-e2e.yml @@ -65,7 +65,7 @@ jobs: env: ORCA_REUSE_PREPARED_NATIVE_RUNTIME: '1' run: | - node config/scripts/ensure-native-runtime.mjs --runtime=electron + node config/scripts/native-build/node-addons/ensure-native-runtime.mjs --runtime=electron pnpm run build:desktop:ci pnpm exec electron-builder --config config/electron-builder.config.cjs --win --publish never @@ -83,9 +83,9 @@ jobs: env: ORCA_REUSE_PREPARED_WINDOWS_SECURITY: 'true' run: | - node config/scripts/ensure-native-runtime.mjs --runtime=node - node config/scripts/build-windows-process-tree-addon.mjs --arch=x64 --reuse-prepared-runtime - node config/scripts/build-orcad-template.mjs --targets win32-x64 + node config/scripts/native-build/node-addons/ensure-native-runtime.mjs --runtime=node + node config/scripts/native-build/windows/build-windows-process-tree-addon.mjs --arch=x64 --reuse-prepared-runtime + node config/scripts/orcad-distribution/template/build-orcad-template.mjs --targets win32-x64 - name: Switch serve hosts on the installed app's profile shell: bash diff --git a/.github/workflows/win-update-survival-e2e.yml b/.github/workflows/win-update-survival-e2e.yml index eab49d27f47..2207a3a9b8b 100644 --- a/.github/workflows/win-update-survival-e2e.yml +++ b/.github/workflows/win-update-survival-e2e.yml @@ -98,7 +98,7 @@ jobs: - name: Build Windows installer (unsigned) if: steps.cache-installer.outputs.cache-hit != 'true' run: | - node config/scripts/ensure-native-runtime.mjs --runtime=electron + node config/scripts/native-build/node-addons/ensure-native-runtime.mjs --runtime=electron pnpm run build:desktop pnpm exec electron-builder --config config/electron-builder.config.cjs --win --publish never diff --git a/.github/workflows/windows-native-preparation-benchmark.yml b/.github/workflows/windows-native-preparation-benchmark.yml index 8b98ae9f737..91a42724332 100644 --- a/.github/workflows/windows-native-preparation-benchmark.yml +++ b/.github/workflows/windows-native-preparation-benchmark.yml @@ -62,7 +62,7 @@ jobs: env: SOURCE_SHA: ${{ inputs.source_sha }} BENCHMARK_RUNNER: ${{ matrix.os }} - run: node config/scripts/benchmark-windows-native-preparation.mjs + run: node "$(if [ -f config/scripts/native-build/windows/benchmark-windows-native-preparation.mjs ]; then printf %s config/scripts/native-build/windows/benchmark-windows-native-preparation.mjs; else printf %s config/scripts/benchmark-windows-native-preparation.mjs; fi)" - name: Compare warm Windows security builds and qualify fallback if: inputs.comparison == 'windows-security' shell: bash diff --git a/.github/workflows/windows-signing-rehearsal.yml b/.github/workflows/windows-signing-rehearsal.yml index 86a553fc495..542b7ca1e10 100644 --- a/.github/workflows/windows-signing-rehearsal.yml +++ b/.github/workflows/windows-signing-rehearsal.yml @@ -113,7 +113,7 @@ jobs: # Keep capture under runner.temp; all-negation files would include checkout leftovers in app.asar. ORCA_WIN_UNINSTALLER_EXPORT_PATH: ${{ runner.temp }}\uninstaller-signing\unsigned\orca-uninstaller.exe run: | - node config/scripts/ensure-native-runtime.mjs --runtime=electron + node config/scripts/native-build/node-addons/ensure-native-runtime.mjs --runtime=electron if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } pnpm exec electron-builder --config config/electron-builder.config.cjs --win --publish never if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } @@ -248,7 +248,7 @@ jobs: # Recompute template checksums over the signed bytes, then verify the template as release-cut does. - name: Reseal the orcad template over its signed binaries - run: node config/scripts/packaged-orcad-template.cjs --reseal-signed dist/win-unpacked inner-signing-list.txt + run: node config/scripts/orcad-distribution/template/packaged-orcad-template.cjs --reseal-signed dist/win-unpacked inner-signing-list.txt - name: Restore signed uninstaller for the installer rebuild shell: pwsh diff --git a/.github/workflows/windows-typecheck-parity.yml b/.github/workflows/windows-typecheck-parity.yml index c007455460c..ef69eeab422 100644 --- a/.github/workflows/windows-typecheck-parity.yml +++ b/.github/workflows/windows-typecheck-parity.yml @@ -11,9 +11,9 @@ on: - 'config/.bun-version' - 'config/tsconfig*.json' - 'src/packages/process-host/tsconfig*.json' - - 'config/scripts/run-typecheck-projects-in-parallel.mjs' - - 'config/scripts/benchmark-preflight-compilers.mjs' - - 'config/scripts/preflight-benchmark-command.mjs' + - 'config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.mjs' + - 'config/scripts/preflight/benchmarks/benchmark-preflight-compilers.mjs' + - 'config/scripts/preflight/benchmarks/preflight-benchmark-command.mjs' - '.github/workflows/windows-typecheck-parity.yml' workflow_dispatch: @@ -45,7 +45,7 @@ jobs: bun-version-file: config/.bun-version no-cache: true - name: Compare compiler diagnostics and project file lists - run: node config/scripts/benchmark-preflight-compilers.mjs --parity-only + run: node config/scripts/preflight/benchmarks/benchmark-preflight-compilers.mjs --parity-only - uses: actions/upload-artifact@v7 if: always() with: diff --git a/.github/workflows/wsl-orcad-e2e.yml b/.github/workflows/wsl-orcad-e2e.yml index ffe4e4835c1..cf642fe79e1 100644 --- a/.github/workflows/wsl-orcad-e2e.yml +++ b/.github/workflows/wsl-orcad-e2e.yml @@ -106,7 +106,7 @@ jobs: run: | pnpm build:orcad-prebuilds pnpm build:orcad-prebuilds --require-slots linux-x64-glibc - node config/scripts/build-orcad-template.mjs --targets linux-x64-glibc + node config/scripts/orcad-distribution/template/build-orcad-template.mjs --targets linux-x64-glibc - uses: actions/upload-artifact@v7 with: name: wsl-orcad-template diff --git a/.gitignore b/.gitignore index 8377bb5d21c..7331f3a190a 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ dist-electron/ out/ /build/ release/ +!config/scripts/release/ native/**/.build/ native/windows-cli-launcher/target/ native/windows-agent-hook/target/ diff --git a/config/build-plugins/process-host-dev-rebuild.ts b/config/build-plugins/process-host-dev-rebuild.ts index 26237140cd3..c898d620ef6 100644 --- a/config/build-plugins/process-host-dev-rebuild.ts +++ b/config/build-plugins/process-host-dev-rebuild.ts @@ -5,7 +5,7 @@ import { basename, dirname, join, resolve } from 'node:path' import { runProcessSync } from '@orca/process-host' import type ts from 'typescript-api' import type { Plugin } from 'rolldown' -import { createWorkspaceSourceResolver } from '../scripts/workspace-source-exports.mjs' +import { createWorkspaceSourceResolver } from '../scripts/workspace/source-exports/workspace-source-exports.mjs' function configError(diagnostic: ts.Diagnostic, compiler: typeof ts): Error { return new Error(compiler.flattenDiagnosticMessageText(diagnostic.messageText, '\n')) diff --git a/config/build-plugins/sandboxed-script-bundles.ts b/config/build-plugins/sandboxed-script-bundles.ts index be3075bb3c7..217f2f42f15 100644 --- a/config/build-plugins/sandboxed-script-bundles.ts +++ b/config/build-plugins/sandboxed-script-bundles.ts @@ -1,6 +1,6 @@ import { resolve } from 'node:path' import { build, type Plugin } from 'vite' -import { verifySandboxPreloadImports } from '../scripts/sandbox-preload-imports.mjs' +import { verifySandboxPreloadImports } from '../scripts/desktop-build/output-contracts/sandbox-preload-imports.mjs' import { BROWSER_EXTENSION_CONTENT_SCRIPT_FILE, BROWSER_EXTENSION_WORKER_SHIM_FILE diff --git a/config/build-plugins/vite-cache-retention.ts b/config/build-plugins/vite-cache-retention.ts index ceacb107811..3d4611b45db 100644 --- a/config/build-plugins/vite-cache-retention.ts +++ b/config/build-plugins/vite-cache-retention.ts @@ -1,6 +1,6 @@ import { resolve } from 'node:path' import type { Plugin } from 'vite' -import { retainViteCache } from '../scripts/vite-cache-activity.mjs' +import { retainViteCache } from '../scripts/worktree-storage/vite-cache-activity.mjs' export function createViteCacheRetentionPlugin(cacheRoot = resolve('.cache/vite')): Plugin { return { diff --git a/config/ci/windows-ssh-provider/invoke-windows-host-cells.ps1 b/config/ci/windows-ssh-provider/invoke-windows-host-cells.ps1 index 94e17ff2e15..0483fc0d02a 100644 --- a/config/ci/windows-ssh-provider/invoke-windows-host-cells.ps1 +++ b/config/ci/windows-ssh-provider/invoke-windows-host-cells.ps1 @@ -64,7 +64,7 @@ function Invoke-AppCell($Account,[string]$Descriptor,[string]$Log,[string]$Spec, Rename-Item -LiteralPath 'out\orcad-template' -NewName 'orcad-template.convert-hidden' try { if(-not $script:electronBuilt){ - & node config/scripts/ensure-native-runtime.mjs --runtime=electron 2>&1 | Tee-Object -FilePath $Log | Out-Host + & node config/scripts/native-build/node-addons/ensure-native-runtime.mjs --runtime=electron 2>&1 | Tee-Object -FilePath $Log | Out-Host if($global:LASTEXITCODE -ne 0){Write-Host 'Switching native modules to Electron failed';return $global:LASTEXITCODE} & pnpm exec electron-vite build --mode e2e 2>&1 | Tee-Object -FilePath $Log -Append | Out-Host if($global:LASTEXITCODE -ne 0){Write-Host 'The e2e app build failed';return $global:LASTEXITCODE} diff --git a/config/electron-builder.config.cjs b/config/electron-builder.config.cjs index 97b12132415..7002385b7a2 100644 --- a/config/electron-builder.config.cjs +++ b/config/electron-builder.config.cjs @@ -5,17 +5,17 @@ const { MACOS_FOLDER_USAGE_DESCRIPTIONS, applyMacHelperFolderUsageDescriptions } = require('./scripts/macos-folder-usage-descriptions.cjs') -const electronBuilderNativeRebuild = require('./scripts/electron-builder-native-rebuild.cjs') +const electronBuilderNativeRebuild = require('./scripts/desktop-distribution/runtime-verification/electron-builder-native-rebuild.cjs') const { assertPackagedDaemonEntryExists, verifyPackagedDaemonEntryBoots, verifyPackagedMacTerminalHostBoots -} = require('./scripts/verify-packaged-daemon-entry.cjs') +} = require('./scripts/desktop-distribution/runtime-verification/verify-packaged-daemon-entry.cjs') const { buildMacTerminalHost, macTerminalHostSignIgnore, verifyMacTerminalHost -} = require('./scripts/macos-terminal-host-bundle.cjs') +} = require('./scripts/macos/terminal-host-bundle/macos-terminal-host-bundle.cjs') const { assertPackagedNativeVariantsInstalled, assertProcessHostOutputBuilt, @@ -26,24 +26,30 @@ const { const { assertNoWindowsExecutablesInRuntimeNodeModules } = require('./packaged-windows-only-runtime-files.cjs') -const { verifyLinuxGlibcFloor } = require('./scripts/verify-linux-glibc-floor.cjs') +const { + verifyLinuxGlibcFloor +} = require('./scripts/native-build/linux/verify-linux-glibc-floor.cjs') const { verifyPackagedWindowsAgentHook -} = require('./scripts/verify-packaged-windows-agent-hook.cjs') +} = require('./scripts/desktop-distribution/runtime-verification/verify-packaged-windows-agent-hook.cjs') const { ensureBundledWaylandClipboard, finalizePackagedWaylandClipboard } = require('./wayland-clipboard-resources.cjs') -const { writeMacBuildCompatibility } = require('./scripts/mac-build-compatibility.cjs') +const { + writeMacBuildCompatibility +} = require('./scripts/desktop-distribution/macos/mac-build-compatibility.cjs') const { MOBILE_WEB_BUNDLE_DIR, assertMobileWebBundleBuilt -} = require('./scripts/verify-packaged-mobile-web-bundle.cjs') -const { verifyPackagedPluginResources } = require('./scripts/verify-packaged-plugin-resources.cjs') +} = require('./scripts/desktop-distribution/runtime-verification/verify-packaged-mobile-web-bundle.cjs') +const { + verifyPackagedPluginResources +} = require('./scripts/desktop-distribution/runtime-verification/verify-packaged-plugin-resources.cjs') const { assertPackagedServeSelectionEntry, assertPackagedWebClient -} = require('./scripts/verify-packaged-serve-payload.cjs') +} = require('./scripts/desktop-distribution/runtime-verification/verify-packaged-serve-payload.cjs') const { assertBundledRipgrepInstalled, bundledRipgrepExtraResources, @@ -52,22 +58,24 @@ const { } = require('./bundled-ripgrep-resources.cjs') const { verifyPackagedWindowsNodePty -} = require('./scripts/verify-packaged-node-pty-job-ownership.cjs') +} = require('./scripts/desktop-distribution/runtime-verification/verify-packaged-node-pty-job-ownership.cjs') const { assertOrcadTemplateBuilt, finalizePackagedOrcadTemplate, orcadTemplateExtraResource, orcadTemplateNodeModulesExtraResource, orcadTemplateMacSignIgnore -} = require('./scripts/packaged-orcad-template.cjs') -const { verifySkillsCliRuntime } = require('./scripts/verify-skills-cli-runtime.cjs') +} = require('./scripts/orcad-distribution/template/packaged-orcad-template.cjs') +const { + verifySkillsCliRuntime +} = require('./scripts/runtime-verification/skills-cli/verify-skills-cli-runtime.cjs') const { assertNotDarkBuild } = require('./dark-build-switches.cjs') const { verifyStaticAppImagePackage } = require('./scripts/static-appimage-package-contract.cjs') const { appImageNodeRuntimeFpmArgs, placeAppImageNodeRuntime, verifyAppImageNodeRuntimeServesPty -} = require('./scripts/appimage-node-runtime.cjs') +} = require('./scripts/desktop-distribution/linux/appimage-node-runtime.cjs') const { signWindowsUninstallerViaSignPath } = require('./scripts/windows-uninstaller-signing.cjs') const { buildMacShipItScheduling } = require('./scripts/macos-shipit-scheduling.cjs') @@ -586,7 +594,9 @@ module.exports = { icon: 'resources/build/icon.icns', entitlements: 'resources/build/entitlements.mac.plist', entitlementsInherit: 'resources/build/entitlements.mac.plist', - ...(isMacRelease ? { sign: resolve(__dirname, 'scripts/sign-mac-app.mjs') } : {}), + ...(isMacRelease + ? { sign: resolve(__dirname, './scripts/desktop-distribution/macos/sign-mac-app.mjs') } + : {}), signIgnore: [ ...bundledRipgrepMacSignIgnore, ...orcadTemplateMacSignIgnore, diff --git a/config/flaky-test-pattern-baseline.txt b/config/flaky-test-pattern-baseline.txt index 12aa2ccee52..45cf1a73749 100644 --- a/config/flaky-test-pattern-baseline.txt +++ b/config/flaky-test-pattern-baseline.txt @@ -42,7 +42,7 @@ 1 test-no-in-test-import-actual:src/renderer/src/hooks/useIpcEvents-ssh-disconnect-cleanup.test.ts 1 test-no-in-test-import-actual:src/renderer/src/lib/agent-launch-caller-routing.test.ts 1 test-no-in-test-import-actual:tests/e2e/structured-agent-session-launch-admission.unit.test.ts -1 test-no-polling-loop:config/scripts/happy-dom-mutation-observer-retention.test.ts +1 test-no-polling-loop:config/scripts/test-runtime/dom/happy-dom-mutation-observer-retention.test.ts 1 test-no-polling-loop:config/scripts/mobile-web-app/mobile-web-app-frame-budget-sweep.test.ts 1 test-no-polling-loop:mobile/src/transport/rpc-client-live-recovery.test.ts 1 test-no-polling-loop:src/main/browser/cdp/transport/cdp-ws-proxy.test.ts @@ -424,7 +424,7 @@ 1 test-no-real-time-wait:tests/e2e/worktree-parent-reorder.spec.ts 1 test-no-real-time-wait:tests/e2e/wsl-host-fake-transport.spec.ts 1 test-no-wall-clock:config/scripts/github-opened-issue-repository.test.ts -1 test-no-wall-clock:config/scripts/reclaim-release-test-caches.test.ts +1 test-no-wall-clock:config/scripts/worktree-storage/reclaim-release-test-caches.test.ts 1 test-no-wall-clock:mobile/scripts/native-build-cache.test.ts 1 test-no-wall-clock:mobile/src/session/mobile-structured-send-new-action.test.ts 1 test-no-wall-clock:mobile/src/session/native-chat/transcript/use-mobile-native-chat-message-send.test.ts @@ -879,7 +879,7 @@ 2 test-no-polling-loop:tests/e2e/terminal-tab-switch-visual-restore.spec.ts 2 test-no-polling-loop:tests/e2e/terminal-tui-wheel-reports.spec.ts 2 test-no-polling-loop:tests/e2e/worktree-card-downward-drag.spec.ts -2 test-no-real-time-wait:config/scripts/happy-dom-mutation-observer-retention.test.ts +2 test-no-real-time-wait:config/scripts/test-runtime/dom/happy-dom-mutation-observer-retention.test.ts 2 test-no-real-time-wait:mobile/src/notifications/push-registration-cancellation.test.ts 2 test-no-real-time-wait:src/main/agent-hooks/server-transport-interference.test.ts 2 test-no-real-time-wait:src/main/ai-vault/scanners/opencode/sqlite/session-scanner-opencode-sqlite-scan-scope.test.ts @@ -1171,7 +1171,7 @@ 3 test-no-real-time-wait:tests/e2e/workspace-sleep-main-resume.spec.ts 3 test-no-real-time-wait:tests/e2e/worktree-switch-first-paint.spec.ts 3 test-no-real-time-wait:tests/e2e/worktree.spec.ts -3 test-no-wall-clock:config/scripts/reclaim-dev-electron-bundles.test.ts +3 test-no-wall-clock:config/scripts/worktree-storage/reclaim-dev-electron-bundles.test.ts 3 test-no-wall-clock:mobile/src/transport/mobile-relay-resume-director.test.ts 3 test-no-wall-clock:mobile/src/transport/rpc-client-live-recovery.test.ts 3 test-no-wall-clock:src/main/agent-hooks/server-ingest-structured-status.test.ts diff --git a/config/legacy-relay-compat-tags-baseline.txt b/config/legacy-relay-compat-tags-baseline.txt index 154c7f0355f..706eab2c627 100644 --- a/config/legacy-relay-compat-tags-baseline.txt +++ b/config/legacy-relay-compat-tags-baseline.txt @@ -1,8 +1,8 @@ # Files outside src/main/ssh/legacy-relay/ tagged COMPAT(legacy-relay-bridge). RATCHET: may only SHRINK. # Each tag marks code the relay retirement (2027-01-15) deletes or edits. # Prune: pnpm check:legacy-relay-fence-ratchet --prune -config/scripts/pr-code-change-scope.mjs -config/scripts/pr-e2e-source-routing.mjs +config/scripts/workflow/source-routing/pr-code-change-scope.mjs +config/scripts/workflow/source-routing/pr-e2e-source-routing.mjs src/main/ipc/ssh/ssh-connect-flow.ts src/main/ipc/ssh/ssh-host-server-connect.ts src/main/ipc/ssh/ssh-host-server-on-connect-wiring.test.ts diff --git a/config/main-sync-spawn-baseline.txt b/config/main-sync-spawn-baseline.txt index 697d04153f4..36abc38a42c 100644 --- a/config/main-sync-spawn-baseline.txt +++ b/config/main-sync-spawn-baseline.txt @@ -1,6 +1,6 @@ # Synchronous child-process launches in production src/main and src/shared, per file: uses of # execFileSync/spawnSync/execSync, runProcessSync and the repo sync wrappers listed in -# config/scripts/check-main-sync-spawn-ratchet.mjs (synchronous ACL rewrites and grants, which +# config/scripts/static-analysis/process-boundaries/check-main-sync-spawn-ratchet.mjs (synchronous ACL rewrites and grants, which # can block on a whole directory subtree). # Some entries run in the daemon or orcad process, or are test harnesses outside the test-path # conventions. This is a RATCHET: counts may only go DOWN. diff --git a/config/packaged-native-build-entries.cjs b/config/packaged-native-build-entries.cjs index c777bf87b62..8997ef75823 100644 --- a/config/packaged-native-build-entries.cjs +++ b/config/packaged-native-build-entries.cjs @@ -4,7 +4,7 @@ const { NATIVE_BUILD_PACKAGES, isNativeBuildEntryName, nativeBuildEntryName -} = require('./scripts/native-build-entry.cjs') +} = require('./scripts/native-build/node-addons/native-build-entry.cjs') // Normalize shared-store dev build/ to packaged build/Release, matching CI and daemon/mac terminal/job-ownership consumers (scripts/native-build-entry.cjs). function adoptPackagedNativeBuildEntries(resourcesDir, electronPlatformName, architecture) { diff --git a/config/packaged-runtime-node-modules.cjs b/config/packaged-runtime-node-modules.cjs index 087f190e059..34fa9e68a09 100644 --- a/config/packaged-runtime-node-modules.cjs +++ b/config/packaged-runtime-node-modules.cjs @@ -9,13 +9,16 @@ const { } = require('node:fs') const { dirname, join, resolve } = require('node:path') const { builtinModules, createRequire } = require('node:module') -const { PE_MACHINE, readPeMachine } = require('./scripts/windows-pe-machine.cjs') +const { + PE_MACHINE, + readPeMachine +} = require('./scripts/native-build/windows/windows-pe-machine.cjs') const { adoptPackagedNativeBuildEntries } = require('./packaged-native-build-entries.cjs') const { runtimePackageExcludeFilter } = require('./packaged-windows-only-runtime-files.cjs') const { NATIVE_BUILD_PACKAGES, TRANSIENT_NATIVE_BUILD_ENTRY_FILTER -} = require('./scripts/native-build-entry.cjs') +} = require('./scripts/native-build/node-addons/native-build-entry.cjs') const projectDir = resolve(__dirname, '..') const requireFromProject = createRequire(join(projectDir, 'package.json')) diff --git a/config/packaged-windows-only-runtime-files.cjs b/config/packaged-windows-only-runtime-files.cjs index c1920d55cec..83dbafeecf7 100644 --- a/config/packaged-windows-only-runtime-files.cjs +++ b/config/packaged-windows-only-runtime-files.cjs @@ -2,7 +2,7 @@ const { existsSync, readdirSync } = require('node:fs') const { join, relative } = require('node:path') -const { readPeMachine } = require('./scripts/windows-pe-machine.cjs') +const { readPeMachine } = require('./scripts/native-build/windows/windows-pe-machine.cjs') /** Files a runtime package publishes that no desktop package, or only Windows, loads. */ const RUNTIME_PACKAGE_EXCLUDED_FILES = { diff --git a/config/patches/xterm-upstream.json b/config/patches/xterm-upstream.json index dee30639017..9c42aaa9171 100644 --- a/config/patches/xterm-upstream.json +++ b/config/patches/xterm-upstream.json @@ -1,5 +1,5 @@ { - "$schemaNote": "Consumed by config/scripts/regenerate-xterm-patches.mjs. See docs/reference/xterm-patch-regeneration.md.", + "$schemaNote": "Consumed by config/scripts/terminal-dependencies/xterm-patches/regenerate-xterm-patches.mjs. See docs/reference/xterm-patch-regeneration.md.", "upstream": { "repository": "https://github.com/xtermjs/xterm.js.git", "commit": "08829c7eb6279dda2a9e86df901353a1a89858ca", diff --git a/config/path-literal-baseline.txt b/config/path-literal-baseline.txt index 3a2c5ca033b..753e979ec01 100644 --- a/config/path-literal-baseline.txt +++ b/config/path-literal-baseline.txt @@ -4,13 +4,13 @@ .github/workflows/agent-state-rules-publish.yml src/main/runtime/readiness-census .github/workflows/zcode-credential-contract.yml src/shared/windows-security-descriptor config/scripts/check-layout-writer-ratchets.mjs src/renderer/src/runtime/remote-workspace-frozen/ -config/scripts/pr-code-change-scope.mjs src/shared/agent-session-mutation-envelope -config/scripts/pr-code-change-scope.mjs src/shared/agent-session-provider-handle -config/scripts/pr-code-change-scope.mjs src/shared/agent-session-record -config/scripts/pr-code-change-scope.mjs src/shared/agent-session-resume-marker -config/scripts/pr-code-change-scope.mjs src/shared/agent-session-turn-record -config/scripts/pr-layout-oracle-route.mjs src/main/runtime/old-session-tabs-stream/ -config/scripts/pr-layout-oracle-route.mjs src/renderer/src/runtime/remote-workspace-frozen/ +config/scripts/workflow/source-routing/pr-code-change-scope.mjs src/shared/agent-session-mutation-envelope +config/scripts/workflow/source-routing/pr-code-change-scope.mjs src/shared/agent-session-provider-handle +config/scripts/workflow/source-routing/pr-code-change-scope.mjs src/shared/agent-session-record +config/scripts/workflow/source-routing/pr-code-change-scope.mjs src/shared/agent-session-resume-marker +config/scripts/workflow/source-routing/pr-code-change-scope.mjs src/shared/agent-session-turn-record +config/scripts/workflow/source-routing/pr-layout-oracle-route.mjs src/main/runtime/old-session-tabs-stream/ +config/scripts/workflow/source-routing/pr-layout-oracle-route.mjs src/renderer/src/runtime/remote-workspace-frozen/ config/scripts/run-daemon-shutdown-descendants-docker.mjs src/main/pty-descendant-exit-verification.ts config/scripts/run-daemon-shutdown-descendants-docker.mjs src/main/pty-descendant-fresh-table.ts config/scripts/run-daemon-shutdown-descendants-docker.mjs src/main/pty-descendant-termination.ts diff --git a/config/reliability-gates.jsonc b/config/reliability-gates.jsonc index 4755718fcb3..eef03cbfb40 100644 --- a/config/reliability-gates.jsonc +++ b/config/reliability-gates.jsonc @@ -89,7 +89,7 @@ "invariant": "The relocated Windows daemon must retain the registry package root JS and native binary independently of its install tree, reject incomplete source or mirror files, and preserve an existing mirror while repairing it.", "oracle": "Run the real package JS from the relocated entry after deleting the install tree, reach its native loader, refuse each missing source file before staging, and replace each incomplete mirror without deleting its sentinel. Pin the real package name against the Windows packaging allowlist. On Windows, read ProductName through the built native addon from the mirror.", "commands": [ - "ORCA_BACKGROUND_LAUNCH=1 pnpm test src/main/daemon/daemon-host-process-package.test.ts src/main/daemon/daemon-host-file-hash-cache.test.ts config/scripts/pr-code-change-scope.test.mjs config/scripts/package-electron-runtime-contract.test.mjs" + "ORCA_BACKGROUND_LAUNCH=1 pnpm test src/main/daemon/daemon-host-process-package.test.ts src/main/daemon/daemon-host-file-hash-cache.test.ts config/scripts/workflow/source-routing/pr-code-change-scope.test.mjs config/scripts/package-electron-runtime-contract.test.mjs" ], "testFiles": [ "src/main/daemon/daemon-host-process-package.test.ts", @@ -112,6 +112,7 @@ "runner": "local", "platform": "macos", "command": "ORCA_BACKGROUND_LAUNCH=1 pnpm test src/main/daemon/daemon-host-process-package.test.ts src/main/daemon/daemon-host-file-hash-cache.test.ts config/scripts/pr-code-change-scope.test.mjs config/scripts/package-electron-runtime-contract.test.mjs", + "currentCommand": "ORCA_BACKGROUND_LAUNCH=1 pnpm test src/main/daemon/daemon-host-process-package.test.ts src/main/daemon/daemon-host-file-hash-cache.test.ts config/scripts/workflow/source-routing/pr-code-change-scope.test.mjs config/scripts/package-electron-runtime-contract.test.mjs", "result": "passed", "durationSeconds": 1.1, "summary": "Gate files and packaging scope contracts: 76 tests passed in four files, one Windows native-read test skipped. Full daemon-host suite also passed 94 tests in eight files. Original implementation fails seven new registry regressions." @@ -9545,7 +9546,7 @@ "pnpm exec vitest run --config config/vitest.config.ts src/shared/claimed-agent-pty-owner.test.ts src/main/daemon/daemon-pty-adapter.test.ts src/main/runtime/orca-runtime-agent-session-operation.test.ts src/main/runtime/remote-agent-session-host-authority.integration.test.ts src/main/runtime/orca-runtime-terminal-retirement.test.ts src/renderer/src/components/terminal-pane/remote-runtime-pty-transport-host-session-launch.test.ts src/renderer/src/components/terminal-pane/remote-runtime-pty-transport-create-handoff.test.ts src/renderer/src/runtime/remote-runtime-session-tabs-inflight.test.ts src/renderer/src/runtime/web-runtime-session.test.ts", "pnpm exec vitest run --config config/vitest.config.ts tests/e2e/remote-terminal-tab-retirement.unit.test.ts", "pnpm run build:cli && pnpm run build:electron-vite && node config/scripts/remote-agent-session-authority-repro.mjs", - "node --check config/scripts/remote-agent-session-process-cleanup.mjs && node config/scripts/remote-agent-session-authority-repro.mjs", + "node --check config/scripts/development/remote-session-cleanup/remote-agent-session-process-cleanup.mjs && node config/scripts/remote-agent-session-authority-repro.mjs", "pnpm exec electron-vite build --mode e2e", "VITE_EXPOSE_STORE=true pnpm run build:web", "ORCA_E2E_WEB_CLIENT=1 SKIP_BUILD=1 pnpm exec playwright test tests/e2e/remote-agent-session-focus-authority.spec.ts --config tests/playwright.config.ts --project electron-headful --workers=1", @@ -9577,7 +9578,7 @@ "src/renderer/src/runtime/web-runtime-session.test.ts", "tests/e2e/remote-agent-session-focus-authority.spec.ts", "config/scripts/remote-agent-session-authority-repro.mjs", - "config/scripts/remote-agent-session-process-cleanup.mjs", + "config/scripts/development/remote-session-cleanup/remote-agent-session-process-cleanup.mjs", "tests/e2e/remote-terminal-tab-retirement.unit.test.ts", "src/main/runtime/orca-runtime.test.ts", "src/main/runtime/terminal-orphan-owner.test.ts", @@ -9673,7 +9674,7 @@ ] }, { - "file": "config/scripts/remote-agent-session-process-cleanup.mjs", + "file": "config/scripts/development/remote-session-cleanup/remote-agent-session-process-cleanup.mjs", "assertions": [ "isolated daemon roots and captured descendants are verified dead before profile PID records are removed" ] @@ -18189,13 +18190,13 @@ "commands": [ "gh workflow run windows-wsl-e2e.yml", "pnpm exec playwright test tests/e2e/golden-tab-bar-agent-launch.spec.ts tests/e2e/terminal-windows-shell-paste-ownership.spec.ts --config tests/playwright.config.ts --project=electron-headless --workers=1", - "node_modules/.bin/vitest run --config config/vitest.config.ts config/scripts/wsl-e2e-lane-contract.test.mjs config/scripts/verify-wsl-e2e-participation.test.mjs", + "node_modules/.bin/vitest run --config config/vitest.config.ts config/scripts/workflow/source-routing/wsl-e2e-lane-contract.test.mjs config/scripts/verify-wsl-e2e-participation.test.mjs", "gh run view 34031806291 --log" ], "testFiles": [ "tests/e2e/golden-tab-bar-agent-launch.spec.ts", "tests/e2e/terminal-windows-shell-paste-ownership.spec.ts", - "config/scripts/wsl-e2e-lane-contract.test.mjs", + "config/scripts/workflow/source-routing/wsl-e2e-lane-contract.test.mjs", "config/scripts/verify-wsl-e2e-participation.test.mjs" ], "assertionRefs": [ @@ -18274,11 +18275,11 @@ "gh workflow run packaged-browser-e2e.yml", "pnpm exec playwright test tests/e2e/packaged-mixed-version-browser-placement.spec.ts --config tests/playwright.config.ts --project=electron-headless --workers=1 --repeat-each=3 --retries=0", "gh run view 34069063016 --log", - "ORCA_BACKGROUND_LAUNCH=1 pnpm exec vitest run --config config/vitest.config.ts config/scripts/verify-packaged-browser-participation.test.mjs --maxWorkers=2 --reporter=dot" + "ORCA_BACKGROUND_LAUNCH=1 pnpm exec vitest run --config config/vitest.config.ts config/scripts/desktop-distribution/runtime-verification/verify-packaged-browser-participation.test.mjs --maxWorkers=2 --reporter=dot" ], "testFiles": [ "tests/e2e/packaged-mixed-version-browser-placement.spec.ts", - "config/scripts/verify-packaged-browser-participation.test.mjs" + "config/scripts/desktop-distribution/runtime-verification/verify-packaged-browser-participation.test.mjs" ], "assertionRefs": [ { @@ -18289,7 +18290,7 @@ ] }, { - "file": "config/scripts/verify-packaged-browser-participation.test.mjs", + "file": "config/scripts/desktop-distribution/runtime-verification/verify-packaged-browser-participation.test.mjs", "assertions": ["reject missing, substituted, skipped and retried scenarios"] } ], diff --git a/config/scripts/agent-lineage-cycle-cleanup-benchmark.mjs b/config/scripts/agent-lineage-cycle-cleanup-benchmark.mjs index 59f4e387beb..95c613b493e 100644 --- a/config/scripts/agent-lineage-cycle-cleanup-benchmark.mjs +++ b/config/scripts/agent-lineage-cycle-cleanup-benchmark.mjs @@ -4,7 +4,7 @@ import { execFileSync } from 'node:child_process' import { readFile } from 'node:fs/promises' import { performance } from 'node:perf_hooks' import { transform } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' const sourcePath = 'src/renderer/src/components/dashboard/agent-row-lineage-model.ts' const baseline = process.argv[2] ?? '20ab9950654' diff --git a/config/scripts/agent-lineage-reachability-benchmark.mjs b/config/scripts/agent-lineage-reachability-benchmark.mjs index 6d542367c18..ce7b97479f2 100644 --- a/config/scripts/agent-lineage-reachability-benchmark.mjs +++ b/config/scripts/agent-lineage-reachability-benchmark.mjs @@ -2,8 +2,8 @@ import assert from 'node:assert/strict' import { readFileSync } from 'node:fs' import { performance } from 'node:perf_hooks' import { transform } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' -import { summarizeBenchmarkSamples } from './benchmark-sample-summary.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' +import { summarizeBenchmarkSamples } from './performance/measurement/benchmark-sample-summary.mjs' // git show :src/renderer/src/components/dashboard/agent-row-lineage-model.ts | node config/scripts/agent-lineage-reachability-benchmark.mjs async function load(source) { diff --git a/config/scripts/agent-state-rules-bundle.mjs b/config/scripts/agent-state-rules-bundle.mjs index f6bcbd19e8d..9cde469f386 100644 --- a/config/scripts/agent-state-rules-bundle.mjs +++ b/config/scripts/agent-state-rules-bundle.mjs @@ -6,7 +6,7 @@ import { mkdtempSync, readFileSync, writeFileSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' import { pathToFileURL } from 'node:url' -import { agentStateRulesTag } from './release-tag-patterns.mjs' +import { agentStateRulesTag } from './release/versioning/release-tag-patterns.mjs' const RULES_DIR = join(import.meta.dirname, '..', '..', 'src/main/runtime/agent-state-rules') export const AGENT_STATE_RULES_ASSET = 'agent-state-rules.json' diff --git a/config/scripts/agent-state-rules-bundle.test.mjs b/config/scripts/agent-state-rules-bundle.test.mjs index 1413cc34368..67e01bcb80a 100644 --- a/config/scripts/agent-state-rules-bundle.test.mjs +++ b/config/scripts/agent-state-rules-bundle.test.mjs @@ -14,7 +14,7 @@ import { promoteAgentStateRules, publishAgentStateRules } from './agent-state-rules-bundle.mjs' -import { agentStateRulesTag } from './release-tag-patterns.mjs' +import { agentStateRulesTag } from './release/versioning/release-tag-patterns.mjs' const REPO = 'stablyai/orca' const NEXT = agentStateRulesTag(1, 'next') diff --git a/config/scripts/agent-typescript-lsp.mjs b/config/scripts/agent-typescript-lsp.mjs index 6e10603c4d2..5dd42232015 100644 --- a/config/scripts/agent-typescript-lsp.mjs +++ b/config/scripts/agent-typescript-lsp.mjs @@ -1,8 +1,11 @@ // Adapt TypeScript 7 pull diagnostics for agent clients that only accept publishDiagnostics. import { spawnProcess } from '@orca/process-host' import { fileURLToPath, pathToFileURL } from 'node:url' -import { resolveProjectCompilerInfo } from './run-typecheck-projects-in-parallel.mjs' -import { resolveTsrsLauncher, supportsTsrs } from './tsrs-typecheck-compiler.mjs' +import { resolveProjectCompilerInfo } from './typecheck/project-execution/run-typecheck-projects-in-parallel.mjs' +import { + resolveTsrsLauncher, + supportsTsrs +} from './typecheck/project-execution/tsrs-typecheck-compiler.mjs' const PULL_DEBOUNCE_MS = 100 const BRIDGE_ID_PREFIX = 'orca-diagnostics-' diff --git a/config/scripts/zip-extractor-command.test.mjs b/config/scripts/archives/platform-command/zip-extractor-command.test.mjs similarity index 96% rename from config/scripts/zip-extractor-command.test.mjs rename to config/scripts/archives/platform-command/zip-extractor-command.test.mjs index 939d6c44836..df80ea918b0 100644 --- a/config/scripts/zip-extractor-command.test.mjs +++ b/config/scripts/archives/platform-command/zip-extractor-command.test.mjs @@ -3,7 +3,10 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, describe, expect, it, vi } from 'vitest' import { runProcessSync } from '@orca/process-host' -import { getTarProgram, getZipExtractorCommand } from './zip-extractor-command.mjs' +import { + getTarProgram, + getZipExtractorCommand +} from '../../../../src/shared/zip-extractor-command.ts' const directories = [] afterEach(() => { diff --git a/config/scripts/shared-tree-publish.mjs b/config/scripts/artifact-storage/atomic-publication/shared-tree-publish.mjs similarity index 100% rename from config/scripts/shared-tree-publish.mjs rename to config/scripts/artifact-storage/atomic-publication/shared-tree-publish.mjs diff --git a/config/scripts/shared-tree-publish.test.mjs b/config/scripts/artifact-storage/atomic-publication/shared-tree-publish.test.mjs similarity index 100% rename from config/scripts/shared-tree-publish.test.mjs rename to config/scripts/artifact-storage/atomic-publication/shared-tree-publish.test.mjs diff --git a/config/scripts/space-sharing-copy.mjs b/config/scripts/artifact-storage/reflink-copy/space-sharing-copy.mjs similarity index 100% rename from config/scripts/space-sharing-copy.mjs rename to config/scripts/artifact-storage/reflink-copy/space-sharing-copy.mjs diff --git a/config/scripts/space-sharing-copy.test.ts b/config/scripts/artifact-storage/reflink-copy/space-sharing-copy.test.ts similarity index 100% rename from config/scripts/space-sharing-copy.test.ts rename to config/scripts/artifact-storage/reflink-copy/space-sharing-copy.test.ts diff --git a/config/scripts/ast-grep-gates.mjs b/config/scripts/ast-grep-gates.mjs index e604c6e5dbd..f5716de5aa0 100644 --- a/config/scripts/ast-grep-gates.mjs +++ b/config/scripts/ast-grep-gates.mjs @@ -7,7 +7,7 @@ import { AST_GREP_SCAN_PATHS, resolveAstGrepBinary, scanAstGrep -} from './ast-grep-scan.mjs' +} from './static-analysis/structural-scan/ast-grep-scan.mjs' import { main as checkFlakyTestPatterns } from './check-flaky-test-pattern-ratchet.mjs' const LINT_SEVERITIES = new Set(['error', 'warning']) diff --git a/config/scripts/audit-localization-coverage.mjs b/config/scripts/audit-localization-coverage.mjs index d5d77038268..d86d7065f38 100644 --- a/config/scripts/audit-localization-coverage.mjs +++ b/config/scripts/audit-localization-coverage.mjs @@ -5,7 +5,7 @@ import process from 'node:process' // TypeScript 7 is a native CLI; AST consumers still need the legacy JavaScript API. import ts from 'typescript-api' -import { isTestOnlySourcePath } from './test-only-source-path.mjs' +import { isTestOnlySourcePath } from './static-analysis/process-boundaries/test-only-source-path.mjs' const SOURCE_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.mts', '.cts']) const SKIP_PATH_PARTS = new Set(['.git', 'dist', 'node_modules', 'out', '__snapshots__', 'assets']) diff --git a/config/scripts/benchmark-windows-security-reuse.mjs b/config/scripts/benchmark-windows-security-reuse.mjs index 10e17b9757c..3813a547b5b 100644 --- a/config/scripts/benchmark-windows-security-reuse.mjs +++ b/config/scripts/benchmark-windows-security-reuse.mjs @@ -22,14 +22,22 @@ import { NODE_RUNTIME_ASSETS, NODE_RUNTIME_PIN } from '../../src/shared/node-run import { buildWindowsSecurityAddon, probeWindowsSecurityAddon -} from './build-windows-security-addon.mjs' -import { assertNoHeaderDownloads, treeDigest } from './benchmark-windows-native-preparation.mjs' -import { ensurePinnedNodeExecutable, preparePinnedNodeDir } from './pinned-node-downloads.mjs' -import { sha256Of } from './orcad-prebuild-slot-contents.mjs' -import { hash } from './windows-native-benchmark-observer.mjs' +} from './native-build/windows/build-windows-security-addon.mjs' +import { + assertNoHeaderDownloads, + treeDigest +} from './native-build/windows/benchmark-windows-native-preparation.mjs' +import { + ensurePinnedNodeExecutable, + preparePinnedNodeDir +} from './orcad-distribution/prebuilds/pinned-node-downloads.mjs' +import { sha256Of } from './orcad-distribution/prebuilds/orcad-prebuild-slot-contents.mjs' +import { hash } from './native-build/windows/windows-native-benchmark-observer.mjs' const ROOT = resolve(import.meta.dirname, '../..') -const { PE_MACHINE, readPeMachine } = createRequire(import.meta.url)('./windows-pe-machine.cjs') +const { PE_MACHINE, readPeMachine } = createRequire(import.meta.url)( + './native-build/windows/windows-pe-machine.cjs' +) const invalidCandidate = Buffer.from('orca-windows-security-qualification-invalid') const preparedPath = (root) => join(root, 'native/windows-security/build/Release/orca_windows_security.node') @@ -292,8 +300,8 @@ export async function benchmarkWindowsSecurityReuse( 'package.json', '.github/actions/prepare-native-runtime/action.yml', 'src/shared/node-runtime-pin.ts', - 'config/scripts/build-windows-security-addon.mjs', - 'config/scripts/ensure-native-runtime.mjs', + 'config/scripts/native-build/windows/build-windows-security-addon.mjs', + 'config/scripts/native-build/node-addons/ensure-native-runtime.mjs', 'config/scripts/benchmark-windows-security-reuse.mjs' ] report.sourceHashes = Object.fromEntries( @@ -322,10 +330,10 @@ export async function benchmarkWindowsSecurityReuse( } report.headers = treeDigest(nodeDir) await command('prepare-node-artifacts', process.execPath, [ - join(root, 'config/scripts/initialize-windows-native-toolchain.mjs') + join(root, 'config/scripts/native-build/windows/initialize-windows-native-toolchain.mjs') ]) await command('verify-prepared-node', process.execPath, [ - join(root, 'config/scripts/ensure-native-runtime.mjs'), + join(root, 'config/scripts/native-build/node-addons/ensure-native-runtime.mjs'), '--check-only' ]) report.stage = 'verify-prepared-candidate-ownership' @@ -370,7 +378,7 @@ export async function benchmarkWindowsSecurityReuse( } // Warm compiler discovery and local build inputs before measuring the pair. await command('warm-compiler-before-measurement', process.execPath, [ - join(root, 'config/scripts/build-windows-security-addon.mjs'), + join(root, 'config/scripts/native-build/windows/build-windows-security-addon.mjs'), `--arch=${arch}` ]) await sample('control') diff --git a/config/scripts/build-source-commit.mjs b/config/scripts/build-identity/build-source-commit.mjs similarity index 100% rename from config/scripts/build-source-commit.mjs rename to config/scripts/build-identity/build-source-commit.mjs diff --git a/config/scripts/build-mobile-web-app-bundle.mjs b/config/scripts/build/mobile-web-app/build-mobile-web-app-bundle.mjs similarity index 97% rename from config/scripts/build-mobile-web-app-bundle.mjs rename to config/scripts/build/mobile-web-app/build-mobile-web-app-bundle.mjs index 3c18940d007..136f6b90eab 100644 --- a/config/scripts/build-mobile-web-app-bundle.mjs +++ b/config/scripts/build/mobile-web-app/build-mobile-web-app-bundle.mjs @@ -1,6 +1,6 @@ import { readFile } from 'node:fs/promises' -import { readRouteSnapshot } from './mobile-web-app/mobile-web-app-route-snapshot.mjs' -import { MOBILE_WEB_APP_DEPENDENCY_PATH } from './mobile-web-app/mobile-web-app-bundle-dependencies.mjs' +import { readRouteSnapshot } from '../../mobile-web-app/mobile-web-app-route-snapshot.mjs' +import { MOBILE_WEB_APP_DEPENDENCY_PATH } from '../../mobile-web-app/mobile-web-app-bundle-dependencies.mjs' import { existsSync, realpathSync } from 'node:fs' import { basename, extname, join, resolve } from 'node:path' import { createRequire } from 'node:module' @@ -15,26 +15,28 @@ import { writeMobileWebBundleTree, contentTypeForExtension } from './mobile-web-bundle-manifest.mjs' -import { isDirectInvocation } from './script-entry-detection.mjs' +import { isDirectInvocation } from '../../tool-invocation/script-entry-detection.mjs' import { ROUTE_SOURCE_LOADERS, assertRoutesCarryNoSynchronousExports, collectMobileWebAppRoutes, renderMobileWebAppRouteManifest, routePathnameFromKey -} from './mobile-web-app/mobile-web-app-route-manifest.mjs' +} from '../../mobile-web-app/mobile-web-app-route-manifest.mjs' import { MOBILE_WEB_PAGE_ROUTES } from './mobile-web-page-routes.mjs' -const projectDir = fileURLToPath(new URL('../..', import.meta.url)) +const projectDir = fileURLToPath(new URL('../../../..', import.meta.url)) const mobileDir = join(projectDir, 'mobile') const defaultAppDir = join(mobileDir, 'app') const entryPoint = join(mobileDir, 'web-entry', 'index.tsx') // Use packager guard’s output directory or independent constants can drift into missing packaged bundles. const { MOBILE_WEB_BUNDLE_DIR: defaultOutDir } = createRequire(import.meta.url)( - './verify-packaged-mobile-web-bundle.cjs' + '../../desktop-distribution/runtime-verification/verify-packaged-mobile-web-bundle.cjs' ) // The desktop serves this page, so a dark switch the desktop was built with reaches it too. -const { turnedOnDarkBuildDefines } = createRequire(import.meta.url)('../dark-build-switches.cjs') +const { turnedOnDarkBuildDefines } = createRequire(import.meta.url)( + '../../../dark-build-switches.cjs' +) // Tie each Metro/RN-Web shim to the option implementing it so missing options fail with the shim’s name. export const MOBILE_WEB_APP_SHIMS = [ diff --git a/config/scripts/build-mobile-web-app-bundle.test.mjs b/config/scripts/build/mobile-web-app/build-mobile-web-app-bundle.test.mjs similarity index 97% rename from config/scripts/build-mobile-web-app-bundle.test.mjs rename to config/scripts/build/mobile-web-app/build-mobile-web-app-bundle.test.mjs index 7bd1607c738..b1378728fc5 100644 --- a/config/scripts/build-mobile-web-app-bundle.test.mjs +++ b/config/scripts/build/mobile-web-app/build-mobile-web-app-bundle.test.mjs @@ -7,7 +7,7 @@ import { readAppBundle, readWrittenBundle, copyWrittenBundle -} from './mobile-web-app/mobile-web-app-bundle-test-fixture.mjs' +} from '../../mobile-web-app/mobile-web-app-bundle-test-fixture.mjs' import { bundleMobileWebApp, buildMobileWebAppBundle, @@ -15,7 +15,7 @@ import { renameOutputsByContent, routeChunkNames } from './build-mobile-web-app-bundle.mjs' -import { MOBILE_WEB_APP_ROUTE_ROOT } from './mobile-web-app/mobile-web-app-route-manifest.mjs' +import { MOBILE_WEB_APP_ROUTE_ROOT } from '../../mobile-web-app/mobile-web-app-route-manifest.mjs' import { MOBILE_WEB_APP_BUNDLE_MAX_ENTRY_BYTES, MOBILE_WEB_APP_BUNDLE_MAX_TOTAL_BYTES, @@ -35,10 +35,10 @@ import { sha256Hex, writeMobileWebBundleTree } from './mobile-web-bundle-manifest.mjs' -import { MOBILE_WEB_BUNDLE_MAX_ASSETS } from '../../src/shared/mobile-web-bundle/manifest-contract.js' -import { mobileWebAppDependenciesPresent } from './mobile-web-app/mobile-web-app-bundle-dependencies.mjs' +import { MOBILE_WEB_BUNDLE_MAX_ASSETS } from '../../../../src/shared/mobile-web-bundle/manifest-contract.js' +import { mobileWebAppDependenciesPresent } from '../../mobile-web-app/mobile-web-app-bundle-dependencies.mjs' -const projectDir = fileURLToPath(new URL('../..', import.meta.url)) +const projectDir = fileURLToPath(new URL('../../../..', import.meta.url)) // Root shards lack mobile deps; real bundling tests run in mobile_web_app CI job. const bundles = mobileWebAppDependenciesPresent() diff --git a/config/scripts/mobile-entry-static-closure.test.mjs b/config/scripts/build/mobile-web-app/mobile-entry-static-closure.test.mjs similarity index 100% rename from config/scripts/mobile-entry-static-closure.test.mjs rename to config/scripts/build/mobile-web-app/mobile-entry-static-closure.test.mjs diff --git a/config/scripts/mobile-web-bundle-fixture-tree.mjs b/config/scripts/build/mobile-web-app/mobile-web-bundle-fixture-tree.mjs similarity index 100% rename from config/scripts/mobile-web-bundle-fixture-tree.mjs rename to config/scripts/build/mobile-web-app/mobile-web-bundle-fixture-tree.mjs diff --git a/config/scripts/mobile-web-bundle-manifest.mjs b/config/scripts/build/mobile-web-app/mobile-web-bundle-manifest.mjs similarity index 97% rename from config/scripts/mobile-web-bundle-manifest.mjs rename to config/scripts/build/mobile-web-app/mobile-web-bundle-manifest.mjs index 82cc30df6cd..60f9d55d091 100644 --- a/config/scripts/mobile-web-bundle-manifest.mjs +++ b/config/scripts/build/mobile-web-app/mobile-web-bundle-manifest.mjs @@ -4,9 +4,9 @@ import { createRequire } from 'node:module' import { join } from 'node:path' import { fileURLToPath } from 'node:url' -const { darkBuildMarkers } = createRequire(import.meta.url)('../dark-build-switches.cjs') +const { darkBuildMarkers } = createRequire(import.meta.url)('../../../dark-build-switches.cjs') -const projectDir = fileURLToPath(new URL('../..', import.meta.url)) +const projectDir = fileURLToPath(new URL('../../../..', import.meta.url)) export const MOBILE_WEB_BUNDLE_SCHEMA_VERSION = 1 export const MOBILE_WEB_BUNDLE_ENTRYPOINT = 'index.html' diff --git a/config/scripts/mobile-web-bundle-manifest.test.mjs b/config/scripts/build/mobile-web-app/mobile-web-bundle-manifest.test.mjs similarity index 98% rename from config/scripts/mobile-web-bundle-manifest.test.mjs rename to config/scripts/build/mobile-web-app/mobile-web-bundle-manifest.test.mjs index 65642b10ee1..8889b6a3f31 100644 --- a/config/scripts/mobile-web-bundle-manifest.test.mjs +++ b/config/scripts/build/mobile-web-app/mobile-web-bundle-manifest.test.mjs @@ -14,7 +14,7 @@ import { import { MOBILE_WEB_PAGE_VERSION, MobileWebBundleManifestSchema -} from '../../src/shared/mobile-web-bundle/manifest-contract.js' +} from '../../../../src/shared/mobile-web-bundle/manifest-contract.js' describe('computeMobileWebBundleBuildId', () => { const assets = [ diff --git a/config/scripts/mobile-web-bundle-serializer-parity.test.mjs b/config/scripts/build/mobile-web-app/mobile-web-bundle-serializer-parity.test.mjs similarity index 95% rename from config/scripts/mobile-web-bundle-serializer-parity.test.mjs rename to config/scripts/build/mobile-web-app/mobile-web-bundle-serializer-parity.test.mjs index 56c981486b6..e2befb4a061 100644 --- a/config/scripts/mobile-web-bundle-serializer-parity.test.mjs +++ b/config/scripts/build/mobile-web-app/mobile-web-bundle-serializer-parity.test.mjs @@ -11,10 +11,12 @@ import { computeMobileWebBundleId, MobileWebBundleManifestSchema, serializeMobileWebBundleAssets as serializeInContract -} from '../../src/shared/mobile-web-bundle/manifest-contract' +} from '../../../../src/shared/mobile-web-bundle/manifest-contract' const require = createRequire(import.meta.url) -const { serializeAssets: serializeInGuard } = require('./verify-packaged-mobile-web-bundle.cjs') +const { + serializeAssets: serializeInGuard +} = require('../../desktop-distribution/runtime-verification/verify-packaged-mobile-web-bundle.cjs') const digest = (hex) => `${hex}`.padStart(64, '0') diff --git a/config/scripts/mobile-web-page-routes.mjs b/config/scripts/build/mobile-web-app/mobile-web-page-routes.mjs similarity index 100% rename from config/scripts/mobile-web-page-routes.mjs rename to config/scripts/build/mobile-web-app/mobile-web-page-routes.mjs diff --git a/config/scripts/mobile-web-page-routes.test.mjs b/config/scripts/build/mobile-web-app/mobile-web-page-routes.test.mjs similarity index 96% rename from config/scripts/mobile-web-page-routes.test.mjs rename to config/scripts/build/mobile-web-app/mobile-web-page-routes.test.mjs index 5ef45bb3a0d..9213e12c523 100644 --- a/config/scripts/mobile-web-page-routes.test.mjs +++ b/config/scripts/build/mobile-web-app/mobile-web-page-routes.test.mjs @@ -3,10 +3,10 @@ import { MOBILE_WEB_BUNDLE_MAX_GRANTED_ROUTE_GRANTS, MOBILE_WEB_BUNDLE_MAX_ROUTE_GRANTS, MobileWebBundleRouteSchema -} from '../../src/shared/mobile-web-bundle/manifest-contract.ts' +} from '../../../../src/shared/mobile-web-bundle/manifest-contract.ts' import { resolveMobileWebPageRoutes } from './build-mobile-web-app-bundle.mjs' import { MOBILE_WEB_PAGE_ROUTES } from './mobile-web-page-routes.mjs' -import { routePathnameFromKey } from './mobile-web-app/mobile-web-app-route-manifest.mjs' +import { routePathnameFromKey } from '../../mobile-web-app/mobile-web-app-route-manifest.mjs' // Test declared screens separately from bundle mechanics so route inventory can grow without coupling builder test size. diff --git a/config/scripts/mobile-web-source-line-endings.mjs b/config/scripts/build/mobile-web-app/mobile-web-source-line-endings.mjs similarity index 100% rename from config/scripts/mobile-web-source-line-endings.mjs rename to config/scripts/build/mobile-web-app/mobile-web-source-line-endings.mjs diff --git a/config/scripts/mobile-web-source-line-endings.test.mjs b/config/scripts/build/mobile-web-app/mobile-web-source-line-endings.test.mjs similarity index 98% rename from config/scripts/mobile-web-source-line-endings.test.mjs rename to config/scripts/build/mobile-web-app/mobile-web-source-line-endings.test.mjs index bd12390d940..a48023390e1 100644 --- a/config/scripts/mobile-web-source-line-endings.test.mjs +++ b/config/scripts/build/mobile-web-app/mobile-web-source-line-endings.test.mjs @@ -9,7 +9,7 @@ import { } from './mobile-web-source-line-endings.mjs' // Git-for-Windows defaults autocrlf=true; pin LF or same commit produces different bundle IDs and forces phone redownload. -const projectDir = resolve(import.meta.dirname, '../..') +const projectDir = resolve(import.meta.dirname, '../../../..') const PAGE_SOURCE_TREES = ['mobile/src', 'mobile/app', 'mobile/web-entry'] function git(args) { diff --git a/config/scripts/verify-mobile-web-app-bundle.mjs b/config/scripts/build/mobile-web-app/verify-mobile-web-app-bundle.mjs similarity index 97% rename from config/scripts/verify-mobile-web-app-bundle.mjs rename to config/scripts/build/mobile-web-app/verify-mobile-web-app-bundle.mjs index 4fb98c68d63..9f93fe0331f 100644 --- a/config/scripts/verify-mobile-web-app-bundle.mjs +++ b/config/scripts/build/mobile-web-app/verify-mobile-web-app-bundle.mjs @@ -4,14 +4,14 @@ import { join } from 'node:path' import { fileURLToPath } from 'node:url' import * as esbuild from 'esbuild' import { buildMobileWebAppBundle } from './build-mobile-web-app-bundle.mjs' -import { isDirectInvocation } from './script-entry-detection.mjs' +import { isDirectInvocation } from '../../tool-invocation/script-entry-detection.mjs' import { assertNoCarriageReturnsInSource } from './mobile-web-source-line-endings.mjs' import { MOBILE_WEB_BUNDLE_DIR as defaultBundleDir, assertMobileWebBundleBuilt -} from './verify-packaged-mobile-web-bundle.cjs' +} from '../../desktop-distribution/runtime-verification/verify-packaged-mobile-web-bundle.cjs' -const projectDir = fileURLToPath(new URL('../..', import.meta.url)) +const projectDir = fileURLToPath(new URL('../../../..', import.meta.url)) const manifestContract = join( projectDir, 'src', diff --git a/config/scripts/capture-agent-pty-transcript.mjs b/config/scripts/capture-agent-pty-transcript.mjs index 4c5ec1355d1..6891f537827 100644 --- a/config/scripts/capture-agent-pty-transcript.mjs +++ b/config/scripts/capture-agent-pty-transcript.mjs @@ -159,7 +159,7 @@ async function runCapture(options, command) { const pty = await import('node-pty').catch((error) => { console.error( `node-pty failed to load. Build it for plain node first: - node config/scripts/ensure-native-runtime.mjs --runtime=node + node config/scripts/native-build/node-addons/ensure-native-runtime.mjs --runtime=node ${String(error)}` ) return null diff --git a/config/scripts/capture-live-input-lag.mjs b/config/scripts/capture-live-input-lag.mjs index d2282d961d0..e3fadbdf8a3 100644 --- a/config/scripts/capture-live-input-lag.mjs +++ b/config/scripts/capture-live-input-lag.mjs @@ -4,7 +4,7 @@ import { join } from 'node:path' import { startRendererTimingProbe, stopRendererTimingProbe -} from './idle-cpu-renderer-timing-probe.mjs' +} from './performance/idle-cpu/idle-cpu-renderer-timing-probe.mjs' // Called with an already-attached main Orca page; never launches, focuses, or reloads it. export async function captureLiveInputLag(page, durationMs = 30_000) { diff --git a/config/scripts/check-compat-boundary-imports.mjs b/config/scripts/check-compat-boundary-imports.mjs index 34780698e59..e032d6ed0da 100644 --- a/config/scripts/check-compat-boundary-imports.mjs +++ b/config/scripts/check-compat-boundary-imports.mjs @@ -1,8 +1,8 @@ import path from 'node:path' import { pathToFileURL } from 'node:url' -import { collectProcessHostSources } from './check-process-host-imports.mjs' -import { collectModuleSpecifiers } from './static-module-specifiers.mjs' -import { isTestOnlySourcePath } from './test-only-source-path.mjs' +import { collectProcessHostSources } from './static-analysis/process-boundaries/check-process-host-imports.mjs' +import { collectModuleSpecifiers } from './static-analysis/module-requests/static-module-specifiers.mjs' +import { isTestOnlySourcePath } from './static-analysis/process-boundaries/test-only-source-path.mjs' // Legacy folders are reachable only through listed entrypoints/importers, keeping removal confined to those boundaries. export const COMPAT_FOLDERS = [ diff --git a/config/scripts/check-daemon-blocking-call-ratchet.mjs b/config/scripts/check-daemon-blocking-call-ratchet.mjs index f4a1628bc57..59bae96aa4c 100644 --- a/config/scripts/check-daemon-blocking-call-ratchet.mjs +++ b/config/scripts/check-daemon-blocking-call-ratchet.mjs @@ -1,8 +1,11 @@ import process from 'node:process' import { pathToFileURL } from 'node:url' -import { createGatedCallCollector } from './gated-call-use-collector.mjs' -import { readTrackedSources, runCountRatchet } from './ratchet-baseline.mjs' -import { isTestOnlySourcePath } from './test-only-source-path.mjs' +import { createGatedCallCollector } from './static-analysis/process-boundaries/gated-call-use-collector.mjs' +import { + readTrackedSources, + runCountRatchet +} from './static-analysis/ratchet-baseline/ratchet-baseline.mjs' +import { isTestOnlySourcePath } from './static-analysis/process-boundaries/test-only-source-path.mjs' // The terminal daemon and orcad serve every pane from one event loop; a blocking call there freezes all of them (#34410). diff --git a/config/scripts/check-daemon-protocol-crossing.mjs b/config/scripts/check-daemon-protocol-crossing.mjs index 5adef3fde4a..3fe478e02b0 100644 --- a/config/scripts/check-daemon-protocol-crossing.mjs +++ b/config/scripts/check-daemon-protocol-crossing.mjs @@ -9,7 +9,7 @@ import { canAttach, crossingRequirements, parseDaemonProtocolFacts -} from './daemon-protocol-facts.mjs' +} from './daemon-protocol/schema-facts/daemon-protocol-facts.mjs' import { selectLatestStableReleaseTag } from './stable-release-tags.mjs' // Same override the cross-version-wire harness honors, so both pair against one ref. diff --git a/config/scripts/check-daemon-protocol-crossing.test.mjs b/config/scripts/check-daemon-protocol-crossing.test.mjs index 727b8a59998..cbde38572e7 100644 --- a/config/scripts/check-daemon-protocol-crossing.test.mjs +++ b/config/scripts/check-daemon-protocol-crossing.test.mjs @@ -4,7 +4,7 @@ import { tmpdir } from 'node:os' import { dirname, join } from 'node:path' import { afterEach, describe, expect, it } from 'vitest' import { checkDaemonProtocolCrossing } from './check-daemon-protocol-crossing.mjs' -import { DAEMON_PROTOCOL_SOURCE_PATH } from './daemon-protocol-facts.mjs' +import { DAEMON_PROTOCOL_SOURCE_PATH } from './daemon-protocol/schema-facts/daemon-protocol-facts.mjs' import { selectLatestStableReleaseTag } from './stable-release-tags.mjs' const repos = [] diff --git a/config/scripts/check-dependency-security.mjs b/config/scripts/check-dependency-security.mjs index 57716d60a57..40327b118b1 100644 --- a/config/scripts/check-dependency-security.mjs +++ b/config/scripts/check-dependency-security.mjs @@ -7,7 +7,7 @@ import { evaluateSecurityAudit, securityExceptions } from './dependency-security-audit.mjs' -import { resolvePnpmCliInvocation } from './pnpm-cli-invocation.mjs' +import { resolvePnpmCliInvocation } from './tool-invocation/pnpm-cli-invocation.mjs' const ROOT = resolve(import.meta.dirname, '../..') diff --git a/config/scripts/check-direct-link-open-ratchet.mjs b/config/scripts/check-direct-link-open-ratchet.mjs index 32db0376203..91ee5b7a751 100644 --- a/config/scripts/check-direct-link-open-ratchet.mjs +++ b/config/scripts/check-direct-link-open-ratchet.mjs @@ -1,6 +1,9 @@ import process from 'node:process' import { pathToFileURL } from 'node:url' -import { readTrackedSources, runCountRatchet } from './ratchet-baseline.mjs' +import { + readTrackedSources, + runCountRatchet +} from './static-analysis/ratchet-baseline/ratchet-baseline.mjs' // Web links from Orca's UI go through openAppHttpLink so they honour the link setting (#28692). diff --git a/config/scripts/check-e2e-typecheck-ratchet.mjs b/config/scripts/check-e2e-typecheck-ratchet.mjs index 9a8f2302ccd..6bdc126b6dd 100644 --- a/config/scripts/check-e2e-typecheck-ratchet.mjs +++ b/config/scripts/check-e2e-typecheck-ratchet.mjs @@ -8,7 +8,7 @@ import { parseCountBaseline, pruneCountBaseline, totalCount -} from './ratchet-baseline.mjs' +} from './static-analysis/ratchet-baseline/ratchet-baseline.mjs' // Ratchet tests/ type errors downward: missing helpers otherwise hide until gated hosts run their specs (#30231). diff --git a/config/scripts/check-flaky-test-pattern-ratchet.mjs b/config/scripts/check-flaky-test-pattern-ratchet.mjs index 22ea110b140..fd82873f8ec 100644 --- a/config/scripts/check-flaky-test-pattern-ratchet.mjs +++ b/config/scripts/check-flaky-test-pattern-ratchet.mjs @@ -4,9 +4,12 @@ import { join } from 'node:path' import process from 'node:process' import { pathToFileURL } from 'node:url' import ts from 'typescript-api' -import { baseRuleId, scanAstGrep } from './ast-grep-scan.mjs' -import { resolvePullRequestDiffBase } from './git-pull-request-diff-base.mjs' -import { listTrackedFiles, runCountRatchet } from './ratchet-baseline.mjs' +import { baseRuleId, scanAstGrep } from './static-analysis/structural-scan/ast-grep-scan.mjs' +import { resolvePullRequestDiffBase } from './git/pr-diff-base/git-pull-request-diff-base.mjs' +import { + listTrackedFiles, + runCountRatchet +} from './static-analysis/ratchet-baseline/ratchet-baseline.mjs' // Count each flaky-test rule per file so fixing one pattern cannot pay for adding another. diff --git a/config/scripts/check-focus-read-ratchet.mjs b/config/scripts/check-focus-read-ratchet.mjs index c477f44c6bf..99485b9ef53 100644 --- a/config/scripts/check-focus-read-ratchet.mjs +++ b/config/scripts/check-focus-read-ratchet.mjs @@ -8,7 +8,7 @@ import { pruneCountBaseline, readTrackedSources, totalCount -} from './ratchet-baseline.mjs' +} from './static-analysis/ratchet-baseline/ratchet-baseline.mjs' // Count direct Active Server reads and discovered caller-returning wrappers so changing syntax cannot hide host-misrouting growth. // Route work by resource host; counts only decrease, and deleted helpers stay banned. diff --git a/config/scripts/check-host-list-render-ratchet.mjs b/config/scripts/check-host-list-render-ratchet.mjs index 53a26b8e8b3..b2a5157a4ef 100644 --- a/config/scripts/check-host-list-render-ratchet.mjs +++ b/config/scripts/check-host-list-render-ratchet.mjs @@ -1,6 +1,9 @@ import process from 'node:process' import { pathToFileURL } from 'node:url' -import { readTrackedSources, runCountRatchet } from './ratchet-baseline.mjs' +import { + readTrackedSources, + runCountRatchet +} from './static-analysis/ratchet-baseline/ratchet-baseline.mjs' // Ratchet direct host-row JSX downward: >10k imported SSH hosts once crashed renderer; use bounded searchable host-picker. diff --git a/config/scripts/check-id-only-store-write-ratchet.mjs b/config/scripts/check-id-only-store-write-ratchet.mjs index 93e760e174c..4246d8e9ffb 100644 --- a/config/scripts/check-id-only-store-write-ratchet.mjs +++ b/config/scripts/check-id-only-store-write-ratchet.mjs @@ -2,7 +2,10 @@ import fs from 'node:fs' import path from 'node:path' import process from 'node:process' import { pathToFileURL } from 'node:url' -import { readTrackedSources, runEntryRatchet } from './ratchet-baseline.mjs' +import { + readTrackedSources, + runEntryRatchet +} from './static-analysis/ratchet-baseline/ratchet-baseline.mjs' // Bare-ID writes can edit the wrong local/SSH twin; require RepoHostTarget/HostWorktreeTarget and allow counts only to decrease. // Match parameter names regardless of types; known limit: IDs inside object parameters are not detected. diff --git a/config/scripts/check-import-boundaries.mjs b/config/scripts/check-import-boundaries.mjs index 0e65411c699..f81d01f3327 100644 --- a/config/scripts/check-import-boundaries.mjs +++ b/config/scripts/check-import-boundaries.mjs @@ -3,9 +3,9 @@ import { pathToFileURL } from 'node:url' import { collectProcessHostSources, main as checkProcessHostImports -} from './check-process-host-imports.mjs' +} from './static-analysis/process-boundaries/check-process-host-imports.mjs' import { main as checkCompatBoundaryImports } from './check-compat-boundary-imports.mjs' -import { collectModuleSpecifiers } from './static-module-specifiers.mjs' +import { collectModuleSpecifiers } from './static-analysis/module-requests/static-module-specifiers.mjs' export function main( root = process.cwd(), diff --git a/config/scripts/check-import-boundaries.test.mjs b/config/scripts/check-import-boundaries.test.mjs index 2b1dd0f73ed..191942269a3 100644 --- a/config/scripts/check-import-boundaries.test.mjs +++ b/config/scripts/check-import-boundaries.test.mjs @@ -4,7 +4,7 @@ import { tmpdir } from 'node:os' import path from 'node:path' import { COMPAT_FOLDERS } from './check-compat-boundary-imports.mjs' import { main } from './check-import-boundaries.mjs' -import { collectModuleSpecifiers } from './static-module-specifiers.mjs' +import { collectModuleSpecifiers } from './static-analysis/module-requests/static-module-specifiers.mjs' const roots = [] afterEach(() => { diff --git a/config/scripts/check-layout-writer-ratchets.mjs b/config/scripts/check-layout-writer-ratchets.mjs index b47bc51145c..f1bd4d435b0 100644 --- a/config/scripts/check-layout-writer-ratchets.mjs +++ b/config/scripts/check-layout-writer-ratchets.mjs @@ -11,7 +11,7 @@ import { parseCountBaseline, pruneCountBaseline, totalCount -} from './ratchet-baseline.mjs' +} from './static-analysis/ratchet-baseline/ratchet-baseline.mjs' // Ratchet layout writers downward: main Store/session-partition writes and renderer layout/selection keys/spreads. // Exclude existing-entry content updates; shorthand counts only in store writes, and deleted symbols stay compiler-owned. diff --git a/config/scripts/check-legacy-relay-fence-ratchet.mjs b/config/scripts/check-legacy-relay-fence-ratchet.mjs index 313a88ba288..c74230791c4 100644 --- a/config/scripts/check-legacy-relay-fence-ratchet.mjs +++ b/config/scripts/check-legacy-relay-fence-ratchet.mjs @@ -1,8 +1,11 @@ import path from 'node:path' import process from 'node:process' import { pathToFileURL } from 'node:url' -import { readTrackedSources, runEntryRatchet } from './ratchet-baseline.mjs' -import { collectModuleSpecifiers } from './static-module-specifiers.mjs' +import { + readTrackedSources, + runEntryRatchet +} from './static-analysis/ratchet-baseline/ratchet-baseline.mjs' +import { collectModuleSpecifiers } from './static-analysis/module-requests/static-module-specifiers.mjs' // COMPAT(legacy-relay-bridge): retirement (2027-01-15) deletes LEGACY_FOLDER and edits its external importers/tagged seams; both lists may only shrink. diff --git a/config/scripts/check-max-lines-ratchet.mjs b/config/scripts/check-max-lines-ratchet.mjs index 30b9a1b57b8..ce776aeacc0 100644 --- a/config/scripts/check-max-lines-ratchet.mjs +++ b/config/scripts/check-max-lines-ratchet.mjs @@ -2,7 +2,10 @@ import fs from 'node:fs' import path from 'node:path' import process from 'node:process' import { pathToFileURL } from 'node:url' -import { readTrackedSources, runEntryRatchet } from './ratchet-baseline.mjs' +import { + readTrackedSources, + runEntryRatchet +} from './static-analysis/ratchet-baseline/ratchet-baseline.mjs' // Ratchet gate for the oxlint `max-lines` rule. // diff --git a/config/scripts/check-max-lines-ratchet.test.mjs b/config/scripts/check-max-lines-ratchet.test.mjs index a1202fa4ede..8853e1abe23 100644 --- a/config/scripts/check-max-lines-ratchet.test.mjs +++ b/config/scripts/check-max-lines-ratchet.test.mjs @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os' import { dirname, join, resolve } from 'node:path' import { afterEach, beforeEach, describe, expect, it } from 'vitest' import { runProcessSync } from '@orca/process-host' -import { resolveOxlintInvocation } from './oxlint-cli-invocation.mjs' +import { resolveOxlintInvocation } from './tool-invocation/oxlint-cli-invocation.mjs' import { collectCurrentSuppressions, diff --git a/config/scripts/check-memo-translate-subscription-ratchet.mjs b/config/scripts/check-memo-translate-subscription-ratchet.mjs index 0e91bbc882a..6c619bd36aa 100644 --- a/config/scripts/check-memo-translate-subscription-ratchet.mjs +++ b/config/scripts/check-memo-translate-subscription-ratchet.mjs @@ -1,6 +1,9 @@ import process from 'node:process' import { pathToFileURL } from 'node:url' -import { readTrackedSources, runEntryRatchet } from './ratchet-baseline.mjs' +import { + readTrackedSources, + runEntryRatchet +} from './static-analysis/ratchet-baseline/ratchet-baseline.mjs' // memo() blocks the parent re-render a language switch relies on, so a memoized component in a // translating file must subscribe itself or its labels stay in the previous language. diff --git a/config/scripts/check-node-runtime-pin.mjs b/config/scripts/check-node-runtime-pin.mjs index 58c51fe8064..242d401a8f3 100644 --- a/config/scripts/check-node-runtime-pin.mjs +++ b/config/scripts/check-node-runtime-pin.mjs @@ -5,7 +5,10 @@ import { readFileSync } from 'node:fs' import { createRequire } from 'node:module' import { join, resolve } from 'node:path' import { pathToFileURL } from 'node:url' -import { nodeDistArchiveName, windowsImportLibFile } from './node-dist-archive-name.mjs' +import { + nodeDistArchiveName, + windowsImportLibFile +} from './node-runtime/archive-identity/node-dist-archive-name.mjs' import { lockedVersion, lockfileRootImporter } from './pnpm-lockfile-root-importer.mjs' // require avoids MODULE_TYPELESS_PACKAGE_JSON from ESM-importing TS under typeless package.json. @@ -164,7 +167,7 @@ export function main(root = resolve(import.meta.dirname, '../..')) { console.error(`- ${problem}`) } console.error( - 'Regenerate with: node config/scripts/update-node-runtime-pin.mjs --version ' + 'Regenerate with: node config/scripts/node-runtime/archive-identity/update-node-runtime-pin.mjs --version ' ) return 1 } diff --git a/config/scripts/check-path-literal-ratchet.mjs b/config/scripts/check-path-literal-ratchet.mjs index 96c929c1071..2ff342aeb39 100644 --- a/config/scripts/check-path-literal-ratchet.mjs +++ b/config/scripts/check-path-literal-ratchet.mjs @@ -1,7 +1,11 @@ import process from 'node:process' import { pathToFileURL } from 'node:url' import { parse } from 'jsonc-parser' -import { listTrackedFiles, readTrackedSources, runEntryRatchet } from './ratchet-baseline.mjs' +import { + listTrackedFiles, + readTrackedSources, + runEntryRatchet +} from './static-analysis/ratchet-baseline/ratchet-baseline.mjs' // Ratchet stale src/... references in CI/workflows/e2e downward before folder moves can orphan routes, gate manifests or workflow paths. diff --git a/config/scripts/check-path-literal-ratchet.test.mjs b/config/scripts/check-path-literal-ratchet.test.mjs index f9cc2e66444..df2d66cbcdd 100644 --- a/config/scripts/check-path-literal-ratchet.test.mjs +++ b/config/scripts/check-path-literal-ratchet.test.mjs @@ -84,7 +84,9 @@ describe('stripSlashComments', () => { describe('isScannedPath', () => { it('skips unit tests, fixtures and generated timings, but scans e2e specs', () => { - expect(isScannedPath('config/scripts/pr-e2e-source-routing.mjs')).toBe(true) + expect(isScannedPath('config/scripts/workflow/source-routing/pr-e2e-source-routing.mjs')).toBe( + true + ) expect(isScannedPath('.github/workflows/pr.yml')).toBe(true) expect(isScannedPath('tests/e2e/ssh-orcad-terminal-journeys.spec.ts')).toBe(true) expect(isScannedPath('config/scripts/pr-e2e-source-routing.test.mjs')).toBe(false) diff --git a/config/scripts/check-react-doctor-changed.mjs b/config/scripts/check-react-doctor-changed.mjs index 8e27af3648d..d6a4c9bf37e 100644 --- a/config/scripts/check-react-doctor-changed.mjs +++ b/config/scripts/check-react-doctor-changed.mjs @@ -4,8 +4,11 @@ import path from 'node:path' import process from 'node:process' import { fileURLToPath, pathToFileURL } from 'node:url' import { isDeepStrictEqual } from 'node:util' -import { collectAddedLineRanges, overlapsAddedLines } from './check-changed-code-quality.mjs' -import { resolvePullRequestDiffBase } from './git-pull-request-diff-base.mjs' +import { + collectAddedLineRanges, + overlapsAddedLines +} from './preflight/changed-checks/check-changed-code-quality.mjs' +import { resolvePullRequestDiffBase } from './git/pr-diff-base/git-pull-request-diff-base.mjs' import { runAuditTool } from './run-audit-tool.mjs' const SOURCE_FILE_PATTERN = /\.(?:astro|tsx?|jsx?|mts|mjs|[hH][tT][mM][lL])$/ diff --git a/config/scripts/check-react-doctor-changed.test.mjs b/config/scripts/check-react-doctor-changed.test.mjs index d846ff28239..0081e0259e7 100644 --- a/config/scripts/check-react-doctor-changed.test.mjs +++ b/config/scripts/check-react-doctor-changed.test.mjs @@ -7,7 +7,7 @@ import path from 'node:path' import process from 'node:process' import { afterEach, describe, expect, it, vi } from 'vitest' import { main } from './check-react-doctor-changed.mjs' -import { collectAddedLineRanges } from './check-changed-code-quality.mjs' +import { collectAddedLineRanges } from './preflight/changed-checks/check-changed-code-quality.mjs' const repoRoot = path.resolve(import.meta.dirname, '..', '..') const script = path.join(repoRoot, 'config', 'scripts', 'check-react-doctor-changed.mjs') diff --git a/config/scripts/check-repo-host-read-ratchet.mjs b/config/scripts/check-repo-host-read-ratchet.mjs index 9b1538d5bbe..e794cc6a6ea 100644 --- a/config/scripts/check-repo-host-read-ratchet.mjs +++ b/config/scripts/check-repo-host-read-ratchet.mjs @@ -1,7 +1,10 @@ import process from 'node:process' import { pathToFileURL } from 'node:url' import { stripSlashComments } from './check-path-literal-ratchet.mjs' -import { readTrackedSources, runCountRatchet } from './ratchet-baseline.mjs' +import { + readTrackedSources, + runCountRatchet +} from './static-analysis/ratchet-baseline/ratchet-baseline.mjs' // Legacy repo.connectionId can misclassify executionHostId:'ssh:' as local; ratchet reads downward. // Lower bound: misses destructuring, indexed access, non-repo-named rows and renderer code. diff --git a/config/scripts/check-runtime-electron-ratchet.mjs b/config/scripts/check-runtime-electron-ratchet.mjs index 429ac3fbbbb..cdfe8f6ab9a 100644 --- a/config/scripts/check-runtime-electron-ratchet.mjs +++ b/config/scripts/check-runtime-electron-ratchet.mjs @@ -6,8 +6,11 @@ import { existsSync, readdirSync } from 'node:fs' import path from 'node:path' import { pathToFileURL } from 'node:url' import process from 'node:process' -import { isTestOnlyDirectoryName, isTestOnlySourcePath } from './test-only-source-path.mjs' -import { createWorkspaceSourceResolver } from './workspace-source-exports.mjs' +import { + isTestOnlyDirectoryName, + isTestOnlySourcePath +} from './static-analysis/process-boundaries/test-only-source-path.mjs' +import { createWorkspaceSourceResolver } from './workspace/source-exports/workspace-source-exports.mjs' // Resolve from module location: CI/editors may run outside root; cwd-relative paths previously caused ENOENT. const ROOT = path.join(import.meta.dirname, '..', '..') diff --git a/config/scripts/check-runtime-launcher-protocol-ratchet.mjs b/config/scripts/check-runtime-launcher-protocol-ratchet.mjs index 6b4d84adaa7..c7a79cb1af7 100644 --- a/config/scripts/check-runtime-launcher-protocol-ratchet.mjs +++ b/config/scripts/check-runtime-launcher-protocol-ratchet.mjs @@ -4,23 +4,26 @@ import { execFileSync } from 'node:child_process' import { readFileSync } from 'node:fs' import { join, resolve } from 'node:path' import { pathToFileURL } from 'node:url' -import { DAEMON_PROTOCOL_SOURCE_PATH, parseDaemonProtocolFacts } from './daemon-protocol-facts.mjs' +import { + DAEMON_PROTOCOL_SOURCE_PATH, + parseDaemonProtocolFacts +} from './daemon-protocol/schema-facts/daemon-protocol-facts.mjs' /** Files that decide which runtime executable launches orcad or the terminal daemon. */ export const RUNTIME_LAUNCHER_PATHS = [ // orcad handoff to its bundled runtime, and the pinned runtimes it can hand off to. 'src/main/orcad/orcad-bundled-runtime.ts', 'src/main/orcad/launcher.ts', - 'config/scripts/orcad-entry-build.mjs', + 'config/scripts/orcad-distribution/server-bundle/orcad-entry-build.mjs', 'src/shared/node-runtime-pin.ts', 'src/main/node-runtime/pinned-runtime-materializer.ts', 'src/main/node-runtime/runtime-archive-download.ts', 'src/main/managed-server/install/orcad-remote-node-runtime.ts', // orcad slot layout: which runtime file a packaged slot carries. 'src/shared/orcad-artifacts.ts', - 'config/scripts/build-orcad.mjs', - 'config/scripts/build-orcad-node.mjs', - 'config/scripts/build-orcad-template.mjs', + 'config/scripts/orcad-distribution/server-bundle/build-orcad.mjs', + 'config/scripts/orcad-distribution/prebuilds/build-orcad-node.mjs', + 'config/scripts/orcad-distribution/template/build-orcad-template.mjs', // Remote slot runtime selection. 'src/main/managed-server/install/orcad-remote-runtime.ts', // Terminal daemon host launch: which executable the daemon child is forked from. diff --git a/config/scripts/check-runtime-launcher-protocol-ratchet.test.mjs b/config/scripts/check-runtime-launcher-protocol-ratchet.test.mjs index fe02da446f9..58da9d2af18 100644 --- a/config/scripts/check-runtime-launcher-protocol-ratchet.test.mjs +++ b/config/scripts/check-runtime-launcher-protocol-ratchet.test.mjs @@ -10,8 +10,8 @@ import { checkRuntimeLauncherProtocolRatchet, isOverrideEnabled } from './check-runtime-launcher-protocol-ratchet.mjs' -import { DAEMON_PROTOCOL_SOURCE_PATH } from './daemon-protocol-facts.mjs' -import { classifyPrJobs } from './pr-code-change-scope.mjs' +import { DAEMON_PROTOCOL_SOURCE_PATH } from './daemon-protocol/schema-facts/daemon-protocol-facts.mjs' +import { classifyPrJobs } from './workflow/source-routing/pr-code-change-scope.mjs' const repoRoot = resolve(import.meta.dirname, '..', '..') const repos = [] diff --git a/config/scripts/check-test-file-runners.mjs b/config/scripts/check-test-file-runners.mjs index a3a1856a9a5..6dff7e14009 100644 --- a/config/scripts/check-test-file-runners.mjs +++ b/config/scripts/check-test-file-runners.mjs @@ -8,7 +8,7 @@ import process from 'node:process' import { pathToFileURL } from 'node:url' import ts from 'typescript-api' import { defaultExclude } from 'vitest/config' -import { UNIT_EXCLUDE, UNIT_INCLUDE } from './ci-unit-files.mjs' +import { UNIT_EXCLUDE, UNIT_INCLUDE } from './ci/unit-selection/dependency-graph/ci-unit-files.mjs' const VITEST_DEFAULT_INCLUDE = '**/*.{test,spec}.?(c|m)[jt]s?(x)' diff --git a/config/scripts/check-test-file-runners.test.mjs b/config/scripts/check-test-file-runners.test.mjs index c9a8da41011..ef6b3c202e3 100644 --- a/config/scripts/check-test-file-runners.test.mjs +++ b/config/scripts/check-test-file-runners.test.mjs @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest' import { findRunnerDrift, findUncollectedTestFiles } from './check-test-file-runners.mjs' -import { classifyPrJobs } from './pr-code-change-scope.mjs' +import { classifyPrJobs } from './workflow/source-routing/pr-code-change-scope.mjs' const RUNNERS = [ { name: 'unit', include: ['src/**/*.test.ts'], exclude: ['src/live/**'] }, diff --git a/config/scripts/check-ts-nocheck-ratchet.mjs b/config/scripts/check-ts-nocheck-ratchet.mjs index f0fbb3f222b..f5c2e69f73e 100644 --- a/config/scripts/check-ts-nocheck-ratchet.mjs +++ b/config/scripts/check-ts-nocheck-ratchet.mjs @@ -1,6 +1,9 @@ import process from 'node:process' import { pathToFileURL } from 'node:url' -import { readTrackedSources, runEntryRatchet } from './ratchet-baseline.mjs' +import { + readTrackedSources, + runEntryRatchet +} from './static-analysis/ratchet-baseline/ratchet-baseline.mjs' // Ratchet gate for the `@ts-nocheck` directive. // diff --git a/config/scripts/check-unproven-pty-retirement-ratchet.mjs b/config/scripts/check-unproven-pty-retirement-ratchet.mjs index bad1d3a42e5..5601be5fffb 100644 --- a/config/scripts/check-unproven-pty-retirement-ratchet.mjs +++ b/config/scripts/check-unproven-pty-retirement-ratchet.mjs @@ -1,6 +1,9 @@ import process from 'node:process' import { pathToFileURL } from 'node:url' -import { readTrackedSources, runCountRatchet } from './ratchet-baseline.mjs' +import { + readTrackedSources, + runCountRatchet +} from './static-analysis/ratchet-baseline/ratchet-baseline.mjs' // Ratchet retirements lacking exit proof and ownership drops outside finishPtyShutdown downward: both can lose the stop handle while processes live. diff --git a/config/scripts/check-workspace-record-read-ratchet.mjs b/config/scripts/check-workspace-record-read-ratchet.mjs index ee5c4eb5dcf..0d08922b669 100644 --- a/config/scripts/check-workspace-record-read-ratchet.mjs +++ b/config/scripts/check-workspace-record-read-ratchet.mjs @@ -1,6 +1,9 @@ import process from 'node:process' import { pathToFileURL } from 'node:url' -import { readTrackedSources, runCountRatchet } from './ratchet-baseline.mjs' +import { + readTrackedSources, + runCountRatchet +} from './static-analysis/ratchet-baseline/ratchet-baseline.mjs' // Ratchet direct renderer workspace-record reads downward as sidebar records move to main’s feed (§2/§9); old-copy readers would silently go stale. // Lower bound misses destructuring/computed access; compiler guards removed fields. Writers remain until their migration. diff --git a/config/scripts/check-worktree-id-composer-ratchet.mjs b/config/scripts/check-worktree-id-composer-ratchet.mjs index af5bcdd23e8..59f2881c089 100644 --- a/config/scripts/check-worktree-id-composer-ratchet.mjs +++ b/config/scripts/check-worktree-id-composer-ratchet.mjs @@ -1,6 +1,9 @@ import process from 'node:process' import { pathToFileURL } from 'node:url' -import { readTrackedSources, runCountRatchet } from './ratchet-baseline.mjs' +import { + readTrackedSources, + runCountRatchet +} from './static-analysis/ratchet-baseline/ratchet-baseline.mjs' // Ratchet hand-built worktree IDs downward: inconsistent path spellings give one worktree multiple IDs (#30150); use shared/worktree/id.ts composers. diff --git a/config/scripts/ci-shard-timings.json b/config/scripts/ci-shard-timings.json index 95258a47002..22a41dd2564 100644 --- a/config/scripts/ci-shard-timings.json +++ b/config/scripts/ci-shard-timings.json @@ -13,38 +13,38 @@ "metric": "module-duration-v1", "overheadMs": 0, "timings": { - "config/scripts/adhoc-build-pinned-commit.test.mjs": 375, - "config/scripts/adhoc-build-version.test.mjs": 82, - "config/scripts/adhoc-mac-manifests.test.mjs": 112, - "config/scripts/adhoc-release-waits.test.mjs": 151, - "config/scripts/adhoc-windows-parallelism.test.mjs": 258, + "config/scripts/release/workflow-contracts/adhoc-build-pinned-commit.test.mjs": 375, + "config/scripts/release/versioning/adhoc-build-version.test.mjs": 82, + "config/scripts/desktop-distribution/macos/adhoc-mac-manifests.test.mjs": 112, + "config/scripts/release/workflow-contracts/adhoc-release-waits.test.mjs": 151, + "config/scripts/release/workflow-contracts/adhoc-windows-parallelism.test.mjs": 258, "config/scripts/agent-state-rules-bundle.test.mjs": 213, "config/scripts/agent-typescript-lsp.test.mjs": 116, "config/scripts/anti-slop-prefilter.test.mjs": 381, "config/scripts/anti-slop-scope-regression.test.mjs": 527, "config/scripts/app-store-performance-plugin.test.mjs": 339, - "config/scripts/appimage-node-runtime.test.mjs": 146, + "config/scripts/desktop-distribution/linux/appimage-node-runtime.test.mjs": 146, "config/scripts/assert-github-release-is-draft.test.mjs": 251, "config/scripts/audit-localization-coverage.test.mjs": 140, "config/scripts/benchmark-artifact-comparison.test.mjs": 192, - "config/scripts/benchmark-sample-summary.test.mjs": 46, - "config/scripts/build-cli.test.mjs": 1371, - "config/scripts/build-linux-local.test.mjs": 67, - "config/scripts/build-mac-local.test.mjs": 46, - "config/scripts/build-mac-notarization-overlap.test.mjs": 127, - "config/scripts/build-mobile-web-app-bundle.test.mjs": 202, - "config/scripts/build-native-for-platform.test.mjs": 61, - "config/scripts/build-orcad-prebuilds.test.mjs": 121, - "config/scripts/build-orcad-template.test.mjs": 172, - "config/scripts/build-plugin-declarative-runtime.test.mjs": 259, - "config/scripts/build-wayland-clipboard.test.mjs": 435, - "config/scripts/build-windows-cli-launcher.test.mjs": 146, - "config/scripts/build-windows-security-addon.test.mjs": 189, + "config/scripts/performance/measurement/benchmark-sample-summary.test.mjs": 46, + "config/scripts/cli-build/build-cli.test.mjs": 1371, + "config/scripts/desktop-distribution/linux/build-linux-local.test.mjs": 67, + "config/scripts/desktop-distribution/macos/build-mac-local.test.mjs": 46, + "config/scripts/desktop-distribution/macos/build-mac-notarization-overlap.test.mjs": 127, + "config/scripts/build/mobile-web-app/build-mobile-web-app-bundle.test.mjs": 202, + "config/scripts/native-build/composition/build-native-for-platform.test.mjs": 61, + "config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.test.mjs": 121, + "config/scripts/orcad-distribution/template/build-orcad-template.test.mjs": 172, + "config/scripts/plugin-build/declarative-runtime/build-plugin-declarative-runtime.test.mjs": 259, + "config/scripts/native-build/linux/build-wayland-clipboard.test.mjs": 435, + "config/scripts/native-build/windows/build-windows-cli-launcher.test.mjs": 146, + "config/scripts/native-build/windows/build-windows-security-addon.test.mjs": 189, "config/scripts/bump-android-apk-download-version.test.mjs": 52, - "config/scripts/casting-code-quality.test.mjs": 593, - "config/scripts/check-changed-code-quality.test.mjs": 3126, - "config/scripts/check-changed-pass-cache.test.mjs": 184, - "config/scripts/check-changed-selection.test.mjs": 94, + "config/scripts/preflight/changed-checks/casting-code-quality.test.mjs": 593, + "config/scripts/preflight/changed-checks/check-changed-code-quality.test.mjs": 3126, + "config/scripts/preflight/changed-checks/check-changed-pass-cache.test.mjs": 184, + "config/scripts/preflight/changed-checks/check-changed-selection.test.mjs": 94, "config/scripts/check-compat-boundary-imports.test.mjs": 145, "config/scripts/check-daemon-protocol-crossing.test.mjs": 180, "config/scripts/check-e2e-typecheck-ratchet.test.mjs": 94, @@ -55,12 +55,12 @@ "config/scripts/check-import-boundaries.test.mjs": 226, "config/scripts/check-layout-writer-ratchets.test.mjs": 149, "config/scripts/check-legacy-relay-fence-ratchet.test.mjs": 118, - "config/scripts/check-main-sync-spawn-ratchet.test.mjs": 245, + "config/scripts/static-analysis/process-boundaries/check-main-sync-spawn-ratchet.test.mjs": 245, "config/scripts/check-max-lines-ratchet.test.mjs": 296, "config/scripts/check-mobile-shared-dependency-versions.test.mjs": 771, "config/scripts/check-node-runtime-pin.test.mjs": 640, "config/scripts/check-path-literal-ratchet.test.mjs": 64, - "config/scripts/check-process-host-imports.test.mjs": 229, + "config/scripts/static-analysis/process-boundaries/check-process-host-imports.test.mjs": 229, "config/scripts/check-react-doctor-changed.test.mjs": 2118, "config/scripts/check-readme-local-links.test.mjs": 616, "config/scripts/check-reliability-gates.test.mjs": 92, @@ -69,89 +69,89 @@ "config/scripts/check-runtime-electron-ratchet-graph.test.mjs": 160, "config/scripts/check-runtime-electron-ratchet.test.mjs": 3540, "config/scripts/check-runtime-launcher-protocol-ratchet.test.mjs": 212, - "config/scripts/check-terminal-perf-report-budgets.test.mjs": 1600, + "config/scripts/performance/terminal-reporting/check-terminal-perf-report-budgets.test.mjs": 1600, "config/scripts/check-test-file-runners.test.mjs": 267, "config/scripts/check-ts-nocheck-ratchet.test.mjs": 51, "config/scripts/check-unproven-pty-retirement-ratchet.test.mjs": 57, "config/scripts/check-workspace-record-read-ratchet.test.mjs": 55, "config/scripts/check-worktree-id-composer-ratchet.test.mjs": 52, - "config/scripts/ci-branch-cache-sweep.test.mjs": 71, - "config/scripts/ci-closed-pr-caches.test.mjs": 79, - "config/scripts/ci-closed-pr-cancellation.test.mjs": 112, - "config/scripts/ci-draft-pr-admission.test.mjs": 546, - "config/scripts/ci-e2e-failure-summary.test.mjs": 54, - "config/scripts/ci-e2e-job-selection.test.mjs": 273, - "config/scripts/ci-e2e-shard-selection.test.mjs": 2772, - "config/scripts/ci-managed-ssh-execution.test.mjs": 844, - "config/scripts/ci-native-cache.test.mjs": 286, - "config/scripts/ci-native-toolchain.test.mjs": 109, - "config/scripts/ci-pnpm-store-mode.test.mjs": 501, - "config/scripts/ci-pr-concurrency-keys.test.mjs": 460, - "config/scripts/ci-runner-metrics.test.mjs": 66, - "config/scripts/ci-shard-assignment.test.mjs": 1381, - "config/scripts/ci-unit-dependency-graph.test.mjs": 413, - "config/scripts/ci-unit-exclusion-coverage.test.mjs": 1195, - "config/scripts/ci-unit-indirect-inputs.test.mjs": 297, - "config/scripts/ci-unit-input-ownership.test.mjs": 293, - "config/scripts/ci-unit-module-cache-contents.test.mjs": 171, - "config/scripts/ci-unit-module-cache.test.mjs": 217, - "config/scripts/ci-unit-plan.test.mjs": 3187, - "config/scripts/ci-unit-selection-review.test.mjs": 51, - "config/scripts/ci-unit-selection.test.mjs": 271, - "config/scripts/ci-unit-sequencer.test.mjs": 296, - "config/scripts/ci-unit-timing-reporter.test.mjs": 374, + "config/scripts/ci/workflow-contracts/ci-branch-cache-sweep.test.mjs": 71, + "config/scripts/ci/workflow-contracts/ci-closed-pr-caches.test.mjs": 79, + "config/scripts/ci/workflow-contracts/ci-closed-pr-cancellation.test.mjs": 112, + "config/scripts/ci/workflow-contracts/ci-draft-pr-admission.test.mjs": 546, + "config/scripts/ci/e2e-failures/ci-e2e-failure-summary.test.mjs": 54, + "config/scripts/ci/e2e-selection/ci-e2e-job-selection.test.mjs": 273, + "config/scripts/ci/e2e-selection/ci-e2e-shard-selection.test.mjs": 2772, + "config/scripts/ci/workflow-contracts/ci-managed-ssh-execution.test.mjs": 844, + "config/scripts/ci/workflow-contracts/ci-native-cache.test.mjs": 286, + "config/scripts/ci/workflow-contracts/ci-native-toolchain.test.mjs": 109, + "config/scripts/ci/dependency-cache/ci-pnpm-store-mode.test.mjs": 501, + "config/scripts/ci/workflow-contracts/ci-pr-concurrency-keys.test.mjs": 460, + "config/scripts/ci/runner-capacity/ci-runner-metrics.test.mjs": 66, + "config/scripts/ci/sharding/ci-shard-assignment.test.mjs": 1381, + "config/scripts/ci/unit-selection/dependency-graph/ci-unit-dependency-graph.test.mjs": 413, + "config/scripts/ci/unit-selection/dependency-graph/ci-unit-exclusion-coverage.test.mjs": 1195, + "config/scripts/ci/unit-selection/dependency-graph/ci-unit-indirect-inputs.test.mjs": 297, + "config/scripts/ci/unit-selection/dependency-graph/ci-unit-input-ownership.test.mjs": 293, + "config/scripts/ci/unit-cache/ci-unit-module-cache-contents.test.mjs": 171, + "config/scripts/ci/unit-cache/ci-unit-module-cache.test.mjs": 217, + "config/scripts/ci/unit-selection/ci-unit-plan.test.mjs": 3187, + "config/scripts/ci/unit-selection/ci-unit-selection-review.test.mjs": 51, + "config/scripts/ci/unit-selection/ci-unit-selection.test.mjs": 271, + "config/scripts/ci/sharding/ci-unit-sequencer.test.mjs": 296, + "config/scripts/ci/sharding/ci-unit-timing-reporter.test.mjs": 374, "config/scripts/cloud-security-history-workflow.test.mjs": 357, "config/scripts/codex-primary-home-tripwire.test.ts": 378, - "config/scripts/compact-packaged-orcad-ripgrep.test.mjs": 1153, + "config/scripts/orcad-distribution/template/compact-packaged-orcad-ripgrep.test.mjs": 1153, "config/scripts/computer-use-smoke.test.mjs": 539, - "config/scripts/counterbalanced-benchmark-schedule.test.mjs": 54, + "config/scripts/performance/measurement/counterbalanced-benchmark-schedule.test.mjs": 54, "config/scripts/create-draft-release.test.mjs": 72, - "config/scripts/daemon-protocol-facts.test.mjs": 59, - "config/scripts/daily-build-version.test.mjs": 79, + "config/scripts/daemon-protocol/schema-facts/daemon-protocol-facts.test.mjs": 59, + "config/scripts/release/versioning/daily-build-version.test.mjs": 79, "config/scripts/dark-build-switches.test.mjs": 52, "config/scripts/dependency-security-audit.test.mjs": 187, "config/scripts/dependency-security-patches.test.mjs": 50, "config/scripts/dependency-security-release.test.mjs": 311, - "config/scripts/dev-channel-base-version.test.mjs": 61, + "config/scripts/release/versioning/dev-channel-base-version.test.mjs": 61, "config/scripts/dev-channel-windows-staging.test.mjs": 211, "config/scripts/dev-cli-terminal-wrapper.test.mjs": 55, - "config/scripts/dev-electron-bundle-cache.test.ts": 53, + "config/scripts/development/electron-bundle-cache/dev-electron-bundle-cache.test.ts": 53, "config/scripts/dev-electron-bundle-identity.test.ts": 53, - "config/scripts/dev-instance-isolation.test.mjs": 61, + "config/scripts/development/instance-isolation/dev-instance-isolation.test.mjs": 61, "config/scripts/dev-profile-seed.test.mjs": 294, - "config/scripts/dev-storage-reclaim.test.mjs": 135, + "config/scripts/worktree-storage/dev-storage-reclaim.test.mjs": 135, "config/scripts/dev-web-client-freshness.test.mjs": 110, "config/scripts/e2e-cli-artifact-capability.test.mjs": 233, - "config/scripts/electron-builder-config.test.mjs": 387, - "config/scripts/electron-builder-mac-channel-config.test.mjs": 309, - "config/scripts/electron-builder-native-rebuild.test.mjs": 47, - "config/scripts/electron-builder-runtime-resources.test.mjs": 2505, - "config/scripts/electron-builder-speech-config.test.mjs": 212, - "config/scripts/electron-vite-output-contract.test.ts": 77, - "config/scripts/ensure-native-runtime-job-ownership.test.mjs": 76, - "config/scripts/ensure-native-runtime.test.mjs": 908, + "config/scripts/desktop-distribution/runtime-verification/electron-builder-config.test.mjs": 387, + "config/scripts/desktop-distribution/runtime-verification/electron-builder-mac-channel-config.test.mjs": 309, + "config/scripts/desktop-distribution/runtime-verification/electron-builder-native-rebuild.test.mjs": 47, + "config/scripts/desktop-distribution/runtime-verification/electron-builder-runtime-resources.test.mjs": 2505, + "config/scripts/desktop-distribution/runtime-verification/electron-builder-speech-config.test.mjs": 212, + "config/scripts/desktop-build/output-contracts/electron-vite-output-contract.test.ts": 77, + "config/scripts/native-build/node-addons/ensure-native-runtime-job-ownership.test.mjs": 76, + "config/scripts/native-build/node-addons/ensure-native-runtime.test.mjs": 908, "config/scripts/ephemeral-vm-runtime-store-cross-version.test.ts": 31, - "config/scripts/foreign-sqlite-reader-worker-smoke.test.mjs": 491, + "config/scripts/orcad-distribution/server-bundle/foreign-sqlite-reader-worker-smoke.test.mjs": 491, "config/scripts/generate-bundled-skill-guides.test.mjs": 469, "config/scripts/generate-plugin-authoring-skill-references.test.mjs": 761, "config/scripts/generate-runtime-required-english-catalog.test.mjs": 368, "config/scripts/generate-skill-bundle-manifest.test.mjs": 956, - "config/scripts/generate-terminal-perf-html-report.test.mjs": 91, + "config/scripts/performance/terminal-reporting/generate-terminal-perf-html-report.test.mjs": 91, "config/scripts/generated-artifact-line-ending-pin.test.mjs": 61, - "config/scripts/git-pull-request-diff-base.test.mjs": 44, + "config/scripts/git/pr-diff-base/git-pull-request-diff-base.test.mjs": 44, "config/scripts/github-opened-issue-repository.test.ts": 1438, "config/scripts/github-pr-assignee-repository.test.ts": 713, "config/scripts/hang-watchdog-process-metrics.test.mjs": 94, - "config/scripts/happy-dom-mutation-observer-retention.test.ts": 496, - "config/scripts/happy-dom-offscreen-canvas.test.ts": 243, + "config/scripts/test-runtime/dom/happy-dom-mutation-observer-retention.test.ts": 496, + "config/scripts/test-runtime/dom/happy-dom-offscreen-canvas.test.ts": 243, "config/scripts/headless-detector-compiler-cache.test.mjs": 959, "config/scripts/headless-serve-shutdown-matrix.test.mjs": 100, - "config/scripts/hourly-build-version.test.mjs": 92, + "config/scripts/release/versioning/hourly-build-version.test.mjs": 92, "config/scripts/hourly-preflight-workflow.test.mjs": 158, - "config/scripts/idle-cpu-process-sampling.test.mjs": 55, + "config/scripts/performance/idle-cpu/idle-cpu-process-sampling.test.mjs": 55, "config/scripts/ime-enter-guard-plugin.test.mjs": 222, - "config/scripts/initialize-windows-native-toolchain.test.mjs": 82, - "config/scripts/install-electron-package-binary.test.mjs": 2321, + "config/scripts/native-build/windows/initialize-windows-native-toolchain.test.mjs": 82, + "config/scripts/electron-installation/platform-layout/install-electron-package-binary.test.mjs": 2321, "config/scripts/install-node-dependencies-action.test.mjs": 399, "config/scripts/lag-probe-failures.test.mjs": 55, "config/scripts/latest-stable-release.test.mjs": 46, @@ -173,18 +173,18 @@ "config/scripts/locale-catalog/locale-translation-policy.ja-round5.test.mjs": 209, "config/scripts/locale-catalog/locale-translation-policy.test.mjs": 189, "config/scripts/localization-extraction-call-syntax.test.mjs": 317, - "config/scripts/localization-extraction-change-scope.test.mjs": 732, - "config/scripts/mac-build-compatibility.test.mjs": 41, - "config/scripts/mac-notarization-builder-contract.test.mjs": 768, + "config/scripts/localization/extraction-policy/localization-extraction-change-scope.test.mjs": 732, + "config/scripts/desktop-distribution/macos/mac-build-compatibility.test.mjs": 41, + "config/scripts/desktop-distribution/macos/mac-notarization-builder-contract.test.mjs": 768, "config/scripts/macos-computer-helper-owner-loss-group-recovery.test.mjs": 47, "config/scripts/macos-computer-helper-owner-loss-processes.test.mjs": 52, "config/scripts/macos-folder-usage-descriptions.test.mjs": 147, "config/scripts/macos-shipit-scheduling.test.mjs": 38, - "config/scripts/macos-terminal-host-bundle.test.mjs": 182, + "config/scripts/macos/terminal-host-bundle/macos-terminal-host-bundle.test.mjs": 182, "config/scripts/main-entry-facade.test.ts": 492, "config/scripts/managed-data-account-runtime.test.ts": 1381, - "config/scripts/merge-orcad-prebuilds.test.mjs": 67, - "config/scripts/mobile-entry-static-closure.test.mjs": 71, + "config/scripts/orcad-distribution/prebuilds/merge-orcad-prebuilds.test.mjs": 67, + "config/scripts/build/mobile-web-app/mobile-entry-static-closure.test.mjs": 71, "config/scripts/mobile-process-host-tooling.test.mjs": 942, "config/scripts/mobile-release-check-scope.test.mjs": 821, "config/scripts/mobile-test-change-scope.test.mjs": 62, @@ -239,85 +239,85 @@ "config/scripts/mobile-web-app/preview/mobile-web-app-html-preview-render.test.mjs": 333, "config/scripts/mobile-web-app/preview/mobile-web-app-media-preview-render.test.mjs": 196, "config/scripts/mobile-web-app/preview/mobile-web-app-svg-preview-render.test.mjs": 340, - "config/scripts/mobile-web-bundle-manifest.test.mjs": 126, - "config/scripts/mobile-web-bundle-serializer-parity.test.mjs": 112, - "config/scripts/mobile-web-page-routes.test.mjs": 129, + "config/scripts/build/mobile-web-app/mobile-web-bundle-manifest.test.mjs": 126, + "config/scripts/build/mobile-web-app/mobile-web-bundle-serializer-parity.test.mjs": 112, + "config/scripts/build/mobile-web-app/mobile-web-page-routes.test.mjs": 129, "config/scripts/mobile-web-regex-compatibility.test.mjs": 112, - "config/scripts/mobile-web-source-line-endings.test.mjs": 341, + "config/scripts/build/mobile-web-app/mobile-web-source-line-endings.test.mjs": 341, "config/scripts/mobile-web-terminal-engine-closure.test.mjs": 66, - "config/scripts/moved-code-matcher.test.mjs": 92, - "config/scripts/msbuild-file-tracking.test.mjs": 45, - "config/scripts/native-build-entry.test.mjs": 67, + "config/scripts/preflight/changed-checks/moved-code-matcher.test.mjs": 92, + "config/scripts/native-build/windows/msbuild-file-tracking.test.mjs": 45, + "config/scripts/native-build/node-addons/native-build-entry.test.mjs": 67, "config/scripts/native-chat-compaction-pagination.test.mjs": 446, - "config/scripts/native-dependency-lock-digest.test.mjs": 115, - "config/scripts/node-old-space-limit.test.mjs": 44, - "config/scripts/node-server-change-scope-enclosing-checkout.test.mjs": 106, - "config/scripts/node-server-change-scope.test.mjs": 586, + "config/scripts/native-build/node-addons/native-dependency-lock-digest.test.mjs": 115, + "config/scripts/tool-invocation/node-old-space-limit.test.mjs": 44, + "config/scripts/node-server/qualification/node-server-change-scope-enclosing-checkout.test.mjs": 106, + "config/scripts/node-server/qualification/node-server-change-scope.test.mjs": 586, "config/scripts/node-server-concurrency.test.mjs": 273, "config/scripts/node-server-fast-runners.test.mjs": 218, - "config/scripts/node-server-native-compat-scope.test.mjs": 458, - "config/scripts/node-server-policy-self-tests.test.mjs": 4180, - "config/scripts/node-server-qualification.test.mjs": 75, + "config/scripts/node-server/qualification/node-server-native-compat-scope.test.mjs": 458, + "config/scripts/node-server/qualification/node-server-policy-self-tests.test.mjs": 4180, + "config/scripts/node-server/qualification/node-server-qualification.test.mjs": 75, "config/scripts/nsis-process-check.test.mjs": 69, "config/scripts/orca-dev-bin.test.mjs": 110, - "config/scripts/orcad-artifact-version.test.mjs": 480, - "config/scripts/orcad-daemon-protocol-crossing.test.mjs": 56, - "config/scripts/orcad-entry-build.test.mjs": 7008, - "config/scripts/orcad-linear-sdk-package.test.mjs": 376, - "config/scripts/orcad-mobile-web-bundle.test.mjs": 174, - "config/scripts/orcad-prebuild-node-gyp.test.mjs": 99, - "config/scripts/orcad-prebuild-slot-contents.test.mjs": 79, - "config/scripts/orcad-terminal-smoke-change-scope.test.mjs": 3468, - "config/scripts/orcad-watcher-package.test.mjs": 94, - "config/scripts/orcad-windows-cli-launcher.test.mjs": 94, - "config/scripts/orcad-windows-prebuild-cache.test.mjs": 18343, - "config/scripts/orcad-windows-prebuild-workflow.test.mjs": 161, - "config/scripts/orcad-windows-process-tree.test.mjs": 98, - "config/scripts/orcad-windows-security.test.mjs": 118, - "config/scripts/oxc-cli-invocation.test.mjs": 139, + "config/scripts/orcad-distribution/server-bundle/orcad-artifact-version.test.mjs": 480, + "config/scripts/orcad-distribution/qualification/orcad-daemon-protocol-crossing.test.mjs": 56, + "config/scripts/orcad-distribution/server-bundle/orcad-entry-build.test.mjs": 7008, + "config/scripts/orcad-distribution/server-bundle/orcad-linear-sdk-package.test.mjs": 376, + "config/scripts/orcad-distribution/server-bundle/orcad-mobile-web-bundle.test.mjs": 174, + "config/scripts/orcad-distribution/prebuilds/orcad-prebuild-node-gyp.test.mjs": 99, + "config/scripts/orcad-distribution/prebuilds/orcad-prebuild-slot-contents.test.mjs": 79, + "config/scripts/orcad-distribution/qualification/orcad-terminal-smoke-change-scope.test.mjs": 3468, + "config/scripts/orcad-distribution/server-bundle/orcad-watcher-package.test.mjs": 94, + "config/scripts/orcad-distribution/server-bundle/orcad-windows-cli-launcher.test.mjs": 94, + "config/scripts/orcad-distribution/prebuilds/orcad-windows-prebuild-cache.test.mjs": 18343, + "config/scripts/orcad-distribution/prebuilds/orcad-windows-prebuild-workflow.test.mjs": 161, + "config/scripts/orcad-distribution/server-bundle/orcad-windows-process-tree.test.mjs": 98, + "config/scripts/orcad-distribution/server-bundle/orcad-windows-security.test.mjs": 118, + "config/scripts/tool-invocation/oxc-cli-invocation.test.mjs": 139, "config/scripts/package-electron-runtime-contract.test.mjs": 220, - "config/scripts/package-linux-formats-appimage.test.mjs": 624, - "config/scripts/package-linux-formats.test.mjs": 282, - "config/scripts/packaged-node-pty-prebuild-prune.test.mjs": 74, - "config/scripts/packaged-orcad-browser.test.mjs": 407, - "config/scripts/packaged-orcad-template.test.mjs": 220, - "config/scripts/packaged-process-host.test.mjs": 537, - "config/scripts/packaged-repository-input-exclusion.test.mjs": 222, - "config/scripts/packaged-source-map-prune.test.mjs": 73, - "config/scripts/packaged-windows-only-runtime-files.test.mjs": 214, + "config/scripts/desktop-distribution/linux/package-linux-formats-appimage.test.mjs": 624, + "config/scripts/desktop-distribution/linux/package-linux-formats.test.mjs": 282, + "config/scripts/desktop-distribution/runtime-verification/packaged-node-pty-prebuild-prune.test.mjs": 74, + "config/scripts/orcad-distribution/template/packaged-orcad-browser.test.mjs": 407, + "config/scripts/orcad-distribution/template/packaged-orcad-template.test.mjs": 220, + "config/scripts/desktop-distribution/runtime-verification/packaged-process-host.test.mjs": 537, + "config/scripts/desktop-distribution/runtime-verification/packaged-repository-input-exclusion.test.mjs": 222, + "config/scripts/desktop-distribution/runtime-verification/packaged-source-map-prune.test.mjs": 73, + "config/scripts/desktop-distribution/runtime-verification/packaged-windows-only-runtime-files.test.mjs": 214, "config/scripts/patched-dependencies-frozen-install.test.mjs": 749, "config/scripts/pdfjs-viewer-assets-stream.test.ts": 296, - "config/scripts/pinned-bun-executable.test.mjs": 48, - "config/scripts/pinned-node-downloads.test.mjs": 128, + "config/scripts/tool-invocation/pinned-bun-executable.test.mjs": 48, + "config/scripts/orcad-distribution/prebuilds/pinned-node-downloads.test.mjs": 128, "config/scripts/plain-node-entry-guard.test.ts": 710, "config/scripts/playwright-focused-workflow-selection.test.mjs": 1565, - "config/scripts/pnpm-cli-invocation.test.mjs": 65, + "config/scripts/tool-invocation/pnpm-cli-invocation.test.mjs": 65, "config/scripts/pnpm-lockfile-root-importer.test.mjs": 67, "config/scripts/pnpmfile-global-virtual-store.test.mjs": 47, - "config/scripts/pr-aggregate-gate.test.mjs": 236, + "config/scripts/workflow/pr-admission/pr-aggregate-gate.test.mjs": 236, "config/scripts/pr-auxiliary-preflight-admission.test.mjs": 2174, - "config/scripts/pr-code-change-scope-cross-version-launch-route.test.mjs": 54, - "config/scripts/pr-code-change-scope-cross-version-send-path.test.mjs": 71, - "config/scripts/pr-code-change-scope-daemon-protocol.test.mjs": 46, - "config/scripts/pr-code-change-scope-format-route.test.mjs": 155, - "config/scripts/pr-code-change-scope-process-host.test.mjs": 57, - "config/scripts/pr-code-change-scope-released-phone.test.mjs": 76, - "config/scripts/pr-code-change-scope-test-inputs.test.mjs": 61, - "config/scripts/pr-code-change-scope-windows-process-probe.test.mjs": 67, - "config/scripts/pr-code-change-scope.test.mjs": 403, - "config/scripts/pr-codex-unit-only-selection.test.mjs": 53, - "config/scripts/pr-e2e-gate-contract.test.mjs": 270, + "config/scripts/workflow/source-routing/pr-code-change-scope-cross-version-launch-route.test.mjs": 54, + "config/scripts/workflow/source-routing/pr-code-change-scope-cross-version-send-path.test.mjs": 71, + "config/scripts/workflow/source-routing/pr-code-change-scope-daemon-protocol.test.mjs": 46, + "config/scripts/workflow/source-routing/pr-code-change-scope-format-route.test.mjs": 155, + "config/scripts/workflow/source-routing/pr-code-change-scope-process-host.test.mjs": 57, + "config/scripts/workflow/source-routing/pr-code-change-scope-released-phone.test.mjs": 76, + "config/scripts/workflow/source-routing/pr-code-change-scope-test-inputs.test.mjs": 61, + "config/scripts/workflow/source-routing/pr-code-change-scope-windows-process-probe.test.mjs": 67, + "config/scripts/workflow/source-routing/pr-code-change-scope.test.mjs": 403, + "config/scripts/workflow/source-routing/pr-codex-unit-only-selection.test.mjs": 53, + "config/scripts/workflow/source-routing/pr-e2e-gate-contract.test.mjs": 270, "config/scripts/pr-e2e-managed-ssh-harness-route.test.mjs": 422, "config/scripts/pr-plugin-e2e-routing.test.mjs": 272, - "config/scripts/pr-ready-check-gate.test.mjs": 1343, + "config/scripts/workflow/pr-admission/pr-ready-check-gate.test.mjs": 1343, "config/scripts/pr-ready-check-reuse.test.mjs": 179, "config/scripts/pr-test-loc-summary.test.mjs": 167, - "config/scripts/pr-unit-support-routing.test.mjs": 14771, + "config/scripts/workflow/source-routing/pr-unit-support-routing.test.mjs": 14771, "config/scripts/pr-workflow-parallelism.test.mjs": 161, - "config/scripts/process-failure-message.test.mjs": 41, + "config/scripts/tool-invocation/process-failure-message.test.mjs": 41, "config/scripts/process-host-build-dist.test.mjs": 8298, "config/scripts/process-host-dev-rebuild.test.ts": 10910, - "config/scripts/profile-state-worker-smoke.test.mjs": 2740, + "config/scripts/orcad-distribution/server-bundle/profile-state-worker-smoke.test.mjs": 2740, "config/scripts/project-renderer-web-client.test.mjs": 709, "config/scripts/protected-copy-keys.test.mjs": 394, "config/scripts/pty-transcript-secret-scan.test.mjs": 188, @@ -325,33 +325,33 @@ "config/scripts/pullfrog-review-scope.test.mjs": 50, "config/scripts/quadratic-buffer-concat-plugin.test.mjs": 225, "config/scripts/qualified-orcad-template.test.mjs": 555, - "config/scripts/ratchet-baseline.test.mjs": 66, + "config/scripts/static-analysis/ratchet-baseline/ratchet-baseline.test.mjs": 66, "config/scripts/readme-downloads-badge.test.mjs": 52, - "config/scripts/rebuild-native-deps-node-pty.test.mjs": 1378, - "config/scripts/rebuild-native-deps-windows-process-tree.test.mjs": 79, - "config/scripts/rebuild-native-deps.test.mjs": 944, - "config/scripts/reclaim-dev-electron-bundles.test.ts": 229, - "config/scripts/reclaim-dev-worktree-profiles.test.mjs": 115, - "config/scripts/reclaim-electron-dists.test.ts": 641, - "config/scripts/reclaim-release-test-caches.test.ts": 331, - "config/scripts/reclaim-vite-caches.test.mjs": 442, - "config/scripts/reclaim-vitest-module-caches.test.mjs": 109, - "config/scripts/reclaim-worktree-command.test.mjs": 100, - "config/scripts/reclaim-worktree-generated-files.test.mjs": 3376, - "config/scripts/reclaim-worktree-space.test.mjs": 2469, - "config/scripts/regenerate-xterm-patches.test.mjs": 252, + "config/scripts/native-build/node-addons/rebuild-native-deps-node-pty.test.mjs": 1378, + "config/scripts/native-build/node-addons/rebuild-native-deps-windows-process-tree.test.mjs": 79, + "config/scripts/native-build/node-addons/rebuild-native-deps.test.mjs": 944, + "config/scripts/worktree-storage/reclaim-dev-electron-bundles.test.ts": 229, + "config/scripts/worktree-storage/reclaim-dev-worktree-profiles.test.mjs": 115, + "config/scripts/worktree-storage/reclaim-electron-dists.test.ts": 641, + "config/scripts/worktree-storage/reclaim-release-test-caches.test.ts": 331, + "config/scripts/worktree-storage/reclaim-vite-caches.test.mjs": 442, + "config/scripts/worktree-storage/reclaim-vitest-module-caches.test.mjs": 109, + "config/scripts/worktree-storage/reclaim-worktree-command.test.mjs": 100, + "config/scripts/worktree-storage/reclaim-worktree-generated-files.test.mjs": 3376, + "config/scripts/worktree-storage/reclaim-worktree-space.test.mjs": 2469, + "config/scripts/terminal-dependencies/xterm-patches/regenerate-xterm-patches.test.mjs": 252, "config/scripts/relay-era-ref-refusal-workflow.test.mjs": 231, "config/scripts/release-cut-token-permissions.test.mjs": 276, "config/scripts/release-desktop-timing.test.mjs": 69, - "config/scripts/release-javascript-artifact.test.mjs": 341, - "config/scripts/release-javascript-parity.test.mjs": 88, + "config/scripts/release/javascript-artifacts/release-javascript-artifact.test.mjs": 341, + "config/scripts/release/javascript-artifacts/release-javascript-parity.test.mjs": 88, "config/scripts/release-mac-build-workflow-dispatch.test.mjs": 112, "config/scripts/release-policy.test.mjs": 62, "config/scripts/release-protected-main-push.test.mjs": 201, "config/scripts/release-rc-history.test.mjs": 230, "config/scripts/release-tag-pattern-census.test.mjs": 90, "config/scripts/release-windows-signing-gate.test.mjs": 102, - "config/scripts/renderer-boot-graph.test.mjs": 53, + "config/scripts/desktop-build/output-contracts/renderer-boot-graph.test.mjs": 53, "config/scripts/renderer-scrollbar-style-plugin.test.mjs": 234, "config/scripts/renderer-tailwind-sources.test.mjs": 289, "config/scripts/replace-cached-nsis-elevate.test.mjs": 1258, @@ -363,110 +363,110 @@ "config/scripts/run-internal-dev-setup.test.mjs": 50, "config/scripts/run-linux-packaged-node-pty-floor-smoke.test.mjs": 169, "config/scripts/run-terminal-scale-perf-report-gate.test.mjs": 67, - "config/scripts/run-typecheck-bun-queue.test.mjs": 595, - "config/scripts/run-typecheck-projects-in-parallel.test.mjs": 182, + "config/scripts/typecheck/project-execution/run-typecheck-bun-queue.test.mjs": 595, + "config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.test.mjs": 182, "config/scripts/runtime-serve-terminal-smoke.test.mjs": 159, "config/scripts/scan-release-artifacts-antivirus.test.mjs": 62, - "config/scripts/script-entry-detection.test.mjs": 107, - "config/scripts/script-module-dependencies.test.mjs": 62, - "config/scripts/session-scanner-service-smoke.test.mjs": 562, + "config/scripts/tool-invocation/script-entry-detection.test.mjs": 107, + "config/scripts/test-fixtures/script-copy-closure/script-module-dependencies.test.mjs": 62, + "config/scripts/orcad-distribution/server-bundle/session-scanner-service-smoke.test.mjs": 562, "config/scripts/setup-pnpm-action.test.mjs": 421, - "config/scripts/shared-electron-dist-cache.test.ts": 140, - "config/scripts/shared-native-build.test.mjs": 127, - "config/scripts/shared-tree-publish.test.mjs": 63, - "config/scripts/sign-mac-app.test.mjs": 268, + "config/scripts/electron-installation/shared-dist-cache/shared-electron-dist-cache.test.ts": 140, + "config/scripts/native-build/node-addons/shared-native-build.test.mjs": 127, + "config/scripts/artifact-storage/atomic-publication/shared-tree-publish.test.mjs": 63, + "config/scripts/desktop-distribution/macos/sign-mac-app.test.mjs": 268, "config/scripts/skill-description-length.test.mjs": 102, "config/scripts/skill-recipe-shell.test.mjs": 1143, - "config/scripts/space-sharing-copy.test.ts": 138, + "config/scripts/artifact-storage/reflink-copy/space-sharing-copy.test.ts": 138, "config/scripts/ssh-windows-mobile-bundle.test.mjs": 359, "config/scripts/static-appimage-package-contract.test.mjs": 88, - "config/scripts/static-module-specifiers.test.mjs": 216, - "config/scripts/store-ancestor-node-modules.test.mjs": 46, + "config/scripts/static-analysis/module-requests/static-module-specifiers.test.mjs": 216, + "config/scripts/node-resolution/ancestor-modules/store-ancestor-node-modules.test.mjs": 46, "config/scripts/structured-agent-session-start-failure-row-render.test.mjs": 3097, "config/scripts/sucrase-unused-transformers.test.ts": 43, - "config/scripts/summarize-terminal-perf-report.test.mjs": 71, + "config/scripts/performance/terminal-reporting/summarize-terminal-perf-report.test.mjs": 71, "config/scripts/telemetry-bundle-constant-patterns.test.mjs": 51, "config/scripts/template-qualification-wait.test.mjs": 149, "config/scripts/terminal-ime-engagement-receipt.test.mjs": 55, "config/scripts/terminal-partial-escape-native-continuation.test.mjs": 2519, - "config/scripts/terminal-perf-dependency-preparation.test.mjs": 682, - "config/scripts/terminal-perf-report-annotations.test.mjs": 54, - "config/scripts/test-only-source-path.test.mjs": 38, + "config/scripts/performance/terminal-preparation/terminal-perf-dependency-preparation.test.mjs": 682, + "config/scripts/performance/terminal-reporting/terminal-perf-report-annotations.test.mjs": 54, + "config/scripts/static-analysis/process-boundaries/test-only-source-path.test.mjs": 38, "config/scripts/trim-windows-icon-source.test.mjs": 353, - "config/scripts/tsrs-typecheck-compiler.test.mjs": 719, - "config/scripts/typecheck-project-coverage.test.mjs": 689, + "config/scripts/typecheck/project-execution/tsrs-typecheck-compiler.test.mjs": 719, + "config/scripts/typecheck/project-execution/typecheck-project-coverage.test.mjs": 689, "config/scripts/undeclared-dependency-resolution.test.ts": 149, - "config/scripts/update-node-runtime-pin.test.mjs": 87, + "config/scripts/node-runtime/archive-identity/update-node-runtime-pin.test.mjs": 87, "config/scripts/validate-plugin-files.test.mjs": 2422, "config/scripts/verify-cli-bin.test.mjs": 135, "config/scripts/verify-dev-channel-packaging.test.mjs": 213, - "config/scripts/verify-linux-glibc-floor.test.mjs": 156, - "config/scripts/verify-linux-glibc-payloads.test.mjs": 190, + "config/scripts/native-build/linux/verify-linux-glibc-floor.test.mjs": 156, + "config/scripts/native-build/linux/verify-linux-glibc-payloads.test.mjs": 190, "config/scripts/verify-localization-catalog.test.mjs": 422, "config/scripts/verify-localization-catalogs.test.mjs": 1574, "config/scripts/verify-localization-extraction.test.mjs": 233, - "config/scripts/verify-packaged-browser-participation.test.mjs": 60, - "config/scripts/verify-packaged-daemon-entry.test.mjs": 2009, - "config/scripts/verify-packaged-mobile-web-bundle.test.mjs": 214, - "config/scripts/verify-packaged-node-pty-job-ownership.test.mjs": 93, - "config/scripts/verify-packaged-orcad-template.test.mjs": 454, - "config/scripts/verify-packaged-plugin-resources.test.mjs": 101, - "config/scripts/verify-packaged-serve-payload.test.mjs": 83, - "config/scripts/verify-packaged-windows-agent-hook.test.mjs": 43, + "config/scripts/desktop-distribution/runtime-verification/verify-packaged-browser-participation.test.mjs": 60, + "config/scripts/desktop-distribution/runtime-verification/verify-packaged-daemon-entry.test.mjs": 2009, + "config/scripts/desktop-distribution/runtime-verification/verify-packaged-mobile-web-bundle.test.mjs": 214, + "config/scripts/desktop-distribution/runtime-verification/verify-packaged-node-pty-job-ownership.test.mjs": 93, + "config/scripts/orcad-distribution/template/verify-packaged-orcad-template.test.mjs": 454, + "config/scripts/desktop-distribution/runtime-verification/verify-packaged-plugin-resources.test.mjs": 101, + "config/scripts/desktop-distribution/runtime-verification/verify-packaged-serve-payload.test.mjs": 83, + "config/scripts/desktop-distribution/runtime-verification/verify-packaged-windows-agent-hook.test.mjs": 43, "config/scripts/verify-release-required-assets.test.mjs": 50, - "config/scripts/verify-skills-cli-runtime.test.mjs": 213, + "config/scripts/runtime-verification/skills-cli/verify-skills-cli-runtime.test.mjs": 213, "config/scripts/verify-windows-inner-signature.test.mjs": 69, "config/scripts/verify-wsl-e2e-participation.test.mjs": 57, - "config/scripts/vitest-changed-precheck.test.mjs": 46, - "config/scripts/vitest-module-cache-resolution-key.test.ts": 50, - "config/scripts/vitest-node-runtime-boundary.test.ts": 2885, - "config/scripts/vitest-node-runtime-pool.test.ts": 560, - "config/scripts/vitest-real-agent-home-write-guard.test.ts": 71, - "config/scripts/vitest-run-filters.test.mjs": 146, - "config/scripts/vitest-run-temp-directory.test.mjs": 51, - "config/scripts/vitest-runtime-boundary.test.ts": 454, - "config/scripts/vitest-runtime-sequencer.test.mjs": 186, - "config/scripts/vitest-sqlite-runtime-boundary.test.ts": 452, - "config/scripts/vitest-sqlite-runtime-cache.test.ts": 226, - "config/scripts/vitest-zod-bundle.test.mjs": 184, + "config/scripts/test-runtime/execution-policy/vitest-changed-precheck.test.mjs": 46, + "config/scripts/test-runtime/module-cache/vitest-module-cache-resolution-key.test.ts": 50, + "config/scripts/test-runtime/node-worker/vitest-node-runtime-boundary.test.ts": 2885, + "config/scripts/test-runtime/node-worker/vitest-node-runtime-pool.test.ts": 560, + "config/scripts/test-runtime/environment/vitest-real-agent-home-write-guard.test.ts": 71, + "config/scripts/test-runtime/execution-policy/vitest-run-filters.test.mjs": 146, + "config/scripts/test-runtime/execution-policy/vitest-run-temp-directory.test.mjs": 51, + "config/scripts/test-runtime/environment/vitest-runtime-boundary.test.ts": 454, + "config/scripts/test-runtime/execution-policy/vitest-runtime-sequencer.test.mjs": 186, + "config/scripts/test-runtime/sqlite-admission/vitest-sqlite-runtime-boundary.test.ts": 452, + "config/scripts/test-runtime/sqlite-admission/vitest-sqlite-runtime-cache.test.ts": 226, + "config/scripts/test-runtime/module-cache/vitest-zod-bundle.test.mjs": 184, "config/scripts/websocket-server-loopback-bind.test.ts": 458, "config/scripts/win-crash-survival-e2e.test.mjs": 565, "config/scripts/win32-test-lane-registration.test.mjs": 3507, "config/scripts/windows-bin-spawn-predicate.test.mjs": 125, "config/scripts/windows-native-batch-reference-policy.test.ts": 363, - "config/scripts/windows-native-preparation-benchmark.test.mjs": 284, - "config/scripts/windows-native-toolchain-routing.test.mjs": 88, - "config/scripts/windows-pe-imports.test.mjs": 43, - "config/scripts/windows-pe-machine.test.mjs": 56, - "config/scripts/windows-process-tree-creation-time.test.mjs": 44, - "config/scripts/windows-process-tree-gyp-path.test.mjs": 35, - "config/scripts/windows-process-tree-gyp-rebuild.test.mjs": 116, - "config/scripts/windows-process-tree-prepared-addon.test.mjs": 231, + "config/scripts/native-build/windows/windows-native-preparation-benchmark.test.mjs": 284, + "config/scripts/workflow/source-routing/windows-native-toolchain-routing.test.mjs": 88, + "config/scripts/native-build/windows/windows-pe-imports.test.mjs": 43, + "config/scripts/native-build/windows/windows-pe-machine.test.mjs": 56, + "config/scripts/native-build/windows/windows-process-tree-creation-time.test.mjs": 44, + "config/scripts/native-build/windows/windows-process-tree-gyp-path.test.mjs": 35, + "config/scripts/native-build/windows/windows-process-tree-gyp-rebuild.test.mjs": 116, + "config/scripts/native-build/windows/windows-process-tree-prepared-addon.test.mjs": 231, "config/scripts/windows-pty-table-stress-observer.test.mjs": 101, "config/scripts/windows-security-reuse-benchmark.test.mjs": 247, "config/scripts/windows-uninstaller-signing.test.mjs": 65, "config/scripts/workflow-ref-mirror-case-safety.test.mjs": 447, "config/scripts/workflow-ref-reachability.test.mjs": 1650, - "config/scripts/workspace-source-exports.test.mjs": 117, - "config/scripts/wsl-e2e-lane-contract.test.mjs": 235, + "config/scripts/workspace/source-exports/workspace-source-exports.test.mjs": 117, + "config/scripts/workflow/source-routing/wsl-e2e-lane-contract.test.mjs": 235, "config/scripts/wsl-orcad-qualification-shell.test.mjs": 133, "config/scripts/wsl-orcad-qualification.test.mjs": 71, "config/scripts/wsl-orcad-workflow-qualification.test.mjs": 210, - "config/scripts/xterm-image-cell-payload-contract.test.mjs": 110, - "config/scripts/xterm-image-kitty-admission.test.mjs": 1430, - "config/scripts/xterm-image-kitty-coordinate-boundaries.test.mjs": 191, - "config/scripts/xterm-image-kitty-file-transport.test.mjs": 404, - "config/scripts/xterm-image-kitty-glyph-visibility.test.mjs": 250, - "config/scripts/xterm-image-kitty-placeholder-contract.test.mjs": 284, - "config/scripts/xterm-image-kitty-placeholder-lifecycle.test.mjs": 252, - "config/scripts/xterm-image-kitty-retransmit.test.mjs": 835, - "config/scripts/xterm-image-lifecycle-contract.test.mjs": 174, - "config/scripts/xterm-image-memory-contract.test.mjs": 368, - "config/scripts/xterm-image-resize-contract.test.mjs": 65, - "config/scripts/xterm-image-wasm-budget-contract.test.mjs": 469, - "config/scripts/xterm-underline-color-contract.test.mjs": 60, + "config/scripts/terminal-dependencies/xterm-patches/xterm-image-cell-payload-contract.test.mjs": 110, + "config/scripts/terminal-dependencies/xterm-patches/xterm-image-kitty-admission.test.mjs": 1430, + "config/scripts/terminal-dependencies/xterm-patches/xterm-image-kitty-coordinate-boundaries.test.mjs": 191, + "config/scripts/terminal-dependencies/xterm-patches/xterm-image-kitty-file-transport.test.mjs": 404, + "config/scripts/terminal-dependencies/xterm-patches/xterm-image-kitty-glyph-visibility.test.mjs": 250, + "config/scripts/terminal-dependencies/xterm-patches/xterm-image-kitty-placeholder-contract.test.mjs": 284, + "config/scripts/terminal-dependencies/xterm-patches/xterm-image-kitty-placeholder-lifecycle.test.mjs": 252, + "config/scripts/terminal-dependencies/xterm-patches/xterm-image-kitty-retransmit.test.mjs": 835, + "config/scripts/terminal-dependencies/xterm-patches/xterm-image-lifecycle-contract.test.mjs": 174, + "config/scripts/terminal-dependencies/xterm-patches/xterm-image-memory-contract.test.mjs": 368, + "config/scripts/terminal-dependencies/xterm-patches/xterm-image-resize-contract.test.mjs": 65, + "config/scripts/terminal-dependencies/xterm-patches/xterm-image-wasm-budget-contract.test.mjs": 469, + "config/scripts/terminal-dependencies/xterm-patches/xterm-underline-color-contract.test.mjs": 60, "config/scripts/zcode-credential-workflow.test.mjs": 668, - "config/scripts/zip-extractor-command.test.mjs": 74, + "config/scripts/archives/platform-command/zip-extractor-command.test.mjs": 74, "src/cli/account-add-process.test.ts": 33700, "src/cli/agent-context.test.ts": 142, "src/cli/agent-launch-process.test.ts": 2348, diff --git a/config/scripts/ci-pnpm-store-benchmark.mjs b/config/scripts/ci/dependency-cache/ci-pnpm-store-benchmark.mjs similarity index 95% rename from config/scripts/ci-pnpm-store-benchmark.mjs rename to config/scripts/ci/dependency-cache/ci-pnpm-store-benchmark.mjs index dbb728972a9..d62a20e4638 100644 --- a/config/scripts/ci-pnpm-store-benchmark.mjs +++ b/config/scripts/ci/dependency-cache/ci-pnpm-store-benchmark.mjs @@ -13,16 +13,16 @@ import { tmpdir } from 'node:os' import { dirname, join, resolve } from 'node:path' import { performance } from 'node:perf_hooks' import { parseArgs } from 'node:util' -import { resolvePnpmCliInvocation } from './pnpm-cli-invocation.mjs' +import { resolvePnpmCliInvocation } from '../../tool-invocation/pnpm-cli-invocation.mjs' import { runProcessSync } from '@orca/process-host' -import { workspacePackageManifests } from './workspace-source-exports.mjs' +import { workspacePackageManifests } from '../../workspace/source-exports/workspace-source-exports.mjs' const { values } = parseArgs({ options: { samples: { type: 'string', default: '3' }, output: { type: 'string' } } }) const samples = Number(values.samples) assert(Number.isInteger(samples) && samples > 0 && samples <= 10, '--samples must be 1–10') -const repository = resolve(import.meta.dirname, '../..') +const repository = resolve(import.meta.dirname, '../../../..') const temporary = mkdtempSync(join(tmpdir(), 'orca-ci-pnpm-store-')) const checkout = join(temporary, 'checkout') const store = join(temporary, 'store') diff --git a/config/scripts/ci-pnpm-store-mode.test.mjs b/config/scripts/ci/dependency-cache/ci-pnpm-store-mode.test.mjs similarity index 100% rename from config/scripts/ci-pnpm-store-mode.test.mjs rename to config/scripts/ci/dependency-cache/ci-pnpm-store-mode.test.mjs diff --git a/config/scripts/ci-e2e-failure-summary.mjs b/config/scripts/ci/e2e-failures/ci-e2e-failure-summary.mjs similarity index 97% rename from config/scripts/ci-e2e-failure-summary.mjs rename to config/scripts/ci/e2e-failures/ci-e2e-failure-summary.mjs index f95fed20dac..3d6557f68d4 100644 --- a/config/scripts/ci-e2e-failure-summary.mjs +++ b/config/scripts/ci/e2e-failures/ci-e2e-failure-summary.mjs @@ -80,7 +80,7 @@ if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) try { const summary = e2eFailureSummary(JSON.parse(readFileSync(process.argv[2], 'utf8'))) const records = JSON.parse( - readFileSync(new URL('../e2e-failure-tracking.json', import.meta.url), 'utf8') + readFileSync(new URL('../../../e2e-failure-tracking.json', import.meta.url), 'utf8') ) appendFileSync(process.env.GITHUB_STEP_SUMMARY, renderE2eFailures(summary, records)) } catch (error) { diff --git a/config/scripts/ci-e2e-failure-summary.test.mjs b/config/scripts/ci/e2e-failures/ci-e2e-failure-summary.test.mjs similarity index 100% rename from config/scripts/ci-e2e-failure-summary.test.mjs rename to config/scripts/ci/e2e-failures/ci-e2e-failure-summary.test.mjs diff --git a/config/scripts/ci-e2e-failure-tracking.mjs b/config/scripts/ci/e2e-failures/ci-e2e-failure-tracking.mjs similarity index 100% rename from config/scripts/ci-e2e-failure-tracking.mjs rename to config/scripts/ci/e2e-failures/ci-e2e-failure-tracking.mjs diff --git a/config/scripts/ci-e2e-job-selection.mjs b/config/scripts/ci/e2e-selection/ci-e2e-job-selection.mjs similarity index 100% rename from config/scripts/ci-e2e-job-selection.mjs rename to config/scripts/ci/e2e-selection/ci-e2e-job-selection.mjs diff --git a/config/scripts/ci-e2e-job-selection.test.mjs b/config/scripts/ci/e2e-selection/ci-e2e-job-selection.test.mjs similarity index 97% rename from config/scripts/ci-e2e-job-selection.test.mjs rename to config/scripts/ci/e2e-selection/ci-e2e-job-selection.test.mjs index c470b5b5887..eba209d074e 100644 --- a/config/scripts/ci-e2e-job-selection.test.mjs +++ b/config/scripts/ci/e2e-selection/ci-e2e-job-selection.test.mjs @@ -51,7 +51,7 @@ it('retains allocations when selection evidence is incomplete', () => { }) it('publishes conservative hints for malformed evidence and refuses a malformed consumer list', async () => { - const program = 'config/scripts/ci-e2e-job-selection.mjs' + const program = 'config/scripts/ci/e2e-selection/ci-e2e-job-selection.mjs' const consumer = await runProcess({ program: process.execPath, args: [program], diff --git a/config/scripts/ci-e2e-shard-plan.mjs b/config/scripts/ci/e2e-selection/ci-e2e-shard-plan.mjs similarity index 98% rename from config/scripts/ci-e2e-shard-plan.mjs rename to config/scripts/ci/e2e-selection/ci-e2e-shard-plan.mjs index 183e279c9eb..709413763fc 100644 --- a/config/scripts/ci-e2e-shard-plan.mjs +++ b/config/scripts/ci/e2e-selection/ci-e2e-shard-plan.mjs @@ -7,7 +7,7 @@ import { compareIds, readTimingBaseline, writeAssignment -} from './ci-shard-assignment.mjs' +} from '../sharding/ci-shard-assignment.mjs' export function discoverE2eFiles(report) { if (report.errors?.length) { diff --git a/config/scripts/ci-e2e-shard-selection.test.mjs b/config/scripts/ci/e2e-selection/ci-e2e-shard-selection.test.mjs similarity index 96% rename from config/scripts/ci-e2e-shard-selection.test.mjs rename to config/scripts/ci/e2e-selection/ci-e2e-shard-selection.test.mjs index b7fc2f5c8d7..b9b5d3209c3 100644 --- a/config/scripts/ci-e2e-shard-selection.test.mjs +++ b/config/scripts/ci/e2e-selection/ci-e2e-shard-selection.test.mjs @@ -6,7 +6,7 @@ import { expect, it } from 'vitest' import { runProcess } from '@orca/process-host' import { planE2e, verifyE2eSelection } from './ci-e2e-shard-plan.mjs' -const require = createRequire(import.meta.url) +const require = createRequire(new URL('../../ci-e2e-shard-selection.test.mjs', import.meta.url)) it('native Playwright test-list preserves full discovery, serial suites, skips and headful filtering', async () => { const directory = realpathSync(mkdtempSync(join(tmpdir(), 'orca-playwright-shards-'))) diff --git a/config/scripts/ci-job-executions.mjs b/config/scripts/ci/runner-capacity/ci-job-executions.mjs similarity index 100% rename from config/scripts/ci-job-executions.mjs rename to config/scripts/ci/runner-capacity/ci-job-executions.mjs diff --git a/config/scripts/ci-runner-demand.mjs b/config/scripts/ci/runner-capacity/ci-runner-demand.mjs similarity index 100% rename from config/scripts/ci-runner-demand.mjs rename to config/scripts/ci/runner-capacity/ci-runner-demand.mjs diff --git a/config/scripts/ci-runner-metrics.mjs b/config/scripts/ci/runner-capacity/ci-runner-metrics.mjs similarity index 100% rename from config/scripts/ci-runner-metrics.mjs rename to config/scripts/ci/runner-capacity/ci-runner-metrics.mjs diff --git a/config/scripts/ci-runner-metrics.test.mjs b/config/scripts/ci/runner-capacity/ci-runner-metrics.test.mjs similarity index 100% rename from config/scripts/ci-runner-metrics.test.mjs rename to config/scripts/ci/runner-capacity/ci-runner-metrics.test.mjs diff --git a/config/scripts/ci-shard-assignment.mjs b/config/scripts/ci/sharding/ci-shard-assignment.mjs similarity index 96% rename from config/scripts/ci-shard-assignment.mjs rename to config/scripts/ci/sharding/ci-shard-assignment.mjs index 2bdc7a5ad5d..2b76c9a685f 100644 --- a/config/scripts/ci-shard-assignment.mjs +++ b/config/scripts/ci/sharding/ci-shard-assignment.mjs @@ -48,7 +48,7 @@ export function balanceFiles(files, count, timings, overheadMs = 0) { } export function readTimingBaseline(suite) { - const bytes = readFileSync(new URL('./ci-shard-timings.json', import.meta.url), 'utf8') + const bytes = readFileSync(new URL('../../ci-shard-timings.json', import.meta.url), 'utf8') const baseline = JSON.parse(bytes) return { ...baseline[suite], baselineSha256: createHash('sha256').update(bytes).digest('hex') } } diff --git a/config/scripts/ci-shard-assignment.test.mjs b/config/scripts/ci/sharding/ci-shard-assignment.test.mjs similarity index 97% rename from config/scripts/ci-shard-assignment.test.mjs rename to config/scripts/ci/sharding/ci-shard-assignment.test.mjs index cdc4ed247d1..f329684d542 100644 --- a/config/scripts/ci-shard-assignment.test.mjs +++ b/config/scripts/ci/sharding/ci-shard-assignment.test.mjs @@ -1,6 +1,10 @@ import { describe, expect, it } from 'vitest' import { balanceFiles } from './ci-shard-assignment.mjs' -import { discoverE2eFiles, planE2e, verifyE2eSelection } from './ci-e2e-shard-plan.mjs' +import { + discoverE2eFiles, + planE2e, + verifyE2eSelection +} from '../e2e-selection/ci-e2e-shard-plan.mjs' import { parseTimingLog } from './ci-shard-timing-import.mjs' describe('timing-weighted shard selection', () => { diff --git a/config/scripts/ci-shard-timing-import.mjs b/config/scripts/ci/sharding/ci-shard-timing-import.mjs similarity index 100% rename from config/scripts/ci-shard-timing-import.mjs rename to config/scripts/ci/sharding/ci-shard-timing-import.mjs diff --git a/config/scripts/ci-shard-timings.md b/config/scripts/ci/sharding/ci-shard-timings.md similarity index 97% rename from config/scripts/ci-shard-timings.md rename to config/scripts/ci/sharding/ci-shard-timings.md index 8e51109e65b..d1f89129b64 100644 --- a/config/scripts/ci-shard-timings.md +++ b/config/scripts/ci/sharding/ci-shard-timings.md @@ -68,7 +68,7 @@ baseline. Runs from before the fixes are not comparable, because their `pty-subp files still carried 5-second waits. ```sh -node config/scripts/ci-unit-timing-import.mjs RUN_DIR... config/scripts/ci-shard-timings.json +node config/scripts/ci/sharding/ci-unit-timing-import.mjs RUN_DIR... config/scripts/ci-shard-timings.json ``` Each directory holds one run's twelve `unit-shard-node-*` artifacts. Every run is validated @@ -217,7 +217,7 @@ API, source workflow/config, report provenance and exact file coverage against t saved assignments, then run: ```sh -node config/scripts/ci-unit-timing-import.mjs ARTIFACT_DIRECTORY config/scripts/ci-shard-timings.json +node config/scripts/ci/sharding/ci-unit-timing-import.mjs ARTIFACT_DIRECTORY config/scripts/ci-shard-timings.json ``` The importer rejects missing or duplicate shards, duplicate files, failed unit reports, @@ -234,7 +234,7 @@ job IDs from the Actions jobs API and fetch each with lanes or multiple attempts. Then run: ```sh -node config/scripts/ci-shard-timing-import.mjs LOG_DIRECTORY UNIT_RUN_ID E2E_RUN_ID config/scripts/ci-shard-timings.json +node config/scripts/ci/sharding/ci-shard-timing-import.mjs LOG_DIRECTORY UNIT_RUN_ID E2E_RUN_ID config/scripts/ci-shard-timings.json ``` The initial source logs are in `/tmp/orca-ci-shard-logs`; two were reused from diff --git a/config/scripts/ci-unit-sequencer.mjs b/config/scripts/ci/sharding/ci-unit-sequencer.mjs similarity index 95% rename from config/scripts/ci-unit-sequencer.mjs rename to config/scripts/ci/sharding/ci-unit-sequencer.mjs index a609e03657e..59945003558 100644 --- a/config/scripts/ci-unit-sequencer.mjs +++ b/config/scripts/ci/sharding/ci-unit-sequencer.mjs @@ -1,6 +1,6 @@ import { relative } from 'node:path' import { readFileSync } from 'node:fs' -import RuntimeSequencer from './vitest-runtime-sequencer.mjs' +import RuntimeSequencer from '../../test-runtime/execution-policy/vitest-runtime-sequencer.mjs' import { balanceFiles, readTimingBaseline, writeAssignment } from './ci-shard-assignment.mjs' export default class TimingSequencer extends RuntimeSequencer { diff --git a/config/scripts/ci-unit-sequencer.test.mjs b/config/scripts/ci/sharding/ci-unit-sequencer.test.mjs similarity index 100% rename from config/scripts/ci-unit-sequencer.test.mjs rename to config/scripts/ci/sharding/ci-unit-sequencer.test.mjs diff --git a/config/scripts/ci-unit-timing-import.mjs b/config/scripts/ci/sharding/ci-unit-timing-import.mjs similarity index 100% rename from config/scripts/ci-unit-timing-import.mjs rename to config/scripts/ci/sharding/ci-unit-timing-import.mjs diff --git a/config/scripts/ci-unit-timing-reporter.mjs b/config/scripts/ci/sharding/ci-unit-timing-reporter.mjs similarity index 98% rename from config/scripts/ci-unit-timing-reporter.mjs rename to config/scripts/ci/sharding/ci-unit-timing-reporter.mjs index e3ac8fcede4..237c5909148 100644 --- a/config/scripts/ci-unit-timing-reporter.mjs +++ b/config/scripts/ci/sharding/ci-unit-timing-reporter.mjs @@ -1,7 +1,7 @@ import { relative, resolve } from 'node:path' import { appendFileSync, readFileSync } from 'node:fs' import { writeAssignment } from './ci-shard-assignment.mjs' -import { auditUnitSelection } from './ci-unit-selection.mjs' +import { auditUnitSelection } from '../unit-selection/ci-unit-selection.mjs' export const UNIT_PHASE_FILE_LIMIT = 50_000 const phaseNames = [ diff --git a/config/scripts/ci-unit-timing-reporter.test.mjs b/config/scripts/ci/sharding/ci-unit-timing-reporter.test.mjs similarity index 100% rename from config/scripts/ci-unit-timing-reporter.test.mjs rename to config/scripts/ci/sharding/ci-unit-timing-reporter.test.mjs diff --git a/config/scripts/ci-unit-module-cache-contents.mjs b/config/scripts/ci/unit-cache/ci-unit-module-cache-contents.mjs similarity index 100% rename from config/scripts/ci-unit-module-cache-contents.mjs rename to config/scripts/ci/unit-cache/ci-unit-module-cache-contents.mjs diff --git a/config/scripts/ci-unit-module-cache-contents.test.mjs b/config/scripts/ci/unit-cache/ci-unit-module-cache-contents.test.mjs similarity index 100% rename from config/scripts/ci-unit-module-cache-contents.test.mjs rename to config/scripts/ci/unit-cache/ci-unit-module-cache-contents.test.mjs diff --git a/config/scripts/ci-unit-module-cache-trailer.mjs b/config/scripts/ci/unit-cache/ci-unit-module-cache-trailer.mjs similarity index 100% rename from config/scripts/ci-unit-module-cache-trailer.mjs rename to config/scripts/ci/unit-cache/ci-unit-module-cache-trailer.mjs diff --git a/config/scripts/ci-unit-module-cache.mjs b/config/scripts/ci/unit-cache/ci-unit-module-cache.mjs similarity index 91% rename from config/scripts/ci-unit-module-cache.mjs rename to config/scripts/ci/unit-cache/ci-unit-module-cache.mjs index ed02b289729..b8d9673ec76 100644 --- a/config/scripts/ci-unit-module-cache.mjs +++ b/config/scripts/ci/unit-cache/ci-unit-module-cache.mjs @@ -13,12 +13,12 @@ import { join, resolve } from 'node:path' import { performance } from 'node:perf_hooks' import { pathToFileURL } from 'node:url' import { runProcessSync } from '@orca/process-host' -import { collectNodeServerInputs } from './node-server-change-scope.mjs' -import { workspacePackageManifests } from './workspace-source-exports.mjs' -import { writeAssignment } from './ci-shard-assignment.mjs' +import { collectNodeServerInputs } from '../../node-server/qualification/node-server-change-scope.mjs' +import { workspacePackageManifests } from '../../workspace/source-exports/workspace-source-exports.mjs' +import { writeAssignment } from '../sharding/ci-shard-assignment.mjs' import { sealModuleCache, validateModuleCache } from './ci-unit-module-cache-contents.mjs' -const ROOT = resolve(import.meta.dirname, '../..') +const ROOT = resolve(import.meta.dirname, '../../../..') const IDENTITY_REPORT = 'ci-shards/unit-module-cache-identity.json' const CACHE_REPORT = 'ci-shards/unit-module-cache.json' const CACHE_FORMAT = '1.0.0-beta.8' @@ -44,8 +44,8 @@ export async function moduleCachePolicyHash(root = ROOT) { root, entryPoints: [ 'config/vitest.config.ts', - 'config/scripts/run-vitest.mjs', - 'config/scripts/ci-unit-timing-reporter.mjs', + 'config/scripts/test-runtime/execution-policy/run-vitest.mjs', + 'config/scripts/ci/sharding/ci-unit-timing-reporter.mjs', ...runnerScripts ] }) @@ -64,9 +64,9 @@ export async function moduleCachePolicyHash(root = ROOT) { 'config/pnpmfile.cjs', 'config/.bun-version', 'config/dark-build-switches.cjs', - 'config/scripts/ci-unit-module-cache.mjs', - 'config/scripts/ci-unit-module-cache-contents.mjs', - 'config/scripts/ci-unit-module-cache-trailer.mjs' + 'config/scripts/ci/unit-cache/ci-unit-module-cache.mjs', + 'config/scripts/ci/unit-cache/ci-unit-module-cache-contents.mjs', + 'config/scripts/ci/unit-cache/ci-unit-module-cache-trailer.mjs' ]) } diff --git a/config/scripts/ci-unit-module-cache.test.mjs b/config/scripts/ci/unit-cache/ci-unit-module-cache.test.mjs similarity index 100% rename from config/scripts/ci-unit-module-cache.test.mjs rename to config/scripts/ci/unit-cache/ci-unit-module-cache.test.mjs diff --git a/config/scripts/ci-unit-matrix.mjs b/config/scripts/ci/unit-selection/ci-unit-matrix.mjs similarity index 100% rename from config/scripts/ci-unit-matrix.mjs rename to config/scripts/ci/unit-selection/ci-unit-matrix.mjs diff --git a/config/scripts/ci-unit-plan.mjs b/config/scripts/ci/unit-selection/ci-unit-plan.mjs similarity index 88% rename from config/scripts/ci-unit-plan.mjs rename to config/scripts/ci/unit-selection/ci-unit-plan.mjs index 0e8af1dc596..1967af94d68 100644 --- a/config/scripts/ci-unit-plan.mjs +++ b/config/scripts/ci/unit-selection/ci-unit-plan.mjs @@ -1,11 +1,11 @@ import { appendFileSync } from 'node:fs' import { pathToFileURL } from 'node:url' import { runProcessSync } from '@orca/process-host' -import { collectUnitDependencyGraph } from './ci-unit-dependency-graph.mjs' -import { discoverUnitFiles } from './ci-unit-files.mjs' +import { collectUnitDependencyGraph } from './dependency-graph/ci-unit-dependency-graph.mjs' +import { discoverUnitFiles } from './dependency-graph/ci-unit-files.mjs' import { planUnitSelection } from './ci-unit-selection.mjs' import { fullUnitMatrix } from './ci-unit-matrix.mjs' -import { readTimingBaseline, writeAssignment } from './ci-shard-assignment.mjs' +import { readTimingBaseline, writeAssignment } from '../sharding/ci-shard-assignment.mjs' export function prepareUnitPlan(env = process.env) { const shards = fullUnitMatrix(env.ORCA_UNIT_FULL_SHARD_COUNT) diff --git a/config/scripts/ci-unit-plan.test.mjs b/config/scripts/ci/unit-selection/ci-unit-plan.test.mjs similarity index 99% rename from config/scripts/ci-unit-plan.test.mjs rename to config/scripts/ci/unit-selection/ci-unit-plan.test.mjs index 82a8238c9a4..c716895a7c0 100644 --- a/config/scripts/ci-unit-plan.test.mjs +++ b/config/scripts/ci/unit-selection/ci-unit-plan.test.mjs @@ -12,7 +12,7 @@ import { join } from 'node:path' import { fileURLToPath } from 'node:url' import { expect, it } from 'vitest' import { runProcessSync } from '@orca/process-host' -import { FULL_SHARD_COUNT } from './ci-unit-selection.mjs' +import { FULL_SHARD_COUNT } from './ci-unit-matrix.mjs' it('emits the full matrix from a sparse checkout without dependencies or test discovery', () => { const root = realpathSync(mkdtempSync(join(tmpdir(), 'orca-unit-matrix-'))) diff --git a/config/scripts/ci-unit-selection-review.mjs b/config/scripts/ci/unit-selection/ci-unit-selection-review.mjs similarity index 100% rename from config/scripts/ci-unit-selection-review.mjs rename to config/scripts/ci/unit-selection/ci-unit-selection-review.mjs diff --git a/config/scripts/ci-unit-selection-review.test.mjs b/config/scripts/ci/unit-selection/ci-unit-selection-review.test.mjs similarity index 100% rename from config/scripts/ci-unit-selection-review.test.mjs rename to config/scripts/ci/unit-selection/ci-unit-selection-review.test.mjs diff --git a/config/scripts/ci-unit-selection.mjs b/config/scripts/ci/unit-selection/ci-unit-selection.mjs similarity index 84% rename from config/scripts/ci-unit-selection.mjs rename to config/scripts/ci/unit-selection/ci-unit-selection.mjs index a4e7a5f62ce..b2d15b62838 100644 --- a/config/scripts/ci-unit-selection.mjs +++ b/config/scripts/ci/unit-selection/ci-unit-selection.mjs @@ -1,20 +1,21 @@ -import { unitConsumers } from './ci-unit-dependency-graph.mjs' -import { balanceFiles } from './ci-shard-assignment.mjs' -import { UNIT_SETUP_FILES } from './ci-unit-files.mjs' +import { unitConsumers } from './dependency-graph/ci-unit-dependency-graph.mjs' +import { balanceFiles } from '../sharding/ci-shard-assignment.mjs' +import { UNIT_SETUP_FILES } from './dependency-graph/ci-unit-files.mjs' import { FULL_SHARD_COUNT } from './ci-unit-matrix.mjs' -export { FULL_SHARD_COUNT } from './ci-unit-matrix.mjs' - const RUNTIME_ENTRY_POINTS = new Set([ 'config/vitest.config.ts', - 'config/scripts/run-vitest.mjs', + 'config/scripts/test-runtime/execution-policy/run-vitest.mjs', ...UNIT_SETUP_FILES ]) function isUnitRuntimeEntryPoint(file) { return ( RUNTIME_ENTRY_POINTS.has(file) || - (/^config\/scripts\/vitest[^/]*\.(?:ts|mjs)$/.test(file) && !file.includes('.test.')) + (/^config\/scripts\/(?:test-runtime\/environment\/|test-runtime\/execution-policy\/|test-runtime\/dom\/|test-runtime\/module-cache\/|test-runtime\/node-worker\/|test-runtime\/sqlite-admission\/)?vitest[^/]*\.(?:ts|mjs)$/.test( + file + ) && + !file.includes('.test.')) ) } diff --git a/config/scripts/ci-unit-selection.test.mjs b/config/scripts/ci/unit-selection/ci-unit-selection.test.mjs similarity index 94% rename from config/scripts/ci-unit-selection.test.mjs rename to config/scripts/ci/unit-selection/ci-unit-selection.test.mjs index adf8946b9f9..e88a164937f 100644 --- a/config/scripts/ci-unit-selection.test.mjs +++ b/config/scripts/ci/unit-selection/ci-unit-selection.test.mjs @@ -1,12 +1,8 @@ import { describe, expect, it } from 'vitest' -import { buildUnitDependencyGraph } from './ci-unit-dependency-graph.mjs' -import { UNIT_SETUP_FILES } from './ci-unit-files.mjs' -import { - FULL_SHARD_COUNT, - auditUnitSelection, - planUnitSelection, - selectUnitFiles -} from './ci-unit-selection.mjs' +import { buildUnitDependencyGraph } from './dependency-graph/ci-unit-dependency-graph.mjs' +import { UNIT_SETUP_FILES } from './dependency-graph/ci-unit-files.mjs' +import { auditUnitSelection, planUnitSelection, selectUnitFiles } from './ci-unit-selection.mjs' +import { FULL_SHARD_COUNT } from './ci-unit-matrix.mjs' const sources = new Map( Object.entries({ @@ -29,16 +25,16 @@ const files = [...sources.keys()].filter((file) => file.endsWith('.test.ts')).so describe('conservative unit selection', () => { it.each([ 'config/vitest.config.ts', - 'config/scripts/run-vitest.mjs', + 'config/scripts/test-runtime/execution-policy/run-vitest.mjs', ...UNIT_SETUP_FILES, - 'config/scripts/vitest-node-runtime-worker.mjs' + 'config/scripts/test-runtime/node-worker/vitest-node-runtime-worker.mjs' ])('retains every test for a transitive dependency of %s', (runtime) => { const sources = new Map([ ['src/input.ts', 'export const value = 1'], ['config/scripts/setup-forward.ts', "export * from '../../src/input'"], [ runtime, - `import '${runtime === 'config/vitest.config.ts' ? './scripts' : '.'}/setup-forward'` + `import '${runtime === 'config/vitest.config.ts' ? './scripts' : '../..'}/setup-forward'` ], ['src/direct.test.ts', "import './input'"], ['src/unrelated.test.ts', 'export const value = 1'] diff --git a/config/scripts/ci-unit-dependency-graph.mjs b/config/scripts/ci/unit-selection/dependency-graph/ci-unit-dependency-graph.mjs similarity index 93% rename from config/scripts/ci-unit-dependency-graph.mjs rename to config/scripts/ci/unit-selection/dependency-graph/ci-unit-dependency-graph.mjs index 82b2402328b..6036aa4d91a 100644 --- a/config/scripts/ci-unit-dependency-graph.mjs +++ b/config/scripts/ci/unit-selection/dependency-graph/ci-unit-dependency-graph.mjs @@ -1,7 +1,7 @@ import { globSync, readFileSync } from 'node:fs' import { posix, join } from 'node:path' import ts from 'typescript-api' -import { createWorkspaceSourceResolver } from './workspace-source-exports.mjs' +import { createWorkspaceSourceResolver } from '../../../workspace/source-exports/workspace-source-exports.mjs' import { hasIndirectUnitInputs } from './ci-unit-indirect-inputs.mjs' import { checkUnitInputOwnership, @@ -105,10 +105,10 @@ export function buildUnitDependencyGraph( const runtime = unitConsumers( [ 'config/vitest.config.ts', - 'config/scripts/run-vitest.mjs', - 'config/scripts/ci-unit-dependency-graph.mjs', - 'config/scripts/ci-unit-input-ownership.mjs', - 'config/scripts/ci-unit-selection.mjs', + 'config/scripts/test-runtime/execution-policy/run-vitest.mjs', + 'config/scripts/ci/unit-selection/dependency-graph/ci-unit-dependency-graph.mjs', + 'config/scripts/ci/unit-selection/dependency-graph/ci-unit-input-ownership.mjs', + 'config/scripts/ci/unit-selection/ci-unit-selection.mjs', ...UNIT_SETUP_FILES, ...[...sources.keys()].filter((file) => /^config\/tsconfig[^/]*\.json$/.test(file)) ], diff --git a/config/scripts/ci-unit-dependency-graph.test.mjs b/config/scripts/ci/unit-selection/dependency-graph/ci-unit-dependency-graph.test.mjs similarity index 99% rename from config/scripts/ci-unit-dependency-graph.test.mjs rename to config/scripts/ci/unit-selection/dependency-graph/ci-unit-dependency-graph.test.mjs index e46e16bcf40..38fb988ed01 100644 --- a/config/scripts/ci-unit-dependency-graph.test.mjs +++ b/config/scripts/ci/unit-selection/dependency-graph/ci-unit-dependency-graph.test.mjs @@ -6,7 +6,7 @@ import { buildUnitDependencyGraph, collectUnitDependencyGraph } from './ci-unit-dependency-graph.mjs' -import { selectUnitFiles } from './ci-unit-selection.mjs' +import { selectUnitFiles } from '../ci-unit-selection.mjs' const temporary = [] afterEach(() => { diff --git a/config/scripts/ci-unit-exclusion-coverage.test.mjs b/config/scripts/ci/unit-selection/dependency-graph/ci-unit-exclusion-coverage.test.mjs similarity index 97% rename from config/scripts/ci-unit-exclusion-coverage.test.mjs rename to config/scripts/ci/unit-selection/dependency-graph/ci-unit-exclusion-coverage.test.mjs index 7d9e5e31f9a..7bb2b99ccae 100644 --- a/config/scripts/ci-unit-exclusion-coverage.test.mjs +++ b/config/scripts/ci/unit-selection/dependency-graph/ci-unit-exclusion-coverage.test.mjs @@ -3,7 +3,7 @@ import { parse } from 'yaml' import { defaultExclude } from 'vitest/config' import { describe, expect, it } from 'vitest' import { CROSS_VERSION_WIRE_DIR, UNIT_INCLUDE, discoverUnitFiles } from './ci-unit-files.mjs' -import { classifyPrJobs } from './pr-code-change-scope.mjs' +import { classifyPrJobs } from '../../../workflow/source-routing/pr-code-change-scope.mjs' function posixPaths(files) { return files.map((file) => file.replaceAll('\\', '/')) diff --git a/config/scripts/ci-unit-files.mjs b/config/scripts/ci/unit-selection/dependency-graph/ci-unit-files.mjs similarity index 87% rename from config/scripts/ci-unit-files.mjs rename to config/scripts/ci/unit-selection/dependency-graph/ci-unit-files.mjs index 2bd224d6509..8fe99f880e3 100644 --- a/config/scripts/ci-unit-files.mjs +++ b/config/scripts/ci/unit-selection/dependency-graph/ci-unit-files.mjs @@ -14,13 +14,13 @@ export const UNIT_INCLUDE = [ ] export const UNIT_SETUP_FILES = [ - 'config/scripts/vitest-real-agent-home-write-guard.ts', - 'config/scripts/vitest-bun-node-builtins.ts', - 'config/scripts/vitest-dom-setup.ts', - 'config/scripts/vitest-host-ports-setup.ts', - 'config/scripts/vitest-caller-identity-env-setup.ts', - 'config/scripts/vitest-inherited-git-env-setup.ts', - 'config/scripts/vitest-orcad-feature-readiness-reset.ts' + 'config/scripts/test-runtime/environment/vitest-real-agent-home-write-guard.ts', + 'config/scripts/test-runtime/environment/vitest-bun-node-builtins.ts', + 'config/scripts/test-runtime/dom/vitest-dom-setup.ts', + 'config/scripts/test-runtime/environment/vitest-host-ports-setup.ts', + 'config/scripts/test-runtime/environment/vitest-caller-identity-env-setup.ts', + 'config/scripts/test-runtime/environment/vitest-inherited-git-env-setup.ts', + 'config/scripts/test-runtime/environment/vitest-orcad-feature-readiness-reset.ts' ] export const UNIT_EXCLUDE = [ diff --git a/config/scripts/ci-unit-indirect-inputs.mjs b/config/scripts/ci/unit-selection/dependency-graph/ci-unit-indirect-inputs.mjs similarity index 95% rename from config/scripts/ci-unit-indirect-inputs.mjs rename to config/scripts/ci/unit-selection/dependency-graph/ci-unit-indirect-inputs.mjs index 57d188b96dc..d3a7a904704 100644 --- a/config/scripts/ci-unit-indirect-inputs.mjs +++ b/config/scripts/ci/unit-selection/dependency-graph/ci-unit-indirect-inputs.mjs @@ -1,5 +1,9 @@ import ts from 'typescript-api' -import { literalString, propertyName, unwrap } from './static-module-specifiers.mjs' +import { + literalString, + propertyName, + unwrap +} from '../../../static-analysis/module-requests/static-module-specifiers.mjs' const INDIRECT_NAME = /^(?:readFile\w*|readdir\w*|glob(?:Sync|Stream|Iterate|SyncIterate|StreamSync)?|spawn(?:Sync)?|execFile(?:Sync)?|execSync|runProcess\w*|fork|Worker|createRequire|getBuiltinModule|create(?:Incremental|Watch|EmitAndSemanticDiagnosticsBuilder|SemanticDiagnosticsBuilder)?Program|createSolutionBuilder(?:WithWatch)?|createLanguageService|getParsedCommandLineOfConfigFile|parseJson(?:SourceFile)?ConfigFileContent|readConfigFile|resolveModuleName|resolveTypeReferenceDirective|readDirectory|eval|Function)$/ diff --git a/config/scripts/ci-unit-indirect-inputs.test.mjs b/config/scripts/ci/unit-selection/dependency-graph/ci-unit-indirect-inputs.test.mjs similarity index 98% rename from config/scripts/ci-unit-indirect-inputs.test.mjs rename to config/scripts/ci/unit-selection/dependency-graph/ci-unit-indirect-inputs.test.mjs index ee930f5e5a1..1145a0d2683 100644 --- a/config/scripts/ci-unit-indirect-inputs.test.mjs +++ b/config/scripts/ci/unit-selection/dependency-graph/ci-unit-indirect-inputs.test.mjs @@ -1,6 +1,6 @@ import { expect, it } from 'vitest' import { buildUnitDependencyGraph } from './ci-unit-dependency-graph.mjs' -import { selectUnitFiles } from './ci-unit-selection.mjs' +import { selectUnitFiles } from '../ci-unit-selection.mjs' function selected(source) { const sources = new Map([ diff --git a/config/scripts/ci-unit-input-ownership.json b/config/scripts/ci/unit-selection/dependency-graph/ci-unit-input-ownership.json similarity index 100% rename from config/scripts/ci-unit-input-ownership.json rename to config/scripts/ci/unit-selection/dependency-graph/ci-unit-input-ownership.json diff --git a/config/scripts/ci-unit-input-ownership.mjs b/config/scripts/ci/unit-selection/dependency-graph/ci-unit-input-ownership.mjs similarity index 92% rename from config/scripts/ci-unit-input-ownership.mjs rename to config/scripts/ci/unit-selection/dependency-graph/ci-unit-input-ownership.mjs index bf518935540..751d6a36164 100644 --- a/config/scripts/ci-unit-input-ownership.mjs +++ b/config/scripts/ci/unit-selection/dependency-graph/ci-unit-input-ownership.mjs @@ -24,7 +24,13 @@ function repositoryInput(path) { export function readUnitInputOwnership(root) { try { const manifest = JSON.parse( - readFileSync(join(root, 'config/scripts/ci-unit-input-ownership.json'), 'utf8') + readFileSync( + join( + root, + 'config/scripts/ci/unit-selection/dependency-graph/ci-unit-input-ownership.json' + ), + 'utf8' + ) ) return manifest?.version === 1 && Array.isArray(manifest.records) ? manifest.records : [] } catch { diff --git a/config/scripts/ci-unit-input-ownership.test.mjs b/config/scripts/ci/unit-selection/dependency-graph/ci-unit-input-ownership.test.mjs similarity index 97% rename from config/scripts/ci-unit-input-ownership.test.mjs rename to config/scripts/ci/unit-selection/dependency-graph/ci-unit-input-ownership.test.mjs index b3ee41a2fe6..bff87593dec 100644 --- a/config/scripts/ci-unit-input-ownership.test.mjs +++ b/config/scripts/ci/unit-selection/dependency-graph/ci-unit-input-ownership.test.mjs @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest' import { buildUnitDependencyGraph } from './ci-unit-dependency-graph.mjs' -import { selectUnitFiles } from './ci-unit-selection.mjs' +import { selectUnitFiles } from '../ci-unit-selection.mjs' import { checkUnitInputOwnership, unitInputSourceDigest } from './ci-unit-input-ownership.mjs' const owner = 'src/census.test.ts' @@ -97,7 +97,10 @@ describe('checked indirect unit inputs', () => { buildUnitDependencyGraph(original, undefined, records, dependencyInputs).opaque.has(helper) ).toBe(true) const sources = new Map(original) - sources.set('config/scripts/vitest-dom-setup.ts', 'configureDifferentRuntime()') + sources.set( + 'config/scripts/test-runtime/dom/vitest-dom-setup.ts', + 'configureDifferentRuntime()' + ) expect(graph(sources).opaque.has(helper)).toBe(true) }) diff --git a/config/scripts/ci-branch-cache-sweep.test.mjs b/config/scripts/ci/workflow-contracts/ci-branch-cache-sweep.test.mjs similarity index 100% rename from config/scripts/ci-branch-cache-sweep.test.mjs rename to config/scripts/ci/workflow-contracts/ci-branch-cache-sweep.test.mjs diff --git a/config/scripts/ci-closed-pr-caches.test.mjs b/config/scripts/ci/workflow-contracts/ci-closed-pr-caches.test.mjs similarity index 100% rename from config/scripts/ci-closed-pr-caches.test.mjs rename to config/scripts/ci/workflow-contracts/ci-closed-pr-caches.test.mjs diff --git a/config/scripts/ci-closed-pr-cancellation.test.mjs b/config/scripts/ci/workflow-contracts/ci-closed-pr-cancellation.test.mjs similarity index 100% rename from config/scripts/ci-closed-pr-cancellation.test.mjs rename to config/scripts/ci/workflow-contracts/ci-closed-pr-cancellation.test.mjs diff --git a/config/scripts/ci-draft-pr-admission.test.mjs b/config/scripts/ci/workflow-contracts/ci-draft-pr-admission.test.mjs similarity index 97% rename from config/scripts/ci-draft-pr-admission.test.mjs rename to config/scripts/ci/workflow-contracts/ci-draft-pr-admission.test.mjs index a925717234d..03b5b25fa8c 100644 --- a/config/scripts/ci-draft-pr-admission.test.mjs +++ b/config/scripts/ci/workflow-contracts/ci-draft-pr-admission.test.mjs @@ -1,7 +1,7 @@ import { readFileSync, readdirSync } from 'node:fs' import { expect, it } from 'vitest' import { parse } from 'yaml' -import { compileAggregateExpression } from './pr-aggregate-gate-context.mjs' +import { compileAggregateExpression } from '../../workflow/pr-admission/pr-aggregate-gate-context.mjs' const workflows = readdirSync('.github/workflows').flatMap((file) => { const workflow = parse(readFileSync(`.github/workflows/${file}`, 'utf8')) diff --git a/config/scripts/ci-managed-ssh-execution.test.mjs b/config/scripts/ci/workflow-contracts/ci-managed-ssh-execution.test.mjs similarity index 93% rename from config/scripts/ci-managed-ssh-execution.test.mjs rename to config/scripts/ci/workflow-contracts/ci-managed-ssh-execution.test.mjs index 71313f77245..90bfa8715bb 100644 --- a/config/scripts/ci-managed-ssh-execution.test.mjs +++ b/config/scripts/ci/workflow-contracts/ci-managed-ssh-execution.test.mjs @@ -4,9 +4,12 @@ import { tmpdir } from 'node:os' import { delimiter, join } from 'node:path' import { parse } from 'yaml' import { runProcess } from '@orca/process-host' -import { managedSshShards, MANAGED_SSH_E2E_SPEC_PREFIX } from './ci-e2e-job-selection.mjs' -import { compileAggregateExpression } from './pr-aggregate-gate-context.mjs' -import { selectPrE2eSpecs } from './pr-e2e-source-routing.mjs' +import { + managedSshShards, + MANAGED_SSH_E2E_SPEC_PREFIX +} from '../e2e-selection/ci-e2e-job-selection.mjs' +import { compileAggregateExpression } from '../../workflow/pr-admission/pr-aggregate-gate-context.mjs' +import { selectPrE2eSpecs } from '../../workflow/source-routing/pr-e2e-source-routing.mjs' const workflow = parse(readFileSync('.github/workflows/e2e.yml', 'utf8')) const prWorkflow = parse(readFileSync('.github/workflows/pr.yml', 'utf8')) @@ -14,7 +17,7 @@ const lane = workflow.jobs['orcad-ssh-docker'] const command = lane.steps.find( (step) => step.name === 'Run managed SSH specs on a Docker host' ).run -const selector = readFileSync('config/scripts/ci-e2e-job-selection.mjs', 'utf8') +const selector = readFileSync('config/scripts/ci/e2e-selection/ci-e2e-job-selection.mjs', 'utf8') const small = ['tests/e2e/ssh-orcad-open-in-owner.spec.ts', 'tests/e2e/ssh-orcad-idle-exit.spec.ts'] const directories = [] afterEach(() => { diff --git a/config/scripts/ci-native-cache.test.mjs b/config/scripts/ci/workflow-contracts/ci-native-cache.test.mjs similarity index 100% rename from config/scripts/ci-native-cache.test.mjs rename to config/scripts/ci/workflow-contracts/ci-native-cache.test.mjs diff --git a/config/scripts/ci-native-toolchain.test.mjs b/config/scripts/ci/workflow-contracts/ci-native-toolchain.test.mjs similarity index 91% rename from config/scripts/ci-native-toolchain.test.mjs rename to config/scripts/ci/workflow-contracts/ci-native-toolchain.test.mjs index 9246b2207d5..6075965cc6b 100644 --- a/config/scripts/ci-native-toolchain.test.mjs +++ b/config/scripts/ci/workflow-contracts/ci-native-toolchain.test.mjs @@ -44,9 +44,11 @@ describe('CI native toolchain preparation', () => { }) const commands = readFileSync(log, 'utf8') expect(commands.includes('npm install -g node-gyp@11.5.0')).toBe(installs) - expect(commands.includes('node config/scripts/ensure-native-runtime.mjs --check-only')).toBe( - runtime === 'node' && hit === 'true' - ) + expect( + commands.includes( + 'node config/scripts/native-build/node-addons/ensure-native-runtime.mjs --check-only' + ) + ).toBe(runtime === 'node' && hit === 'true') expect(readFileSync(environment, 'utf8')).toBe( installs ? 'npm_config_node_gyp=/global/node-gyp/bin/node-gyp.js\n' : '' ) diff --git a/config/scripts/ci-pr-concurrency-keys.test.mjs b/config/scripts/ci/workflow-contracts/ci-pr-concurrency-keys.test.mjs similarity index 100% rename from config/scripts/ci-pr-concurrency-keys.test.mjs rename to config/scripts/ci/workflow-contracts/ci-pr-concurrency-keys.test.mjs diff --git a/config/scripts/claude-usage-append-benchmark.mjs b/config/scripts/claude-usage-append-benchmark.mjs index 6ec4cac5249..5b750d7396b 100644 --- a/config/scripts/claude-usage-append-benchmark.mjs +++ b/config/scripts/claude-usage-append-benchmark.mjs @@ -4,7 +4,7 @@ import assert from 'node:assert/strict' import { appendFile, mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises' import { cpus, release, tmpdir } from 'node:os' import { join } from 'node:path' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' import { describeClaudeUsageBenchmarkTooling, loadClaudeUsageBenchmarkScanner, diff --git a/config/scripts/claude-usage-benchmark-scanner.mjs b/config/scripts/claude-usage-benchmark-scanner.mjs index a01cfffe3e6..051d8c1fca6 100644 --- a/config/scripts/claude-usage-benchmark-scanner.mjs +++ b/config/scripts/claude-usage-benchmark-scanner.mjs @@ -20,7 +20,7 @@ export async function describeClaudeUsageBenchmarkTooling() { const paths = [ 'config/scripts/claude-usage-append-benchmark.mjs', 'config/scripts/claude-usage-benchmark-scanner.mjs', - 'config/scripts/counterbalanced-benchmark-schedule.mjs', + 'config/scripts/performance/measurement/counterbalanced-benchmark-schedule.mjs', 'src/packages/process-host/src/run-process.ts', 'src/packages/process-host/dist/run-process.js' ] diff --git a/config/scripts/claude-usage-hardening-cost-benchmark.mjs b/config/scripts/claude-usage-hardening-cost-benchmark.mjs index 3e05a5ed52a..3173bcd10c8 100644 --- a/config/scripts/claude-usage-hardening-cost-benchmark.mjs +++ b/config/scripts/claude-usage-hardening-cost-benchmark.mjs @@ -7,7 +7,7 @@ import { dirname, join, relative, sep } from 'node:path' import { performance } from 'node:perf_hooks' import { parseArgs } from 'node:util' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' import { runProcessSync } from '@orca/process-host' import { loadClaudeUsageBenchmarkScanner, diff --git a/config/scripts/build-cli.mjs b/config/scripts/cli-build/build-cli.mjs similarity index 85% rename from config/scripts/build-cli.mjs rename to config/scripts/cli-build/build-cli.mjs index 1825a35b12b..f72756b6d52 100644 --- a/config/scripts/build-cli.mjs +++ b/config/scripts/cli-build/build-cli.mjs @@ -3,17 +3,17 @@ import { createRequire } from 'node:module' import { dirname, join } from 'node:path' import { fileURLToPath } from 'node:url' import { runProcess } from '@orca/process-host' -import { describeProcessFailure } from './process-failure-message.mjs' -import { isDirectInvocation } from './script-entry-detection.mjs' -import { supportsTsrs } from './tsrs-typecheck-compiler.mjs' +import { describeProcessFailure } from '../tool-invocation/process-failure-message.mjs' +import { isDirectInvocation } from '../tool-invocation/script-entry-detection.mjs' +import { supportsTsrs } from '../typecheck/project-execution/tsrs-typecheck-compiler.mjs' import { resolveProjectCompiler, resolveTypecheckBunExecutable, runTypecheckProjects, selectTypecheckCompiler -} from './run-typecheck-projects-in-parallel.mjs' +} from '../typecheck/project-execution/run-typecheck-projects-in-parallel.mjs' -const ROOT = fileURLToPath(new URL('../..', import.meta.url)) +const ROOT = fileURLToPath(new URL('../../..', import.meta.url)) const CONFIG = 'config/tsconfig.build.cli.json' export async function buildCli({ diff --git a/config/scripts/build-cli.test.mjs b/config/scripts/cli-build/build-cli.test.mjs similarity index 95% rename from config/scripts/build-cli.test.mjs rename to config/scripts/cli-build/build-cli.test.mjs index 52a25163956..ad1bf894419 100644 --- a/config/scripts/build-cli.test.mjs +++ b/config/scripts/cli-build/build-cli.test.mjs @@ -13,9 +13,9 @@ import { join, resolve } from 'node:path' import { runProcess, runProcessSync } from '@orca/process-host' import { afterEach, expect, it, vi } from 'vitest' import { buildCli } from './build-cli.mjs' -import { resolvePinnedBunExecutable } from './pinned-bun-executable.mjs' -import { resolveProjectCompiler } from './run-typecheck-projects-in-parallel.mjs' -import { supportsTsrs } from './tsrs-typecheck-compiler.mjs' +import { resolvePinnedBunExecutable } from '../tool-invocation/pinned-bun-executable.mjs' +import { resolveProjectCompiler } from '../typecheck/project-execution/run-typecheck-projects-in-parallel.mjs' +import { supportsTsrs } from '../typecheck/project-execution/tsrs-typecheck-compiler.mjs' const ROOT = process.cwd() const resolveBunExecutable = () => resolvePinnedBunExecutable(ROOT, runProcessSync) diff --git a/config/scripts/codex-usage-parser-memory-benchmark.mjs b/config/scripts/codex-usage-parser-memory-benchmark.mjs index bdcff23bd05..ea3f1942eb6 100644 --- a/config/scripts/codex-usage-parser-memory-benchmark.mjs +++ b/config/scripts/codex-usage-parser-memory-benchmark.mjs @@ -135,8 +135,9 @@ function writeFixture(filePath, eventCount) { async function runComparison() { const { build, version: esbuildVersion } = await import('esbuild') const { runProcessSync } = await import('@orca/process-host') - const { describeProcessFailure } = await import('./process-failure-message.mjs') - const { buildCounterbalancedSchedule } = await import('./counterbalanced-benchmark-schedule.mjs') + const { describeProcessFailure } = await import('./tool-invocation/process-failure-message.mjs') + const { buildCounterbalancedSchedule } = + await import('./performance/measurement/counterbalanced-benchmark-schedule.mjs') const eventCount = positiveInteger(argument('--events', '100000'), 'events') const pairCount = positiveInteger(argument('--pairs', '2'), 'pairs') const intervalMs = positiveInteger(argument('--sample-ms', '35'), 'sample-ms') @@ -277,8 +278,11 @@ async function runComparison() { [ import.meta.filename, fileURLToPath(import.meta.resolve('@orca/process-host')), - join(import.meta.dirname, 'process-failure-message.mjs'), - join(import.meta.dirname, 'counterbalanced-benchmark-schedule.mjs') + join(import.meta.dirname, 'tool-invocation/process-failure-message.mjs'), + join( + import.meta.dirname, + 'performance/measurement/counterbalanced-benchmark-schedule.mjs' + ) ].map((path) => [relative(root, path).split(sep).join('/'), digest(readFileSync(path))]) ), baselineCommit, diff --git a/config/scripts/compare-benchmark-artifacts.mjs b/config/scripts/compare-benchmark-artifacts.mjs index 7e3a9eb759e..75db3875a90 100644 --- a/config/scripts/compare-benchmark-artifacts.mjs +++ b/config/scripts/compare-benchmark-artifacts.mjs @@ -1,7 +1,7 @@ import { mkdirSync, readFileSync, writeFileSync } from 'node:fs' import { basename, dirname, isAbsolute, relative } from 'node:path' import { pathToFileURL } from 'node:url' -import { collectTerminalPerfRows } from './terminal-perf-report-annotations.mjs' +import { collectTerminalPerfRows } from './performance/terminal-reporting/terminal-perf-report-annotations.mjs' const USAGE = 'Usage: node config/scripts/compare-benchmark-artifacts.mjs --baseline --candidate [--title ] [--output <path>] [--json-output <path>] [--higher-is-better <metric-key> ...]' diff --git a/config/scripts/computer-use-smoke.mjs b/config/scripts/computer-use-smoke.mjs index 85c1c9e8219..e763be3f086 100644 --- a/config/scripts/computer-use-smoke.mjs +++ b/config/scripts/computer-use-smoke.mjs @@ -3,7 +3,7 @@ import { existsSync } from 'node:fs' import { resolve } from 'node:path' import { spawnSync } from 'node:child_process' -import { resolveDevCliUserDataPath } from './dev-instance-isolation.mjs' +import { resolveDevCliUserDataPath } from './development/instance-isolation/dev-instance-isolation.mjs' const repoRoot = resolve(import.meta.dirname, '..', '..') const cliPath = diff --git a/config/scripts/daemon-protocol-facts.mjs b/config/scripts/daemon-protocol/schema-facts/daemon-protocol-facts.mjs similarity index 100% rename from config/scripts/daemon-protocol-facts.mjs rename to config/scripts/daemon-protocol/schema-facts/daemon-protocol-facts.mjs diff --git a/config/scripts/daemon-protocol-facts.test.mjs b/config/scripts/daemon-protocol/schema-facts/daemon-protocol-facts.test.mjs similarity index 98% rename from config/scripts/daemon-protocol-facts.test.mjs rename to config/scripts/daemon-protocol/schema-facts/daemon-protocol-facts.test.mjs index 4288f3179ee..a3ed6f33cfa 100644 --- a/config/scripts/daemon-protocol-facts.test.mjs +++ b/config/scripts/daemon-protocol/schema-facts/daemon-protocol-facts.test.mjs @@ -8,7 +8,7 @@ import { parseDaemonProtocolFacts } from './daemon-protocol-facts.mjs' -const projectDir = resolve(import.meta.dirname, '../..') +const projectDir = resolve(import.meta.dirname, '../../../..') function source(current, previous) { return [ diff --git a/config/scripts/run-electron-vite-build.mjs b/config/scripts/desktop-build/execution/run-electron-vite-build.mjs similarity index 79% rename from config/scripts/run-electron-vite-build.mjs rename to config/scripts/desktop-build/execution/run-electron-vite-build.mjs index 421d7403516..79194f18b4b 100644 --- a/config/scripts/run-electron-vite-build.mjs +++ b/config/scripts/desktop-build/execution/run-electron-vite-build.mjs @@ -1,11 +1,14 @@ -import { verifyPreloadOutput } from './preload-output-contract.mjs' +import { verifyPreloadOutput } from '../output-contracts/preload-output-contract.mjs' import { spawn } from 'node:child_process' import fs from 'node:fs' import { createRequire } from 'node:module' import path from 'node:path' -import { appendBuildOldSpaceOption } from './node-old-space-limit.mjs' -import { withRolldownThreadLimit } from './rolldown-thread-limit.mjs' -import { RENDERER_BUILD_DIR, verifyRendererBootGraph } from './renderer-boot-graph.mjs' +import { appendBuildOldSpaceOption } from '../../tool-invocation/node-old-space-limit.mjs' +import { withRolldownThreadLimit } from '../../tool-invocation/rolldown-thread-limit.mjs' +import { + RENDERER_BUILD_DIR, + verifyRendererBootGraph +} from '../output-contracts/renderer-boot-graph.mjs' const require = createRequire(import.meta.url) const electronVitePackageJson = require.resolve('electron-vite/package.json') diff --git a/config/scripts/electron-vite-output-contract.test.ts b/config/scripts/desktop-build/output-contracts/electron-vite-output-contract.test.ts similarity index 94% rename from config/scripts/electron-vite-output-contract.test.ts rename to config/scripts/desktop-build/output-contracts/electron-vite-output-contract.test.ts index ea46ef73cae..855bd20f5ff 100644 --- a/config/scripts/electron-vite-output-contract.test.ts +++ b/config/scripts/desktop-build/output-contracts/electron-vite-output-contract.test.ts @@ -1,8 +1,5 @@ -import { - preloadRuntimeImports, - verifyPreloadSource, - verifyPreloadOutput -} from './preload-output-contract.mjs' +import { verifyPreloadSource, verifyPreloadOutput } from './preload-output-contract.mjs' +import { preloadRuntimeImports } from './sandbox-preload-imports.mjs' import * as nodeFs from 'node:fs' import { mkdtempSync, readFileSync, rmSync } from 'node:fs' import * as nodePath from 'node:path' @@ -13,15 +10,15 @@ import { runInNewContext } from 'node:vm' import { describe, expect, it } from 'vitest' import { PreloadConfigFactory } from 'electron-vite' import { build, resolveConfig } from 'vite' -import { electronViteConfig } from '../../electron.vite.config' +import { electronViteConfig } from '../../../../electron.vite.config' import { BOOTSTRAP_FATAL_LOG_ENV_VAR, BOOTSTRAP_FATAL_LOG_FILE_NAME, createBootstrapFatalExitBanner -} from '../build-plugins/bootstrap-fatal-exit-banner' -import { BOOTSTRAP_FATAL_EXIT_GUARD_KEY } from '../../src/main/startup/bootstrap-fatal-exit-guard' -import { createSandboxedScriptBundlesPlugin } from '../build-plugins/sandboxed-script-bundles' -import { MAIN_BUILD_ENTRY_POINTS } from '../build-plugins/main-build-entry-points' +} from '../../../build-plugins/bootstrap-fatal-exit-banner' +import { BOOTSTRAP_FATAL_EXIT_GUARD_KEY } from '../../../../src/main/startup/bootstrap-fatal-exit-guard' +import { createSandboxedScriptBundlesPlugin } from '../../../build-plugins/sandboxed-script-bundles' +import { MAIN_BUILD_ENTRY_POINTS } from '../../../build-plugins/main-build-entry-points' type BootstrapProcessMock = EventEmitter & { env: Record<string, string> diff --git a/config/scripts/preload-output-contract.mjs b/config/scripts/desktop-build/output-contracts/preload-output-contract.mjs similarity index 97% rename from config/scripts/preload-output-contract.mjs rename to config/scripts/desktop-build/output-contracts/preload-output-contract.mjs index 22a82dd1b02..28eba44387b 100644 --- a/config/scripts/preload-output-contract.mjs +++ b/config/scripts/desktop-build/output-contracts/preload-output-contract.mjs @@ -6,7 +6,6 @@ import * as timers from 'node:timers' import * as url from 'node:url' import { runInNewContext } from 'node:vm' import { verifySandboxPreloadImports } from './sandbox-preload-imports.mjs' -export { preloadRuntimeImports, verifySandboxPreloadImports } from './sandbox-preload-imports.mjs' export async function verifyPreloadSource(source) { const exposed = new Map() diff --git a/config/scripts/renderer-boot-graph.mjs b/config/scripts/desktop-build/output-contracts/renderer-boot-graph.mjs similarity index 100% rename from config/scripts/renderer-boot-graph.mjs rename to config/scripts/desktop-build/output-contracts/renderer-boot-graph.mjs diff --git a/config/scripts/renderer-boot-graph.test.mjs b/config/scripts/desktop-build/output-contracts/renderer-boot-graph.test.mjs similarity index 100% rename from config/scripts/renderer-boot-graph.test.mjs rename to config/scripts/desktop-build/output-contracts/renderer-boot-graph.test.mjs diff --git a/config/scripts/sandbox-preload-imports.mjs b/config/scripts/desktop-build/output-contracts/sandbox-preload-imports.mjs similarity index 100% rename from config/scripts/sandbox-preload-imports.mjs rename to config/scripts/desktop-build/output-contracts/sandbox-preload-imports.mjs diff --git a/config/scripts/appimage-node-runtime.cjs b/config/scripts/desktop-distribution/linux/appimage-node-runtime.cjs similarity index 87% rename from config/scripts/appimage-node-runtime.cjs rename to config/scripts/desktop-distribution/linux/appimage-node-runtime.cjs index 42ec13cf6e7..39ac6f2f411 100644 --- a/config/scripts/appimage-node-runtime.cjs +++ b/config/scripts/desktop-distribution/linux/appimage-node-runtime.cjs @@ -6,15 +6,19 @@ const { APPIMAGE_NODE_RUNTIME_FPM_EXCLUDE, APPIMAGE_NODE_RUNTIME_SEGMENTS, appImageNodeRuntimeTarget -} = require('../../src/shared/appimage-node-runtime.ts') -const { runTerminalHostRoundTrip } = require('./verify-packaged-daemon-entry.cjs') +} = require('../../../../src/shared/appimage-node-runtime.ts') +const { + runTerminalHostRoundTrip +} = require('../runtime-verification/verify-packaged-daemon-entry.cjs') const appImageNodeRuntimeFpmArgs = ['--exclude', APPIMAGE_NODE_RUNTIME_FPM_EXCLUDE] const PTY_ROUND_TRIP_TIMEOUT_MS = 20_000 async function ensurePinnedNode(target) { const { ensurePinnedNodeExecutable } = await import( - pathToFileURL(resolve(__dirname, 'pinned-node-downloads.mjs')).href + pathToFileURL( + resolve(__dirname, '../../orcad-distribution/prebuilds/pinned-node-downloads.mjs') + ).href ) return ensurePinnedNodeExecutable({ target }) } diff --git a/config/scripts/appimage-node-runtime.test.mjs b/config/scripts/desktop-distribution/linux/appimage-node-runtime.test.mjs similarity index 94% rename from config/scripts/appimage-node-runtime.test.mjs rename to config/scripts/desktop-distribution/linux/appimage-node-runtime.test.mjs index 4161d9e7761..f3ff04a4200 100644 --- a/config/scripts/appimage-node-runtime.test.mjs +++ b/config/scripts/desktop-distribution/linux/appimage-node-runtime.test.mjs @@ -9,8 +9,8 @@ const { appImageNodeRuntimeFpmArgs, placeAppImageNodeRuntime } = require('./appimage-node-runtime.cjs') -const releaseConfig = require('../electron-builder.config.cjs') -const prLinuxConfig = require('../electron-builder-pr-linux.config.cjs') +const releaseConfig = require('../../../electron-builder.config.cjs') +const prLinuxConfig = require('../../../electron-builder-pr-linux.config.cjs') let root = '' diff --git a/config/scripts/build-linux-local.mjs b/config/scripts/desktop-distribution/linux/build-linux-local.mjs similarity index 97% rename from config/scripts/build-linux-local.mjs rename to config/scripts/desktop-distribution/linux/build-linux-local.mjs index 2328f00bede..52a145ac8ca 100644 --- a/config/scripts/build-linux-local.mjs +++ b/config/scripts/desktop-distribution/linux/build-linux-local.mjs @@ -44,7 +44,7 @@ export function runLocalLinuxBuild({ environment = process.env, execFile = execFileSync, platform = process.platform, - cwd = resolve(import.meta.dirname, '../..') + cwd = resolve(import.meta.dirname, '../../../..') } = {}) { const env = { ...environment } if (arch === 'arm64') { diff --git a/config/scripts/build-linux-local.test.mjs b/config/scripts/desktop-distribution/linux/build-linux-local.test.mjs similarity index 94% rename from config/scripts/build-linux-local.test.mjs rename to config/scripts/desktop-distribution/linux/build-linux-local.test.mjs index 684c83f3265..3855919abba 100644 --- a/config/scripts/build-linux-local.test.mjs +++ b/config/scripts/desktop-distribution/linux/build-linux-local.test.mjs @@ -10,10 +10,10 @@ import { describe('local Linux build target', () => { it('is the package script used by the local Linux build', () => { const packageJson = JSON.parse( - readFileSync(resolve(import.meta.dirname, '../../package.json'), 'utf8') + readFileSync(resolve(import.meta.dirname, '../../../../package.json'), 'utf8') ) expect(packageJson.scripts['build:linux']).toContain( - 'node config/scripts/build-linux-local.mjs' + 'node config/scripts/desktop-distribution/linux/build-linux-local.mjs' ) }) diff --git a/config/scripts/package-linux-formats-appimage.mjs b/config/scripts/desktop-distribution/linux/package-linux-formats-appimage.mjs similarity index 93% rename from config/scripts/package-linux-formats-appimage.mjs rename to config/scripts/desktop-distribution/linux/package-linux-formats-appimage.mjs index 1c400aca00b..3f940169589 100644 --- a/config/scripts/package-linux-formats-appimage.mjs +++ b/config/scripts/desktop-distribution/linux/package-linux-formats-appimage.mjs @@ -2,7 +2,7 @@ import { mkdirSync, symlinkSync, writeFileSync } from 'node:fs' import { createRequire } from 'node:module' import { dirname, join, resolve } from 'node:path' import { runProcessSync } from '@orca/process-host' -import { describeProcessFailure } from './process-failure-message.mjs' +import { describeProcessFailure } from '../../tool-invocation/process-failure-message.mjs' const require = createRequire(import.meta.url) @@ -13,7 +13,7 @@ async function getPinnedTools(version) { export async function preparePrAppImageTools({ directory: requestedDirectory, - configuration = require('../electron-builder-pr-linux.config.cjs'), + configuration = require('../../../electron-builder-pr-linux.config.cjs'), getTools = getPinnedTools, platform = process.platform, architecture = process.arch diff --git a/config/scripts/package-linux-formats-appimage.test.mjs b/config/scripts/desktop-distribution/linux/package-linux-formats-appimage.test.mjs similarity index 100% rename from config/scripts/package-linux-formats-appimage.test.mjs rename to config/scripts/desktop-distribution/linux/package-linux-formats-appimage.test.mjs diff --git a/config/scripts/package-linux-formats.mjs b/config/scripts/desktop-distribution/linux/package-linux-formats.mjs similarity index 98% rename from config/scripts/package-linux-formats.mjs rename to config/scripts/desktop-distribution/linux/package-linux-formats.mjs index 405eaea6fa2..0d4297280f6 100644 --- a/config/scripts/package-linux-formats.mjs +++ b/config/scripts/desktop-distribution/linux/package-linux-formats.mjs @@ -12,7 +12,7 @@ import { statSync } from 'node:fs' import { join, resolve } from 'node:path' -import { copyPrivateTree } from './space-sharing-copy.mjs' +import { copyPrivateTree } from '../../artifact-storage/reflink-copy/space-sharing-copy.mjs' import { spawnProcess } from '@orca/process-host' import { preparePrAppImageTools } from './package-linux-formats-appimage.mjs' diff --git a/config/scripts/package-linux-formats.test.mjs b/config/scripts/desktop-distribution/linux/package-linux-formats.test.mjs similarity index 98% rename from config/scripts/package-linux-formats.test.mjs rename to config/scripts/desktop-distribution/linux/package-linux-formats.test.mjs index ca47fbb53ba..5447f9143bc 100644 --- a/config/scripts/package-linux-formats.test.mjs +++ b/config/scripts/desktop-distribution/linux/package-linux-formats.test.mjs @@ -268,9 +268,9 @@ describe('independent Linux package formats', () => { it('changes only CI deb/rpm compression levels without mutating release settings or hooks', () => { const require = createRequire(import.meta.url) - const release = require('../electron-builder.config.cjs') + const release = require('../../../electron-builder.config.cjs') const before = { deb: { ...release.deb }, rpm: { ...release.rpm } } - const ci = require('../electron-builder-pr-linux.config.cjs') + const ci = require('../../../electron-builder-pr-linux.config.cjs') expect(release.deb).toEqual(before.deb) expect(release.rpm).toEqual(before.rpm) expect(ci).toEqual({ diff --git a/config/scripts/adhoc-mac-manifests.mjs b/config/scripts/desktop-distribution/macos/adhoc-mac-manifests.mjs similarity index 100% rename from config/scripts/adhoc-mac-manifests.mjs rename to config/scripts/desktop-distribution/macos/adhoc-mac-manifests.mjs diff --git a/config/scripts/adhoc-mac-manifests.test.mjs b/config/scripts/desktop-distribution/macos/adhoc-mac-manifests.test.mjs similarity index 100% rename from config/scripts/adhoc-mac-manifests.test.mjs rename to config/scripts/desktop-distribution/macos/adhoc-mac-manifests.test.mjs diff --git a/config/scripts/build-mac-local.mjs b/config/scripts/desktop-distribution/macos/build-mac-local.mjs similarity index 100% rename from config/scripts/build-mac-local.mjs rename to config/scripts/desktop-distribution/macos/build-mac-local.mjs diff --git a/config/scripts/build-mac-local.test.mjs b/config/scripts/desktop-distribution/macos/build-mac-local.test.mjs similarity index 100% rename from config/scripts/build-mac-local.test.mjs rename to config/scripts/desktop-distribution/macos/build-mac-local.test.mjs diff --git a/config/scripts/build-mac-notarization-overlap.mjs b/config/scripts/desktop-distribution/macos/build-mac-notarization-overlap.mjs similarity index 98% rename from config/scripts/build-mac-notarization-overlap.mjs rename to config/scripts/desktop-distribution/macos/build-mac-notarization-overlap.mjs index b205b775902..81c092a1282 100644 --- a/config/scripts/build-mac-notarization-overlap.mjs +++ b/config/scripts/desktop-distribution/macos/build-mac-notarization-overlap.mjs @@ -119,7 +119,7 @@ export async function main(args = process.argv.slice(2)) { const { notarize } = createRequire(builderRequire.resolve('app-builder-lib'))( '@electron/notarize' ) - const config = require('../electron-builder.config.cjs') + const config = require('../../../electron-builder.config.cjs') if (args.includes('--draft')) { config.publish = { ...config.publish, releaseType: 'draft' } } diff --git a/config/scripts/build-mac-notarization-overlap.test.mjs b/config/scripts/desktop-distribution/macos/build-mac-notarization-overlap.test.mjs similarity index 100% rename from config/scripts/build-mac-notarization-overlap.test.mjs rename to config/scripts/desktop-distribution/macos/build-mac-notarization-overlap.test.mjs diff --git a/config/scripts/mac-build-compatibility.cjs b/config/scripts/desktop-distribution/macos/mac-build-compatibility.cjs similarity index 89% rename from config/scripts/mac-build-compatibility.cjs rename to config/scripts/desktop-distribution/macos/mac-build-compatibility.cjs index 4df85d4fea1..7bdfceccc0a 100644 --- a/config/scripts/mac-build-compatibility.cjs +++ b/config/scripts/desktop-distribution/macos/mac-build-compatibility.cjs @@ -1,6 +1,6 @@ const { writeFileSync } = require('node:fs') const { join } = require('node:path') -const compatibilityContract = require('../../src/shared/local-build-compatibility-contract.json') +const compatibilityContract = require('../../../../src/shared/local-build-compatibility-contract.json') const MAC_BUILD_COMPATIBILITY_FILENAME = 'orca-local-build.json' diff --git a/config/scripts/mac-build-compatibility.test.mjs b/config/scripts/desktop-distribution/macos/mac-build-compatibility.test.mjs similarity index 100% rename from config/scripts/mac-build-compatibility.test.mjs rename to config/scripts/desktop-distribution/macos/mac-build-compatibility.test.mjs diff --git a/config/scripts/mac-notarization-builder-contract.test.mjs b/config/scripts/desktop-distribution/macos/mac-notarization-builder-contract.test.mjs similarity index 100% rename from config/scripts/mac-notarization-builder-contract.test.mjs rename to config/scripts/desktop-distribution/macos/mac-notarization-builder-contract.test.mjs diff --git a/config/scripts/sign-mac-app.mjs b/config/scripts/desktop-distribution/macos/sign-mac-app.mjs similarity index 100% rename from config/scripts/sign-mac-app.mjs rename to config/scripts/desktop-distribution/macos/sign-mac-app.mjs diff --git a/config/scripts/sign-mac-app.test.mjs b/config/scripts/desktop-distribution/macos/sign-mac-app.test.mjs similarity index 96% rename from config/scripts/sign-mac-app.test.mjs rename to config/scripts/desktop-distribution/macos/sign-mac-app.test.mjs index 18811066b7f..677bcbe13dc 100644 --- a/config/scripts/sign-mac-app.test.mjs +++ b/config/scripts/desktop-distribution/macos/sign-mac-app.test.mjs @@ -99,7 +99,9 @@ it.each([ (name) => env[name] === '1' ) ) { - expect(config.mac.sign).toBe(resolve('config/scripts/sign-mac-app.mjs')) + expect(config.mac.sign).toBe( + resolve('config/scripts/desktop-distribution/macos/sign-mac-app.mjs') + ) const hook = await resolveFunction(undefined, config.mac.sign, 'sign', process.cwd()) expect(typeof hook).toBe('function') expect(hook.name).toBe('sign') diff --git a/config/scripts/electron-builder-config.test.mjs b/config/scripts/desktop-distribution/runtime-verification/electron-builder-config.test.mjs similarity index 94% rename from config/scripts/electron-builder-config.test.mjs rename to config/scripts/desktop-distribution/runtime-verification/electron-builder-config.test.mjs index c3d6b7b104a..fb4d264c5f2 100644 --- a/config/scripts/electron-builder-config.test.mjs +++ b/config/scripts/desktop-distribution/runtime-verification/electron-builder-config.test.mjs @@ -6,12 +6,12 @@ import { tmpdir } from 'node:os' import { dirname, join } from 'node:path' import { promisify } from 'node:util' import { afterAll, beforeAll, describe, expect, it } from 'vitest' -import { writeMobileWebBundleFixtureTree } from './mobile-web-bundle-fixture-tree.mjs' +import { writeMobileWebBundleFixtureTree } from '../../build/mobile-web-app/mobile-web-bundle-fixture-tree.mjs' -const REPO_ROOT = join(import.meta.dirname, '..', '..') +const REPO_ROOT = join(import.meta.dirname, '../../..', '..') const require = createRequire(import.meta.url) -const electronBuilderConfig = require('../electron-builder.config.cjs') +const electronBuilderConfig = require('../../../electron-builder.config.cjs') const { copyFiles, FileMatcher } = require('app-builder-lib/out/fileMatcher') describe('electron-builder config', () => { @@ -186,7 +186,7 @@ describe('electron-builder config', () => { await copyFiles([ new FileMatcher(resource.from, join(resourcesDir, resource.to), (value) => value) ]) - require('../packaged-runtime-node-modules.cjs').prunePackagedRuntimeNodeModules( + require('../../../packaged-runtime-node-modules.cjs').prunePackagedRuntimeNodeModules( resourcesDir, platform === 'mac' ? 'darwin' : 'linux', process.arch @@ -265,14 +265,14 @@ describe('electron-builder config', () => { }) it('overrides packaged semver only for local macOS builds', () => { - const configPath = require.resolve('../electron-builder.config.cjs') + const configPath = require.resolve('../../../electron-builder.config.cjs') const original = process.env.ORCA_LOCAL_BUILD_VERSION const originalMacRelease = process.env.ORCA_MAC_RELEASE try { delete require.cache[configPath] delete process.env.ORCA_MAC_RELEASE process.env.ORCA_LOCAL_BUILD_VERSION = '1.4.159-rc.0.local.123.abc' - expect(require('../electron-builder.config.cjs').extraMetadata).toEqual({ + expect(require('../../../electron-builder.config.cjs').extraMetadata).toEqual({ version: '1.4.159-rc.0.local.123.abc' }) } finally { @@ -287,19 +287,19 @@ describe('electron-builder config', () => { process.env.ORCA_LOCAL_BUILD_VERSION = original } delete require.cache[configPath] - require('../electron-builder.config.cjs') + require('../../../electron-builder.config.cjs') } }) it('never applies local semver to release packaging', () => { - const configPath = require.resolve('../electron-builder.config.cjs') + const configPath = require.resolve('../../../electron-builder.config.cjs') const originalLocalVersion = process.env.ORCA_LOCAL_BUILD_VERSION const originalMacRelease = process.env.ORCA_MAC_RELEASE try { delete require.cache[configPath] process.env.ORCA_LOCAL_BUILD_VERSION = '1.4.159-local.123.abc' process.env.ORCA_MAC_RELEASE = '1' - expect(require('../electron-builder.config.cjs').extraMetadata).toBeUndefined() + expect(require('../../../electron-builder.config.cjs').extraMetadata).toBeUndefined() } finally { if (originalLocalVersion === undefined) { delete process.env.ORCA_LOCAL_BUILD_VERSION @@ -312,7 +312,7 @@ describe('electron-builder config', () => { process.env.ORCA_MAC_RELEASE = originalMacRelease } delete require.cache[configPath] - require('../electron-builder.config.cjs') + require('../../../electron-builder.config.cjs') } }) }) @@ -383,7 +383,7 @@ describe('arch-aware packaging guard', () => { join(REPO_ROOT, 'node_modules', otherSherpa, 'package.json') ) const otherSherpaExpected = Object.hasOwn( - require('../../package.json').optionalDependencies, + require('../../../../package.json').optionalDependencies, otherSherpa ) if (otherSherpaExpected && !otherSherpaInstalled) { diff --git a/config/scripts/electron-builder-mac-channel-config.test.mjs b/config/scripts/desktop-distribution/runtime-verification/electron-builder-mac-channel-config.test.mjs similarity index 94% rename from config/scripts/electron-builder-mac-channel-config.test.mjs rename to config/scripts/desktop-distribution/runtime-verification/electron-builder-mac-channel-config.test.mjs index 8316cf3f43d..4117b771519 100644 --- a/config/scripts/electron-builder-mac-channel-config.test.mjs +++ b/config/scripts/desktop-distribution/runtime-verification/electron-builder-mac-channel-config.test.mjs @@ -2,7 +2,7 @@ import { createRequire } from 'node:module' import { describe, expect, it } from 'vitest' const require = createRequire(import.meta.url) -const electronBuilderConfig = require('../electron-builder.config.cjs') +const electronBuilderConfig = require('../../../electron-builder.config.cjs') const MUTABLE_BUILD_ENV = [ 'ORCA_MAC_HOURLY', @@ -17,7 +17,7 @@ const MUTABLE_BUILD_ENV = [ /** Re-requires the config under a temporary env, then restores env and module cache. */ function withEnv(env, assert) { - const configPath = require.resolve('../electron-builder.config.cjs') + const configPath = require.resolve('../../../electron-builder.config.cjs') const original = Object.fromEntries(MUTABLE_BUILD_ENV.map((key) => [key, process.env[key]])) try { for (const key of MUTABLE_BUILD_ENV) { @@ -25,7 +25,7 @@ function withEnv(env, assert) { } Object.assign(process.env, env) delete require.cache[configPath] - assert(require('../electron-builder.config.cjs')) + assert(require('../../../electron-builder.config.cjs')) } finally { for (const [key, value] of Object.entries(original)) { if (value === undefined) { @@ -35,7 +35,7 @@ function withEnv(env, assert) { } } delete require.cache[configPath] - require('../electron-builder.config.cjs') + require('../../../electron-builder.config.cjs') } } diff --git a/config/scripts/electron-builder-native-rebuild.cjs b/config/scripts/desktop-distribution/runtime-verification/electron-builder-native-rebuild.cjs similarity index 81% rename from config/scripts/electron-builder-native-rebuild.cjs rename to config/scripts/desktop-distribution/runtime-verification/electron-builder-native-rebuild.cjs index cb54807d849..e5248fa1e40 100644 --- a/config/scripts/electron-builder-native-rebuild.cjs +++ b/config/scripts/desktop-distribution/runtime-verification/electron-builder-native-rebuild.cjs @@ -1,7 +1,7 @@ const { execFileSync } = require('node:child_process') const { resolve } = require('node:path') -const projectDir = resolve(__dirname, '../..') +const projectDir = resolve(__dirname, '../../../..') function electronBuilderNativeRebuild(context) { return runElectronBuilderNativeRebuild(context) @@ -10,14 +10,22 @@ function electronBuilderNativeRebuild(context) { function runElectronBuilderNativeRebuild(context, runner = execFileSync, runtime = {}) { const args = buildNativeRebuildArgs(context, runtime) if (readPlatformName(context?.platform) === 'win32') { - runner(process.execPath, ['config/scripts/build-windows-cli-launcher.mjs'], { - cwd: projectDir, - stdio: 'inherit' - }) + runner( + process.execPath, + ['config/scripts/native-build/windows/build-windows-cli-launcher.mjs'], + { + cwd: projectDir, + stdio: 'inherit' + } + ) // Packaging rejects a hook built for another machine, so build the one this package targets. runner( process.execPath, - ['config/scripts/build-windows-agent-hook.mjs', '--arch', readArchName(context?.arch)], + [ + 'config/scripts/native-build/windows/build-windows-agent-hook.mjs', + '--arch', + readArchName(context?.arch) + ], { cwd: projectDir, stdio: 'inherit' } ) } @@ -42,7 +50,7 @@ function buildNativeRebuildArgs( arch === hostArch return [ - 'config/scripts/rebuild-native-deps.mjs', + 'config/scripts/native-build/node-addons/rebuild-native-deps.mjs', `--platform=${platform}`, `--arch=${arch}`, ...(canReusePreparedRuntime ? [] : ['--force']) diff --git a/config/scripts/electron-builder-native-rebuild.test.mjs b/config/scripts/desktop-distribution/runtime-verification/electron-builder-native-rebuild.test.mjs similarity index 77% rename from config/scripts/electron-builder-native-rebuild.test.mjs rename to config/scripts/desktop-distribution/runtime-verification/electron-builder-native-rebuild.test.mjs index a71487e1c02..b323bad73d5 100644 --- a/config/scripts/electron-builder-native-rebuild.test.mjs +++ b/config/scripts/desktop-distribution/runtime-verification/electron-builder-native-rebuild.test.mjs @@ -15,7 +15,7 @@ describe('electron-builder native rebuild hook', () => { arch: 'x64' }) ).toEqual([ - 'config/scripts/rebuild-native-deps.mjs', + 'config/scripts/native-build/node-addons/rebuild-native-deps.mjs', '--platform=darwin', '--arch=x64', '--force' @@ -36,7 +36,12 @@ describe('electron-builder native rebuild hook', () => { expect(calls).toEqual([ [ process.execPath, - ['config/scripts/rebuild-native-deps.mjs', '--platform=linux', '--arch=arm64', '--force'], + [ + 'config/scripts/native-build/node-addons/rebuild-native-deps.mjs', + '--platform=linux', + '--arch=arm64', + '--force' + ], expect.objectContaining({ stdio: 'inherit' }) ] ]) @@ -57,7 +62,11 @@ describe('electron-builder native rebuild hook', () => { }, runtime ) - ).toEqual(['config/scripts/rebuild-native-deps.mjs', '--platform=linux', '--arch=x64']) + ).toEqual([ + 'config/scripts/native-build/node-addons/rebuild-native-deps.mjs', + '--platform=linux', + '--arch=x64' + ]) expect( buildNativeRebuildArgs( { @@ -83,17 +92,22 @@ describe('electron-builder native rebuild hook', () => { expect(calls).toEqual([ [ process.execPath, - ['config/scripts/build-windows-cli-launcher.mjs'], + ['config/scripts/native-build/windows/build-windows-cli-launcher.mjs'], expect.objectContaining({ stdio: 'inherit' }) ], [ process.execPath, - ['config/scripts/build-windows-agent-hook.mjs', '--arch', 'x64'], + ['config/scripts/native-build/windows/build-windows-agent-hook.mjs', '--arch', 'x64'], expect.objectContaining({ stdio: 'inherit' }) ], [ process.execPath, - ['config/scripts/rebuild-native-deps.mjs', '--platform=win32', '--arch=x64', '--force'], + [ + 'config/scripts/native-build/node-addons/rebuild-native-deps.mjs', + '--platform=win32', + '--arch=x64', + '--force' + ], expect.objectContaining({ stdio: 'inherit' }) ] ]) diff --git a/config/scripts/electron-builder-runtime-resources.test.mjs b/config/scripts/desktop-distribution/runtime-verification/electron-builder-runtime-resources.test.mjs similarity index 98% rename from config/scripts/electron-builder-runtime-resources.test.mjs rename to config/scripts/desktop-distribution/runtime-verification/electron-builder-runtime-resources.test.mjs index ba7523c9ddf..3ae21934642 100644 --- a/config/scripts/electron-builder-runtime-resources.test.mjs +++ b/config/scripts/desktop-distribution/runtime-verification/electron-builder-runtime-resources.test.mjs @@ -3,15 +3,15 @@ import { createRequire } from 'node:module' import { tmpdir } from 'node:os' import { delimiter, dirname, join } from 'node:path' import { describe, expect, it } from 'vitest' -import { removeTree } from '../../src/shared/windows-transient-lock-removal.ts' +import { removeTree } from '../../../../src/shared/windows-transient-lock-removal.ts' const require = createRequire(import.meta.url) -const electronBuilderConfig = require('../electron-builder.config.cjs') +const electronBuilderConfig = require('../../../electron-builder.config.cjs') const { prunePackagedNodePty, prunePackagedParcelWatcher, verifyPackagedMainRuntimeDeps -} = require('../packaged-runtime-node-modules.cjs') +} = require('../../../packaged-runtime-node-modules.cjs') describe('packaged runtime resources', () => { it('verifies packaged main runtime deps from Windows-style asar entries', async () => { @@ -466,7 +466,7 @@ async function seedPackagedServePayload(resourcesDir) { } async function seedBundledRipgrep(resourcesDir) { - const { BUNDLED_RIPGREP_PLATFORMS } = require('../bundled-ripgrep-resources.cjs') + const { BUNDLED_RIPGREP_PLATFORMS } = require('../../../bundled-ripgrep-resources.cjs') for (const platform of BUNDLED_RIPGREP_PLATFORMS) { const dir = join(resourcesDir, 'ripgrep', platform) await mkdir(dir, { recursive: true }) diff --git a/config/scripts/electron-builder-speech-config.test.mjs b/config/scripts/desktop-distribution/runtime-verification/electron-builder-speech-config.test.mjs similarity index 95% rename from config/scripts/electron-builder-speech-config.test.mjs rename to config/scripts/desktop-distribution/runtime-verification/electron-builder-speech-config.test.mjs index f7709439969..ca729a7def5 100644 --- a/config/scripts/electron-builder-speech-config.test.mjs +++ b/config/scripts/desktop-distribution/runtime-verification/electron-builder-speech-config.test.mjs @@ -2,7 +2,7 @@ import { createRequire } from 'node:module' import { describe, expect, it } from 'vitest' const require = createRequire(import.meta.url) -const electronBuilderConfig = require('../electron-builder.config.cjs') +const electronBuilderConfig = require('../../../electron-builder.config.cjs') const { FileMatcher } = require('app-builder-lib/out/fileMatcher') describe('electron-builder speech resources', () => { diff --git a/config/scripts/packaged-node-pty-prebuild-prune.test.mjs b/config/scripts/desktop-distribution/runtime-verification/packaged-node-pty-prebuild-prune.test.mjs similarity index 96% rename from config/scripts/packaged-node-pty-prebuild-prune.test.mjs rename to config/scripts/desktop-distribution/runtime-verification/packaged-node-pty-prebuild-prune.test.mjs index a3faa0d8ceb..af4d5e7e2fc 100644 --- a/config/scripts/packaged-node-pty-prebuild-prune.test.mjs +++ b/config/scripts/desktop-distribution/runtime-verification/packaged-node-pty-prebuild-prune.test.mjs @@ -5,8 +5,8 @@ import { join } from 'node:path' import { afterEach, beforeEach, describe, expect, it } from 'vitest' const require = createRequire(import.meta.url) -const { prunePackagedNodePty } = require('../packaged-runtime-node-modules.cjs') -const { PE_MACHINE } = require('./windows-pe-machine.cjs') +const { prunePackagedNodePty } = require('../../../packaged-runtime-node-modules.cjs') +const { PE_MACHINE } = require('../../native-build/windows/windows-pe-machine.cjs') // Loader swallows build/Release/Debug failures and falls back to prebuilds; upstream conpty lacks job ownership, so ABI/AV failures must not silently downgrade it. // Preserve conpty_console_list and winpty siblings: the patch removes their build targets, leaving only upstream copies. diff --git a/config/scripts/packaged-process-host-fixture.mjs b/config/scripts/desktop-distribution/runtime-verification/packaged-process-host-fixture.mjs similarity index 97% rename from config/scripts/packaged-process-host-fixture.mjs rename to config/scripts/desktop-distribution/runtime-verification/packaged-process-host-fixture.mjs index f31fc7491d6..2ea197b1a9d 100644 --- a/config/scripts/packaged-process-host-fixture.mjs +++ b/config/scripts/desktop-distribution/runtime-verification/packaged-process-host-fixture.mjs @@ -6,7 +6,9 @@ import { runProcessSync } from '@orca/process-host' const require = createRequire(import.meta.url) const requireFromBuilder = createRequire(require.resolve('electron-builder/package.json')) const { copyFiles, FileMatcher } = requireFromBuilder('app-builder-lib/out/fileMatcher') -const { createPackagedRuntimeNodeModuleResources } = require('../packaged-runtime-node-modules.cjs') +const { + createPackagedRuntimeNodeModuleResources +} = require('../../../packaged-runtime-node-modules.cjs') export async function stagePackagedProcessHost(resourcesDir) { const resource = createPackagedRuntimeNodeModuleResources().find( diff --git a/config/scripts/packaged-process-host.test.mjs b/config/scripts/desktop-distribution/runtime-verification/packaged-process-host.test.mjs similarity index 91% rename from config/scripts/packaged-process-host.test.mjs rename to config/scripts/desktop-distribution/runtime-verification/packaged-process-host.test.mjs index df3e457ff34..f5e1256513b 100644 --- a/config/scripts/packaged-process-host.test.mjs +++ b/config/scripts/desktop-distribution/runtime-verification/packaged-process-host.test.mjs @@ -4,7 +4,7 @@ import { createRequire } from 'node:module' import { tmpdir } from 'node:os' import { join } from 'node:path' import { describe, expect, it } from 'vitest' -import { removeTree } from '../../src/shared/windows-transient-lock-removal.ts' +import { removeTree } from '../../../../src/shared/windows-transient-lock-removal.ts' import { runPackagedProcessHostConsumer, stagePackagedProcessHost, @@ -12,8 +12,12 @@ import { } from './packaged-process-host-fixture.mjs' const require = createRequire(import.meta.url) -const { createPackagedRuntimeNodeModuleResources } = require('../packaged-runtime-node-modules.cjs') -const { collectRuntimeClosure } = require('./verify-skills-cli-runtime.cjs') +const { + createPackagedRuntimeNodeModuleResources +} = require('../../../packaged-runtime-node-modules.cjs') +const { + collectRuntimeClosure +} = require('../../runtime-verification/skills-cli/verify-skills-cli-runtime.cjs') const nodeExecutable = process.env.ORCA_TEST_NODE_EXECUTABLE ?? process.execPath it('loads the copied process package from an unpacked CLI without checkout dependencies', async () => { @@ -39,7 +43,7 @@ it('loads the copied process package from an unpacked CLI without checkout depen }) describe('process-host output packaging guard', () => { - const { assertProcessHostOutputBuilt } = require('../packaged-runtime-node-modules.cjs') + const { assertProcessHostOutputBuilt } = require('../../../packaged-runtime-node-modules.cjs') async function builtPackage() { const packageDir = await mkdtemp(join(tmpdir(), 'orca-process-host-output-')) diff --git a/config/scripts/packaged-repository-input-exclusion.test.mjs b/config/scripts/desktop-distribution/runtime-verification/packaged-repository-input-exclusion.test.mjs similarity index 96% rename from config/scripts/packaged-repository-input-exclusion.test.mjs rename to config/scripts/desktop-distribution/runtime-verification/packaged-repository-input-exclusion.test.mjs index 567c43f07c7..64b1ca5dfac 100644 --- a/config/scripts/packaged-repository-input-exclusion.test.mjs +++ b/config/scripts/desktop-distribution/runtime-verification/packaged-repository-input-exclusion.test.mjs @@ -6,7 +6,7 @@ import { dirname, join } from 'node:path' import { describe, expect, it } from 'vitest' const require = createRequire(import.meta.url) -const electronBuilderConfig = require('../electron-builder.config.cjs') +const electronBuilderConfig = require('../../../electron-builder.config.cjs') const { copyFiles, FileMatcher } = require('app-builder-lib/out/fileMatcher') describe('packaged repository input exclusion', () => { diff --git a/config/scripts/packaged-source-map-prune.test.mjs b/config/scripts/desktop-distribution/runtime-verification/packaged-source-map-prune.test.mjs similarity index 99% rename from config/scripts/packaged-source-map-prune.test.mjs rename to config/scripts/desktop-distribution/runtime-verification/packaged-source-map-prune.test.mjs index ac21d374ae6..ac6448b5eef 100644 --- a/config/scripts/packaged-source-map-prune.test.mjs +++ b/config/scripts/desktop-distribution/runtime-verification/packaged-source-map-prune.test.mjs @@ -8,7 +8,7 @@ const require = createRequire(import.meta.url) const { prunePackagedRuntimeTypeAndSourceMapArtifacts, prunePackagedRuntimeNodeModules -} = require('../packaged-runtime-node-modules.cjs') +} = require('../../../packaged-runtime-node-modules.cjs') const LINEAR_SDK_PACKAGE_JSON = '{"name":"@linear/sdk","type":"module","main":"./dist/index.cjs","exports":{".":{"require":"./dist/index.cjs","import":"./dist/index.mjs"}}}' diff --git a/config/scripts/packaged-windows-only-runtime-files.test.mjs b/config/scripts/desktop-distribution/runtime-verification/packaged-windows-only-runtime-files.test.mjs similarity index 93% rename from config/scripts/packaged-windows-only-runtime-files.test.mjs rename to config/scripts/desktop-distribution/runtime-verification/packaged-windows-only-runtime-files.test.mjs index ec4d750e83b..78dcfc6a0a8 100644 --- a/config/scripts/packaged-windows-only-runtime-files.test.mjs +++ b/config/scripts/desktop-distribution/runtime-verification/packaged-windows-only-runtime-files.test.mjs @@ -4,16 +4,18 @@ import { createRequire } from 'node:module' import { tmpdir } from 'node:os' import { join } from 'node:path' import { describe, expect, it } from 'vitest' -import { removeTree } from '../../src/shared/windows-transient-lock-removal.ts' +import { removeTree } from '../../../../src/shared/windows-transient-lock-removal.ts' const require = createRequire(import.meta.url) const { copyFiles, FileMatcher } = require('app-builder-lib/out/fileMatcher') -const { createPackagedRuntimeNodeModuleResources } = require('../packaged-runtime-node-modules.cjs') +const { + createPackagedRuntimeNodeModuleResources +} = require('../../../packaged-runtime-node-modules.cjs') const { RUNTIME_PACKAGE_EXCLUDED_FILES, assertNoWindowsExecutablesInRuntimeNodeModules, runtimePackageExcludeFilter -} = require('../packaged-windows-only-runtime-files.cjs') +} = require('../../../packaged-windows-only-runtime-files.cjs') const ssh2Target = join('node_modules', 'ssh2') const { everyPlatform, nonWindows } = RUNTIME_PACKAGE_EXCLUDED_FILES.ssh2 diff --git a/config/scripts/verify-packaged-browser-participation.mjs b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-browser-participation.mjs similarity index 85% rename from config/scripts/verify-packaged-browser-participation.mjs rename to config/scripts/desktop-distribution/runtime-verification/verify-packaged-browser-participation.mjs index c165ab46f19..fe8cd2bd56e 100644 --- a/config/scripts/verify-packaged-browser-participation.mjs +++ b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-browser-participation.mjs @@ -1,6 +1,6 @@ import { readFileSync } from 'node:fs' import { pathToFileURL } from 'node:url' -import { verifyPlaywrightParticipation } from './verify-playwright-participation.mjs' +import { verifyPlaywrightParticipation } from '../../runtime-verification/participation/verify-playwright-participation.mjs' export const PACKAGED_BROWSER_TEST_TITLES = [ 'keeps an old packaged client on the current server-hosted path', diff --git a/config/scripts/verify-packaged-browser-participation.test.mjs b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-browser-participation.test.mjs similarity index 100% rename from config/scripts/verify-packaged-browser-participation.test.mjs rename to config/scripts/desktop-distribution/runtime-verification/verify-packaged-browser-participation.test.mjs diff --git a/config/scripts/verify-packaged-daemon-entry.cjs b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-daemon-entry.cjs similarity index 98% rename from config/scripts/verify-packaged-daemon-entry.cjs rename to config/scripts/desktop-distribution/runtime-verification/verify-packaged-daemon-entry.cjs index 06895fcd3e1..6c79d25a386 100644 --- a/config/scripts/verify-packaged-daemon-entry.cjs +++ b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-daemon-entry.cjs @@ -5,10 +5,12 @@ const { connect } = require('node:net') const { tmpdir } = require('node:os') const { join, relative } = require('node:path') const { setTimeout: delay } = require('node:timers/promises') -const { macTerminalHostPaths } = require('./macos-terminal-host-bundle.cjs') +const { + macTerminalHostPaths +} = require('../../macos/terminal-host-bundle/macos-terminal-host-bundle.cjs') const { daemonProtocolVersion -} = require('../../src/shared/local-build-compatibility-contract.json') +} = require('../../../../src/shared/local-build-compatibility-contract.json') // Require exact asar-unpacked daemon entry on every platform; missing path indicates layout regression and must not silently skip. function assertPackagedDaemonEntryExists(resourcesDir) { diff --git a/config/scripts/verify-packaged-daemon-entry.test.mjs b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-daemon-entry.test.mjs similarity index 100% rename from config/scripts/verify-packaged-daemon-entry.test.mjs rename to config/scripts/desktop-distribution/runtime-verification/verify-packaged-daemon-entry.test.mjs diff --git a/config/scripts/verify-packaged-mobile-web-bundle.cjs b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-mobile-web-bundle.cjs similarity index 98% rename from config/scripts/verify-packaged-mobile-web-bundle.cjs rename to config/scripts/desktop-distribution/runtime-verification/verify-packaged-mobile-web-bundle.cjs index fe8b5d3c9a6..fb2a9b14615 100644 --- a/config/scripts/verify-packaged-mobile-web-bundle.cjs +++ b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-mobile-web-bundle.cjs @@ -2,9 +2,9 @@ const { createHash } = require('node:crypto') const { readFileSync, readdirSync, statSync } = require('node:fs') const { join, resolve } = require('node:path') -const { darkBuildMarkerFileNames } = require('../dark-build-switches.cjs') +const { darkBuildMarkerFileNames } = require('../../../dark-build-switches.cjs') -const projectDir = resolve(__dirname, '..', '..') +const projectDir = resolve(__dirname, '../../..', '..') const MOBILE_WEB_BUNDLE_DIR = join(projectDir, 'out', 'mobile-web') const REMEDY = 'Run pnpm build:mobile-web (build:desktop and build:release already do).' const ENTRYPOINT = 'index.html' diff --git a/config/scripts/verify-packaged-mobile-web-bundle.test.mjs b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-mobile-web-bundle.test.mjs similarity index 96% rename from config/scripts/verify-packaged-mobile-web-bundle.test.mjs rename to config/scripts/desktop-distribution/runtime-verification/verify-packaged-mobile-web-bundle.test.mjs index e6315b8d515..3b256fc69da 100644 --- a/config/scripts/verify-packaged-mobile-web-bundle.test.mjs +++ b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-mobile-web-bundle.test.mjs @@ -3,12 +3,12 @@ import { createRequire } from 'node:module' import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { writeMobileWebBundleFixtureTree } from './mobile-web-bundle-fixture-tree.mjs' +import { writeMobileWebBundleFixtureTree } from '../../build/mobile-web-app/mobile-web-bundle-fixture-tree.mjs' const require = createRequire(import.meta.url) const { assertMobileWebBundleBuilt } = require('./verify-packaged-mobile-web-bundle.cjs') -const electronBuilderConfig = require('../electron-builder.config.cjs') -const { darkBuildMarkers } = require('../dark-build-switches.cjs') +const electronBuilderConfig = require('../../../electron-builder.config.cjs') +const { darkBuildMarkers } = require('../../../dark-build-switches.cjs') async function withBundle(run) { const scratch = await mkdtemp(join(tmpdir(), 'orca-mobile-web-guard-')) diff --git a/config/scripts/verify-packaged-node-pty-job-ownership.cjs b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-node-pty-job-ownership.cjs similarity index 94% rename from config/scripts/verify-packaged-node-pty-job-ownership.cjs rename to config/scripts/desktop-distribution/runtime-verification/verify-packaged-node-pty-job-ownership.cjs index 2e3f7fda99d..293d0a9470c 100644 --- a/config/scripts/verify-packaged-node-pty-job-ownership.cjs +++ b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-node-pty-job-ownership.cjs @@ -7,9 +7,13 @@ const { conptyDeniesCygwinBreakaway, nodePtyAddonPath, staleConptySourceBuildError -} = require('./node-pty-job-ownership.cjs') -const { normalizeNodePtyWindowsArch } = require('../packaged-runtime-node-modules.cjs') -const { PE_MACHINE, describePeMachine, readPeMachine } = require('./windows-pe-machine.cjs') +} = require('../../native-build/node-addons/node-pty-job-ownership.cjs') +const { normalizeNodePtyWindowsArch } = require('../../../packaged-runtime-node-modules.cjs') +const { + PE_MACHINE, + describePeMachine, + readPeMachine +} = require('../../native-build/windows/windows-pe-machine.cjs') // Follow loader order: it swallows failed requires, first loadable candidate wins and upstream prebuild is last fallback. function packagedConptyCandidates(resourcesDir, targetArch) { @@ -125,7 +129,7 @@ function verifyPackagedConptyBreakawayMarker(resourcesDir, targetArch, options = 'the Cygwin/MSYS job-breakaway denial, because the source build beside it is the wrong', `architecture: ${describeCandidates(unusableSourceBuilds)}.`, 'A cross-arch rebuild that did not honour --arch looks exactly like this. Re-run', - `config/scripts/rebuild-native-deps.mjs --platform=win32 --arch=${architecture},`, + `config/scripts/native-build/node-addons/rebuild-native-deps.mjs --platform=win32 --arch=${architecture},`, 'confirm it emitted a conpty.node of that machine, and repackage.', 'See docs/reference/windows-msys-job-breakaway.md.' ].join(' ') diff --git a/config/scripts/verify-packaged-node-pty-job-ownership.test.mjs b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-node-pty-job-ownership.test.mjs similarity index 98% rename from config/scripts/verify-packaged-node-pty-job-ownership.test.mjs rename to config/scripts/desktop-distribution/runtime-verification/verify-packaged-node-pty-job-ownership.test.mjs index f4101912691..8a41d206b58 100644 --- a/config/scripts/verify-packaged-node-pty-job-ownership.test.mjs +++ b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-node-pty-job-ownership.test.mjs @@ -3,7 +3,7 @@ import { createRequire } from 'node:module' import { tmpdir } from 'node:os' import { dirname, join } from 'node:path' import { describe, expect, it, vi } from 'vitest' -import { peImage } from './windows-pe-image-fixture.mjs' +import { peImage } from '../../native-build/windows/windows-pe-image-fixture.mjs' const require = createRequire(import.meta.url) const { @@ -11,7 +11,10 @@ const { verifyPackagedNodePtyJobOwnership, verifyPackagedWindowsNodePty } = require('./verify-packaged-node-pty-job-ownership.cjs') -const { CYGWIN_BREAKAWAY_MARKER, NATIVE_HOST_JOB_MARKER } = require('./node-pty-job-ownership.cjs') +const { + CYGWIN_BREAKAWAY_MARKER, + NATIVE_HOST_JOB_MARKER +} = require('../../native-build/node-addons/node-pty-job-ownership.cjs') const fixtureDir = mkdtempSync(join(tmpdir(), 'packaged-node-pty-job-')) diff --git a/config/scripts/verify-packaged-plugin-resources.cjs b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-plugin-resources.cjs similarity index 100% rename from config/scripts/verify-packaged-plugin-resources.cjs rename to config/scripts/desktop-distribution/runtime-verification/verify-packaged-plugin-resources.cjs diff --git a/config/scripts/verify-packaged-plugin-resources.test.mjs b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-plugin-resources.test.mjs similarity index 100% rename from config/scripts/verify-packaged-plugin-resources.test.mjs rename to config/scripts/desktop-distribution/runtime-verification/verify-packaged-plugin-resources.test.mjs diff --git a/config/scripts/verify-packaged-serve-payload.cjs b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-serve-payload.cjs similarity index 100% rename from config/scripts/verify-packaged-serve-payload.cjs rename to config/scripts/desktop-distribution/runtime-verification/verify-packaged-serve-payload.cjs diff --git a/config/scripts/verify-packaged-serve-payload.test.mjs b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-serve-payload.test.mjs similarity index 98% rename from config/scripts/verify-packaged-serve-payload.test.mjs rename to config/scripts/desktop-distribution/runtime-verification/verify-packaged-serve-payload.test.mjs index ebc28853ee4..e10c2538383 100644 --- a/config/scripts/verify-packaged-serve-payload.test.mjs +++ b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-serve-payload.test.mjs @@ -3,7 +3,7 @@ import { createRequire } from 'node:module' import { tmpdir } from 'node:os' import { dirname, join } from 'node:path' import { afterEach, describe, expect, it } from 'vitest' -import { ORCAD_LOCAL_SERVE_SELECTION_ENTRY } from '../../src/shared/orcad-local-serve-selection' +import { ORCAD_LOCAL_SERVE_SELECTION_ENTRY } from '../../../../src/shared/orcad-local-serve-selection' const require = createRequire(import.meta.url) const { diff --git a/config/scripts/verify-packaged-windows-agent-hook.cjs b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-windows-agent-hook.cjs similarity index 84% rename from config/scripts/verify-packaged-windows-agent-hook.cjs rename to config/scripts/desktop-distribution/runtime-verification/verify-packaged-windows-agent-hook.cjs index b09315b5336..3beb4b2c6ce 100644 --- a/config/scripts/verify-packaged-windows-agent-hook.cjs +++ b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-windows-agent-hook.cjs @@ -2,7 +2,11 @@ const { existsSync } = require('node:fs') const { join } = require('node:path') -const { PE_MACHINE, describePeMachine, readPeMachine } = require('./windows-pe-machine.cjs') +const { + PE_MACHINE, + describePeMachine, + readPeMachine +} = require('../../native-build/windows/windows-pe-machine.cjs') // electron-builder's `Arch` enum values for the Windows slices Orca can package. const ARCH_BY_ELECTRON_BUILDER_ENUM = { 1: 'x64', 3: 'arm64' } @@ -12,7 +16,7 @@ function verifyPackagedWindowsAgentHook(resourcesDir, electronBuilderArch) { const hookPath = join(resourcesDir, 'bin', 'orca-agent-hook.exe') if (!existsSync(hookPath)) { throw new Error( - `Missing packaged agent hook ${hookPath}; run node config/scripts/build-windows-agent-hook.mjs` + `Missing packaged agent hook ${hookPath}; run node config/scripts/native-build/windows/build-windows-agent-hook.mjs` ) } const arch = ARCH_BY_ELECTRON_BUILDER_ENUM[electronBuilderArch] diff --git a/config/scripts/verify-packaged-windows-agent-hook.test.mjs b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-windows-agent-hook.test.mjs similarity index 95% rename from config/scripts/verify-packaged-windows-agent-hook.test.mjs rename to config/scripts/desktop-distribution/runtime-verification/verify-packaged-windows-agent-hook.test.mjs index 77dbde9df85..908d3046d18 100644 --- a/config/scripts/verify-packaged-windows-agent-hook.test.mjs +++ b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-windows-agent-hook.test.mjs @@ -3,7 +3,7 @@ import { createRequire } from 'node:module' import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, describe, expect, it } from 'vitest' -import { peImage } from './windows-pe-image-fixture.mjs' +import { peImage } from '../../native-build/windows/windows-pe-image-fixture.mjs' const { verifyPackagedWindowsAgentHook } = createRequire(import.meta.url)( './verify-packaged-windows-agent-hook.cjs' diff --git a/config/scripts/dev-profile-seed.mjs b/config/scripts/dev-profile-seed.mjs index 5fa94a6995c..7c57062cae9 100644 --- a/config/scripts/dev-profile-seed.mjs +++ b/config/scripts/dev-profile-seed.mjs @@ -9,8 +9,8 @@ import { readDevInstanceRecord, resolveDevProfile, sameFilesystemPath -} from './dev-instance-isolation.mjs' -import { isProcessAlive } from './remote-agent-session-process-cleanup.mjs' +} from './development/instance-isolation/dev-instance-isolation.mjs' +import { isProcessAlive } from './development/remote-session-cleanup/remote-agent-session-process-cleanup.mjs' // Allowlist of profile-state domains: projects, workspaces, settings, and SSH targets. // Terminal sessions, PTY leases, automations (they would run twice), and telemetry stay behind. diff --git a/config/scripts/dev-electron-bundle-cache.mjs b/config/scripts/development/electron-bundle-cache/dev-electron-bundle-cache.mjs similarity index 100% rename from config/scripts/dev-electron-bundle-cache.mjs rename to config/scripts/development/electron-bundle-cache/dev-electron-bundle-cache.mjs diff --git a/config/scripts/dev-electron-bundle-cache.test.ts b/config/scripts/development/electron-bundle-cache/dev-electron-bundle-cache.test.ts similarity index 100% rename from config/scripts/dev-electron-bundle-cache.test.ts rename to config/scripts/development/electron-bundle-cache/dev-electron-bundle-cache.test.ts diff --git a/config/scripts/dev-instance-isolation.mjs b/config/scripts/development/instance-isolation/dev-instance-isolation.mjs similarity index 100% rename from config/scripts/dev-instance-isolation.mjs rename to config/scripts/development/instance-isolation/dev-instance-isolation.mjs diff --git a/config/scripts/dev-instance-isolation.test.mjs b/config/scripts/development/instance-isolation/dev-instance-isolation.test.mjs similarity index 100% rename from config/scripts/dev-instance-isolation.test.mjs rename to config/scripts/development/instance-isolation/dev-instance-isolation.test.mjs diff --git a/config/scripts/remote-agent-session-process-cleanup.mjs b/config/scripts/development/remote-session-cleanup/remote-agent-session-process-cleanup.mjs similarity index 100% rename from config/scripts/remote-agent-session-process-cleanup.mjs rename to config/scripts/development/remote-session-cleanup/remote-agent-session-process-cleanup.mjs diff --git a/config/scripts/electron-platform-path.mjs b/config/scripts/electron-installation/platform-layout/electron-platform-path.mjs similarity index 100% rename from config/scripts/electron-platform-path.mjs rename to config/scripts/electron-installation/platform-layout/electron-platform-path.mjs diff --git a/config/scripts/install-electron-package-binary-test-fixtures.mjs b/config/scripts/electron-installation/platform-layout/install-electron-package-binary-test-fixtures.mjs similarity index 88% rename from config/scripts/install-electron-package-binary-test-fixtures.mjs rename to config/scripts/electron-installation/platform-layout/install-electron-package-binary-test-fixtures.mjs index 43af71328ff..5d0eeb6a972 100644 --- a/config/scripts/install-electron-package-binary-test-fixtures.mjs +++ b/config/scripts/electron-installation/platform-layout/install-electron-package-binary-test-fixtures.mjs @@ -3,7 +3,7 @@ import { mkdirSync, mkdtempSync, readFileSync, writeFileSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' import { fileURLToPath } from 'node:url' -import { copyScriptWithLocalModules } from './script-module-dependencies.mjs' +import { copyScriptWithLocalModules } from '../../test-fixtures/script-copy-closure/script-module-dependencies.mjs' const sourceScriptPath = fileURLToPath( new URL('./install-electron-package-binary.mjs', import.meta.url) @@ -14,24 +14,31 @@ export const sharedEntryNameFor = (version) => `${version}-linux-x64` export function mkTempProject() { const projectDir = mkdtempSync(join(tmpdir(), 'orca-install-electron-')) - copyScriptWithLocalModules(sourceScriptPath, join(projectDir, 'config', 'scripts')) + copyScriptWithLocalModules( + sourceScriptPath, + join(projectDir, 'config', 'scripts', 'electron-installation', 'platform-layout') + ) return projectDir } export function runInstallScript(projectDir, extraEnv = {}) { - return spawnSync(process.execPath, ['config/scripts/install-electron-package-binary.mjs'], { - cwd: projectDir, - encoding: 'utf8', - env: { - ...process.env, - ELECTRON_CACHE: undefined, - ORCA_ELECTRON_PACKAGE_CACHE_ROOT: undefined, - npm_config_platform: 'linux', - npm_config_arch: 'x64', - ORCA_ELECTRON_PACKAGE_EXTRACTOR: join(projectDir, 'fake-extractor.cjs'), - ...extraEnv + return spawnSync( + process.execPath, + ['config/scripts/electron-installation/platform-layout/install-electron-package-binary.mjs'], + { + cwd: projectDir, + encoding: 'utf8', + env: { + ...process.env, + ELECTRON_CACHE: undefined, + ORCA_ELECTRON_PACKAGE_CACHE_ROOT: undefined, + npm_config_platform: 'linux', + npm_config_arch: 'x64', + ORCA_ELECTRON_PACKAGE_EXTRACTOR: join(projectDir, 'fake-extractor.cjs'), + ...extraEnv + } } - }) + ) } export function writeFakeElectronPackage( @@ -170,7 +177,10 @@ export function initGitRepo(projectDir) { export function addSiblingWorktree(projectDir, siblingDir) { runGit(projectDir, ['worktree', 'add', '--quiet', '-b', 'sibling', siblingDir]) - copyScriptWithLocalModules(sourceScriptPath, join(siblingDir, 'config', 'scripts')) + copyScriptWithLocalModules( + sourceScriptPath, + join(siblingDir, 'config', 'scripts', 'electron-installation', 'platform-layout') + ) return siblingDir } diff --git a/config/scripts/install-electron-package-binary.mjs b/config/scripts/electron-installation/platform-layout/install-electron-package-binary.mjs similarity index 98% rename from config/scripts/install-electron-package-binary.mjs rename to config/scripts/electron-installation/platform-layout/install-electron-package-binary.mjs index a4fa843c459..ed9323b7d71 100644 --- a/config/scripts/install-electron-package-binary.mjs +++ b/config/scripts/electron-installation/platform-layout/install-electron-package-binary.mjs @@ -16,17 +16,17 @@ import { createRequire } from 'node:module' import { platform as osPlatform, tmpdir } from 'node:os' import { join, resolve } from 'node:path' import { getElectronPlatformPath } from './electron-platform-path.mjs' -import { getZipExtractorCommand } from './zip-extractor-command.mjs' -import { isSharedPackageDir } from './native-build-entry.cjs' +import { getZipExtractorCommand } from '../../../../src/shared/zip-extractor-command.ts' +import { isSharedPackageDir } from '../../native-build/node-addons/native-build-entry.cjs' import { shareElectronDistFromCache, hasAdoptedSharedElectronDist, publishSharedElectronDist, recordAdoptedSharedElectronDist, resolveSharedElectronDistEntry -} from './shared-electron-dist-cache.mjs' +} from '../shared-dist-cache/shared-electron-dist-cache.mjs' -const projectDir = resolve(import.meta.dirname, '../..') +const projectDir = resolve(import.meta.dirname, '../../../..') const electronPackageDir = resolve(projectDir, 'node_modules/electron') const electronRequire = createRequire(resolve(electronPackageDir, 'package.json')) const { version: electronVersion } = electronRequire('./package.json') diff --git a/config/scripts/install-electron-package-binary.test.mjs b/config/scripts/electron-installation/platform-layout/install-electron-package-binary.test.mjs similarity index 100% rename from config/scripts/install-electron-package-binary.test.mjs rename to config/scripts/electron-installation/platform-layout/install-electron-package-binary.test.mjs diff --git a/config/scripts/shared-electron-dist-cache.mjs b/config/scripts/electron-installation/shared-dist-cache/shared-electron-dist-cache.mjs similarity index 93% rename from config/scripts/shared-electron-dist-cache.mjs rename to config/scripts/electron-installation/shared-dist-cache/shared-electron-dist-cache.mjs index 7e4dde41597..80fd7ce1f5b 100644 --- a/config/scripts/shared-electron-dist-cache.mjs +++ b/config/scripts/electron-installation/shared-dist-cache/shared-electron-dist-cache.mjs @@ -2,9 +2,15 @@ import { execFileSync } from 'node:child_process' import { randomUUID } from 'node:crypto' import { existsSync, lstatSync, mkdirSync, readFileSync, rmSync } from 'node:fs' import path from 'node:path' -import { makeTreeReadOnly, shareTree } from './space-sharing-copy.mjs' -import { publishSharedTree, sharedTreeStagingPath } from './shared-tree-publish.mjs' -import { isSharedPackageDir } from './native-build-entry.cjs' +import { + makeTreeReadOnly, + shareTree +} from '../../artifact-storage/reflink-copy/space-sharing-copy.mjs' +import { + publishSharedTree, + sharedTreeStagingPath +} from '../../artifact-storage/atomic-publication/shared-tree-publish.mjs' +import { isSharedPackageDir } from '../../native-build/node-addons/native-build-entry.cjs' const IDENTITY_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/ // Sibling of path.txt, never inside dist: an install replaces dist wholesale. diff --git a/config/scripts/shared-electron-dist-cache.test.ts b/config/scripts/electron-installation/shared-dist-cache/shared-electron-dist-cache.test.ts similarity index 99% rename from config/scripts/shared-electron-dist-cache.test.ts rename to config/scripts/electron-installation/shared-dist-cache/shared-electron-dist-cache.test.ts index e5df7a6ebba..2f51b7513a6 100644 --- a/config/scripts/shared-electron-dist-cache.test.ts +++ b/config/scripts/electron-installation/shared-dist-cache/shared-electron-dist-cache.test.ts @@ -20,7 +20,7 @@ import { recordAdoptedSharedElectronDist, resolveSharedElectronDistEntry } from './shared-electron-dist-cache.mjs' -import { makeTreeReadOnly } from './space-sharing-copy.mjs' +import { makeTreeReadOnly } from '../../artifact-storage/reflink-copy/space-sharing-copy.mjs' const VERSION = '43.4.1' const PLATFORM_PATH = path.join('Electron.app', 'Contents', 'MacOS', 'Electron') diff --git a/config/scripts/generate-rpc-params-catalog.mjs b/config/scripts/generate-rpc-params-catalog.mjs index 95e7cdcb8d6..1860d700cb7 100644 --- a/config/scripts/generate-rpc-params-catalog.mjs +++ b/config/scripts/generate-rpc-params-catalog.mjs @@ -13,7 +13,7 @@ import { createRequire } from 'node:module' import path from 'node:path' import process from 'node:process' import * as esbuild from 'esbuild' -import { resolveOxcCliInvocation } from './oxc-cli-invocation.mjs' +import { resolveOxcCliInvocation } from './tool-invocation/oxc-cli-invocation.mjs' const REPO_ROOT = path.resolve(import.meta.dirname, '..', '..') const SHARED_DIR = path.join(REPO_ROOT, 'src', 'shared') diff --git a/config/scripts/generate-skill-bundle-manifest.mjs b/config/scripts/generate-skill-bundle-manifest.mjs index 8926617dd88..b22c58c5ad0 100644 --- a/config/scripts/generate-skill-bundle-manifest.mjs +++ b/config/scripts/generate-skill-bundle-manifest.mjs @@ -3,7 +3,7 @@ import { createHash } from 'node:crypto' import { lstat, mkdir, readFile, readdir, writeFile } from 'node:fs/promises' import path from 'node:path' import process from 'node:process' -import { resolvePullRequestDiffBase } from './git-pull-request-diff-base.mjs' +import { resolvePullRequestDiffBase } from './git/pr-diff-base/git-pull-request-diff-base.mjs' import skillRenames from '../../src/shared/bundled-skill-renames.json' with { type: 'json' } // Schema 3 removed revision/tree identity with snapshot registry; freshness compares installed bytes only. diff --git a/config/scripts/generate-skill-bundle-manifest.test.mjs b/config/scripts/generate-skill-bundle-manifest.test.mjs index 1396ad8e955..004f79a5a62 100644 --- a/config/scripts/generate-skill-bundle-manifest.test.mjs +++ b/config/scripts/generate-skill-bundle-manifest.test.mjs @@ -53,8 +53,13 @@ async function createGeneratorSandbox() { path.resolve(import.meta.dirname, '../../src/shared/bundled-skill-renames.json'), path.join(root, 'src', 'shared', 'bundled-skill-renames.json') ) - for (const name of ['generate-skill-bundle-manifest.mjs', 'git-pull-request-diff-base.mjs']) { - await copyFile(path.join(import.meta.dirname, name), path.join(path.dirname(script), name)) + for (const name of [ + 'generate-skill-bundle-manifest.mjs', + 'git/pr-diff-base/git-pull-request-diff-base.mjs' + ]) { + const target = path.join(path.dirname(script), name) + await mkdir(path.dirname(target), { recursive: true }) + await copyFile(path.join(import.meta.dirname, name), target) } await writeFile(path.join(skillRoot, 'SKILL.md'), 'demo skill\n') const run = (env, args) => diff --git a/config/scripts/git-pull-request-diff-base.mjs b/config/scripts/git/pr-diff-base/git-pull-request-diff-base.mjs similarity index 100% rename from config/scripts/git-pull-request-diff-base.mjs rename to config/scripts/git/pr-diff-base/git-pull-request-diff-base.mjs diff --git a/config/scripts/git-pull-request-diff-base.test.mjs b/config/scripts/git/pr-diff-base/git-pull-request-diff-base.test.mjs similarity index 100% rename from config/scripts/git-pull-request-diff-base.test.mjs rename to config/scripts/git/pr-diff-base/git-pull-request-diff-base.test.mjs diff --git a/config/scripts/headless-detector-compiler-cache.test.mjs b/config/scripts/headless-detector-compiler-cache.test.mjs index 8eee137a2ff..31f868a2ffd 100644 --- a/config/scripts/headless-detector-compiler-cache.test.mjs +++ b/config/scripts/headless-detector-compiler-cache.test.mjs @@ -12,6 +12,7 @@ import { } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' +import { fileURLToPath } from 'node:url' import { afterEach, expect, it } from 'vitest' import { parse } from 'yaml' import { @@ -19,7 +20,8 @@ import { compilerCacheIdentity, packCompilerCache } from './headless-detector-compiler-cache.mjs' -import { collectNodeServerInputs } from './node-server-change-scope.mjs' +import { collectNodeServerInputs } from './node-server/qualification/node-server-change-scope.mjs' +import { copyScriptWithLocalModules } from './test-fixtures/script-copy-closure/script-module-dependencies.mjs' import { runProcessSync } from '@orca/process-host' const temporary = [] @@ -70,20 +72,12 @@ it('activates the compiler and workspace-policy parser and preserves import grap const { root, identity } = fixture() expect(await activateCompilerCache({ root, identity })).toEqual({ available: true }) expect(readdirSync(join(root, 'node_modules')).sort()).toEqual(['@esbuild', 'esbuild', 'yaml']) - for (const name of [ - 'node-server-change-scope', - 'node-server-test-paths', - 'node-server-qualification', - 'node-server-native-compat-scope', - 'orcad-entry-build', - 'workspace-source-exports' - ]) { - mkdirSync(join(root, 'config', 'scripts'), { recursive: true }) - cpSync( - new URL(`./${name}.mjs`, import.meta.url), - join(root, 'config', 'scripts', `${name}.mjs`) - ) - } + copyScriptWithLocalModules( + fileURLToPath( + new URL('./node-server/qualification/node-server-change-scope.mjs', import.meta.url) + ), + join(root, 'config', 'scripts', 'node-server', 'qualification') + ) cpSync( new URL('../dark-build-switches.cjs', import.meta.url), join(root, 'config', 'dark-build-switches.cjs') @@ -115,7 +109,7 @@ it('activates the compiler and workspace-policy parser and preserves import grap } writeFileSync( join(root, 'probe.mjs'), - "import { collectNodeServerInputs } from './config/scripts/node-server-change-scope.mjs'; console.log(JSON.stringify([...(await collectNodeServerInputs({ root: process.cwd(), entryPoints: ['entry.ts'] }))].sort()))" + "import { collectNodeServerInputs } from './config/scripts/node-server/qualification/node-server-change-scope.mjs'; console.log(JSON.stringify([...(await collectNodeServerInputs({ root: process.cwd(), entryPoints: ['entry.ts'] }))].sort()))" ) const baseline = [...(await collectNodeServerInputs({ root, entryPoints: ['entry.ts'] }))].sort() expect(baseline).toContain('src/packages/process-host/src/run-process.ts') diff --git a/config/scripts/json-parser-migration-benchmark.mjs b/config/scripts/json-parser-migration-benchmark.mjs index 0aca1734e1b..4f0257e4b54 100644 --- a/config/scripts/json-parser-migration-benchmark.mjs +++ b/config/scripts/json-parser-migration-benchmark.mjs @@ -5,8 +5,8 @@ import { createReadStream, readFileSync, statSync, mkdtempSync, rmSync } from 'n import { tmpdir } from 'node:os' import { join, resolve } from 'node:path' import { pathToFileURL } from 'node:url' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' -import { summarizeBenchmarkSamples } from './benchmark-sample-summary.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' +import { summarizeBenchmarkSamples } from './performance/measurement/benchmark-sample-summary.mjs' import { JSON_PARSER_CASES, writeJsonParserFixtures } from './json-parser-benchmark-fixtures.mjs' // Bundle each revision's two consumers as {baseline,candidate}-{rg,session}.mjs first. diff --git a/config/scripts/legacy-alt-screen-scan-benchmark.mjs b/config/scripts/legacy-alt-screen-scan-benchmark.mjs index 29c9621fbda..1f44212b364 100644 --- a/config/scripts/legacy-alt-screen-scan-benchmark.mjs +++ b/config/scripts/legacy-alt-screen-scan-benchmark.mjs @@ -3,7 +3,7 @@ import { readFileSync } from 'node:fs' import { dirname, resolve } from 'node:path' import { performance } from 'node:perf_hooks' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' const modulePath = 'src/main/daemon/terminal-history-legacy-scrollback-restore.ts' const baselineSource = readFileSync(0, 'utf8') diff --git a/config/scripts/lint-react-doctor-changed.mjs b/config/scripts/lint-react-doctor-changed.mjs index 0f294f481f2..3e7032fc19b 100644 --- a/config/scripts/lint-react-doctor-changed.mjs +++ b/config/scripts/lint-react-doctor-changed.mjs @@ -1,6 +1,6 @@ import { existsSync } from 'node:fs' import { spawnSync } from 'node:child_process' -import { resolveOxlintInvocation } from './oxlint-cli-invocation.mjs' +import { resolveOxlintInvocation } from './tool-invocation/oxlint-cli-invocation.mjs' const SOURCE_FILE_PATTERN = /\.(?:[cm]?[jt]sx?)$/ diff --git a/config/scripts/locale-catalog/locale-collator-sort-benchmark.mjs b/config/scripts/locale-catalog/locale-collator-sort-benchmark.mjs index 8eeda0352b5..86985e3625b 100644 --- a/config/scripts/locale-catalog/locale-collator-sort-benchmark.mjs +++ b/config/scripts/locale-catalog/locale-collator-sort-benchmark.mjs @@ -3,7 +3,7 @@ import { performance } from 'node:perf_hooks' import { fileURLToPath } from 'node:url' import { createJiti } from 'jiti' -import { buildCounterbalancedSchedule } from '../counterbalanced-benchmark-schedule.mjs' +import { buildCounterbalancedSchedule } from '../performance/measurement/counterbalanced-benchmark-schedule.mjs' const ROUND_COUNT = 6 const MIN_ROUND_MS = 120 diff --git a/config/scripts/localization-extraction-change-scope.mjs b/config/scripts/localization/extraction-policy/localization-extraction-change-scope.mjs similarity index 94% rename from config/scripts/localization-extraction-change-scope.mjs rename to config/scripts/localization/extraction-policy/localization-extraction-change-scope.mjs index fb9e80bcf92..9b407058f01 100644 --- a/config/scripts/localization-extraction-change-scope.mjs +++ b/config/scripts/localization/extraction-policy/localization-extraction-change-scope.mjs @@ -34,6 +34,7 @@ export function affectsLocalizationExtraction(paths) { path.startsWith('config/tsconfig') || path.startsWith('config/patches/') || path.startsWith('config/scripts/localization-') || + path.startsWith('config/scripts/localization/extraction-policy/localization-') || path.startsWith('config/scripts/verify-localization-') || path.startsWith('.github/actions/install-node-dependencies/') ) diff --git a/config/scripts/localization-extraction-change-scope.test.mjs b/config/scripts/localization/extraction-policy/localization-extraction-change-scope.test.mjs similarity index 91% rename from config/scripts/localization-extraction-change-scope.test.mjs rename to config/scripts/localization/extraction-policy/localization-extraction-change-scope.test.mjs index b128fe54de7..a3ebece442d 100644 --- a/config/scripts/localization-extraction-change-scope.test.mjs +++ b/config/scripts/localization/extraction-policy/localization-extraction-change-scope.test.mjs @@ -12,7 +12,7 @@ it.each([ 'src/renderer/src/i18n/locales/en.json', 'config/i18next.config.ts', 'config/scripts/verify-localization-extraction.mjs', - 'config/scripts/localization-extraction-change-scope.mjs', + 'config/scripts/localization/extraction-policy/localization-extraction-change-scope.mjs', 'config/patches/i18next-cli.patch', 'package.json', 'pnpm-lock.yaml', @@ -88,7 +88,7 @@ it.skipIf(process.platform === 'win32')( 'executes workflow routing for ignored changes, deleted and renamed inputs, and detection failures', () => { const workflow = parse( - readFileSync(new URL('../../.github/workflows/pr.yml', import.meta.url), 'utf8') + readFileSync(new URL('../../../../.github/workflows/pr.yml', import.meta.url), 'utf8') ) const step = workflow.jobs.preflight.steps.find( (candidate) => candidate.name === 'Verify localization extraction' @@ -162,10 +162,13 @@ it.skipIf(process.platform === 'win32')( try { git('init', '--quiet') - for (const script of ['git-pull-request-diff-base', 'localization-extraction-change-scope']) { - const relative = `config/scripts/${script}.mjs` + for (const script of [ + 'config/scripts/git/pr-diff-base/git-pull-request-diff-base.mjs', + 'config/scripts/localization/extraction-policy/localization-extraction-change-scope.mjs' + ]) { + const relative = script mkdirSync(dirname(join(directory, relative)), { recursive: true }) - copyFileSync(new URL(`./${script}.mjs`, import.meta.url), join(directory, relative)) + copyFileSync(new URL(`../../../../${script}`, import.meta.url), join(directory, relative)) } write('src/deleted.ts', "translate('deleted')") write('src/renamed.ts', "translate('renamed')") @@ -194,7 +197,7 @@ it.skipIf(process.platform === 'win32')( base, true, `node() { - if [ "$1" = config/scripts/localization-extraction-change-scope.mjs ]; then return 1; fi + if [ "$1" = config/scripts/localization/extraction-policy/localization-extraction-change-scope.mjs ]; then return 1; fi command "$ORCA_TEST_NODE" "$@" }` ) diff --git a/config/scripts/macos-terminal-host-bundle.cjs b/config/scripts/macos/terminal-host-bundle/macos-terminal-host-bundle.cjs similarity index 98% rename from config/scripts/macos-terminal-host-bundle.cjs rename to config/scripts/macos/terminal-host-bundle/macos-terminal-host-bundle.cjs index ccbb15a1b33..9d73f7f55fa 100644 --- a/config/scripts/macos-terminal-host-bundle.cjs +++ b/config/scripts/macos/terminal-host-bundle/macos-terminal-host-bundle.cjs @@ -289,12 +289,16 @@ function assembleMacTerminalHost({ appPath, nodeExecutable, iconPath, info }) { } async function loadNodeRuntimePin() { - return import(pathToFileURL(resolve(__dirname, '../../src/shared/node-runtime-pin.ts')).href) + return import( + pathToFileURL(resolve(__dirname, '../../../../src/shared/node-runtime-pin.ts')).href + ) } async function pinnedDarwinNode(arch) { const { ensurePinnedNodeExecutable } = await import( - pathToFileURL(resolve(__dirname, 'pinned-node-downloads.mjs')).href + pathToFileURL( + resolve(__dirname, '../../orcad-distribution/prebuilds/pinned-node-downloads.mjs') + ).href ) return ensurePinnedNodeExecutable({ target: `darwin-${arch}` }) } diff --git a/config/scripts/macos-terminal-host-bundle.test.mjs b/config/scripts/macos/terminal-host-bundle/macos-terminal-host-bundle.test.mjs similarity index 97% rename from config/scripts/macos-terminal-host-bundle.test.mjs rename to config/scripts/macos/terminal-host-bundle/macos-terminal-host-bundle.test.mjs index 63f1eaa9d56..78986afd13e 100644 --- a/config/scripts/macos-terminal-host-bundle.test.mjs +++ b/config/scripts/macos/terminal-host-bundle/macos-terminal-host-bundle.test.mjs @@ -15,9 +15,9 @@ import { afterEach, beforeEach, describe, expect, it } from 'vitest' import { MAC_TERMINAL_HOST_BUNDLE, MAC_TERMINAL_HOST_EXECUTABLE -} from '../../src/main/daemon/macos-daemon-bundle.ts' +} from '../../../../src/main/daemon/macos-daemon-bundle.ts' -const require = createRequire(import.meta.url) +const require = createRequire(new URL('../../macos-terminal-host-bundle.test.mjs', import.meta.url)) const { assembleMacTerminalHost, buildMacTerminalHostInfo, @@ -28,8 +28,10 @@ const { macTerminalHostPaths, macTerminalHostSignIgnore, parseBuildVersionMinos -} = require('./macos-terminal-host-bundle.cjs') -const { macCommandPrefixForArch } = require('./verify-packaged-daemon-entry.cjs') +} = require('./macos/terminal-host-bundle/macos-terminal-host-bundle.cjs') +const { + macCommandPrefixForArch +} = require('./desktop-distribution/runtime-verification/verify-packaged-daemon-entry.cjs') const electronBuilderConfig = require('../electron-builder.config.cjs') const usageDescriptions = electronBuilderConfig.mac.extendInfo diff --git a/config/scripts/managed-data-account-runtime.test.ts b/config/scripts/managed-data-account-runtime.test.ts index aeb66c6def9..9d3b006db84 100644 --- a/config/scripts/managed-data-account-runtime.test.ts +++ b/config/scripts/managed-data-account-runtime.test.ts @@ -6,7 +6,7 @@ import { resolveConfig } from 'electron-vite' import { build } from 'vite' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { runProcess } from '@orca/process-host' -import { stagePackagedProcessHost } from './packaged-process-host-fixture.mjs' +import { stagePackagedProcessHost } from './desktop-distribution/runtime-verification/packaged-process-host-fixture.mjs' const projectDir = resolve(import.meta.dirname, '../..') const require = createRequire(import.meta.url) diff --git a/config/scripts/markdown-note-line-scan-benchmark.mjs b/config/scripts/markdown-note-line-scan-benchmark.mjs index 2b6565278d9..a5e7222a324 100644 --- a/config/scripts/markdown-note-line-scan-benchmark.mjs +++ b/config/scripts/markdown-note-line-scan-benchmark.mjs @@ -4,7 +4,7 @@ import { readFileSync } from 'node:fs' import { dirname, resolve } from 'node:path' import { performance } from 'node:perf_hooks' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' const sourcePath = 'src/renderer/src/lib/markdown-review-notes.ts' const baseline = process.argv[2] ?? '20ab9950654' diff --git a/config/scripts/mobile-backspace-benchmark.mjs b/config/scripts/mobile-backspace-benchmark.mjs index f1839089776..d5fda2e1e50 100644 --- a/config/scripts/mobile-backspace-benchmark.mjs +++ b/config/scripts/mobile-backspace-benchmark.mjs @@ -3,8 +3,8 @@ import { readFileSync } from 'node:fs' import { dirname, resolve } from 'node:path' import { performance } from 'node:perf_hooks' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' -import { summarizeBenchmarkSamples } from './benchmark-sample-summary.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' +import { summarizeBenchmarkSamples } from './performance/measurement/benchmark-sample-summary.mjs' // git show <baseline-ref>:mobile/src/terminal/terminal-live-text-commit.ts | node config/scripts/mobile-backspace-benchmark.mjs const target = resolve('mobile/src/terminal/terminal-live-text-commit.ts') diff --git a/config/scripts/mobile-file-ranking-benchmark.mjs b/config/scripts/mobile-file-ranking-benchmark.mjs index 7c791593a7d..4e702b2fd55 100644 --- a/config/scripts/mobile-file-ranking-benchmark.mjs +++ b/config/scripts/mobile-file-ranking-benchmark.mjs @@ -4,9 +4,9 @@ import path from 'node:path' import { performance } from 'node:perf_hooks' import { build } from 'esbuild' import { runProcessSync } from '@orca/process-host' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' -import { summarizeBenchmarkSamples } from './benchmark-sample-summary.mjs' -import { describeProcessFailure } from './process-failure-message.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' +import { summarizeBenchmarkSamples } from './performance/measurement/benchmark-sample-summary.mjs' +import { describeProcessFailure } from './tool-invocation/process-failure-message.mjs' const baseline = process.argv[2] if (!baseline) { diff --git a/config/scripts/mobile-history-scope-paths-benchmark.mjs b/config/scripts/mobile-history-scope-paths-benchmark.mjs index dda318223f2..7679d141fcf 100644 --- a/config/scripts/mobile-history-scope-paths-benchmark.mjs +++ b/config/scripts/mobile-history-scope-paths-benchmark.mjs @@ -4,7 +4,7 @@ import { readFileSync } from 'node:fs' import { dirname, resolve } from 'node:path' import { performance } from 'node:perf_hooks' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' const baseline = process.argv[2] if (!baseline) { diff --git a/config/scripts/mobile-linear-group-sorted-benchmark.mjs b/config/scripts/mobile-linear-group-sorted-benchmark.mjs index 529515a99ae..8b65eac9cd5 100644 --- a/config/scripts/mobile-linear-group-sorted-benchmark.mjs +++ b/config/scripts/mobile-linear-group-sorted-benchmark.mjs @@ -4,7 +4,7 @@ import { readFileSync } from 'node:fs' import { dirname, resolve } from 'node:path' import { performance } from 'node:perf_hooks' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' const baseline = process.argv[2] if (!baseline) { diff --git a/config/scripts/mobile-linear-sort-benchmark.mjs b/config/scripts/mobile-linear-sort-benchmark.mjs index 1a2a2d29ad6..4a3529161df 100644 --- a/config/scripts/mobile-linear-sort-benchmark.mjs +++ b/config/scripts/mobile-linear-sort-benchmark.mjs @@ -4,7 +4,7 @@ import { readFileSync } from 'node:fs' import { dirname, resolve } from 'node:path' import { performance } from 'node:perf_hooks' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' const baseline = process.argv[2] if (!baseline) { diff --git a/config/scripts/mobile-log-revisions-benchmark.mjs b/config/scripts/mobile-log-revisions-benchmark.mjs index aa42094fee6..84129dfab63 100644 --- a/config/scripts/mobile-log-revisions-benchmark.mjs +++ b/config/scripts/mobile-log-revisions-benchmark.mjs @@ -4,7 +4,7 @@ import { readFileSync } from 'node:fs' import { dirname, resolve } from 'node:path' import { performance } from 'node:perf_hooks' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' const baseline = process.argv[2] ?? '20ab9950654' const file = 'mobile/src/transport/connection-log-buffer.ts' diff --git a/config/scripts/mobile-release-check-scope.mjs b/config/scripts/mobile-release-check-scope.mjs index 26ad963540b..ba5b64286de 100644 --- a/config/scripts/mobile-release-check-scope.mjs +++ b/config/scripts/mobile-release-check-scope.mjs @@ -1,6 +1,6 @@ import { appendFileSync, readFileSync } from 'node:fs' import { pathToFileURL } from 'node:url' -import { isDocsOnlyPath } from './pr-code-change-scope.mjs' +import { isDocsOnlyPath } from './workflow/source-routing/pr-code-change-scope.mjs' const APPLICATION_PREFIXES = ['src/', 'mobile/app/', 'mobile/src/'] // The root lockfile triggers Mobile Checks for its tests and typechecks; the Ruby release checks diff --git a/config/scripts/mobile-release-check-scope.test.mjs b/config/scripts/mobile-release-check-scope.test.mjs index cbd6b595d32..e70a9788929 100644 --- a/config/scripts/mobile-release-check-scope.test.mjs +++ b/config/scripts/mobile-release-check-scope.test.mjs @@ -91,13 +91,15 @@ function fixture(detectorStep = detector) { mkdirSync(join(directory, 'config/scripts'), { recursive: true }) for (const file of [ 'package.json', - 'config/scripts/pr-code-change-scope.mjs', - 'config/scripts/pr-package-test-paths.mjs', - 'config/scripts/pr-layout-oracle-route.mjs', - 'config/scripts/pr-shell-contract-prefixes.mjs', + 'config/scripts/workflow/source-routing/pr-code-change-scope.mjs', + 'config/scripts/workflow/source-routing/pr-package-test-paths.mjs', + 'config/scripts/workflow/source-routing/pr-layout-oracle-route.mjs', + 'config/scripts/workflow/source-routing/pr-shell-contract-prefixes.mjs', + 'config/scripts/workflow/source-routing/pr-xterm-patch-prefixes.mjs', 'config/scripts/mobile-release-check-scope.mjs', 'config/scripts/mobile-test-change-scope.mjs' ]) { + mkdirSync(dirname(join(directory, file)), { recursive: true }) copyFileSync(join(root, file), join(directory, file)) } const commit = () => { diff --git a/config/scripts/mobile-source-control-collation-benchmark.mjs b/config/scripts/mobile-source-control-collation-benchmark.mjs index e48d7dbfb0f..952eed45675 100644 --- a/config/scripts/mobile-source-control-collation-benchmark.mjs +++ b/config/scripts/mobile-source-control-collation-benchmark.mjs @@ -4,7 +4,7 @@ import { readFileSync } from 'node:fs' import { dirname, resolve } from 'node:path' import { performance } from 'node:perf_hooks' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' const baseline = process.argv[2] if (!baseline) { diff --git a/config/scripts/mobile-task-sort-benchmark.mjs b/config/scripts/mobile-task-sort-benchmark.mjs index b7d6cb469a3..0e99870aeb7 100644 --- a/config/scripts/mobile-task-sort-benchmark.mjs +++ b/config/scripts/mobile-task-sort-benchmark.mjs @@ -4,7 +4,7 @@ import { readFileSync } from 'node:fs' import { dirname, resolve } from 'node:path' import { performance } from 'node:perf_hooks' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' const baseline = process.argv[2] if (!baseline) { diff --git a/config/scripts/mobile-test-change-scope.mjs b/config/scripts/mobile-test-change-scope.mjs index 69c92417db3..a1df3012d52 100644 --- a/config/scripts/mobile-test-change-scope.mjs +++ b/config/scripts/mobile-test-change-scope.mjs @@ -1,17 +1,17 @@ import { appendFileSync, readFileSync } from 'node:fs' import { pathToFileURL } from 'node:url' -import { isDocsOnlyPath } from './pr-code-change-scope.mjs' +import { isDocsOnlyPath } from './workflow/source-routing/pr-code-change-scope.mjs' const NON_TEST_FILES = new Set([ 'mobile/Gemfile', 'mobile/Gemfile.lock', 'mobile/README.md', '.github/workflows/mobile-ios-release.yml', - 'config/scripts/pr-code-change-scope.mjs', - 'config/scripts/pr-package-test-paths.mjs', - 'config/scripts/pr-code-change-scope.test.mjs', - 'config/scripts/pr-layout-oracle-route.mjs', - 'config/scripts/pr-shell-contract-prefixes.mjs', + 'config/scripts/workflow/source-routing/pr-code-change-scope.mjs', + 'config/scripts/workflow/source-routing/pr-package-test-paths.mjs', + 'config/scripts/workflow/source-routing/pr-code-change-scope.test.mjs', + 'config/scripts/workflow/source-routing/pr-layout-oracle-route.mjs', + 'config/scripts/workflow/source-routing/pr-shell-contract-prefixes.mjs', 'config/scripts/mobile-release-check-scope.mjs', 'config/scripts/mobile-release-check-scope.test.mjs' ]) diff --git a/config/scripts/mobile-web-app/mobile-web-app-agent-history-render.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-agent-history-render.test.mjs index d6b6cc43c0a..1d849e428f3 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-agent-history-render.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-agent-history-render.test.mjs @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { chromium } from 'playwright-core' -import { buildMobileWebAppBundle } from '../build-mobile-web-app-bundle.mjs' +import { buildMobileWebAppBundle } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { createBundleServer, diff --git a/config/scripts/mobile-web-app/mobile-web-app-agent-icon-render.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-agent-icon-render.test.mjs index c2885cebe1b..6792ca281a8 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-agent-icon-render.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-agent-icon-render.test.mjs @@ -4,7 +4,7 @@ import { join } from 'node:path' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { chromium } from 'playwright-core' import pngjs from 'pngjs' -import { buildMobileWebAppBundle } from '../build-mobile-web-app-bundle.mjs' +import { buildMobileWebAppBundle } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { createBundleServer, diff --git a/config/scripts/mobile-web-app/mobile-web-app-browser-pane-render.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-browser-pane-render.test.mjs index a5ddd86599b..cce96ea20fc 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-browser-pane-render.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-browser-pane-render.test.mjs @@ -6,7 +6,7 @@ import { join } from 'node:path' import { fileURLToPath } from 'node:url' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { chromium } from 'playwright-core' -import { buildMobileWebAppBundle } from '../build-mobile-web-app-bundle.mjs' +import { buildMobileWebAppBundle } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { MOBILE_WEB_APP_ROUTE_ROOT } from './mobile-web-app-route-manifest.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { diff --git a/config/scripts/mobile-web-app/mobile-web-app-bundle-test-fixture.mjs b/config/scripts/mobile-web-app/mobile-web-app-bundle-test-fixture.mjs index 0abcaeb27bf..1521aa453c8 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-bundle-test-fixture.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-bundle-test-fixture.mjs @@ -2,7 +2,10 @@ import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises' import { tmpdir } from 'node:os' import { dirname, join } from 'node:path' import { deserialize, serialize } from 'node:v8' -import { bundleMobileWebApp, buildMobileWebAppBundle } from '../build-mobile-web-app-bundle.mjs' +import { + bundleMobileWebApp, + buildMobileWebAppBundle +} from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' export async function withScratch(run) { const scratch = await mkdtemp(join(tmpdir(), 'orca-mobile-web-app-test-')) diff --git a/config/scripts/mobile-web-app/mobile-web-app-clipboard-image-resize-render.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-clipboard-image-resize-render.test.mjs index 5d2aed8896e..c2d2f5f50da 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-clipboard-image-resize-render.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-clipboard-image-resize-render.test.mjs @@ -6,7 +6,7 @@ import { fileURLToPath } from 'node:url' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import * as esbuild from 'esbuild' import { chromium } from 'playwright-core' -import { mobileWebAppBuildOptions } from '../build-mobile-web-app-bundle.mjs' +import { mobileWebAppBuildOptions } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { createBundleServer, diff --git a/config/scripts/mobile-web-app/mobile-web-app-composer-sizing-render.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-composer-sizing-render.test.mjs index e9c9efc69d7..07bc964b804 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-composer-sizing-render.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-composer-sizing-render.test.mjs @@ -8,7 +8,7 @@ import { MOBILE_WEB_APP_NATIVE_PARITY_STYLE, MOBILE_WEB_APP_ROOT_RESET, mobileWebAppBuildOptions -} from '../build-mobile-web-app-bundle.mjs' +} from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { createBundleServer, readShellCsp } from './preview/mobile-web-app-render-harness.mjs' diff --git a/config/scripts/mobile-web-app/mobile-web-app-drawer-render.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-drawer-render.test.mjs index 03c1ca9268f..0adb6dd526f 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-drawer-render.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-drawer-render.test.mjs @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { chromium, webkit } from 'playwright-core' -import { buildMobileWebAppBundle } from '../build-mobile-web-app-bundle.mjs' +import { buildMobileWebAppBundle } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { createBundleServer, diff --git a/config/scripts/mobile-web-app/mobile-web-app-files-external-links.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-files-external-links.test.mjs index d5177902ab4..618983736f6 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-files-external-links.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-files-external-links.test.mjs @@ -2,7 +2,7 @@ // Preview consumes it through Markdown; explorer grants it because in-document preview inherits opener’s grants, not merely because shared layout reaches the seam. import { fileURLToPath } from 'node:url' import { describe, expect, it } from 'vitest' -import { mobileWebAppRouteClosure } from '../build-mobile-web-app-bundle.mjs' +import { mobileWebAppRouteClosure } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { EXTERNAL_LINK_SEAM as SEAM, diff --git a/config/scripts/mobile-web-app/mobile-web-app-files-render.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-files-render.test.mjs index fe8f47489ff..d4b1f433473 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-files-render.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-files-render.test.mjs @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { chromium } from 'playwright-core' -import { buildMobileWebAppBundle } from '../build-mobile-web-app-bundle.mjs' +import { buildMobileWebAppBundle } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { createBundleServer, diff --git a/config/scripts/mobile-web-app/mobile-web-app-handoff-grants-render.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-handoff-grants-render.test.mjs index 1fa4ebb9811..382da4bc619 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-handoff-grants-render.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-handoff-grants-render.test.mjs @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { chromium } from 'playwright-core' -import { buildMobileWebAppBundle } from '../build-mobile-web-app-bundle.mjs' +import { buildMobileWebAppBundle } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { createBundleServer, diff --git a/config/scripts/mobile-web-app/mobile-web-app-held-press-render.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-held-press-render.test.mjs index 24eabb5638b..932a191ebed 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-held-press-render.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-held-press-render.test.mjs @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { chromium } from 'playwright-core' -import { buildMobileWebAppBundle } from '../build-mobile-web-app-bundle.mjs' +import { buildMobileWebAppBundle } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { BROWSER_VIEWPORT_ID, diff --git a/config/scripts/mobile-web-app/mobile-web-app-mermaid-render.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-mermaid-render.test.mjs index 4b20120ea76..53d1d294e51 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-mermaid-render.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-mermaid-render.test.mjs @@ -6,7 +6,7 @@ import { fileURLToPath } from 'node:url' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import * as esbuild from 'esbuild' import { chromium, webkit } from 'playwright-core' -import { lucideBarrelPlugin } from '../build-mobile-web-app-bundle.mjs' +import { lucideBarrelPlugin } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { createBundleServer, diff --git a/config/scripts/mobile-web-app/mobile-web-app-module-closure-entrypoints.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-module-closure-entrypoints.test.mjs index f27fe0838ce..cedd41fb8c0 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-module-closure-entrypoints.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-module-closure-entrypoints.test.mjs @@ -2,7 +2,7 @@ import { mkdtemp, mkdir, rm, writeFile } from 'node:fs/promises' import { tmpdir } from 'node:os' import { join } from 'node:path' import { expect, it } from 'vitest' -import { mobileWebAppModuleClosure } from '../build-mobile-web-app-bundle.mjs' +import { mobileWebAppModuleClosure } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' it('resolves local entry paths against the requested tree and selects browser siblings', async () => { const root = await mkdtemp(join(tmpdir(), 'orca-route-entrypoints-')) diff --git a/config/scripts/mobile-web-app/mobile-web-app-native-parity-render.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-native-parity-render.test.mjs index 83c39dc8302..fc6e1ee9b57 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-native-parity-render.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-native-parity-render.test.mjs @@ -10,7 +10,7 @@ import { MOBILE_WEB_APP_NATIVE_PARITY_STYLE, MOBILE_WEB_APP_ROOT_RESET, mobileWebAppBuildOptions -} from '../build-mobile-web-app-bundle.mjs' +} from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { createBundleServer, readShellCsp } from './preview/mobile-web-app-render-harness.mjs' diff --git a/config/scripts/mobile-web-app/mobile-web-app-page-closure-families.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-page-closure-families.test.mjs index 7429b631578..bfc809472c4 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-page-closure-families.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-page-closure-families.test.mjs @@ -5,7 +5,7 @@ import { describe, expect, it } from 'vitest' import { mobileWebAppModuleClosure, mobileWebAppRouteClosure -} from '../build-mobile-web-app-bundle.mjs' +} from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { pageClosureFamilies, pinnedFamilyNames } from './mobile-web-app-page-closure-families.mjs' diff --git a/config/scripts/mobile-web-app/mobile-web-app-page-grant-call-sites.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-page-grant-call-sites.test.mjs index b5cd20da103..7353aaeabe6 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-page-grant-call-sites.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-page-grant-call-sites.test.mjs @@ -4,13 +4,13 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { fileURLToPath } from 'node:url' import { describe, expect, it } from 'vitest' -import { mobileWebAppRouteClosure } from '../build-mobile-web-app-bundle.mjs' +import { mobileWebAppRouteClosure } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { PAGE_ROUTE_MODULES, pageRouteModulesCoverTheManifest } from './mobile-web-app-page-route-modules.mjs' -import { MOBILE_WEB_PAGE_ROUTES } from '../mobile-web-page-routes.mjs' +import { MOBILE_WEB_PAGE_ROUTES } from '../build/mobile-web-app/mobile-web-page-routes.mjs' import { PAGE_GRANT_CALL_SITES, createGrantCallSiteReader, diff --git a/config/scripts/mobile-web-app/mobile-web-app-push-subsystem-closure.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-push-subsystem-closure.test.mjs index f5ac796fea6..dd36194e37f 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-push-subsystem-closure.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-push-subsystem-closure.test.mjs @@ -2,7 +2,7 @@ import { join } from 'node:path' import { fileURLToPath } from 'node:url' import * as esbuild from 'esbuild' import { describe, expect, it } from 'vitest' -import { mobileWebAppBuildOptions } from '../build-mobile-web-app-bundle.mjs' +import { mobileWebAppBuildOptions } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { collectMobileWebAppRoutes } from './mobile-web-app-route-manifest.mjs' diff --git a/config/scripts/mobile-web-app/mobile-web-app-queued-messages-render.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-queued-messages-render.test.mjs index 45d79a84cf4..c1cd9ee85f3 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-queued-messages-render.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-queued-messages-render.test.mjs @@ -8,7 +8,7 @@ import { MOBILE_WEB_APP_NATIVE_PARITY_STYLE, MOBILE_WEB_APP_ROOT_RESET, mobileWebAppBuildOptions -} from '../build-mobile-web-app-bundle.mjs' +} from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { createBundleServer, readShellCsp } from './preview/mobile-web-app-render-harness.mjs' import { SUPPORTED_UI_LOCALES } from '../../../src/shared/ui-locale.ts' diff --git a/config/scripts/mobile-web-app/mobile-web-app-render.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-render.test.mjs index ee6d0665486..f9c225b3e72 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-render.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-render.test.mjs @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { chromium } from 'playwright-core' -import { buildMobileWebAppBundle } from '../build-mobile-web-app-bundle.mjs' +import { buildMobileWebAppBundle } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { createBundleServer, diff --git a/config/scripts/mobile-web-app/mobile-web-app-rich-markdown-render.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-rich-markdown-render.test.mjs index d2b7d2a83a0..e00fd316a7d 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-rich-markdown-render.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-rich-markdown-render.test.mjs @@ -12,7 +12,7 @@ import { MOBILE_WEB_APP_NATIVE_PARITY_STYLE, MOBILE_WEB_APP_ROOT_RESET, lucideBarrelPlugin -} from '../build-mobile-web-app-bundle.mjs' +} from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { themeSwitchTest } from './mobile-web-app-theme-switch.mjs' import { textInputFontSizeFloor } from './platform-seams/mobile-web-app-text-input-font-size-seam.mjs' diff --git a/config/scripts/mobile-web-app/mobile-web-app-route-chunk-closure.mjs b/config/scripts/mobile-web-app/mobile-web-app-route-chunk-closure.mjs index e704938be6a..6b9d0a17ed1 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-route-chunk-closure.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-route-chunk-closure.mjs @@ -1,7 +1,10 @@ import { basename, join, resolve } from 'node:path' import { fileURLToPath } from 'node:url' import * as esbuild from 'esbuild' -import { entryStaticClosure, mobileWebAppBuildOptions } from '../build-mobile-web-app-bundle.mjs' +import { + entryStaticClosure, + mobileWebAppBuildOptions +} from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { collectMobileWebAppRoutes } from './mobile-web-app-route-manifest.mjs' const mobileDir = fileURLToPath(new URL('../../../mobile', import.meta.url)) diff --git a/config/scripts/mobile-web-app/mobile-web-app-route-snapshot.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-route-snapshot.test.mjs index b69a2c62c03..71fef6282b6 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-route-snapshot.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-route-snapshot.test.mjs @@ -5,7 +5,7 @@ import { prepareRouteSnapshot, withPreparedRouteSnapshot, withRouteSnapshot -} from '../run-mobile-web-app-checks.mjs' +} from '../mobile-web/check-entry/run-mobile-web-app-checks.mjs' import { PAGE_ROUTE_MODULES } from './mobile-web-app-page-route-modules.mjs' const collect = async (entries) => ({ diff --git a/config/scripts/mobile-web-app/mobile-web-app-safe-area-render.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-safe-area-render.test.mjs index b41afdb8ac9..257ccfadda5 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-safe-area-render.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-safe-area-render.test.mjs @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { chromium } from 'playwright-core' -import { buildMobileWebAppBundle } from '../build-mobile-web-app-bundle.mjs' +import { buildMobileWebAppBundle } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { createBundleServer, diff --git a/config/scripts/mobile-web-app/mobile-web-app-screencast-lane-grant.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-screencast-lane-grant.test.mjs index fcc0a67e577..3058e0ddbb9 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-screencast-lane-grant.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-screencast-lane-grant.test.mjs @@ -5,13 +5,13 @@ import { readFileSync } from 'node:fs' import { join } from 'node:path' import { fileURLToPath } from 'node:url' import { describe, expect, it } from 'vitest' -import { mobileWebAppRouteClosure } from '../build-mobile-web-app-bundle.mjs' +import { mobileWebAppRouteClosure } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { PAGE_ROUTE_MODULES, pageRouteModulesCoverTheManifest } from './mobile-web-app-page-route-modules.mjs' -import { MOBILE_WEB_PAGE_ROUTES } from '../mobile-web-page-routes.mjs' +import { MOBILE_WEB_PAGE_ROUTES } from '../build/mobile-web-app/mobile-web-page-routes.mjs' const mobileDir = fileURLToPath(new URL('../../../mobile/', import.meta.url)) const describeClosure = mobileWebAppDependenciesPresent() ? describe : describe.skip diff --git a/config/scripts/mobile-web-app/mobile-web-app-session-dictation-capture.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-session-dictation-capture.test.mjs index c7c485d67ed..4f40f670c8e 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-session-dictation-capture.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-session-dictation-capture.test.mjs @@ -3,9 +3,9 @@ // Resolve package names before absence checks to catch typos; assert eight excluded vendored modules, not drifting total closure size. import { createRequire } from 'node:module' import { describe, expect, it } from 'vitest' -import { mobileWebAppRouteClosure } from '../build-mobile-web-app-bundle.mjs' +import { mobileWebAppRouteClosure } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' -import { MOBILE_WEB_PAGE_ROUTES } from '../mobile-web-page-routes.mjs' +import { MOBILE_WEB_PAGE_ROUTES } from '../build/mobile-web-app/mobile-web-page-routes.mjs' import { PAGE_ROUTE_MODULES } from './mobile-web-app-page-route-modules.mjs' import { MobileWebBundleRouteSchema } from '../../../src/shared/mobile-web-bundle/manifest-contract.ts' diff --git a/config/scripts/mobile-web-app/mobile-web-app-session-external-links.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-session-external-links.test.mjs index c26457111f3..8c145837d19 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-session-external-links.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-session-external-links.test.mjs @@ -2,7 +2,7 @@ // Terminal links and file/Markdown readers must open system browser without navigating artifact away. import { fileURLToPath } from 'node:url' import { describe, expect, it } from 'vitest' -import { mobileWebAppRouteClosure } from '../build-mobile-web-app-bundle.mjs' +import { mobileWebAppRouteClosure } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { EXTERNAL_LINK_SEAM as SEAM, diff --git a/config/scripts/mobile-web-app/mobile-web-app-session-media-picker.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-session-media-picker.test.mjs index 327f461eb0b..a44cb2fa1aa 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-session-media-picker.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-session-media-picker.test.mjs @@ -5,7 +5,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { fileURLToPath } from 'node:url' import { describe, expect, it } from 'vitest' -import { mobileWebAppRouteClosure } from '../build-mobile-web-app-bundle.mjs' +import { mobileWebAppRouteClosure } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { MEDIA_PICKER_SEAM as SEAM, diff --git a/config/scripts/mobile-web-app/mobile-web-app-session-render.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-session-render.test.mjs index 42a530a5229..6264ea6bffa 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-session-render.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-session-render.test.mjs @@ -3,9 +3,9 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { chromium } from 'playwright-core' -import { buildMobileWebAppBundle } from '../build-mobile-web-app-bundle.mjs' +import { buildMobileWebAppBundle } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' -import { MOBILE_WEB_PAGE_ROUTES } from '../mobile-web-page-routes.mjs' +import { MOBILE_WEB_PAGE_ROUTES } from '../build/mobile-web-app/mobile-web-page-routes.mjs' import { createBundleServer, installShellDouble, diff --git a/config/scripts/mobile-web-app/mobile-web-app-session-terminal-closure.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-session-terminal-closure.test.mjs index 442b9c3d04d..d0cf5126b02 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-session-terminal-closure.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-session-terminal-closure.test.mjs @@ -1,5 +1,5 @@ import { beforeAll, describe, expect, it } from 'vitest' -import { mobileWebAppRouteClosure } from '../build-mobile-web-app-bundle.mjs' +import { mobileWebAppRouteClosure } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { mobileWebAppRouteChunkClosure } from './mobile-web-app-route-chunk-closure.mjs' diff --git a/config/scripts/mobile-web-app/mobile-web-app-session-terminal-init.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-session-terminal-init.test.mjs index f32744cfae6..d4aa78b1d26 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-session-terminal-init.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-session-terminal-init.test.mjs @@ -3,9 +3,9 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { chromium } from 'playwright-core' -import { buildMobileWebAppBundle } from '../build-mobile-web-app-bundle.mjs' +import { buildMobileWebAppBundle } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' -import { MOBILE_WEB_PAGE_ROUTES } from '../mobile-web-page-routes.mjs' +import { MOBILE_WEB_PAGE_ROUTES } from '../build/mobile-web-app/mobile-web-page-routes.mjs' import { createBundleServer, installShellDouble, diff --git a/config/scripts/mobile-web-app/mobile-web-app-session-webview-consumers.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-session-webview-consumers.test.mjs index 2271f176793..f07bf1f1ca2 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-session-webview-consumers.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-session-webview-consumers.test.mjs @@ -1,6 +1,6 @@ /** Session routes resolve the named components to their web implementations. */ import { describe, expect, it } from 'vitest' -import { mobileWebAppRouteClosure } from '../build-mobile-web-app-bundle.mjs' +import { mobileWebAppRouteClosure } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' const describeClosure = mobileWebAppDependenciesPresent() ? describe : describe.skip diff --git a/config/scripts/mobile-web-app/mobile-web-app-source-control-external-links.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-source-control-external-links.test.mjs index d79a1167b32..cf3f039fdb1 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-source-control-external-links.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-source-control-external-links.test.mjs @@ -2,7 +2,7 @@ // Each route independently reaches PR sidebar’s check/permalink/Markdown openers; census also covers future callers. import { fileURLToPath } from 'node:url' import { describe, expect, it } from 'vitest' -import { mobileWebAppRouteClosure } from '../build-mobile-web-app-bundle.mjs' +import { mobileWebAppRouteClosure } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { EXTERNAL_LINK_SEAM as SEAM, diff --git a/config/scripts/mobile-web-app/mobile-web-app-source-control-keyboard.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-source-control-keyboard.test.mjs index 5001d863071..05793d737c6 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-source-control-keyboard.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-source-control-keyboard.test.mjs @@ -1,6 +1,6 @@ /** Source-control and review routes include the web keyboard seam. */ import { describe, expect, it } from 'vitest' -import { mobileWebAppRouteClosure } from '../build-mobile-web-app-bundle.mjs' +import { mobileWebAppRouteClosure } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' const describeClosure = mobileWebAppDependenciesPresent() ? describe : describe.skip diff --git a/config/scripts/mobile-web-app/mobile-web-app-source-control-render.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-source-control-render.test.mjs index 757515fc147..3c62b1c88c0 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-source-control-render.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-source-control-render.test.mjs @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { chromium } from 'playwright-core' -import { buildMobileWebAppBundle } from '../build-mobile-web-app-bundle.mjs' +import { buildMobileWebAppBundle } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { createBundleServer, diff --git a/config/scripts/mobile-web-app/mobile-web-app-source-control-text-inputs.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-source-control-text-inputs.test.mjs index b3e4d050c87..03cc8742925 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-source-control-text-inputs.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-source-control-text-inputs.test.mjs @@ -5,7 +5,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { fileURLToPath } from 'node:url' import { describe, expect, it } from 'vitest' -import { mobileWebAppRouteClosure } from '../build-mobile-web-app-bundle.mjs' +import { mobileWebAppRouteClosure } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { textInputFontSizeFloor, diff --git a/config/scripts/mobile-web-app/mobile-web-app-stack-transition-render.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-stack-transition-render.test.mjs index 3c49f916444..b1e07c8df3a 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-stack-transition-render.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-stack-transition-render.test.mjs @@ -4,7 +4,7 @@ import { join } from 'node:path' import { fileURLToPath } from 'node:url' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { chromium, webkit } from 'playwright-core' -import { buildMobileWebAppBundle } from '../build-mobile-web-app-bundle.mjs' +import { buildMobileWebAppBundle } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { MOBILE_WEB_APP_ROUTE_ROOT } from './mobile-web-app-route-manifest.mjs' import { diff --git a/config/scripts/mobile-web-app/mobile-web-app-tasks-external-links.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-tasks-external-links.test.mjs index 8e7e40722ea..84e2a67a7cd 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-tasks-external-links.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-tasks-external-links.test.mjs @@ -1,7 +1,7 @@ // Shells refuse RN-Web window.open while Linking reports success; require device external-link seam throughout tasks closure, including future callers. import { fileURLToPath } from 'node:url' import { describe, expect, it } from 'vitest' -import { mobileWebAppRouteClosure } from '../build-mobile-web-app-bundle.mjs' +import { mobileWebAppRouteClosure } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { EXTERNAL_LINK_SEAM as SEAM, diff --git a/config/scripts/mobile-web-app/mobile-web-app-tasks-render.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-tasks-render.test.mjs index 9c9470877bc..64d879f8262 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-tasks-render.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-tasks-render.test.mjs @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { chromium } from 'playwright-core' -import { buildMobileWebAppBundle } from '../build-mobile-web-app-bundle.mjs' +import { buildMobileWebAppBundle } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { createBundleServer, diff --git a/config/scripts/mobile-web-app/mobile-web-app-terminal-live-input-render.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-terminal-live-input-render.test.mjs index 8c01a278d52..3b104a96fb4 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-terminal-live-input-render.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-terminal-live-input-render.test.mjs @@ -4,7 +4,7 @@ import { join } from 'node:path' import { fileURLToPath } from 'node:url' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { chromium } from 'playwright-core' -import { buildMobileWebAppBundle } from '../build-mobile-web-app-bundle.mjs' +import { buildMobileWebAppBundle } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { LIVE_INPUT_FIELD_ID, diff --git a/config/scripts/mobile-web-app/mobile-web-app-terminal-render-fixture.mjs b/config/scripts/mobile-web-app/mobile-web-app-terminal-render-fixture.mjs index 7304816d693..8b15782ea4a 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-terminal-render-fixture.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-terminal-render-fixture.mjs @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { fileURLToPath } from 'node:url' import { chromium } from 'playwright-core' -import { buildMobileWebAppBundle } from '../build-mobile-web-app-bundle.mjs' +import { buildMobileWebAppBundle } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { MOBILE_WEB_APP_ROUTE_ROOT } from './mobile-web-app-route-manifest.mjs' import { COLS, diff --git a/config/scripts/mobile-web-app/mobile-web-app-working-spinner-render.test.mjs b/config/scripts/mobile-web-app/mobile-web-app-working-spinner-render.test.mjs index 886cd521efd..0510d0ef502 100644 --- a/config/scripts/mobile-web-app/mobile-web-app-working-spinner-render.test.mjs +++ b/config/scripts/mobile-web-app/mobile-web-app-working-spinner-render.test.mjs @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { chromium } from 'playwright-core' -import { buildMobileWebAppBundle } from '../build-mobile-web-app-bundle.mjs' +import { buildMobileWebAppBundle } from '../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app-bundle-dependencies.mjs' import { MOBILE_WEB_APP_ROUTE_ROOT } from './mobile-web-app-route-manifest.mjs' import { diff --git a/config/scripts/mobile-web-app/platform-seams/mobile-web-app-haptics-seam.test.mjs b/config/scripts/mobile-web-app/platform-seams/mobile-web-app-haptics-seam.test.mjs index bde8d0a31d5..b60edf9260d 100644 --- a/config/scripts/mobile-web-app/platform-seams/mobile-web-app-haptics-seam.test.mjs +++ b/config/scripts/mobile-web-app/platform-seams/mobile-web-app-haptics-seam.test.mjs @@ -4,8 +4,8 @@ import { readFileSync } from 'node:fs' import { join } from 'node:path' import { fileURLToPath } from 'node:url' import { describe, expect, it } from 'vitest' -import { mobileWebAppRouteClosure } from '../../build-mobile-web-app-bundle.mjs' -import { MOBILE_WEB_PAGE_ROUTES } from '../../mobile-web-page-routes.mjs' +import { mobileWebAppRouteClosure } from '../../build/mobile-web-app/build-mobile-web-app-bundle.mjs' +import { MOBILE_WEB_PAGE_ROUTES } from '../../build/mobile-web-app/mobile-web-page-routes.mjs' import { mobileWebAppDependenciesPresent } from '../mobile-web-app-bundle-dependencies.mjs' import { PAGE_ROUTE_MODULES, diff --git a/config/scripts/mobile-web-app/preview/mobile-web-app-html-file-preview-render.test.mjs b/config/scripts/mobile-web-app/preview/mobile-web-app-html-file-preview-render.test.mjs index 61cfc34f513..1ae5168c591 100644 --- a/config/scripts/mobile-web-app/preview/mobile-web-app-html-file-preview-render.test.mjs +++ b/config/scripts/mobile-web-app/preview/mobile-web-app-html-file-preview-render.test.mjs @@ -5,7 +5,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { chromium, webkit } from 'playwright-core' -import { buildMobileWebAppBundle } from '../../build-mobile-web-app-bundle.mjs' +import { buildMobileWebAppBundle } from '../../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from '../mobile-web-app-bundle-dependencies.mjs' import { createBundleServer, @@ -16,7 +16,7 @@ import { readShellDocumentHeaders } from './mobile-web-app-render-harness.mjs' import { probePreviewPixel } from './mobile-web-app-preview-frame-readings.mjs' -import { MOBILE_WEB_PAGE_ROUTES } from '../../mobile-web-page-routes.mjs' +import { MOBILE_WEB_PAGE_ROUTES } from '../../build/mobile-web-app/mobile-web-page-routes.mjs' const MARKER = 'ORCA_HTML_FILE_RENDERED' const PAINT_RGB = '0,128,255' diff --git a/config/scripts/mobile-web-app/preview/mobile-web-app-html-preview-render.test.mjs b/config/scripts/mobile-web-app/preview/mobile-web-app-html-preview-render.test.mjs index 7cbeabcd3fc..d9e886c61eb 100644 --- a/config/scripts/mobile-web-app/preview/mobile-web-app-html-preview-render.test.mjs +++ b/config/scripts/mobile-web-app/preview/mobile-web-app-html-preview-render.test.mjs @@ -8,7 +8,7 @@ import { fileURLToPath } from 'node:url' import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest' import * as esbuild from 'esbuild' import { chromium, webkit } from 'playwright-core' -import { lucideBarrelPlugin } from '../../build-mobile-web-app-bundle.mjs' +import { lucideBarrelPlugin } from '../../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from '../mobile-web-app-bundle-dependencies.mjs' import { createBundleServer, diff --git a/config/scripts/mobile-web-app/preview/mobile-web-app-media-preview-render.test.mjs b/config/scripts/mobile-web-app/preview/mobile-web-app-media-preview-render.test.mjs index 8d8d2591bb4..d213ec445f6 100644 --- a/config/scripts/mobile-web-app/preview/mobile-web-app-media-preview-render.test.mjs +++ b/config/scripts/mobile-web-app/preview/mobile-web-app-media-preview-render.test.mjs @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { chromium } from 'playwright-core' -import { buildMobileWebAppBundle } from '../../build-mobile-web-app-bundle.mjs' +import { buildMobileWebAppBundle } from '../../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from '../mobile-web-app-bundle-dependencies.mjs' import { createBundleServer, @@ -12,7 +12,7 @@ import { readBridgeProtocolVersion, readShellCsp } from './mobile-web-app-render-harness.mjs' -import { MOBILE_WEB_PAGE_ROUTES } from '../../mobile-web-page-routes.mjs' +import { MOBILE_WEB_PAGE_ROUTES } from '../../build/mobile-web-app/mobile-web-page-routes.mjs' // Two gray VP9 frames generated with ffmpeg, without audio or user content. const WEBM = diff --git a/config/scripts/mobile-web-app/preview/mobile-web-app-render-harness.mjs b/config/scripts/mobile-web-app/preview/mobile-web-app-render-harness.mjs index db0ef235c93..a62803190c1 100644 --- a/config/scripts/mobile-web-app/preview/mobile-web-app-render-harness.mjs +++ b/config/scripts/mobile-web-app/preview/mobile-web-app-render-harness.mjs @@ -1,7 +1,7 @@ import { createServer } from 'node:http' import { readFile } from 'node:fs/promises' import { extname, join } from 'node:path' -import { contentTypeForExtension } from '../../mobile-web-bundle-manifest.mjs' +import { contentTypeForExtension } from '../../build/mobile-web-app/mobile-web-bundle-manifest.mjs' import { fileURLToPath } from 'node:url' export const projectDir = fileURLToPath(new URL('../../../..', import.meta.url)) diff --git a/config/scripts/mobile-web-app/preview/mobile-web-app-svg-preview-render.test.mjs b/config/scripts/mobile-web-app/preview/mobile-web-app-svg-preview-render.test.mjs index eeb6fe5f664..6da67b7a770 100644 --- a/config/scripts/mobile-web-app/preview/mobile-web-app-svg-preview-render.test.mjs +++ b/config/scripts/mobile-web-app/preview/mobile-web-app-svg-preview-render.test.mjs @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { chromium } from 'playwright-core' -import { buildMobileWebAppBundle } from '../../build-mobile-web-app-bundle.mjs' +import { buildMobileWebAppBundle } from '../../build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from '../mobile-web-app-bundle-dependencies.mjs' import { createBundleServer, @@ -12,7 +12,7 @@ import { readBridgeProtocolVersion, readShellCsp } from './mobile-web-app-render-harness.mjs' -import { MOBILE_WEB_PAGE_ROUTES } from '../../mobile-web-page-routes.mjs' +import { MOBILE_WEB_PAGE_ROUTES } from '../../build/mobile-web-app/mobile-web-page-routes.mjs' // viewBox only: browsers size this 300 x 60 unless the viewer reads the drawing's own extent. const SVG = diff --git a/config/scripts/mobile-web-terminal-engine-closure.test.mjs b/config/scripts/mobile-web-terminal-engine-closure.test.mjs index cc01d446f57..48be858b4e0 100644 --- a/config/scripts/mobile-web-terminal-engine-closure.test.mjs +++ b/config/scripts/mobile-web-terminal-engine-closure.test.mjs @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { fileURLToPath } from 'node:url' import { describe, expect, it } from 'vitest' -import { mobileWebAppModuleClosure } from './build-mobile-web-app-bundle.mjs' +import { mobileWebAppModuleClosure } from './build/mobile-web-app/build-mobile-web-app-bundle.mjs' import { mobileWebAppDependenciesPresent } from './mobile-web-app/mobile-web-app-bundle-dependencies.mjs' // Page imports xterm directly; WebView’s ~612KiB engine IIFE is unusable/dead weight under shipped CSP. diff --git a/config/scripts/run-mobile-web-app-checks.mjs b/config/scripts/mobile-web/check-entry/run-mobile-web-app-checks.mjs similarity index 85% rename from config/scripts/run-mobile-web-app-checks.mjs rename to config/scripts/mobile-web/check-entry/run-mobile-web-app-checks.mjs index 5425ad99cba..252b0a34812 100644 --- a/config/scripts/run-mobile-web-app-checks.mjs +++ b/config/scripts/mobile-web/check-entry/run-mobile-web-app-checks.mjs @@ -3,19 +3,19 @@ import { tmpdir } from 'node:os' import { dirname, join } from 'node:path' import { pathToFileURL } from 'node:url' import { createRequire } from 'node:module' -import { mobileWebAppModuleClosure } from './build-mobile-web-app-bundle.mjs' -import { readRouteSnapshot } from './mobile-web-app/mobile-web-app-route-snapshot.mjs' -import { PAGE_ROUTE_MODULES } from './mobile-web-app/mobile-web-app-page-route-modules.mjs' +import { mobileWebAppModuleClosure } from '../../build/mobile-web-app/build-mobile-web-app-bundle.mjs' +import { readRouteSnapshot } from '../../mobile-web-app/mobile-web-app-route-snapshot.mjs' +import { PAGE_ROUTE_MODULES } from '../../mobile-web-app/mobile-web-app-page-route-modules.mjs' import { spawnProcess } from '@orca/process-host' -const require = createRequire(import.meta.url) +const require = createRequire(new URL('../../run-mobile-web-app-checks.mjs', import.meta.url)) const mobileWebCheckArgs = [ 'run', '--config', 'config/vitest.config.ts', 'config/scripts/mobile-web-app-', 'config/scripts/mobile-web-app/', - 'config/scripts/build-mobile-web-app-bundle.test.mjs' + 'config/scripts/build/mobile-web-app/build-mobile-web-app-bundle.test.mjs' ] export async function prepareRouteSnapshot(file, collect = mobileWebAppModuleClosure) { diff --git a/config/scripts/build-native-for-platform.mjs b/config/scripts/native-build/composition/build-native-for-platform.mjs similarity index 94% rename from config/scripts/build-native-for-platform.mjs rename to config/scripts/native-build/composition/build-native-for-platform.mjs index 15bf350f209..24611c31d0b 100755 --- a/config/scripts/build-native-for-platform.mjs +++ b/config/scripts/native-build/composition/build-native-for-platform.mjs @@ -1,16 +1,16 @@ #!/usr/bin/env node import { spawn, spawnSync } from 'node:child_process' -import { resolvePnpmCliInvocation } from './pnpm-cli-invocation.mjs' +import { resolvePnpmCliInvocation } from '../../tool-invocation/pnpm-cli-invocation.mjs' if (process.platform === 'win32') { - runNodeScript('config/scripts/build-windows-cli-launcher.mjs') - runNodeScript('config/scripts/build-windows-agent-hook.mjs') + runNodeScript('config/scripts/native-build/windows/build-windows-cli-launcher.mjs') + runNodeScript('config/scripts/native-build/windows/build-windows-agent-hook.mjs') process.exit(0) } if (process.platform === 'linux') { - runNodeScript('config/scripts/build-wayland-clipboard.mjs') + runNodeScript('config/scripts/native-build/linux/build-wayland-clipboard.mjs') process.exit(0) } diff --git a/config/scripts/build-native-for-platform.test.mjs b/config/scripts/native-build/composition/build-native-for-platform.test.mjs similarity index 96% rename from config/scripts/build-native-for-platform.test.mjs rename to config/scripts/native-build/composition/build-native-for-platform.test.mjs index d2a613a39f3..6a32620330c 100644 --- a/config/scripts/build-native-for-platform.test.mjs +++ b/config/scripts/native-build/composition/build-native-for-platform.test.mjs @@ -32,17 +32,25 @@ function startBuild(mode, options = {}) { const cli = join(directory, 'fake-pnpm.mjs') const journal = join(directory, 'events.jsonl') writeFileSync(journal, '') - mkdirSync(join(directory, 'config', 'scripts'), { recursive: true }) + mkdirSync(join(directory, 'config', 'scripts', 'native-build', 'windows'), { recursive: true }) + mkdirSync(join(directory, 'config', 'scripts', 'native-build', 'linux'), { recursive: true }) writeFileSync( - join(directory, 'config', 'scripts', 'build-windows-cli-launcher.mjs'), + join( + directory, + 'config', + 'scripts', + 'native-build', + 'windows', + 'build-windows-cli-launcher.mjs' + ), "console.log('windows launcher only')" ) writeFileSync( - join(directory, 'config', 'scripts', 'build-windows-agent-hook.mjs'), + join(directory, 'config', 'scripts', 'native-build', 'windows', 'build-windows-agent-hook.mjs'), "console.log('windows agent hook only')" ) writeFileSync( - join(directory, 'config', 'scripts', 'build-wayland-clipboard.mjs'), + join(directory, 'config', 'scripts', 'native-build', 'linux', 'build-wayland-clipboard.mjs'), "console.log('wayland clipboard only')" ) writeFileSync( diff --git a/config/scripts/build-wayland-clipboard.mjs b/config/scripts/native-build/linux/build-wayland-clipboard.mjs similarity index 96% rename from config/scripts/build-wayland-clipboard.mjs rename to config/scripts/native-build/linux/build-wayland-clipboard.mjs index b5ed2490c92..a1a68a17e08 100644 --- a/config/scripts/build-wayland-clipboard.mjs +++ b/config/scripts/native-build/linux/build-wayland-clipboard.mjs @@ -15,7 +15,7 @@ export function waylandClipboardFingerprint(root, arch) { 'native/wayland-clipboard/protocol_test.py', 'native/wayland-clipboard/x11_test.py', 'native/wayland-clipboard/Dockerfile', - 'config/scripts/build-wayland-clipboard.mjs' + 'config/scripts/native-build/linux/build-wayland-clipboard.mjs' ]) { hash.update('\0').update(readFileSync(join(root, file))) } @@ -24,7 +24,7 @@ export function waylandClipboardFingerprint(root, arch) { export function buildWaylandClipboard({ arch = process.arch, - root = resolve(import.meta.dirname, '../..'), + root = resolve(import.meta.dirname, '../../../..'), run = spawnSync } = {}) { if (arch !== 'x64' && arch !== 'arm64') { diff --git a/config/scripts/build-wayland-clipboard.test.mjs b/config/scripts/native-build/linux/build-wayland-clipboard.test.mjs similarity index 96% rename from config/scripts/build-wayland-clipboard.test.mjs rename to config/scripts/native-build/linux/build-wayland-clipboard.test.mjs index 32cd61fe877..222062491f8 100644 --- a/config/scripts/build-wayland-clipboard.test.mjs +++ b/config/scripts/native-build/linux/build-wayland-clipboard.test.mjs @@ -21,8 +21,8 @@ const require = createRequire(import.meta.url) const { ensureBundledWaylandClipboard, finalizePackagedWaylandClipboard -} = require('../wayland-clipboard-resources.cjs') -const config = require('../electron-builder.config.cjs') +} = require('../../../wayland-clipboard-resources.cjs') +const config = require('../../../electron-builder.config.cjs') const { copyFiles, FileMatcher } = require('app-builder-lib/out/fileMatcher') let root let verify @@ -50,7 +50,7 @@ beforeEach(() => { 'native/wayland-clipboard/protocol_test.py', 'native/wayland-clipboard/x11_test.py', 'native/wayland-clipboard/Dockerfile', - 'config/scripts/build-wayland-clipboard.mjs' + 'config/scripts/native-build/linux/build-wayland-clipboard.mjs' ]) { mkdirSync(dirname(join(root, file)), { recursive: true }) writeFileSync(join(root, file), file) @@ -207,7 +207,7 @@ describe('Wayland clipboard packaging', () => { }) ensureBundledWaylandClipboard(archEnum, root, run) expect(run.mock.calls[0][1]).toEqual([ - join(root, 'config', 'scripts', 'build-wayland-clipboard.mjs'), + join(root, 'config', 'scripts', 'native-build', 'linux', 'build-wayland-clipboard.mjs'), '--arch', arch ]) diff --git a/config/scripts/verify-linux-glibc-floor.cjs b/config/scripts/native-build/linux/verify-linux-glibc-floor.cjs similarity index 100% rename from config/scripts/verify-linux-glibc-floor.cjs rename to config/scripts/native-build/linux/verify-linux-glibc-floor.cjs diff --git a/config/scripts/verify-linux-glibc-floor.test.mjs b/config/scripts/native-build/linux/verify-linux-glibc-floor.test.mjs similarity index 100% rename from config/scripts/verify-linux-glibc-floor.test.mjs rename to config/scripts/native-build/linux/verify-linux-glibc-floor.test.mjs diff --git a/config/scripts/verify-linux-glibc-payloads.test.mjs b/config/scripts/native-build/linux/verify-linux-glibc-payloads.test.mjs similarity index 100% rename from config/scripts/verify-linux-glibc-payloads.test.mjs rename to config/scripts/native-build/linux/verify-linux-glibc-payloads.test.mjs diff --git a/config/scripts/build-computer-macos.mjs b/config/scripts/native-build/macos/build-computer-macos.mjs similarity index 98% rename from config/scripts/build-computer-macos.mjs rename to config/scripts/native-build/macos/build-computer-macos.mjs index c19e5adc6c3..e87d338c420 100644 --- a/config/scripts/build-computer-macos.mjs +++ b/config/scripts/native-build/macos/build-computer-macos.mjs @@ -2,7 +2,7 @@ import { spawnSync } from 'node:child_process' import { chmodSync, copyFileSync, mkdirSync, rmSync, writeFileSync } from 'node:fs' import path from 'node:path' -const repoRoot = path.resolve(import.meta.dirname, '../..') +const repoRoot = path.resolve(import.meta.dirname, '../../../..') const packagePath = path.join(repoRoot, 'native', 'computer-use-macos') const binaryPath = path.join(packagePath, '.build', 'release', 'orca-computer-use-macos') const appPath = path.join(packagePath, '.build', 'release', 'Orca Computer Use.app') diff --git a/config/scripts/build-keyboard-layout-macos.mjs b/config/scripts/native-build/macos/build-keyboard-layout-macos.mjs similarity index 100% rename from config/scripts/build-keyboard-layout-macos.mjs rename to config/scripts/native-build/macos/build-keyboard-layout-macos.mjs diff --git a/config/scripts/build-notification-status-macos.mjs b/config/scripts/native-build/macos/build-notification-status-macos.mjs similarity index 97% rename from config/scripts/build-notification-status-macos.mjs rename to config/scripts/native-build/macos/build-notification-status-macos.mjs index 8aaad38e903..3ee0e4503a4 100644 --- a/config/scripts/build-notification-status-macos.mjs +++ b/config/scripts/native-build/macos/build-notification-status-macos.mjs @@ -5,7 +5,7 @@ import { mkdirSync, rmSync, writeFileSync } from 'node:fs' import { tmpdir } from 'node:os' import path from 'node:path' -const repoRoot = path.resolve(import.meta.dirname, '../..') +const repoRoot = path.resolve(import.meta.dirname, '../../../..') const sourcePath = path.join(repoRoot, 'native', 'notification-status-macos', 'main.swift') const defaultOutputPath = path.join( repoRoot, diff --git a/config/scripts/build-process-footprint-macos.mjs b/config/scripts/native-build/macos/build-process-footprint-macos.mjs similarity index 100% rename from config/scripts/build-process-footprint-macos.mjs rename to config/scripts/native-build/macos/build-process-footprint-macos.mjs diff --git a/config/scripts/swift-cli-helper-macos.mjs b/config/scripts/native-build/macos/swift-cli-helper-macos.mjs similarity index 97% rename from config/scripts/swift-cli-helper-macos.mjs rename to config/scripts/native-build/macos/swift-cli-helper-macos.mjs index 3ca6742c9ed..2479620b73e 100644 --- a/config/scripts/swift-cli-helper-macos.mjs +++ b/config/scripts/native-build/macos/swift-cli-helper-macos.mjs @@ -3,7 +3,7 @@ import { chmodSync, mkdirSync, mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import path from 'node:path' -const repoRoot = path.resolve(import.meta.dirname, '../..') +const repoRoot = path.resolve(import.meta.dirname, '../../../..') /** Builds a single-file Swift CLI helper from native/<nativeDir>/main.swift (universal unless --single-arch). */ export function buildSwiftCliHelper({ nativeDir, executable, argv }) { diff --git a/config/scripts/ensure-native-runtime-job-ownership.test.mjs b/config/scripts/native-build/node-addons/ensure-native-runtime-job-ownership.test.mjs similarity index 98% rename from config/scripts/ensure-native-runtime-job-ownership.test.mjs rename to config/scripts/native-build/node-addons/ensure-native-runtime-job-ownership.test.mjs index f3c35bf848a..ef6fad9c15d 100644 --- a/config/scripts/ensure-native-runtime-job-ownership.test.mjs +++ b/config/scripts/native-build/node-addons/ensure-native-runtime-job-ownership.test.mjs @@ -3,7 +3,7 @@ import { createRequire } from 'node:module' import { tmpdir } from 'node:os' import { dirname, join } from 'node:path' import { describe, expect, it, vi } from 'vitest' -import { peImage } from './windows-pe-image-fixture.mjs' +import { peImage } from '../windows/windows-pe-image-fixture.mjs' const require = createRequire(import.meta.url) const { @@ -14,7 +14,7 @@ const { assertRebuiltConptyDeniesMsysBreakaway } = require('./node-pty-job-ownership.cjs') const NODE_PTY_PATCH = readFileSync( - new URL('../patches/node-pty@1.1.0.patch', import.meta.url), + new URL('../../../patches/node-pty@1.1.0.patch', import.meta.url), 'utf8' ) diff --git a/config/scripts/ensure-native-runtime.mjs b/config/scripts/native-build/node-addons/ensure-native-runtime.mjs similarity index 96% rename from config/scripts/ensure-native-runtime.mjs rename to config/scripts/native-build/node-addons/ensure-native-runtime.mjs index 59922b1156c..6d014a81f7b 100644 --- a/config/scripts/ensure-native-runtime.mjs +++ b/config/scripts/native-build/node-addons/ensure-native-runtime.mjs @@ -11,9 +11,9 @@ import { nodeGypRebuildTimeoutMs, stageWindowsProcessTreeNodeAddonApiHeaders, windowsProcessTreeAddonPath -} from './windows-process-tree-gyp-rebuild.mjs' +} from '../windows/windows-process-tree-gyp-rebuild.mjs' import { runProcessSync } from '@orca/process-host' -import { describeProcessFailure } from './process-failure-message.mjs' +import { describeProcessFailure } from '../../tool-invocation/process-failure-message.mjs' import { isSharedNativePackage, isSourceBuildDir, @@ -29,9 +29,11 @@ import { const require = createRequire(import.meta.url) const { assertNodePtyJobOwnership, nodePtyAddonPath } = require('./node-pty-job-ownership.cjs') -const { assertWindowsProcessTreeCreationTime } = require('./windows-process-tree-creation-time.cjs') +const { + assertWindowsProcessTreeCreationTime +} = require('../windows/windows-process-tree-creation-time.cjs') const scriptPath = import.meta.filename -const projectDir = resolve(import.meta.dirname, '../..') +const projectDir = resolve(import.meta.dirname, '../../../..') const runtime = readRuntimeArg() // Why: `pnpm rebuild:node` must rebuild even a loadable node-pty; a shared slot still reuses its usable entry. const forceRebuild = process.argv.includes('--force') @@ -61,7 +63,9 @@ if (runtime === 'node') { } else if (runtime === 'electron') { ensureElectronRuntime() } else { - console.error('Usage: node config/scripts/ensure-native-runtime.mjs --runtime=node|electron') + console.error( + 'Usage: node config/scripts/native-build/node-addons/ensure-native-runtime.mjs --runtime=node|electron' + ) process.exit(2) } @@ -141,7 +145,7 @@ function ensureElectronRuntime() { ) printCheckError(initial) } - runNodeScript(['config/scripts/rebuild-native-deps.mjs']) + runNodeScript(['config/scripts/native-build/node-addons/rebuild-native-deps.mjs']) const final = runElectronCheck() if (!final.ok) { diff --git a/config/scripts/ensure-native-runtime.test.mjs b/config/scripts/native-build/node-addons/ensure-native-runtime.test.mjs similarity index 90% rename from config/scripts/ensure-native-runtime.test.mjs rename to config/scripts/native-build/node-addons/ensure-native-runtime.test.mjs index 6f2ef63f1e3..f8b2ca3d8db 100644 --- a/config/scripts/ensure-native-runtime.test.mjs +++ b/config/scripts/native-build/node-addons/ensure-native-runtime.test.mjs @@ -15,20 +15,20 @@ import { fileURLToPath, pathToFileURL } from 'node:url' import { describe, expect, it } from 'vitest' import { runProcessSync } from '@orca/process-host' import { DEFAULT_MAX_OUTPUT_BYTES } from '@orca/process-host/process-spec' -import { resolveCliCommand } from '../../src/shared/node-cli-command-resolution.ts' -import { removeTreeSync } from '../../src/shared/windows-transient-lock-removal.ts' -import { resolvePnpmCliInvocation } from './pnpm-cli-invocation.mjs' -import { copyScriptWithLocalModules } from './script-module-dependencies.mjs' +import { resolveCliCommand } from '../../../../src/shared/node-cli-command-resolution.ts' +import { removeTreeSync } from '../../../../src/shared/windows-transient-lock-removal.ts' +import { resolvePnpmCliInvocation } from '../../tool-invocation/pnpm-cli-invocation.mjs' +import { copyScriptWithLocalModules } from '../../test-fixtures/script-copy-closure/script-module-dependencies.mjs' import { nodeGypRebuildInvocation, nodeGypRebuildTimeoutMs -} from './windows-process-tree-gyp-rebuild.mjs' +} from '../windows/windows-process-tree-gyp-rebuild.mjs' const sourceScriptPath = fileURLToPath(new URL('./ensure-native-runtime.mjs', import.meta.url)) // Fixture import walk misses createRequire CJS edges; name siblings explicitly or temp project cannot load. const REQUIRED_CJS_SIBLINGS = [ 'node-pty-job-ownership.cjs', - 'windows-process-tree-creation-time.cjs' + '../windows/windows-process-tree-creation-time.cjs' ] describe('ensure-native-runtime', () => { @@ -36,7 +36,14 @@ describe('ensure-native-runtime', () => { const projectDir = mkTempProject() try { - const scriptPath = join(projectDir, 'config', 'scripts', 'ensure-native-runtime.mjs') + const scriptPath = join( + projectDir, + 'config', + 'scripts', + 'native-build', + 'node-addons', + 'ensure-native-runtime.mjs' + ) const logPath = join(projectDir, 'native-runtime.log') const markerPath = join(projectDir, 'rebuilt.marker') writeFakeNativeModules(projectDir) @@ -87,7 +94,14 @@ describe('ensure-native-runtime', () => { const projectDir = mkTempProject() try { - const scriptPath = join(projectDir, 'config', 'scripts', 'ensure-native-runtime.mjs') + const scriptPath = join( + projectDir, + 'config', + 'scripts', + 'native-build', + 'node-addons', + 'ensure-native-runtime.mjs' + ) const logPath = join(projectDir, 'native-runtime.log') const markerPath = join(projectDir, 'rebuilt.marker') writeFakeNativeModules(projectDir, { windowsRegistryRequiresMarker: true }) @@ -126,7 +140,14 @@ describe('ensure-native-runtime', () => { const projectDir = mkTempProject() try { - const scriptPath = join(projectDir, 'config', 'scripts', 'ensure-native-runtime.mjs') + const scriptPath = join( + projectDir, + 'config', + 'scripts', + 'native-build', + 'node-addons', + 'ensure-native-runtime.mjs' + ) const logPath = join(projectDir, 'native-runtime.log') const markerPath = join(projectDir, 'rebuilt.marker') writeLoadableNativeModules(projectDir) @@ -159,7 +180,14 @@ describe('ensure-native-runtime', () => { const projectDir = mkTempProject() try { - const scriptPath = join(projectDir, 'config', 'scripts', 'ensure-native-runtime.mjs') + const scriptPath = join( + projectDir, + 'config', + 'scripts', + 'native-build', + 'node-addons', + 'ensure-native-runtime.mjs' + ) const logPath = join(projectDir, 'native-runtime.log') const markerPath = join(projectDir, 'rebuilt.marker') writeLoadableNativeModules(projectDir) @@ -191,7 +219,14 @@ describe('ensure-native-runtime', () => { const projectDir = mkTempProject() try { - const scriptPath = join(projectDir, 'config', 'scripts', 'ensure-native-runtime.mjs') + const scriptPath = join( + projectDir, + 'config', + 'scripts', + 'native-build', + 'node-addons', + 'ensure-native-runtime.mjs' + ) const logPath = join(projectDir, 'native-runtime.log') const markerPath = join(projectDir, 'rebuilt.marker') writeLoadableNativeModules(projectDir, { nativeDir: '../build/Release/' }) @@ -260,7 +295,10 @@ describe('ensure-native-runtime', () => { `${installedInvocation.stdout}\n${installedInvocation.stderr}` ).toBe(0) const manifest = JSON.parse( - readFileSync(new URL('../../node_modules/node-gyp/package.json', import.meta.url), 'utf8') + readFileSync( + new URL('../../../../node_modules/node-gyp/package.json', import.meta.url), + 'utf8' + ) ) expect(installedInvocation.stdout.trim()).toBe(`v${manifest.version}`) expect(existsSync(join(addonDir, 'pnpm-lock.yaml'))).toBe(false) @@ -273,7 +311,10 @@ describe('ensure-native-runtime', () => { function mkTempProject() { const projectDir = mkdtempSync(join(tmpdir(), 'orca-native-runtime-')) // Copy walked windows-process-tree-gyp-rebuild dependency or every case fails before its intended check. - copyScriptWithLocalModules(sourceScriptPath, join(projectDir, 'config', 'scripts')) + copyScriptWithLocalModules( + sourceScriptPath, + join(projectDir, 'config', 'scripts', 'native-build', 'node-addons') + ) const processPackage = join(projectDir, 'node_modules', '@orca', 'process-host') mkdirSync(processPackage, { recursive: true }) writeFileSync( @@ -293,7 +334,7 @@ export function runProcessSync(options) { for (const name of REQUIRED_CJS_SIBLINGS) { copyFileSync( fileURLToPath(new URL(`./${name}`, import.meta.url)), - join(projectDir, 'config', 'scripts', name) + join(projectDir, 'config', 'scripts', 'native-build', 'node-addons', name) ) } return projectDir diff --git a/config/scripts/native-build-entry-probe.cjs b/config/scripts/native-build/node-addons/native-build-entry-probe.cjs similarity index 93% rename from config/scripts/native-build-entry-probe.cjs rename to config/scripts/native-build/node-addons/native-build-entry-probe.cjs index a0e8b9da8bf..12cd357f5a0 100644 --- a/config/scripts/native-build-entry-probe.cjs +++ b/config/scripts/native-build/node-addons/native-build-entry-probe.cjs @@ -5,7 +5,9 @@ const { accessSync, constants, existsSync } = require('node:fs') const { join } = require('node:path') const { assertNodePtyJobOwnership } = require('./node-pty-job-ownership.cjs') -const { assertWindowsProcessTreeCreationTime } = require('./windows-process-tree-creation-time.cjs') +const { + assertWindowsProcessTreeCreationTime +} = require('../windows/windows-process-tree-creation-time.cjs') const { nodePtyNativeModuleName } = require('./native-build-entry.cjs') const NODE_PTY_CONPTY_RUNTIME_FILES = ['conpty.dll', 'OpenConsole.exe'] diff --git a/config/scripts/native-build-entry.cjs b/config/scripts/native-build/node-addons/native-build-entry.cjs similarity index 100% rename from config/scripts/native-build-entry.cjs rename to config/scripts/native-build/node-addons/native-build-entry.cjs diff --git a/config/scripts/native-build-entry.test.mjs b/config/scripts/native-build/node-addons/native-build-entry.test.mjs similarity index 97% rename from config/scripts/native-build-entry.test.mjs rename to config/scripts/native-build/node-addons/native-build-entry.test.mjs index a8a74148813..b48a24334f1 100644 --- a/config/scripts/native-build-entry.test.mjs +++ b/config/scripts/native-build/node-addons/native-build-entry.test.mjs @@ -13,9 +13,9 @@ const { nativeBuildEntryName, nodePtyNativeModuleName } = require('./native-build-entry.cjs') -const { adoptPackagedNativeBuildEntries } = require('../packaged-native-build-entries.cjs') +const { adoptPackagedNativeBuildEntries } = require('../../../packaged-native-build-entries.cjs') -const PATCHES = path.join(import.meta.dirname, '..', 'patches') +const PATCHES = path.join(import.meta.dirname, '../../..', 'patches') const roots = [] afterEach(() => { diff --git a/config/scripts/native-dependency-lock-digest.mjs b/config/scripts/native-build/node-addons/native-dependency-lock-digest.mjs similarity index 98% rename from config/scripts/native-dependency-lock-digest.mjs rename to config/scripts/native-build/node-addons/native-dependency-lock-digest.mjs index 102996ebd5b..c1c8c725cbd 100644 --- a/config/scripts/native-dependency-lock-digest.mjs +++ b/config/scripts/native-build/node-addons/native-dependency-lock-digest.mjs @@ -121,7 +121,7 @@ export function nativeWorkspaceSettings(contents, closure) { } export function nativeDependencyLockDigest({ - repository = resolve(import.meta.dirname, '../..'), + repository = resolve(import.meta.dirname, '../../../..'), ...selection }) { const closure = nativeDependencyClosure( diff --git a/config/scripts/native-dependency-lock-digest.test.mjs b/config/scripts/native-build/node-addons/native-dependency-lock-digest.test.mjs similarity index 100% rename from config/scripts/native-dependency-lock-digest.test.mjs rename to config/scripts/native-build/node-addons/native-dependency-lock-digest.test.mjs diff --git a/config/scripts/node-pty-job-ownership.cjs b/config/scripts/native-build/node-addons/node-pty-job-ownership.cjs similarity index 98% rename from config/scripts/node-pty-job-ownership.cjs rename to config/scripts/native-build/node-addons/node-pty-job-ownership.cjs index 38fb8f85074..99df30b7b65 100644 --- a/config/scripts/node-pty-job-ownership.cjs +++ b/config/scripts/native-build/node-addons/node-pty-job-ownership.cjs @@ -2,7 +2,11 @@ const { existsSync, readFileSync } = require('node:fs') const { dirname, join, resolve } = require('node:path') -const { PE_MACHINE, describePeMachine, readPeMachine } = require('./windows-pe-machine.cjs') +const { + PE_MACHINE, + describePeMachine, + readPeMachine +} = require('../windows/windows-pe-machine.cjs') const NODE_PTY_JOB_EXPORTS = [ 'listJobProcessIds', diff --git a/config/scripts/rebuild-native-deps-node-pty.test.mjs b/config/scripts/native-build/node-addons/rebuild-native-deps-node-pty.test.mjs similarity index 99% rename from config/scripts/rebuild-native-deps-node-pty.test.mjs rename to config/scripts/native-build/node-addons/rebuild-native-deps-node-pty.test.mjs index 0ff9b6882bf..064efe3abcf 100644 --- a/config/scripts/rebuild-native-deps-node-pty.test.mjs +++ b/config/scripts/native-build/node-addons/rebuild-native-deps-node-pty.test.mjs @@ -1,5 +1,5 @@ import { existsSync, readFileSync } from 'node:fs' -import { removeTreeSync } from '../../src/shared/windows-transient-lock-removal.ts' +import { removeTreeSync } from '../../../../src/shared/windows-transient-lock-removal.ts' import { join } from 'node:path' import { describe, expect, it } from 'vitest' diff --git a/config/scripts/rebuild-native-deps-test-fixtures.mjs b/config/scripts/native-build/node-addons/rebuild-native-deps-test-fixtures.mjs similarity index 91% rename from config/scripts/rebuild-native-deps-test-fixtures.mjs rename to config/scripts/native-build/node-addons/rebuild-native-deps-test-fixtures.mjs index 85fb2ca3e88..77fac122996 100644 --- a/config/scripts/rebuild-native-deps-test-fixtures.mjs +++ b/config/scripts/native-build/node-addons/rebuild-native-deps-test-fixtures.mjs @@ -11,32 +11,35 @@ import { createRequire } from 'node:module' import { tmpdir } from 'node:os' import { join, resolve } from 'node:path' import { fileURLToPath } from 'node:url' -import { copyScriptWithLocalModules } from './script-module-dependencies.mjs' -import { peImage } from './windows-pe-image-fixture.mjs' +import { copyScriptWithLocalModules } from '../../test-fixtures/script-copy-closure/script-module-dependencies.mjs' +import { peImage } from '../windows/windows-pe-image-fixture.mjs' // Use the gate's UTF-16 literal so fixtures distinguish pre-denial addons. const { CYGWIN_BREAKAWAY_MARKER, CYGWIN_BREAKAWAY_MARKER_TEXT, NATIVE_HOST_JOB_MARKER } = createRequire(import.meta.url)('./node-pty-job-ownership.cjs') const { CREATION_TIME_FLAG } = createRequire(import.meta.url)( - './windows-process-tree-creation-time.cjs' + '../windows/windows-process-tree-creation-time.cjs' ) const sourceScriptPath = fileURLToPath(new URL('./rebuild-native-deps.mjs', import.meta.url)) const sourceInstallScriptPath = fileURLToPath( - new URL('./install-electron-package-binary.mjs', import.meta.url) + new URL( + '../../electron-installation/platform-layout/install-electron-package-binary.mjs', + import.meta.url + ) ) const sourceNodePtyJobOwnershipPath = fileURLToPath( new URL('./node-pty-job-ownership.cjs', import.meta.url) ) const sourceWindowsProcessTreeGypRebuildPath = fileURLToPath( - new URL('./windows-process-tree-gyp-rebuild.mjs', import.meta.url) + new URL('../windows/windows-process-tree-gyp-rebuild.mjs', import.meta.url) ) // projectRequire resolves at project root, so module walker cannot discover this edge. const sourceWindowsProcessTreeCreationTimePath = fileURLToPath( - new URL('./windows-process-tree-creation-time.cjs', import.meta.url) + new URL('../windows/windows-process-tree-creation-time.cjs', import.meta.url) ) const sourceWindowsProcessTreePatchPath = fileURLToPath( - new URL('../patches/@vscode__windows-process-tree@0.8.0.patch', import.meta.url) + new URL('../../../patches/@vscode__windows-process-tree@0.8.0.patch', import.meta.url) ) // Derive reader from patch pre-image but write upstream CRLF; using patch’s LF made fixture agree by construction while real repair failed. @@ -81,16 +84,39 @@ export function writeWindowsProcessTreePatchFile(projectDir) { export function mkTempProject() { const projectDir = mkdtempSync(join(tmpdir(), 'orca-rebuild-native-deps-')) mkdirSync(join(projectDir, 'config', 'scripts'), { recursive: true }) - copyScriptWithLocalModules(sourceScriptPath, join(projectDir, 'config', 'scripts')) - copyScriptWithLocalModules(sourceInstallScriptPath, join(projectDir, 'config', 'scripts')) - copyScriptWithLocalModules(sourceNodePtyJobOwnershipPath, join(projectDir, 'config', 'scripts')) + copyScriptWithLocalModules( + sourceScriptPath, + join(projectDir, 'config', 'scripts', 'native-build', 'node-addons') + ) + copyScriptWithLocalModules( + sourceInstallScriptPath, + join(projectDir, 'config', 'scripts', 'electron-installation', 'platform-layout') + ) + copyScriptWithLocalModules( + sourceNodePtyJobOwnershipPath, + join(projectDir, 'config', 'scripts', 'native-build', 'node-addons') + ) copyFileSync( sourceWindowsProcessTreeCreationTimePath, - join(projectDir, 'config', 'scripts', 'windows-process-tree-creation-time.cjs') + join( + projectDir, + 'config', + 'scripts', + 'native-build', + 'windows', + 'windows-process-tree-creation-time.cjs' + ) ) copyFileSync( sourceWindowsProcessTreeGypRebuildPath, - join(projectDir, 'config', 'scripts', 'windows-process-tree-gyp-rebuild.mjs') + join( + projectDir, + 'config', + 'scripts', + 'native-build', + 'windows', + 'windows-process-tree-gyp-rebuild.mjs' + ) ) return projectDir } @@ -111,14 +137,18 @@ export function runRebuildScript(projectDir, extraEnv = {}, args = []) { delete env[key] } } - return spawnSync(process.execPath, ['config/scripts/rebuild-native-deps.mjs', ...args], { - cwd: projectDir, - encoding: 'utf8', - env: { - ...env, - ...extraEnv + return spawnSync( + process.execPath, + ['config/scripts/native-build/node-addons/rebuild-native-deps.mjs', ...args], + { + cwd: projectDir, + encoding: 'utf8', + env: { + ...env, + ...extraEnv + } } - }) + ) } export function writeFakeElectronPackage(projectDir) { diff --git a/config/scripts/rebuild-native-deps-windows-process-tree.test.mjs b/config/scripts/native-build/node-addons/rebuild-native-deps-windows-process-tree.test.mjs similarity index 97% rename from config/scripts/rebuild-native-deps-windows-process-tree.test.mjs rename to config/scripts/native-build/node-addons/rebuild-native-deps-windows-process-tree.test.mjs index 4f11d2db9ee..b09c2310d2c 100644 --- a/config/scripts/rebuild-native-deps-windows-process-tree.test.mjs +++ b/config/scripts/native-build/node-addons/rebuild-native-deps-windows-process-tree.test.mjs @@ -3,7 +3,7 @@ import { appendFileSync, copyFileSync, existsSync, mkdirSync } from 'node:fs' import { createRequire } from 'node:module' import { join } from 'node:path' import { describe, expect, it } from 'vitest' -import { removeTreeSync } from '../../src/shared/windows-transient-lock-removal.ts' +import { removeTreeSync } from '../../../../src/shared/windows-transient-lock-removal.ts' import { mkTempProject, diff --git a/config/scripts/rebuild-native-deps.mjs b/config/scripts/native-build/node-addons/rebuild-native-deps.mjs similarity index 96% rename from config/scripts/rebuild-native-deps.mjs rename to config/scripts/native-build/node-addons/rebuild-native-deps.mjs index 391cdd9ca5a..f3c46473c4f 100644 --- a/config/scripts/rebuild-native-deps.mjs +++ b/config/scripts/native-build/node-addons/rebuild-native-deps.mjs @@ -6,16 +6,16 @@ import { rebuild } from '@electron/rebuild' import { hasAdoptedSharedElectronDist, resolveSharedElectronDistEntry -} from './shared-electron-dist-cache.mjs' +} from '../../electron-installation/shared-dist-cache/shared-electron-dist-cache.mjs' import { execFileSync, spawnSync } from 'node:child_process' import { ensureWindowsProcessTreeCommandLinePatch, inspectWindowsProcessTreeAddon, stageWindowsProcessTreeNodeAddonApiHeaders, windowsProcessTreeAddonPath -} from './windows-process-tree-gyp-rebuild.mjs' -import { disableMsbuildFileTrackingOnWindows } from './msbuild-file-tracking.mjs' -import { warnAboutNodeModulesAboveSharedStore } from './store-ancestor-node-modules.mjs' +} from '../windows/windows-process-tree-gyp-rebuild.mjs' +import { disableMsbuildFileTrackingOnWindows } from '../windows/msbuild-file-tracking.mjs' +import { warnAboutNodeModulesAboveSharedStore } from '../../node-resolution/ancestor-modules/store-ancestor-node-modules.mjs' import { isSharedNativePackage, nodePtyBuildArtifactPaths, @@ -365,7 +365,7 @@ function runElectronPackageBinaryInstall() { const result = spawnSync( process.execPath, - ['config/scripts/install-electron-package-binary.mjs'], + ['config/scripts/electron-installation/platform-layout/install-electron-package-binary.mjs'], { cwd: projectDir, env, @@ -378,7 +378,7 @@ function runElectronPackageBinaryInstall() { } if (result.status !== 0) { throw new Error( - `config/scripts/install-electron-package-binary.mjs exited with status ${result.status}` + `config/scripts/electron-installation/platform-layout/install-electron-package-binary.mjs exited with status ${result.status}` ) } } @@ -390,7 +390,7 @@ function continuePostinstallWithoutElectron() { console.error( '[rebuild] Continuing postinstall because Electron binary installation failed. ' + 'Electron-consuming package scripts and release jobs run ' + - 'config/scripts/ensure-native-runtime.mjs --runtime=electron before launching Electron.' + 'config/scripts/native-build/node-addons/ensure-native-runtime.mjs --runtime=electron before launching Electron.' ) return true } @@ -550,7 +550,7 @@ const { existsSync } = require('node:fs') const { resolve } = require('node:path') const projectRequire = createRequire(resolve(process.cwd(), 'package.json')) const { isSourceBuildDir, nodePtyNativeModuleName: getNodePtyNativeModuleName } = projectRequire( - './config/scripts/native-build-entry.cjs' + './config/scripts/native-build/node-addons/native-build-entry.cjs' ) const moduleNames = ${JSON.stringify(moduleNames)} const requirePatchedNodePtySourceBuild = ${JSON.stringify(requiresPatchedNodePtySourceBuild())} @@ -584,7 +584,7 @@ function loadNativeModule(moduleName) { if (moduleName === 'node-pty') { projectRequire('node-pty') const { assertNodePtyJobOwnership, nodePtyAddonPath } = projectRequire( - './config/scripts/node-pty-job-ownership.cjs' + './config/scripts/native-build/node-addons/node-pty-job-ownership.cjs' ) const { loadNativeModule } = projectRequire('node-pty/lib/utils') const nativeName = getNodePtyNativeModuleName() @@ -609,7 +609,7 @@ function loadNativeModule(moduleName) { // The tarball prebuilt loads under Electron too -- the addon is N-API, so // a bare require proves nothing about which source it was built from. const { assertWindowsProcessTreeCreationTime } = projectRequire( - './config/scripts/windows-process-tree-creation-time.cjs' + './config/scripts/native-build/windows/windows-process-tree-creation-time.cjs' ) assertWindowsProcessTreeCreationTime({ module: projectRequire(moduleName) }) return diff --git a/config/scripts/rebuild-native-deps.test.mjs b/config/scripts/native-build/node-addons/rebuild-native-deps.test.mjs similarity index 98% rename from config/scripts/rebuild-native-deps.test.mjs rename to config/scripts/native-build/node-addons/rebuild-native-deps.test.mjs index c37b97ce4ac..1e8aa236f22 100644 --- a/config/scripts/rebuild-native-deps.test.mjs +++ b/config/scripts/native-build/node-addons/rebuild-native-deps.test.mjs @@ -1,7 +1,7 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs' import { join } from 'node:path' import { describe, expect, it } from 'vitest' -import { removeTreeSync } from '../../src/shared/windows-transient-lock-removal.ts' +import { removeTreeSync } from '../../../../src/shared/windows-transient-lock-removal.ts' import { mkTempProject, diff --git a/config/scripts/shared-native-build.mjs b/config/scripts/native-build/node-addons/shared-native-build.mjs similarity index 93% rename from config/scripts/shared-native-build.mjs rename to config/scripts/native-build/node-addons/shared-native-build.mjs index 334b0338e8b..92a2e8a6551 100644 --- a/config/scripts/shared-native-build.mjs +++ b/config/scripts/native-build/node-addons/shared-native-build.mjs @@ -5,10 +5,13 @@ import { createRequire } from 'node:module' import { tmpdir } from 'node:os' import { dirname, join, relative } from 'node:path' import { runProcessSync } from '@orca/process-host' -import { disableMsbuildFileTrackingOnWindows } from './msbuild-file-tracking.mjs' -import { stageNodeAddonApi } from './orcad-prebuild-node-gyp.mjs' -import { describeProcessFailure } from './process-failure-message.mjs' -import { publishSharedTree, sharedTreeStagingPath } from './shared-tree-publish.mjs' +import { disableMsbuildFileTrackingOnWindows } from '../windows/msbuild-file-tracking.mjs' +import { stageNodeAddonApi } from '../../orcad-distribution/prebuilds/orcad-prebuild-node-gyp.mjs' +import { describeProcessFailure } from '../../tool-invocation/process-failure-message.mjs' +import { + publishSharedTree, + sharedTreeStagingPath +} from '../../artifact-storage/atomic-publication/shared-tree-publish.mjs' import { nativeBuildEntryDir } from './native-build-entry.cjs' import { ensureWindowsProcessTreeCommandLinePatch, @@ -16,11 +19,15 @@ import { nodeGypRebuildInvocation, nodeGypRebuildTimeoutMs, stageWindowsProcessTreeNodeAddonApiHeaders -} from './windows-process-tree-gyp-rebuild.mjs' +} from '../windows/windows-process-tree-gyp-rebuild.mjs' const require = createRequire(import.meta.url) const { assertNodePtySourceDeniesMsysBreakaway } = require('./node-pty-job-ownership.cjs') -const { PE_MACHINE, describePeMachine, readPeMachine } = require('./windows-pe-machine.cjs') +const { + PE_MACHINE, + describePeMachine, + readPeMachine +} = require('../windows/windows-pe-machine.cjs') const PROBE_SCRIPT = join(import.meta.dirname, 'native-build-entry-probe.cjs') // Prior in-place build outputs; the scratch copy compiles from source alone. const SCRATCH_SKIPPED_TOP_LEVEL = new Set(['build', 'bin', 'node_modules']) diff --git a/config/scripts/shared-native-build.test.mjs b/config/scripts/native-build/node-addons/shared-native-build.test.mjs similarity index 98% rename from config/scripts/shared-native-build.test.mjs rename to config/scripts/native-build/node-addons/shared-native-build.test.mjs index a569db03973..668c56fe7c3 100644 --- a/config/scripts/shared-native-build.test.mjs +++ b/config/scripts/native-build/node-addons/shared-native-build.test.mjs @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os' import path from 'node:path' import { afterEach, describe, expect, it } from 'vitest' import { checkNativeBuildDirArtifacts, ensureSharedNativeBuild } from './shared-native-build.mjs' -import { peImage } from './windows-pe-image-fixture.mjs' +import { peImage } from '../windows/windows-pe-image-fixture.mjs' const roots = [] diff --git a/config/scripts/benchmark-windows-native-preparation.mjs b/config/scripts/native-build/windows/benchmark-windows-native-preparation.mjs similarity index 90% rename from config/scripts/benchmark-windows-native-preparation.mjs rename to config/scripts/native-build/windows/benchmark-windows-native-preparation.mjs index 0970c01cb22..f2c9a166341 100644 --- a/config/scripts/benchmark-windows-native-preparation.mjs +++ b/config/scripts/native-build/windows/benchmark-windows-native-preparation.mjs @@ -17,9 +17,9 @@ import { dirname, join, relative, resolve, sep } from 'node:path' import { performance } from 'node:perf_hooks' import { pathToFileURL } from 'node:url' import { runProcess } from '@orca/process-host' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' -import { summarizeBenchmarkSamples } from './benchmark-sample-summary.mjs' -import { resolvePnpmCliInvocation } from './pnpm-cli-invocation.mjs' +import { buildCounterbalancedSchedule } from '../../performance/measurement/counterbalanced-benchmark-schedule.mjs' +import { summarizeBenchmarkSamples } from '../../performance/measurement/benchmark-sample-summary.mjs' +import { resolvePnpmCliInvocation } from '../../tool-invocation/pnpm-cli-invocation.mjs' import { hasWindowsCompilerSelection } from './initialize-windows-native-toolchain.mjs' import { compilerEnvironmentKey, @@ -37,11 +37,11 @@ const candidate = 'initialize-windows-native-toolchain.mjs' const control = 'ensure-native-runtime.mjs' const unchangedFiles = [ `.github/actions/prepare-native-runtime/action.yml`, - `config/scripts/${control}`, - `config/scripts/${candidate}`, - 'config/scripts/capture-windows-native-environment.cmd', - 'config/scripts/windows-native-benchmark-observer.mjs', - 'config/scripts/benchmark-windows-native-preparation.mjs' + 'config/scripts/native-build/node-addons/ensure-native-runtime.mjs', + 'config/scripts/native-build/windows/initialize-windows-native-toolchain.mjs', + 'config/scripts/native-build/windows/capture-windows-native-environment.cmd', + 'config/scripts/native-build/windows/windows-native-benchmark-observer.mjs', + 'config/scripts/native-build/windows/benchmark-windows-native-preparation.mjs' ] export function validateObservedPreparation(receipt, variant, warm = false) { @@ -176,7 +176,7 @@ function binaryReceipt(snapshot) { } export async function benchmarkWindowsNativePreparation( - root = resolve(import.meta.dirname, '../..') + root = resolve(import.meta.dirname, '../../../..') ) { assert.equal(process.platform, 'win32', 'This hosted comparison requires Windows') assert(['x64', 'arm64'].includes(process.arch), 'Unsupported Windows runner') @@ -283,7 +283,9 @@ export async function benchmarkWindowsNativePreparation( assert(hashExpression, 'Missing production source identity') const inputs = [...hashExpression.matchAll(/'([^']+)'/g)].map((match) => match[1]) assert( - inputs.includes(`config/scripts/${candidate}`), + inputs.includes( + 'config/scripts/native-build/windows/initialize-windows-native-toolchain.mjs' + ), 'Frozen source lacks the candidate native-cache fingerprint' ) const requiredScriptHashes = digestFiles(root, unchangedFiles) @@ -364,7 +366,7 @@ export async function benchmarkWindowsNativePreparation( const initial = await command( `${label}-cold-probe`, process.execPath, - [join(snapshot, 'config/scripts', control), '--check-only'], + [join(snapshot, 'config/scripts/native-build/node-addons', control), '--check-only'], snapshot, environment, [1] @@ -377,11 +379,14 @@ export async function benchmarkWindowsNativePreparation( 'Ordinary snapshot source/config drift' ) const originalCapture = readFileSync( - join(snapshot, 'config/scripts/capture-windows-native-environment.cmd') + join(snapshot, 'config/scripts/native-build/windows/capture-windows-native-environment.cmd') ) if (variant === 'fallback') { writeFileSync( - join(snapshot, 'config/scripts/capture-windows-native-environment.cmd'), + join( + snapshot, + 'config/scripts/native-build/windows/capture-windows-native-environment.cmd' + ), '@echo off\r\nexit /b 7\r\n' ) } @@ -397,11 +402,21 @@ export async function benchmarkWindowsNativePreparation( for (const warm of [false, true]) { const stage = `${label}-${warm ? 'warm' : 'cold'}` const traceFile = join(output, `${stage}.trace.json`) - const script = join(snapshot, 'config/scripts', variant === 'control' ? control : candidate) + const script = join( + snapshot, + variant === 'control' + ? 'config/scripts/native-build/node-addons' + : 'config/scripts/native-build/windows', + variant === 'control' ? control : candidate + ) const args = [ '--import', - pathToFileURL(join(snapshot, 'config/scripts/windows-native-benchmark-observer.mjs')) - .href, + pathToFileURL( + join( + snapshot, + 'config/scripts/native-build/windows/windows-native-benchmark-observer.mjs' + ) + ).href, script, ...(variant === 'control' ? ['--runtime=node'] : []) ] @@ -418,7 +433,7 @@ export async function benchmarkWindowsNativePreparation( const final = await command( `${stage}-final-probe`, process.execPath, - [join(snapshot, 'config/scripts', control), '--check-only'], + [join(snapshot, 'config/scripts/native-build/node-addons', control), '--check-only'], snapshot ) assert.equal(final.code, 0) @@ -465,7 +480,12 @@ export async function benchmarkWindowsNativePreparation( sample.injectedCaptureSha256 = variant === 'fallback' ? hash( - readFileSync(join(snapshot, 'config/scripts/capture-windows-native-environment.cmd')) + readFileSync( + join( + snapshot, + 'config/scripts/native-build/windows/capture-windows-native-environment.cmd' + ) + ) ) : null } diff --git a/config/scripts/build-windows-agent-hook.mjs b/config/scripts/native-build/windows/build-windows-agent-hook.mjs similarity index 82% rename from config/scripts/build-windows-agent-hook.mjs rename to config/scripts/native-build/windows/build-windows-agent-hook.mjs index 02f97e41797..8e2317e15ef 100644 --- a/config/scripts/build-windows-agent-hook.mjs +++ b/config/scripts/native-build/windows/build-windows-agent-hook.mjs @@ -10,7 +10,7 @@ function readArg(name) { } if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) { - const repoRoot = resolve(import.meta.dirname, '../..') + const repoRoot = resolve(import.meta.dirname, '../../../..') const iconPath = join(repoRoot, 'resources', 'build', 'icon.ico') const crateRoot = join(repoRoot, 'native', 'windows-agent-hook') compileWindowsRustExecutable({ @@ -18,7 +18,10 @@ if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) crateRoot, binName: 'orca-agent-hook', label: 'Windows agent hook', - fingerprintInputs: [iconPath, join(repoRoot, 'config/scripts/build-windows-agent-hook.mjs')], + fingerprintInputs: [ + iconPath, + join(repoRoot, 'config/scripts/native-build/windows/build-windows-agent-hook.mjs') + ], arch: readArg('--arch') ?? process.arch, outputPath: readArg('--output') ?? join(crateRoot, '.build', 'orca-agent-hook.exe'), buildEnv: (version) => ({ diff --git a/config/scripts/build-windows-cli-launcher.mjs b/config/scripts/native-build/windows/build-windows-cli-launcher.mjs similarity index 90% rename from config/scripts/build-windows-cli-launcher.mjs rename to config/scripts/native-build/windows/build-windows-cli-launcher.mjs index 59244a872b5..2899843bd74 100644 --- a/config/scripts/build-windows-cli-launcher.mjs +++ b/config/scripts/native-build/windows/build-windows-cli-launcher.mjs @@ -10,7 +10,7 @@ function readArg(name) { } if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) { - const repoRoot = resolve(import.meta.dirname, '../..') + const repoRoot = resolve(import.meta.dirname, '../../../..') const crateRoot = join(repoRoot, 'native', 'windows-cli-launcher') const iconPath = join(repoRoot, 'resources', 'build', 'icon.ico') const output = readArg('--output') ?? join(crateRoot, '.build', 'orca.exe') @@ -25,7 +25,7 @@ if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) join(crateRoot, 'src', 'administrator_restart.rs'), join(crateRoot, 'src', 'administrator_launcher.rs'), iconPath, - join(repoRoot, 'config/scripts/build-windows-cli-launcher.mjs') + join(repoRoot, 'config/scripts/native-build/windows/build-windows-cli-launcher.mjs') ], arch: readArg('--arch'), outputPath: binName === 'orca' ? output : join(dirname(output), `${binName}.exe`), diff --git a/config/scripts/build-windows-cli-launcher.test.mjs b/config/scripts/native-build/windows/build-windows-cli-launcher.test.mjs similarity index 96% rename from config/scripts/build-windows-cli-launcher.test.mjs rename to config/scripts/native-build/windows/build-windows-cli-launcher.test.mjs index 1424e0d6e00..a3abcfd435d 100644 --- a/config/scripts/build-windows-cli-launcher.test.mjs +++ b/config/scripts/native-build/windows/build-windows-cli-launcher.test.mjs @@ -22,7 +22,7 @@ import { import { findDynamicVcRuntimeImports, readPeImportedDllNames } from './windows-pe-imports.mjs' const itCrossHost = process.platform === 'win32' ? it.skip : it -const projectRoot = resolve(import.meta.dirname, '../..') +const projectRoot = resolve(import.meta.dirname, '../../../..') const WINDOWS_LOCK_CODES = ['EBUSY', 'ENOTEMPTY', 'EPERM'] // Windows image/AV locks can outlast exit; retry cleanup then retain temp tree rather than fail launcher assertions. @@ -54,7 +54,7 @@ beforeAll(() => { sharedLauncherPath = join(sharedLauncherRoot, 'orca.exe') const result = runProcessSync({ program: process.execPath, - args: ['config/scripts/build-windows-cli-launcher.mjs'], + args: ['config/scripts/native-build/windows/build-windows-cli-launcher.mjs'], cwd: projectRoot, timeoutMs: 300_000 }) @@ -86,7 +86,13 @@ describe('Windows CLI launcher', () => { itWindows('reuses the hook host target while invalidating changed inputs', () => { const root = mkdtempSync(join(tmpdir(), 'orca-hook-target-')) try { - const hookScript = join('config', 'scripts', 'build-windows-agent-hook.mjs') + const hookScript = join( + 'config', + 'scripts', + 'native-build', + 'windows', + 'build-windows-agent-hook.mjs' + ) const crate = join('native', 'windows-agent-hook') const outputFile = join(crate, '.build', 'orca-agent-hook.exe') const outputPath = join(root, outputFile) @@ -104,8 +110,8 @@ describe('Windows CLI launcher', () => { `${outputFile}.sha256`, 'package.json', hookScript, - join('config', 'scripts', 'windows-rust-executable-build.mjs'), - join('config', 'scripts', 'windows-pe-imports.mjs'), + join('config', 'scripts', 'native-build', 'windows', 'windows-rust-executable-build.mjs'), + join('config', 'scripts', 'native-build', 'windows', 'windows-pe-imports.mjs'), join('resources', 'build', 'icon.ico'), ...[ 'src/main.rs', @@ -275,7 +281,11 @@ describe('Windows CLI launcher', () => { try { const result = spawnSync( process.execPath, - ['config/scripts/build-windows-cli-launcher.mjs', '--output', join(outputRoot, 'orca.exe')], + [ + 'config/scripts/native-build/windows/build-windows-cli-launcher.mjs', + '--output', + join(outputRoot, 'orca.exe') + ], { cwd: projectRoot, encoding: 'utf8' } ) @@ -491,6 +501,8 @@ describe('Windows CLI launcher', () => { projectRoot, 'config', 'scripts', + 'native-build', + 'windows', 'fixtures', 'DuplicatePathProcessLauncher.cs' ) diff --git a/config/scripts/build-windows-process-tree-addon.mjs b/config/scripts/native-build/windows/build-windows-process-tree-addon.mjs similarity index 98% rename from config/scripts/build-windows-process-tree-addon.mjs rename to config/scripts/native-build/windows/build-windows-process-tree-addon.mjs index 41bdd1f144b..aa87298ebf7 100644 --- a/config/scripts/build-windows-process-tree-addon.mjs +++ b/config/scripts/native-build/windows/build-windows-process-tree-addon.mjs @@ -17,9 +17,9 @@ import { import { createRequire } from 'node:module' import { tmpdir } from 'node:os' import { join, relative, resolve } from 'node:path' -import { isSharedPackageDir } from './native-build-entry.cjs' +import { isSharedPackageDir } from '../node-addons/native-build-entry.cjs' import { canReusePreparedAddon } from './windows-process-tree-prepared-addon.mjs' -import { ORCAD_WINDOWS_PROCESS_TREE_FILENAME } from '../../src/shared/orcad-artifacts.ts' +import { ORCAD_WINDOWS_PROCESS_TREE_FILENAME } from '../../../../src/shared/orcad-artifacts.ts' import { ensureWindowsProcessTreeCommandLinePatch, inspectWindowsProcessTreeAddon, @@ -33,7 +33,7 @@ const { PE_MACHINE, describePeMachine, readPeMachine } = createRequire(import.me './windows-pe-machine.cjs' ) -const ROOT = resolve(import.meta.dirname, '..', '..') +const ROOT = resolve(import.meta.dirname, '../../..', '..') const SUPPORTED_ARCHES = ['x64', 'arm64'] // Shared pnpm store belongs to every worktree; repair/build a private source copy. const SCRATCH_DIR = diff --git a/config/scripts/build-windows-security-addon.mjs b/config/scripts/native-build/windows/build-windows-security-addon.mjs similarity index 92% rename from config/scripts/build-windows-security-addon.mjs rename to config/scripts/native-build/windows/build-windows-security-addon.mjs index ea56e8d1d08..a1d312c5f41 100644 --- a/config/scripts/build-windows-security-addon.mjs +++ b/config/scripts/native-build/windows/build-windows-security-addon.mjs @@ -6,15 +6,15 @@ import { createRequire } from 'node:module' import { isAbsolute, join, resolve } from 'node:path' import { pathToFileURL } from 'node:url' import { runProcessSync } from '@orca/process-host' -import { NODE_RUNTIME_ASSETS } from '../../src/shared/node-runtime-pin.ts' -import { sha256Of } from './orcad-prebuild-slot-contents.mjs' -import { ORCAD_WINDOWS_SECURITY_FILENAME } from '../../src/shared/orcad-artifacts.ts' +import { NODE_RUNTIME_ASSETS } from '../../../../src/shared/node-runtime-pin.ts' +import { sha256Of } from '../../orcad-distribution/prebuilds/orcad-prebuild-slot-contents.mjs' +import { ORCAD_WINDOWS_SECURITY_FILENAME } from '../../../../src/shared/orcad-artifacts.ts' const { PE_MACHINE, describePeMachine, readPeMachine } = createRequire(import.meta.url)( './windows-pe-machine.cjs' ) -const ROOT = resolve(import.meta.dirname, '..', '..') +const ROOT = resolve(import.meta.dirname, '../../..', '..') const SUPPORTED_ARCHES = ['x64', 'arm64'] export function windowsSecurityAddonOutput(root, arch) { @@ -73,7 +73,7 @@ export function reusePreparedWindowsSecurityAddon( const prepared = run({ program: process.execPath, args: [ - join(root, 'config/scripts/ensure-native-runtime.mjs'), + join(root, 'config/scripts/native-build/node-addons/ensure-native-runtime.mjs'), '--runtime=node', '--check-only' ], diff --git a/config/scripts/build-windows-security-addon.test.mjs b/config/scripts/native-build/windows/build-windows-security-addon.test.mjs similarity index 98% rename from config/scripts/build-windows-security-addon.test.mjs rename to config/scripts/native-build/windows/build-windows-security-addon.test.mjs index e03aedc62c0..7a02991142e 100644 --- a/config/scripts/build-windows-security-addon.test.mjs +++ b/config/scripts/native-build/windows/build-windows-security-addon.test.mjs @@ -69,7 +69,7 @@ it.each(['x64', 'arm64'])('reuses the exact prepared %s candidate under pinned N expect(preparation).toEqual({ program: process.execPath, args: [ - join(options.root, 'config/scripts/ensure-native-runtime.mjs'), + join(options.root, 'config/scripts/native-build/node-addons/ensure-native-runtime.mjs'), '--runtime=node', '--check-only' ], diff --git a/config/scripts/capture-windows-native-environment.cmd b/config/scripts/native-build/windows/capture-windows-native-environment.cmd similarity index 100% rename from config/scripts/capture-windows-native-environment.cmd rename to config/scripts/native-build/windows/capture-windows-native-environment.cmd diff --git a/config/scripts/fixtures/DuplicatePathProcessLauncher.cs b/config/scripts/native-build/windows/fixtures/DuplicatePathProcessLauncher.cs similarity index 100% rename from config/scripts/fixtures/DuplicatePathProcessLauncher.cs rename to config/scripts/native-build/windows/fixtures/DuplicatePathProcessLauncher.cs diff --git a/config/scripts/initialize-windows-native-toolchain.mjs b/config/scripts/native-build/windows/initialize-windows-native-toolchain.mjs similarity index 98% rename from config/scripts/initialize-windows-native-toolchain.mjs rename to config/scripts/native-build/windows/initialize-windows-native-toolchain.mjs index 86be338d549..0425d0d08b1 100644 --- a/config/scripts/initialize-windows-native-toolchain.mjs +++ b/config/scripts/native-build/windows/initialize-windows-native-toolchain.mjs @@ -134,7 +134,7 @@ export function initializeWindowsNativeToolchain() { } export function prepareWindowsNodeRuntime(runProcess = runProcessSync) { - const script = join(import.meta.dirname, 'ensure-native-runtime.mjs') + const script = join(import.meta.dirname, '../node-addons/ensure-native-runtime.mjs') const check = runProcess({ program: process.execPath, args: [script, '--check-only'], diff --git a/config/scripts/initialize-windows-native-toolchain.test.mjs b/config/scripts/native-build/windows/initialize-windows-native-toolchain.test.mjs similarity index 100% rename from config/scripts/initialize-windows-native-toolchain.test.mjs rename to config/scripts/native-build/windows/initialize-windows-native-toolchain.test.mjs diff --git a/config/scripts/msbuild-file-tracking.mjs b/config/scripts/native-build/windows/msbuild-file-tracking.mjs similarity index 100% rename from config/scripts/msbuild-file-tracking.mjs rename to config/scripts/native-build/windows/msbuild-file-tracking.mjs diff --git a/config/scripts/msbuild-file-tracking.test.mjs b/config/scripts/native-build/windows/msbuild-file-tracking.test.mjs similarity index 100% rename from config/scripts/msbuild-file-tracking.test.mjs rename to config/scripts/native-build/windows/msbuild-file-tracking.test.mjs diff --git a/config/scripts/windows-native-benchmark-observer.mjs b/config/scripts/native-build/windows/windows-native-benchmark-observer.mjs similarity index 100% rename from config/scripts/windows-native-benchmark-observer.mjs rename to config/scripts/native-build/windows/windows-native-benchmark-observer.mjs diff --git a/config/scripts/windows-native-preparation-benchmark.test.mjs b/config/scripts/native-build/windows/windows-native-preparation-benchmark.test.mjs similarity index 97% rename from config/scripts/windows-native-preparation-benchmark.test.mjs rename to config/scripts/native-build/windows/windows-native-preparation-benchmark.test.mjs index 77954f462b7..1c25ea1132d 100644 --- a/config/scripts/windows-native-preparation-benchmark.test.mjs +++ b/config/scripts/native-build/windows/windows-native-preparation-benchmark.test.mjs @@ -180,7 +180,7 @@ test('preload observes the CJS process-host export imported by production ESM co '-e', program ], - cwd: join(import.meta.dirname, '../..'), + cwd: join(import.meta.dirname, '../../../..'), env: { ...process.env, ORCA_BACKGROUND_LAUNCH: '1', ORCA_NATIVE_BENCHMARK_TRACE: trace } }) assert.equal(result.code, 0, result.stderr) @@ -195,7 +195,10 @@ test('preload observes the CJS process-host export imported by production ESM co test('manual workflow freezes source and limits Windows occupancy without changing a PR gate', () => { const workflow = parse( readFileSync( - join(import.meta.dirname, '../../.github/workflows/windows-native-preparation-benchmark.yml'), + join( + import.meta.dirname, + '../../../../.github/workflows/windows-native-preparation-benchmark.yml' + ), 'utf8' ) ) @@ -225,7 +228,7 @@ test('source validation allows owned workflow receipts but rejects unrelated unt await git(['init', '--quiet']) writeFileSync( join(directory, '.gitignore'), - readFileSync(join(import.meta.dirname, '../../.gitignore')) + readFileSync(join(import.meta.dirname, '../../../../.gitignore')) ) await git(['add', '.gitignore']) const output = join(directory, '.build/windows-native-benchmark') diff --git a/config/scripts/windows-pe-image-fixture.mjs b/config/scripts/native-build/windows/windows-pe-image-fixture.mjs similarity index 100% rename from config/scripts/windows-pe-image-fixture.mjs rename to config/scripts/native-build/windows/windows-pe-image-fixture.mjs diff --git a/config/scripts/windows-pe-imports.mjs b/config/scripts/native-build/windows/windows-pe-imports.mjs similarity index 100% rename from config/scripts/windows-pe-imports.mjs rename to config/scripts/native-build/windows/windows-pe-imports.mjs diff --git a/config/scripts/windows-pe-imports.test.mjs b/config/scripts/native-build/windows/windows-pe-imports.test.mjs similarity index 100% rename from config/scripts/windows-pe-imports.test.mjs rename to config/scripts/native-build/windows/windows-pe-imports.test.mjs diff --git a/config/scripts/windows-pe-machine.cjs b/config/scripts/native-build/windows/windows-pe-machine.cjs similarity index 100% rename from config/scripts/windows-pe-machine.cjs rename to config/scripts/native-build/windows/windows-pe-machine.cjs diff --git a/config/scripts/windows-pe-machine.test.mjs b/config/scripts/native-build/windows/windows-pe-machine.test.mjs similarity index 100% rename from config/scripts/windows-pe-machine.test.mjs rename to config/scripts/native-build/windows/windows-pe-machine.test.mjs diff --git a/config/scripts/windows-process-tree-creation-time.cjs b/config/scripts/native-build/windows/windows-process-tree-creation-time.cjs similarity index 100% rename from config/scripts/windows-process-tree-creation-time.cjs rename to config/scripts/native-build/windows/windows-process-tree-creation-time.cjs diff --git a/config/scripts/windows-process-tree-creation-time.test.mjs b/config/scripts/native-build/windows/windows-process-tree-creation-time.test.mjs similarity index 100% rename from config/scripts/windows-process-tree-creation-time.test.mjs rename to config/scripts/native-build/windows/windows-process-tree-creation-time.test.mjs diff --git a/config/scripts/windows-process-tree-gyp-path.test.mjs b/config/scripts/native-build/windows/windows-process-tree-gyp-path.test.mjs similarity index 93% rename from config/scripts/windows-process-tree-gyp-path.test.mjs rename to config/scripts/native-build/windows/windows-process-tree-gyp-path.test.mjs index 0f8a651e12f..5d46ddac5d0 100644 --- a/config/scripts/windows-process-tree-gyp-path.test.mjs +++ b/config/scripts/native-build/windows/windows-process-tree-gyp-path.test.mjs @@ -3,7 +3,7 @@ import { existsSync } from 'node:fs' import { isAbsolute, join, resolve } from 'node:path' import { describe, expect, it } from 'vitest' -const projectDir = resolve(import.meta.dirname, '../..') +const projectDir = resolve(import.meta.dirname, '../../../..') const PACKAGE_DIR = join(projectDir, 'node_modules', '@vscode', 'windows-process-tree') const RESOLVED_GYP = "require.resolve('node-addon-api/node_addon_api.gyp')" diff --git a/config/scripts/windows-process-tree-gyp-rebuild.mjs b/config/scripts/native-build/windows/windows-process-tree-gyp-rebuild.mjs similarity index 98% rename from config/scripts/windows-process-tree-gyp-rebuild.mjs rename to config/scripts/native-build/windows/windows-process-tree-gyp-rebuild.mjs index f69538203b1..c52380656ba 100644 --- a/config/scripts/windows-process-tree-gyp-rebuild.mjs +++ b/config/scripts/native-build/windows/windows-process-tree-gyp-rebuild.mjs @@ -3,9 +3,9 @@ import { execFileSync } from 'node:child_process' import { copyFileSync, existsSync, mkdirSync, readFileSync, realpathSync, rmSync } from 'node:fs' import { createRequire } from 'node:module' import { dirname, join, resolve } from 'node:path' -import { loadedNativeBuildDir } from './native-build-entry.cjs' +import { loadedNativeBuildDir } from '../node-addons/native-build-entry.cjs' -const ROOT = resolve(import.meta.dirname, '..', '..') +const ROOT = resolve(import.meta.dirname, '../../..', '..') export const WINDOWS_PROCESS_TREE_PACKAGE_DIR = join( ROOT, diff --git a/config/scripts/windows-process-tree-gyp-rebuild.test.mjs b/config/scripts/native-build/windows/windows-process-tree-gyp-rebuild.test.mjs similarity index 97% rename from config/scripts/windows-process-tree-gyp-rebuild.test.mjs rename to config/scripts/native-build/windows/windows-process-tree-gyp-rebuild.test.mjs index 5e5d2a9798f..6c7c28cd6b0 100644 --- a/config/scripts/windows-process-tree-gyp-rebuild.test.mjs +++ b/config/scripts/native-build/windows/windows-process-tree-gyp-rebuild.test.mjs @@ -10,7 +10,7 @@ import { import { tmpdir } from 'node:os' import { join, resolve } from 'node:path' import { afterEach, beforeEach, describe, expect, it } from 'vitest' -import { removeTreeSync } from '../../src/shared/windows-transient-lock-removal.ts' +import { removeTreeSync } from '../../../../src/shared/windows-transient-lock-removal.ts' import { assertWindowsProcessTreeCreationTimePatch, assertWindowsProcessTreeRuntimeCreationTime, @@ -20,7 +20,7 @@ import { stageWindowsProcessTreeNodeAddonApiHeaders, WINDOWS_PROCESS_TREE_PACKAGE_DIR } from './windows-process-tree-gyp-rebuild.mjs' -import { writeFakeWindowsProcessTreeWithNodeAddonApi } from './rebuild-native-deps-test-fixtures.mjs' +import { writeFakeWindowsProcessTreeWithNodeAddonApi } from '../node-addons/rebuild-native-deps-test-fixtures.mjs' describe('windows-process-tree node-gyp rebuild', () => { // The installed Windows dependency is exercised by the Windows CI lane. diff --git a/config/scripts/windows-process-tree-prepared-addon.mjs b/config/scripts/native-build/windows/windows-process-tree-prepared-addon.mjs similarity index 82% rename from config/scripts/windows-process-tree-prepared-addon.mjs rename to config/scripts/native-build/windows/windows-process-tree-prepared-addon.mjs index 633fa9caa69..6430bbb516e 100644 --- a/config/scripts/windows-process-tree-prepared-addon.mjs +++ b/config/scripts/native-build/windows/windows-process-tree-prepared-addon.mjs @@ -2,12 +2,15 @@ import { join } from 'node:path' import { runProcessSync } from '@orca/process-host' import { windowsProcessTreeAddonDefect } from './windows-process-tree-gyp-rebuild.mjs' -const root = join(import.meta.dirname, '../..') +const root = join(import.meta.dirname, '../../../..') function checkPreparedRuntime() { return runProcessSync({ program: process.execPath, - args: [join(root, 'config/scripts/ensure-native-runtime.mjs'), '--check-only'], + args: [ + join(root, 'config/scripts/native-build/node-addons/ensure-native-runtime.mjs'), + '--check-only' + ], cwd: root, timeoutMs: 30_000 }) diff --git a/config/scripts/windows-process-tree-prepared-addon.test.mjs b/config/scripts/native-build/windows/windows-process-tree-prepared-addon.test.mjs similarity index 90% rename from config/scripts/windows-process-tree-prepared-addon.test.mjs rename to config/scripts/native-build/windows/windows-process-tree-prepared-addon.test.mjs index d466698b774..4ac09779db5 100644 --- a/config/scripts/windows-process-tree-prepared-addon.test.mjs +++ b/config/scripts/native-build/windows/windows-process-tree-prepared-addon.test.mjs @@ -140,7 +140,7 @@ it.each(['x64', 'arm64'])('passes the optional reuse flag safely to the %s build }) expect(result.code, result.stderr).toBe(0) expect(readFileSync(output, 'utf8').trim().split('\n')).toEqual([ - 'config/scripts/build-windows-process-tree-addon.mjs', + 'config/scripts/native-build/windows/build-windows-process-tree-addon.mjs', `--arch=${arch}`, ...(enabled === 'true' ? ['--reuse-prepared-runtime'] : []) ]) @@ -156,10 +156,10 @@ it('reuses the Windows E2E process-tree addon between standalone and template bu const commands = build.run.trim().split('\n') const standalone = commands.indexOf('pnpm build:orcad') const processTree = commands.indexOf( - 'node config/scripts/build-windows-process-tree-addon.mjs --arch=x64 --reuse-prepared-runtime' + 'node "$(if [ -f config/scripts/native-build/windows/build-windows-process-tree-addon.mjs ]; then printf %s config/scripts/native-build/windows/build-windows-process-tree-addon.mjs; else printf %s config/scripts/build-windows-process-tree-addon.mjs; fi)" --arch=x64 --reuse-prepared-runtime' ) const template = commands.indexOf( - 'node config/scripts/build-orcad-template.mjs --targets win32-x64' + 'node "$(if [ -f config/scripts/orcad-distribution/template/build-orcad-template.mjs ]; then printf %s config/scripts/orcad-distribution/template/build-orcad-template.mjs; else printf %s config/scripts/build-orcad-template.mjs; fi)" --targets win32-x64' ) expect(standalone).toBeGreaterThanOrEqual(0) expect(processTree).toBeGreaterThan(standalone) diff --git a/config/scripts/windows-rust-build-scope.mjs b/config/scripts/native-build/windows/windows-rust-build-scope.mjs similarity index 95% rename from config/scripts/windows-rust-build-scope.mjs rename to config/scripts/native-build/windows/windows-rust-build-scope.mjs index 8fbe8ca467a..8977f36cebc 100644 --- a/config/scripts/windows-rust-build-scope.mjs +++ b/config/scripts/native-build/windows/windows-rust-build-scope.mjs @@ -18,7 +18,7 @@ function run(command, args) { return result.stdout } -const root = resolve(import.meta.dirname, '../..') +const root = resolve(import.meta.dirname, '../../../..') if (spawnSync('cargo', ['--version'], { stdio: 'ignore' }).status !== 0) { run('rustup', ['toolchain', 'install', 'stable', '--profile', 'minimal']) run('rustup', ['default', 'stable']) diff --git a/config/scripts/windows-rust-executable-build.mjs b/config/scripts/native-build/windows/windows-rust-executable-build.mjs similarity index 98% rename from config/scripts/windows-rust-executable-build.mjs rename to config/scripts/native-build/windows/windows-rust-executable-build.mjs index 02011e5500d..f67a39226da 100644 --- a/config/scripts/windows-rust-executable-build.mjs +++ b/config/scripts/native-build/windows/windows-rust-executable-build.mjs @@ -75,7 +75,7 @@ export function compileWindowsRustExecutable({ join(crateRoot, 'Cargo.lock'), join(crateRoot, 'app.manifest'), join(crateRoot, '.cargo', 'config.toml'), - join(repoRoot, 'config/scripts/windows-rust-executable-build.mjs'), + join(repoRoot, 'config/scripts/native-build/windows/windows-rust-executable-build.mjs'), ...fingerprintInputs ], rustTarget ? `${version}\0${rustTarget}` : version diff --git a/config/scripts/native-chat-fold-benchmark.mjs b/config/scripts/native-chat-fold-benchmark.mjs index cfa21a6b475..cf465307a1f 100644 --- a/config/scripts/native-chat-fold-benchmark.mjs +++ b/config/scripts/native-chat-fold-benchmark.mjs @@ -4,10 +4,10 @@ import { readFileSync } from 'node:fs' import path from 'node:path' import { performance } from 'node:perf_hooks' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' -import { summarizeBenchmarkSamples } from './benchmark-sample-summary.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' +import { summarizeBenchmarkSamples } from './performance/measurement/benchmark-sample-summary.mjs' import { runProcessSync } from '@orca/process-host' -import { describeProcessFailure } from './process-failure-message.mjs' +import { describeProcessFailure } from './tool-invocation/process-failure-message.mjs' import { assertFoldConservesEvidence, countFoldOperations, diff --git a/config/scripts/native-chat-tool-pairing-benchmark.mjs b/config/scripts/native-chat-tool-pairing-benchmark.mjs index 937a02050d1..c6e48801ccd 100644 --- a/config/scripts/native-chat-tool-pairing-benchmark.mjs +++ b/config/scripts/native-chat-tool-pairing-benchmark.mjs @@ -4,8 +4,8 @@ import { readFileSync } from 'node:fs' import path from 'node:path' import { performance } from 'node:perf_hooks' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' -import { summarizeBenchmarkSamples } from './benchmark-sample-summary.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' +import { summarizeBenchmarkSamples } from './performance/measurement/benchmark-sample-summary.mjs' // git show <baseline>:src/shared/native-chat-tool-fold.ts | node config/scripts/native-chat-tool-pairing-benchmark.mjs const root = path.resolve(import.meta.dirname, '../..') diff --git a/config/scripts/store-ancestor-node-modules.mjs b/config/scripts/node-resolution/ancestor-modules/store-ancestor-node-modules.mjs similarity index 94% rename from config/scripts/store-ancestor-node-modules.mjs rename to config/scripts/node-resolution/ancestor-modules/store-ancestor-node-modules.mjs index 68eef4f01cb..a9c37b899bf 100644 --- a/config/scripts/store-ancestor-node-modules.mjs +++ b/config/scripts/node-resolution/ancestor-modules/store-ancestor-node-modules.mjs @@ -1,6 +1,6 @@ import { existsSync, realpathSync } from 'node:fs' import { basename, dirname, join } from 'node:path' -import { isSharedPackageDir } from './native-build-entry.cjs' +import { isSharedPackageDir } from '../../native-build/node-addons/native-build-entry.cjs' // Find ancestor node_modules above global-store links root: upward Node resolution can inject undeclared dependencies and hide isolation bugs. export function nodeModulesAboveStore(slotPackageDir, exists = existsSync) { diff --git a/config/scripts/store-ancestor-node-modules.test.mjs b/config/scripts/node-resolution/ancestor-modules/store-ancestor-node-modules.test.mjs similarity index 100% rename from config/scripts/store-ancestor-node-modules.test.mjs rename to config/scripts/node-resolution/ancestor-modules/store-ancestor-node-modules.test.mjs diff --git a/config/scripts/node-dist-archive-name.mjs b/config/scripts/node-runtime/archive-identity/node-dist-archive-name.mjs similarity index 100% rename from config/scripts/node-dist-archive-name.mjs rename to config/scripts/node-runtime/archive-identity/node-dist-archive-name.mjs diff --git a/config/scripts/update-node-runtime-pin.mjs b/config/scripts/node-runtime/archive-identity/update-node-runtime-pin.mjs similarity index 95% rename from config/scripts/update-node-runtime-pin.mjs rename to config/scripts/node-runtime/archive-identity/update-node-runtime-pin.mjs index d70a2b909e2..9e8fbe0abcb 100644 --- a/config/scripts/update-node-runtime-pin.mjs +++ b/config/scripts/node-runtime/archive-identity/update-node-runtime-pin.mjs @@ -1,6 +1,6 @@ #!/usr/bin/env node // Regenerates the pinned asset table in src/shared/node-runtime-pin.ts. Needs network; CI never runs it. -// Usage: node config/scripts/update-node-runtime-pin.mjs --version 24.21.0 [--work-dir DIR] [--keyring FILE] +// Usage: node config/scripts/node-runtime/archive-identity/update-node-runtime-pin.mjs --version 24.21.0 [--work-dir DIR] [--keyring FILE] import { createHash } from 'node:crypto' import { @@ -23,15 +23,19 @@ import { SERVER_TARGETS, nodeRuntimeExecutablePath, nodeRuntimeReleaseUrl -} from '../../src/shared/node-runtime-pin.ts' -import { currentTarget } from './server-build-target.mjs' +} from '../../../../src/shared/node-runtime-pin.ts' +import { currentTarget } from '../../orcad-distribution/prebuilds/server-build-target.mjs' import { nodeDistArchiveName, windowsImportLibFile } from './node-dist-archive-name.mjs' import { runProcessSync } from '@orca/process-host' -import { getTarProgram, getZipExtractorCommand } from './zip-extractor-command.mjs' +import { + getTarProgram, + getZipExtractorCommand +} from '../../../../src/shared/zip-extractor-command.ts' -const root = resolve(import.meta.dirname, '../..') +const root = resolve(import.meta.dirname, '../../../..') const PIN_FILE = join(root, 'src/shared/node-runtime-pin.ts') -const GENERATED_BEGIN = '// @generated-begin by config/scripts/update-node-runtime-pin.mjs' +const GENERATED_BEGIN = + '// @generated-begin by config/scripts/node-runtime/archive-identity/update-node-runtime-pin.mjs' const GENERATED_END = '// @generated-end' const RELEASE_KEYRING_URL = 'https://raw.githubusercontent.com/nodejs/release-keys/HEAD/gpg/pubring.kbx' diff --git a/config/scripts/update-node-runtime-pin.test.mjs b/config/scripts/node-runtime/archive-identity/update-node-runtime-pin.test.mjs similarity index 97% rename from config/scripts/update-node-runtime-pin.test.mjs rename to config/scripts/node-runtime/archive-identity/update-node-runtime-pin.test.mjs index 5e9e4243d96..f82d59174d9 100644 --- a/config/scripts/update-node-runtime-pin.test.mjs +++ b/config/scripts/node-runtime/archive-identity/update-node-runtime-pin.test.mjs @@ -9,7 +9,7 @@ import { SERVER_TARGETS, nodeRuntimeAsset, nodeRuntimeExecutablePath -} from '../../src/shared/node-runtime-pin.ts' +} from '../../../../src/shared/node-runtime-pin.ts' import { nodeDistArchiveName } from './node-dist-archive-name.mjs' import { parseNodeApiVersion, @@ -20,7 +20,7 @@ import { selectAssetSource } from './update-node-runtime-pin.mjs' -const pinFile = path.resolve(import.meta.dirname, '../../src/shared/node-runtime-pin.ts') +const pinFile = path.resolve(import.meta.dirname, '../../../../src/shared/node-runtime-pin.ts') const HASH_A = 'a'.repeat(64) const HASH_B = 'b'.repeat(64) diff --git a/config/scripts/node-server-concurrency.test.mjs b/config/scripts/node-server-concurrency.test.mjs index ec895597459..48ac22992ec 100644 --- a/config/scripts/node-server-concurrency.test.mjs +++ b/config/scripts/node-server-concurrency.test.mjs @@ -2,7 +2,7 @@ import { readFileSync } from 'node:fs' import { runInNewContext } from 'node:vm' import { expect, it } from 'vitest' import { parse } from 'yaml' -import { compileAggregateExpression } from './pr-aggregate-gate-context.mjs' +import { compileAggregateExpression } from './workflow/pr-admission/pr-aggregate-gate-context.mjs' const workflow = parse(readFileSync('.github/workflows/node-server-tests.yml', 'utf8')) diff --git a/config/scripts/node-server-fast-runners.test.mjs b/config/scripts/node-server-fast-runners.test.mjs index 77f72503fac..1e9f07e4cf3 100644 --- a/config/scripts/node-server-fast-runners.test.mjs +++ b/config/scripts/node-server-fast-runners.test.mjs @@ -2,7 +2,7 @@ import { readFileSync } from 'node:fs' import { runInNewContext } from 'node:vm' import { expect, it } from 'vitest' import { parse } from 'yaml' -import { compileAggregateExpression } from './pr-aggregate-gate-context.mjs' +import { compileAggregateExpression } from './workflow/pr-admission/pr-aggregate-gate-context.mjs' const workflow = parse(readFileSync('.github/workflows/node-server-tests.yml', 'utf8')) diff --git a/config/scripts/node-server-native-compat-cleanup.test-fixture.json b/config/scripts/node-server-native-compat-cleanup.test-fixture.json deleted file mode 100644 index 9e880dbc86e..00000000000 --- a/config/scripts/node-server-native-compat-cleanup.test-fixture.json +++ /dev/null @@ -1,132 +0,0 @@ -{ - "base": "e8c7b32a9037da11d1c194020c01355a6c2fcc89", - "head": "5560ab04ea93dd28a46af421dda37446bcf7df87", - "paths": [ - ["M", "config/reliability-gates.jsonc"], - ["M", "config/scripts/mobile-web-app-module-closure-entrypoints.test.mjs"], - ["D", "config/scripts/mobile-web-app-module-entry-resolution.test.mjs"], - ["M", "config/scripts/oxc-cli-invocation.test.mjs"], - ["D", "config/scripts/oxlint-cli-invocation.test.mjs"], - ["D", "config/scripts/renderer-boot-graph.test.mjs"], - ["M", "config/scripts/vitest-sqlite-database-runtime-files.mjs"], - ["M", "config/scripts/win32-test-lane-registration.test.mjs"], - ["D", "src/main/ipc/pty-controller-owner-recovery.test.ts"], - ["M", "src/main/ipc/pty-controller-ownership-routing.test.ts"], - ["D", "src/main/ipc/pty-cumulative-ack-accounting.test.ts"], - ["M", "src/main/ipc/pty-daemon-controller-teardown.test.ts"], - ["D", "src/main/ipc/pty-daemon-ssh-lease-lifecycle.test.ts"], - ["D", "src/main/ipc/pty-encoding.test.ts"], - ["D", "src/main/ipc/pty-ipc-producer-flow-control.test.ts"], - ["M", "src/main/ipc/pty-output-batching-drain.test.ts"], - ["D", "src/main/ipc/pty-output-drain-rounds.test.ts"], - ["M", "src/main/ipc/pty-pending-output-cap.test.ts"], - ["M", "src/main/ipc/pty-renderer-inflight-credit.test.ts"], - ["M", "src/main/ipc/pty-renderer-lifecycle-delivery-reset.test.ts"], - ["D", "src/main/ipc/pty-renderer-send-failure-recovery.test.ts"], - ["M", "src/main/ipc/pty-spawn-cwd-fallback.test.ts"], - ["D", "src/main/ipc/pty-wsl-cwd-validation.test.ts"], - ["M", "src/main/native-chat/agent-session-journal/journal-host-database-test-support.ts"], - ["D", "src/main/persistence/applying-settings/settings-update-machine-name.test.ts"], - ["A", "src/main/persistence/applying-settings/settings-update-normalization.test.ts"], - ["D", "src/main/persistence/applying-settings/settings-update-terminal-contrast.test.ts"], - ["D", "src/main/persistence/applying-settings/settings-update-terminal-default-shell.test.ts"], - ["M", "src/main/persistence/profile-state/profile-state-recovery-crash-boundaries.test.ts"], - ["M", "src/main/runtime/orca-runtime-structured-status-sink-wiring.test.ts"], - ["M", "src/main/runtime/orca-runtime-terminal-close-records.test.ts"], - ["M", "src/main/runtime/orchestration/coordinator-stale-base-flag.test.ts"], - ["M", "src/main/runtime/orchestration/db.test.ts"], - ["D", "src/main/runtime/orchestration/db/decision-gate-lifecycle.test.ts"], - ["D", "src/main/runtime/orchestration/db/run-list-cursor.test.ts"], - ["M", "src/main/runtime/orchestration/orchestration-db-retention-pagination.test.ts"], - ["M", "src/main/runtime/orchestration/preamble.test.ts"], - ["D", "src/main/runtime/push/push-agent-state.test.ts"], - ["M", "src/main/runtime/push/push-dispatcher.test.ts"], - ["M", "src/main/runtime/relay/relay-renewal-jitter.test.ts"], - ["D", "src/main/runtime/rpc/methods/diagnostics.test.ts"], - ["M", "src/main/runtime/rpc/methods/structured-agent-session-visual.test.ts"], - ["M", "src/main/runtime/rpc/methods/terminal/terminal-inspect-process-params.test.ts"], - ["M", "src/main/runtime/rpc/methods/worktree-create-args.test.ts"], - ["D", "src/main/runtime/rpc/methods/worktree-create-setup-choice.test.ts"], - ["M", "src/main/runtime/runtime-reference-integration.test.ts"], - ["M", "src/main/runtime/runtime-rpc-browser-host-admission.test.ts"], - ["M", "src/main/runtime/runtime-rpc-metadata-lifecycle.test.ts"], - ["M", "src/main/runtime/runtime-rpc-pairing-offer.test.ts"], - ["M", "src/main/runtime/runtime-rpc-relay-pairing.test.ts"], - ["M", "src/main/runtime/runtime-rpc-relay-provider-install.test.ts"], - ["M", "src/main/runtime/runtime-rpc-websocket-fallback-port.test.ts"], - ["M", "src/main/runtime/session-tabs-inventory-publication.test.ts"], - ["M", "src/main/runtime/workspaces/workspace-query-prototype.test.ts"], - ["M", "src/renderer/src/components/contextual-tours/ContextualTourOverlay.test.tsx"], - [ - "D", - "src/renderer/src/components/contextual-tours/ContextualTourOverlaySurface.localization.test.tsx" - ], - ["M", "src/renderer/src/components/native-chat/NativeChatCodeBlock.test.tsx"], - [ - "M", - "src/renderer/src/components/native-chat/NativeChatMessageList.tool-stream-cost.test.tsx" - ], - ["M", "src/renderer/src/components/native-chat/NativeChatMessageList.turn-status.test.tsx"], - ["D", "src/renderer/src/components/native-chat/NativeChatTurnActivityLine.test.tsx"], - ["M", "src/renderer/src/components/right-sidebar/FileExplorerFilesTreePane.errors.test.tsx"], - ["D", "src/renderer/src/components/right-sidebar/FileExplorerRow.load-error.test.tsx"], - ["M", "src/renderer/src/components/settings/AccountsPane.test.tsx"], - ["M", "src/renderer/src/components/settings/GitPane.test.ts"], - ["D", "src/renderer/src/components/settings/GitPane.test.tsx"], - ["D", "src/renderer/src/components/settings/accounts-pane-claude-section.test.tsx"], - ["D", "src/renderer/src/components/sidebar/CommentMarkdown.github-callout.test.tsx"], - ["D", "src/renderer/src/components/sidebar/CommentMarkdown.jira-links.test.tsx"], - ["M", "src/renderer/src/components/sidebar/CommentMarkdown.test.tsx"], - ["D", "src/renderer/src/store/slices/agent-status-cursor-checkpoint.test.ts"], - ["M", "src/renderer/src/store/slices/agent-status-main-agent-fact.test.ts"], - ["M", "src/renderer/src/store/slices/agent-status-provider-session.test.ts"], - ["D", "src/renderer/src/store/slices/agent-status-quit-capture-resumable-agents.test.ts"], - ["D", "src/renderer/src/store/slices/agent-status-remember-sleeping-session.test.ts"], - ["D", "src/renderer/src/store/slices/agent-status-reminted-pane-key.test.ts"], - ["D", "src/renderer/src/store/slices/agent-status-session-boundary-done.test.ts"], - ["D", "src/renderer/src/store/slices/agent-status-turn-started-at.test.ts"], - ["D", "src/renderer/src/store/slices/terminal-startup-command-retention.test.ts"], - ["M", "src/renderer/src/store/slices/terminal-tab-recovery-remount.test.ts"], - ["A", "src/shared/agent-resume-argv-drop.spec.ts"], - ["D", "src/shared/agent-resume-argv-drop.test.ts"], - ["A", "src/shared/agent-resume-launch-command.spec.ts"], - ["D", "src/shared/agent-resume-launch-command.test.ts"], - ["A", "src/shared/agent-startup-plan-inputs-extra-agent-args.spec.ts"], - ["D", "src/shared/agent-startup-plan-inputs-extra-agent-args.test.ts"], - ["A", "src/shared/agent-startup-plan-inputs.spec.ts"], - ["D", "src/shared/agent-startup-plan-inputs.test.ts"], - ["A", "src/shared/automation-extra-agent-args.spec.ts"], - ["D", "src/shared/automation-extra-agent-args.test.ts"], - ["A", "src/shared/dsh-startup.spec.ts"], - ["D", "src/shared/dsh-startup.test.ts"], - ["A", "src/shared/freebuff-launch.spec.ts"], - ["D", "src/shared/freebuff-launch.test.ts"], - ["A", "src/shared/freebuff-startup.spec.ts"], - ["D", "src/shared/freebuff-startup.test.ts"], - ["A", "src/shared/omp-fresh-launch.spec.ts"], - ["D", "src/shared/omp-fresh-launch.test.ts"], - ["A", "src/shared/opencode-startup-prompt.spec.ts"], - ["D", "src/shared/opencode-startup-prompt.test.ts"], - ["A", "src/shared/opencode2-resume-launch-mode.spec.ts"], - ["D", "src/shared/opencode2-resume-launch-mode.test.ts"], - ["A", "src/shared/qoder-cn-launch-recipe.spec.ts"], - ["D", "src/shared/qoder-cn-launch-recipe.test.ts"], - ["A", "src/shared/tui-agent-fork-startup.spec.ts"], - ["D", "src/shared/tui-agent-fork-startup.test.ts"], - ["A", "src/shared/tui-agent-launch-defaults.spec.ts"], - ["D", "src/shared/tui-agent-launch-defaults.test.ts"], - ["A", "src/shared/tui-agent-prompt-transport.spec.ts"], - ["D", "src/shared/tui-agent-prompt-transport.test.ts"], - ["A", "src/shared/tui-agent-startup-copilot-resume.spec.ts"], - ["D", "src/shared/tui-agent-startup-copilot-resume.test.ts"], - ["A", "src/shared/tui-agent-startup-hermes.spec.ts"], - ["D", "src/shared/tui-agent-startup-hermes.test.ts"], - ["A", "src/shared/tui-agent-startup-session-options.spec.ts"], - ["D", "src/shared/tui-agent-startup-session-options.test.ts"], - ["A", "src/shared/tui-agent-startup-shell.spec.ts"], - ["D", "src/shared/tui-agent-startup-shell.test.ts"], - ["A", "src/shared/tui-agent-startup.spec.ts"], - ["M", "src/shared/tui-agent-startup.test.ts"] - ], - "rawDiff": ":100644 100644 ed468cf4d79556d176ceb0aabc312e1d6e872d88 94c99746545ef6ddd4dc085b775d9eba0d768458 M\u0000config/reliability-gates.jsonc\u0000:100644 100644 4ca3e52463a721f91ea1662f5e17a6200e664f75 c2af5741cda25ed24f4c9e985d7b2c791d1ad635 M\u0000config/scripts/mobile-web-app-module-closure-entrypoints.test.mjs\u0000:100644 000000 ccdf6936927eed0246a4a329708b00db5cba1ac1 0000000000000000000000000000000000000000 D\u0000config/scripts/mobile-web-app-module-entry-resolution.test.mjs\u0000:100644 100644 5776580dbfeab42b28b7d1c77b478116e96e7f3e a5dae584f5f92312bddb60135f6a9d710b52e2da M\u0000config/scripts/oxc-cli-invocation.test.mjs\u0000:100644 000000 7a681a825d9f1aefdb44340f1ebb5ec789da92b7 0000000000000000000000000000000000000000 D\u0000config/scripts/oxlint-cli-invocation.test.mjs\u0000:100644 000000 bfc3b3518c8c1ffe8c3709059a6bbee45b6149a7 0000000000000000000000000000000000000000 D\u0000config/scripts/renderer-boot-graph.test.mjs\u0000:100644 100644 f9b56d5a8baab226647d04348036561efb438c98 6b303421afb3092deb592781551c9fd69cd38fa2 M\u0000config/scripts/vitest-sqlite-database-runtime-files.mjs\u0000:100644 100644 dcff04783d8b346a003ef7e5a6d403c6601cb9b9 4cc207f1edff18efe49ea57edcfd55cfaa939414 M\u0000config/scripts/win32-test-lane-registration.test.mjs\u0000:100644 000000 dfc334afca6e4ca2f50f921a126d185a7209ba26 0000000000000000000000000000000000000000 D\u0000src/main/ipc/pty-controller-owner-recovery.test.ts\u0000:100644 100644 4c6f3c2401ac29b525fd33e5e671bc43a2294d9f 7abc9a60a28d8677dd917471a4526c472b5669b9 M\u0000src/main/ipc/pty-controller-ownership-routing.test.ts\u0000:100644 000000 688081e63699b0c08eeea6bc4ea2eb5e81ea6553 0000000000000000000000000000000000000000 D\u0000src/main/ipc/pty-cumulative-ack-accounting.test.ts\u0000:100644 100644 3a964e61a745a8b18d91bb3163a590a30f6e70fe dd2c4b5bf345b26d2d402fcbffedf7fc51e13dba M\u0000src/main/ipc/pty-daemon-controller-teardown.test.ts\u0000:100644 000000 9d93418448d6a2b4612dcd7d5116d66c3184db7f 0000000000000000000000000000000000000000 D\u0000src/main/ipc/pty-daemon-ssh-lease-lifecycle.test.ts\u0000:100644 000000 c6d362150149a25de993354b5205d56e1e6b90c4 0000000000000000000000000000000000000000 D\u0000src/main/ipc/pty-encoding.test.ts\u0000:100644 000000 1c31d36167a515dea8b09caee0a96efa25b3c21c 0000000000000000000000000000000000000000 D\u0000src/main/ipc/pty-ipc-producer-flow-control.test.ts\u0000:100644 100644 013e6d492a5aee6f08cacf03b88d50a10ddf3f68 867047f9495a6f44a1e624b803a22eca61485f14 M\u0000src/main/ipc/pty-output-batching-drain.test.ts\u0000:100644 000000 94944b9011beebd491f54c835cef30657d673a80 0000000000000000000000000000000000000000 D\u0000src/main/ipc/pty-output-drain-rounds.test.ts\u0000:100644 100644 0416719e8e8bef0ef379e25b972427d2cc6b5c92 e161b74cc3d0d53f940799a842496b3cc6513e39 M\u0000src/main/ipc/pty-pending-output-cap.test.ts\u0000:100644 100644 5024f408d61d7a1d364d15bbd0dfde88a81d8314 79107ad739248365cf3a4f19c01f673993b1a299 M\u0000src/main/ipc/pty-renderer-inflight-credit.test.ts\u0000:100644 100644 16070629c203a19ad8ff7cb3f22d54d944f20e05 b189dd64f3ab5d42196a423a2bdaf066dcda594c M\u0000src/main/ipc/pty-renderer-lifecycle-delivery-reset.test.ts\u0000:100644 000000 00870825a0735f4799074c10266f0f7ea0d042f8 0000000000000000000000000000000000000000 D\u0000src/main/ipc/pty-renderer-send-failure-recovery.test.ts\u0000:100644 100644 ddf1d55fde61d0d15e5ddb686a341da53d1703f7 3d8935552de8a78d7beb50b33d6af4b0652dec2e M\u0000src/main/ipc/pty-spawn-cwd-fallback.test.ts\u0000:100644 000000 8f6f0e4d709bdfa25fbb65e22467b82332126e08 0000000000000000000000000000000000000000 D\u0000src/main/ipc/pty-wsl-cwd-validation.test.ts\u0000:100644 100644 32b0c846571f0d3b3b8165d1d261dec8cfb20324 aba1aaba39e277b5fde6e8cab403eb0d712707aa M\u0000src/main/native-chat/agent-session-journal/journal-host-database-test-support.ts\u0000:100644 000000 5a849acc9259109b638838f82a4d27b68f3b2d75 0000000000000000000000000000000000000000 D\u0000src/main/persistence/applying-settings/settings-update-machine-name.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 bf4e2dc88b1b05a8688f7a43c049a0471b2ff33b A\u0000src/main/persistence/applying-settings/settings-update-normalization.test.ts\u0000:100644 000000 7de32d7b36d7c626f69693231808671045b593a9 0000000000000000000000000000000000000000 D\u0000src/main/persistence/applying-settings/settings-update-terminal-contrast.test.ts\u0000:100644 000000 4c407e8943f681072e43cc95fe6da526e386dafa 0000000000000000000000000000000000000000 D\u0000src/main/persistence/applying-settings/settings-update-terminal-default-shell.test.ts\u0000:100644 100644 2e89c0279d2c151f70c985573d93c660029c67f5 65fd09bcbb589fe7cdb48503dbb1aa26daf066b3 M\u0000src/main/persistence/profile-state/profile-state-recovery-crash-boundaries.test.ts\u0000:100644 100644 d4b2f77324afaf80dc9e66ba2a3534a9513e7568 75833fe9e5f012abc7568bb1a60bf6dcb163fafd M\u0000src/main/runtime/orca-runtime-structured-status-sink-wiring.test.ts\u0000:100644 100644 db20105d10c6afe4f3a5da7ad7e4f1e7be54512a 15ab7ee194142d8b39e851e2f4118fb1dfd0ee0d M\u0000src/main/runtime/orca-runtime-terminal-close-records.test.ts\u0000:100644 100644 818d3f848dc29ed702270d5782586d4cffdc015a ac7e9a5f788fef4b766ba43dafce31b37cdd7443 M\u0000src/main/runtime/orchestration/coordinator-stale-base-flag.test.ts\u0000:100644 100644 a6aa94a6b2f5461890464ff5bfa897af2e70dcdd 724d33f1be6efd62b7e17c810d9ed209c602466b M\u0000src/main/runtime/orchestration/db.test.ts\u0000:100644 000000 9fdc9d9b5fb74b4c6b7010fffbb00371fb76aaf2 0000000000000000000000000000000000000000 D\u0000src/main/runtime/orchestration/db/decision-gate-lifecycle.test.ts\u0000:100644 000000 d60906b05314248d5f466488afd29e1e7258ed01 0000000000000000000000000000000000000000 D\u0000src/main/runtime/orchestration/db/run-list-cursor.test.ts\u0000:100644 100644 c980b8fe02aad031ef3e9f83efbe7f3a0eedaa35 f9a985512d2a71893c6ea42dcd627fadf69a89cb M\u0000src/main/runtime/orchestration/orchestration-db-retention-pagination.test.ts\u0000:100644 100644 61d8c2731cad196e484fada7b54435f22aae65cb e6238e20578dc38f24cf582578f998b6f0ca44b8 M\u0000src/main/runtime/orchestration/preamble.test.ts\u0000:100644 000000 e56d39ffb014c5d8b8d96eb2bb64e09cb1d3cf63 0000000000000000000000000000000000000000 D\u0000src/main/runtime/push/push-agent-state.test.ts\u0000:100644 100644 47373045f28709dde8b0fd798c6929e399009021 d9ba6186d81aad92447f9350875c233906ef4040 M\u0000src/main/runtime/push/push-dispatcher.test.ts\u0000:100644 100644 5bbc09948364c99840dc5f856209aad22136dd15 ac05668a52e9661008d83b146ce128c609f544d2 M\u0000src/main/runtime/relay/relay-renewal-jitter.test.ts\u0000:100644 000000 dab6b8fe85dc824c32d165f763da77f4cef01a95 0000000000000000000000000000000000000000 D\u0000src/main/runtime/rpc/methods/diagnostics.test.ts\u0000:100644 100644 9b7dd8e5ba79be818bbc88edbfca63c25f0b1111 e1c950fa873ababb57e5efe26ea47ff6d5810a08 M\u0000src/main/runtime/rpc/methods/structured-agent-session-visual.test.ts\u0000:100644 100644 de6e2e0222bf808b7cfa5037e71c392b2f567c18 277dba4c66375dde0ec565747cf38788aabfa03c M\u0000src/main/runtime/rpc/methods/terminal/terminal-inspect-process-params.test.ts\u0000:100644 100644 19747628dae9c38a811683b3e3c46afbcb1f8475 b4eb657dffa70f3ec6882d6c8416d84b80d12420 M\u0000src/main/runtime/rpc/methods/worktree-create-args.test.ts\u0000:100644 000000 153c4560d5d4d9e944d91e779c80a09a14e179f8 0000000000000000000000000000000000000000 D\u0000src/main/runtime/rpc/methods/worktree-create-setup-choice.test.ts\u0000:100644 100644 b457caa3704ff01c2126a666ecfdf20003e88f07 6fa5b8ddaf25a35b8a2671e79204b03cbf94f4d8 M\u0000src/main/runtime/runtime-reference-integration.test.ts\u0000:100644 100644 24b94ee4fe47b0b6d568f1fc5b45d550620ee80a 93f2b63fe63c03d0fe633f69affc167e175e7a62 M\u0000src/main/runtime/runtime-rpc-browser-host-admission.test.ts\u0000:100644 100644 4735601c6a95b1b2a0c21c040893aab6955008a8 ac8ceb112fe434cca9a476b21d053b291ade140f M\u0000src/main/runtime/runtime-rpc-metadata-lifecycle.test.ts\u0000:100644 100644 1dabeea095d8d8c3a6efab8f683c4c6d20476821 18368eb052264e302a2c3d3e0d0443fc2e5fe067 M\u0000src/main/runtime/runtime-rpc-pairing-offer.test.ts\u0000:100644 100644 5083f0e78519eb98b25ceece5cc8ff27455e079b 019302512e00e5111db6e5143edb89ea5a57e028 M\u0000src/main/runtime/runtime-rpc-relay-pairing.test.ts\u0000:100644 100644 5f591b52f2be1b876c5d8d513debeb3a46825a63 3f0543bdc5ab568c7a42b66204af23089c834818 M\u0000src/main/runtime/runtime-rpc-relay-provider-install.test.ts\u0000:100644 100644 8f50289484568ff9ba94eb6066d54baf49b59e5c 2ac6987cd9e3076bb9cc16815596f3126d32983f M\u0000src/main/runtime/runtime-rpc-websocket-fallback-port.test.ts\u0000:100644 100644 2cfdc6a3b59e5fe65f16472ab0911d8335588324 bd50245aa5efb6f676035206069cf2ae64776f51 M\u0000src/main/runtime/session-tabs-inventory-publication.test.ts\u0000:100644 100644 3faa076d0a66c70a0534097b0bd3e27b01a63261 140c9d93fad39bc0b9c08a17eb614043075508e2 M\u0000src/main/runtime/workspaces/workspace-query-prototype.test.ts\u0000:100644 100644 e1d881503c067c724df332a9566ad94587c7d9dd a44104f0b9ef1d6a38623ba238cb6e9f99ca1808 M\u0000src/renderer/src/components/contextual-tours/ContextualTourOverlay.test.tsx\u0000:100644 000000 b9923d0fc112cc278cbed5eb6f38631feda77193 0000000000000000000000000000000000000000 D\u0000src/renderer/src/components/contextual-tours/ContextualTourOverlaySurface.localization.test.tsx\u0000:100644 100644 dafa78bc8d99c2390e8aa29fdc759fcbd80853b4 67dcdfe1d8236c1bba7ef4634634856acb9390f4 M\u0000src/renderer/src/components/native-chat/NativeChatCodeBlock.test.tsx\u0000:100644 100644 ed2c0328befa9f155698bdb4526f070ea7591e1f a155b323cf2fc0d40b118ef00cb28dd4584cce83 M\u0000src/renderer/src/components/native-chat/NativeChatMessageList.tool-stream-cost.test.tsx\u0000:100644 100644 cc7c6c86f39913f9c2e68a9b0f79c42dccbcf6e5 8f84c3db5c9cf019180510bf3554eecd88c90e37 M\u0000src/renderer/src/components/native-chat/NativeChatMessageList.turn-status.test.tsx\u0000:100644 000000 9c0b2657cf8ebc7e7df676300ca82ec03a3b1130 0000000000000000000000000000000000000000 D\u0000src/renderer/src/components/native-chat/NativeChatTurnActivityLine.test.tsx\u0000:100644 100644 4d4d041e16b50d40f8839c0e019020db17336b7b 1aaa7e5d23b8b395056f0868f9f47258f1d4b231 M\u0000src/renderer/src/components/right-sidebar/FileExplorerFilesTreePane.errors.test.tsx\u0000:100644 000000 3fc3115a5ea1b060018af681ffc5c1664cbd955f 0000000000000000000000000000000000000000 D\u0000src/renderer/src/components/right-sidebar/FileExplorerRow.load-error.test.tsx\u0000:100644 100644 4def6f914166467a2d7f5a1be7e30eaf2572c0cc a76535faa8171f915eb98513ce0f3f1a8caab1b4 M\u0000src/renderer/src/components/settings/AccountsPane.test.tsx\u0000:100644 100644 3275eb9a1830c990d8f1a1d0db6d92c29a74cb1c df0158497f0ebeb8252d74194328efd723897477 M\u0000src/renderer/src/components/settings/GitPane.test.ts\u0000:100644 000000 70cc28c328908e586b00fc94c1e19163219cfd7d 0000000000000000000000000000000000000000 D\u0000src/renderer/src/components/settings/GitPane.test.tsx\u0000:100644 000000 a3c8f97bf45a73f918e19baa7576d5e070fa994e 0000000000000000000000000000000000000000 D\u0000src/renderer/src/components/settings/accounts-pane-claude-section.test.tsx\u0000:100644 000000 e844ceb3d0f7be481855dae4fc59f65167f177b1 0000000000000000000000000000000000000000 D\u0000src/renderer/src/components/sidebar/CommentMarkdown.github-callout.test.tsx\u0000:100644 000000 b2545935b00920503c471f6a0f535053abaddc94 0000000000000000000000000000000000000000 D\u0000src/renderer/src/components/sidebar/CommentMarkdown.jira-links.test.tsx\u0000:100644 100644 0f3974c55783c94164ed931777e5daa024faa793 66d18daec74cbe5c2c8051886ab2e20c11ad0962 M\u0000src/renderer/src/components/sidebar/CommentMarkdown.test.tsx\u0000:100644 000000 7ab9effad71b05171ea193f77cdb228d99170e10 0000000000000000000000000000000000000000 D\u0000src/renderer/src/store/slices/agent-status-cursor-checkpoint.test.ts\u0000:100644 100644 8ceb45488e8d0e81ee9020c3efd1591b5c513d0c d629cdc0ad181cc5891a2ba0fdd6345e1bc94639 M\u0000src/renderer/src/store/slices/agent-status-main-agent-fact.test.ts\u0000:100644 100644 30793ffce2908e86f068b552dafc78be17c6f1cd ece019e9710743cdbd620b4ef30a6451748f5340 M\u0000src/renderer/src/store/slices/agent-status-provider-session.test.ts\u0000:100644 000000 7915f8a9b5ddb4b62ef4d8c5dd37fd3058213038 0000000000000000000000000000000000000000 D\u0000src/renderer/src/store/slices/agent-status-quit-capture-resumable-agents.test.ts\u0000:100644 000000 632b55b52dde06e280e931542f390d1f0660f92d 0000000000000000000000000000000000000000 D\u0000src/renderer/src/store/slices/agent-status-remember-sleeping-session.test.ts\u0000:100644 000000 fd8f38c8b191c4ddabfe2b976592ccc1b0134457 0000000000000000000000000000000000000000 D\u0000src/renderer/src/store/slices/agent-status-reminted-pane-key.test.ts\u0000:100644 000000 da11a3077c1e7e03959185895cceb60d937949ab 0000000000000000000000000000000000000000 D\u0000src/renderer/src/store/slices/agent-status-session-boundary-done.test.ts\u0000:100644 000000 324b70e075f1ec0a9e1691186aa3924f82fbe862 0000000000000000000000000000000000000000 D\u0000src/renderer/src/store/slices/agent-status-turn-started-at.test.ts\u0000:100644 000000 ea369e54f6a1003092a0f99bb4535415c98dd4ad 0000000000000000000000000000000000000000 D\u0000src/renderer/src/store/slices/terminal-startup-command-retention.test.ts\u0000:100644 100644 b1db16ae413c4c7b56bf5e542ac9267dec0f1413 adf36cdb92d5659692681d71e5b7bc3ccadd2212 M\u0000src/renderer/src/store/slices/terminal-tab-recovery-remount.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 7006497ec43e4f0b63f2838678d6bfc8914c7654 A\u0000src/shared/agent-resume-argv-drop.spec.ts\u0000:100644 000000 7006497ec43e4f0b63f2838678d6bfc8914c7654 0000000000000000000000000000000000000000 D\u0000src/shared/agent-resume-argv-drop.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 544cd92cd20641ca12ba022829a4259fedfb9794 A\u0000src/shared/agent-resume-launch-command.spec.ts\u0000:100644 000000 544cd92cd20641ca12ba022829a4259fedfb9794 0000000000000000000000000000000000000000 D\u0000src/shared/agent-resume-launch-command.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 75375e3500fb2404e5f78fcb5c190ecee338e927 A\u0000src/shared/agent-startup-plan-inputs-extra-agent-args.spec.ts\u0000:100644 000000 75375e3500fb2404e5f78fcb5c190ecee338e927 0000000000000000000000000000000000000000 D\u0000src/shared/agent-startup-plan-inputs-extra-agent-args.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 bc645aba5ea1339069954f3d05e10c8a036cb821 A\u0000src/shared/agent-startup-plan-inputs.spec.ts\u0000:100644 000000 bc645aba5ea1339069954f3d05e10c8a036cb821 0000000000000000000000000000000000000000 D\u0000src/shared/agent-startup-plan-inputs.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 07cc16fbc836954571d6f7d2ca26327fa03a4f5d A\u0000src/shared/automation-extra-agent-args.spec.ts\u0000:100644 000000 07cc16fbc836954571d6f7d2ca26327fa03a4f5d 0000000000000000000000000000000000000000 D\u0000src/shared/automation-extra-agent-args.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 0a99d2cc67b3f214c84ef6078b21546fa2c21913 A\u0000src/shared/dsh-startup.spec.ts\u0000:100644 000000 0a99d2cc67b3f214c84ef6078b21546fa2c21913 0000000000000000000000000000000000000000 D\u0000src/shared/dsh-startup.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 b58dc4bd0917b091471f88986b5c41f45ba3a70b A\u0000src/shared/freebuff-launch.spec.ts\u0000:100644 000000 b58dc4bd0917b091471f88986b5c41f45ba3a70b 0000000000000000000000000000000000000000 D\u0000src/shared/freebuff-launch.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 65806790af4a05442a2376cea1ec875dd0f10d4f A\u0000src/shared/freebuff-startup.spec.ts\u0000:100644 000000 65806790af4a05442a2376cea1ec875dd0f10d4f 0000000000000000000000000000000000000000 D\u0000src/shared/freebuff-startup.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 eb8c94e2e5c863f8313a68da202f84ba330c8043 A\u0000src/shared/omp-fresh-launch.spec.ts\u0000:100644 000000 eb8c94e2e5c863f8313a68da202f84ba330c8043 0000000000000000000000000000000000000000 D\u0000src/shared/omp-fresh-launch.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 286f7e3ad2f55dac366907098d04365de1ece2a6 A\u0000src/shared/opencode-startup-prompt.spec.ts\u0000:100644 000000 286f7e3ad2f55dac366907098d04365de1ece2a6 0000000000000000000000000000000000000000 D\u0000src/shared/opencode-startup-prompt.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 513bd76eb515160ce29b287afde3f0ac48bfa007 A\u0000src/shared/opencode2-resume-launch-mode.spec.ts\u0000:100644 000000 513bd76eb515160ce29b287afde3f0ac48bfa007 0000000000000000000000000000000000000000 D\u0000src/shared/opencode2-resume-launch-mode.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 510d2d9407783f3fcbfc2fc00bc148a1f0029c8e A\u0000src/shared/qoder-cn-launch-recipe.spec.ts\u0000:100644 000000 510d2d9407783f3fcbfc2fc00bc148a1f0029c8e 0000000000000000000000000000000000000000 D\u0000src/shared/qoder-cn-launch-recipe.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 e56b5b0892b4cf84d1ffaed7103b895f7cf07ac1 A\u0000src/shared/tui-agent-fork-startup.spec.ts\u0000:100644 000000 e56b5b0892b4cf84d1ffaed7103b895f7cf07ac1 0000000000000000000000000000000000000000 D\u0000src/shared/tui-agent-fork-startup.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 78d8e8f2c1c16f1a92ff262ab44f3ecc002549cf A\u0000src/shared/tui-agent-launch-defaults.spec.ts\u0000:100644 000000 78d8e8f2c1c16f1a92ff262ab44f3ecc002549cf 0000000000000000000000000000000000000000 D\u0000src/shared/tui-agent-launch-defaults.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 f117493dc7114818d4eabbd27560599d4ef38720 A\u0000src/shared/tui-agent-prompt-transport.spec.ts\u0000:100644 000000 f117493dc7114818d4eabbd27560599d4ef38720 0000000000000000000000000000000000000000 D\u0000src/shared/tui-agent-prompt-transport.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 d62bdb9293c504ecc518dd95efccd63cd1092eca A\u0000src/shared/tui-agent-startup-copilot-resume.spec.ts\u0000:100644 000000 d62bdb9293c504ecc518dd95efccd63cd1092eca 0000000000000000000000000000000000000000 D\u0000src/shared/tui-agent-startup-copilot-resume.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 bcf5f43750c1829e23709d118ab20458687d32db A\u0000src/shared/tui-agent-startup-hermes.spec.ts\u0000:100644 000000 bcf5f43750c1829e23709d118ab20458687d32db 0000000000000000000000000000000000000000 D\u0000src/shared/tui-agent-startup-hermes.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 63d7e9b70059e105212f843b624d80265de4c106 A\u0000src/shared/tui-agent-startup-session-options.spec.ts\u0000:100644 000000 63d7e9b70059e105212f843b624d80265de4c106 0000000000000000000000000000000000000000 D\u0000src/shared/tui-agent-startup-session-options.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 1698e86b08b1db657ae42e448bef03f63430d172 A\u0000src/shared/tui-agent-startup-shell.spec.ts\u0000:100644 000000 1698e86b08b1db657ae42e448bef03f63430d172 0000000000000000000000000000000000000000 D\u0000src/shared/tui-agent-startup-shell.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 6da47b35f1a6faab407f2ff09c9d078f91ede40d A\u0000src/shared/tui-agent-startup.spec.ts\u0000:100644 100644 6da47b35f1a6faab407f2ff09c9d078f91ede40d 299464c765eb822a62b8cfb9cbac4bdd3bc18e1e M\u0000src/shared/tui-agent-startup.test.ts\u0000" -} diff --git a/config/scripts/node-server-change-scope-enclosing-checkout.test.mjs b/config/scripts/node-server/qualification/node-server-change-scope-enclosing-checkout.test.mjs similarity index 100% rename from config/scripts/node-server-change-scope-enclosing-checkout.test.mjs rename to config/scripts/node-server/qualification/node-server-change-scope-enclosing-checkout.test.mjs diff --git a/config/scripts/node-server-change-scope.mjs b/config/scripts/node-server/qualification/node-server-change-scope.mjs similarity index 77% rename from config/scripts/node-server-change-scope.mjs rename to config/scripts/node-server/qualification/node-server-change-scope.mjs index 6622be1cff3..97c6192507e 100644 --- a/config/scripts/node-server-change-scope.mjs +++ b/config/scripts/node-server/qualification/node-server-change-scope.mjs @@ -5,29 +5,29 @@ import { nodeServerTestPaths } from './node-server-test-paths.mjs' import { nodeServerQualification } from './node-server-qualification.mjs' import { classifyNativeCompatChanges } from './node-server-native-compat-scope.mjs' -const ROOT = resolve(import.meta.dirname, '../..') +const ROOT = resolve(import.meta.dirname, '../../../..') const BUILD_SCRIPTS = [ - 'config/scripts/build-orcad-node.mjs', - 'config/scripts/server-build-target.mjs', - 'config/scripts/pinned-node-downloads.mjs', - 'config/scripts/build-orcad.mjs', - 'config/scripts/build-orcad-prebuilds.mjs', - 'config/scripts/orcad-windows-prebuild-cache.mjs', - 'config/scripts/orcad-prebuild-smoke-child.cjs', - 'config/scripts/build-windows-process-tree-addon.mjs', - 'config/scripts/build-windows-cli-launcher.mjs', - 'config/scripts/build-windows-security-addon.mjs', + 'config/scripts/orcad-distribution/prebuilds/build-orcad-node.mjs', + 'config/scripts/orcad-distribution/prebuilds/server-build-target.mjs', + 'config/scripts/orcad-distribution/prebuilds/pinned-node-downloads.mjs', + 'config/scripts/orcad-distribution/server-bundle/build-orcad.mjs', + 'config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs', + 'config/scripts/orcad-distribution/prebuilds/orcad-windows-prebuild-cache.mjs', + 'config/scripts/orcad-distribution/prebuilds/orcad-prebuild-smoke-child.cjs', + 'config/scripts/native-build/windows/build-windows-process-tree-addon.mjs', + 'config/scripts/native-build/windows/build-windows-cli-launcher.mjs', + 'config/scripts/native-build/windows/build-windows-security-addon.mjs', 'config/scripts/run-node-server-tests.mjs', 'config/vitest.config.ts', - 'config/scripts/vitest-dom-setup.ts', - 'config/scripts/happy-dom-offscreen-canvas.ts', - 'config/scripts/happy-dom-mutation-observer-retention.ts', - 'config/scripts/vitest-host-ports-setup.ts', - 'config/scripts/vitest-real-agent-home-write-guard.ts' + 'config/scripts/test-runtime/dom/vitest-dom-setup.ts', + 'config/scripts/test-runtime/dom/happy-dom-offscreen-canvas.ts', + 'config/scripts/test-runtime/dom/happy-dom-mutation-observer-retention.ts', + 'config/scripts/test-runtime/environment/vitest-host-ports-setup.ts', + 'config/scripts/test-runtime/environment/vitest-real-agent-home-write-guard.ts' ] const NODE_SERVER_POLICY_TESTS = new Set([ - 'config/scripts/node-server-change-scope.test.mjs', - 'config/scripts/node-server-qualification.test.mjs' + 'config/scripts/node-server/qualification/node-server-change-scope.test.mjs', + 'config/scripts/node-server/qualification/node-server-qualification.test.mjs' ]) const ALWAYS_FILES = new Set([ 'package.json', @@ -37,15 +37,15 @@ const ALWAYS_FILES = new Set([ 'config/pnpmfile.cjs', 'tsconfig.json', '.github/workflows/node-server-tests.yml', - 'config/scripts/node-server-change-scope.mjs', - 'config/scripts/node-server-native-compat-scope.mjs', + 'config/scripts/node-server/qualification/node-server-change-scope.mjs', + 'config/scripts/node-server/qualification/node-server-native-compat-scope.mjs', ...NODE_SERVER_POLICY_TESTS, - 'config/scripts/workspace-source-exports.mjs', - 'config/scripts/workspace-source-exports.test.mjs', + 'config/scripts/workspace/source-exports/workspace-source-exports.mjs', + 'config/scripts/workspace/source-exports/workspace-source-exports.test.mjs', 'config/scripts/headless-detector-compiler-cache.mjs', - 'config/scripts/initialize-windows-native-toolchain.mjs', - 'config/scripts/capture-windows-native-environment.cmd', - 'config/scripts/node-server-qualification.mjs', + 'config/scripts/native-build/windows/initialize-windows-native-toolchain.mjs', + 'config/scripts/native-build/windows/capture-windows-native-environment.cmd', + 'config/scripts/node-server/qualification/node-server-qualification.mjs', // The source graph sees process-host source, not the build that emits the dist servers load. 'src/packages/process-host/.gitignore', 'src/packages/process-host/scripts/build-dist.mjs', @@ -94,8 +94,8 @@ export async function collectNodeServerInputs({ root = ROOT, entryPoints } = {}) { createWorkspaceSourceResolver } ] = await Promise.all([ import('esbuild'), - import('./orcad-entry-build.mjs'), - import('./workspace-source-exports.mjs') + import('../../orcad-distribution/server-bundle/orcad-entry-build.mjs'), + import('../../workspace/source-exports/workspace-source-exports.mjs') ]) const workspace = createWorkspaceSourceResolver(root) const manifests = new Set() @@ -181,7 +181,9 @@ export async function classifyNodeServerChanges( (file) => (ALWAYS_FILES.has(file) && !(modifiedOnly && NODE_SERVER_POLICY_TESTS.has(file))) || (ALWAYS_PREFIXES.some((prefix) => file.startsWith(prefix)) && !isSourceUnitTest(file)) || - /^config\/scripts\/[^/]*orcad[^/]*$/.test(file) || + /^config\/scripts\/(?:orcad-distribution\/prebuilds\/|orcad-distribution\/template\/|orcad-distribution\/server-bundle\/|orcad-distribution\/qualification\/)?(?:test-runtime\/environment\/)?[^/]*orcad[^/]*$/.test( + file + ) || selectors.some((selector) => file.includes(selector)) ) if (forced) { diff --git a/config/scripts/node-server-change-scope.test.mjs b/config/scripts/node-server/qualification/node-server-change-scope.test.mjs similarity index 98% rename from config/scripts/node-server-change-scope.test.mjs rename to config/scripts/node-server/qualification/node-server-change-scope.test.mjs index 471b59e2e21..884d2beaf1b 100644 --- a/config/scripts/node-server-change-scope.test.mjs +++ b/config/scripts/node-server/qualification/node-server-change-scope.test.mjs @@ -215,7 +215,7 @@ it.each([ 'node-server-qualification', 'node-server-native-compat-scope' ].map((name) => [ - `config/scripts/${name}.mjs`, + `config/scripts/node-server/qualification/${name}.mjs`, readFileSync(new URL(`./${name}.mjs`, import.meta.url), 'utf8') ]) ) @@ -233,7 +233,9 @@ it.each([ const result = runProcessSync({ program: process.execPath, args: [ - realpathSync(join(root, 'config/scripts/node-server-change-scope.mjs')), + realpathSync( + join(root, 'config/scripts/node-server/qualification/node-server-change-scope.mjs') + ), changes, ...(scenario.fullQualification === false ? [] : ['--full-qualification']), ...(scenario.deferred ? ['--defer-graph'] : []), @@ -259,7 +261,7 @@ it.each([ } }) -const registry = 'config/scripts/vitest-node-runtime-files.mjs' +const registry = 'config/scripts/test-runtime/sqlite-admission/vitest-node-runtime-files.mjs' const unrelatedSshUnit = 'src/main/ssh/pinned-runtime-materializer-context.test.ts' function qualificationTree(extra = {}) { diff --git a/config/scripts/node-server/qualification/node-server-native-compat-cleanup.test-fixture.json b/config/scripts/node-server/qualification/node-server-native-compat-cleanup.test-fixture.json new file mode 100644 index 00000000000..aaeb3e9d96e --- /dev/null +++ b/config/scripts/node-server/qualification/node-server-native-compat-cleanup.test-fixture.json @@ -0,0 +1,132 @@ +{ + "base": "e8c7b32a9037da11d1c194020c01355a6c2fcc89", + "head": "5560ab04ea93dd28a46af421dda37446bcf7df87", + "paths": [ + ["M", "config/reliability-gates.jsonc"], + ["M", "config/scripts/mobile-web-app-module-closure-entrypoints.test.mjs"], + ["D", "config/scripts/mobile-web-app-module-entry-resolution.test.mjs"], + ["M", "config/scripts/tool-invocation/oxc-cli-invocation.test.mjs"], + ["D", "config/scripts/oxlint-cli-invocation.test.mjs"], + ["D", "config/scripts/renderer-boot-graph.test.mjs"], + ["M", "config/scripts/vitest-sqlite-database-runtime-files.mjs"], + ["M", "config/scripts/win32-test-lane-registration.test.mjs"], + ["D", "src/main/ipc/pty-controller-owner-recovery.test.ts"], + ["M", "src/main/ipc/pty-controller-ownership-routing.test.ts"], + ["D", "src/main/ipc/pty-cumulative-ack-accounting.test.ts"], + ["M", "src/main/ipc/pty-daemon-controller-teardown.test.ts"], + ["D", "src/main/ipc/pty-daemon-ssh-lease-lifecycle.test.ts"], + ["D", "src/main/ipc/pty-encoding.test.ts"], + ["D", "src/main/ipc/pty-ipc-producer-flow-control.test.ts"], + ["M", "src/main/ipc/pty-output-batching-drain.test.ts"], + ["D", "src/main/ipc/pty-output-drain-rounds.test.ts"], + ["M", "src/main/ipc/pty-pending-output-cap.test.ts"], + ["M", "src/main/ipc/pty-renderer-inflight-credit.test.ts"], + ["M", "src/main/ipc/pty-renderer-lifecycle-delivery-reset.test.ts"], + ["D", "src/main/ipc/pty-renderer-send-failure-recovery.test.ts"], + ["M", "src/main/ipc/pty-spawn-cwd-fallback.test.ts"], + ["D", "src/main/ipc/pty-wsl-cwd-validation.test.ts"], + ["M", "src/main/native-chat/agent-session-journal/journal-host-database-test-support.ts"], + ["D", "src/main/persistence/applying-settings/settings-update-machine-name.test.ts"], + ["A", "src/main/persistence/applying-settings/settings-update-normalization.test.ts"], + ["D", "src/main/persistence/applying-settings/settings-update-terminal-contrast.test.ts"], + ["D", "src/main/persistence/applying-settings/settings-update-terminal-default-shell.test.ts"], + ["M", "src/main/persistence/profile-state/profile-state-recovery-crash-boundaries.test.ts"], + ["M", "src/main/runtime/orca-runtime-structured-status-sink-wiring.test.ts"], + ["M", "src/main/runtime/orca-runtime-terminal-close-records.test.ts"], + ["M", "src/main/runtime/orchestration/coordinator-stale-base-flag.test.ts"], + ["M", "src/main/runtime/orchestration/db.test.ts"], + ["D", "src/main/runtime/orchestration/db/decision-gate-lifecycle.test.ts"], + ["D", "src/main/runtime/orchestration/db/run-list-cursor.test.ts"], + ["M", "src/main/runtime/orchestration/orchestration-db-retention-pagination.test.ts"], + ["M", "src/main/runtime/orchestration/preamble.test.ts"], + ["D", "src/main/runtime/push/push-agent-state.test.ts"], + ["M", "src/main/runtime/push/push-dispatcher.test.ts"], + ["M", "src/main/runtime/relay/relay-renewal-jitter.test.ts"], + ["D", "src/main/runtime/rpc/methods/diagnostics.test.ts"], + ["M", "src/main/runtime/rpc/methods/structured-agent-session-visual.test.ts"], + ["M", "src/main/runtime/rpc/methods/terminal/terminal-inspect-process-params.test.ts"], + ["M", "src/main/runtime/rpc/methods/worktree-create-args.test.ts"], + ["D", "src/main/runtime/rpc/methods/worktree-create-setup-choice.test.ts"], + ["M", "src/main/runtime/runtime-reference-integration.test.ts"], + ["M", "src/main/runtime/runtime-rpc-browser-host-admission.test.ts"], + ["M", "src/main/runtime/runtime-rpc-metadata-lifecycle.test.ts"], + ["M", "src/main/runtime/runtime-rpc-pairing-offer.test.ts"], + ["M", "src/main/runtime/runtime-rpc-relay-pairing.test.ts"], + ["M", "src/main/runtime/runtime-rpc-relay-provider-install.test.ts"], + ["M", "src/main/runtime/runtime-rpc-websocket-fallback-port.test.ts"], + ["M", "src/main/runtime/session-tabs-inventory-publication.test.ts"], + ["M", "src/main/runtime/workspaces/workspace-query-prototype.test.ts"], + ["M", "src/renderer/src/components/contextual-tours/ContextualTourOverlay.test.tsx"], + [ + "D", + "src/renderer/src/components/contextual-tours/ContextualTourOverlaySurface.localization.test.tsx" + ], + ["M", "src/renderer/src/components/native-chat/NativeChatCodeBlock.test.tsx"], + [ + "M", + "src/renderer/src/components/native-chat/NativeChatMessageList.tool-stream-cost.test.tsx" + ], + ["M", "src/renderer/src/components/native-chat/NativeChatMessageList.turn-status.test.tsx"], + ["D", "src/renderer/src/components/native-chat/NativeChatTurnActivityLine.test.tsx"], + ["M", "src/renderer/src/components/right-sidebar/FileExplorerFilesTreePane.errors.test.tsx"], + ["D", "src/renderer/src/components/right-sidebar/FileExplorerRow.load-error.test.tsx"], + ["M", "src/renderer/src/components/settings/AccountsPane.test.tsx"], + ["M", "src/renderer/src/components/settings/GitPane.test.ts"], + ["D", "src/renderer/src/components/settings/GitPane.test.tsx"], + ["D", "src/renderer/src/components/settings/accounts-pane-claude-section.test.tsx"], + ["D", "src/renderer/src/components/sidebar/CommentMarkdown.github-callout.test.tsx"], + ["D", "src/renderer/src/components/sidebar/CommentMarkdown.jira-links.test.tsx"], + ["M", "src/renderer/src/components/sidebar/CommentMarkdown.test.tsx"], + ["D", "src/renderer/src/store/slices/agent-status-cursor-checkpoint.test.ts"], + ["M", "src/renderer/src/store/slices/agent-status-main-agent-fact.test.ts"], + ["M", "src/renderer/src/store/slices/agent-status-provider-session.test.ts"], + ["D", "src/renderer/src/store/slices/agent-status-quit-capture-resumable-agents.test.ts"], + ["D", "src/renderer/src/store/slices/agent-status-remember-sleeping-session.test.ts"], + ["D", "src/renderer/src/store/slices/agent-status-reminted-pane-key.test.ts"], + ["D", "src/renderer/src/store/slices/agent-status-session-boundary-done.test.ts"], + ["D", "src/renderer/src/store/slices/agent-status-turn-started-at.test.ts"], + ["D", "src/renderer/src/store/slices/terminal-startup-command-retention.test.ts"], + ["M", "src/renderer/src/store/slices/terminal-tab-recovery-remount.test.ts"], + ["A", "src/shared/agent-resume-argv-drop.spec.ts"], + ["D", "src/shared/agent-resume-argv-drop.test.ts"], + ["A", "src/shared/agent-resume-launch-command.spec.ts"], + ["D", "src/shared/agent-resume-launch-command.test.ts"], + ["A", "src/shared/agent-startup-plan-inputs-extra-agent-args.spec.ts"], + ["D", "src/shared/agent-startup-plan-inputs-extra-agent-args.test.ts"], + ["A", "src/shared/agent-startup-plan-inputs.spec.ts"], + ["D", "src/shared/agent-startup-plan-inputs.test.ts"], + ["A", "src/shared/automation-extra-agent-args.spec.ts"], + ["D", "src/shared/automation-extra-agent-args.test.ts"], + ["A", "src/shared/dsh-startup.spec.ts"], + ["D", "src/shared/dsh-startup.test.ts"], + ["A", "src/shared/freebuff-launch.spec.ts"], + ["D", "src/shared/freebuff-launch.test.ts"], + ["A", "src/shared/freebuff-startup.spec.ts"], + ["D", "src/shared/freebuff-startup.test.ts"], + ["A", "src/shared/omp-fresh-launch.spec.ts"], + ["D", "src/shared/omp-fresh-launch.test.ts"], + ["A", "src/shared/opencode-startup-prompt.spec.ts"], + ["D", "src/shared/opencode-startup-prompt.test.ts"], + ["A", "src/shared/opencode2-resume-launch-mode.spec.ts"], + ["D", "src/shared/opencode2-resume-launch-mode.test.ts"], + ["A", "src/shared/qoder-cn-launch-recipe.spec.ts"], + ["D", "src/shared/qoder-cn-launch-recipe.test.ts"], + ["A", "src/shared/tui-agent-fork-startup.spec.ts"], + ["D", "src/shared/tui-agent-fork-startup.test.ts"], + ["A", "src/shared/tui-agent-launch-defaults.spec.ts"], + ["D", "src/shared/tui-agent-launch-defaults.test.ts"], + ["A", "src/shared/tui-agent-prompt-transport.spec.ts"], + ["D", "src/shared/tui-agent-prompt-transport.test.ts"], + ["A", "src/shared/tui-agent-startup-copilot-resume.spec.ts"], + ["D", "src/shared/tui-agent-startup-copilot-resume.test.ts"], + ["A", "src/shared/tui-agent-startup-hermes.spec.ts"], + ["D", "src/shared/tui-agent-startup-hermes.test.ts"], + ["A", "src/shared/tui-agent-startup-session-options.spec.ts"], + ["D", "src/shared/tui-agent-startup-session-options.test.ts"], + ["A", "src/shared/tui-agent-startup-shell.spec.ts"], + ["D", "src/shared/tui-agent-startup-shell.test.ts"], + ["A", "src/shared/tui-agent-startup.spec.ts"], + ["M", "src/shared/tui-agent-startup.test.ts"] + ], + "rawDiff": ":100644 100644 ed468cf4d79556d176ceb0aabc312e1d6e872d88 94c99746545ef6ddd4dc085b775d9eba0d768458 M\u0000config/reliability-gates.jsonc\u0000:100644 100644 4ca3e52463a721f91ea1662f5e17a6200e664f75 c2af5741cda25ed24f4c9e985d7b2c791d1ad635 M\u0000config/scripts/mobile-web-app-module-closure-entrypoints.test.mjs\u0000:100644 000000 ccdf6936927eed0246a4a329708b00db5cba1ac1 0000000000000000000000000000000000000000 D\u0000config/scripts/mobile-web-app-module-entry-resolution.test.mjs\u0000:100644 100644 5776580dbfeab42b28b7d1c77b478116e96e7f3e a5dae584f5f92312bddb60135f6a9d710b52e2da M\u0000config/scripts/tool-invocation/oxc-cli-invocation.test.mjs\u0000:100644 000000 7a681a825d9f1aefdb44340f1ebb5ec789da92b7 0000000000000000000000000000000000000000 D\u0000config/scripts/oxlint-cli-invocation.test.mjs\u0000:100644 000000 bfc3b3518c8c1ffe8c3709059a6bbee45b6149a7 0000000000000000000000000000000000000000 D\u0000config/scripts/renderer-boot-graph.test.mjs\u0000:100644 100644 f9b56d5a8baab226647d04348036561efb438c98 6b303421afb3092deb592781551c9fd69cd38fa2 M\u0000config/scripts/vitest-sqlite-database-runtime-files.mjs\u0000:100644 100644 dcff04783d8b346a003ef7e5a6d403c6601cb9b9 4cc207f1edff18efe49ea57edcfd55cfaa939414 M\u0000config/scripts/win32-test-lane-registration.test.mjs\u0000:100644 000000 dfc334afca6e4ca2f50f921a126d185a7209ba26 0000000000000000000000000000000000000000 D\u0000src/main/ipc/pty-controller-owner-recovery.test.ts\u0000:100644 100644 4c6f3c2401ac29b525fd33e5e671bc43a2294d9f 7abc9a60a28d8677dd917471a4526c472b5669b9 M\u0000src/main/ipc/pty-controller-ownership-routing.test.ts\u0000:100644 000000 688081e63699b0c08eeea6bc4ea2eb5e81ea6553 0000000000000000000000000000000000000000 D\u0000src/main/ipc/pty-cumulative-ack-accounting.test.ts\u0000:100644 100644 3a964e61a745a8b18d91bb3163a590a30f6e70fe dd2c4b5bf345b26d2d402fcbffedf7fc51e13dba M\u0000src/main/ipc/pty-daemon-controller-teardown.test.ts\u0000:100644 000000 9d93418448d6a2b4612dcd7d5116d66c3184db7f 0000000000000000000000000000000000000000 D\u0000src/main/ipc/pty-daemon-ssh-lease-lifecycle.test.ts\u0000:100644 000000 c6d362150149a25de993354b5205d56e1e6b90c4 0000000000000000000000000000000000000000 D\u0000src/main/ipc/pty-encoding.test.ts\u0000:100644 000000 1c31d36167a515dea8b09caee0a96efa25b3c21c 0000000000000000000000000000000000000000 D\u0000src/main/ipc/pty-ipc-producer-flow-control.test.ts\u0000:100644 100644 013e6d492a5aee6f08cacf03b88d50a10ddf3f68 867047f9495a6f44a1e624b803a22eca61485f14 M\u0000src/main/ipc/pty-output-batching-drain.test.ts\u0000:100644 000000 94944b9011beebd491f54c835cef30657d673a80 0000000000000000000000000000000000000000 D\u0000src/main/ipc/pty-output-drain-rounds.test.ts\u0000:100644 100644 0416719e8e8bef0ef379e25b972427d2cc6b5c92 e161b74cc3d0d53f940799a842496b3cc6513e39 M\u0000src/main/ipc/pty-pending-output-cap.test.ts\u0000:100644 100644 5024f408d61d7a1d364d15bbd0dfde88a81d8314 79107ad739248365cf3a4f19c01f673993b1a299 M\u0000src/main/ipc/pty-renderer-inflight-credit.test.ts\u0000:100644 100644 16070629c203a19ad8ff7cb3f22d54d944f20e05 b189dd64f3ab5d42196a423a2bdaf066dcda594c M\u0000src/main/ipc/pty-renderer-lifecycle-delivery-reset.test.ts\u0000:100644 000000 00870825a0735f4799074c10266f0f7ea0d042f8 0000000000000000000000000000000000000000 D\u0000src/main/ipc/pty-renderer-send-failure-recovery.test.ts\u0000:100644 100644 ddf1d55fde61d0d15e5ddb686a341da53d1703f7 3d8935552de8a78d7beb50b33d6af4b0652dec2e M\u0000src/main/ipc/pty-spawn-cwd-fallback.test.ts\u0000:100644 000000 8f6f0e4d709bdfa25fbb65e22467b82332126e08 0000000000000000000000000000000000000000 D\u0000src/main/ipc/pty-wsl-cwd-validation.test.ts\u0000:100644 100644 32b0c846571f0d3b3b8165d1d261dec8cfb20324 aba1aaba39e277b5fde6e8cab403eb0d712707aa M\u0000src/main/native-chat/agent-session-journal/journal-host-database-test-support.ts\u0000:100644 000000 5a849acc9259109b638838f82a4d27b68f3b2d75 0000000000000000000000000000000000000000 D\u0000src/main/persistence/applying-settings/settings-update-machine-name.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 bf4e2dc88b1b05a8688f7a43c049a0471b2ff33b A\u0000src/main/persistence/applying-settings/settings-update-normalization.test.ts\u0000:100644 000000 7de32d7b36d7c626f69693231808671045b593a9 0000000000000000000000000000000000000000 D\u0000src/main/persistence/applying-settings/settings-update-terminal-contrast.test.ts\u0000:100644 000000 4c407e8943f681072e43cc95fe6da526e386dafa 0000000000000000000000000000000000000000 D\u0000src/main/persistence/applying-settings/settings-update-terminal-default-shell.test.ts\u0000:100644 100644 2e89c0279d2c151f70c985573d93c660029c67f5 65fd09bcbb589fe7cdb48503dbb1aa26daf066b3 M\u0000src/main/persistence/profile-state/profile-state-recovery-crash-boundaries.test.ts\u0000:100644 100644 d4b2f77324afaf80dc9e66ba2a3534a9513e7568 75833fe9e5f012abc7568bb1a60bf6dcb163fafd M\u0000src/main/runtime/orca-runtime-structured-status-sink-wiring.test.ts\u0000:100644 100644 db20105d10c6afe4f3a5da7ad7e4f1e7be54512a 15ab7ee194142d8b39e851e2f4118fb1dfd0ee0d M\u0000src/main/runtime/orca-runtime-terminal-close-records.test.ts\u0000:100644 100644 818d3f848dc29ed702270d5782586d4cffdc015a ac7e9a5f788fef4b766ba43dafce31b37cdd7443 M\u0000src/main/runtime/orchestration/coordinator-stale-base-flag.test.ts\u0000:100644 100644 a6aa94a6b2f5461890464ff5bfa897af2e70dcdd 724d33f1be6efd62b7e17c810d9ed209c602466b M\u0000src/main/runtime/orchestration/db.test.ts\u0000:100644 000000 9fdc9d9b5fb74b4c6b7010fffbb00371fb76aaf2 0000000000000000000000000000000000000000 D\u0000src/main/runtime/orchestration/db/decision-gate-lifecycle.test.ts\u0000:100644 000000 d60906b05314248d5f466488afd29e1e7258ed01 0000000000000000000000000000000000000000 D\u0000src/main/runtime/orchestration/db/run-list-cursor.test.ts\u0000:100644 100644 c980b8fe02aad031ef3e9f83efbe7f3a0eedaa35 f9a985512d2a71893c6ea42dcd627fadf69a89cb M\u0000src/main/runtime/orchestration/orchestration-db-retention-pagination.test.ts\u0000:100644 100644 61d8c2731cad196e484fada7b54435f22aae65cb e6238e20578dc38f24cf582578f998b6f0ca44b8 M\u0000src/main/runtime/orchestration/preamble.test.ts\u0000:100644 000000 e56d39ffb014c5d8b8d96eb2bb64e09cb1d3cf63 0000000000000000000000000000000000000000 D\u0000src/main/runtime/push/push-agent-state.test.ts\u0000:100644 100644 47373045f28709dde8b0fd798c6929e399009021 d9ba6186d81aad92447f9350875c233906ef4040 M\u0000src/main/runtime/push/push-dispatcher.test.ts\u0000:100644 100644 5bbc09948364c99840dc5f856209aad22136dd15 ac05668a52e9661008d83b146ce128c609f544d2 M\u0000src/main/runtime/relay/relay-renewal-jitter.test.ts\u0000:100644 000000 dab6b8fe85dc824c32d165f763da77f4cef01a95 0000000000000000000000000000000000000000 D\u0000src/main/runtime/rpc/methods/diagnostics.test.ts\u0000:100644 100644 9b7dd8e5ba79be818bbc88edbfca63c25f0b1111 e1c950fa873ababb57e5efe26ea47ff6d5810a08 M\u0000src/main/runtime/rpc/methods/structured-agent-session-visual.test.ts\u0000:100644 100644 de6e2e0222bf808b7cfa5037e71c392b2f567c18 277dba4c66375dde0ec565747cf38788aabfa03c M\u0000src/main/runtime/rpc/methods/terminal/terminal-inspect-process-params.test.ts\u0000:100644 100644 19747628dae9c38a811683b3e3c46afbcb1f8475 b4eb657dffa70f3ec6882d6c8416d84b80d12420 M\u0000src/main/runtime/rpc/methods/worktree-create-args.test.ts\u0000:100644 000000 153c4560d5d4d9e944d91e779c80a09a14e179f8 0000000000000000000000000000000000000000 D\u0000src/main/runtime/rpc/methods/worktree-create-setup-choice.test.ts\u0000:100644 100644 b457caa3704ff01c2126a666ecfdf20003e88f07 6fa5b8ddaf25a35b8a2671e79204b03cbf94f4d8 M\u0000src/main/runtime/runtime-reference-integration.test.ts\u0000:100644 100644 24b94ee4fe47b0b6d568f1fc5b45d550620ee80a 93f2b63fe63c03d0fe633f69affc167e175e7a62 M\u0000src/main/runtime/runtime-rpc-browser-host-admission.test.ts\u0000:100644 100644 4735601c6a95b1b2a0c21c040893aab6955008a8 ac8ceb112fe434cca9a476b21d053b291ade140f M\u0000src/main/runtime/runtime-rpc-metadata-lifecycle.test.ts\u0000:100644 100644 1dabeea095d8d8c3a6efab8f683c4c6d20476821 18368eb052264e302a2c3d3e0d0443fc2e5fe067 M\u0000src/main/runtime/runtime-rpc-pairing-offer.test.ts\u0000:100644 100644 5083f0e78519eb98b25ceece5cc8ff27455e079b 019302512e00e5111db6e5143edb89ea5a57e028 M\u0000src/main/runtime/runtime-rpc-relay-pairing.test.ts\u0000:100644 100644 5f591b52f2be1b876c5d8d513debeb3a46825a63 3f0543bdc5ab568c7a42b66204af23089c834818 M\u0000src/main/runtime/runtime-rpc-relay-provider-install.test.ts\u0000:100644 100644 8f50289484568ff9ba94eb6066d54baf49b59e5c 2ac6987cd9e3076bb9cc16815596f3126d32983f M\u0000src/main/runtime/runtime-rpc-websocket-fallback-port.test.ts\u0000:100644 100644 2cfdc6a3b59e5fe65f16472ab0911d8335588324 bd50245aa5efb6f676035206069cf2ae64776f51 M\u0000src/main/runtime/session-tabs-inventory-publication.test.ts\u0000:100644 100644 3faa076d0a66c70a0534097b0bd3e27b01a63261 140c9d93fad39bc0b9c08a17eb614043075508e2 M\u0000src/main/runtime/workspaces/workspace-query-prototype.test.ts\u0000:100644 100644 e1d881503c067c724df332a9566ad94587c7d9dd a44104f0b9ef1d6a38623ba238cb6e9f99ca1808 M\u0000src/renderer/src/components/contextual-tours/ContextualTourOverlay.test.tsx\u0000:100644 000000 b9923d0fc112cc278cbed5eb6f38631feda77193 0000000000000000000000000000000000000000 D\u0000src/renderer/src/components/contextual-tours/ContextualTourOverlaySurface.localization.test.tsx\u0000:100644 100644 dafa78bc8d99c2390e8aa29fdc759fcbd80853b4 67dcdfe1d8236c1bba7ef4634634856acb9390f4 M\u0000src/renderer/src/components/native-chat/NativeChatCodeBlock.test.tsx\u0000:100644 100644 ed2c0328befa9f155698bdb4526f070ea7591e1f a155b323cf2fc0d40b118ef00cb28dd4584cce83 M\u0000src/renderer/src/components/native-chat/NativeChatMessageList.tool-stream-cost.test.tsx\u0000:100644 100644 cc7c6c86f39913f9c2e68a9b0f79c42dccbcf6e5 8f84c3db5c9cf019180510bf3554eecd88c90e37 M\u0000src/renderer/src/components/native-chat/NativeChatMessageList.turn-status.test.tsx\u0000:100644 000000 9c0b2657cf8ebc7e7df676300ca82ec03a3b1130 0000000000000000000000000000000000000000 D\u0000src/renderer/src/components/native-chat/NativeChatTurnActivityLine.test.tsx\u0000:100644 100644 4d4d041e16b50d40f8839c0e019020db17336b7b 1aaa7e5d23b8b395056f0868f9f47258f1d4b231 M\u0000src/renderer/src/components/right-sidebar/FileExplorerFilesTreePane.errors.test.tsx\u0000:100644 000000 3fc3115a5ea1b060018af681ffc5c1664cbd955f 0000000000000000000000000000000000000000 D\u0000src/renderer/src/components/right-sidebar/FileExplorerRow.load-error.test.tsx\u0000:100644 100644 4def6f914166467a2d7f5a1be7e30eaf2572c0cc a76535faa8171f915eb98513ce0f3f1a8caab1b4 M\u0000src/renderer/src/components/settings/AccountsPane.test.tsx\u0000:100644 100644 3275eb9a1830c990d8f1a1d0db6d92c29a74cb1c df0158497f0ebeb8252d74194328efd723897477 M\u0000src/renderer/src/components/settings/GitPane.test.ts\u0000:100644 000000 70cc28c328908e586b00fc94c1e19163219cfd7d 0000000000000000000000000000000000000000 D\u0000src/renderer/src/components/settings/GitPane.test.tsx\u0000:100644 000000 a3c8f97bf45a73f918e19baa7576d5e070fa994e 0000000000000000000000000000000000000000 D\u0000src/renderer/src/components/settings/accounts-pane-claude-section.test.tsx\u0000:100644 000000 e844ceb3d0f7be481855dae4fc59f65167f177b1 0000000000000000000000000000000000000000 D\u0000src/renderer/src/components/sidebar/CommentMarkdown.github-callout.test.tsx\u0000:100644 000000 b2545935b00920503c471f6a0f535053abaddc94 0000000000000000000000000000000000000000 D\u0000src/renderer/src/components/sidebar/CommentMarkdown.jira-links.test.tsx\u0000:100644 100644 0f3974c55783c94164ed931777e5daa024faa793 66d18daec74cbe5c2c8051886ab2e20c11ad0962 M\u0000src/renderer/src/components/sidebar/CommentMarkdown.test.tsx\u0000:100644 000000 7ab9effad71b05171ea193f77cdb228d99170e10 0000000000000000000000000000000000000000 D\u0000src/renderer/src/store/slices/agent-status-cursor-checkpoint.test.ts\u0000:100644 100644 8ceb45488e8d0e81ee9020c3efd1591b5c513d0c d629cdc0ad181cc5891a2ba0fdd6345e1bc94639 M\u0000src/renderer/src/store/slices/agent-status-main-agent-fact.test.ts\u0000:100644 100644 30793ffce2908e86f068b552dafc78be17c6f1cd ece019e9710743cdbd620b4ef30a6451748f5340 M\u0000src/renderer/src/store/slices/agent-status-provider-session.test.ts\u0000:100644 000000 7915f8a9b5ddb4b62ef4d8c5dd37fd3058213038 0000000000000000000000000000000000000000 D\u0000src/renderer/src/store/slices/agent-status-quit-capture-resumable-agents.test.ts\u0000:100644 000000 632b55b52dde06e280e931542f390d1f0660f92d 0000000000000000000000000000000000000000 D\u0000src/renderer/src/store/slices/agent-status-remember-sleeping-session.test.ts\u0000:100644 000000 fd8f38c8b191c4ddabfe2b976592ccc1b0134457 0000000000000000000000000000000000000000 D\u0000src/renderer/src/store/slices/agent-status-reminted-pane-key.test.ts\u0000:100644 000000 da11a3077c1e7e03959185895cceb60d937949ab 0000000000000000000000000000000000000000 D\u0000src/renderer/src/store/slices/agent-status-session-boundary-done.test.ts\u0000:100644 000000 324b70e075f1ec0a9e1691186aa3924f82fbe862 0000000000000000000000000000000000000000 D\u0000src/renderer/src/store/slices/agent-status-turn-started-at.test.ts\u0000:100644 000000 ea369e54f6a1003092a0f99bb4535415c98dd4ad 0000000000000000000000000000000000000000 D\u0000src/renderer/src/store/slices/terminal-startup-command-retention.test.ts\u0000:100644 100644 b1db16ae413c4c7b56bf5e542ac9267dec0f1413 adf36cdb92d5659692681d71e5b7bc3ccadd2212 M\u0000src/renderer/src/store/slices/terminal-tab-recovery-remount.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 7006497ec43e4f0b63f2838678d6bfc8914c7654 A\u0000src/shared/agent-resume-argv-drop.spec.ts\u0000:100644 000000 7006497ec43e4f0b63f2838678d6bfc8914c7654 0000000000000000000000000000000000000000 D\u0000src/shared/agent-resume-argv-drop.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 544cd92cd20641ca12ba022829a4259fedfb9794 A\u0000src/shared/agent-resume-launch-command.spec.ts\u0000:100644 000000 544cd92cd20641ca12ba022829a4259fedfb9794 0000000000000000000000000000000000000000 D\u0000src/shared/agent-resume-launch-command.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 75375e3500fb2404e5f78fcb5c190ecee338e927 A\u0000src/shared/agent-startup-plan-inputs-extra-agent-args.spec.ts\u0000:100644 000000 75375e3500fb2404e5f78fcb5c190ecee338e927 0000000000000000000000000000000000000000 D\u0000src/shared/agent-startup-plan-inputs-extra-agent-args.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 bc645aba5ea1339069954f3d05e10c8a036cb821 A\u0000src/shared/agent-startup-plan-inputs.spec.ts\u0000:100644 000000 bc645aba5ea1339069954f3d05e10c8a036cb821 0000000000000000000000000000000000000000 D\u0000src/shared/agent-startup-plan-inputs.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 07cc16fbc836954571d6f7d2ca26327fa03a4f5d A\u0000src/shared/automation-extra-agent-args.spec.ts\u0000:100644 000000 07cc16fbc836954571d6f7d2ca26327fa03a4f5d 0000000000000000000000000000000000000000 D\u0000src/shared/automation-extra-agent-args.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 0a99d2cc67b3f214c84ef6078b21546fa2c21913 A\u0000src/shared/dsh-startup.spec.ts\u0000:100644 000000 0a99d2cc67b3f214c84ef6078b21546fa2c21913 0000000000000000000000000000000000000000 D\u0000src/shared/dsh-startup.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 b58dc4bd0917b091471f88986b5c41f45ba3a70b A\u0000src/shared/freebuff-launch.spec.ts\u0000:100644 000000 b58dc4bd0917b091471f88986b5c41f45ba3a70b 0000000000000000000000000000000000000000 D\u0000src/shared/freebuff-launch.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 65806790af4a05442a2376cea1ec875dd0f10d4f A\u0000src/shared/freebuff-startup.spec.ts\u0000:100644 000000 65806790af4a05442a2376cea1ec875dd0f10d4f 0000000000000000000000000000000000000000 D\u0000src/shared/freebuff-startup.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 eb8c94e2e5c863f8313a68da202f84ba330c8043 A\u0000src/shared/omp-fresh-launch.spec.ts\u0000:100644 000000 eb8c94e2e5c863f8313a68da202f84ba330c8043 0000000000000000000000000000000000000000 D\u0000src/shared/omp-fresh-launch.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 286f7e3ad2f55dac366907098d04365de1ece2a6 A\u0000src/shared/opencode-startup-prompt.spec.ts\u0000:100644 000000 286f7e3ad2f55dac366907098d04365de1ece2a6 0000000000000000000000000000000000000000 D\u0000src/shared/opencode-startup-prompt.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 513bd76eb515160ce29b287afde3f0ac48bfa007 A\u0000src/shared/opencode2-resume-launch-mode.spec.ts\u0000:100644 000000 513bd76eb515160ce29b287afde3f0ac48bfa007 0000000000000000000000000000000000000000 D\u0000src/shared/opencode2-resume-launch-mode.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 510d2d9407783f3fcbfc2fc00bc148a1f0029c8e A\u0000src/shared/qoder-cn-launch-recipe.spec.ts\u0000:100644 000000 510d2d9407783f3fcbfc2fc00bc148a1f0029c8e 0000000000000000000000000000000000000000 D\u0000src/shared/qoder-cn-launch-recipe.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 e56b5b0892b4cf84d1ffaed7103b895f7cf07ac1 A\u0000src/shared/tui-agent-fork-startup.spec.ts\u0000:100644 000000 e56b5b0892b4cf84d1ffaed7103b895f7cf07ac1 0000000000000000000000000000000000000000 D\u0000src/shared/tui-agent-fork-startup.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 78d8e8f2c1c16f1a92ff262ab44f3ecc002549cf A\u0000src/shared/tui-agent-launch-defaults.spec.ts\u0000:100644 000000 78d8e8f2c1c16f1a92ff262ab44f3ecc002549cf 0000000000000000000000000000000000000000 D\u0000src/shared/tui-agent-launch-defaults.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 f117493dc7114818d4eabbd27560599d4ef38720 A\u0000src/shared/tui-agent-prompt-transport.spec.ts\u0000:100644 000000 f117493dc7114818d4eabbd27560599d4ef38720 0000000000000000000000000000000000000000 D\u0000src/shared/tui-agent-prompt-transport.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 d62bdb9293c504ecc518dd95efccd63cd1092eca A\u0000src/shared/tui-agent-startup-copilot-resume.spec.ts\u0000:100644 000000 d62bdb9293c504ecc518dd95efccd63cd1092eca 0000000000000000000000000000000000000000 D\u0000src/shared/tui-agent-startup-copilot-resume.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 bcf5f43750c1829e23709d118ab20458687d32db A\u0000src/shared/tui-agent-startup-hermes.spec.ts\u0000:100644 000000 bcf5f43750c1829e23709d118ab20458687d32db 0000000000000000000000000000000000000000 D\u0000src/shared/tui-agent-startup-hermes.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 63d7e9b70059e105212f843b624d80265de4c106 A\u0000src/shared/tui-agent-startup-session-options.spec.ts\u0000:100644 000000 63d7e9b70059e105212f843b624d80265de4c106 0000000000000000000000000000000000000000 D\u0000src/shared/tui-agent-startup-session-options.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 1698e86b08b1db657ae42e448bef03f63430d172 A\u0000src/shared/tui-agent-startup-shell.spec.ts\u0000:100644 000000 1698e86b08b1db657ae42e448bef03f63430d172 0000000000000000000000000000000000000000 D\u0000src/shared/tui-agent-startup-shell.test.ts\u0000:000000 100644 0000000000000000000000000000000000000000 6da47b35f1a6faab407f2ff09c9d078f91ede40d A\u0000src/shared/tui-agent-startup.spec.ts\u0000:100644 100644 6da47b35f1a6faab407f2ff09c9d078f91ede40d 299464c765eb822a62b8cfb9cbac4bdd3bc18e1e M\u0000src/shared/tui-agent-startup.test.ts\u0000" +} diff --git a/config/scripts/node-server-native-compat-scope.mjs b/config/scripts/node-server/qualification/node-server-native-compat-scope.mjs similarity index 70% rename from config/scripts/node-server-native-compat-scope.mjs rename to config/scripts/node-server/qualification/node-server-native-compat-scope.mjs index 7ce843068ec..0754d6dad4a 100644 --- a/config/scripts/node-server-native-compat-scope.mjs +++ b/config/scripts/node-server/qualification/node-server-native-compat-scope.mjs @@ -1,11 +1,11 @@ // The glibc 2.17 lane builds and smokes native slots; it does not run the server tests. export const NATIVE_COMPAT_ENTRY_POINTS = [ - 'config/scripts/build-orcad-prebuilds.mjs', - 'config/scripts/orcad-prebuild-smoke.mjs', - 'config/scripts/orcad-prebuild-smoke-child.cjs', + 'config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs', + 'config/scripts/orcad-distribution/prebuilds/orcad-prebuild-smoke.mjs', + 'config/scripts/orcad-distribution/prebuilds/orcad-prebuild-smoke-child.cjs', // createRequire and the smoke subprocess do not expose these edges to esbuild. - 'config/scripts/node-pty-job-ownership.cjs', - 'config/scripts/verify-linux-glibc-floor.cjs' + 'config/scripts/native-build/node-addons/node-pty-job-ownership.cjs', + 'config/scripts/native-build/linux/verify-linux-glibc-floor.cjs' ] // These files configure or support tests; additions/deletions still require qualification. @@ -84,7 +84,7 @@ function isTestInput({ status, file }) { // Build policy and process-host fixtures can be read without a static import. if ( file.startsWith('src/packages/') || - /^config\/scripts\/[^/]*(?:orcad|node-server|node-pty|native|glibc|pinned-node|node-runtime|workspace-source-exports|script-module-dependencies)[^/]*$/.test( + /^config\/scripts\/(?:desktop-distribution\/linux\/|native-build\/windows\/|native-build\/composition\/|orcad-distribution\/prebuilds\/|orcad-distribution\/template\/|orcad-distribution\/server-bundle\/|desktop-distribution\/runtime-verification\/|native-build\/node-addons\/|orcad-distribution\/qualification\/|native-build\/linux\/)?(?:test-runtime\/node-worker\/|test-runtime\/sqlite-admission\/|test-runtime\/environment\/)?[^/]*(?:orcad|node-server|node-pty|native|glibc|pinned-node|node-runtime|workspace-source-exports|script-module-dependencies)[^/]*$|^config\/scripts\/(?:ci\/workflow-contracts|node-server\/qualification|test-fixtures\/script-copy-closure|node-runtime\/archive-identity|workflow\/source-routing|workspace\/source-exports)\/[^/]*(?:orcad|node-server|node-pty|native|glibc|pinned-node|node-runtime|workspace-source-exports|script-module-dependencies)[^/]*$/.test( file ) ) { @@ -93,7 +93,9 @@ function isTestInput({ status, file }) { return ( (status === 'M' && MODIFIED_TEST_INPUTS.has(file)) || /^src\/(?:[^/]+\/)*[^/]+\.(?:test|spec)\.(?:ts|tsx)$/.test(file) || - /^config\/scripts\/(?:[^/]+\/)*[^/]+\.test\.(?:ts|mjs)$/.test(file) || + /^config\/scripts\/(?:release\/workflow-contracts\/|release\/versioning\/|desktop-distribution\/macos\/|desktop-distribution\/linux\/|cli-build\/|build\/mobile-web-app\/|native-build\/composition\/|orcad-distribution\/prebuilds\/|orcad-distribution\/template\/|plugin-build\/declarative-runtime\/|native-build\/linux\/|native-build\/windows\/|desktop-distribution\/runtime-verification\/|desktop-build\/output-contracts\/|native-build\/node-addons\/|orcad-distribution\/server-bundle\/|orcad-distribution\/qualification\/)?(?:[^/]+\/)*[^/]+\.test\.(?:ts|mjs)$/.test( + file + ) || /^tests\/e2e\/(?:[^/]+\/)*[^/]+\.unit\.test\.ts$/.test(file) ) } diff --git a/config/scripts/node-server-native-compat-scope.test.mjs b/config/scripts/node-server/qualification/node-server-native-compat-scope.test.mjs similarity index 89% rename from config/scripts/node-server-native-compat-scope.test.mjs rename to config/scripts/node-server/qualification/node-server-native-compat-scope.test.mjs index dc4d69d8b52..79af101bfb6 100644 --- a/config/scripts/node-server-native-compat-scope.test.mjs +++ b/config/scripts/node-server/qualification/node-server-native-compat-scope.test.mjs @@ -1,7 +1,7 @@ import { readFileSync } from 'node:fs' import { expect, it, vi } from 'vitest' import { parse } from 'yaml' -import { compileAggregateExpression } from './pr-aggregate-gate-context.mjs' +import { compileAggregateExpression } from '../../workflow/pr-admission/pr-aggregate-gate-context.mjs' import { classifyNativeCompatChanges, NATIVE_COMPAT_ENTRY_POINTS, @@ -167,13 +167,13 @@ it.each([ 'src/packages/process-host/src/run-process.test.ts', 'native/example/fixture.test.ts', 'config/patches/node-pty@1.1.0.patch', - 'config/scripts/build-orcad-prebuilds.mjs', + 'config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs', 'config/scripts/orcad-prebuild-smoke.test.mjs', - 'config/scripts/node-server-native-compat-scope.mjs', - 'config/scripts/node-server-native-compat-scope.test.mjs', - 'config/scripts/node-server-native-compat-cleanup.test-fixture.json', - 'config/scripts/node-server-change-scope.mjs', - 'config/scripts/verify-linux-glibc-floor.cjs', + 'config/scripts/node-server/qualification/node-server-native-compat-scope.mjs', + 'config/scripts/node-server/qualification/node-server-native-compat-scope.test.mjs', + 'config/scripts/node-server/qualification/node-server-native-compat-cleanup.test-fixture.json', + 'config/scripts/node-server/qualification/node-server-change-scope.mjs', + 'config/scripts/native-build/linux/verify-linux-glibc-floor.cjs', '.github/actions/prepare-native-runtime/action.yml', '.github/actions/prepare-headless-compiler/action.yml', '.github/workflows/node-server-tests.yml', @@ -235,7 +235,7 @@ it.each([{}, { pullRequest: false }, { pullRequest: true, fullQualification: tru ) it('qualifies a standalone change to the executable native routing policy', async () => { - const file = 'config/scripts/node-server-native-compat-scope.mjs' + const file = 'config/scripts/node-server/qualification/node-server-native-compat-scope.mjs' const collect = vi.fn(nativeInputs) const scope = await classifyNodeServerChanges([file], collect, { modifiedFiles: [file] }) expect(scope.shouldRun).toBe(true) @@ -280,7 +280,10 @@ it('checks the cleanup against the actual native build and smoke closure', async it('limits test-only native skip evidence to ordinary pull requests', () => { const workflow = parse( - readFileSync(new URL('../../.github/workflows/node-server-tests.yml', import.meta.url), 'utf8') + readFileSync( + new URL('../../../../.github/workflows/node-server-tests.yml', import.meta.url), + 'utf8' + ) ) const scope = workflow.jobs.changes.steps.find((step) => step.id === 'scope') const graph = workflow.jobs.changes.steps.find((step) => step.id === 'graph') @@ -336,7 +339,10 @@ it('limits test-only native skip evidence to ordinary pull requests', () => { it('configures server glibc 2.28 slots and the glibc 2.17 compatibility lane', () => { const workflow = parse( - readFileSync(new URL('../../.github/workflows/node-server-tests.yml', import.meta.url), 'utf8') + readFileSync( + new URL('../../../../.github/workflows/node-server-tests.yml', import.meta.url), + 'utf8' + ) ) const floor = workflow.jobs.linux_glibc_floor expect(floor.container).toBe('${{ matrix.image }}') @@ -364,15 +370,20 @@ it('configures server glibc 2.28 slots and the glibc 2.17 compatibility lane', ( const run = compat.steps.map((step) => step.run ?? '').join('\n') expect(run).toMatch(/quay\.io\/pypa\/manylinux2014_x86_64@sha256:[0-9a-f]{64} /) expect(run).toContain('--slot=linux-x64-glibc217 --print-runtime') - expect(run).toContain('build-orcad-prebuilds.mjs --slot=linux-x64-glibc217\n') + expect(run).toContain( + 'node "$(if [ -f config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs ]; then printf %s config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs; else printf %s config/scripts/build-orcad-prebuilds.mjs; fi)" --slot=linux-x64-glibc217\n' + ) expect(run).toContain('--require-slots linux-x64-glibc217') expect(run).toContain( - 'env -u LD_LIBRARY_PATH node config/scripts/build-orcad-prebuilds.mjs --slot=linux-x64-glibc217 --smoke' + 'env -u LD_LIBRARY_PATH node "$(if [ -f config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs ]; then printf %s config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs; else printf %s config/scripts/build-orcad-prebuilds.mjs; fi)" --slot=linux-x64-glibc217 --smoke' ) }) const nativeWorkflow = parse( - readFileSync(new URL('../../.github/workflows/node-server-tests.yml', import.meta.url), 'utf8') + readFileSync( + new URL('../../../../.github/workflows/node-server-tests.yml', import.meta.url), + 'utf8' + ) ) const nativeJob = compileAggregateExpression(nativeWorkflow.jobs.linux_glibc217_compat.if, [ 'needs', diff --git a/config/scripts/node-server-policy-self-tests.test.mjs b/config/scripts/node-server/qualification/node-server-policy-self-tests.test.mjs similarity index 90% rename from config/scripts/node-server-policy-self-tests.test.mjs rename to config/scripts/node-server/qualification/node-server-policy-self-tests.test.mjs index 1a490dd2cac..94ed7367981 100644 --- a/config/scripts/node-server-policy-self-tests.test.mjs +++ b/config/scripts/node-server/qualification/node-server-policy-self-tests.test.mjs @@ -1,13 +1,13 @@ import { beforeAll, describe, expect, it } from 'vitest' import { classifyNodeServerChanges, collectNodeServerInputs } from './node-server-change-scope.mjs' import { NODE_SERVER_RUNNERS, nodeServerQualification } from './node-server-qualification.mjs' -import { discoverUnitFiles } from './ci-unit-files.mjs' -import { planUnitSelection } from './ci-unit-selection.mjs' -import { classifyPrJobs } from './pr-code-change-scope.mjs' +import { discoverUnitFiles } from '../../ci/unit-selection/dependency-graph/ci-unit-files.mjs' +import { planUnitSelection } from '../../ci/unit-selection/ci-unit-selection.mjs' +import { classifyPrJobs } from '../../workflow/source-routing/pr-code-change-scope.mjs' const policyTests = [ - 'config/scripts/node-server-change-scope.test.mjs', - 'config/scripts/node-server-qualification.test.mjs' + 'config/scripts/node-server/qualification/node-server-change-scope.test.mjs', + 'config/scripts/node-server/qualification/node-server-qualification.test.mjs' ] const unavailableGraph = async () => { @@ -105,9 +105,9 @@ describe('modified Node-server policy self-tests', () => { }) it.each([ - 'config/scripts/node-server-change-scope.mjs', - 'config/scripts/node-server-qualification.mjs', - 'config/scripts/workspace-source-exports.test.mjs', + 'config/scripts/node-server/qualification/node-server-change-scope.mjs', + 'config/scripts/node-server/qualification/node-server-qualification.mjs', + 'config/scripts/workspace/source-exports/workspace-source-exports.test.mjs', '.github/workflows/node-server-tests.yml', '.github/actions/prepare-native-runtime/action.yml', 'pnpm-lock.yaml' diff --git a/config/scripts/node-server-qualification.mjs b/config/scripts/node-server/qualification/node-server-qualification.mjs similarity index 97% rename from config/scripts/node-server-qualification.mjs rename to config/scripts/node-server/qualification/node-server-qualification.mjs index c1564275baf..9ada1238466 100644 --- a/config/scripts/node-server-qualification.mjs +++ b/config/scripts/node-server/qualification/node-server-qualification.mjs @@ -74,6 +74,7 @@ export function nodeServerQualification(changedFiles, scope, { fullQualification file === 'src/shared/node-runtime-pin.ts' || file === '.github/workflows/node-server-tests.yml' || file.startsWith('config/scripts/node-server-') || + file.startsWith('config/scripts/node-server/qualification/node-server-') || /(?:^|[/.-])(?:bun|prebuilds?)(?:[/.-]|$)/i.test(file) ) { full = true diff --git a/config/scripts/node-server-qualification.test.mjs b/config/scripts/node-server/qualification/node-server-qualification.test.mjs similarity index 94% rename from config/scripts/node-server-qualification.test.mjs rename to config/scripts/node-server/qualification/node-server-qualification.test.mjs index f07bab4c8cd..dd2acd50ec2 100644 --- a/config/scripts/node-server-qualification.test.mjs +++ b/config/scripts/node-server/qualification/node-server-qualification.test.mjs @@ -13,7 +13,7 @@ it('qualifies one platform for a change no platform can alter', () => { it.each([ 'src/renderer/src/components/TabStrip.tsx', 'config/vitest.config.ts', - 'config/scripts/ci-unit-plan.mjs', + 'config/scripts/ci/unit-selection/ci-unit-plan.mjs', 'resources/icons/tray.png', '.github/workflows/pr.yml', 'docs/reference/agent-status-store.md' @@ -39,8 +39,8 @@ it.each([ 'src/main/sqlite/database.ts', 'src/main/orcad/entry.ts', 'src/main/daemon/entry.ts', - 'config/scripts/build-orcad-prebuilds.mjs', - 'config/scripts/orcad-prebuild-slot-contents.mjs', + 'config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs', + 'config/scripts/orcad-distribution/prebuilds/orcad-prebuild-slot-contents.mjs', 'src/shared/node-runtime-pin.ts' ])('retains all platforms for platform-flavoured input %s', (file) => { expect(nodeServerQualification([file], scope)).toEqual({ @@ -134,7 +134,7 @@ it.each([ it.each([ '.github/workflows/node-server-tests.yml', - 'config/scripts/node-server-qualification.mjs' + 'config/scripts/node-server/qualification/node-server-qualification.mjs' ])('qualifies all hosts when the selection policy changes: %s', (file) => { expect(nodeServerQualification([file], scope)).toEqual({ runners: NODE_SERVER_RUNNERS, diff --git a/config/scripts/node-server-test-paths.mjs b/config/scripts/node-server/qualification/node-server-test-paths.mjs similarity index 96% rename from config/scripts/node-server-test-paths.mjs rename to config/scripts/node-server/qualification/node-server-test-paths.mjs index 04d7dea48b6..a0688617f9e 100644 --- a/config/scripts/node-server-test-paths.mjs +++ b/config/scripts/node-server/qualification/node-server-test-paths.mjs @@ -47,7 +47,7 @@ export function nodeServerTestPaths({ 'src/main/orcad/orcad-stop-request-shutdown.integration.test.ts', 'src/main/orcad/orcad-windows-conpty-breakaway.integration.test.ts', 'src/main/orcad/orcad-serve-parity.integration.test.ts', - 'config/scripts/zip-extractor-command.test.mjs' + 'config/scripts/archives/platform-command/zip-extractor-command.test.mjs' ] : []), ...(crossRuntime ? CROSS_RUNTIME_TEST_PATHS : []), diff --git a/config/scripts/orca-dev.mjs b/config/scripts/orca-dev.mjs index 479b2489004..64f932975a7 100755 --- a/config/scripts/orca-dev.mjs +++ b/config/scripts/orca-dev.mjs @@ -4,7 +4,7 @@ import { spawnSync } from 'node:child_process' import { accessSync, constants, existsSync, realpathSync, statSync } from 'node:fs' import path from 'node:path' import { prepareDevCliTerminalWrappers } from './dev-cli-terminal-wrapper.mjs' -import { resolveDevCliUserDataPath } from './dev-instance-isolation.mjs' +import { resolveDevCliUserDataPath } from './development/instance-isolation/dev-instance-isolation.mjs' const scriptPath = realpathSync(import.meta.filename) const scriptDir = path.dirname(scriptPath) diff --git a/config/scripts/build-orcad-node.mjs b/config/scripts/orcad-distribution/prebuilds/build-orcad-node.mjs similarity index 89% rename from config/scripts/build-orcad-node.mjs rename to config/scripts/orcad-distribution/prebuilds/build-orcad-node.mjs index bc7f38da9ee..f547419dd24 100644 --- a/config/scripts/build-orcad-node.mjs +++ b/config/scripts/orcad-distribution/prebuilds/build-orcad-node.mjs @@ -7,15 +7,15 @@ import { NODE_RUNTIME_ASSETS, NODE_RUNTIME_PIN, SERVER_TARGETS -} from '../../src/shared/node-runtime-pin.ts' -import { orcadNodeRuntimeRelativePath } from '../../src/shared/orcad-artifacts.ts' +} from '../../../../src/shared/node-runtime-pin.ts' +import { orcadNodeRuntimeRelativePath } from '../../../../src/shared/orcad-artifacts.ts' import { ORCAD_PREBUILDS_DIR } from './build-orcad-prebuilds.mjs' import { findSlotProblems, readManifest } from './orcad-prebuild-slot-contents.mjs' import { ensurePinnedNodeExecutable } from './pinned-node-downloads.mjs' import { runProcessSync } from '@orca/process-host' import { currentTarget } from './server-build-target.mjs' -const root = resolve(import.meta.dirname, '../..') +const root = resolve(import.meta.dirname, '../../../..') function argument(name) { const index = process.argv.indexOf(name) @@ -60,7 +60,10 @@ function ensurePrebuildSlot(target, isCurrent) { } const result = runProcessSync({ program: process.execPath, - args: [join(root, 'config/scripts/build-orcad-prebuilds.mjs'), `--slot=${target}`], + args: [ + join(root, 'config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs'), + `--slot=${target}` + ], cwd: root, stdio: 'inherit', timeoutMs: null @@ -82,7 +85,7 @@ async function main() { const runtimePath = isCurrent ? await placeRuntime(outputDir, target) : null const result = runProcessSync({ program: process.execPath, - args: [join(root, 'config/scripts/build-orcad.mjs')], + args: [join(root, 'config/scripts/orcad-distribution/server-bundle/build-orcad.mjs')], cwd: root, env: { ...process.env, diff --git a/config/scripts/build-orcad-prebuilds.mjs b/config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs similarity index 94% rename from config/scripts/build-orcad-prebuilds.mjs rename to config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs index ea7c39f6afd..b3dcfd36328 100644 --- a/config/scripts/build-orcad-prebuilds.mjs +++ b/config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs @@ -7,7 +7,7 @@ import { cpSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } fr import { createRequire } from 'node:module' import { dirname, join } from 'node:path' import process from 'node:process' -import { NODE_RUNTIME_PIN } from '../../src/shared/node-runtime-pin.ts' +import { NODE_RUNTIME_PIN } from '../../../../src/shared/node-runtime-pin.ts' import { assertCompatSlotHost, findPostBaselineNodeApiNames, @@ -26,10 +26,8 @@ import { compileCompatAddons } from './orcad-prebuild-compat-addons.mjs' import { nodeGypRebuild, stageNodeAddonApi } from './orcad-prebuild-node-gyp.mjs' import { ensurePinnedNodeExecutable, preparePinnedNodeDir } from './pinned-node-downloads.mjs' -export { readManifest } - const require = createRequire(import.meta.url) -const ROOT = join(import.meta.dirname, '..', '..') +const ROOT = join(import.meta.dirname, '../../..', '..') // Why outside out/orcad: build:orcad wipes that directory and copies its target's slot from here. export const ORCAD_PREBUILDS_DIR = join(ROOT, 'out', 'orcad-prebuilds') const PREBUILDS_DIR = ORCAD_PREBUILDS_DIR @@ -166,9 +164,11 @@ async function compileNodePty(sourceDir, slot) { writeFileSync(ptySourcePath, ptySourceForLibc(readFileSync(ptySourcePath, 'utf8'), libc)) stageNodeAddonApi(sourceDir, stagedDir) if (process.platform === 'win32') { - require('./node-pty-job-ownership.cjs').assertNodePtySourceDeniesMsysBreakaway({ - nodePtyDir: stagedDir - }) + require('../../native-build/node-addons/node-pty-job-ownership.cjs').assertNodePtySourceDeniesMsysBreakaway( + { + nodePtyDir: stagedDir + } + ) } const nodeDir = await preparePinnedNodeDir({ target: slot, workDir: join(workDir, 'nodedir') }) @@ -182,11 +182,13 @@ async function compileNodePty(sourceDir, slot) { staticCxxRuntime: isCompatSlot(slot) }) if (process.platform === 'win32') { - require('./node-pty-job-ownership.cjs').assertRebuiltConptyDeniesMsysBreakaway({ - nodePtyDir: stagedDir, - rebuildArch: process.arch, - crossHost: false - }) + require('../../native-build/node-addons/node-pty-job-ownership.cjs').assertRebuiltConptyDeniesMsysBreakaway( + { + nodePtyDir: stagedDir, + rebuildArch: process.arch, + crossHost: false + } + ) } return { buildDir, nodeDir } } @@ -206,7 +208,7 @@ function requireSlots(slots) { // Always gate Linux architecture; apply glibc/libstdc++ floors only to glibc slots. function linuxSlotRecord(slot, slotDir, libc) { - const floor = require('./verify-linux-glibc-floor.cjs') + const floor = require('../../native-build/linux/verify-linux-glibc-floor.cjs') if (libc !== 'glibc') { for (const binary of floor.collectNativeBinaries(slotDir)) { const violation = floor.findArchViolation(binary, process.arch, slotDir) diff --git a/config/scripts/build-orcad-prebuilds.test.mjs b/config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.test.mjs similarity index 98% rename from config/scripts/build-orcad-prebuilds.test.mjs rename to config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.test.mjs index 4d300c32a7f..a5a292b087a 100644 --- a/config/scripts/build-orcad-prebuilds.test.mjs +++ b/config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.test.mjs @@ -9,10 +9,10 @@ import { ptySourceForLibc, detectLibc, MATRIX_SLOTS, - readManifest, requestedSlots, slotName } from './build-orcad-prebuilds.mjs' +import { readManifest } from './orcad-prebuild-slot-contents.mjs' const PATCHED_BINDING_GYP = "'ldflags': ['-Wl,--no-as-needed,-l:libutil.so.1,-l:libpthread.so.0,--as-needed']" diff --git a/config/scripts/merge-orcad-prebuilds.mjs b/config/scripts/orcad-distribution/prebuilds/merge-orcad-prebuilds.mjs similarity index 98% rename from config/scripts/merge-orcad-prebuilds.mjs rename to config/scripts/orcad-distribution/prebuilds/merge-orcad-prebuilds.mjs index 690252374a6..3750358fedc 100644 --- a/config/scripts/merge-orcad-prebuilds.mjs +++ b/config/scripts/orcad-distribution/prebuilds/merge-orcad-prebuilds.mjs @@ -6,7 +6,7 @@ import { join, resolve } from 'node:path' import process from 'node:process' import { findSlotProblems, mergeManifest, readManifest } from './orcad-prebuild-slot-contents.mjs' -const ROOT = resolve(import.meta.dirname, '..', '..') +const ROOT = resolve(import.meta.dirname, '../../..', '..') /** Copies every verified slot from `sourceDirs` into a fresh `outDir`; returns the merged manifest. */ export function mergeOrcadPrebuildTrees(sourceDirs, outDir) { diff --git a/config/scripts/merge-orcad-prebuilds.test.mjs b/config/scripts/orcad-distribution/prebuilds/merge-orcad-prebuilds.test.mjs similarity index 100% rename from config/scripts/merge-orcad-prebuilds.test.mjs rename to config/scripts/orcad-distribution/prebuilds/merge-orcad-prebuilds.test.mjs diff --git a/config/scripts/orcad-prebuild-compat-addons.mjs b/config/scripts/orcad-distribution/prebuilds/orcad-prebuild-compat-addons.mjs similarity index 96% rename from config/scripts/orcad-prebuild-compat-addons.mjs rename to config/scripts/orcad-distribution/prebuilds/orcad-prebuild-compat-addons.mjs index dbfaeab0dee..8fec532231b 100644 --- a/config/scripts/orcad-prebuild-compat-addons.mjs +++ b/config/scripts/orcad-distribution/prebuilds/orcad-prebuild-compat-addons.mjs @@ -2,7 +2,7 @@ import { cpSync, mkdirSync, rmSync } from 'node:fs' import { createRequire } from 'node:module' import { dirname, join } from 'node:path' -import { NODE_RUNTIME_PIN } from '../../src/shared/node-runtime-pin.ts' +import { NODE_RUNTIME_PIN } from '../../../../src/shared/node-runtime-pin.ts' import { nodeGypRebuild, stageNodeAddonApi } from './orcad-prebuild-node-gyp.mjs' import { COMPAT_SLOT_ADDONS, SLOT_NAPI_VERSION } from './orcad-prebuild-slot-contents.mjs' diff --git a/config/scripts/orcad-prebuild-node-gyp.mjs b/config/scripts/orcad-distribution/prebuilds/orcad-prebuild-node-gyp.mjs similarity index 92% rename from config/scripts/orcad-prebuild-node-gyp.mjs rename to config/scripts/orcad-distribution/prebuilds/orcad-prebuild-node-gyp.mjs index 6000d3586e7..55d72331474 100644 --- a/config/scripts/orcad-prebuild-node-gyp.mjs +++ b/config/scripts/orcad-distribution/prebuilds/orcad-prebuild-node-gyp.mjs @@ -5,7 +5,7 @@ import { dirname, join } from 'node:path' import { prebuildCompileGypi } from './orcad-prebuild-slot-contents.mjs' const require = createRequire(import.meta.url) -const ROOT = join(import.meta.dirname, '..', '..') +const ROOT = join(import.meta.dirname, '../../..', '..') /** Copies node-addon-api beside a staged addon, since scratch copies leave the pnpm tree behind. */ export function stageNodeAddonApi(sourceDir, stagedDir) { @@ -31,7 +31,7 @@ export async function nodeGypRebuild({ let environment = process.env if (process.platform === 'win32') { const { initializeWindowsNativeToolchain, mergeWindowsCompilerEnvironment } = - await import('./initialize-windows-native-toolchain.mjs') + await import('../../native-build/windows/initialize-windows-native-toolchain.mjs') const compilerEnvironment = initializeWindowsNativeToolchain() if (compilerEnvironment) { environment = mergeWindowsCompilerEnvironment(environment, compilerEnvironment) diff --git a/config/scripts/orcad-prebuild-node-gyp.test.mjs b/config/scripts/orcad-distribution/prebuilds/orcad-prebuild-node-gyp.test.mjs similarity index 100% rename from config/scripts/orcad-prebuild-node-gyp.test.mjs rename to config/scripts/orcad-distribution/prebuilds/orcad-prebuild-node-gyp.test.mjs diff --git a/config/scripts/orcad-prebuild-slot-contents.mjs b/config/scripts/orcad-distribution/prebuilds/orcad-prebuild-slot-contents.mjs similarity index 97% rename from config/scripts/orcad-prebuild-slot-contents.mjs rename to config/scripts/orcad-distribution/prebuilds/orcad-prebuild-slot-contents.mjs index 3e182b3b6d8..c42dcde114a 100644 --- a/config/scripts/orcad-prebuild-slot-contents.mjs +++ b/config/scripts/orcad-distribution/prebuilds/orcad-prebuild-slot-contents.mjs @@ -35,7 +35,7 @@ export function isCompatSlot(slot) { /** The symbol-floor profile a glibc slot is gated at; the desktop keeps its own 2.31 floor. */ export function slotGlibcFloor(slot) { - const floors = require('./verify-linux-glibc-floor.cjs') + const floors = require('../../native-build/linux/verify-linux-glibc-floor.cjs') return isCompatSlot(slot) ? floors.COMPAT_SLOT_GLIBC_FLOOR : floors.SERVER_SLOT_GLIBC_FLOOR } @@ -141,7 +141,10 @@ export function sha256Of(path) { /** Highest strong `GLIBC_x.y` need across the slot's ELF binaries, e.g. '2.17'. */ export function highestGlibcNeed(binaryPaths, readVersionNeeds) { - const { compareGlibcVersions, parseGlibcVersion } = require('./verify-linux-glibc-floor.cjs') + const { + compareGlibcVersions, + parseGlibcVersion + } = require('../../native-build/linux/verify-linux-glibc-floor.cjs') let highest = null for (const path of binaryPaths) { for (const need of readVersionNeeds(path)) { diff --git a/config/scripts/orcad-prebuild-slot-contents.test.mjs b/config/scripts/orcad-distribution/prebuilds/orcad-prebuild-slot-contents.test.mjs similarity index 98% rename from config/scripts/orcad-prebuild-slot-contents.test.mjs rename to config/scripts/orcad-distribution/prebuilds/orcad-prebuild-slot-contents.test.mjs index 261f89a9370..abc615455d2 100644 --- a/config/scripts/orcad-prebuild-slot-contents.test.mjs +++ b/config/scripts/orcad-distribution/prebuilds/orcad-prebuild-slot-contents.test.mjs @@ -24,9 +24,11 @@ import { import { ORCAD_ADDON_NAPI_VERSION, orcadTemplateTargetFilenames -} from '../../src/shared/orcad-artifacts.ts' +} from '../../../../src/shared/orcad-artifacts.ts' -const floors = createRequire(import.meta.url)('./verify-linux-glibc-floor.cjs') +const floors = createRequire(import.meta.url)( + '../../native-build/linux/verify-linux-glibc-floor.cjs' +) const dirs = [] const temp = () => { const dir = mkdtempSync(join(tmpdir(), 'orcad-slot-contents-')) diff --git a/config/scripts/orcad-prebuild-smoke-child.cjs b/config/scripts/orcad-distribution/prebuilds/orcad-prebuild-smoke-child.cjs similarity index 100% rename from config/scripts/orcad-prebuild-smoke-child.cjs rename to config/scripts/orcad-distribution/prebuilds/orcad-prebuild-smoke-child.cjs diff --git a/config/scripts/orcad-prebuild-smoke.mjs b/config/scripts/orcad-distribution/prebuilds/orcad-prebuild-smoke.mjs similarity index 97% rename from config/scripts/orcad-prebuild-smoke.mjs rename to config/scripts/orcad-distribution/prebuilds/orcad-prebuild-smoke.mjs index e87c62512bc..1c352797f92 100644 --- a/config/scripts/orcad-prebuild-smoke.mjs +++ b/config/scripts/orcad-distribution/prebuilds/orcad-prebuild-smoke.mjs @@ -2,7 +2,7 @@ import { chmodSync, cpSync, existsSync, mkdirSync, rmSync } from 'node:fs' import { createRequire } from 'node:module' import { dirname, join } from 'node:path' -import { NODE_RUNTIME_PIN } from '../../src/shared/node-runtime-pin.ts' +import { NODE_RUNTIME_PIN } from '../../../../src/shared/node-runtime-pin.ts' import { COMPAT_SLOT_ADDONS, findSlotProblems, diff --git a/config/scripts/orcad-windows-prebuild-cache.mjs b/config/scripts/orcad-distribution/prebuilds/orcad-windows-prebuild-cache.mjs similarity index 85% rename from config/scripts/orcad-windows-prebuild-cache.mjs rename to config/scripts/orcad-distribution/prebuilds/orcad-windows-prebuild-cache.mjs index 843102103ac..886784b2251 100644 --- a/config/scripts/orcad-windows-prebuild-cache.mjs +++ b/config/scripts/orcad-distribution/prebuilds/orcad-windows-prebuild-cache.mjs @@ -2,9 +2,9 @@ import { createHash } from 'node:crypto' import { appendFileSync, lstatSync, readFileSync, readdirSync } from 'node:fs' import { createRequire } from 'node:module' import { dirname, join, resolve } from 'node:path' -import { NODE_RUNTIME_PIN } from '../../src/shared/node-runtime-pin.ts' +import { NODE_RUNTIME_PIN } from '../../../../src/shared/node-runtime-pin.ts' import { assertNodePtyPatchApplied } from './build-orcad-prebuilds.mjs' -import { nativeDependencyLockDigest } from './native-dependency-lock-digest.mjs' +import { nativeDependencyLockDigest } from '../../native-build/node-addons/native-dependency-lock-digest.mjs' import { findPostBaselineNodeApiNames, findSlotProblems, @@ -16,8 +16,8 @@ import { } from './orcad-prebuild-slot-contents.mjs' const require = createRequire(import.meta.url) -const root = resolve(import.meta.dirname, '../..') -const ownership = require('./node-pty-job-ownership.cjs') +const root = resolve(import.meta.dirname, '../../../..') +const ownership = require('../../native-build/node-addons/node-pty-job-ownership.cjs') // The locked node-pty and node-gyp closures stand in for pnpm-lock.yaml and package.json. export const WINDOWS_PREBUILD_LOCKED_PACKAGES = ['node-pty', 'node-gyp'] const WINDOWS_PREBUILD_PACKAGE_SCRIPTS = ['build:orcad-prebuilds', 'build:packages'] @@ -25,18 +25,18 @@ export const WINDOWS_PREBUILD_CACHE_INPUTS = [ '.github/actions/prepare-orcad-prebuilds/action.yml', 'config/patches/node-pty@1.1.0.patch', 'src/shared/node-runtime-pin.ts', - 'config/scripts/build-orcad-prebuilds.mjs', - 'config/scripts/orcad-prebuild-node-gyp.mjs', - 'config/scripts/initialize-windows-native-toolchain.mjs', - 'config/scripts/capture-windows-native-environment.cmd', - 'config/scripts/orcad-prebuild-slot-contents.mjs', - 'config/scripts/orcad-windows-prebuild-cache.mjs', - 'config/scripts/native-dependency-lock-digest.mjs', - 'config/scripts/build-workspace-packages.mjs', - 'config/scripts/node-pty-job-ownership.cjs', - 'config/scripts/windows-pe-machine.cjs', - 'config/scripts/pinned-node-downloads.mjs', - 'config/scripts/update-node-runtime-pin.mjs', + 'config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs', + 'config/scripts/orcad-distribution/prebuilds/orcad-prebuild-node-gyp.mjs', + 'config/scripts/native-build/windows/initialize-windows-native-toolchain.mjs', + 'config/scripts/native-build/windows/capture-windows-native-environment.cmd', + 'config/scripts/orcad-distribution/prebuilds/orcad-prebuild-slot-contents.mjs', + 'config/scripts/orcad-distribution/prebuilds/orcad-windows-prebuild-cache.mjs', + 'config/scripts/native-build/node-addons/native-dependency-lock-digest.mjs', + 'config/scripts/workspace-package-build/build-workspace-packages.mjs', + 'config/scripts/native-build/node-addons/node-pty-job-ownership.cjs', + 'config/scripts/native-build/windows/windows-pe-machine.cjs', + 'config/scripts/orcad-distribution/prebuilds/pinned-node-downloads.mjs', + 'config/scripts/node-runtime/archive-identity/update-node-runtime-pin.mjs', 'src/packages/process-host/.gitignore', 'src/packages/process-host/package.json', 'src/packages/process-host/scripts/build-dist.mjs', diff --git a/config/scripts/orcad-windows-prebuild-cache.test.mjs b/config/scripts/orcad-distribution/prebuilds/orcad-windows-prebuild-cache.test.mjs similarity index 96% rename from config/scripts/orcad-windows-prebuild-cache.test.mjs rename to config/scripts/orcad-distribution/prebuilds/orcad-windows-prebuild-cache.test.mjs index 0cfacc1d8a5..c7b4938534c 100644 --- a/config/scripts/orcad-windows-prebuild-cache.test.mjs +++ b/config/scripts/orcad-distribution/prebuilds/orcad-windows-prebuild-cache.test.mjs @@ -11,17 +11,20 @@ import { createRequire } from 'node:module' import { tmpdir } from 'node:os' import { dirname, join, resolve } from 'node:path' import { afterEach, describe, expect, it } from 'vitest' -import { NODE_RUNTIME_PIN } from '../../src/shared/node-runtime-pin.ts' +import { NODE_RUNTIME_PIN } from '../../../../src/shared/node-runtime-pin.ts' import { sha256Of } from './orcad-prebuild-slot-contents.mjs' import { validateWindowsPrebuildCache, windowsPrebuildCacheIdentity, WINDOWS_PREBUILD_CACHE_INPUTS } from './orcad-windows-prebuild-cache.mjs' -import { peImage } from './windows-pe-image-fixture.mjs' +import { peImage } from '../../native-build/windows/windows-pe-image-fixture.mjs' const require = createRequire(import.meta.url) -const { CYGWIN_BREAKAWAY_MARKER, NATIVE_HOST_JOB_MARKER } = require('./node-pty-job-ownership.cjs') +const { + CYGWIN_BREAKAWAY_MARKER, + NATIVE_HOST_JOB_MARKER +} = require('../../native-build/node-addons/node-pty-job-ownership.cjs') const temporary = [] afterEach(() => { for (const dir of temporary.splice(0)) { @@ -243,7 +246,7 @@ describe('Windows server prebuild cache inputs', () => { function repositoryCopy() { const repository = mkdtempSync(join(tmpdir(), 'orca-prebuild-key-')) temporary.push(repository) - const source = resolve(import.meta.dirname, '../..') + const source = resolve(import.meta.dirname, '../../../..') for (const relative of [ ...cacheInputs, 'package.json', diff --git a/config/scripts/orcad-windows-prebuild-workflow.test.mjs b/config/scripts/orcad-distribution/prebuilds/orcad-windows-prebuild-workflow.test.mjs similarity index 89% rename from config/scripts/orcad-windows-prebuild-workflow.test.mjs rename to config/scripts/orcad-distribution/prebuilds/orcad-windows-prebuild-workflow.test.mjs index 90178d1e3ff..9361b39eb4c 100644 --- a/config/scripts/orcad-windows-prebuild-workflow.test.mjs +++ b/config/scripts/orcad-distribution/prebuilds/orcad-windows-prebuild-workflow.test.mjs @@ -77,12 +77,14 @@ describe.skipIf(process.platform === 'win32')('Windows prebuild Bash fallback', expect(result.code).toBe(0) expect(commands.includes('pnpm build:orcad-prebuilds')).toBe(compiles) expect( - commands.includes('node config/scripts/orcad-windows-prebuild-cache.mjs --validate') + commands.includes( + 'node config/scripts/orcad-distribution/prebuilds/orcad-windows-prebuild-cache.mjs --validate' + ) ).toBe(validates) expect(commands.slice(-3)).toEqual([ - 'node config/scripts/build-orcad-prebuilds.mjs --print-slot', - 'node config/scripts/build-orcad-prebuilds.mjs --require-slots win32-x64', - 'node config/scripts/build-orcad-prebuilds.mjs --smoke' + 'node config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs --print-slot', + 'node config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs --require-slots win32-x64', + 'node config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs --smoke' ]) }) diff --git a/config/scripts/pinned-node-downloads.mjs b/config/scripts/orcad-distribution/prebuilds/pinned-node-downloads.mjs similarity index 93% rename from config/scripts/pinned-node-downloads.mjs rename to config/scripts/orcad-distribution/prebuilds/pinned-node-downloads.mjs index 55d30520aca..2dea0d965e2 100644 --- a/config/scripts/pinned-node-downloads.mjs +++ b/config/scripts/orcad-distribution/prebuilds/pinned-node-downloads.mjs @@ -8,11 +8,15 @@ import { nodeRuntimeExecutablePath, nodeRuntimeHeadersUrl, nodeRuntimeReleaseUrl -} from '../../src/shared/node-runtime-pin.ts' -import { isDirectInvocation } from './script-entry-detection.mjs' -import { download, extract, sha256File } from './update-node-runtime-pin.mjs' +} from '../../../../src/shared/node-runtime-pin.ts' +import { isDirectInvocation } from '../../tool-invocation/script-entry-detection.mjs' +import { + download, + extract, + sha256File +} from '../../node-runtime/archive-identity/update-node-runtime-pin.mjs' -const ROOT = resolve(import.meta.dirname, '..', '..') +const ROOT = resolve(import.meta.dirname, '../../..', '..') export function pinnedNodeCacheDir(env = process.env) { return env.ORCA_NODE_RUNTIME_CACHE_DIR || join(ROOT, 'out', 'node-runtime-cache') diff --git a/config/scripts/pinned-node-downloads.test.mjs b/config/scripts/orcad-distribution/prebuilds/pinned-node-downloads.test.mjs similarity index 100% rename from config/scripts/pinned-node-downloads.test.mjs rename to config/scripts/orcad-distribution/prebuilds/pinned-node-downloads.test.mjs diff --git a/config/scripts/server-build-target.mjs b/config/scripts/orcad-distribution/prebuilds/server-build-target.mjs similarity index 100% rename from config/scripts/server-build-target.mjs rename to config/scripts/orcad-distribution/prebuilds/server-build-target.mjs diff --git a/config/scripts/orcad-daemon-protocol-crossing.test.mjs b/config/scripts/orcad-distribution/qualification/orcad-daemon-protocol-crossing.test.mjs similarity index 90% rename from config/scripts/orcad-daemon-protocol-crossing.test.mjs rename to config/scripts/orcad-distribution/qualification/orcad-daemon-protocol-crossing.test.mjs index 131c1d54c57..f3204822059 100644 --- a/config/scripts/orcad-daemon-protocol-crossing.test.mjs +++ b/config/scripts/orcad-distribution/qualification/orcad-daemon-protocol-crossing.test.mjs @@ -6,11 +6,11 @@ import { DAEMON_PROTOCOL_SOURCE_PATH, canAttach, parseDaemonProtocolFacts -} from './daemon-protocol-facts.mjs' -import { CURRENT_ORCAD_DAEMON_PROTOCOL } from '../../src/main/ssh/orcad-daemon-protocol-crossing' -import { assessOrcadRollback, planOrcadUpdate } from '../../src/main/ssh/orcad-update-plan' +} from '../../daemon-protocol/schema-facts/daemon-protocol-facts.mjs' +import { CURRENT_ORCAD_DAEMON_PROTOCOL } from '../../../../src/main/ssh/orcad-daemon-protocol-crossing' +import { assessOrcadRollback, planOrcadUpdate } from '../../../../src/main/ssh/orcad-update-plan' -const projectDir = resolve(import.meta.dirname, '../..') +const projectDir = resolve(import.meta.dirname, '../../../..') const current = parseDaemonProtocolFacts( readFileSync(join(projectDir, DAEMON_PROTOCOL_SOURCE_PATH), 'utf8') ) diff --git a/config/scripts/orcad-terminal-smoke-change-scope.mjs b/config/scripts/orcad-distribution/qualification/orcad-terminal-smoke-change-scope.mjs similarity index 72% rename from config/scripts/orcad-terminal-smoke-change-scope.mjs rename to config/scripts/orcad-distribution/qualification/orcad-terminal-smoke-change-scope.mjs index 45df389a372..a7c95e37f0e 100644 --- a/config/scripts/orcad-terminal-smoke-change-scope.mjs +++ b/config/scripts/orcad-distribution/qualification/orcad-terminal-smoke-change-scope.mjs @@ -1,27 +1,30 @@ import { readFileSync } from 'node:fs' import { pathToFileURL } from 'node:url' -import { classifyNodeServerChanges, collectNodeServerInputs } from './node-server-change-scope.mjs' +import { + classifyNodeServerChanges, + collectNodeServerInputs +} from '../../node-server/qualification/node-server-change-scope.mjs' import { ORCAD_CHILD_ENTRY_POINTS, ORCAD_ENTRY_POINT, ORCAD_LAUNCHER_ENTRY_POINT -} from './orcad-entry-build.mjs' +} from '../server-bundle/orcad-entry-build.mjs' const ENTRY_POINTS = [ ORCAD_ENTRY_POINT, ORCAD_LAUNCHER_ENTRY_POINT, ...Object.values(ORCAD_CHILD_ENTRY_POINTS), 'src/cli/index.ts', - 'config/scripts/build-orcad-node.mjs', - 'config/scripts/build-orcad-prebuilds.mjs', - 'config/scripts/build-orcad.mjs', - 'config/scripts/ensure-native-runtime.mjs', - 'config/scripts/rebuild-native-deps.mjs', + 'config/scripts/orcad-distribution/prebuilds/build-orcad-node.mjs', + 'config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs', + 'config/scripts/orcad-distribution/server-bundle/build-orcad.mjs', + 'config/scripts/native-build/node-addons/ensure-native-runtime.mjs', + 'config/scripts/native-build/node-addons/rebuild-native-deps.mjs', 'config/scripts/verify-cli-bin.mjs', 'config/scripts/install-dev-cli.mjs', 'config/scripts/orca-dev.mjs', 'config/scripts/runtime-serve-terminal-smoke.mjs', - 'config/scripts/orcad-terminal-smoke-change-scope.mjs' + 'config/scripts/orcad-distribution/qualification/orcad-terminal-smoke-change-scope.mjs' ] export function collectOrcadTerminalSmokeInputs() { @@ -37,6 +40,7 @@ export async function classifyOrcadTerminalSmokeChanges( ENTRY_POINTS.includes(file) || file === '.github/workflows/pr.yml' || file.startsWith('config/scripts/orcad-terminal-smoke-') || + file.startsWith('config/scripts/orcad-distribution/qualification/orcad-terminal-smoke-') || file.startsWith('config/scripts/runtime-serve-terminal-smoke') || // createRequire-loaded native probes are invisible to esbuild's import graph. (file.startsWith('config/scripts/') && file.endsWith('.cjs')) || diff --git a/config/scripts/orcad-terminal-smoke-change-scope.test.mjs b/config/scripts/orcad-distribution/qualification/orcad-terminal-smoke-change-scope.test.mjs similarity index 83% rename from config/scripts/orcad-terminal-smoke-change-scope.test.mjs rename to config/scripts/orcad-distribution/qualification/orcad-terminal-smoke-change-scope.test.mjs index 04d048c2c45..df77a4ed87e 100644 --- a/config/scripts/orcad-terminal-smoke-change-scope.test.mjs +++ b/config/scripts/orcad-distribution/qualification/orcad-terminal-smoke-change-scope.test.mjs @@ -3,7 +3,7 @@ import { classifyOrcadTerminalSmokeChanges, collectOrcadTerminalSmokeInputs } from './orcad-terminal-smoke-change-scope.mjs' -import { ORCAD_CHILD_ENTRY_POINTS } from './orcad-entry-build.mjs' +import { ORCAD_CHILD_ENTRY_POINTS } from '../server-bundle/orcad-entry-build.mjs' it.each([ 'package.json', @@ -12,7 +12,7 @@ it.each([ 'config/tsconfig.cli.json', 'config/patches/node-pty@1.1.0.patch', 'native/windows-registry/src/addon.cc', - 'config/scripts/node-pty-job-ownership.cjs', + 'config/scripts/native-build/node-addons/node-pty-job-ownership.cjs', '.github/actions/install-node-dependencies/action.yml', '.github/workflows/pr.yml', 'src/cli/deleted-command.ts', @@ -20,7 +20,7 @@ it.each([ 'src/main/persistence/profile-state/new-worker.ts', 'resources/licenses/ripgrep/COPYING', 'config/scripts/runtime-serve-terminal-smoke.test.mjs', - 'config/scripts/orcad-terminal-smoke-change-scope.test.mjs' + 'config/scripts/orcad-distribution/qualification/orcad-terminal-smoke-change-scope.test.mjs' ])('retains the smoke for build and dynamically opened input changes: %s', async (file) => { expect((await classifyOrcadTerminalSmokeChanges([file], async () => new Set())).shouldRun).toBe( true @@ -49,12 +49,12 @@ describe('the actual terminal smoke dependency graph', () => { 'src/main/worker-threads/worker-thread-entry-path.ts', 'src/cli/index.ts', 'config/scripts/runtime-serve-terminal-smoke.mjs', - 'config/scripts/build-orcad-node.mjs', - 'config/scripts/build-orcad.mjs', - 'config/scripts/profile-state-worker-smoke.mjs', + 'config/scripts/orcad-distribution/prebuilds/build-orcad-node.mjs', + 'config/scripts/orcad-distribution/server-bundle/build-orcad.mjs', + 'config/scripts/orcad-distribution/server-bundle/profile-state-worker-smoke.mjs', 'config/scripts/install-dev-cli.mjs', 'config/scripts/verify-cli-bin.mjs', - 'config/scripts/node-server-change-scope.mjs' + 'config/scripts/node-server/qualification/node-server-change-scope.mjs' ])('retains the runtime, CLI, build or smoke dependency: %s', async (file) => { expect(inputs.has(file)).toBe(true) expect((await classifyOrcadTerminalSmokeChanges([file], async () => inputs)).shouldRun).toBe( diff --git a/config/scripts/build-orcad.mjs b/config/scripts/orcad-distribution/server-bundle/build-orcad.mjs similarity index 96% rename from config/scripts/build-orcad.mjs rename to config/scripts/orcad-distribution/server-bundle/build-orcad.mjs index e00b67c8105..3ce66c06bac 100644 --- a/config/scripts/build-orcad.mjs +++ b/config/scripts/orcad-distribution/server-bundle/build-orcad.mjs @@ -53,18 +53,18 @@ import { ORCAD_VERSION_FILENAME, orcadNodePtySlotFiles, orcadRipgrepArtifact -} from '../../src/shared/orcad-artifacts.ts' +} from '../../../../src/shared/orcad-artifacts.ts' import { computeOrcadFullVersion } from './orcad-artifact-version.mjs' -import { NODE_RUNTIME_ASSETS, NODE_RUNTIME_PIN } from '../../src/shared/node-runtime-pin.ts' -import { findSlotProblems, readManifest } from './orcad-prebuild-slot-contents.mjs' -import { orcadAgentBrowserNativeName } from '../../src/shared/orcad-agent-browser-name.ts' +import { NODE_RUNTIME_ASSETS, NODE_RUNTIME_PIN } from '../../../../src/shared/node-runtime-pin.ts' +import { findSlotProblems, readManifest } from '../prebuilds/orcad-prebuild-slot-contents.mjs' +import { orcadAgentBrowserNativeName } from '../../../../src/shared/orcad-agent-browser-name.ts' import { runProcessSync } from '@orca/process-host' -import { describeProcessFailure } from './process-failure-message.mjs' -import { resolveBuildSourceCommit } from './build-source-commit.mjs' +import { describeProcessFailure } from '../../tool-invocation/process-failure-message.mjs' +import { resolveBuildSourceCommit } from '../../build-identity/build-source-commit.mjs' -const { darkBuildMarkers } = createRequire(import.meta.url)('../dark-build-switches.cjs') +const { darkBuildMarkers } = createRequire(import.meta.url)('../../../dark-build-switches.cjs') -const ROOT = join(import.meta.dirname, '..', '..') +const ROOT = join(import.meta.dirname, '../../..', '..') const OUT_DIR = process.env.ORCAD_OUT_DIR ? resolve(process.env.ORCAD_OUT_DIR) : join(ROOT, 'out', 'orcad') diff --git a/config/scripts/foreign-sqlite-reader-worker-smoke.mjs b/config/scripts/orcad-distribution/server-bundle/foreign-sqlite-reader-worker-smoke.mjs similarity index 94% rename from config/scripts/foreign-sqlite-reader-worker-smoke.mjs rename to config/scripts/orcad-distribution/server-bundle/foreign-sqlite-reader-worker-smoke.mjs index bbc53e75c4a..9072ad16bbc 100644 --- a/config/scripts/foreign-sqlite-reader-worker-smoke.mjs +++ b/config/scripts/orcad-distribution/server-bundle/foreign-sqlite-reader-worker-smoke.mjs @@ -2,8 +2,8 @@ import { mkdtempSync, rmSync, writeFileSync } from 'node:fs' import { tmpdir } from 'node:os' import { join, resolve } from 'node:path' import { runProcessSync } from '@orca/process-host' -import { describeProcessFailure } from './process-failure-message.mjs' -import { ORCAD_FOREIGN_SQLITE_READER_ENTRY } from '../../src/shared/orcad-artifacts.ts' +import { describeProcessFailure } from '../../tool-invocation/process-failure-message.mjs' +import { ORCAD_FOREIGN_SQLITE_READER_ENTRY } from '../../../../src/shared/orcad-artifacts.ts' // Run reads in child under the runtime orcad ships, which may differ from build Node; trust exit status, not output. const PROBE = ` diff --git a/config/scripts/foreign-sqlite-reader-worker-smoke.test.mjs b/config/scripts/orcad-distribution/server-bundle/foreign-sqlite-reader-worker-smoke.test.mjs similarity index 100% rename from config/scripts/foreign-sqlite-reader-worker-smoke.test.mjs rename to config/scripts/orcad-distribution/server-bundle/foreign-sqlite-reader-worker-smoke.test.mjs diff --git a/config/scripts/orcad-artifact-version.mjs b/config/scripts/orcad-distribution/server-bundle/orcad-artifact-version.mjs similarity index 91% rename from config/scripts/orcad-artifact-version.mjs rename to config/scripts/orcad-distribution/server-bundle/orcad-artifact-version.mjs index 91e32c3c5a3..f066ce3a983 100644 --- a/config/scripts/orcad-artifact-version.mjs +++ b/config/scripts/orcad-distribution/server-bundle/orcad-artifact-version.mjs @@ -1,7 +1,7 @@ import { createHash } from 'node:crypto' import { existsSync, readFileSync } from 'node:fs' import { join } from 'node:path' -import { ORCAD_VERSION, orcadArtifactFilenames } from '../../src/shared/orcad-artifacts.ts' +import { ORCAD_VERSION, orcadArtifactFilenames } from '../../../../src/shared/orcad-artifacts.ts' import { readOrcadMobileWebAssetFilenames } from './orcad-mobile-web-bundle.mjs' /** The runtime enters through `.runtime-node`'s executableSha256 string, never its bytes (design D2). */ diff --git a/config/scripts/orcad-artifact-version.test.mjs b/config/scripts/orcad-distribution/server-bundle/orcad-artifact-version.test.mjs similarity index 92% rename from config/scripts/orcad-artifact-version.test.mjs rename to config/scripts/orcad-distribution/server-bundle/orcad-artifact-version.test.mjs index 88a187e80ba..096ba9efc93 100644 --- a/config/scripts/orcad-artifact-version.test.mjs +++ b/config/scripts/orcad-distribution/server-bundle/orcad-artifact-version.test.mjs @@ -8,10 +8,10 @@ import { ORCAD_SERVER_TARGET_FILENAME, orcadArtifactFilenames, orcadRipgrepArtifact -} from '../../src/shared/orcad-artifacts.ts' -import { SERVER_TARGETS } from '../../src/shared/node-runtime-pin.ts' -import { orcadAgentBrowserNativeName } from '../../src/shared/orcad-agent-browser-name.ts' -import { readOrcadArtifactIdentity } from '../../src/main/orcad/orcad-artifact-identity.ts' +} from '../../../../src/shared/orcad-artifacts.ts' +import { SERVER_TARGETS } from '../../../../src/shared/node-runtime-pin.ts' +import { orcadAgentBrowserNativeName } from '../../../../src/shared/orcad-agent-browser-name.ts' +import { readOrcadArtifactIdentity } from '../../../../src/main/orcad/orcad-artifact-identity.ts' import { computeOrcadFullVersion } from './orcad-artifact-version.mjs' const directories = [] diff --git a/config/scripts/orcad-entry-build.mjs b/config/scripts/orcad-distribution/server-bundle/orcad-entry-build.mjs similarity index 97% rename from config/scripts/orcad-entry-build.mjs rename to config/scripts/orcad-distribution/server-bundle/orcad-entry-build.mjs index d73f842d635..7941af9b0df 100644 --- a/config/scripts/orcad-entry-build.mjs +++ b/config/scripts/orcad-distribution/server-bundle/orcad-entry-build.mjs @@ -3,10 +3,12 @@ import { createHash } from 'node:crypto' import { readFileSync, rmSync, writeFileSync } from 'node:fs' import { createRequire } from 'node:module' import { basename, dirname, join } from 'node:path' -import { ORCAD_SERVER_ENTRY_FILENAME } from '../../src/shared/orcad-artifacts.ts' +import { ORCAD_SERVER_ENTRY_FILENAME } from '../../../../src/shared/orcad-artifacts.ts' -const root = join(import.meta.dirname, '..', '..') -const { turnedOnDarkBuildDefines } = createRequire(import.meta.url)('../dark-build-switches.cjs') +const root = join(import.meta.dirname, '../../..', '..') +const { turnedOnDarkBuildDefines } = createRequire(import.meta.url)( + '../../../dark-build-switches.cjs' +) export const ORCAD_ENTRY_POINT = 'src/main/orcad/main.ts' export const ORCAD_LAUNCHER_ENTRY_POINT = 'src/main/orcad/launcher.ts' diff --git a/config/scripts/orcad-entry-build.test.mjs b/config/scripts/orcad-distribution/server-bundle/orcad-entry-build.test.mjs similarity index 100% rename from config/scripts/orcad-entry-build.test.mjs rename to config/scripts/orcad-distribution/server-bundle/orcad-entry-build.test.mjs diff --git a/config/scripts/orcad-linear-sdk-package.mjs b/config/scripts/orcad-distribution/server-bundle/orcad-linear-sdk-package.mjs similarity index 89% rename from config/scripts/orcad-linear-sdk-package.mjs rename to config/scripts/orcad-distribution/server-bundle/orcad-linear-sdk-package.mjs index abcc17932dd..c9681534ec4 100644 --- a/config/scripts/orcad-linear-sdk-package.mjs +++ b/config/scripts/orcad-distribution/server-bundle/orcad-linear-sdk-package.mjs @@ -1,6 +1,6 @@ import { build } from 'esbuild' import { join } from 'node:path' -import { ORCAD_LINEAR_SDK_ENTRY } from '../../src/shared/orcad-artifacts.ts' +import { ORCAD_LINEAR_SDK_ENTRY } from '../../../../src/shared/orcad-artifacts.ts' import { ORCAD_SERVER_BUILD_TARGET } from './orcad-entry-build.mjs' // Bundle @linear/sdk into one CJS file for lazy require: copying would expose chunk names that change each release. diff --git a/config/scripts/orcad-linear-sdk-package.test.mjs b/config/scripts/orcad-distribution/server-bundle/orcad-linear-sdk-package.test.mjs similarity index 94% rename from config/scripts/orcad-linear-sdk-package.test.mjs rename to config/scripts/orcad-distribution/server-bundle/orcad-linear-sdk-package.test.mjs index d5f4f5010f9..6112ea6540b 100644 --- a/config/scripts/orcad-linear-sdk-package.test.mjs +++ b/config/scripts/orcad-distribution/server-bundle/orcad-linear-sdk-package.test.mjs @@ -7,10 +7,10 @@ import { ORCAD_ARTIFACTS, ORCAD_LINEAR_SDK_ENTRY, ORCAD_SERVER_ENTRY_FILENAME -} from '../../src/shared/orcad-artifacts.ts' +} from '../../../../src/shared/orcad-artifacts.ts' import { stageOrcadLinearSdk } from './orcad-linear-sdk-package.mjs' -const root = join(import.meta.dirname, '..', '..') +const root = join(import.meta.dirname, '../../..', '..') // Outside the repo, so Node cannot fall back to the checkout's node_modules. const deployment = realpathSync(mkdtempSync(join(tmpdir(), 'orcad-linear-sdk-'))) diff --git a/config/scripts/orcad-mobile-web-bundle.mjs b/config/scripts/orcad-distribution/server-bundle/orcad-mobile-web-bundle.mjs similarity index 86% rename from config/scripts/orcad-mobile-web-bundle.mjs rename to config/scripts/orcad-distribution/server-bundle/orcad-mobile-web-bundle.mjs index 6b8fa72137e..dd94c56f62e 100644 --- a/config/scripts/orcad-mobile-web-bundle.mjs +++ b/config/scripts/orcad-distribution/server-bundle/orcad-mobile-web-bundle.mjs @@ -5,13 +5,13 @@ import { ORCAD_MOBILE_WEB_DIR, ORCAD_MOBILE_WEB_MANIFEST, orcadMobileWebAssetFilenames -} from '../../src/shared/orcad-artifacts.ts' +} from '../../../../src/shared/orcad-artifacts.ts' const { MOBILE_WEB_BUNDLE_DIR, assertMobileWebBundleBuilt } = createRequire(import.meta.url)( - './verify-packaged-mobile-web-bundle.cjs' + '../../desktop-distribution/runtime-verification/verify-packaged-mobile-web-bundle.cjs' ) const { assertNoDarkOutputOfOffSwitches } = createRequire(import.meta.url)( - '../dark-build-switches.cjs' + '../../../dark-build-switches.cjs' ) // Require a fresh built page as beforePack does: an orcad package without it cannot serve phones. diff --git a/config/scripts/orcad-mobile-web-bundle.test.mjs b/config/scripts/orcad-distribution/server-bundle/orcad-mobile-web-bundle.test.mjs similarity index 89% rename from config/scripts/orcad-mobile-web-bundle.test.mjs rename to config/scripts/orcad-distribution/server-bundle/orcad-mobile-web-bundle.test.mjs index f1a0e8b76e7..156b1b095e2 100644 --- a/config/scripts/orcad-mobile-web-bundle.test.mjs +++ b/config/scripts/orcad-distribution/server-bundle/orcad-mobile-web-bundle.test.mjs @@ -3,8 +3,8 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { parse } from 'yaml' import { afterEach, beforeEach, expect, it, vi } from 'vitest' -import { ORCAD_MOBILE_WEB_MANIFEST } from '../../src/shared/orcad-artifacts.ts' -import { writeMobileWebBundleFixtureTree } from './mobile-web-bundle-fixture-tree.mjs' +import { ORCAD_MOBILE_WEB_MANIFEST } from '../../../../src/shared/orcad-artifacts.ts' +import { writeMobileWebBundleFixtureTree } from '../../build/mobile-web-app/mobile-web-bundle-fixture-tree.mjs' import { readOrcadMobileWebAssetFilenames, stageOrcadMobileWebBundle @@ -62,7 +62,10 @@ it('fails the build when the page was never built', () => { it('ships the page the qualification lanes tested in the release template', () => { const workflow = parse( - readFileSync(new URL('../../.github/workflows/node-server-tests.yml', import.meta.url), 'utf8') + readFileSync( + new URL('../../../../.github/workflows/node-server-tests.yml', import.meta.url), + 'utf8' + ) ) const template = workflow.jobs.desktop_template const wait = template.steps.findIndex( diff --git a/config/scripts/orcad-watcher-package.mjs b/config/scripts/orcad-distribution/server-bundle/orcad-watcher-package.mjs similarity index 95% rename from config/scripts/orcad-watcher-package.mjs rename to config/scripts/orcad-distribution/server-bundle/orcad-watcher-package.mjs index e1c8625ad4e..f73f7b9f324 100644 --- a/config/scripts/orcad-watcher-package.mjs +++ b/config/scripts/orcad-distribution/server-bundle/orcad-watcher-package.mjs @@ -4,9 +4,9 @@ import { createRequire } from 'node:module' import { join, resolve } from 'node:path' import { x as extractTar } from 'tar' import { parseAllDocuments } from 'yaml' -import { SERVER_TARGETS } from '../../src/shared/node-runtime-pin.ts' +import { SERVER_TARGETS } from '../../../../src/shared/node-runtime-pin.ts' -const root = resolve(import.meta.dirname, '../..') +const root = resolve(import.meta.dirname, '../../../..') const require = createRequire(import.meta.url) const archiveLimit = 16 * 1024 * 1024 diff --git a/config/scripts/orcad-watcher-package.test.mjs b/config/scripts/orcad-distribution/server-bundle/orcad-watcher-package.test.mjs similarity index 100% rename from config/scripts/orcad-watcher-package.test.mjs rename to config/scripts/orcad-distribution/server-bundle/orcad-watcher-package.test.mjs diff --git a/config/scripts/orcad-windows-cli-launcher.mjs b/config/scripts/orcad-distribution/server-bundle/orcad-windows-cli-launcher.mjs similarity index 83% rename from config/scripts/orcad-windows-cli-launcher.mjs rename to config/scripts/orcad-distribution/server-bundle/orcad-windows-cli-launcher.mjs index 14339045317..1d04e8f3928 100644 --- a/config/scripts/orcad-windows-cli-launcher.mjs +++ b/config/scripts/orcad-distribution/server-bundle/orcad-windows-cli-launcher.mjs @@ -2,10 +2,10 @@ import { copyFileSync, existsSync, mkdirSync } from 'node:fs' import { createRequire } from 'node:module' import { dirname, join } from 'node:path' import { runProcessSync } from '@orca/process-host' -import { ORCAD_WINDOWS_CLI_LAUNCHER_FILENAME } from '../../src/shared/orcad-artifacts.ts' +import { ORCAD_WINDOWS_CLI_LAUNCHER_FILENAME } from '../../../../src/shared/orcad-artifacts.ts' const { PE_MACHINE, describePeMachine, readPeMachine } = createRequire(import.meta.url)( - './windows-pe-machine.cjs' + '../../native-build/windows/windows-pe-machine.cjs' ) export function orcadWindowsCliLauncherSource(root, arch) { @@ -29,7 +29,7 @@ export function stageOrcadWindowsCliLauncher( if (host.platform !== 'win32') { throw new Error( `Orcad ${target} requires the native CLI launcher. On Windows, run: ` + - `node config/scripts/build-windows-cli-launcher.mjs --arch ${arch} --output ${source}` + `node config/scripts/native-build/windows/build-windows-cli-launcher.mjs --arch ${arch} --output ${source}` ) } compile(root, arch, source) @@ -47,7 +47,7 @@ function compileOrcadWindowsCliLauncher(root, arch, output) { const result = runProcessSync({ program: process.execPath, args: [ - join(root, 'config/scripts/build-windows-cli-launcher.mjs'), + join(root, 'config/scripts/native-build/windows/build-windows-cli-launcher.mjs'), '--arch', arch, '--output', diff --git a/config/scripts/orcad-windows-cli-launcher.test.mjs b/config/scripts/orcad-distribution/server-bundle/orcad-windows-cli-launcher.test.mjs similarity index 100% rename from config/scripts/orcad-windows-cli-launcher.test.mjs rename to config/scripts/orcad-distribution/server-bundle/orcad-windows-cli-launcher.test.mjs diff --git a/config/scripts/orcad-windows-process-tree.mjs b/config/scripts/orcad-distribution/server-bundle/orcad-windows-process-tree.mjs similarity index 80% rename from config/scripts/orcad-windows-process-tree.mjs rename to config/scripts/orcad-distribution/server-bundle/orcad-windows-process-tree.mjs index 54c2a19e33f..39d95012af6 100644 --- a/config/scripts/orcad-windows-process-tree.mjs +++ b/config/scripts/orcad-distribution/server-bundle/orcad-windows-process-tree.mjs @@ -1,14 +1,14 @@ import { copyFileSync, lstatSync } from 'node:fs' import { createRequire } from 'node:module' import { join } from 'node:path' -import { ORCAD_WINDOWS_PROCESS_TREE_FILENAME } from '../../src/shared/orcad-artifacts.ts' +import { ORCAD_WINDOWS_PROCESS_TREE_FILENAME } from '../../../../src/shared/orcad-artifacts.ts' import { inspectWindowsProcessTreeAddon, windowsProcessTreeAddonPath -} from './windows-process-tree-gyp-rebuild.mjs' +} from '../../native-build/windows/windows-process-tree-gyp-rebuild.mjs' const { PE_MACHINE, describePeMachine, readPeMachine } = createRequire(import.meta.url)( - './windows-pe-machine.cjs' + '../../native-build/windows/windows-pe-machine.cjs' ) export function stageOrcadWindowsProcessTree( @@ -37,7 +37,7 @@ export function stageOrcadWindowsProcessTree( if (inspectWindowsProcessTreeAddon(source) !== 'clean') { throw new Error( `Orcad ${target} requires a patched process reader. On Windows, run: ` + - `node config/scripts/build-windows-process-tree-addon.mjs --arch=${arch}` + `node config/scripts/native-build/windows/build-windows-process-tree-addon.mjs --arch=${arch}` ) } const machine = readPeMachine(source) diff --git a/config/scripts/orcad-windows-process-tree.test.mjs b/config/scripts/orcad-distribution/server-bundle/orcad-windows-process-tree.test.mjs similarity index 97% rename from config/scripts/orcad-windows-process-tree.test.mjs rename to config/scripts/orcad-distribution/server-bundle/orcad-windows-process-tree.test.mjs index acc53f27194..1f249395bdd 100644 --- a/config/scripts/orcad-windows-process-tree.test.mjs +++ b/config/scripts/orcad-distribution/server-bundle/orcad-windows-process-tree.test.mjs @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, expect, it } from 'vitest' import { stageOrcadWindowsProcessTree } from './orcad-windows-process-tree.mjs' -import { windowsProcessTreeAddonPath } from './windows-process-tree-gyp-rebuild.mjs' +import { windowsProcessTreeAddonPath } from '../../native-build/windows/windows-process-tree-gyp-rebuild.mjs' const windowsHost = { platform: 'win32', arch: 'x64' } diff --git a/config/scripts/orcad-windows-security.mjs b/config/scripts/orcad-distribution/server-bundle/orcad-windows-security.mjs similarity index 79% rename from config/scripts/orcad-windows-security.mjs rename to config/scripts/orcad-distribution/server-bundle/orcad-windows-security.mjs index 4551bed9e26..47dec52eaec 100644 --- a/config/scripts/orcad-windows-security.mjs +++ b/config/scripts/orcad-distribution/server-bundle/orcad-windows-security.mjs @@ -2,11 +2,11 @@ import { copyFileSync, existsSync } from 'node:fs' import { createRequire } from 'node:module' import { join } from 'node:path' import { runProcessSync } from '@orca/process-host' -import { ORCAD_WINDOWS_SECURITY_FILENAME } from '../../src/shared/orcad-artifacts.ts' -import { windowsSecurityAddonOutput } from './build-windows-security-addon.mjs' +import { ORCAD_WINDOWS_SECURITY_FILENAME } from '../../../../src/shared/orcad-artifacts.ts' +import { windowsSecurityAddonOutput } from '../../native-build/windows/build-windows-security-addon.mjs' const { PE_MACHINE, describePeMachine, readPeMachine } = createRequire(import.meta.url)( - './windows-pe-machine.cjs' + '../../native-build/windows/windows-pe-machine.cjs' ) // ACL addon is required: missing it makes orcad’s data-root privacy check fail closed before Windows startup. @@ -27,7 +27,7 @@ export function stageOrcadWindowsSecurity( if (host.platform !== 'win32') { throw new Error( `Orcad ${target} requires the Windows security addon. On Windows, run: ` + - `node config/scripts/build-windows-security-addon.mjs --arch=${arch}` + `node config/scripts/native-build/windows/build-windows-security-addon.mjs --arch=${arch}` ) } compile(root, arch, options) @@ -47,7 +47,7 @@ function compileOrcadWindowsSecurity( const result = run({ program: process.execPath, args: [ - join(root, 'config/scripts/build-windows-security-addon.mjs'), + join(root, 'config/scripts/native-build/windows/build-windows-security-addon.mjs'), `--arch=${arch}`, ...(enabled && runtimePath ? ['--reuse-prepared-runtime', `--node-runtime=${runtimePath}`] diff --git a/config/scripts/orcad-windows-security.test.mjs b/config/scripts/orcad-distribution/server-bundle/orcad-windows-security.test.mjs similarity index 96% rename from config/scripts/orcad-windows-security.test.mjs rename to config/scripts/orcad-distribution/server-bundle/orcad-windows-security.test.mjs index 22be738c99c..ebe9818810c 100644 --- a/config/scripts/orcad-windows-security.test.mjs +++ b/config/scripts/orcad-distribution/server-bundle/orcad-windows-security.test.mjs @@ -2,7 +2,7 @@ import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync import { tmpdir } from 'node:os' import { dirname, join } from 'node:path' import { afterEach, expect, it, vi } from 'vitest' -import { windowsSecurityAddonOutput } from './build-windows-security-addon.mjs' +import { windowsSecurityAddonOutput } from '../../native-build/windows/build-windows-security-addon.mjs' import { stageOrcadWindowsSecurity } from './orcad-windows-security.mjs' const roots = [] diff --git a/config/scripts/profile-state-worker-smoke.mjs b/config/scripts/orcad-distribution/server-bundle/profile-state-worker-smoke.mjs similarity index 93% rename from config/scripts/profile-state-worker-smoke.mjs rename to config/scripts/orcad-distribution/server-bundle/profile-state-worker-smoke.mjs index 56025417139..8467030acc5 100644 --- a/config/scripts/profile-state-worker-smoke.mjs +++ b/config/scripts/orcad-distribution/server-bundle/profile-state-worker-smoke.mjs @@ -7,13 +7,13 @@ import { tmpdir } from 'node:os' import { join, resolve } from 'node:path' import { Worker } from 'node:worker_threads' import { runProcessSync } from '@orca/process-host' -import { describeProcessFailure } from './process-failure-message.mjs' +import { describeProcessFailure } from '../../tool-invocation/process-failure-message.mjs' import { ORCAD_PROFILE_PREFLIGHT_FLAG, parseOrcadProfilePreflight -} from '../../src/shared/orcad-profile-preflight.ts' -import { ORCAD_SERVER_ENTRY_FILENAME } from '../../src/shared/orcad-artifacts.ts' -import { NODE_RUNTIME_PIN } from '../../src/shared/node-runtime-pin.ts' +} from '../../../../src/shared/orcad-profile-preflight.ts' +import { ORCAD_SERVER_ENTRY_FILENAME } from '../../../../src/shared/orcad-artifacts.ts' +import { NODE_RUNTIME_PIN } from '../../../../src/shared/node-runtime-pin.ts' async function initializeFixture(directory, databasePath, profileId) { const fixture = join(directory, 'initialize.cjs') @@ -21,7 +21,7 @@ async function initializeFixture(directory, databasePath, profileId) { stdin: { contents: `import { openProfileStateDatabase } from './src/main/persistence/profile-state/profile-state-database'; export function initialize(path, profileId) { openProfileStateDatabase(path, profileId).db.close() }`, - resolveDir: resolve(import.meta.dirname, '../..'), + resolveDir: resolve(import.meta.dirname, '../../../..'), sourcefile: 'profile-state-build-fixture.ts' }, outfile: fixture, diff --git a/config/scripts/profile-state-worker-smoke.test.mjs b/config/scripts/orcad-distribution/server-bundle/profile-state-worker-smoke.test.mjs similarity index 100% rename from config/scripts/profile-state-worker-smoke.test.mjs rename to config/scripts/orcad-distribution/server-bundle/profile-state-worker-smoke.test.mjs diff --git a/config/scripts/session-scanner-service-smoke.mjs b/config/scripts/orcad-distribution/server-bundle/session-scanner-service-smoke.mjs similarity index 91% rename from config/scripts/session-scanner-service-smoke.mjs rename to config/scripts/orcad-distribution/server-bundle/session-scanner-service-smoke.mjs index 1051a17d101..6cb5feeae04 100644 --- a/config/scripts/session-scanner-service-smoke.mjs +++ b/config/scripts/orcad-distribution/server-bundle/session-scanner-service-smoke.mjs @@ -2,9 +2,9 @@ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs' import { tmpdir } from 'node:os' import { join, resolve } from 'node:path' import { runProcessSync } from '@orca/process-host' -import { describeProcessFailure } from './process-failure-message.mjs' -import { ORCAD_SESSION_SCANNER_SERVICE_ENTRY } from '../../src/shared/orcad-artifacts.ts' -import { AI_VAULT_SERVICE_PROTOCOL_VERSION } from '../../src/main/ai-vault/scan-service/session-scanner-service-protocol.ts' +import { describeProcessFailure } from '../../tool-invocation/process-failure-message.mjs' +import { ORCAD_SESSION_SCANNER_SERVICE_ENTRY } from '../../../../src/shared/orcad-artifacts.ts' +import { AI_VAULT_SERVICE_PROTOCOL_VERSION } from '../../../../src/main/ai-vault/scan-service/session-scanner-service-protocol.ts' // Probe forks with shipped runtime’s execPath; judge exit code, never matched output. const PROBE = ` diff --git a/config/scripts/session-scanner-service-smoke.test.mjs b/config/scripts/orcad-distribution/server-bundle/session-scanner-service-smoke.test.mjs similarity index 100% rename from config/scripts/session-scanner-service-smoke.test.mjs rename to config/scripts/orcad-distribution/server-bundle/session-scanner-service-smoke.test.mjs diff --git a/config/scripts/build-orcad-template.mjs b/config/scripts/orcad-distribution/template/build-orcad-template.mjs similarity index 92% rename from config/scripts/build-orcad-template.mjs rename to config/scripts/orcad-distribution/template/build-orcad-template.mjs index 7dd1d610c84..f28a31aee21 100644 --- a/config/scripts/build-orcad-template.mjs +++ b/config/scripts/orcad-distribution/template/build-orcad-template.mjs @@ -20,27 +20,27 @@ import { orcadNodePtySlotFiles, orcadTemplateCommonFilenames, orcadTemplateTargetFilenames -} from '../../src/shared/orcad-artifacts.ts' -import { orcadAgentBrowserNativeName } from '../../src/shared/orcad-agent-browser-name.ts' +} from '../../../../src/shared/orcad-artifacts.ts' +import { orcadAgentBrowserNativeName } from '../../../../src/shared/orcad-agent-browser-name.ts' import { COMPAT_SERVER_TARGET_BASES, COMPAT_SERVER_TARGETS, ORCAD_TEMPLATE_TARGETS, pinnedNodeRuntimeAsset -} from '../../src/shared/node-runtime-pin.ts' -import { ORCAD_PREBUILDS_DIR } from './build-orcad-prebuilds.mjs' +} from '../../../../src/shared/node-runtime-pin.ts' +import { ORCAD_PREBUILDS_DIR } from '../prebuilds/build-orcad-prebuilds.mjs' import { COMPAT_SLOT_ADDONS, findCompatAddonGaps, findSlotProblems, readManifest -} from './orcad-prebuild-slot-contents.mjs' +} from '../prebuilds/orcad-prebuild-slot-contents.mjs' import { runProcessSync } from '@orca/process-host' import { verifyPackagedOrcadTemplate } from './verify-packaged-orcad-template.cjs' -import { readOrcadMobileWebAssetFilenames } from './orcad-mobile-web-bundle.mjs' -import { assertNotDarkBuild, darkBuildMarkers } from '../dark-build-switches.cjs' +import { readOrcadMobileWebAssetFilenames } from '../server-bundle/orcad-mobile-web-bundle.mjs' +import { assertNotDarkBuild, darkBuildMarkers } from '../../../dark-build-switches.cjs' -const root = resolve(import.meta.dirname, '../..') +const root = resolve(import.meta.dirname, '../../../..') const outputDir = join(root, 'out', 'orcad-template') const buildDir = join(root, 'out', '.orcad-template-build') @@ -66,7 +66,7 @@ function buildTargetPackage(target) { const result = runProcessSync({ program: process.execPath, args: [ - join(root, 'config/scripts/build-orcad-node.mjs'), + join(root, 'config/scripts/orcad-distribution/prebuilds/build-orcad-node.mjs'), '--target', target, '--out-dir', diff --git a/config/scripts/build-orcad-template.test.mjs b/config/scripts/orcad-distribution/template/build-orcad-template.test.mjs similarity index 95% rename from config/scripts/build-orcad-template.test.mjs rename to config/scripts/orcad-distribution/template/build-orcad-template.test.mjs index f39cb62879f..244d9c75b84 100644 --- a/config/scripts/build-orcad-template.test.mjs +++ b/config/scripts/orcad-distribution/template/build-orcad-template.test.mjs @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest' -import { ORCAD_TEMPLATE_TARGETS } from '../../src/shared/node-runtime-pin.ts' +import { ORCAD_TEMPLATE_TARGETS } from '../../../../src/shared/node-runtime-pin.ts' import { assertTemplateBuildAllowed, requestedTemplateTargets } from './build-orcad-template.mjs' describe('requestedTemplateTargets', () => { diff --git a/config/scripts/compact-packaged-orcad-ripgrep.cjs b/config/scripts/orcad-distribution/template/compact-packaged-orcad-ripgrep.cjs similarity index 98% rename from config/scripts/compact-packaged-orcad-ripgrep.cjs rename to config/scripts/orcad-distribution/template/compact-packaged-orcad-ripgrep.cjs index 31b71f997c6..234aad4962e 100644 --- a/config/scripts/compact-packaged-orcad-ripgrep.cjs +++ b/config/scripts/orcad-distribution/template/compact-packaged-orcad-ripgrep.cjs @@ -6,7 +6,7 @@ const { ORCAD_TEMPLATE_TARGETS_DIR, orcadRipgrepArtifact, orcadTemplatePackagedRipgrep -} = require('../../src/shared/orcad-artifacts.ts') +} = require('../../../../src/shared/orcad-artifacts.ts') const { verifyPackagedOrcadTemplate } = require('./verify-packaged-orcad-template.cjs') function sha256(path) { diff --git a/config/scripts/compact-packaged-orcad-ripgrep.test.mjs b/config/scripts/orcad-distribution/template/compact-packaged-orcad-ripgrep.test.mjs similarity index 97% rename from config/scripts/compact-packaged-orcad-ripgrep.test.mjs rename to config/scripts/orcad-distribution/template/compact-packaged-orcad-ripgrep.test.mjs index 4aff27ccd6a..d1095f0e42e 100644 --- a/config/scripts/compact-packaged-orcad-ripgrep.test.mjs +++ b/config/scripts/orcad-distribution/template/compact-packaged-orcad-ripgrep.test.mjs @@ -5,12 +5,12 @@ import { createRequire } from 'node:module' import { tmpdir } from 'node:os' import { basename, dirname, join } from 'node:path' import { afterEach, describe, expect, it, vi } from 'vitest' -import { assembleOrcadArtifact } from '../../src/main/orcad/orcad-artifact-materializer.ts' -import { readOrcadArtifactIdentity } from '../../src/main/orcad/orcad-artifact-identity.ts' +import { assembleOrcadArtifact } from '../../../../src/main/orcad/orcad-artifact-materializer.ts' +import { readOrcadArtifactIdentity } from '../../../../src/main/orcad/orcad-artifact-identity.ts' import { ORCAD_TEMPLATE_MANIFEST_FILENAME, orcadRipgrepArtifact -} from '../../src/shared/orcad-artifacts.ts' +} from '../../../../src/shared/orcad-artifacts.ts' import { writeOrcadTemplateTestFixture } from './orcad-template-test-fixture.mjs' const require = createRequire(import.meta.url) diff --git a/config/scripts/orcad-template-test-fixture.mjs b/config/scripts/orcad-distribution/template/orcad-template-test-fixture.mjs similarity index 95% rename from config/scripts/orcad-template-test-fixture.mjs rename to config/scripts/orcad-distribution/template/orcad-template-test-fixture.mjs index f034cae04c8..956986945ff 100644 --- a/config/scripts/orcad-template-test-fixture.mjs +++ b/config/scripts/orcad-distribution/template/orcad-template-test-fixture.mjs @@ -9,12 +9,12 @@ import { ORCAD_TEMPLATE_TARGETS_DIR, orcadTemplateCommonFilenames, orcadTemplateTargetFilenames -} from '../../src/shared/orcad-artifacts.ts' +} from '../../../../src/shared/orcad-artifacts.ts' import { COMPAT_SERVER_TARGETS, ORCAD_TEMPLATE_TARGETS, pinnedNodeRuntimeAsset -} from '../../src/shared/node-runtime-pin.ts' +} from '../../../../src/shared/node-runtime-pin.ts' async function write(path, contents) { await mkdir(dirname(path), { recursive: true }) diff --git a/config/scripts/packaged-orcad-browser.cjs b/config/scripts/orcad-distribution/template/packaged-orcad-browser.cjs similarity index 91% rename from config/scripts/packaged-orcad-browser.cjs rename to config/scripts/orcad-distribution/template/packaged-orcad-browser.cjs index 21612d7a6a1..a972120d399 100644 --- a/config/scripts/packaged-orcad-browser.cjs +++ b/config/scripts/orcad-distribution/template/packaged-orcad-browser.cjs @@ -1,8 +1,10 @@ const { createHash } = require('node:crypto') const { existsSync, readFileSync, writeFileSync } = require('node:fs') const { join } = require('node:path') -const { ORCAD_TEMPLATE_MANIFEST_FILENAME } = require('../../src/shared/orcad-artifacts.ts') -const { orcadAgentBrowserNativeName } = require('../../src/shared/orcad-agent-browser-name.ts') +const { ORCAD_TEMPLATE_MANIFEST_FILENAME } = require('../../../../src/shared/orcad-artifacts.ts') +const { + orcadAgentBrowserNativeName +} = require('../../../../src/shared/orcad-agent-browser-name.ts') const { verifyPackagedOrcadTemplate } = require('./verify-packaged-orcad-template.cjs') function sha256(path) { diff --git a/config/scripts/packaged-orcad-browser.test.mjs b/config/scripts/orcad-distribution/template/packaged-orcad-browser.test.mjs similarity index 93% rename from config/scripts/packaged-orcad-browser.test.mjs rename to config/scripts/orcad-distribution/template/packaged-orcad-browser.test.mjs index dd44c30c99a..85aa5737ee6 100644 --- a/config/scripts/packaged-orcad-browser.test.mjs +++ b/config/scripts/orcad-distribution/template/packaged-orcad-browser.test.mjs @@ -3,8 +3,8 @@ import { createRequire } from 'node:module' import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, describe, expect, it, vi } from 'vitest' -import { assembleOrcadArtifact } from '../../src/main/orcad/orcad-artifact-materializer.ts' -import { ORCAD_TEMPLATE_MANIFEST_FILENAME } from '../../src/shared/orcad-artifacts.ts' +import { assembleOrcadArtifact } from '../../../../src/main/orcad/orcad-artifact-materializer.ts' +import { ORCAD_TEMPLATE_MANIFEST_FILENAME } from '../../../../src/shared/orcad-artifacts.ts' import { writeOrcadTemplateTestFixture } from './orcad-template-test-fixture.mjs' const require = createRequire(import.meta.url) diff --git a/config/scripts/packaged-orcad-template.cjs b/config/scripts/orcad-distribution/template/packaged-orcad-template.cjs similarity index 97% rename from config/scripts/packaged-orcad-template.cjs rename to config/scripts/orcad-distribution/template/packaged-orcad-template.cjs index ed447827606..555aff2034d 100644 --- a/config/scripts/packaged-orcad-template.cjs +++ b/config/scripts/orcad-distribution/template/packaged-orcad-template.cjs @@ -14,7 +14,7 @@ const { join, relative, resolve, sep } = require('node:path') const { ORCAD_TEMPLATE_MANIFEST_FILENAME, ORCAD_TEMPLATE_TARGETS_DIR -} = require('../../src/shared/orcad-artifacts.ts') +} = require('../../../../src/shared/orcad-artifacts.ts') const { verifyPackagedOrcadTemplate } = require('./verify-packaged-orcad-template.cjs') const { compactPackagedOrcadRipgrep, @@ -44,7 +44,10 @@ function isOrcadTemplateRequired(env = process.env) { } // Why: electron-builder only warns on a missing extraResources source. -function assertOrcadTemplateBuilt(projectDir = join(__dirname, '..', '..'), env = process.env) { +function assertOrcadTemplateBuilt( + projectDir = join(__dirname, '../../..', '..'), + env = process.env +) { const manifest = join( projectDir, orcadTemplateExtraResource.from, diff --git a/config/scripts/packaged-orcad-template.test.mjs b/config/scripts/orcad-distribution/template/packaged-orcad-template.test.mjs similarity index 99% rename from config/scripts/packaged-orcad-template.test.mjs rename to config/scripts/orcad-distribution/template/packaged-orcad-template.test.mjs index 5c167237809..d2fa40636ff 100644 --- a/config/scripts/packaged-orcad-template.test.mjs +++ b/config/scripts/orcad-distribution/template/packaged-orcad-template.test.mjs @@ -7,7 +7,7 @@ import { afterEach, describe, expect, it, vi } from 'vitest' import { ORCAD_TEMPLATE_MANIFEST_FILENAME, ORCAD_TEMPLATE_TARGETS_DIR -} from '../../src/shared/orcad-artifacts.ts' +} from '../../../../src/shared/orcad-artifacts.ts' import { writeOrcadTemplateTestFixture } from './orcad-template-test-fixture.mjs' const require = createRequire(import.meta.url) diff --git a/config/scripts/verify-packaged-orcad-template.cjs b/config/scripts/orcad-distribution/template/verify-packaged-orcad-template.cjs similarity index 98% rename from config/scripts/verify-packaged-orcad-template.cjs rename to config/scripts/orcad-distribution/template/verify-packaged-orcad-template.cjs index 6dfd47b05ea..7e3c25abe74 100644 --- a/config/scripts/verify-packaged-orcad-template.cjs +++ b/config/scripts/orcad-distribution/template/verify-packaged-orcad-template.cjs @@ -11,12 +11,12 @@ const { orcadTemplateCommonFilenames, orcadTemplatePackagedRipgrep, orcadTemplateTargetFilenames -} = require('../../src/shared/orcad-artifacts.ts') +} = require('../../../../src/shared/orcad-artifacts.ts') const { COMPAT_SERVER_TARGETS, ORCAD_TEMPLATE_TARGETS, pinnedNodeRuntimeAsset -} = require('../../src/shared/node-runtime-pin.ts') +} = require('../../../../src/shared/node-runtime-pin.ts') const SHA256_PATTERN = /^[a-f0-9]{64}$/ const BROWSER_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/ diff --git a/config/scripts/verify-packaged-orcad-template.test.mjs b/config/scripts/orcad-distribution/template/verify-packaged-orcad-template.test.mjs similarity index 97% rename from config/scripts/verify-packaged-orcad-template.test.mjs rename to config/scripts/orcad-distribution/template/verify-packaged-orcad-template.test.mjs index c615f715eee..47662e1f043 100644 --- a/config/scripts/verify-packaged-orcad-template.test.mjs +++ b/config/scripts/orcad-distribution/template/verify-packaged-orcad-template.test.mjs @@ -8,13 +8,13 @@ import { ORCAD_NODE_RUNTIME_MARKER_FILENAME, ORCAD_TEMPLATE_MANIFEST_FILENAME, ORCAD_TEMPLATE_TARGETS_DIR -} from '../../src/shared/orcad-artifacts.ts' -import { NODE_RUNTIME_ASSETS } from '../../src/shared/node-runtime-pin.ts' +} from '../../../../src/shared/orcad-artifacts.ts' +import { NODE_RUNTIME_ASSETS } from '../../../../src/shared/node-runtime-pin.ts' import { writeOrcadTemplateTestFixture } from './orcad-template-test-fixture.mjs' const require = createRequire(import.meta.url) const { verifyPackagedOrcadTemplate } = require('./verify-packaged-orcad-template.cjs') -const builderConfig = require('../electron-builder.config.cjs') +const builderConfig = require('../../../electron-builder.config.cjs') const roots = [] async function createFixture(options) { diff --git a/config/scripts/patched-dependencies-frozen-install.test.mjs b/config/scripts/patched-dependencies-frozen-install.test.mjs index 34a5a78d981..ce9e658e6ca 100644 --- a/config/scripts/patched-dependencies-frozen-install.test.mjs +++ b/config/scripts/patched-dependencies-frozen-install.test.mjs @@ -13,8 +13,8 @@ import { describe, expect, it } from 'vitest' import { runProcessSync } from '@orca/process-host' import { resolveCliCommand } from '../../src/shared/node-cli-command-resolution.ts' import { removeTreeSync } from '../../src/shared/windows-transient-lock-removal.ts' -import { resolvePnpmCliInvocation } from './pnpm-cli-invocation.mjs' -import { workspacePackageManifests } from './workspace-source-exports.mjs' +import { resolvePnpmCliInvocation } from './tool-invocation/pnpm-cli-invocation.mjs' +import { workspacePackageManifests } from './workspace/source-exports/workspace-source-exports.mjs' // Run actual pnpm: it hashes LF-normalized patch content; repeated raw SHA checks agreed with a bad CRLF lockfile and missed frozen-install failures. // lockfile-only/ignore-scripts checks resolution without node_modules or native builds; patch application is tested separately below. diff --git a/config/scripts/idle-cpu-process-sampling.mjs b/config/scripts/performance/idle-cpu/idle-cpu-process-sampling.mjs similarity index 100% rename from config/scripts/idle-cpu-process-sampling.mjs rename to config/scripts/performance/idle-cpu/idle-cpu-process-sampling.mjs diff --git a/config/scripts/idle-cpu-process-sampling.test.mjs b/config/scripts/performance/idle-cpu/idle-cpu-process-sampling.test.mjs similarity index 100% rename from config/scripts/idle-cpu-process-sampling.test.mjs rename to config/scripts/performance/idle-cpu/idle-cpu-process-sampling.test.mjs diff --git a/config/scripts/idle-cpu-renderer-scale-fixture.mjs b/config/scripts/performance/idle-cpu/idle-cpu-renderer-scale-fixture.mjs similarity index 100% rename from config/scripts/idle-cpu-renderer-scale-fixture.mjs rename to config/scripts/performance/idle-cpu/idle-cpu-renderer-scale-fixture.mjs diff --git a/config/scripts/idle-cpu-renderer-timing-probe.mjs b/config/scripts/performance/idle-cpu/idle-cpu-renderer-timing-probe.mjs similarity index 100% rename from config/scripts/idle-cpu-renderer-timing-probe.mjs rename to config/scripts/performance/idle-cpu/idle-cpu-renderer-timing-probe.mjs diff --git a/config/scripts/idle-cpu-synthetic-spinners.mjs b/config/scripts/performance/idle-cpu/idle-cpu-synthetic-spinners.mjs similarity index 100% rename from config/scripts/idle-cpu-synthetic-spinners.mjs rename to config/scripts/performance/idle-cpu/idle-cpu-synthetic-spinners.mjs diff --git a/config/scripts/run-idle-cpu-benchmark.mjs b/config/scripts/performance/idle-cpu/run-idle-cpu-benchmark.mjs similarity index 91% rename from config/scripts/run-idle-cpu-benchmark.mjs rename to config/scripts/performance/idle-cpu/run-idle-cpu-benchmark.mjs index 9d9386f96eb..5d34d89e730 100644 --- a/config/scripts/run-idle-cpu-benchmark.mjs +++ b/config/scripts/performance/idle-cpu/run-idle-cpu-benchmark.mjs @@ -153,7 +153,7 @@ function parseArgs(argv) { } function printUsage() { console.log( - `Usage: node config/scripts/run-idle-cpu-benchmark.mjs [options]\n\nOptions:\n --warmup-ms <n> Time to wait after app readiness before sampling (default ${DEFAULT_WARMUP_MS})\n --sample-ms <n> Sampling window duration (default ${DEFAULT_SAMPLE_MS})\n --interval-ms <n> Sampling cadence (default ${DEFAULT_INTERVAL_MS})\n --worktrees <n> Seed repo worktree count, including primary (default ${DEFAULT_WORKTREE_COUNT})\n --lineage-depth <n> Nest all worktrees under one expanded lineage, up to this depth\n --agents-per-worktree <n> Seed this many visible inline agent rows per worktree\n --zustand-publications <n> Publish exactly this many store updates during sampling\n --zustand-publication-interval-ms <n> Publication cadence (default ${DEFAULT_ZUSTAND_PUBLICATION_INTERVAL_MS})\n --headful Show the Electron window while measuring\n --skip-build Reuse out/main/index.js instead of building first\n --output <path> Write JSON report to this path\n --disable-renderer-animations Inject measurement-only CSS that disables animations/transitions\n --synthetic-visible-spinners <n> Measurement-only: add visible working spinners\n --synthetic-spinner-animation <smooth|steps> Spinner animation style (default smooth)\n --synthetic-spinner-steps <n> Step count for --synthetic-spinner-animation steps (default 12)\n` + `Usage: node config/scripts/performance/idle-cpu/run-idle-cpu-benchmark.mjs [options]\n\nOptions:\n --warmup-ms <n> Time to wait after app readiness before sampling (default ${DEFAULT_WARMUP_MS})\n --sample-ms <n> Sampling window duration (default ${DEFAULT_SAMPLE_MS})\n --interval-ms <n> Sampling cadence (default ${DEFAULT_INTERVAL_MS})\n --worktrees <n> Seed repo worktree count, including primary (default ${DEFAULT_WORKTREE_COUNT})\n --lineage-depth <n> Nest all worktrees under one expanded lineage, up to this depth\n --agents-per-worktree <n> Seed this many visible inline agent rows per worktree\n --zustand-publications <n> Publish exactly this many store updates during sampling\n --zustand-publication-interval-ms <n> Publication cadence (default ${DEFAULT_ZUSTAND_PUBLICATION_INTERVAL_MS})\n --headful Show the Electron window while measuring\n --skip-build Reuse out/main/index.js instead of building first\n --output <path> Write JSON report to this path\n --disable-renderer-animations Inject measurement-only CSS that disables animations/transitions\n --synthetic-visible-spinners <n> Measurement-only: add visible working spinners\n --synthetic-spinner-animation <smooth|steps> Spinner animation style (default smooth)\n --synthetic-spinner-steps <n> Step count for --synthetic-spinner-animation steps (default 12)\n` ) } function run(command, args, options = {}) { @@ -172,7 +172,18 @@ function buildAppIfNeeded(root, skipBuild) { // Wrapper avoids Windows npx.cmd exec failure and verifies boot graph. run( process.execPath, - [path.join(root, 'config', 'scripts', 'run-electron-vite-build.mjs'), '--mode', 'e2e'], + [ + path.join( + root, + 'config', + 'scripts', + 'desktop-build', + 'execution', + 'run-electron-vite-build.mjs' + ), + '--mode', + 'e2e' + ], { cwd: root, stdio: 'inherit', @@ -299,7 +310,7 @@ async function collectRendererIdleState(page) { async function main() { const options = parseArgs(process.argv.slice(2)) - const root = path.resolve(import.meta.dirname, '..', '..') + const root = path.resolve(import.meta.dirname, '../../..', '..') const mainPath = buildAppIfNeeded(root, options.skipBuild) const userDataDir = mkdtempSync(path.join(os.tmpdir(), 'orca-idle-cpu-userdata-')) const { repoDir, cleanupDirs } = createIdleRepo(options.worktrees) diff --git a/config/scripts/benchmark-sample-summary.mjs b/config/scripts/performance/measurement/benchmark-sample-summary.mjs similarity index 100% rename from config/scripts/benchmark-sample-summary.mjs rename to config/scripts/performance/measurement/benchmark-sample-summary.mjs diff --git a/config/scripts/benchmark-sample-summary.test.mjs b/config/scripts/performance/measurement/benchmark-sample-summary.test.mjs similarity index 100% rename from config/scripts/benchmark-sample-summary.test.mjs rename to config/scripts/performance/measurement/benchmark-sample-summary.test.mjs diff --git a/config/scripts/counterbalanced-benchmark-schedule.mjs b/config/scripts/performance/measurement/counterbalanced-benchmark-schedule.mjs similarity index 100% rename from config/scripts/counterbalanced-benchmark-schedule.mjs rename to config/scripts/performance/measurement/counterbalanced-benchmark-schedule.mjs diff --git a/config/scripts/counterbalanced-benchmark-schedule.test.mjs b/config/scripts/performance/measurement/counterbalanced-benchmark-schedule.test.mjs similarity index 100% rename from config/scripts/counterbalanced-benchmark-schedule.test.mjs rename to config/scripts/performance/measurement/counterbalanced-benchmark-schedule.test.mjs diff --git a/config/scripts/terminal-perf-dependency-preparation.test.mjs b/config/scripts/performance/terminal-preparation/terminal-perf-dependency-preparation.test.mjs similarity index 94% rename from config/scripts/terminal-perf-dependency-preparation.test.mjs rename to config/scripts/performance/terminal-preparation/terminal-perf-dependency-preparation.test.mjs index 7cdab5a195b..208fb78490e 100644 --- a/config/scripts/terminal-perf-dependency-preparation.test.mjs +++ b/config/scripts/performance/terminal-preparation/terminal-perf-dependency-preparation.test.mjs @@ -15,7 +15,8 @@ const supportedManifest = { engines: { node: '24' }, packageManager: 'pnpm@12.14.0', scripts: { - postinstall: 'pnpm run build:packages && node config/scripts/rebuild-native-deps.mjs' + postinstall: + 'pnpm run build:packages && node config/scripts/native-build/node-addons/rebuild-native-deps.mjs' } } @@ -30,7 +31,7 @@ function select(options = {}) { for (const [file, content] of [ ['.github/actions/install-node-dependencies/action.yml', options.action ?? supportedAction], ['.github/actions/prepare-native-runtime/action.yml', 'runs: {}'], - ['config/scripts/ensure-native-runtime.mjs', ''] + ['config/scripts/native-build/node-addons/ensure-native-runtime.mjs', ''] ]) { if (options.missing === file) { continue @@ -108,7 +109,10 @@ it.each([ ['another architecture', { arch: 'ARM64' }], ['missing installer', { missing: '.github/actions/install-node-dependencies/action.yml' }], ['missing native action', { missing: '.github/actions/prepare-native-runtime/action.yml' }], - ['missing runtime script', { missing: 'config/scripts/ensure-native-runtime.mjs' }], + [ + 'missing runtime script', + { missing: 'config/scripts/native-build/node-addons/ensure-native-runtime.mjs' } + ], ['old installer interface', { action: 'inputs:\n native-runtime: {}\nruns: {}\n' }], [ 'output-only names', diff --git a/config/scripts/check-terminal-perf-report-budgets.mjs b/config/scripts/performance/terminal-reporting/check-terminal-perf-report-budgets.mjs similarity index 96% rename from config/scripts/check-terminal-perf-report-budgets.mjs rename to config/scripts/performance/terminal-reporting/check-terminal-perf-report-budgets.mjs index 31a0be665ab..ae589925b0b 100644 --- a/config/scripts/check-terminal-perf-report-budgets.mjs +++ b/config/scripts/performance/terminal-reporting/check-terminal-perf-report-budgets.mjs @@ -9,7 +9,7 @@ if (reportPaths[0] === '--') { if (reportPaths.length === 0) { console.error( - 'Usage: node config/scripts/check-terminal-perf-report-budgets.mjs <playwright-json>...' + 'Usage: node config/scripts/performance/terminal-reporting/check-terminal-perf-report-budgets.mjs <playwright-json>...' ) process.exit(1) } diff --git a/config/scripts/check-terminal-perf-report-budgets.test.mjs b/config/scripts/performance/terminal-reporting/check-terminal-perf-report-budgets.test.mjs similarity index 98% rename from config/scripts/check-terminal-perf-report-budgets.test.mjs rename to config/scripts/performance/terminal-reporting/check-terminal-perf-report-budgets.test.mjs index 95d6093b52d..717423af3ca 100644 --- a/config/scripts/check-terminal-perf-report-budgets.test.mjs +++ b/config/scripts/performance/terminal-reporting/check-terminal-perf-report-budgets.test.mjs @@ -4,7 +4,8 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, describe, expect, it } from 'vitest' -const scriptPath = 'config/scripts/check-terminal-perf-report-budgets.mjs' +const scriptPath = + 'config/scripts/performance/terminal-reporting/check-terminal-perf-report-budgets.mjs' const tempDirs = [] function writeReport(annotationDescription, annotationType = 'opencode-test') { diff --git a/config/scripts/generate-terminal-perf-html-report.mjs b/config/scripts/performance/terminal-reporting/generate-terminal-perf-html-report.mjs similarity index 99% rename from config/scripts/generate-terminal-perf-html-report.mjs rename to config/scripts/performance/terminal-reporting/generate-terminal-perf-html-report.mjs index ce1e55bbb29..65138c5f91b 100644 --- a/config/scripts/generate-terminal-perf-html-report.mjs +++ b/config/scripts/performance/terminal-reporting/generate-terminal-perf-html-report.mjs @@ -78,7 +78,7 @@ export function parseHtmlReportArgs(argv, env = process.env) { if (inputs.length === 0) { throw new Error( - 'Usage: node config/scripts/generate-terminal-perf-html-report.mjs [label=]<playwright-json>... --output <report.html>' + 'Usage: node config/scripts/performance/terminal-reporting/generate-terminal-perf-html-report.mjs [label=]<playwright-json>... --output <report.html>' ) } return { inputs, outputPath } diff --git a/config/scripts/generate-terminal-perf-html-report.test.mjs b/config/scripts/performance/terminal-reporting/generate-terminal-perf-html-report.test.mjs similarity index 100% rename from config/scripts/generate-terminal-perf-html-report.test.mjs rename to config/scripts/performance/terminal-reporting/generate-terminal-perf-html-report.test.mjs diff --git a/config/scripts/summarize-terminal-perf-report.mjs b/config/scripts/performance/terminal-reporting/summarize-terminal-perf-report.mjs similarity index 95% rename from config/scripts/summarize-terminal-perf-report.mjs rename to config/scripts/performance/terminal-reporting/summarize-terminal-perf-report.mjs index 2e4f77732b3..9843751e7a3 100644 --- a/config/scripts/summarize-terminal-perf-report.mjs +++ b/config/scripts/performance/terminal-reporting/summarize-terminal-perf-report.mjs @@ -8,7 +8,7 @@ if (reportPaths[0] === '--') { if (reportPaths.length === 0) { console.error( - 'Usage: node config/scripts/summarize-terminal-perf-report.mjs <playwright-json>...' + 'Usage: node config/scripts/performance/terminal-reporting/summarize-terminal-perf-report.mjs <playwright-json>...' ) process.exit(1) } diff --git a/config/scripts/summarize-terminal-perf-report.test.mjs b/config/scripts/performance/terminal-reporting/summarize-terminal-perf-report.test.mjs similarity index 94% rename from config/scripts/summarize-terminal-perf-report.test.mjs rename to config/scripts/performance/terminal-reporting/summarize-terminal-perf-report.test.mjs index 2a1f16ec1f3..0ac9bcec8e2 100644 --- a/config/scripts/summarize-terminal-perf-report.test.mjs +++ b/config/scripts/performance/terminal-reporting/summarize-terminal-perf-report.test.mjs @@ -4,7 +4,8 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, describe, expect, it } from 'vitest' -const scriptPath = 'config/scripts/summarize-terminal-perf-report.mjs' +const scriptPath = + 'config/scripts/performance/terminal-reporting/summarize-terminal-perf-report.mjs' const tempDirs = [] function writeReport() { diff --git a/config/scripts/terminal-perf-report-annotations.mjs b/config/scripts/performance/terminal-reporting/terminal-perf-report-annotations.mjs similarity index 100% rename from config/scripts/terminal-perf-report-annotations.mjs rename to config/scripts/performance/terminal-reporting/terminal-perf-report-annotations.mjs diff --git a/config/scripts/terminal-perf-report-annotations.test.mjs b/config/scripts/performance/terminal-reporting/terminal-perf-report-annotations.test.mjs similarity index 100% rename from config/scripts/terminal-perf-report-annotations.test.mjs rename to config/scripts/performance/terminal-reporting/terminal-perf-report-annotations.test.mjs diff --git a/config/scripts/terminal-perf-report-budgets.mjs b/config/scripts/performance/terminal-reporting/terminal-perf-report-budgets.mjs similarity index 100% rename from config/scripts/terminal-perf-report-budgets.mjs rename to config/scripts/performance/terminal-reporting/terminal-perf-report-budgets.mjs diff --git a/config/scripts/terminal-perf-report-rows.mjs b/config/scripts/performance/terminal-reporting/terminal-perf-report-rows.mjs similarity index 100% rename from config/scripts/terminal-perf-report-rows.mjs rename to config/scripts/performance/terminal-reporting/terminal-perf-report-rows.mjs diff --git a/config/scripts/build-plugin-declarative-runtime.mjs b/config/scripts/plugin-build/declarative-runtime/build-plugin-declarative-runtime.mjs similarity index 94% rename from config/scripts/build-plugin-declarative-runtime.mjs rename to config/scripts/plugin-build/declarative-runtime/build-plugin-declarative-runtime.mjs index 855168dd5a5..180c2b0bc23 100644 --- a/config/scripts/build-plugin-declarative-runtime.mjs +++ b/config/scripts/plugin-build/declarative-runtime/build-plugin-declarative-runtime.mjs @@ -5,7 +5,7 @@ import { readFileSync, writeFileSync } from 'node:fs' import path from 'node:path' import { build } from 'esbuild' -const ROOT = path.resolve(import.meta.dirname, '..', '..') +const ROOT = path.resolve(import.meta.dirname, '../../..', '..') const OUTPUT_DIR = path.join(ROOT, 'resources', 'plugins', 'declarative') const DECLARATIVE = path.join(ROOT, 'src', 'shared', 'plugins', 'declarative') const TESTING = path.join(ROOT, 'src', 'main', 'plugins', 'testing') @@ -65,7 +65,7 @@ async function bundle({ file, entry, source, platform, plugins = [] }) { plugins, banner: { js: - `// Generated by config/scripts/build-plugin-declarative-runtime.mjs from\n` + + `// Generated by config/scripts/plugin-build/declarative-runtime/build-plugin-declarative-runtime.mjs from\n` + `// ${source}. Do not edit.` }, write: false, diff --git a/config/scripts/build-plugin-declarative-runtime.test.mjs b/config/scripts/plugin-build/declarative-runtime/build-plugin-declarative-runtime.test.mjs similarity index 100% rename from config/scripts/build-plugin-declarative-runtime.test.mjs rename to config/scripts/plugin-build/declarative-runtime/build-plugin-declarative-runtime.test.mjs diff --git a/config/scripts/plugin-command-bindings-benchmark.mjs b/config/scripts/plugin-command-bindings-benchmark.mjs index 58b3dad8cab..92185af53bf 100644 --- a/config/scripts/plugin-command-bindings-benchmark.mjs +++ b/config/scripts/plugin-command-bindings-benchmark.mjs @@ -4,7 +4,7 @@ import { readFileSync } from 'node:fs' import { dirname, resolve } from 'node:path' import { performance } from 'node:perf_hooks' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' const baseline = process.argv[2] if (!baseline) { diff --git a/config/scripts/plugin-message-budget-benchmark.mjs b/config/scripts/plugin-message-budget-benchmark.mjs index 7a6fbfcf396..6552ef1cc25 100644 --- a/config/scripts/plugin-message-budget-benchmark.mjs +++ b/config/scripts/plugin-message-budget-benchmark.mjs @@ -4,7 +4,7 @@ import { readFileSync } from 'node:fs' import { dirname, resolve } from 'node:path' import { performance } from 'node:perf_hooks' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' const baseline = process.argv[2] ?? '20ab9950654' const file = 'src/shared/plugins/frames/plugin-panel-message-budget.ts' diff --git a/config/scripts/plugin-shortcut-conflicts-benchmark.mjs b/config/scripts/plugin-shortcut-conflicts-benchmark.mjs index c7dd5d3c60e..a683af46ac7 100644 --- a/config/scripts/plugin-shortcut-conflicts-benchmark.mjs +++ b/config/scripts/plugin-shortcut-conflicts-benchmark.mjs @@ -4,7 +4,7 @@ import { readFileSync } from 'node:fs' import { dirname, resolve } from 'node:path' import { performance } from 'node:perf_hooks' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' const baseline = process.argv[2] if (!baseline) { diff --git a/config/scripts/pr-auxiliary-preflight-admission.test.mjs b/config/scripts/pr-auxiliary-preflight-admission.test.mjs index 95d91103ba6..8f64e39c017 100644 --- a/config/scripts/pr-auxiliary-preflight-admission.test.mjs +++ b/config/scripts/pr-auxiliary-preflight-admission.test.mjs @@ -13,8 +13,8 @@ import { runInNewContext } from 'node:vm' import { afterEach, describe, expect, it } from 'vitest' import { runProcessSync } from '@orca/process-host' import { parse } from 'yaml' -import { classifyPrJobs } from './pr-code-change-scope.mjs' -import { collectNodeServerInputs } from './node-server-change-scope.mjs' +import { classifyPrJobs } from './workflow/source-routing/pr-code-change-scope.mjs' +import { collectNodeServerInputs } from './node-server/qualification/node-server-change-scope.mjs' const workflow = parse(readFileSync('.github/workflows/pr.yml', 'utf8')) const unit = parse(readFileSync('.github/workflows/unit-tests.yml', 'utf8')) @@ -144,8 +144,8 @@ describe('Mobile CI tool preflight routing', () => { [tool, 'pnpm-lock.yaml'], [tool, 'package.json'], [tool, 'config/vitest.config.ts'], - [tool, 'config/scripts/pr-code-change-scope.mjs'], - [tool, 'config/scripts/pr-package-test-paths.mjs'], + [tool, 'config/scripts/workflow/source-routing/pr-code-change-scope.mjs'], + [tool, 'config/scripts/workflow/source-routing/pr-package-test-paths.mjs'], [tool, 'config/scripts/new-mobile-tool.mjs'], [tool, 'README.md'], [tool, 'mobile/vitest.config.ts'] @@ -242,18 +242,19 @@ function createMobileCiScopeRepository( const root = resolve(import.meta.dirname, '../..') for (const file of [ 'package.json', - 'config/scripts/pr-code-change-scope.mjs', - 'config/scripts/pr-package-test-paths.mjs', - 'config/scripts/pr-layout-oracle-route.mjs', - 'config/scripts/pr-shell-contract-prefixes.mjs', - 'config/scripts/git-pull-request-diff-base.mjs', - 'config/scripts/pr-e2e-source-routing.mjs', - 'config/scripts/pr-browser-e2e-source-routes.mjs', - 'config/scripts/pr-editor-preview-e2e-source-routes.mjs', - 'config/scripts/pr-feature-area-e2e-source-routes.mjs', - 'config/scripts/pr-plugin-e2e-source-routes.mjs', - 'config/scripts/pr-wsl-e2e-source-routes.mjs', - 'config/scripts/ci-e2e-job-selection.mjs' + 'config/scripts/workflow/source-routing/pr-code-change-scope.mjs', + 'config/scripts/workflow/source-routing/pr-package-test-paths.mjs', + 'config/scripts/workflow/source-routing/pr-layout-oracle-route.mjs', + 'config/scripts/workflow/source-routing/pr-shell-contract-prefixes.mjs', + 'config/scripts/workflow/source-routing/pr-xterm-patch-prefixes.mjs', + 'config/scripts/git/pr-diff-base/git-pull-request-diff-base.mjs', + 'config/scripts/workflow/source-routing/pr-e2e-source-routing.mjs', + 'config/scripts/workflow/source-routing/pr-browser-e2e-source-routes.mjs', + 'config/scripts/workflow/source-routing/pr-editor-preview-e2e-source-routes.mjs', + 'config/scripts/workflow/source-routing/pr-feature-area-e2e-source-routes.mjs', + 'config/scripts/workflow/source-routing/pr-plugin-e2e-source-routes.mjs', + 'config/scripts/workflow/source-routing/pr-wsl-e2e-source-routes.mjs', + 'config/scripts/ci/e2e-selection/ci-e2e-job-selection.mjs' ]) { mkdirSync(dirname(join(directory, file)), { recursive: true }) copyFileSync(join(root, file), join(directory, file)) @@ -418,7 +419,10 @@ describe.skipIf(process.platform === 'win32')('Daemon mock complete Git change e repo.git('mv', helper, helper.replace('.ts', '-renamed.ts')) } else { rmSync(repo.tool) - symlinkSync('../../../config/scripts/pr-code-change-scope.mjs', repo.tool) + symlinkSync( + '../../../config/scripts/workflow/source-routing/pr-code-change-scope.mjs', + repo.tool + ) } repo.commit() const { result, output } = repo.detect() diff --git a/config/scripts/pr-e2e-managed-ssh-harness-route.test.mjs b/config/scripts/pr-e2e-managed-ssh-harness-route.test.mjs index 4b6c7f085d1..5e52f1f7c13 100644 --- a/config/scripts/pr-e2e-managed-ssh-harness-route.test.mjs +++ b/config/scripts/pr-e2e-managed-ssh-harness-route.test.mjs @@ -2,7 +2,10 @@ import { describe, expect, it } from 'vitest' import { readdirSync } from 'node:fs' import { join, resolve, sep } from 'node:path' import { testImportClosure } from './e2e-test-import-closure.mjs' -import { MANUAL_ONLY_E2E_SPECS, selectPrE2eSpecs } from './pr-e2e-source-routing.mjs' +import { + MANUAL_ONLY_E2E_SPECS, + selectPrE2eSpecs +} from './workflow/source-routing/pr-e2e-source-routing.mjs' const projectDir = resolve(import.meta.dirname, '../..') const MANAGED_SSH_SPEC = /^tests\/e2e\/ssh-orcad-.*\.spec\.ts$/ diff --git a/config/scripts/pr-package-test-paths.mjs b/config/scripts/pr-package-test-paths.mjs deleted file mode 100644 index 46f7f7639b5..00000000000 --- a/config/scripts/pr-package-test-paths.mjs +++ /dev/null @@ -1,139 +0,0 @@ -import process from 'node:process' -import { pathToFileURL } from 'node:url' - -export const LINUX_PACKAGE_TESTS = [ - 'src/main/browser/cookies/browser-google-cookie-clear.electron.test.ts', - 'config/scripts/packaged-repository-input-exclusion.test.mjs', - 'src/main/browser/guest-lifecycle/popups/popup-origin-chrome.electron.test.ts', - 'src/main/browser/guest-lifecycle/navigation/browser-link-materialization.electron.test.ts', - 'src/main/browser/client-pages/renderer/browser-client-page-renderer-lifecycle.electron.test.ts', - 'src/main/persistence/profile-state/profile-state-writer-stall.electron.test.ts', - 'src/main/browser/guest-lifecycle/popups/browser-popup-compatibility.electron.test.ts', - 'src/main/browser/guest-lifecycle/popups/browser-popup-adapter-compatibility.electron.test.ts', - 'src/main/browser/guest-lifecycle/popups/browser-popup-native-compatibility.electron.test.ts', - 'src/main/browser/guest-lifecycle/popups/browser-popup-background-compatibility.electron.test.ts', - 'src/main/browser/extensions/api-runtime/browser-extension-api.electron.test.ts', - 'src/main/browser/extensions/profile-storage/browser-extension-persistence.electron.test.ts', - 'src/main/browser/extensions/profile-sessions/browser-extension-lifecycle.electron.test.ts', - 'src/main/browser/extensions/actions/browser-extension-toolbar.electron.test.ts', - 'src/main/browser/extensions/native-messaging/browser-extension-native-messaging.electron.test.ts' -] - -// Cloud-only code must run check-test-file-runners: cloud is neither linted nor format-checked, and any source can register tests. -const CLOUD_TEST_RUNNER_INPUT = /^cloud\/(?:.+\.[cm]?[jt]sx?|(?:.+\/)?package\.json)$/ - -export function isCloudTestRunnerInput(file) { - return CLOUD_TEST_RUNNER_INPUT.test(file) -} - -// The package (windows) job's "Test Windows-specific boundaries" step runs exactly these files. -export const WINDOWS_BOUNDARY_TESTS = [ - 'src/main/zcode/zcode-plan-api-key-store-native-windows.test.ts', - 'config/scripts/rebuild-native-deps.test.mjs', - 'config/scripts/rebuild-native-deps-windows-process-tree.test.mjs', - 'config/scripts/rebuild-native-deps-node-pty.test.mjs', - 'config/scripts/ensure-native-runtime-job-ownership.test.mjs', - 'config/scripts/verify-packaged-node-pty-job-ownership.test.mjs', - 'config/scripts/windows-pe-machine.test.mjs', - 'config/scripts/build-windows-cli-launcher.test.mjs', - 'config/scripts/verify-packaged-windows-agent-hook.test.mjs', - 'config/scripts/script-module-dependencies.test.mjs', - 'src/main/windows/windows-registry-addon.test.ts', - 'src/main/daemon/daemon-host-process-package.test.ts', - 'src/shared/windows-security-addon.win32.test.ts', - 'src/shared/windows-private-credential-file.test.ts', - 'config/scripts/windows-process-tree-gyp-path.test.mjs', - 'config/scripts/windows-process-tree-gyp-rebuild.test.mjs', - 'config/scripts/package-electron-runtime-contract.test.mjs', - 'config/scripts/electron-builder-runtime-resources.test.mjs', - 'src/main/browser/client-pages/renderer/browser-client-page-renderer-lifecycle.electron.test.ts', - 'src/main/persistence/profile-state/profile-state-writer-stall.electron.test.ts', - 'src/main/providers/windows-conpty-wide-char-duplication.node-pty.test.ts', - 'src/shared/__tests__/process-host/windows-command-line.win32.test.ts', - 'src/shared/__tests__/process-host/windows-cmd-shim-resolution.test.ts', - 'src/shared/__tests__/process-host/windows-cmd-shim-resolution.win32.test.ts', - 'src/shared/__tests__/process-host/windows-tree-kill-late-taskkill.win32.test.ts', - 'src/shared/agent-launch/startup/omp-fresh-launch-cmd.win32.test.ts', - 'src/shared/windows-batch-spawn.win32.test.ts', - 'src/main/agent-hooks/windows-hook-payload-delivery.test.ts', - 'src/main/agent-hooks/managed-hook-stdin-lifecycle.test.ts', - 'src/main/jcode/hook-gate-script.test.ts', - 'src/main/agent-hooks/windows-direct-cmd-hook-command.test.ts', - 'src/main/agent-hooks/windows-native-hook-exe-hosts.test.ts', - 'src/main/claude/windows-native-hook-registration.test.ts', - 'src/main/agent-hooks/windows-cmd-hook-command-unicode.test.ts', - 'src/main/agent-hooks/windows-batch-hook-launcher.test.ts', - 'src/main/agent-hooks/windows-powershell-hook-launcher.test.ts', - 'src/main/claude/claude-status-line-windows.test.ts', - 'src/main/codex/hooks/installation/windows-hook-command.test.ts', - 'src/main/codex/hooks/installation/windows-hook-upgrade.test.ts', - 'src/main/codex/hooks/installation/hook-service-managed-install.test.ts', - 'src/main/windows/windows-pty-job.win32.test.ts', - 'src/main/windows/windows-msys-job.win32.test.ts', - 'src/main/providers/agent-foreground-process-git-bash.win32.test.ts', - 'src/main/windows/windows-host-job.win32.test.ts', - 'src/main/windows/windows-process-tree-command-line-patch.test.ts', - 'src/main/windows/windows-process-table-native-addon.win32.test.ts', - 'src/main/windows/windows-administrator-status.win32.test.ts', - 'src/main/windows/windows-administrator-restart.win32.test.ts', - 'src/main/daemon/daemon-pid-identity-native.win32.test.ts', - 'src/main/daemon/node-pty-conout-worker-errors.test.ts', - 'src/main/daemon/node-pty-windows-output-error.win32.test.ts', - 'src/main/persistence/profile-state/profile-state-access-windows-native.win32.test.ts', - 'src/main/pty/process-retirement/windows-live-tree-kill.win32.test.ts', - 'src/main/wsl/execution/wsl-runner.test.ts', - 'src/main/wsl/execution/wsl-guest-environment.test.ts', - 'src/main/wsl/execution/wsl-executable-path.win32.test.ts', - 'src/main/claude-accounts/claude-profile-history-windows.test.ts', - 'src/shared/source-scan/source-tree-scan.test.ts', - 'src/main/cli/wsl-cli-powershell-boundary.test.ts', - 'src/main/computer/desktop-script-runtime-host.win32.test.ts', - 'src/main/cursor/hook-service.test.ts', - 'src/main/orca-profiles/profile-index-store.test.ts', - 'src/main/startup/windows-install-dir-acl-repair.win32.test.ts', - 'src/main/startup/windows-app-data-path.test.ts', - 'src/main/startup/windows-std-handle-inheritance.win32.test.ts', - 'src/main/startup/windows-isolated-spawner.win32.test.ts', - 'src/main/runtime/worktree-scan-admin-fingerprint-gate.test.ts', - 'src/shared/secure-file-fsync-flags.test.ts', - 'src/shared/secure-path-windows-acl.win32.test.ts', - 'src/main/runtime/unreadable-secret-store-preservation.win32.test.ts', - 'src/main/ipc/pty/pty-codex-account-attribution.test.ts', - 'src/main/ipc/pty/pty-spawn-env-codex-resume-provenance.test.ts', - 'src/main/ipc/preflight-provider-command-selection.test.ts', - 'src/main/ipc/preflight-runnable-local-cli.test.ts', - 'src/main/managed-server/install/remote-node-runtime-store-windows.test.ts', - 'src/main/skills/skill-windows-rename-contention.integration.test.ts', - 'src/main/skills/bundled-skill-install/local-host.test.ts', - 'src/main/skills/bundled-skill-install/plan-selection.test.ts', - 'src/main/ipc/filesystem/filesystem-read-dir-unc-drive.test.ts', - 'src/main/ipc/filesystem/filesystem-file-content-unc-drive.test.ts' -] - -const WINDOWS_PROCESS_PROBE_PREFIXES = [ - 'config/nsis/', - 'config/scripts/nsis-process-check', - 'config/scripts/idle-cpu-process-sampling', - 'config/vitest.config.', - 'config/scripts/vitest-', - 'config/scripts/ci-unit-', - 'config/scripts/workspace-source-exports', - 'config/dark-build-switches.', - 'src/packages/process-host/' -] - -export function isWindowsProcessProbePath(file) { - return WINDOWS_PROCESS_PROBE_PREFIXES.some((prefix) => file.startsWith(prefix)) -} - -export const WINDOWS_PACKAGE_TESTS = [ - ...WINDOWS_BOUNDARY_TESTS, - ...LINUX_PACKAGE_TESTS, - // The "Test Windows installer process probe" step runs these serially. - 'config/scripts/nsis-process-check.test.mjs', - 'config/scripts/idle-cpu-process-sampling.test.mjs' -] - -if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) { - console.log(WINDOWS_BOUNDARY_TESTS.join('\n')) -} diff --git a/config/scripts/pr-plugin-e2e-routing.test.mjs b/config/scripts/pr-plugin-e2e-routing.test.mjs index d4c8188892b..31aa8fb85d9 100644 --- a/config/scripts/pr-plugin-e2e-routing.test.mjs +++ b/config/scripts/pr-plugin-e2e-routing.test.mjs @@ -1,13 +1,13 @@ import { describe, expect, it } from 'vitest' import { existsSync, readdirSync } from 'node:fs' import { join, resolve } from 'node:path' -import { classifyE2eJobs, generalE2eShards } from './ci-e2e-job-selection.mjs' +import { classifyE2eJobs, generalE2eShards } from './ci/e2e-selection/ci-e2e-job-selection.mjs' import { testImportClosure } from './e2e-test-import-closure.mjs' -import { selectPrE2eSpecs } from './pr-e2e-source-routing.mjs' +import { selectPrE2eSpecs } from './workflow/source-routing/pr-e2e-source-routing.mjs' import { PLUGIN_SYSTEM_SOURCE, PR_PLUGIN_E2E_SOURCE_ROUTES -} from './pr-plugin-e2e-source-routes.mjs' +} from './workflow/source-routing/pr-plugin-e2e-source-routes.mjs' const projectDir = resolve(import.meta.dirname, '../..') diff --git a/config/scripts/pr-ready-check-reuse.test.mjs b/config/scripts/pr-ready-check-reuse.test.mjs index 0e34329a562..0aee70dd4b0 100644 --- a/config/scripts/pr-ready-check-reuse.test.mjs +++ b/config/scripts/pr-ready-check-reuse.test.mjs @@ -1,7 +1,7 @@ import { readFileSync } from 'node:fs' import { afterEach, describe, expect, it, vi } from 'vitest' import { parse } from 'yaml' -import { PR_CHECK_JOBS } from './pr-code-change-scope.mjs' +import { PR_CHECK_JOBS } from './workflow/source-routing/pr-code-change-scope.mjs' import { lookupReadyCheckRun, prCheckRunTitle, diff --git a/config/scripts/pr-workflow-parallelism.test.mjs b/config/scripts/pr-workflow-parallelism.test.mjs index cde646b40e1..455c7eb120f 100644 --- a/config/scripts/pr-workflow-parallelism.test.mjs +++ b/config/scripts/pr-workflow-parallelism.test.mjs @@ -84,7 +84,7 @@ describe('PR workflow parallelism', () => { exec: async (command, args, options) => { expect(command).toBe('/bundled/node24') expect(args).toEqual([ - 'config/scripts/ci-unit-selection-review.mjs', + 'config/scripts/ci/unit-selection/ci-unit-selection-review.mjs', 'unit-evidence', ...(rebuild === 'true' ? ['ci-shards/unit-selection.json'] : []) ]) diff --git a/config/scripts/benchmark-ci-preflight-critical-path.mjs b/config/scripts/preflight/benchmarks/benchmark-ci-preflight-critical-path.mjs similarity index 62% rename from config/scripts/benchmark-ci-preflight-critical-path.mjs rename to config/scripts/preflight/benchmarks/benchmark-ci-preflight-critical-path.mjs index e65798e8087..3bd3596eaff 100644 --- a/config/scripts/benchmark-ci-preflight-critical-path.mjs +++ b/config/scripts/preflight/benchmarks/benchmark-ci-preflight-critical-path.mjs @@ -1,18 +1,18 @@ -import { readPinnedBunVersion } from './pinned-bun-executable.mjs' +import { readPinnedBunVersion } from '../../tool-invocation/pinned-bun-executable.mjs' import { cpSync, mkdirSync, rmSync, writeFileSync } from 'node:fs' import { availableParallelism, totalmem } from 'node:os' import path from 'node:path' -import { fileURLToPath } from 'node:url' +import { fileURLToPath, pathToFileURL } from 'node:url' import { runProcessSync } from '@orca/process-host' import { measurePreflightCommand } from './preflight-benchmark-command.mjs' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' -import { summarizeBenchmarkSamples } from './benchmark-sample-summary.mjs' +import { buildCounterbalancedSchedule } from '../../performance/measurement/counterbalanced-benchmark-schedule.mjs' +import { summarizeBenchmarkSamples } from '../../performance/measurement/benchmark-sample-summary.mjs' const comparison = process.argv[2] if (!['smoke', 'sync-spawn', 'typecheck'].includes(comparison) || process.argv.length !== 3) { throw new Error('Use smoke, sync-spawn or typecheck') } -const root = fileURLToPath(new URL('../..', import.meta.url)) +const root = fileURLToPath(new URL('../../../..', import.meta.url)) const output = path.join(root, '.build/preflight-benchmark') mkdirSync(output, { recursive: true }) const env = { ...process.env, ORCA_BACKGROUND_LAUNCH: '1' } @@ -36,12 +36,64 @@ const save = () => `${JSON.stringify(report, null, 2)}\n` ) +const currentScriptPaths = { + 'config/scripts/runtime-serve-terminal-smoke.mjs': + 'config/scripts/runtime-serve-terminal-smoke.mjs', + 'config/scripts/run-typecheck-projects-in-parallel.mjs': + 'config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.mjs', + 'config/scripts/check-main-sync-spawn-ratchet.mjs': + 'config/scripts/static-analysis/process-boundaries/check-main-sync-spawn-ratchet.mjs', + 'config/scripts/gated-call-use-collector.mjs': + 'config/scripts/static-analysis/process-boundaries/gated-call-use-collector.mjs' +} + +function baselineScriptPath(file) { + const canonical = currentScriptPaths[file] ?? file + const result = runProcessSync({ + program: 'git', + args: ['cat-file', '-e', `HEAD^1:${canonical}`], + cwd: root + }) + return result.code === 0 ? canonical : file +} + +const baselineCurrentDependencies = { + './ratchet-baseline.mjs': 'config/scripts/static-analysis/ratchet-baseline/ratchet-baseline.mjs', + './pinned-bun-executable.mjs': 'config/scripts/tool-invocation/pinned-bun-executable.mjs', + './build-orcad-node.mjs': 'config/scripts/orcad-distribution/prebuilds/build-orcad-node.mjs', + './server-build-target.mjs': + 'config/scripts/orcad-distribution/prebuilds/server-build-target.mjs', + './tsrs-typecheck-compiler.mjs': + 'config/scripts/typecheck/project-execution/tsrs-typecheck-compiler.mjs', + './test-only-source-path.mjs': + 'config/scripts/static-analysis/process-boundaries/test-only-source-path.mjs', + './static-module-specifiers.mjs': + 'config/scripts/static-analysis/module-requests/static-module-specifiers.mjs' +} + +function relocateBaselineDependencies(contents) { + for (const [specifier, file] of Object.entries(baselineCurrentDependencies)) { + const url = pathToFileURL(path.join(root, file)).href + for (const quote of ["'", '"']) { + contents = contents.replaceAll( + `from ${quote}${specifier}${quote}`, + `from ${quote}${url}${quote}` + ) + } + } + return contents +} + function baselineSource(file) { - const result = runProcessSync({ program: 'git', args: ['show', `HEAD^1:${file}`], cwd: root }) + const result = runProcessSync({ + program: 'git', + args: ['show', `HEAD^1:${baselineScriptPath(file)}`], + cwd: root + }) if (result.code !== 0 || result.outputTruncated) { throw new Error(`Cannot read baseline ${file}`) } - return result.stdout + return relocateBaselineDependencies(result.stdout) } async function command(program, args, label) { const result = await measurePreflightCommand({ program, args, label, root, output, env }) @@ -57,23 +109,41 @@ const baselineName = : comparison === 'typecheck' ? 'run-typecheck-projects-in-parallel.mjs' : 'check-main-sync-spawn-ratchet.mjs' -const baselineFile = path.join(root, 'config/scripts', `.benchmark-baseline-${baselineName}`) +const baselineFile = path.join( + root, + path.dirname(baselineScriptPath(`config/scripts/${baselineName}`)), + `.benchmark-baseline-${baselineName}` +) const runnerFile = path.join(output, 'baseline-smoke-runner.mjs') const mobileBundle = path.join(output, 'smoke-mobile-web') // The sync-spawn ratchet's analysis lives in a shared module; compare the parent's copy of it too. const collectorName = 'gated-call-use-collector.mjs' const baselineCollectorFile = path.join( root, - 'config/scripts', + path.dirname(baselineScriptPath(`config/scripts/${collectorName}`)), `.benchmark-baseline-${collectorName}` ) +const relativeRequest = (from, target) => { + const relative = path.posix.relative(path.posix.dirname(from), target) + return relative.startsWith('../') || relative.startsWith('./') ? relative : `./${relative}` +} +const collectorRequest = relativeRequest( + baselineScriptPath(`config/scripts/${baselineName}`), + baselineScriptPath(`config/scripts/${collectorName}`) +) +const generatedCollectorRequest = relativeRequest( + baselineFile.split(path.sep).join('/'), + baselineCollectorFile.split(path.sep).join('/') +) let baselineScript = baselineSource(`config/scripts/${baselineName}`) -if (baselineScript.includes(`./${collectorName}`)) { +if (["'", '"'].some((quote) => baselineScript.includes(`${quote}${collectorRequest}${quote}`))) { writeFileSync(baselineCollectorFile, baselineSource(`config/scripts/${collectorName}`)) - baselineScript = baselineScript.replaceAll( - `./${collectorName}`, - `./.benchmark-baseline-${collectorName}` - ) + for (const quote of ["'", '"']) { + baselineScript = baselineScript.replaceAll( + `${quote}${collectorRequest}${quote}`, + `${quote}${generatedCollectorRequest}${quote}` + ) + } } writeFileSync(baselineFile, baselineScript) @@ -87,8 +157,9 @@ try { } } if (comparison === 'sync-spawn') { - const baseline = await import(new URL(`./.benchmark-baseline-${baselineName}`, import.meta.url)) - const candidate = await import('./check-main-sync-spawn-ratchet.mjs') + const baseline = await import(pathToFileURL(baselineFile)) + const candidate = + await import('../../static-analysis/process-boundaries/check-main-sync-spawn-ratchet.mjs') const sources = candidate.collectSyncSpawnSources(root) let analyzed = 0 for (const [file, contents] of sources) { @@ -118,7 +189,10 @@ try { rmSync(mobileBundle, { recursive: true, force: true }) cpSync(path.join(root, 'out', 'mobile-web'), mobileBundle, { recursive: true }) const steps = [ - [process.execPath, ['config/scripts/ensure-native-runtime.mjs', '--runtime=node']], + [ + process.execPath, + ['config/scripts/native-build/node-addons/ensure-native-runtime.mjs', '--runtime=node'] + ], ['pnpm', ['run', 'build:cli']], ['pnpm', ['run', 'build:orcad']], [process.execPath, [baselineFile, '--target', 'orcad']] @@ -164,7 +238,9 @@ for (const [program, args] of ${JSON.stringify(steps)}) { result = await command( process.execPath, [ - arm === 'baseline' ? baselineFile : `config/scripts/${baselineName}`, + arm === 'baseline' + ? baselineFile + : currentScriptPaths[`config/scripts/${baselineName}`], '--compiler=bun', '--bun-concurrency=2', '--bun-threads=2' @@ -174,7 +250,9 @@ for (const [program, args] of ${JSON.stringify(steps)}) { } else { result = await command( 'bun', - [arm === 'baseline' ? baselineFile : `config/scripts/${baselineName}`], + [ + arm === 'baseline' ? baselineFile : currentScriptPaths[`config/scripts/${baselineName}`] + ], `sync-spawn-${pair}-${arm}` ) if (findings !== undefined && findings !== result.stdout) { diff --git a/config/scripts/benchmark-preflight-compat-boundary.mjs b/config/scripts/preflight/benchmarks/benchmark-preflight-compat-boundary.mjs similarity index 82% rename from config/scripts/benchmark-preflight-compat-boundary.mjs rename to config/scripts/preflight/benchmarks/benchmark-preflight-compat-boundary.mjs index 8e53bef8072..8cd17f9d774 100644 --- a/config/scripts/benchmark-preflight-compat-boundary.mjs +++ b/config/scripts/preflight/benchmarks/benchmark-preflight-compat-boundary.mjs @@ -1,12 +1,12 @@ -import { readPinnedBunVersion } from './pinned-bun-executable.mjs' +import { readPinnedBunVersion } from '../../tool-invocation/pinned-bun-executable.mjs' import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs' import path from 'node:path' import { fileURLToPath, pathToFileURL } from 'node:url' import { measurePreflightCommand } from './preflight-benchmark-command.mjs' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' -import { summarizeBenchmarkSamples } from './benchmark-sample-summary.mjs' +import { buildCounterbalancedSchedule } from '../../performance/measurement/counterbalanced-benchmark-schedule.mjs' +import { summarizeBenchmarkSamples } from '../../performance/measurement/benchmark-sample-summary.mjs' -const root = fileURLToPath(new URL('../..', import.meta.url)) +const root = fileURLToPath(new URL('../../../..', import.meta.url)) const output = path.join(root, '.build/preflight-benchmark') mkdirSync(output, { recursive: true }) const bun = process.env.ORCA_BENCHMARK_BUN ?? 'bun' @@ -53,12 +53,27 @@ const baselineSource = ( ) ).stdout // Both versions inspect this checkout and load the same parser and source inventory. +const baselineImportPaths = { + './check-process-host-imports.mjs': + 'config/scripts/static-analysis/process-boundaries/check-process-host-imports.mjs', + './static-module-specifiers.mjs': + 'config/scripts/static-analysis/module-requests/static-module-specifiers.mjs', + './test-only-source-path.mjs': + 'config/scripts/static-analysis/process-boundaries/test-only-source-path.mjs' +} writeFileSync( baselinePath, baselineSource.replace( /from '(\.\/[^']+)'/g, (_, specifier) => - `from '${pathToFileURL(path.resolve(root, 'config/scripts', specifier)).href}'` + `from '${ + pathToFileURL( + path.resolve( + root, + baselineImportPaths[specifier] ?? path.posix.join('config/scripts', specifier) + ) + ).href + }'` ) ) const arms = { diff --git a/config/scripts/benchmark-preflight-compilers.mjs b/config/scripts/preflight/benchmarks/benchmark-preflight-compilers.mjs similarity index 95% rename from config/scripts/benchmark-preflight-compilers.mjs rename to config/scripts/preflight/benchmarks/benchmark-preflight-compilers.mjs index 4d427f7ce46..08ed59a6f5a 100644 --- a/config/scripts/benchmark-preflight-compilers.mjs +++ b/config/scripts/preflight/benchmarks/benchmark-preflight-compilers.mjs @@ -1,24 +1,24 @@ -import { readPinnedBunVersion } from './pinned-bun-executable.mjs' +import { readPinnedBunVersion } from '../../tool-invocation/pinned-bun-executable.mjs' import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs' import { availableParallelism, totalmem } from 'node:os' import path from 'node:path' import { fileURLToPath } from 'node:url' import { performance } from 'node:perf_hooks' import { measurePreflightCommand } from './preflight-benchmark-command.mjs' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' -import { summarizeBenchmarkSamples } from './benchmark-sample-summary.mjs' +import { buildCounterbalancedSchedule } from '../../performance/measurement/counterbalanced-benchmark-schedule.mjs' +import { summarizeBenchmarkSamples } from '../../performance/measurement/benchmark-sample-summary.mjs' import { TYPECHECK_PROJECTS, admissibleHeapGib, planTypecheckBatches, resolveProjectCompiler -} from './run-typecheck-projects-in-parallel.mjs' +} from '../../typecheck/project-execution/run-typecheck-projects-in-parallel.mjs' const parityOnly = process.argv.slice(2).includes('--parity-only') if (process.argv.slice(2).some((argument) => argument !== '--parity-only')) { throw new Error('Use --parity-only or no arguments') } -const root = fileURLToPath(new URL('../..', import.meta.url)) +const root = fileURLToPath(new URL('../../../..', import.meta.url)) const output = path.join(root, '.build/preflight-benchmark') const reportName = parityOnly ? 'compiler-parity' : 'compilers' mkdirSync(output, { recursive: true }) diff --git a/config/scripts/benchmark-preflight-localization-extraction.mjs b/config/scripts/preflight/benchmarks/benchmark-preflight-localization-extraction.mjs similarity index 89% rename from config/scripts/benchmark-preflight-localization-extraction.mjs rename to config/scripts/preflight/benchmarks/benchmark-preflight-localization-extraction.mjs index 51d0a214e2f..8fed514721b 100644 --- a/config/scripts/benchmark-preflight-localization-extraction.mjs +++ b/config/scripts/preflight/benchmarks/benchmark-preflight-localization-extraction.mjs @@ -1,12 +1,12 @@ -import { readPinnedBunVersion } from './pinned-bun-executable.mjs' +import { readPinnedBunVersion } from '../../tool-invocation/pinned-bun-executable.mjs' import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs' import path from 'node:path' import { fileURLToPath } from 'node:url' import { measurePreflightCommand } from './preflight-benchmark-command.mjs' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' -import { summarizeBenchmarkSamples } from './benchmark-sample-summary.mjs' +import { buildCounterbalancedSchedule } from '../../performance/measurement/counterbalanced-benchmark-schedule.mjs' +import { summarizeBenchmarkSamples } from '../../performance/measurement/benchmark-sample-summary.mjs' -const root = fileURLToPath(new URL('../..', import.meta.url)) +const root = fileURLToPath(new URL('../../../..', import.meta.url)) const output = path.join(root, '.build/preflight-benchmark') mkdirSync(output, { recursive: true }) const bun = process.env.ORCA_BENCHMARK_BUN ?? 'bun' diff --git a/config/scripts/benchmark-preflight-static-analysis.mjs b/config/scripts/preflight/benchmarks/benchmark-preflight-static-analysis.mjs similarity index 91% rename from config/scripts/benchmark-preflight-static-analysis.mjs rename to config/scripts/preflight/benchmarks/benchmark-preflight-static-analysis.mjs index 0d1942c4117..5a7b8117f46 100644 --- a/config/scripts/benchmark-preflight-static-analysis.mjs +++ b/config/scripts/preflight/benchmarks/benchmark-preflight-static-analysis.mjs @@ -1,16 +1,16 @@ -import { readPinnedBunVersion } from './pinned-bun-executable.mjs' +import { readPinnedBunVersion } from '../../tool-invocation/pinned-bun-executable.mjs' import { cpSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs' import path from 'node:path' import { performance } from 'node:perf_hooks' import { fileURLToPath } from 'node:url' import { measurePreflightCommand } from './preflight-benchmark-command.mjs' import ts from 'typescript-api' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' -import { summarizeBenchmarkSamples } from './benchmark-sample-summary.mjs' -import { resolveOxlintInvocation } from './oxlint-cli-invocation.mjs' -import { resolveOxcCliInvocation } from './oxc-cli-invocation.mjs' +import { buildCounterbalancedSchedule } from '../../performance/measurement/counterbalanced-benchmark-schedule.mjs' +import { summarizeBenchmarkSamples } from '../../performance/measurement/benchmark-sample-summary.mjs' +import { resolveOxlintInvocation } from '../../tool-invocation/oxlint-cli-invocation.mjs' +import { resolveOxcCliInvocation } from '../../tool-invocation/oxc-cli-invocation.mjs' -const root = fileURLToPath(new URL('../..', import.meta.url)) +const root = fileURLToPath(new URL('../../../..', import.meta.url)) const output = path.join(root, '.build/preflight-benchmark') const baseline = path.join(output, 'baseline') mkdirSync(output, { recursive: true }) @@ -144,7 +144,7 @@ for (const [comparison, first, second] of [ const program = arm.startsWith('bun') ? bun : process.execPath const args = comparison === 'import-guard-runtime' - ? ['config/scripts/check-process-host-imports.mjs'] + ? ['config/scripts/static-analysis/process-boundaries/check-process-host-imports.mjs'] : lintArgs(comparison === 'anti-slop-patch' ? arm : 'patched') const result = await requireSuccess( program, @@ -193,7 +193,7 @@ try { for (const runtime of [process.execPath, bun]) { const result = await command( runtime, - ['config/scripts/check-process-host-imports.mjs'], + ['config/scripts/static-analysis/process-boundaries/check-process-host-imports.mjs'], `guard-invalid-${path.basename(runtime)}` ) if ( @@ -223,7 +223,7 @@ for (const [pair, arms] of buildCounterbalancedSchedule(4, 'baseline', 'optimize ), requireSuccess( runtime, - ['config/scripts/check-process-host-imports.mjs'], + ['config/scripts/static-analysis/process-boundaries/check-process-host-imports.mjs'], `early-${pair}-${arm}-import-guard` ) ]) diff --git a/config/scripts/preflight-benchmark-command.mjs b/config/scripts/preflight/benchmarks/preflight-benchmark-command.mjs similarity index 100% rename from config/scripts/preflight-benchmark-command.mjs rename to config/scripts/preflight/benchmarks/preflight-benchmark-command.mjs diff --git a/config/scripts/casting-code-quality.test.mjs b/config/scripts/preflight/changed-checks/casting-code-quality.test.mjs similarity index 97% rename from config/scripts/casting-code-quality.test.mjs rename to config/scripts/preflight/changed-checks/casting-code-quality.test.mjs index 0480ab4ac59..932bbf846a1 100644 --- a/config/scripts/casting-code-quality.test.mjs +++ b/config/scripts/preflight/changed-checks/casting-code-quality.test.mjs @@ -8,9 +8,9 @@ import { findCastingDirectivesMissingSafety, isCastingDirectiveUnusedWarning } from './check-changed-code-quality.mjs' -import { resolveOxlintInvocation } from './oxlint-cli-invocation.mjs' +import { resolveOxlintInvocation } from '../../tool-invocation/oxlint-cli-invocation.mjs' -const root = path.resolve(import.meta.dirname, '..', '..') +const root = path.resolve(import.meta.dirname, '../../..', '..') const oxlint = resolveOxlintInvocation(root) const rule = 'typescript(consistent-type-assertions)' const ruleName = 'typescript/consistent-type-assertions' diff --git a/config/scripts/check-changed-code-quality.mjs b/config/scripts/preflight/changed-checks/check-changed-code-quality.mjs similarity index 97% rename from config/scripts/check-changed-code-quality.mjs rename to config/scripts/preflight/changed-checks/check-changed-code-quality.mjs index fb15ff7fdc9..e5b1439d63f 100644 --- a/config/scripts/check-changed-code-quality.mjs +++ b/config/scripts/preflight/changed-checks/check-changed-code-quality.mjs @@ -4,10 +4,10 @@ import path from 'node:path' import process from 'node:process' import { pathToFileURL } from 'node:url' import { runProcessSync } from '@orca/process-host' -import { scanAstGrep } from './ast-grep-scan.mjs' -import { resolvePullRequestDiffBase } from './git-pull-request-diff-base.mjs' -import { resolveOxlintInvocation } from './oxlint-cli-invocation.mjs' -import { createExistingTypeAssertionMatcher } from './existing-type-assertions.mjs' +import { scanAstGrep } from '../../static-analysis/structural-scan/ast-grep-scan.mjs' +import { resolvePullRequestDiffBase } from '../../git/pr-diff-base/git-pull-request-diff-base.mjs' +import { resolveOxlintInvocation } from '../../tool-invocation/oxlint-cli-invocation.mjs' +import { createExistingTypeAssertionMatcher } from '../../static-analysis/type-assertion-budget/existing-type-assertions.mjs' const SOURCE_FILE_PATTERN = /\.(?:[cm]?[jt]sx?)$/ const ROOT_CODE_QUALITY_IGNORED_PREFIXES = ['cloud/'] @@ -24,7 +24,7 @@ const REACT_DOCTOR_DISABLE_PATTERN = const JS_PLUGINS_CONFIG = 'config/oxlint-js-plugins.json' // The root scan no longer loads these plugins, so their suppressions belong to the JS plugins scan. const JS_PLUGIN_NAMES = JSON.parse( - readFileSync(new URL(`../../${JS_PLUGINS_CONFIG}`, import.meta.url), 'utf8') + readFileSync(new URL(`../../../../${JS_PLUGINS_CONFIG}`, import.meta.url), 'utf8') ).jsPlugins.map((plugin) => plugin.name) const JS_PLUGIN_DISABLE_PATTERN = new RegExp( String.raw`\/[/*]\s*(?:oxlint|eslint)-disable(?:-next-line|-line)?\s[^\n]*\b(?:${JS_PLUGIN_NAMES.join('|')})\/` diff --git a/config/scripts/check-changed-code-quality.test.mjs b/config/scripts/preflight/changed-checks/check-changed-code-quality.test.mjs similarity index 97% rename from config/scripts/check-changed-code-quality.test.mjs rename to config/scripts/preflight/changed-checks/check-changed-code-quality.test.mjs index c1a9e6bb390..138bd1cabe6 100644 --- a/config/scripts/check-changed-code-quality.test.mjs +++ b/config/scripts/preflight/changed-checks/check-changed-code-quality.test.mjs @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os' import path from 'node:path' import { describe, expect, it } from 'vitest' import { runProcessSync } from '@orca/process-host' -import { resolveOxlintInvocation } from './oxlint-cli-invocation.mjs' +import { resolveOxlintInvocation } from '../../tool-invocation/oxlint-cli-invocation.mjs' import { OXLINT_SCANS, collectBaseLineBlocks, @@ -14,7 +14,7 @@ import { } from './check-changed-code-quality.mjs' function scanFixture(label, file) { - const root = path.resolve(import.meta.dirname, '..', '..') + const root = path.resolve(import.meta.dirname, '../../..', '..') const scan = OXLINT_SCANS.find((candidate) => candidate.label === label) if (!scan) { throw new Error(`Missing ${label} scan`) @@ -80,7 +80,7 @@ describe('changed-code quality line matching', () => { }) it('discovers nested rule overrides while retaining root diagnostics', () => { - const root = path.resolve(import.meta.dirname, '..', '..') + const root = path.resolve(import.meta.dirname, '../../..', '..') const directory = mkdtempSync(path.join(root, 'config', 'changed-code-quality-nested-')) try { const nested = path.join(directory, 'nested') @@ -106,7 +106,7 @@ describe('changed-code quality line matching', () => { }) it('reports duplicate imports through the actual focused scan', () => { - const root = path.resolve(import.meta.dirname, '..', '..') + const root = path.resolve(import.meta.dirname, '../../..', '..') const directory = mkdtempSync(path.join(root, 'config', 'changed-code-quality-import-')) try { const file = path.join(directory, 'consumer.ts') @@ -128,7 +128,7 @@ describe('changed-code quality line matching', () => { it.each(['src/renderer/src', 'mobile/src'])( 'checks nested components natively and keeps the selective index-key check in %s', (sourceRoot) => { - const root = path.resolve(import.meta.dirname, '../..') + const root = path.resolve(import.meta.dirname, '../../../..') const directory = mkdtempSync(path.join(root, sourceRoot, 'native-react-lint-')) try { const file = path.join(directory, 'List.tsx') @@ -323,7 +323,7 @@ describe('moved-code exemption', () => { }) describe('unloaded plugin directive unused warning', () => { - const root = path.resolve(import.meta.dirname, '..', '..') + const root = path.resolve(import.meta.dirname, '../../..', '..') // Assembled so no line here is itself a directive the gate would scan. const directive = (rule) => `/* oxlint-disable ${rule} -- reason */` diff --git a/config/scripts/check-changed-pass-cache.mjs b/config/scripts/preflight/changed-checks/check-changed-pass-cache.mjs similarity index 92% rename from config/scripts/check-changed-pass-cache.mjs rename to config/scripts/preflight/changed-checks/check-changed-pass-cache.mjs index 6fd2f920f8d..a232a108ec4 100644 --- a/config/scripts/check-changed-pass-cache.mjs +++ b/config/scripts/preflight/changed-checks/check-changed-pass-cache.mjs @@ -13,9 +13,9 @@ const HASHED_CONFIG_FILES = [ '.oxlintrc.json', '.oxfmtrc.json', 'config/vitest.config.ts', - 'config/scripts/check-changed.mjs', - 'config/scripts/check-changed-selection.mjs', - 'config/scripts/check-changed-pass-cache.mjs' + 'config/scripts/preflight/changed-checks/check-changed.mjs', + 'config/scripts/preflight/changed-checks/check-changed-selection.mjs', + 'config/scripts/preflight/changed-checks/check-changed-pass-cache.mjs' ] function git(root, args) { diff --git a/config/scripts/check-changed-pass-cache.test.mjs b/config/scripts/preflight/changed-checks/check-changed-pass-cache.test.mjs similarity index 100% rename from config/scripts/check-changed-pass-cache.test.mjs rename to config/scripts/preflight/changed-checks/check-changed-pass-cache.test.mjs diff --git a/config/scripts/check-changed-selection.mjs b/config/scripts/preflight/changed-checks/check-changed-selection.mjs similarity index 90% rename from config/scripts/check-changed-selection.mjs rename to config/scripts/preflight/changed-checks/check-changed-selection.mjs index 67771e122dd..3b8ec2e078b 100644 --- a/config/scripts/check-changed-selection.mjs +++ b/config/scripts/preflight/changed-checks/check-changed-selection.mjs @@ -1,10 +1,18 @@ -import { affectsLocalizationExtraction } from './localization-extraction-change-scope.mjs' -import { classifyPrJobs, isDocsOnlyPath } from './pr-code-change-scope.mjs' -import { listRatchetScripts } from './run-ratchets.mjs' +import { affectsLocalizationExtraction } from '../../localization/extraction-policy/localization-extraction-change-scope.mjs' +import { + classifyPrJobs, + isDocsOnlyPath +} from '../../workflow/source-routing/pr-code-change-scope.mjs' +import { listRatchetScripts } from '../../static-analysis/ratchet-runner/run-ratchets.mjs' // Any of these can change what every check reports, so they select all of them. const SELECT_ALL_FILES = new Set(['package.json', 'pnpm-lock.yaml', 'pnpm-workspace.yaml']) -const SELECT_ALL_PREFIXES = ['config/scripts/check-changed', 'config/scripts/pr-code-change-scope'] +const SELECT_ALL_PREFIXES = [ + 'config/scripts/check-changed', + 'config/scripts/preflight/changed-checks/check-changed', + 'config/scripts/pr-code-change-scope', + 'config/scripts/workflow/source-routing/pr-code-change-scope' +] // Mirrors forceRerunTriggers in config/vitest.config.ts: one such path in a `related` run selects // every test. That full run is CI's job; locally these paths run only their own colocated tests. @@ -121,13 +129,17 @@ export const VERIFY_CHECKS = [ { name: 'node runtime pin', args: ['config/scripts/check-node-runtime-pin.mjs'], - inputs: ['src/shared/node-runtime-pin', 'config/scripts/node-dist-archive-name'] + inputs: [ + 'src/shared/node-runtime-pin', + 'config/scripts/node-dist-archive-name', + 'config/scripts/node-runtime/archive-identity/node-dist-archive-name' + ] }, { name: 'test file runners', args: ['config/scripts/check-test-file-runners.mjs'], inputs: [ - 'config/scripts/ci-unit-files.mjs', + 'config/scripts/ci/unit-selection/dependency-graph/ci-unit-files.mjs', 'tests/playwright.config.ts', 'mobile/vitest.config.ts' ], @@ -217,7 +229,7 @@ export function selectTypecheckProjects(files) { // Shared analysis modules select every ratchet built on them. const RATCHET_SHARED_MODULES = { - 'config/scripts/gated-call-use-collector.mjs': [ + 'config/scripts/static-analysis/process-boundaries/gated-call-use-collector.mjs': [ 'check-daemon-blocking-call-ratchet.mjs', 'check-main-sync-spawn-ratchet.mjs' ] @@ -230,7 +242,11 @@ function listRatchetChecks(scriptsDir) { scripts.add('check-flaky-test-pattern-ratchet.mjs') return [...scripts].sort().map((script) => ({ name: script.replace(/^check-|\.mjs$/g, ''), - args: [`config/scripts/${script}`], + args: [ + script === 'check-main-sync-spawn-ratchet.mjs' + ? 'config/scripts/static-analysis/process-boundaries/check-main-sync-spawn-ratchet.mjs' + : `config/scripts/${script}` + ], inputs: RATCHET_INPUTS[script] ?? SOURCE_ROOTS, matches: (files) => files.some( diff --git a/config/scripts/check-changed-selection.test.mjs b/config/scripts/preflight/changed-checks/check-changed-selection.test.mjs similarity index 97% rename from config/scripts/check-changed-selection.test.mjs rename to config/scripts/preflight/changed-checks/check-changed-selection.test.mjs index 03ab8a95aae..d9d4ec9cb4e 100644 --- a/config/scripts/check-changed-selection.test.mjs +++ b/config/scripts/preflight/changed-checks/check-changed-selection.test.mjs @@ -2,7 +2,7 @@ import { join } from 'node:path' import { expect, it } from 'vitest' import { planChangedChecks, splitUnitTestInputs } from './check-changed-selection.mjs' -const scriptsDir = join(import.meta.dirname) +const scriptsDir = join(import.meta.dirname, '../..') const plan = (files) => planChangedChecks(files, { scriptsDir }) const checkNames = (files) => plan(files).checks.map((check) => check.name) diff --git a/config/scripts/check-changed.mjs b/config/scripts/preflight/changed-checks/check-changed.mjs similarity index 93% rename from config/scripts/check-changed.mjs rename to config/scripts/preflight/changed-checks/check-changed.mjs index 150dd8d0c93..011ccaf5236 100644 --- a/config/scripts/check-changed.mjs +++ b/config/scripts/preflight/changed-checks/check-changed.mjs @@ -12,8 +12,8 @@ import { writePassHash } from './check-changed-pass-cache.mjs' import { planChangedChecks } from './check-changed-selection.mjs' -import { resolveOxcCliInvocation } from './oxc-cli-invocation.mjs' -import { resolvePnpmCliInvocation } from './pnpm-cli-invocation.mjs' +import { resolveOxcCliInvocation } from '../../tool-invocation/oxc-cli-invocation.mjs' +import { resolvePnpmCliInvocation } from '../../tool-invocation/pnpm-cli-invocation.mjs' const OUTPUT_TAIL_LINES = 200 const HEARTBEAT_MS = 60_000 @@ -122,7 +122,7 @@ function buildTasks(root, plan, { files, mergeBase, maxWorkers, bun }) { name: `typecheck (${plan.typecheckProjects.map((config) => path.basename(config, '.json')).join(', ')})`, steps: [ step(node, [ - 'config/scripts/run-typecheck-projects-in-parallel.mjs', + 'config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.mjs', ...plan.typecheckProjects.map((config) => `--project=${config}`), // A worker cap means a shared host; 4 checkers cut typecheck CPU by about a third. ...(maxWorkers ? [`--checkers=${Math.max(2, Number(maxWorkers) * 2)}`] : []) @@ -135,7 +135,7 @@ function buildTasks(root, plan, { files, mergeBase, maxWorkers, bun }) { if (related.length > 0 || colocated.length > 0) { const vitest = (selection) => step(node, [ - 'config/scripts/run-vitest.mjs', + 'config/scripts/test-runtime/execution-policy/run-vitest.mjs', ...selection, '--config', 'config/vitest.config.ts', @@ -145,7 +145,10 @@ function buildTasks(root, plan, { files, mergeBase, maxWorkers, bun }) { tasks.push({ name: 'unit tests', steps: [ - step(node, ['config/scripts/ensure-native-runtime.mjs', '--runtime=node']), + step(node, [ + 'config/scripts/native-build/node-addons/ensure-native-runtime.mjs', + '--runtime=node' + ]), ...(related.length > 0 ? [ vitest( @@ -162,7 +165,12 @@ function buildTasks(root, plan, { files, mergeBase, maxWorkers, bun }) { if (plan.staticAnalysis) { tasks.push({ name: 'changed-code quality', - steps: [step(node, ['config/scripts/check-changed-code-quality.mjs', mergeBase])] + steps: [ + step(node, [ + 'config/scripts/preflight/changed-checks/check-changed-code-quality.mjs', + mergeBase + ]) + ] }) if (existing.length > 0) { tasks.push({ @@ -302,7 +310,8 @@ export async function main(root, argv) { buildWorkspacePackages(root, env) } const { runProcess, runProcessSync } = await import('@orca/process-host') - const { resolvePinnedBunExecutable } = await import('./pinned-bun-executable.mjs') + const { resolvePinnedBunExecutable } = + await import('../../tool-invocation/pinned-bun-executable.mjs') const bun = () => resolvePinnedBunExecutable(root, runProcessSync) ?? 'bun' const tasks = buildTasks(root, plan, { files, diff --git a/config/scripts/moved-code-matcher.test.mjs b/config/scripts/preflight/changed-checks/moved-code-matcher.test.mjs similarity index 96% rename from config/scripts/moved-code-matcher.test.mjs rename to config/scripts/preflight/changed-checks/moved-code-matcher.test.mjs index 8651438ef7c..07fb2e9c56a 100644 --- a/config/scripts/moved-code-matcher.test.mjs +++ b/config/scripts/preflight/changed-checks/moved-code-matcher.test.mjs @@ -3,11 +3,11 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, describe, expect, it, vi } from 'vitest' import * as quality from './check-changed-code-quality.mjs' -import { createExistingTypeAssertionMatcher } from './existing-type-assertions.mjs' +import { createExistingTypeAssertionMatcher } from '../../static-analysis/type-assertion-budget/existing-type-assertions.mjs' const processCalls = vi.hoisted(() => ({ execFileSync: vi.fn(), spawnSync: vi.fn() })) vi.mock('node:child_process', () => processCalls) -vi.mock('./oxlint-cli-invocation.mjs', () => ({ +vi.mock('../../tool-invocation/oxlint-cli-invocation.mjs', () => ({ resolveOxlintInvocation: () => ({ command: 'fixture-oxlint', prefixArgs: [] }) })) diff --git a/config/scripts/qualified-orcad-template.test.mjs b/config/scripts/qualified-orcad-template.test.mjs index 2d13e2b765d..d76289ef49b 100644 --- a/config/scripts/qualified-orcad-template.test.mjs +++ b/config/scripts/qualified-orcad-template.test.mjs @@ -12,7 +12,7 @@ import { join, resolve } from 'node:path' import { expect, it } from 'vitest' import { parse } from 'yaml' import { runProcessSync } from '@orca/process-host' -import { writeOrcadTemplateTestFixture } from './orcad-template-test-fixture.mjs' +import { writeOrcadTemplateTestFixture } from './orcad-distribution/template/orcad-template-test-fixture.mjs' const workflow = parse(readFileSync('.github/workflows/qualified-orcad-template.yml', 'utf8')) const identity = workflow.jobs.cache.steps.find((step) => step.id === 'identity') diff --git a/config/scripts/raw-markdown-comment-scan-benchmark.mjs b/config/scripts/raw-markdown-comment-scan-benchmark.mjs index 11cf27a56e3..2f2a4e5ef30 100644 --- a/config/scripts/raw-markdown-comment-scan-benchmark.mjs +++ b/config/scripts/raw-markdown-comment-scan-benchmark.mjs @@ -4,7 +4,7 @@ import { readFileSync } from 'node:fs' import { dirname, resolve } from 'node:path' import { performance } from 'node:perf_hooks' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' const baseline = process.argv[2] ?? '20ab9950654' const historicalFile = 'src/renderer/src/components/editor/raw-markdown-html.ts' diff --git a/config/scripts/release-policy.mjs b/config/scripts/release-policy.mjs index b6892901a84..7b231e2bae3 100644 --- a/config/scripts/release-policy.mjs +++ b/config/scripts/release-policy.mjs @@ -5,7 +5,7 @@ import { DESKTOP_STABLE_TAG as STABLE_TAG, MOBILE_TAG, isAgentStateRulesTag -} from './release-tag-patterns.mjs' +} from './release/versioning/release-tag-patterns.mjs' const BOT_LOGIN = 'github-actions[bot]' const BOT_EMAIL = '41898282+github-actions[bot]@users.noreply.github.com' diff --git a/config/scripts/release-tag-pattern-census.test.mjs b/config/scripts/release-tag-pattern-census.test.mjs index 863f28c9761..61cac6e5904 100644 --- a/config/scripts/release-tag-pattern-census.test.mjs +++ b/config/scripts/release-tag-pattern-census.test.mjs @@ -4,7 +4,7 @@ import { DESKTOP_STABLE_TAG, agentStateRulesTag, isAgentStateRulesTag -} from './release-tag-patterns.mjs' +} from './release/versioning/release-tag-patterns.mjs' const RULES_TAGS = [agentStateRulesTag(1, 'next'), agentStateRulesTag(1, 'stable')] const rulesRelease = (tag, extra = {}) => ({ diff --git a/config/scripts/release-javascript-artifact.mjs b/config/scripts/release/javascript-artifacts/release-javascript-artifact.mjs similarity index 95% rename from config/scripts/release-javascript-artifact.mjs rename to config/scripts/release/javascript-artifacts/release-javascript-artifact.mjs index 20578fcd588..cbf30513ef2 100644 --- a/config/scripts/release-javascript-artifact.mjs +++ b/config/scripts/release/javascript-artifacts/release-javascript-artifact.mjs @@ -13,10 +13,10 @@ import { } from 'node:fs' import { join, resolve } from 'node:path' import { runProcessSync } from '@orca/process-host' -import { describeProcessFailure } from './process-failure-message.mjs' -import { isDirectInvocation } from './script-entry-detection.mjs' -import { DESKTOP_RC_TAG, DESKTOP_STABLE_TAG } from './release-tag-patterns.mjs' -import { getTarProgram } from './zip-extractor-command.mjs' +import { describeProcessFailure } from '../../tool-invocation/process-failure-message.mjs' +import { isDirectInvocation } from '../../tool-invocation/script-entry-detection.mjs' +import { DESKTOP_RC_TAG, DESKTOP_STABLE_TAG } from '../versioning/release-tag-patterns.mjs' +import { getTarProgram } from '../../../../src/shared/zip-extractor-command.ts' const REQUIRED_FILES = [ 'cli/index.js', diff --git a/config/scripts/release-javascript-artifact.test.mjs b/config/scripts/release/javascript-artifacts/release-javascript-artifact.test.mjs similarity index 100% rename from config/scripts/release-javascript-artifact.test.mjs rename to config/scripts/release/javascript-artifacts/release-javascript-artifact.test.mjs diff --git a/config/scripts/release-javascript-benchmark.mjs b/config/scripts/release/javascript-artifacts/release-javascript-benchmark.mjs similarity index 96% rename from config/scripts/release-javascript-benchmark.mjs rename to config/scripts/release/javascript-artifacts/release-javascript-benchmark.mjs index ea3f296abda..e2e2954d0eb 100644 --- a/config/scripts/release-javascript-benchmark.mjs +++ b/config/scripts/release/javascript-artifacts/release-javascript-benchmark.mjs @@ -7,15 +7,15 @@ import { releaseJavascriptConfiguration, restoreReleaseJavascript } from './release-javascript-artifact.mjs' -import { resolvePnpmCliInvocation } from './pnpm-cli-invocation.mjs' +import { resolvePnpmCliInvocation } from '../../tool-invocation/pnpm-cli-invocation.mjs' import { runProcessSync } from '@orca/process-host' -import { describeProcessFailure } from './process-failure-message.mjs' +import { describeProcessFailure } from '../../tool-invocation/process-failure-message.mjs' import { annotateJavascriptParityFiles, compareJavascriptParityFiles } from './release-javascript-parity.mjs' -const root = resolve(import.meta.dirname, '../..') +const root = resolve(import.meta.dirname, '../../../..') const [mode, reportDir = '.build/release-javascript-measurements'] = process.argv.slice(2) function runBuild(script) { diff --git a/config/scripts/release-javascript-parity.mjs b/config/scripts/release/javascript-artifacts/release-javascript-parity.mjs similarity index 83% rename from config/scripts/release-javascript-parity.mjs rename to config/scripts/release/javascript-artifacts/release-javascript-parity.mjs index c82f562171e..57ff819ecc3 100644 --- a/config/scripts/release-javascript-parity.mjs +++ b/config/scripts/release/javascript-artifacts/release-javascript-parity.mjs @@ -3,31 +3,40 @@ import { createHash } from 'node:crypto' import { readFileSync } from 'node:fs' import { basename, join } from 'node:path' -const ASSET_PATH = /^(?:renderer|web)\/assets\/(.+)-[\w-]{8}\.(js|css|svg)$/ +const ASSET_PATH = /^(?:renderer|web)\/assets\/(.+)-[\w-]{8}\.(js|css|svg|json)$/ const TEXT_FILE = /\.(?:js|css|html|json|svg)$/ const NATIVE_COLOR = /color\(display-p3 ([^)]+)\)|(?<![\w-])lab\(([^)]+)\)/g function createAssetReferenceNormalizer(replacements) { const references = new RegExp( - [...replacements.keys()].map((name) => name.replace(/[.*+?^$(){}|[\]\\]/g, '\\$&')).join('|') || - '(?!)', + [...replacements.keys(), '@'] + .map((name) => name.replace(/[.*+?^$(){}|[\]\\]/g, '\\$&')) + .join('|'), 'g' ) - return (content) => content.replace(references, (name) => replacements.get(name) ?? name) + return (content) => + content.replace(references, (name) => + replacements.has(name) ? `@asset:${encodeURIComponent(replacements.get(name))}@` : '@@' + ) } -export function normalizeManifestSourcePaths(value) { +export function normalizeManifestSourcePaths(value, normalizeReferences = (text) => text) { if (typeof value === 'string') { - return value.replace(/node_modules\/\.pnpm\/[^/]+\/node_modules\//g, 'node_modules/') + return normalizeReferences( + value.replace(/node_modules\/\.pnpm\/[^/]+\/node_modules\//g, 'node_modules/') + ) } if (Array.isArray(value)) { - return value.map(normalizeManifestSourcePaths) + return value.map((child) => normalizeManifestSourcePaths(child, normalizeReferences)) } if (!value || typeof value !== 'object') { return value } const entries = Object.entries(value) - .map(([key, child]) => [normalizeManifestSourcePaths(key), normalizeManifestSourcePaths(child)]) + .map(([key, child]) => [ + normalizeManifestSourcePaths(key, normalizeReferences), + normalizeManifestSourcePaths(child, normalizeReferences) + ]) .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0)) assert.equal( new Set(entries.map(([key]) => key)).size, @@ -89,16 +98,19 @@ export function annotateJavascriptParityFiles(root, files) { if (!contents.has(file.path)) { return { ...file, comparablePath, comparableSha256: file.sha256 } } - let content = normalizeReferences(contents.get(file.path)) + let content = contents.get(file.path) const manifest = file.path === 'renderer/.vite/manifest.json' if (manifest) { - content = JSON.stringify(normalizeManifestSourcePaths(JSON.parse(content))) - } - if (file.path === 'renderer/.orca-web-client-files.json') { + content = JSON.stringify( + normalizeManifestSourcePaths(JSON.parse(content), normalizeReferences) + ) + } else if (file.path === 'renderer/.orca-web-client-files.json') { const members = JSON.parse(content) assert(Array.isArray(members) && members.every((member) => typeof member === 'string')) // Asset aliases can change the order of this file inventory after hash normalization. - content = JSON.stringify(members.sort()) + content = JSON.stringify(members.map(normalizeReferences).sort()) + } else { + content = normalizeReferences(content) } return { ...file, diff --git a/config/scripts/release-javascript-parity.test.mjs b/config/scripts/release/javascript-artifacts/release-javascript-parity.test.mjs similarity index 77% rename from config/scripts/release-javascript-parity.test.mjs rename to config/scripts/release/javascript-artifacts/release-javascript-parity.test.mjs index 4b4bf6a1ec8..ee971c351f3 100644 --- a/config/scripts/release-javascript-parity.test.mjs +++ b/config/scripts/release/javascript-artifacts/release-javascript-parity.test.mjs @@ -52,6 +52,65 @@ it('allows one decimal unit of native P3 rounding and its asset reference hashes expect(compareJavascriptParityFiles(before, after)).toEqual([]) }) +it('normalizes hashed JSON assets while rejecting content and reference changes', () => { + const entries = (hash, content, reference = hash) => ({ + [`renderer/assets/de-${hash}.json`]: content, + 'renderer/assets/i18n.js': `fetch("./de-${reference}.json")`, + 'renderer/.vite/manifest.json': JSON.stringify({ locale: { file: `assets/de-${hash}.json` } }), + 'renderer/.orca-web-client-files.json': JSON.stringify([`assets/de-${hash}.json`]) + }) + const before = inventory(entries('AAAAAAAA', '{\r\n"hello":"Hallo"\r\n}\r\n')) + const after = inventory(entries('BBBBBBBB', '{\n"hello":"Hallo"\n}\n')) + expect(compareJavascriptParityFiles(before, after)).toEqual([]) + expect( + compareJavascriptParityFiles( + before, + inventory(entries('BBBBBBBB', '{\n"hello":"Geändert"\n}\n')) + ) + ).toEqual(['renderer/assets/de.json']) + expect( + compareJavascriptParityFiles( + before, + inventory(entries('BBBBBBBB', '{\n"hello":"Hallo"\n}\n', 'CCCCCCCC')) + ) + ).toEqual(['renderer/assets/i18n.js']) + expect(compareJavascriptParityFiles(before, [])).toContain('renderer/assets/de.json') + for (const reference of ['de.json', '@asset:de.json', '@asset:de.json@']) { + const broken = entries('BBBBBBBB', '{\n"hello":"Hallo"\n}\n') + broken['renderer/assets/i18n.js'] = `fetch("./${reference}")` + expect(compareJavascriptParityFiles(before, inventory(broken))).toEqual([ + 'renderer/assets/i18n.js' + ]) + } + for (const [path, content] of [ + ['renderer/.vite/manifest.json', '{"locale":{"file":"assets/\\u0040asset:de.json\\u0040"}}'], + ['renderer/.orca-web-client-files.json', '["assets/\\u0040asset:de.json\\u0040"]'] + ]) { + const broken = entries('BBBBBBBB', '{\n"hello":"Hallo"\n}\n') + broken[path] = content + expect(compareJavascriptParityFiles(before, inventory(broken))).toEqual([path]) + } + for (const [path, content] of [ + ['renderer/.vite/manifest.json', '{"locale":{"file":"assets/de\\u002dBBBBBBBB.json"}}'], + ['renderer/.orca-web-client-files.json', '["assets/de\\u002dBBBBBBBB.json"]'] + ]) { + const escaped = entries('BBBBBBBB', '{\n"hello":"Hallo"\n}\n') + escaped[path] = content + expect(compareJavascriptParityFiles(before, inventory(escaped))).toEqual([]) + } + const suffixEntries = (reference) => ({ + ...entries('AAAAAAAA', '{"hello":"Hallo"}'), + 'renderer/assets/de.json-BBBBBBBB.json': '{}', + 'renderer/assets/i18n.js': `fetch("./${reference}")` + }) + expect( + compareJavascriptParityFiles( + inventory(suffixEntries('de-AAAAAAAA.json.json')), + inventory(suffixEntries('de.json-BBBBBBBB.json')) + ) + ).toEqual(['renderer/assets/i18n.js']) +}) + it('rejects meaningful color changes and every non-color stylesheet change', () => { expect( equivalentStylesheets( diff --git a/config/scripts/adhoc-build-version.mjs b/config/scripts/release/versioning/adhoc-build-version.mjs similarity index 100% rename from config/scripts/adhoc-build-version.mjs rename to config/scripts/release/versioning/adhoc-build-version.mjs diff --git a/config/scripts/adhoc-build-version.test.mjs b/config/scripts/release/versioning/adhoc-build-version.test.mjs similarity index 98% rename from config/scripts/adhoc-build-version.test.mjs rename to config/scripts/release/versioning/adhoc-build-version.test.mjs index cecc80a5305..592f9b026dd 100644 --- a/config/scripts/adhoc-build-version.test.mjs +++ b/config/scripts/release/versioning/adhoc-build-version.test.mjs @@ -5,7 +5,7 @@ import { normalizeAdhocLabel } from './adhoc-build-version.mjs' import { createHourlyBuildVersion } from './hourly-build-version.mjs' -import { compareAppVersions } from '../../src/shared/app-version' +import { compareAppVersions } from '../../../../src/shared/app-version' describe('createAdhocBuildVersion', () => { it('stamps the version with a zero-padded UTC timestamp to the second', () => { diff --git a/config/scripts/daily-build-version.mjs b/config/scripts/release/versioning/daily-build-version.mjs similarity index 100% rename from config/scripts/daily-build-version.mjs rename to config/scripts/release/versioning/daily-build-version.mjs diff --git a/config/scripts/daily-build-version.test.mjs b/config/scripts/release/versioning/daily-build-version.test.mjs similarity index 98% rename from config/scripts/daily-build-version.test.mjs rename to config/scripts/release/versioning/daily-build-version.test.mjs index 83431c02787..3e3018d0d5d 100644 --- a/config/scripts/daily-build-version.test.mjs +++ b/config/scripts/release/versioning/daily-build-version.test.mjs @@ -4,7 +4,7 @@ import { formatDailyReleaseName, nextDailyBuildNumber } from './daily-build-version.mjs' -import { compareAppVersions } from '../../src/shared/app-version' +import { compareAppVersions } from '../../../../src/shared/app-version' describe('createDailyBuildVersion', () => { it('stamps the version with a zero-padded UTC timestamp', () => { diff --git a/config/scripts/dev-channel-base-version.mjs b/config/scripts/release/versioning/dev-channel-base-version.mjs similarity index 100% rename from config/scripts/dev-channel-base-version.mjs rename to config/scripts/release/versioning/dev-channel-base-version.mjs diff --git a/config/scripts/dev-channel-base-version.test.mjs b/config/scripts/release/versioning/dev-channel-base-version.test.mjs similarity index 100% rename from config/scripts/dev-channel-base-version.test.mjs rename to config/scripts/release/versioning/dev-channel-base-version.test.mjs diff --git a/config/scripts/hourly-build-version.mjs b/config/scripts/release/versioning/hourly-build-version.mjs similarity index 100% rename from config/scripts/hourly-build-version.mjs rename to config/scripts/release/versioning/hourly-build-version.mjs diff --git a/config/scripts/hourly-build-version.test.mjs b/config/scripts/release/versioning/hourly-build-version.test.mjs similarity index 98% rename from config/scripts/hourly-build-version.test.mjs rename to config/scripts/release/versioning/hourly-build-version.test.mjs index 2c373117655..52100c3c8d8 100644 --- a/config/scripts/hourly-build-version.test.mjs +++ b/config/scripts/release/versioning/hourly-build-version.test.mjs @@ -5,7 +5,7 @@ import { getHourlyBuildIdentity, nextHourlyBuildNumber } from './hourly-build-version.mjs' -import { compareAppVersions } from '../../src/shared/app-version' +import { compareAppVersions } from '../../../../src/shared/app-version' describe('createHourlyBuildVersion', () => { it('stamps the version with a zero-padded UTC timestamp', () => { diff --git a/config/scripts/release-tag-patterns.mjs b/config/scripts/release/versioning/release-tag-patterns.mjs similarity index 100% rename from config/scripts/release-tag-patterns.mjs rename to config/scripts/release/versioning/release-tag-patterns.mjs diff --git a/config/scripts/release-title-timestamp.mjs b/config/scripts/release/versioning/release-title-timestamp.mjs similarity index 100% rename from config/scripts/release-title-timestamp.mjs rename to config/scripts/release/versioning/release-title-timestamp.mjs diff --git a/config/scripts/adhoc-build-pinned-commit.test.mjs b/config/scripts/release/workflow-contracts/adhoc-build-pinned-commit.test.mjs similarity index 100% rename from config/scripts/adhoc-build-pinned-commit.test.mjs rename to config/scripts/release/workflow-contracts/adhoc-build-pinned-commit.test.mjs diff --git a/config/scripts/adhoc-release-waits.test.mjs b/config/scripts/release/workflow-contracts/adhoc-release-waits.test.mjs similarity index 100% rename from config/scripts/adhoc-release-waits.test.mjs rename to config/scripts/release/workflow-contracts/adhoc-release-waits.test.mjs diff --git a/config/scripts/adhoc-windows-parallelism.test.mjs b/config/scripts/release/workflow-contracts/adhoc-windows-parallelism.test.mjs similarity index 85% rename from config/scripts/adhoc-windows-parallelism.test.mjs rename to config/scripts/release/workflow-contracts/adhoc-windows-parallelism.test.mjs index 6de60a1b7c7..314e33afa3d 100644 --- a/config/scripts/adhoc-windows-parallelism.test.mjs +++ b/config/scripts/release/workflow-contracts/adhoc-windows-parallelism.test.mjs @@ -2,7 +2,7 @@ import { readFileSync } from 'node:fs' import { runInNewContext } from 'node:vm' import { describe, expect, it } from 'vitest' import { parse } from 'yaml' -import { compileAggregateExpression } from './pr-aggregate-gate-context.mjs' +import { compileAggregateExpression } from '../../workflow/pr-admission/pr-aggregate-gate-context.mjs' const { jobs } = parse(readFileSync('.github/workflows/adhoc-mac-build.yml', 'utf8')) const mac = jobs['build-adhoc-mac-arch'] @@ -49,7 +49,10 @@ describe('adhoc Windows compilation overlaps Mac without publishing early', () = ) }) - it('falls back for older refs and retains official bundle support', () => { + it.each([ + 'config/scripts/release/javascript-artifacts/release-javascript-artifact.mjs', + 'config/scripts/release-javascript-artifact.mjs' + ])('falls back for older refs and retains official bundle support: %s', (artifactScript) => { const source = bundleWorkflow.jobs.bundle.steps.find((step) => step.id === 'source').run const script = source.split('node <<\'NODE\' >> "$GITHUB_OUTPUT"\n')[1].split('\nNODE')[0] const current = JSON.parse(readFileSync('package.json', 'utf8')) @@ -70,7 +73,19 @@ describe('adhoc Windows compilation overlaps Mac without publishing early', () = ]) { const lines = [] runInNewContext(script, { - require: (name) => (name === 'node:fs' ? { readFileSync } : manifest), + require: (name) => + name === 'node:fs' + ? { + existsSync: (file) => file === artifactScript, + readFileSync: (file) => { + expect(file).toBe(artifactScript) + return readFileSync( + 'config/scripts/release/javascript-artifacts/release-javascript-artifact.mjs', + 'utf8' + ) + } + } + : manifest, process: { env: { DEV_BUILD: String(dev) } }, console: { log: (line) => lines.push(line) } }) diff --git a/config/scripts/remote-agent-session-authority-repro.mjs b/config/scripts/remote-agent-session-authority-repro.mjs index 8224610d1ba..1542ef4a683 100644 --- a/config/scripts/remote-agent-session-authority-repro.mjs +++ b/config/scripts/remote-agent-session-authority-repro.mjs @@ -15,7 +15,10 @@ import net from 'node:net' import os from 'node:os' import path from 'node:path' import { createInterface } from 'node:readline' -import { cleanupIsolatedDaemons, isProcessAlive } from './remote-agent-session-process-cleanup.mjs' +import { + cleanupIsolatedDaemons, + isProcessAlive +} from './development/remote-session-cleanup/remote-agent-session-process-cleanup.mjs' const repoRoot = path.resolve(import.meta.dirname, '..', '..') const { parsePaneKey } = createRequire(import.meta.url)( diff --git a/config/scripts/build-wsl-guest.mjs b/config/scripts/remote-host-build/wsl-guest/build-wsl-guest.mjs similarity index 92% rename from config/scripts/build-wsl-guest.mjs rename to config/scripts/remote-host-build/wsl-guest/build-wsl-guest.mjs index fff539fde4d..8ef0bdaf0c6 100644 --- a/config/scripts/build-wsl-guest.mjs +++ b/config/scripts/remote-host-build/wsl-guest/build-wsl-guest.mjs @@ -1,17 +1,17 @@ #!/usr/bin/env node // Ship self-contained builtins-only CommonJS WSL hook/network/profile/SQLite programs via out/relay/wsl extraResources. import { build } from 'esbuild' -import { JSONC_PARSER_ESM_ALIAS } from '../build-plugins/jsonc-parser-esm.ts' +import { JSONC_PARSER_ESM_ALIAS } from '../../../build-plugins/jsonc-parser-esm.ts' import { createHash } from 'node:crypto' import { mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs' import { join } from 'node:path' import { OPENCODE_SQLITE_READER_FILENAME, WSL_CLAUDE_PROFILE_HELPER_FILENAME -} from '../../src/shared/remote-bundle-artifacts.ts' +} from '../../../../src/shared/remote-bundle-artifacts.ts' const __dirname = import.meta.dirname -const ROOT = join(__dirname, '..', '..') +const ROOT = join(__dirname, '../../..', '..') // Why: lets a contract test build into a temp tree instead of clobbering a developer's out/relay. const OUT_ROOT = process.env.ORCA_WSL_GUEST_OUT_ROOT ?? join(ROOT, 'out', 'relay') const RELAY_VERSION = '0.1.0' diff --git a/config/scripts/review-ack-first-line-benchmark.mjs b/config/scripts/review-ack-first-line-benchmark.mjs index 2c0e1c59865..671e5155174 100644 --- a/config/scripts/review-ack-first-line-benchmark.mjs +++ b/config/scripts/review-ack-first-line-benchmark.mjs @@ -4,7 +4,7 @@ import { readFileSync } from 'node:fs' import { dirname, resolve } from 'node:path' import { performance } from 'node:perf_hooks' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' const baseline = process.argv[2] ?? '20ab9950654' const file = diff --git a/config/scripts/rich-markdown-blank-run-benchmark.mjs b/config/scripts/rich-markdown-blank-run-benchmark.mjs index 93d0939f3f5..f697aefb4b7 100644 --- a/config/scripts/rich-markdown-blank-run-benchmark.mjs +++ b/config/scripts/rich-markdown-blank-run-benchmark.mjs @@ -6,8 +6,8 @@ import { dirname, join } from 'node:path' import { createRequire } from 'node:module' import { fileURLToPath } from 'node:url' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' -import { summarizeBenchmarkSamples } from './benchmark-sample-summary.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' +import { summarizeBenchmarkSamples } from './performance/measurement/benchmark-sample-summary.mjs' const root = fileURLToPath(new URL('../..', import.meta.url)) const entry = join( diff --git a/config/scripts/rich-markdown-comment-scan-benchmark.mjs b/config/scripts/rich-markdown-comment-scan-benchmark.mjs index bf1ed2729c4..281658ce1b6 100644 --- a/config/scripts/rich-markdown-comment-scan-benchmark.mjs +++ b/config/scripts/rich-markdown-comment-scan-benchmark.mjs @@ -4,7 +4,7 @@ import { readFileSync } from 'node:fs' import { dirname, resolve } from 'node:path' import { performance } from 'node:perf_hooks' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' const baseline = process.argv[2] ?? '20ab9950654' const historicalFile = 'src/renderer/src/components/editor/markdown-rich-mode.ts' diff --git a/config/scripts/rich-markdown-line-scan-benchmark.mjs b/config/scripts/rich-markdown-line-scan-benchmark.mjs index c03ae6ebe19..cd3a807a9f8 100644 --- a/config/scripts/rich-markdown-line-scan-benchmark.mjs +++ b/config/scripts/rich-markdown-line-scan-benchmark.mjs @@ -4,7 +4,7 @@ import { readFileSync } from 'node:fs' import { dirname, resolve } from 'node:path' import { performance } from 'node:perf_hooks' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' const baseline = process.argv[2] ?? '20ab9950654' const historicalFile = 'src/renderer/src/components/editor/markdown-rich-mode.ts' diff --git a/config/scripts/run-audit-tool.mjs b/config/scripts/run-audit-tool.mjs index c99461bf93e..486d5cc5ea7 100644 --- a/config/scripts/run-audit-tool.mjs +++ b/config/scripts/run-audit-tool.mjs @@ -1,7 +1,7 @@ import { runProcessSync } from '@orca/process-host' import { join, resolve } from 'node:path' import { pathToFileURL } from 'node:url' -import { resolvePnpmCliInvocation } from './pnpm-cli-invocation.mjs' +import { resolvePnpmCliInvocation } from './tool-invocation/pnpm-cli-invocation.mjs' const ROOT = resolve(import.meta.dirname, '../..') const TOOL_ENTRIES = { diff --git a/config/scripts/run-e2e-typecheck.mjs b/config/scripts/run-e2e-typecheck.mjs index c9f0195e862..b47ac4d43b5 100644 --- a/config/scripts/run-e2e-typecheck.mjs +++ b/config/scripts/run-e2e-typecheck.mjs @@ -1,12 +1,12 @@ import { availableParallelism } from 'node:os' import { runProcessSync } from '@orca/process-host' -import { describeProcessFailure } from './process-failure-message.mjs' -import { isDirectInvocation } from './script-entry-detection.mjs' +import { describeProcessFailure } from './tool-invocation/process-failure-message.mjs' +import { isDirectInvocation } from './tool-invocation/script-entry-detection.mjs' import { resolveTypecheckBunExecutable, resolveTypecheckCommand, selectTypecheckCompiler -} from './run-typecheck-projects-in-parallel.mjs' +} from './typecheck/project-execution/run-typecheck-projects-in-parallel.mjs' const CONFIG = 'config/tsconfig.e2e.json' diff --git a/config/scripts/run-e2e-typecheck.test.mjs b/config/scripts/run-e2e-typecheck.test.mjs index 9c4fce4263e..1cfdcccff38 100644 --- a/config/scripts/run-e2e-typecheck.test.mjs +++ b/config/scripts/run-e2e-typecheck.test.mjs @@ -4,7 +4,7 @@ import { join, resolve } from 'node:path' import { runProcessSync } from '@orca/process-host' import { afterEach, expect, it, vi } from 'vitest' import { countTestTypeErrors } from './check-e2e-typecheck-ratchet.mjs' -import { resolvePinnedBunExecutable } from './pinned-bun-executable.mjs' +import { resolvePinnedBunExecutable } from './tool-invocation/pinned-bun-executable.mjs' import { runE2eTypecheck } from './run-e2e-typecheck.mjs' const ROOT = process.cwd() diff --git a/config/scripts/run-electron-vite-dev.mjs b/config/scripts/run-electron-vite-dev.mjs index 16f28dde7af..94eef72c04f 100644 --- a/config/scripts/run-electron-vite-dev.mjs +++ b/config/scripts/run-electron-vite-dev.mjs @@ -23,25 +23,25 @@ import { getDevBundleProcessTable, isDevBundleInUse, selectStaleDevBundleDirs -} from './dev-electron-bundle-cache.mjs' -import { startDevStorageReclaim } from './dev-storage-reclaim.mjs' +} from './development/electron-bundle-cache/dev-electron-bundle-cache.mjs' +import { startDevStorageReclaim } from './worktree-storage/dev-storage-reclaim.mjs' import { announceDevInstance, dropInheritedDevInstanceEnv, resolveDevInstancePorts, resolveDevProfile, writeWorktreeProfileMarker -} from './dev-instance-isolation.mjs' +} from './development/instance-isolation/dev-instance-isolation.mjs' import { getDefaultSeedSource, profileHasState, seedDevProfile } from './dev-profile-seed.mjs' import { captureDevWebClientInputs, isDevWebClientFresh, recordDevWebClientInputs } from './dev-web-client-freshness.mjs' -import { withRolldownThreadLimit } from './rolldown-thread-limit.mjs' +import { withRolldownThreadLimit } from './tool-invocation/rolldown-thread-limit.mjs' import { withDevRolldownRuntimeEnv } from './dev-rolldown-runtime-env.mjs' -import { copyPrivateTree } from './space-sharing-copy.mjs' -import { buildDevSwiftCliHelpers } from './swift-cli-helper-macos.mjs' +import { copyPrivateTree } from './artifact-storage/reflink-copy/space-sharing-copy.mjs' +import { buildDevSwiftCliHelpers } from './native-build/macos/swift-cli-helper-macos.mjs' import { DEV_BUNDLE_ID, getDevBundlePlistPatches, @@ -328,7 +328,14 @@ function prepareMacDevElectronApp() { execFileSync( process.execPath, [ - path.join(repoRoot, 'config', 'scripts', 'build-notification-status-macos.mjs'), + path.join( + repoRoot, + 'config', + 'scripts', + 'native-build', + 'macos', + 'build-notification-status-macos.mjs' + ), '--bundle-id', bundleId, '--single-arch', diff --git a/config/scripts/run-electron-vite-targets-in-parallel.mjs b/config/scripts/run-electron-vite-targets-in-parallel.mjs index ec61c117a37..e2b2208b80f 100644 --- a/config/scripts/run-electron-vite-targets-in-parallel.mjs +++ b/config/scripts/run-electron-vite-targets-in-parallel.mjs @@ -1,7 +1,9 @@ import { spawn } from 'node:child_process' import { fileURLToPath } from 'node:url' -const buildScript = fileURLToPath(new URL('./run-electron-vite-build.mjs', import.meta.url)) +const buildScript = fileURLToPath( + new URL('./desktop-build/execution/run-electron-vite-build.mjs', import.meta.url) +) // Use CommonJS .cts wrapper so concurrent electron-vite targets do not share timestamped ESM temp file. const targetConfig = fileURLToPath(new URL('../electron-vite-target.config.cts', import.meta.url)) const targets = ['main', 'preload', 'renderer'] diff --git a/config/scripts/run-lint.mjs b/config/scripts/run-lint.mjs index f283c400828..c0fbba74e2b 100644 --- a/config/scripts/run-lint.mjs +++ b/config/scripts/run-lint.mjs @@ -5,8 +5,8 @@ import { availableParallelism } from 'node:os' import path from 'node:path' import process from 'node:process' import { pathToFileURL } from 'node:url' -import { resolveOxlintInvocation } from './oxlint-cli-invocation.mjs' -import { resolvePnpmCliInvocation } from './pnpm-cli-invocation.mjs' +import { resolveOxlintInvocation } from './tool-invocation/oxlint-cli-invocation.mjs' +import { resolvePnpmCliInvocation } from './tool-invocation/pnpm-cli-invocation.mjs' // package.json script names, slowest first so short steps fill in around them. export const LINT_STEPS = [ diff --git a/config/scripts/run-node-server-tests.mjs b/config/scripts/run-node-server-tests.mjs index 5f0545e8b31..86b39d86bb9 100644 --- a/config/scripts/run-node-server-tests.mjs +++ b/config/scripts/run-node-server-tests.mjs @@ -13,17 +13,17 @@ import { ORCAD_PROFILE_PREFLIGHT_FLAG, parseOrcadProfilePreflight } from '../../src/shared/orcad-profile-preflight.ts' -import { packagedNodeRuntimePath } from './build-orcad-node.mjs' -import { ensurePinnedNodeExecutable } from './pinned-node-downloads.mjs' -import { currentTarget } from './server-build-target.mjs' -import { UNIT_INCLUDE } from './ci-unit-files.mjs' +import { packagedNodeRuntimePath } from './orcad-distribution/prebuilds/build-orcad-node.mjs' +import { ensurePinnedNodeExecutable } from './orcad-distribution/prebuilds/pinned-node-downloads.mjs' +import { currentTarget } from './orcad-distribution/prebuilds/server-build-target.mjs' +import { UNIT_INCLUDE } from './ci/unit-selection/dependency-graph/ci-unit-files.mjs' import { runProcessSync } from '@orca/process-host' -import { describeProcessFailure } from './process-failure-message.mjs' +import { describeProcessFailure } from './tool-invocation/process-failure-message.mjs' import { CROSS_RUNTIME_TEST_PATHS, nodeServerTestPaths, REQUIRED_TEST_INPUTS_ENV -} from './node-server-test-paths.mjs' +} from './node-server/qualification/node-server-test-paths.mjs' const root = resolve(import.meta.dirname, '../..') const target = currentTarget() diff --git a/config/scripts/run-terminal-ibus-hangul-e2e.mjs b/config/scripts/run-terminal-ibus-hangul-e2e.mjs index 4a0e38161a8..e8e78ba6031 100644 --- a/config/scripts/run-terminal-ibus-hangul-e2e.mjs +++ b/config/scripts/run-terminal-ibus-hangul-e2e.mjs @@ -9,7 +9,7 @@ import { readFileSync, writeFileSync } from 'node:fs' -import { verifyPlaywrightParticipation } from './verify-playwright-participation.mjs' +import { verifyPlaywrightParticipation } from './runtime-verification/participation/verify-playwright-participation.mjs' import os from 'node:os' import path from 'node:path' import { diff --git a/config/scripts/run-terminal-layout-parity.mjs b/config/scripts/run-terminal-layout-parity.mjs index 320e6ba66fc..4b46865c3eb 100644 --- a/config/scripts/run-terminal-layout-parity.mjs +++ b/config/scripts/run-terminal-layout-parity.mjs @@ -17,8 +17,8 @@ import { join, resolve } from 'node:path' import { pathToFileURL } from 'node:url' import { parseArgs } from 'node:util' import { runProcessSync } from '@orca/process-host' -import { describeProcessFailure } from './process-failure-message.mjs' -import { resolvePnpmCliInvocation } from './pnpm-cli-invocation.mjs' +import { describeProcessFailure } from './tool-invocation/process-failure-message.mjs' +import { resolvePnpmCliInvocation } from './tool-invocation/pnpm-cli-invocation.mjs' const repoRoot = resolve(import.meta.dirname, '../..') const BUILD_STAMP = join('out', '.terminal-layout-parity-build') @@ -125,7 +125,14 @@ function captureSide(label, side, outRoot) { mkdirSync(outDir, { recursive: true }) run( process.execPath, - ['config/scripts/ensure-native-runtime.mjs', '--runtime=electron'], + [ + existsSync( + join(side.tree, 'config/scripts/native-build/node-addons/ensure-native-runtime.mjs') + ) + ? 'config/scripts/native-build/node-addons/ensure-native-runtime.mjs' + : 'config/scripts/ensure-native-runtime.mjs', + '--runtime=electron' + ], side.tree ) // A failed scenario still compares (as missing) but fails the run, so two failures cannot pass. diff --git a/config/scripts/run-terminal-scale-perf-report-gate.mjs b/config/scripts/run-terminal-scale-perf-report-gate.mjs index 59b1b443fa9..1593fcd40df 100644 --- a/config/scripts/run-terminal-scale-perf-report-gate.mjs +++ b/config/scripts/run-terminal-scale-perf-report-gate.mjs @@ -97,7 +97,7 @@ export function runTerminalScalePerfReportGate({ console.log(`Terminal scale perf report saved to ${reportPath}`) const summaryResult = runNodeScript( - 'config/scripts/summarize-terminal-perf-report.mjs', + 'config/scripts/performance/terminal-reporting/summarize-terminal-perf-report.mjs', [reportPath], 'inherit', spawnSyncImpl, @@ -109,7 +109,7 @@ export function runTerminalScalePerfReportGate({ } const budgetResult = runNodeScript( - 'config/scripts/check-terminal-perf-report-budgets.mjs', + 'config/scripts/performance/terminal-reporting/check-terminal-perf-report-budgets.mjs', [reportPath], 'inherit', spawnSyncImpl, @@ -122,7 +122,7 @@ export function runTerminalScalePerfReportGate({ const htmlReportPath = env.ORCA_E2E_TERMINAL_PERF_HTML_REPORT_PATH || DEFAULT_HTML_REPORT_PATH const htmlResult = runNodeScript( - 'config/scripts/generate-terminal-perf-html-report.mjs', + 'config/scripts/performance/terminal-reporting/generate-terminal-perf-html-report.mjs', [reportPath, '--output', htmlReportPath], 'inherit', spawnSyncImpl, diff --git a/config/scripts/run-terminal-scale-perf-report-gate.test.mjs b/config/scripts/run-terminal-scale-perf-report-gate.test.mjs index 4ec11b4c222..742445e7927 100644 --- a/config/scripts/run-terminal-scale-perf-report-gate.test.mjs +++ b/config/scripts/run-terminal-scale-perf-report-gate.test.mjs @@ -76,9 +76,9 @@ describe('run-terminal-scale-perf-report-gate', () => { expect(readFileSync(reportPath, 'utf8')).toBe('{"suites":[]}') expect(calls.map((call) => call.args[0])).toEqual([ 'config/scripts/run-terminal-scale-perf-e2e.mjs', - 'config/scripts/summarize-terminal-perf-report.mjs', - 'config/scripts/check-terminal-perf-report-budgets.mjs', - 'config/scripts/generate-terminal-perf-html-report.mjs' + 'config/scripts/performance/terminal-reporting/summarize-terminal-perf-report.mjs', + 'config/scripts/performance/terminal-reporting/check-terminal-perf-report-budgets.mjs', + 'config/scripts/performance/terminal-reporting/generate-terminal-perf-html-report.mjs' ]) expect(calls[0].args).toEqual([ 'config/scripts/run-terminal-scale-perf-e2e.mjs', @@ -88,13 +88,16 @@ describe('run-terminal-scale-perf-report-gate', () => { '25 ACK-backpressured real PTYs' ]) expect(calls[0].options.env.ORCA_TEST_MARKER).toBe('1') - expect(calls[1].args).toEqual(['config/scripts/summarize-terminal-perf-report.mjs', reportPath]) + expect(calls[1].args).toEqual([ + 'config/scripts/performance/terminal-reporting/summarize-terminal-perf-report.mjs', + reportPath + ]) expect(calls[2].args).toEqual([ - 'config/scripts/check-terminal-perf-report-budgets.mjs', + 'config/scripts/performance/terminal-reporting/check-terminal-perf-report-budgets.mjs', reportPath ]) expect(calls[3].args).toEqual([ - 'config/scripts/generate-terminal-perf-html-report.mjs', + 'config/scripts/performance/terminal-reporting/generate-terminal-perf-html-report.mjs', reportPath, '--output', 'test-results/terminal-perf-impact-report.html' @@ -111,7 +114,10 @@ describe('run-terminal-scale-perf-report-gate', () => { }) expect(status).toBe(0) - expect(calls[1].args).toEqual(['config/scripts/summarize-terminal-perf-report.mjs', reportPath]) + expect(calls[1].args).toEqual([ + 'config/scripts/performance/terminal-reporting/summarize-terminal-perf-report.mjs', + reportPath + ]) }) it('uses the HTML report path from env when provided', () => { @@ -129,7 +135,7 @@ describe('run-terminal-scale-perf-report-gate', () => { expect(status).toBe(0) expect(calls[3].args).toEqual([ - 'config/scripts/generate-terminal-perf-html-report.mjs', + 'config/scripts/performance/terminal-reporting/generate-terminal-perf-html-report.mjs', reportPath, '--output', 'tmp/terminal-report.html' @@ -155,9 +161,21 @@ describe('run-terminal-scale-perf-report-gate', () => { it.each([ ['scale', 'config/scripts/run-terminal-scale-perf-e2e.mjs', 1], - ['summary', 'config/scripts/summarize-terminal-perf-report.mjs', 2], - ['budget', 'config/scripts/check-terminal-perf-report-budgets.mjs', 3], - ['HTML', 'config/scripts/generate-terminal-perf-html-report.mjs', 4] + [ + 'summary', + 'config/scripts/performance/terminal-reporting/summarize-terminal-perf-report.mjs', + 2 + ], + [ + 'budget', + 'config/scripts/performance/terminal-reporting/check-terminal-perf-report-budgets.mjs', + 3 + ], + [ + 'HTML', + 'config/scripts/performance/terminal-reporting/generate-terminal-perf-html-report.mjs', + 4 + ] ])('returns the %s failure and stops subsequent stages', (_stage, failedScript, count) => { const reportPath = tempReportPath() const { calls, spawnSyncImpl } = makeSpawnSync({ statuses: { [failedScript]: 7 } }) @@ -171,9 +189,9 @@ describe('run-terminal-scale-perf-report-gate', () => { expect(calls.map((call) => call.args[0])).toEqual( [ 'config/scripts/run-terminal-scale-perf-e2e.mjs', - 'config/scripts/summarize-terminal-perf-report.mjs', - 'config/scripts/check-terminal-perf-report-budgets.mjs', - 'config/scripts/generate-terminal-perf-html-report.mjs' + 'config/scripts/performance/terminal-reporting/summarize-terminal-perf-report.mjs', + 'config/scripts/performance/terminal-reporting/check-terminal-perf-report-budgets.mjs', + 'config/scripts/performance/terminal-reporting/generate-terminal-perf-html-report.mjs' ].slice(0, count) ) }) diff --git a/config/scripts/runtime-serve-terminal-smoke.mjs b/config/scripts/runtime-serve-terminal-smoke.mjs index 776a4479afe..f8120839b05 100644 --- a/config/scripts/runtime-serve-terminal-smoke.mjs +++ b/config/scripts/runtime-serve-terminal-smoke.mjs @@ -11,8 +11,8 @@ import { ORCAD_CLI_ENTRY_FILENAME, ORCAD_SERVER_ENTRY_FILENAME } from '../../src/shared/orcad-artifacts.ts' -import { packagedNodeRuntimePath } from './build-orcad-node.mjs' -import { currentTarget } from './server-build-target.mjs' +import { packagedNodeRuntimePath } from './orcad-distribution/prebuilds/build-orcad-node.mjs' +import { currentTarget } from './orcad-distribution/prebuilds/server-build-target.mjs' const projectDir = resolve(import.meta.dirname, '../..') const serveEntry = join(projectDir, 'out', 'main', 'index.js') diff --git a/config/scripts/runtime-serve-terminal-smoke.test.mjs b/config/scripts/runtime-serve-terminal-smoke.test.mjs index 1d34877eacc..4e0eed9a481 100644 --- a/config/scripts/runtime-serve-terminal-smoke.test.mjs +++ b/config/scripts/runtime-serve-terminal-smoke.test.mjs @@ -4,7 +4,7 @@ import { dirname, join } from 'node:path' import { afterEach, expect, it } from 'vitest' import { resolveCli } from './runtime-serve-terminal-smoke.mjs' import { NODE_RUNTIME_ASSETS } from '../../src/shared/node-runtime-pin.ts' -import { currentTarget } from './server-build-target.mjs' +import { currentTarget } from './orcad-distribution/prebuilds/server-build-target.mjs' import { ORCAD_CLI_ENTRY_FILENAME } from '../../src/shared/orcad-artifacts.ts' const roots = [] diff --git a/config/scripts/verify-playwright-participation.mjs b/config/scripts/runtime-verification/participation/verify-playwright-participation.mjs similarity index 100% rename from config/scripts/verify-playwright-participation.mjs rename to config/scripts/runtime-verification/participation/verify-playwright-participation.mjs diff --git a/config/scripts/verify-skills-cli-runtime.cjs b/config/scripts/runtime-verification/skills-cli/verify-skills-cli-runtime.cjs similarity index 100% rename from config/scripts/verify-skills-cli-runtime.cjs rename to config/scripts/runtime-verification/skills-cli/verify-skills-cli-runtime.cjs diff --git a/config/scripts/verify-skills-cli-runtime.test.mjs b/config/scripts/runtime-verification/skills-cli/verify-skills-cli-runtime.test.mjs similarity index 98% rename from config/scripts/verify-skills-cli-runtime.test.mjs rename to config/scripts/runtime-verification/skills-cli/verify-skills-cli-runtime.test.mjs index 38aa658b3ea..93cb6693459 100644 --- a/config/scripts/verify-skills-cli-runtime.test.mjs +++ b/config/scripts/runtime-verification/skills-cli/verify-skills-cli-runtime.test.mjs @@ -5,12 +5,12 @@ import { tmpdir } from 'node:os' import { join, relative } from 'node:path' import { describe, expect, it } from 'vitest' -const require = createRequire(import.meta.url) +const require = createRequire(new URL('../../verify-skills-cli-runtime.test.mjs', import.meta.url)) const { collectRuntimeClosure, runCli, verifySkillsCliRuntime -} = require('./verify-skills-cli-runtime.cjs') +} = require('./runtime-verification/skills-cli/verify-skills-cli-runtime.cjs') async function writeSkillsCliFixture(outDir, handlerSource) { const cliDir = join(outDir, 'cli') diff --git a/config/scripts/scrcpy-frame-buffering-benchmark.mjs b/config/scripts/scrcpy-frame-buffering-benchmark.mjs index c84c80e6f55..9b6459497c8 100644 --- a/config/scripts/scrcpy-frame-buffering-benchmark.mjs +++ b/config/scripts/scrcpy-frame-buffering-benchmark.mjs @@ -2,8 +2,8 @@ import assert from 'node:assert/strict' import { readFileSync } from 'node:fs' import { performance } from 'node:perf_hooks' import { transform } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' -import { summarizeBenchmarkSamples } from './benchmark-sample-summary.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' +import { summarizeBenchmarkSamples } from './performance/measurement/benchmark-sample-summary.mjs' // git show <ref>:src/main/emulator/android/scrcpy-video-frame-parser.ts | node config/scripts/scrcpy-frame-buffering-benchmark.mjs async function load(source) { diff --git a/config/scripts/session-dedup-batches-benchmark.mjs b/config/scripts/session-dedup-batches-benchmark.mjs index 619cc8373a7..0991aaf895c 100644 --- a/config/scripts/session-dedup-batches-benchmark.mjs +++ b/config/scripts/session-dedup-batches-benchmark.mjs @@ -1,7 +1,7 @@ import assert from 'node:assert/strict' import { performance } from 'node:perf_hooks' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' const bundled = await build({ stdin: { diff --git a/config/scripts/session-scan-cutoff-benchmark.mjs b/config/scripts/session-scan-cutoff-benchmark.mjs index 08c03e69b42..36235a6e249 100644 --- a/config/scripts/session-scan-cutoff-benchmark.mjs +++ b/config/scripts/session-scan-cutoff-benchmark.mjs @@ -6,7 +6,7 @@ import path from 'node:path' import { performance } from 'node:perf_hooks' import ts from 'typescript-api' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' const baselineSource = ts.createSourceFile( 'session-scanner.ts', diff --git a/config/scripts/session-timeline-benchmark.mjs b/config/scripts/session-timeline-benchmark.mjs index 4737b7669a2..09d7145a1d8 100644 --- a/config/scripts/session-timeline-benchmark.mjs +++ b/config/scripts/session-timeline-benchmark.mjs @@ -3,8 +3,8 @@ import { readFileSync } from 'node:fs' import { dirname, resolve } from 'node:path' import { performance } from 'node:perf_hooks' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' -import { summarizeBenchmarkSamples } from './benchmark-sample-summary.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' +import { summarizeBenchmarkSamples } from './performance/measurement/benchmark-sample-summary.mjs' // git show <ref>:src/main/ai-vault/session-scanner-accumulator.ts | node config/scripts/session-timeline-benchmark.mjs const target = resolve('src/main/ai-vault/session-scanner-accumulator.ts') diff --git a/config/scripts/skill-source-inventory-benchmark.mjs b/config/scripts/skill-source-inventory-benchmark.mjs index 0e0f299b45b..5450c769716 100644 --- a/config/scripts/skill-source-inventory-benchmark.mjs +++ b/config/scripts/skill-source-inventory-benchmark.mjs @@ -2,7 +2,7 @@ import assert from 'node:assert/strict' import { readFileSync } from 'node:fs' import { performance } from 'node:perf_hooks' import { transform } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' const path = 'src/renderer/src/components/skills/skill-source-inventory.ts' const arms = {} diff --git a/config/scripts/smoke-process-host-node18.mjs b/config/scripts/smoke-process-host-node18.mjs index 0b9dc2455df..9d12aac6392 100644 --- a/config/scripts/smoke-process-host-node18.mjs +++ b/config/scripts/smoke-process-host-node18.mjs @@ -8,7 +8,7 @@ import { runPackagedProcessHostConsumer, stagePackagedProcessHost, writePackagedProcessHostConsumer -} from './packaged-process-host-fixture.mjs' +} from './desktop-distribution/runtime-verification/packaged-process-host-fixture.mjs' // Qualifies the package's engines floor against the staged public output, not the checkout source. assert.match(process.versions.node, /^18\./, 'This smoke test must run under Node 18') diff --git a/config/scripts/source-tree-walk-benchmark.mjs b/config/scripts/source-tree-walk-benchmark.mjs index 462f9fb8cce..9349581187c 100644 --- a/config/scripts/source-tree-walk-benchmark.mjs +++ b/config/scripts/source-tree-walk-benchmark.mjs @@ -4,8 +4,8 @@ import { readFileSync } from 'node:fs' import { stripTypeScriptTypes } from 'node:module' import { resolve } from 'node:path' import { performance } from 'node:perf_hooks' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' -import { summarizeBenchmarkSamples } from './benchmark-sample-summary.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' +import { summarizeBenchmarkSamples } from './performance/measurement/benchmark-sample-summary.mjs' // git show <baseline-ref>:src/shared/source-scan/source-tree-scan.ts | node config/scripts/source-tree-walk-benchmark.mjs async function load(source) { diff --git a/config/scripts/ssh-windows-mobile-bundle.test.mjs b/config/scripts/ssh-windows-mobile-bundle.test.mjs index ebed000ae8d..04418e3a62b 100644 --- a/config/scripts/ssh-windows-mobile-bundle.test.mjs +++ b/config/scripts/ssh-windows-mobile-bundle.test.mjs @@ -1,11 +1,11 @@ import { copyFileSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs' import { tmpdir } from 'node:os' -import { join } from 'node:path' +import { dirname, join } from 'node:path' import { runProcessSync } from '@orca/process-host' import { expect, it } from 'vitest' import { parse } from 'yaml' -import { compileAggregateExpression } from './pr-aggregate-gate-context.mjs' -import { writeMobileWebBundleFixtureTree } from './mobile-web-bundle-fixture-tree.mjs' +import { compileAggregateExpression } from './workflow/pr-admission/pr-aggregate-gate-context.mjs' +import { writeMobileWebBundleFixtureTree } from './build/mobile-web-app/mobile-web-bundle-fixture-tree.mjs' const workflow = parse(readFileSync('.github/workflows/ssh-windows-hosts.yml', 'utf8')) const producer = workflow.jobs.mobile_web_bundle @@ -81,8 +81,9 @@ it.skipIf(process.platform === 'win32')( mkdirSync(join(directory, 'config', 'scripts'), { recursive: true }) for (const file of [ 'config/dark-build-switches.cjs', - 'config/scripts/verify-packaged-mobile-web-bundle.cjs' + 'config/scripts/desktop-distribution/runtime-verification/verify-packaged-mobile-web-bundle.cjs' ]) { + mkdirSync(dirname(join(directory, file)), { recursive: true }) copyFileSync(file, join(directory, file)) } const bundleDir = join(directory, 'out', 'mobile-web') diff --git a/config/scripts/static-module-specifiers.mjs b/config/scripts/static-analysis/module-requests/static-module-specifiers.mjs similarity index 100% rename from config/scripts/static-module-specifiers.mjs rename to config/scripts/static-analysis/module-requests/static-module-specifiers.mjs diff --git a/config/scripts/static-module-specifiers.test.mjs b/config/scripts/static-analysis/module-requests/static-module-specifiers.test.mjs similarity index 98% rename from config/scripts/static-module-specifiers.test.mjs rename to config/scripts/static-analysis/module-requests/static-module-specifiers.test.mjs index 1eeaac902d8..d58856521c3 100644 --- a/config/scripts/static-module-specifiers.test.mjs +++ b/config/scripts/static-analysis/module-requests/static-module-specifiers.test.mjs @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest' -import { assessProcessHostImports } from './check-process-host-imports.mjs' +import { assessProcessHostImports } from '../process-boundaries/check-process-host-imports.mjs' import { collectModuleSpecifiers } from './static-module-specifiers.mjs' function specifiers(contents) { diff --git a/config/scripts/check-main-sync-spawn-ratchet.mjs b/config/scripts/static-analysis/process-boundaries/check-main-sync-spawn-ratchet.mjs similarity index 95% rename from config/scripts/check-main-sync-spawn-ratchet.mjs rename to config/scripts/static-analysis/process-boundaries/check-main-sync-spawn-ratchet.mjs index 2582b217cf1..6c57ea4cee8 100644 --- a/config/scripts/check-main-sync-spawn-ratchet.mjs +++ b/config/scripts/static-analysis/process-boundaries/check-main-sync-spawn-ratchet.mjs @@ -6,13 +6,13 @@ import { parseCountBaseline, pruneCountBaseline, totalCount -} from './ratchet-baseline.mjs' +} from '../ratchet-baseline/ratchet-baseline.mjs' import { createGatedCallCollector } from './gated-call-use-collector.mjs' import { isTestOnlySourcePath } from './test-only-source-path.mjs' // Synchronous launches freeze all Electron windows; Windows antivirus magnifies the delay. Count launch APIs and synchronous wrappers per file. -const ROOT = path.resolve(import.meta.dirname, '..', '..') +const ROOT = path.resolve(import.meta.dirname, '../../..', '..') const BASELINE_PATH = 'config/main-sync-spawn-baseline.txt' const SCAN_DIRECTORIES = ['src/main', 'src/shared'] const PROCESS_ADVICE = 'use runProcess or spawnProcess from @orca/process-host' @@ -66,7 +66,7 @@ const collector = createGatedCallCollector(GATED_FAMILIES, 'sync-spawn') const BASELINE_HEADER = [ '# Synchronous child-process launches in production src/main and src/shared, per file: uses of', '# execFileSync/spawnSync/execSync, runProcessSync and the repo sync wrappers listed in', - '# config/scripts/check-main-sync-spawn-ratchet.mjs (synchronous ACL rewrites and grants, which', + '# config/scripts/static-analysis/process-boundaries/check-main-sync-spawn-ratchet.mjs (synchronous ACL rewrites and grants, which', '# can block on a whole directory subtree).', '# Some entries run in the daemon or orcad process, or are test harnesses outside the test-path', '# conventions. This is a RATCHET: counts may only go DOWN.', diff --git a/config/scripts/check-main-sync-spawn-ratchet.test.mjs b/config/scripts/static-analysis/process-boundaries/check-main-sync-spawn-ratchet.test.mjs similarity index 100% rename from config/scripts/check-main-sync-spawn-ratchet.test.mjs rename to config/scripts/static-analysis/process-boundaries/check-main-sync-spawn-ratchet.test.mjs diff --git a/config/scripts/check-process-host-imports.mjs b/config/scripts/static-analysis/process-boundaries/check-process-host-imports.mjs similarity index 96% rename from config/scripts/check-process-host-imports.mjs rename to config/scripts/static-analysis/process-boundaries/check-process-host-imports.mjs index 89cdb485c11..b69c39fe070 100644 --- a/config/scripts/check-process-host-imports.mjs +++ b/config/scripts/static-analysis/process-boundaries/check-process-host-imports.mjs @@ -2,11 +2,11 @@ import { globSync, readFileSync } from 'node:fs' import { isBuiltin } from 'node:module' import path from 'node:path' import { pathToFileURL } from 'node:url' -import { diffEntries, parseEntryBaseline } from './ratchet-baseline.mjs' -import { collectModuleSpecifiers } from './static-module-specifiers.mjs' +import { diffEntries, parseEntryBaseline } from '../ratchet-baseline/ratchet-baseline.mjs' +import { collectModuleSpecifiers } from '../module-requests/static-module-specifiers.mjs' import { isTestOnlySourcePath } from './test-only-source-path.mjs' -const ROOT = path.resolve(import.meta.dirname, '..', '..') +const ROOT = path.resolve(import.meta.dirname, '../../..', '..') const PACKAGE_NAME = '@orca/process-host' const PACKAGE_DIRECTORY = 'src/packages/process-host' const PACKAGE_SOURCE = `${PACKAGE_DIRECTORY}/src/` diff --git a/config/scripts/check-process-host-imports.test.mjs b/config/scripts/static-analysis/process-boundaries/check-process-host-imports.test.mjs similarity index 99% rename from config/scripts/check-process-host-imports.test.mjs rename to config/scripts/static-analysis/process-boundaries/check-process-host-imports.test.mjs index 094a914a6e9..7fc70c5ff2c 100644 --- a/config/scripts/check-process-host-imports.test.mjs +++ b/config/scripts/static-analysis/process-boundaries/check-process-host-imports.test.mjs @@ -7,7 +7,7 @@ import { collectProcessHostSources, main } from './check-process-host-imports.mjs' -import { collectModuleSpecifiers } from './static-module-specifiers.mjs' +import { collectModuleSpecifiers } from '../module-requests/static-module-specifiers.mjs' const PACKAGE_SOURCE = 'src/packages/process-host/src/' const manifest = { diff --git a/config/scripts/gated-call-use-collector.mjs b/config/scripts/static-analysis/process-boundaries/gated-call-use-collector.mjs similarity index 98% rename from config/scripts/gated-call-use-collector.mjs rename to config/scripts/static-analysis/process-boundaries/gated-call-use-collector.mjs index ba6b5487687..da92736ba0a 100644 --- a/config/scripts/gated-call-use-collector.mjs +++ b/config/scripts/static-analysis/process-boundaries/gated-call-use-collector.mjs @@ -1,6 +1,10 @@ import path from 'node:path' import ts from 'typescript-api' -import { literalString, propertyName, unwrap } from './static-module-specifiers.mjs' +import { + literalString, + propertyName, + unwrap +} from '../module-requests/static-module-specifiers.mjs' const FALLBACK_OPERATORS = new Set([ts.SyntaxKind.QuestionQuestionToken, ts.SyntaxKind.BarBarToken]) diff --git a/config/scripts/test-only-source-path.mjs b/config/scripts/static-analysis/process-boundaries/test-only-source-path.mjs similarity index 100% rename from config/scripts/test-only-source-path.mjs rename to config/scripts/static-analysis/process-boundaries/test-only-source-path.mjs diff --git a/config/scripts/test-only-source-path.test.mjs b/config/scripts/static-analysis/process-boundaries/test-only-source-path.test.mjs similarity index 100% rename from config/scripts/test-only-source-path.test.mjs rename to config/scripts/static-analysis/process-boundaries/test-only-source-path.test.mjs diff --git a/config/scripts/ratchet-baseline.mjs b/config/scripts/static-analysis/ratchet-baseline/ratchet-baseline.mjs similarity index 100% rename from config/scripts/ratchet-baseline.mjs rename to config/scripts/static-analysis/ratchet-baseline/ratchet-baseline.mjs diff --git a/config/scripts/ratchet-baseline.test.mjs b/config/scripts/static-analysis/ratchet-baseline/ratchet-baseline.test.mjs similarity index 100% rename from config/scripts/ratchet-baseline.test.mjs rename to config/scripts/static-analysis/ratchet-baseline/ratchet-baseline.test.mjs diff --git a/config/scripts/run-ratchets.mjs b/config/scripts/static-analysis/ratchet-runner/run-ratchets.mjs similarity index 100% rename from config/scripts/run-ratchets.mjs rename to config/scripts/static-analysis/ratchet-runner/run-ratchets.mjs diff --git a/config/scripts/ast-grep-scan.mjs b/config/scripts/static-analysis/structural-scan/ast-grep-scan.mjs similarity index 91% rename from config/scripts/ast-grep-scan.mjs rename to config/scripts/static-analysis/structural-scan/ast-grep-scan.mjs index 464ea88e22b..ce253340437 100644 --- a/config/scripts/ast-grep-scan.mjs +++ b/config/scripts/static-analysis/structural-scan/ast-grep-scan.mjs @@ -7,7 +7,9 @@ export const AST_GREP_SCAN_PATHS = ['src', 'config', 'tests', 'mobile'] // Resolve the platform binary here: Windows .cmd shims need a shell, and temporary scan roots lack dependencies. export function resolveAstGrepBinary() { - const binary = createRequire(import.meta.url)('@ast-grep/cli/postinstall.js').resolveBinaryPath() + const binary = createRequire(new URL('../../ast-grep-scan.mjs', import.meta.url))( + '@ast-grep/cli/postinstall.js' + ).resolveBinaryPath() if (!binary) { throw new Error('No @ast-grep/cli binary for this platform; run pnpm install.') } diff --git a/config/scripts/existing-type-assertions.mjs b/config/scripts/static-analysis/type-assertion-budget/existing-type-assertions.mjs similarity index 100% rename from config/scripts/existing-type-assertions.mjs rename to config/scripts/static-analysis/type-assertion-budget/existing-type-assertions.mjs diff --git a/config/scripts/build-serialize-addon-at-ref.mjs b/config/scripts/terminal-dependencies/serialize-addon/build-serialize-addon-at-ref.mjs similarity index 97% rename from config/scripts/build-serialize-addon-at-ref.mjs rename to config/scripts/terminal-dependencies/serialize-addon/build-serialize-addon-at-ref.mjs index 402d4054aa4..e1b81178078 100644 --- a/config/scripts/build-serialize-addon-at-ref.mjs +++ b/config/scripts/terminal-dependencies/serialize-addon/build-serialize-addon-at-ref.mjs @@ -16,9 +16,9 @@ import { } from 'node:fs' import path from 'node:path' import { pathToFileURL } from 'node:url' -import { fetchPristinePackage } from './regenerate-xterm-patches.mjs' +import { fetchPristinePackage } from '../xterm-patches/regenerate-xterm-patches.mjs' -const REPO_ROOT = path.resolve(import.meta.dirname, '..', '..') +const REPO_ROOT = path.resolve(import.meta.dirname, '../../..', '..') const PACKAGE = '@xterm/addon-serialize' const DIST_FILE = 'lib/addon-serialize.js' const WORKSPACE_FILE = 'pnpm-workspace.yaml' diff --git a/config/scripts/regenerate-xterm-patches.mjs b/config/scripts/terminal-dependencies/xterm-patches/regenerate-xterm-patches.mjs similarity index 99% rename from config/scripts/regenerate-xterm-patches.mjs rename to config/scripts/terminal-dependencies/xterm-patches/regenerate-xterm-patches.mjs index a8db6e484bb..aa75fae26b8 100644 --- a/config/scripts/regenerate-xterm-patches.mjs +++ b/config/scripts/terminal-dependencies/xterm-patches/regenerate-xterm-patches.mjs @@ -27,7 +27,7 @@ import { pnpmDiffEnvironment } from './xterm-patch-text.mjs' -const DEFAULT_REPO_ROOT = path.resolve(import.meta.dirname, '..', '..') +const DEFAULT_REPO_ROOT = path.resolve(import.meta.dirname, '../../..', '..') const MANIFEST_RELATIVE_PATH = path.join('config', 'patches', 'xterm-upstream.json') export function stampVersionSource(source, version) { diff --git a/config/scripts/regenerate-xterm-patches.test.mjs b/config/scripts/terminal-dependencies/xterm-patches/regenerate-xterm-patches.test.mjs similarity index 99% rename from config/scripts/regenerate-xterm-patches.test.mjs rename to config/scripts/terminal-dependencies/xterm-patches/regenerate-xterm-patches.test.mjs index 48a1a111ed0..e8d60f32f41 100644 --- a/config/scripts/regenerate-xterm-patches.test.mjs +++ b/config/scripts/terminal-dependencies/xterm-patches/regenerate-xterm-patches.test.mjs @@ -36,7 +36,7 @@ function generatedHunks(patchText, generatedPaths) { .join('') } -const REPO_ROOT = path.resolve(import.meta.dirname, '..', '..') +const REPO_ROOT = path.resolve(import.meta.dirname, '../../..', '..') const MANIFEST_PATH = path.join(REPO_ROOT, 'config', 'patches', 'xterm-upstream.json') const temporaryDirectories = [] diff --git a/config/scripts/xterm-image-cell-payload-contract.test.mjs b/config/scripts/terminal-dependencies/xterm-patches/xterm-image-cell-payload-contract.test.mjs similarity index 98% rename from config/scripts/xterm-image-cell-payload-contract.test.mjs rename to config/scripts/terminal-dependencies/xterm-patches/xterm-image-cell-payload-contract.test.mjs index f687bae4d8f..793ccf6390a 100644 --- a/config/scripts/xterm-image-cell-payload-contract.test.mjs +++ b/config/scripts/terminal-dependencies/xterm-patches/xterm-image-cell-payload-contract.test.mjs @@ -1,7 +1,9 @@ import { createRequire } from 'node:module' import { afterEach, describe, expect, it, vi } from 'vitest' -const require = createRequire(import.meta.url) +const require = createRequire( + new URL('../../xterm-image-cell-payload-contract.test.mjs', import.meta.url) +) const { Terminal } = require('@xterm/xterm') const { ImageAddon } = require('@xterm/addon-image') diff --git a/config/scripts/xterm-image-kitty-admission.test.mjs b/config/scripts/terminal-dependencies/xterm-patches/xterm-image-kitty-admission.test.mjs similarity index 100% rename from config/scripts/xterm-image-kitty-admission.test.mjs rename to config/scripts/terminal-dependencies/xterm-patches/xterm-image-kitty-admission.test.mjs diff --git a/config/scripts/xterm-image-kitty-coordinate-boundaries.test.mjs b/config/scripts/terminal-dependencies/xterm-patches/xterm-image-kitty-coordinate-boundaries.test.mjs similarity index 100% rename from config/scripts/xterm-image-kitty-coordinate-boundaries.test.mjs rename to config/scripts/terminal-dependencies/xterm-patches/xterm-image-kitty-coordinate-boundaries.test.mjs diff --git a/config/scripts/xterm-image-kitty-file-transport.test.mjs b/config/scripts/terminal-dependencies/xterm-patches/xterm-image-kitty-file-transport.test.mjs similarity index 100% rename from config/scripts/xterm-image-kitty-file-transport.test.mjs rename to config/scripts/terminal-dependencies/xterm-patches/xterm-image-kitty-file-transport.test.mjs diff --git a/config/scripts/xterm-image-kitty-glyph-visibility.test.mjs b/config/scripts/terminal-dependencies/xterm-patches/xterm-image-kitty-glyph-visibility.test.mjs similarity index 100% rename from config/scripts/xterm-image-kitty-glyph-visibility.test.mjs rename to config/scripts/terminal-dependencies/xterm-patches/xterm-image-kitty-glyph-visibility.test.mjs diff --git a/config/scripts/xterm-image-kitty-placeholder-contract.test.mjs b/config/scripts/terminal-dependencies/xterm-patches/xterm-image-kitty-placeholder-contract.test.mjs similarity index 100% rename from config/scripts/xterm-image-kitty-placeholder-contract.test.mjs rename to config/scripts/terminal-dependencies/xterm-patches/xterm-image-kitty-placeholder-contract.test.mjs diff --git a/config/scripts/xterm-image-kitty-placeholder-lifecycle.test.mjs b/config/scripts/terminal-dependencies/xterm-patches/xterm-image-kitty-placeholder-lifecycle.test.mjs similarity index 100% rename from config/scripts/xterm-image-kitty-placeholder-lifecycle.test.mjs rename to config/scripts/terminal-dependencies/xterm-patches/xterm-image-kitty-placeholder-lifecycle.test.mjs diff --git a/config/scripts/xterm-image-kitty-retransmit.test.mjs b/config/scripts/terminal-dependencies/xterm-patches/xterm-image-kitty-retransmit.test.mjs similarity index 100% rename from config/scripts/xterm-image-kitty-retransmit.test.mjs rename to config/scripts/terminal-dependencies/xterm-patches/xterm-image-kitty-retransmit.test.mjs diff --git a/config/scripts/xterm-image-lifecycle-contract.test.mjs b/config/scripts/terminal-dependencies/xterm-patches/xterm-image-lifecycle-contract.test.mjs similarity index 98% rename from config/scripts/xterm-image-lifecycle-contract.test.mjs rename to config/scripts/terminal-dependencies/xterm-patches/xterm-image-lifecycle-contract.test.mjs index b275a8f1523..4d4c6ebb565 100644 --- a/config/scripts/xterm-image-lifecycle-contract.test.mjs +++ b/config/scripts/terminal-dependencies/xterm-patches/xterm-image-lifecycle-contract.test.mjs @@ -2,7 +2,9 @@ import { createRequire } from 'node:module' import { crc32, deflateRawSync, deflateSync } from 'node:zlib' import { afterEach, describe, expect, it, vi } from 'vitest' -const require = createRequire(import.meta.url) +const require = createRequire( + new URL('../../xterm-image-lifecycle-contract.test.mjs', import.meta.url) +) const { Terminal } = require('@xterm/xterm') const { ImageAddon } = require('@xterm/addon-image') diff --git a/config/scripts/xterm-image-memory-contract.test.mjs b/config/scripts/terminal-dependencies/xterm-patches/xterm-image-memory-contract.test.mjs similarity index 97% rename from config/scripts/xterm-image-memory-contract.test.mjs rename to config/scripts/terminal-dependencies/xterm-patches/xterm-image-memory-contract.test.mjs index 932ed4ecc99..c180cd76a1e 100644 --- a/config/scripts/xterm-image-memory-contract.test.mjs +++ b/config/scripts/terminal-dependencies/xterm-patches/xterm-image-memory-contract.test.mjs @@ -1,7 +1,9 @@ import { createRequire } from 'node:module' import { describe, expect, it } from 'vitest' -const require = createRequire(import.meta.url) +const require = createRequire( + new URL('../../xterm-image-memory-contract.test.mjs', import.meta.url) +) const { Terminal } = require('@xterm/xterm') const { ImageAddon } = require('@xterm/addon-image') diff --git a/config/scripts/xterm-image-resize-contract.test.mjs b/config/scripts/terminal-dependencies/xterm-patches/xterm-image-resize-contract.test.mjs similarity index 93% rename from config/scripts/xterm-image-resize-contract.test.mjs rename to config/scripts/terminal-dependencies/xterm-patches/xterm-image-resize-contract.test.mjs index d63b7912413..32467287c1a 100644 --- a/config/scripts/xterm-image-resize-contract.test.mjs +++ b/config/scripts/terminal-dependencies/xterm-patches/xterm-image-resize-contract.test.mjs @@ -1,7 +1,9 @@ import { createRequire } from 'node:module' import { afterEach, expect, it, vi } from 'vitest' -const require = createRequire(import.meta.url) +const require = createRequire( + new URL('../../xterm-image-resize-contract.test.mjs', import.meta.url) +) const { Terminal } = require('@xterm/xterm') const { ImageAddon } = require('@xterm/addon-image') diff --git a/config/scripts/xterm-image-wasm-budget-contract.test.mjs b/config/scripts/terminal-dependencies/xterm-patches/xterm-image-wasm-budget-contract.test.mjs similarity index 97% rename from config/scripts/xterm-image-wasm-budget-contract.test.mjs rename to config/scripts/terminal-dependencies/xterm-patches/xterm-image-wasm-budget-contract.test.mjs index e894f0da976..655fbe769ff 100644 --- a/config/scripts/xterm-image-wasm-budget-contract.test.mjs +++ b/config/scripts/terminal-dependencies/xterm-patches/xterm-image-wasm-budget-contract.test.mjs @@ -1,7 +1,9 @@ import { createRequire } from 'node:module' import { afterEach, describe, expect, it, vi } from 'vitest' -const require = createRequire(import.meta.url) +const require = createRequire( + new URL('../../xterm-image-wasm-budget-contract.test.mjs', import.meta.url) +) const { Terminal } = require('@xterm/xterm') const { ImageAddon } = require('@xterm/addon-image') diff --git a/config/scripts/xterm-kitty-placeholder-test-terminal.mjs b/config/scripts/terminal-dependencies/xterm-patches/xterm-kitty-placeholder-test-terminal.mjs similarity index 96% rename from config/scripts/xterm-kitty-placeholder-test-terminal.mjs rename to config/scripts/terminal-dependencies/xterm-patches/xterm-kitty-placeholder-test-terminal.mjs index 2f9d6ff57e8..cfb9bf93983 100644 --- a/config/scripts/xterm-kitty-placeholder-test-terminal.mjs +++ b/config/scripts/terminal-dependencies/xterm-patches/xterm-kitty-placeholder-test-terminal.mjs @@ -1,7 +1,9 @@ import { createRequire } from 'node:module' import { vi } from 'vitest' -const require = createRequire(import.meta.url) +const require = createRequire( + new URL('../../xterm-kitty-placeholder-test-terminal.mjs', import.meta.url) +) const { Terminal } = require(process.env.ORCA_IMAGE_CONTRACT_CORE_PATH ?? '@xterm/xterm') const { Unicode11Addon } = require('@xterm/addon-unicode11') const { ImageAddon } = require(process.env.ORCA_IMAGE_CONTRACT_ADDON_PATH ?? '@xterm/addon-image') diff --git a/config/scripts/xterm-patch-text.mjs b/config/scripts/terminal-dependencies/xterm-patches/xterm-patch-text.mjs similarity index 98% rename from config/scripts/xterm-patch-text.mjs rename to config/scripts/terminal-dependencies/xterm-patches/xterm-patch-text.mjs index d9f4221865e..2ac07bcbf97 100644 --- a/config/scripts/xterm-patch-text.mjs +++ b/config/scripts/terminal-dependencies/xterm-patches/xterm-patch-text.mjs @@ -130,7 +130,7 @@ export function formatCheckFailure({ name, patchPath, committed, regenerated }) 'The bundle hunks are generated. Do not edit them. Change the source patch', 'instead and regenerate both files:', '', - ' node config/scripts/regenerate-xterm-patches.mjs --write', + ' node config/scripts/terminal-dependencies/xterm-patches/regenerate-xterm-patches.mjs --write', '', 'See docs/reference/xterm-patch-regeneration.md.' ].join('\n') diff --git a/config/scripts/xterm-underline-color-contract.test.mjs b/config/scripts/terminal-dependencies/xterm-patches/xterm-underline-color-contract.test.mjs similarity index 90% rename from config/scripts/xterm-underline-color-contract.test.mjs rename to config/scripts/terminal-dependencies/xterm-patches/xterm-underline-color-contract.test.mjs index b90d61819e9..c021a2e4270 100644 --- a/config/scripts/xterm-underline-color-contract.test.mjs +++ b/config/scripts/terminal-dependencies/xterm-patches/xterm-underline-color-contract.test.mjs @@ -1,7 +1,9 @@ import { createRequire } from 'node:module' import { expect, it } from 'vitest' -const require = createRequire(import.meta.url) +const require = createRequire( + new URL('../../xterm-underline-color-contract.test.mjs', import.meta.url) +) const { Terminal } = require('@xterm/xterm') function write(terminal, text) { diff --git a/config/scripts/script-module-dependencies.mjs b/config/scripts/test-fixtures/script-copy-closure/script-module-dependencies.mjs similarity index 100% rename from config/scripts/script-module-dependencies.mjs rename to config/scripts/test-fixtures/script-copy-closure/script-module-dependencies.mjs diff --git a/config/scripts/script-module-dependencies.test.mjs b/config/scripts/test-fixtures/script-copy-closure/script-module-dependencies.test.mjs similarity index 100% rename from config/scripts/script-module-dependencies.test.mjs rename to config/scripts/test-fixtures/script-copy-closure/script-module-dependencies.test.mjs diff --git a/config/scripts/happy-dom-animation-cancel.ts b/config/scripts/test-runtime/dom/happy-dom-animation-cancel.ts similarity index 100% rename from config/scripts/happy-dom-animation-cancel.ts rename to config/scripts/test-runtime/dom/happy-dom-animation-cancel.ts diff --git a/config/scripts/happy-dom-mutation-observer-retention.test.ts b/config/scripts/test-runtime/dom/happy-dom-mutation-observer-retention.test.ts similarity index 100% rename from config/scripts/happy-dom-mutation-observer-retention.test.ts rename to config/scripts/test-runtime/dom/happy-dom-mutation-observer-retention.test.ts diff --git a/config/scripts/happy-dom-mutation-observer-retention.ts b/config/scripts/test-runtime/dom/happy-dom-mutation-observer-retention.ts similarity index 100% rename from config/scripts/happy-dom-mutation-observer-retention.ts rename to config/scripts/test-runtime/dom/happy-dom-mutation-observer-retention.ts diff --git a/config/scripts/happy-dom-offscreen-canvas.test.ts b/config/scripts/test-runtime/dom/happy-dom-offscreen-canvas.test.ts similarity index 100% rename from config/scripts/happy-dom-offscreen-canvas.test.ts rename to config/scripts/test-runtime/dom/happy-dom-offscreen-canvas.test.ts diff --git a/config/scripts/happy-dom-offscreen-canvas.ts b/config/scripts/test-runtime/dom/happy-dom-offscreen-canvas.ts similarity index 100% rename from config/scripts/happy-dom-offscreen-canvas.ts rename to config/scripts/test-runtime/dom/happy-dom-offscreen-canvas.ts diff --git a/config/scripts/vitest-dom-setup.ts b/config/scripts/test-runtime/dom/vitest-dom-setup.ts similarity index 100% rename from config/scripts/vitest-dom-setup.ts rename to config/scripts/test-runtime/dom/vitest-dom-setup.ts diff --git a/config/scripts/vitest-bun-node-builtins.ts b/config/scripts/test-runtime/environment/vitest-bun-node-builtins.ts similarity index 100% rename from config/scripts/vitest-bun-node-builtins.ts rename to config/scripts/test-runtime/environment/vitest-bun-node-builtins.ts diff --git a/config/scripts/vitest-caller-identity-env-setup.ts b/config/scripts/test-runtime/environment/vitest-caller-identity-env-setup.ts similarity index 100% rename from config/scripts/vitest-caller-identity-env-setup.ts rename to config/scripts/test-runtime/environment/vitest-caller-identity-env-setup.ts diff --git a/config/scripts/vitest-host-ports-setup.ts b/config/scripts/test-runtime/environment/vitest-host-ports-setup.ts similarity index 92% rename from config/scripts/vitest-host-ports-setup.ts rename to config/scripts/test-runtime/environment/vitest-host-ports-setup.ts index a4350a0172d..3cb98ee7a68 100644 --- a/config/scripts/vitest-host-ports-setup.ts +++ b/config/scripts/test-runtime/environment/vitest-host-ports-setup.ts @@ -2,8 +2,8 @@ import process from 'node:process' import { homedir, tmpdir } from 'node:os' import { join } from 'node:path' import { afterAll, beforeEach } from 'vitest' -import { setAppEnvironment, type AppEnvironment } from '../../src/shared/app-environment' -import { setSecretStore } from '../../src/shared/secret-store' +import { setAppEnvironment, type AppEnvironment } from '../../../../src/shared/app-environment' +import { setSecretStore } from '../../../../src/shared/secret-store' // The harness owns its directory even when a suite replaces the fs module. const { mkdtempSync, rmSync } = process.getBuiltinModule('fs') diff --git a/config/scripts/vitest-inherited-git-env-setup.ts b/config/scripts/test-runtime/environment/vitest-inherited-git-env-setup.ts similarity index 100% rename from config/scripts/vitest-inherited-git-env-setup.ts rename to config/scripts/test-runtime/environment/vitest-inherited-git-env-setup.ts diff --git a/config/scripts/vitest-orcad-feature-readiness-reset.ts b/config/scripts/test-runtime/environment/vitest-orcad-feature-readiness-reset.ts similarity index 65% rename from config/scripts/vitest-orcad-feature-readiness-reset.ts rename to config/scripts/test-runtime/environment/vitest-orcad-feature-readiness-reset.ts index d13f3db9db4..b5480be2016 100644 --- a/config/scripts/vitest-orcad-feature-readiness-reset.ts +++ b/config/scripts/test-runtime/environment/vitest-orcad-feature-readiness-reset.ts @@ -1,6 +1,6 @@ // A startOrcad test that fails partway must not leave latches closed: later tests in the worker would wait 10 s. import { afterEach } from 'vitest' -import { _resetOrcadFeatureReadinessForTests } from '../../src/main/runtime/rpc/orcad-feature-readiness' +import { _resetOrcadFeatureReadinessForTests } from '../../../../src/main/runtime/rpc/orcad-feature-readiness' afterEach(() => { _resetOrcadFeatureReadinessForTests() diff --git a/config/scripts/vitest-real-agent-home-write-guard.test.ts b/config/scripts/test-runtime/environment/vitest-real-agent-home-write-guard.test.ts similarity index 100% rename from config/scripts/vitest-real-agent-home-write-guard.test.ts rename to config/scripts/test-runtime/environment/vitest-real-agent-home-write-guard.test.ts diff --git a/config/scripts/vitest-real-agent-home-write-guard.ts b/config/scripts/test-runtime/environment/vitest-real-agent-home-write-guard.ts similarity index 100% rename from config/scripts/vitest-real-agent-home-write-guard.ts rename to config/scripts/test-runtime/environment/vitest-real-agent-home-write-guard.ts diff --git a/config/scripts/vitest-runtime-boundary.test.ts b/config/scripts/test-runtime/environment/vitest-runtime-boundary.test.ts similarity index 100% rename from config/scripts/vitest-runtime-boundary.test.ts rename to config/scripts/test-runtime/environment/vitest-runtime-boundary.test.ts diff --git a/config/scripts/run-vitest.mjs b/config/scripts/test-runtime/execution-policy/run-vitest.mjs similarity index 91% rename from config/scripts/run-vitest.mjs rename to config/scripts/test-runtime/execution-policy/run-vitest.mjs index 89a38c6f767..300d87c8206 100644 --- a/config/scripts/run-vitest.mjs +++ b/config/scripts/test-runtime/execution-policy/run-vitest.mjs @@ -3,17 +3,17 @@ import { resolve } from 'node:path' import { runProcess, runProcessSync, spawnProcess } from '@orca/process-host' import { hasNoChangedFiles } from './vitest-changed-precheck.mjs' import { RUN_ARGS_ENV } from './vitest-run-filters.mjs' -import { localModuleCacheEnv } from './vitest-local-module-cache.mjs' +import { localModuleCacheEnv } from '../module-cache/vitest-local-module-cache.mjs' import { createRunTempDirectory } from './vitest-run-temp-directory.mjs' -import { createVitestZodBundle } from './vitest-zod-bundle.mjs' +import { createVitestZodBundle } from '../module-cache/vitest-zod-bundle.mjs' import { checkBunVersion, probeBunVersion, readPinnedBunVersion, resolvePinnedBunExecutable -} from './pinned-bun-executable.mjs' +} from '../../tool-invocation/pinned-bun-executable.mjs' -const root = resolve(import.meta.dirname, '../..') +const root = resolve(import.meta.dirname, '../../../..') const vitestArgs = process.argv.slice(2) const FORWARDED_SIGNALS = ['SIGINT', 'SIGTERM', 'SIGHUP'] diff --git a/config/scripts/vitest-changed-precheck.mjs b/config/scripts/test-runtime/execution-policy/vitest-changed-precheck.mjs similarity index 100% rename from config/scripts/vitest-changed-precheck.mjs rename to config/scripts/test-runtime/execution-policy/vitest-changed-precheck.mjs diff --git a/config/scripts/vitest-changed-precheck.test.mjs b/config/scripts/test-runtime/execution-policy/vitest-changed-precheck.test.mjs similarity index 100% rename from config/scripts/vitest-changed-precheck.test.mjs rename to config/scripts/test-runtime/execution-policy/vitest-changed-precheck.test.mjs diff --git a/config/scripts/vitest-run-filters.mjs b/config/scripts/test-runtime/execution-policy/vitest-run-filters.mjs similarity index 100% rename from config/scripts/vitest-run-filters.mjs rename to config/scripts/test-runtime/execution-policy/vitest-run-filters.mjs diff --git a/config/scripts/vitest-run-filters.test.mjs b/config/scripts/test-runtime/execution-policy/vitest-run-filters.test.mjs similarity index 95% rename from config/scripts/vitest-run-filters.test.mjs rename to config/scripts/test-runtime/execution-policy/vitest-run-filters.test.mjs index 36f99cbd332..8d0aa6476ca 100644 --- a/config/scripts/vitest-run-filters.test.mjs +++ b/config/scripts/test-runtime/execution-policy/vitest-run-filters.test.mjs @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest' import { parseRunFilters, readRunFilters, RUN_ARGS_ENV } from './vitest-run-filters.mjs' -import { matchesRunFilter } from './vitest-sqlite-runtime-scan.mjs' +import { matchesRunFilter } from '../sqlite-admission/vitest-sqlite-runtime-scan.mjs' describe('parseRunFilters', () => { it('returns the positional filters of a one-shot run', () => { diff --git a/config/scripts/vitest-run-temp-directory.mjs b/config/scripts/test-runtime/execution-policy/vitest-run-temp-directory.mjs similarity index 100% rename from config/scripts/vitest-run-temp-directory.mjs rename to config/scripts/test-runtime/execution-policy/vitest-run-temp-directory.mjs diff --git a/config/scripts/vitest-run-temp-directory.test.mjs b/config/scripts/test-runtime/execution-policy/vitest-run-temp-directory.test.mjs similarity index 100% rename from config/scripts/vitest-run-temp-directory.test.mjs rename to config/scripts/test-runtime/execution-policy/vitest-run-temp-directory.test.mjs diff --git a/config/scripts/vitest-runtime-sequencer.mjs b/config/scripts/test-runtime/execution-policy/vitest-runtime-sequencer.mjs similarity index 92% rename from config/scripts/vitest-runtime-sequencer.mjs rename to config/scripts/test-runtime/execution-policy/vitest-runtime-sequencer.mjs index 9350759e2d3..4cd673971a0 100644 --- a/config/scripts/vitest-runtime-sequencer.mjs +++ b/config/scripts/test-runtime/execution-policy/vitest-runtime-sequencer.mjs @@ -1,6 +1,6 @@ import { relative } from 'node:path' import { BaseSequencer } from 'vitest/node' -import { rankFilesByDuration, readTimingBaseline } from './ci-shard-assignment.mjs' +import { rankFilesByDuration, readTimingBaseline } from '../../ci/sharding/ci-shard-assignment.mjs' export default class RuntimeSequencer extends BaseSequencer { constructor(ctx, timingBaseline = undefined) { diff --git a/config/scripts/vitest-runtime-sequencer.test.mjs b/config/scripts/test-runtime/execution-policy/vitest-runtime-sequencer.test.mjs similarity index 100% rename from config/scripts/vitest-runtime-sequencer.test.mjs rename to config/scripts/test-runtime/execution-policy/vitest-runtime-sequencer.test.mjs diff --git a/config/scripts/vitest-local-module-cache.mjs b/config/scripts/test-runtime/module-cache/vitest-local-module-cache.mjs similarity index 94% rename from config/scripts/vitest-local-module-cache.mjs rename to config/scripts/test-runtime/module-cache/vitest-local-module-cache.mjs index 066513d84ac..ceac7162b38 100644 --- a/config/scripts/vitest-local-module-cache.mjs +++ b/config/scripts/test-runtime/module-cache/vitest-local-module-cache.mjs @@ -37,7 +37,7 @@ export async function localModuleCacheEnv(root, env = process.env) { } const parent = localModuleCacheParent(root) // Lazy: the policy hash loads TypeScript sources that reclaim, which only needs the parent, avoids. - const { moduleCachePolicyHash } = await import('./ci-unit-module-cache.mjs') + const { moduleCachePolicyHash } = await import('../../ci/unit-cache/ci-unit-module-cache.mjs') const key = `${(await moduleCachePolicyHash(root)).slice(0, 16)}-node${process.versions.node}` pruneLocalModuleCaches(parent, key) const path = join(parent, key) diff --git a/config/scripts/vitest-module-cache-resolution-key.test.ts b/config/scripts/test-runtime/module-cache/vitest-module-cache-resolution-key.test.ts similarity index 100% rename from config/scripts/vitest-module-cache-resolution-key.test.ts rename to config/scripts/test-runtime/module-cache/vitest-module-cache-resolution-key.test.ts diff --git a/config/scripts/vitest-module-cache-resolution-key.ts b/config/scripts/test-runtime/module-cache/vitest-module-cache-resolution-key.ts similarity index 100% rename from config/scripts/vitest-module-cache-resolution-key.ts rename to config/scripts/test-runtime/module-cache/vitest-module-cache-resolution-key.ts diff --git a/config/scripts/vitest-zod-bundle.mjs b/config/scripts/test-runtime/module-cache/vitest-zod-bundle.mjs similarity index 100% rename from config/scripts/vitest-zod-bundle.mjs rename to config/scripts/test-runtime/module-cache/vitest-zod-bundle.mjs diff --git a/config/scripts/vitest-zod-bundle.test.mjs b/config/scripts/test-runtime/module-cache/vitest-zod-bundle.test.mjs similarity index 100% rename from config/scripts/vitest-zod-bundle.test.mjs rename to config/scripts/test-runtime/module-cache/vitest-zod-bundle.test.mjs diff --git a/config/scripts/vitest-node-runtime-boundary.test.ts b/config/scripts/test-runtime/node-worker/vitest-node-runtime-boundary.test.ts similarity index 91% rename from config/scripts/vitest-node-runtime-boundary.test.ts rename to config/scripts/test-runtime/node-worker/vitest-node-runtime-boundary.test.ts index 845ecb24267..725c0909011 100644 --- a/config/scripts/vitest-node-runtime-boundary.test.ts +++ b/config/scripts/test-runtime/node-worker/vitest-node-runtime-boundary.test.ts @@ -2,8 +2,8 @@ import { globSync, readFileSync } from 'node:fs' import { resolve } from 'node:path' import ts from 'typescript-api' import { expect, it } from 'vitest' -import { discoverUnitFiles } from './ci-unit-files.mjs' -import { getNodeRuntimeInclude } from './vitest-node-runtime-files.mjs' +import { discoverUnitFiles } from '../../ci/unit-selection/dependency-graph/ci-unit-files.mjs' +import { getNodeRuntimeInclude } from '../sqlite-admission/vitest-node-runtime-files.mjs' it('runs Node runtime contracts in Node even when the coordinator uses Bun', () => { expect(process.versions.bun).toBeUndefined() diff --git a/config/scripts/vitest-node-runtime-ipc-codec.mjs b/config/scripts/test-runtime/node-worker/vitest-node-runtime-ipc-codec.mjs similarity index 100% rename from config/scripts/vitest-node-runtime-ipc-codec.mjs rename to config/scripts/test-runtime/node-worker/vitest-node-runtime-ipc-codec.mjs diff --git a/config/scripts/vitest-node-runtime-pool.test.ts b/config/scripts/test-runtime/node-worker/vitest-node-runtime-pool.test.ts similarity index 100% rename from config/scripts/vitest-node-runtime-pool.test.ts rename to config/scripts/test-runtime/node-worker/vitest-node-runtime-pool.test.ts diff --git a/config/scripts/vitest-node-runtime-pool.ts b/config/scripts/test-runtime/node-worker/vitest-node-runtime-pool.ts similarity index 96% rename from config/scripts/vitest-node-runtime-pool.ts rename to config/scripts/test-runtime/node-worker/vitest-node-runtime-pool.ts index 59fd67b3a88..b6914b161f0 100644 --- a/config/scripts/vitest-node-runtime-pool.ts +++ b/config/scripts/test-runtime/node-worker/vitest-node-runtime-pool.ts @@ -27,7 +27,10 @@ class NodeRuntimeWorker implements PoolWorker { program: executable, args: [ ...this.options.execArgv, - resolve(this.options.project.config.root, 'config/scripts/vitest-node-runtime-worker.mjs') + resolve( + this.options.project.config.root, + 'config/scripts/test-runtime/node-worker/vitest-node-runtime-worker.mjs' + ) ], env: this.options.env, stdio: ['pipe', 'pipe', 'pipe', 'ipc'], diff --git a/config/scripts/vitest-node-runtime-worker.mjs b/config/scripts/test-runtime/node-worker/vitest-node-runtime-worker.mjs similarity index 100% rename from config/scripts/vitest-node-runtime-worker.mjs rename to config/scripts/test-runtime/node-worker/vitest-node-runtime-worker.mjs diff --git a/config/scripts/vitest-node-runtime-files.mjs b/config/scripts/test-runtime/sqlite-admission/vitest-node-runtime-files.mjs similarity index 97% rename from config/scripts/vitest-node-runtime-files.mjs rename to config/scripts/test-runtime/sqlite-admission/vitest-node-runtime-files.mjs index 14f5dab3e42..42072cadb73 100644 --- a/config/scripts/vitest-node-runtime-files.mjs +++ b/config/scripts/test-runtime/sqlite-admission/vitest-node-runtime-files.mjs @@ -7,7 +7,7 @@ const NODE_RUNTIME_INCLUDE = [ 'src/main/linear/linear-issue-detail-deadline.test.ts', 'tests/e2e/linear-cli-recovery.unit.test.ts', 'src/main/runtime/structured-agent-cli-writers.test.ts', - 'config/scripts/vitest-sqlite-runtime-boundary.test.ts', + 'config/scripts/test-runtime/sqlite-admission/vitest-sqlite-runtime-boundary.test.ts', 'config/scripts/cloud-security-history-workflow.test.mjs', 'config/scripts/skill-recipe-shell.test.mjs', 'src/main/ssh/legacy-relay/ssh-relay-endpoint-incumbent-shell.integration.test.ts', @@ -38,7 +38,7 @@ const NODE_RUNTIME_INCLUDE = [ 'src/renderer/src/lib/ai-vault-tab-title-sync-inputs.test.ts', 'src/renderer/src/components/sidebar/HostRemoveDialog.test.tsx', // Asserts an observer survives a forced collection; conservative retention would hide a lost one. - 'config/scripts/happy-dom-mutation-observer-retention.test.ts', + 'config/scripts/test-runtime/dom/happy-dom-mutation-observer-retention.test.ts', // These reach Node SQLite through a shared helper or a dynamic import, which the scan skips. 'src/main/claude/claude-transcript-catch-up.test.ts', 'src/main/claude/claude-transcript-duration.test.ts', @@ -204,10 +204,10 @@ const NODE_RUNTIME_INCLUDE = [ 'src/main/ipc/filesystem/watcher-process/parcel-watcher-shallow-file-subscription.test.ts', 'src/renderer/src/components/emulator-pane/emulator-device-frame-visibility.test.tsx', 'src/main/claude/claude-agent-sdk-contract-pins.test.ts', - 'config/scripts/profile-state-worker-smoke.test.mjs', + 'config/scripts/orcad-distribution/server-bundle/profile-state-worker-smoke.test.mjs', 'config/scripts/process-host-dev-rebuild.test.ts', - 'config/scripts/vitest-node-runtime-boundary.test.ts', - 'config/scripts/vitest-node-runtime-pool.test.ts' + 'config/scripts/test-runtime/node-worker/vitest-node-runtime-boundary.test.ts', + 'config/scripts/test-runtime/node-worker/vitest-node-runtime-pool.test.ts' ] /** `filters` limits the SQLite import scan to the tests a filtered CLI run can select. */ diff --git a/config/scripts/vitest-sqlite-runtime-boundary.test.ts b/config/scripts/test-runtime/sqlite-admission/vitest-sqlite-runtime-boundary.test.ts similarity index 100% rename from config/scripts/vitest-sqlite-runtime-boundary.test.ts rename to config/scripts/test-runtime/sqlite-admission/vitest-sqlite-runtime-boundary.test.ts diff --git a/config/scripts/vitest-sqlite-runtime-cache.test.ts b/config/scripts/test-runtime/sqlite-admission/vitest-sqlite-runtime-cache.test.ts similarity index 100% rename from config/scripts/vitest-sqlite-runtime-cache.test.ts rename to config/scripts/test-runtime/sqlite-admission/vitest-sqlite-runtime-cache.test.ts diff --git a/config/scripts/vitest-sqlite-runtime-scan.mjs b/config/scripts/test-runtime/sqlite-admission/vitest-sqlite-runtime-scan.mjs similarity index 96% rename from config/scripts/vitest-sqlite-runtime-scan.mjs rename to config/scripts/test-runtime/sqlite-admission/vitest-sqlite-runtime-scan.mjs index bf13f142eb8..6a24806171b 100644 --- a/config/scripts/vitest-sqlite-runtime-scan.mjs +++ b/config/scripts/test-runtime/sqlite-admission/vitest-sqlite-runtime-scan.mjs @@ -2,10 +2,10 @@ import { createHash } from 'node:crypto' import { mkdirSync, readdirSync, readFileSync, renameSync, statSync, writeFileSync } from 'node:fs' import { createRequire } from 'node:module' import { basename, dirname, isAbsolute, join, posix, relative, resolve } from 'node:path' -import { UNIT_INCLUDE } from './ci-unit-files.mjs' +import { UNIT_INCLUDE } from '../../ci/unit-selection/dependency-graph/ci-unit-files.mjs' -const require = createRequire(import.meta.url) -const root = resolve(import.meta.dirname, '../..') +const require = createRequire(new URL('../../vitest-sqlite-runtime-scan.mjs', import.meta.url)) +const root = resolve(import.meta.dirname, '../../../..') // Keyed by checkout, since worktrees can share one node_modules. const CACHE_FILE = join( root, diff --git a/config/scripts/node-old-space-limit.mjs b/config/scripts/tool-invocation/node-old-space-limit.mjs similarity index 100% rename from config/scripts/node-old-space-limit.mjs rename to config/scripts/tool-invocation/node-old-space-limit.mjs diff --git a/config/scripts/node-old-space-limit.test.mjs b/config/scripts/tool-invocation/node-old-space-limit.test.mjs similarity index 100% rename from config/scripts/node-old-space-limit.test.mjs rename to config/scripts/tool-invocation/node-old-space-limit.test.mjs diff --git a/config/scripts/oxc-cli-invocation.mjs b/config/scripts/tool-invocation/oxc-cli-invocation.mjs similarity index 100% rename from config/scripts/oxc-cli-invocation.mjs rename to config/scripts/tool-invocation/oxc-cli-invocation.mjs diff --git a/config/scripts/oxc-cli-invocation.test.mjs b/config/scripts/tool-invocation/oxc-cli-invocation.test.mjs similarity index 95% rename from config/scripts/oxc-cli-invocation.test.mjs rename to config/scripts/tool-invocation/oxc-cli-invocation.test.mjs index 40006043cac..aebff7e2b4b 100644 --- a/config/scripts/oxc-cli-invocation.test.mjs +++ b/config/scripts/tool-invocation/oxc-cli-invocation.test.mjs @@ -6,7 +6,7 @@ import { describe, expect, it } from 'vitest' import { resolveOxcCliInvocation } from './oxc-cli-invocation.mjs' import { resolveOxlintInvocation } from './oxlint-cli-invocation.mjs' -const repoRoot = path.resolve(import.meta.dirname, '..', '..') +const repoRoot = path.resolve(import.meta.dirname, '../..', '..') for (const { name, resolveInvocation } of [ { name: 'oxfmt', resolveInvocation: () => resolveOxcCliInvocation('oxfmt', 'oxfmt', repoRoot) }, diff --git a/config/scripts/oxlint-cli-invocation.mjs b/config/scripts/tool-invocation/oxlint-cli-invocation.mjs similarity index 100% rename from config/scripts/oxlint-cli-invocation.mjs rename to config/scripts/tool-invocation/oxlint-cli-invocation.mjs diff --git a/config/scripts/pinned-bun-executable.mjs b/config/scripts/tool-invocation/pinned-bun-executable.mjs similarity index 100% rename from config/scripts/pinned-bun-executable.mjs rename to config/scripts/tool-invocation/pinned-bun-executable.mjs diff --git a/config/scripts/pinned-bun-executable.test.mjs b/config/scripts/tool-invocation/pinned-bun-executable.test.mjs similarity index 100% rename from config/scripts/pinned-bun-executable.test.mjs rename to config/scripts/tool-invocation/pinned-bun-executable.test.mjs diff --git a/config/scripts/pnpm-cli-invocation.mjs b/config/scripts/tool-invocation/pnpm-cli-invocation.mjs similarity index 100% rename from config/scripts/pnpm-cli-invocation.mjs rename to config/scripts/tool-invocation/pnpm-cli-invocation.mjs diff --git a/config/scripts/pnpm-cli-invocation.test.mjs b/config/scripts/tool-invocation/pnpm-cli-invocation.test.mjs similarity index 100% rename from config/scripts/pnpm-cli-invocation.test.mjs rename to config/scripts/tool-invocation/pnpm-cli-invocation.test.mjs diff --git a/config/scripts/process-failure-message.mjs b/config/scripts/tool-invocation/process-failure-message.mjs similarity index 100% rename from config/scripts/process-failure-message.mjs rename to config/scripts/tool-invocation/process-failure-message.mjs diff --git a/config/scripts/process-failure-message.test.mjs b/config/scripts/tool-invocation/process-failure-message.test.mjs similarity index 100% rename from config/scripts/process-failure-message.test.mjs rename to config/scripts/tool-invocation/process-failure-message.test.mjs diff --git a/config/scripts/rolldown-thread-limit.mjs b/config/scripts/tool-invocation/rolldown-thread-limit.mjs similarity index 100% rename from config/scripts/rolldown-thread-limit.mjs rename to config/scripts/tool-invocation/rolldown-thread-limit.mjs diff --git a/config/scripts/script-entry-detection.mjs b/config/scripts/tool-invocation/script-entry-detection.mjs similarity index 100% rename from config/scripts/script-entry-detection.mjs rename to config/scripts/tool-invocation/script-entry-detection.mjs diff --git a/config/scripts/script-entry-detection.test.mjs b/config/scripts/tool-invocation/script-entry-detection.test.mjs similarity index 100% rename from config/scripts/script-entry-detection.test.mjs rename to config/scripts/tool-invocation/script-entry-detection.test.mjs diff --git a/config/scripts/transcript-stream-fragments-benchmark.mjs b/config/scripts/transcript-stream-fragments-benchmark.mjs index 5f4dc17074c..f399f57e211 100644 --- a/config/scripts/transcript-stream-fragments-benchmark.mjs +++ b/config/scripts/transcript-stream-fragments-benchmark.mjs @@ -4,7 +4,7 @@ import { dirname, resolve } from 'node:path' import { Readable } from 'node:stream' import { performance } from 'node:perf_hooks' import { build } from 'esbuild' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' const modulePath = 'src/main/native-chat/transcript-stream-lines.ts' const baselineSource = readFileSync(0, 'utf8') diff --git a/config/scripts/run-typecheck-bun-queue.test.mjs b/config/scripts/typecheck/project-execution/run-typecheck-bun-queue.test.mjs similarity index 100% rename from config/scripts/run-typecheck-bun-queue.test.mjs rename to config/scripts/typecheck/project-execution/run-typecheck-bun-queue.test.mjs diff --git a/config/scripts/run-typecheck-projects-in-parallel.mjs b/config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.mjs similarity index 98% rename from config/scripts/run-typecheck-projects-in-parallel.mjs rename to config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.mjs index acf4d886a15..d5c7c6fdac5 100644 --- a/config/scripts/run-typecheck-projects-in-parallel.mjs +++ b/config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.mjs @@ -4,7 +4,10 @@ import { createRequire } from 'node:module' import { availableParallelism, totalmem } from 'node:os' import { dirname, join, resolve } from 'node:path' import { fileURLToPath, pathToFileURL } from 'node:url' -import { readPinnedBunVersion, resolvePinnedBunExecutable } from './pinned-bun-executable.mjs' +import { + readPinnedBunVersion, + resolvePinnedBunExecutable +} from '../../tool-invocation/pinned-bun-executable.mjs' import { resolveTsrsTypecheckCommand, supportsTsrs } from './tsrs-typecheck-compiler.mjs' const BYTES_PER_GIB = 1024 ** 3 @@ -60,7 +63,7 @@ export function planTypecheckBatches(projects, { budgetGib, parallelism }) { return batches } -const repoRoot = fileURLToPath(new URL('../..', import.meta.url)) +const repoRoot = fileURLToPath(new URL('../../../..', import.meta.url)) export function resolveProjectCompilerInfo(config, root = repoRoot) { const require = createRequire(join(resolve(root, dirname(config)), 'package.json')) diff --git a/config/scripts/run-typecheck-projects-in-parallel.test.mjs b/config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.test.mjs similarity index 98% rename from config/scripts/run-typecheck-projects-in-parallel.test.mjs rename to config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.test.mjs index a2bc2c8187a..5c018b793e0 100644 --- a/config/scripts/run-typecheck-projects-in-parallel.test.mjs +++ b/config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.test.mjs @@ -12,7 +12,7 @@ import { tmpdir } from 'node:os' import { join, relative, sep } from 'node:path' import { fileURLToPath } from 'node:url' import { describe, expect, it } from 'vitest' -import { resolvePinnedBunExecutable } from './pinned-bun-executable.mjs' +import { resolvePinnedBunExecutable } from '../../tool-invocation/pinned-bun-executable.mjs' import { MOBILE_TYPECHECK_PROJECTS, TYPECHECK_PROJECTS, @@ -27,7 +27,7 @@ import { runTypecheckProjects } from './run-typecheck-projects-in-parallel.mjs' -const repoRoot = fileURLToPath(new URL('../..', import.meta.url)) +const repoRoot = fileURLToPath(new URL('../../../..', import.meta.url)) const CI_RUNNER = { totalBytes: 16 * 1024 ** 3, parallelism: 4 } const DEV_LAPTOP = { totalBytes: 64 * 1024 ** 3, parallelism: 18 } diff --git a/config/scripts/tsrs-typecheck-compiler.mjs b/config/scripts/typecheck/project-execution/tsrs-typecheck-compiler.mjs similarity index 100% rename from config/scripts/tsrs-typecheck-compiler.mjs rename to config/scripts/typecheck/project-execution/tsrs-typecheck-compiler.mjs diff --git a/config/scripts/tsrs-typecheck-compiler.test.mjs b/config/scripts/typecheck/project-execution/tsrs-typecheck-compiler.test.mjs similarity index 97% rename from config/scripts/tsrs-typecheck-compiler.test.mjs rename to config/scripts/typecheck/project-execution/tsrs-typecheck-compiler.test.mjs index 602391ebc70..1141e069961 100644 --- a/config/scripts/tsrs-typecheck-compiler.test.mjs +++ b/config/scripts/typecheck/project-execution/tsrs-typecheck-compiler.test.mjs @@ -44,7 +44,9 @@ it('isolates cache files by project, worktree and compiler version', () => { it('explains how to install a missing local compiler', () => { const root = mkdtempSync(join(tmpdir(), 'orca-tsrs-missing-')) try { - const module = pathToFileURL(resolve('config/scripts/tsrs-typecheck-compiler.mjs')).href + const module = pathToFileURL( + resolve('config/scripts/typecheck/project-execution/tsrs-typecheck-compiler.mjs') + ).href const result = runProcessSync({ program: process.env.ORCA_TEST_NODE_EXECUTABLE ?? process.execPath, args: [ diff --git a/config/scripts/typecheck-project-coverage.test.mjs b/config/scripts/typecheck/project-execution/typecheck-project-coverage.test.mjs similarity index 97% rename from config/scripts/typecheck-project-coverage.test.mjs rename to config/scripts/typecheck/project-execution/typecheck-project-coverage.test.mjs index 22a908f2191..6ccec85f254 100644 --- a/config/scripts/typecheck-project-coverage.test.mjs +++ b/config/scripts/typecheck/project-execution/typecheck-project-coverage.test.mjs @@ -5,7 +5,7 @@ import ts from 'typescript-api' import { describe, expect, it } from 'vitest' import { TYPECHECK_PROJECTS } from './run-typecheck-projects-in-parallel.mjs' -const root = fileURLToPath(new URL('../..', import.meta.url)) +const root = fileURLToPath(new URL('../../../..', import.meta.url)) const isTest = (file) => /\.(?:test|spec)\.(?:[cm]?ts|tsx)$/.test(file) const projects = TYPECHECK_PROJECTS.filter((project) => project.config.startsWith('config/')).map( ({ config }) => { diff --git a/config/scripts/verify-cli-bin.mjs b/config/scripts/verify-cli-bin.mjs index efb556d1b84..2770d28fdb7 100755 --- a/config/scripts/verify-cli-bin.mjs +++ b/config/scripts/verify-cli-bin.mjs @@ -4,7 +4,7 @@ import { execFileSync } from 'node:child_process' import { chmodSync, mkdirSync, readFileSync, statSync, writeFileSync } from 'node:fs' import path from 'node:path' import { pathToFileURL } from 'node:url' -import { resolveBuildSourceCommit } from './build-source-commit.mjs' +import { resolveBuildSourceCommit } from './build-identity/build-source-commit.mjs' // Packager restamps channel version after compilation; compiled CLI’s commit pins official skill installs. function buildOutPackageJson(version, commit) { diff --git a/config/scripts/verify-linux-wayland-gpu-sandbox.mjs b/config/scripts/verify-linux-wayland-gpu-sandbox.mjs index 082230b0210..ddf25da6347 100644 --- a/config/scripts/verify-linux-wayland-gpu-sandbox.mjs +++ b/config/scripts/verify-linux-wayland-gpu-sandbox.mjs @@ -74,7 +74,10 @@ function assertWaylandHost() { } function ensureElectronRuntime() { - run(process.execPath, ['config/scripts/ensure-native-runtime.mjs', '--runtime=electron']) + run(process.execPath, [ + 'config/scripts/native-build/node-addons/ensure-native-runtime.mjs', + '--runtime=electron' + ]) } function buildAppIfNeeded() { diff --git a/config/scripts/verify-localization-extraction.mjs b/config/scripts/verify-localization-extraction.mjs index 9391d5ad2a6..dc4c4ad8fca 100644 --- a/config/scripts/verify-localization-extraction.mjs +++ b/config/scripts/verify-localization-extraction.mjs @@ -166,8 +166,8 @@ async function extractToTemporaryCatalog(root, tempDir) { const [{ runProcessSync }, { describeProcessFailure }, { resolvePinnedBunExecutable }] = await Promise.all([ import('@orca/process-host'), - import('./process-failure-message.mjs'), - import('./pinned-bun-executable.mjs') + import('./tool-invocation/process-failure-message.mjs'), + import('./tool-invocation/pinned-bun-executable.mjs') ]) // Missing or unusable optional Bun keeps the existing parent runtime. const program = resolvePinnedBunExecutable(root, runProcessSync) ?? process.execPath diff --git a/config/scripts/verify-renderer-boot-graph.mjs b/config/scripts/verify-renderer-boot-graph.mjs index ea0446ecb8f..9c2f045a9e0 100644 --- a/config/scripts/verify-renderer-boot-graph.mjs +++ b/config/scripts/verify-renderer-boot-graph.mjs @@ -1,5 +1,5 @@ import process from 'node:process' -import { verifyRendererBootGraph } from './renderer-boot-graph.mjs' +import { verifyRendererBootGraph } from './desktop-build/output-contracts/renderer-boot-graph.mjs' process.exit(verifyRendererBootGraph()) diff --git a/config/scripts/verify-wsl-e2e-participation.mjs b/config/scripts/verify-wsl-e2e-participation.mjs index 9e8c9252b7f..c3997d96e0c 100644 --- a/config/scripts/verify-wsl-e2e-participation.mjs +++ b/config/scripts/verify-wsl-e2e-participation.mjs @@ -1,4 +1,4 @@ -import { verifyPlaywrightParticipation } from './verify-playwright-participation.mjs' +import { verifyPlaywrightParticipation } from './runtime-verification/participation/verify-playwright-participation.mjs' import { readFileSync } from 'node:fs' import { pathToFileURL } from 'node:url' diff --git a/config/scripts/verify-wsl-no-background-boot-participation.mjs b/config/scripts/verify-wsl-no-background-boot-participation.mjs index 87a61e8a791..46f6bc8e270 100644 --- a/config/scripts/verify-wsl-no-background-boot-participation.mjs +++ b/config/scripts/verify-wsl-no-background-boot-participation.mjs @@ -1,4 +1,4 @@ -import { verifyPlaywrightParticipation } from './verify-playwright-participation.mjs' +import { verifyPlaywrightParticipation } from './runtime-verification/participation/verify-playwright-participation.mjs' import { readFileSync } from 'node:fs' import { pathToFileURL } from 'node:url' diff --git a/config/scripts/run-vite-web-build.mjs b/config/scripts/web-build/execution/run-vite-web-build.mjs similarity index 82% rename from config/scripts/run-vite-web-build.mjs rename to config/scripts/web-build/execution/run-vite-web-build.mjs index b7c23451682..0455dbe8637 100644 --- a/config/scripts/run-vite-web-build.mjs +++ b/config/scripts/web-build/execution/run-vite-web-build.mjs @@ -1,8 +1,8 @@ import { spawn } from 'node:child_process' import { createRequire } from 'node:module' import path from 'node:path' -import { appendBuildOldSpaceOption } from './node-old-space-limit.mjs' -import { withRolldownThreadLimit } from './rolldown-thread-limit.mjs' +import { appendBuildOldSpaceOption } from '../../tool-invocation/node-old-space-limit.mjs' +import { withRolldownThreadLimit } from '../../tool-invocation/rolldown-thread-limit.mjs' const require = createRequire(import.meta.url) const vitePackageJson = require.resolve('vite/package.json') diff --git a/config/scripts/win32-test-lane-registration.test.mjs b/config/scripts/win32-test-lane-registration.test.mjs index 51eabf587d9..8bb0c0f50aa 100644 --- a/config/scripts/win32-test-lane-registration.test.mjs +++ b/config/scripts/win32-test-lane-registration.test.mjs @@ -3,8 +3,8 @@ import { join, resolve } from 'node:path' import { describe, expect, it } from 'vitest' import { parse } from 'yaml' import { scanSourceTree, stripComments } from '../../src/shared/source-scan/source-tree-scan' -import { classifyPrJobs } from './pr-code-change-scope.mjs' -import { WINDOWS_BOUNDARY_TESTS } from './pr-package-test-paths.mjs' +import { classifyPrJobs } from './workflow/source-routing/pr-code-change-scope.mjs' +import { WINDOWS_BOUNDARY_TESTS } from './workflow/source-routing/pr-package-test-paths.mjs' // Register every Windows-named or suite-gated file in sole Windows lane’s curated list; otherwise Ubuntu self-skips can pass without execution. // Follow suite/describe gates, nested aliases, local boolean polarity and narrowing &&; do not follow case-level gates, imported/function flags, broad OR/skipIf conjunctions. @@ -156,7 +156,7 @@ function readWindowsWorkflow() { } return run }) - if (!runs[0].includes('config/scripts/pr-package-test-paths.mjs')) { + if (!runs[0].includes('config/scripts/workflow/source-routing/pr-package-test-paths.mjs')) { throw new Error(`The "${WINDOWS_LANE_STEPS[0]}" step no longer reads WINDOWS_BOUNDARY_TESTS.`) } const run = runs.join(' ') @@ -187,12 +187,12 @@ function registrationFailure(path) { const missing = [] if (!laneFiles.includes(path)) { missing.push( - `add '${path}' to WINDOWS_BOUNDARY_TESTS in config/scripts/pr-package-test-paths.mjs` + `add '${path}' to WINDOWS_BOUNDARY_TESTS in config/scripts/workflow/source-routing/pr-package-test-paths.mjs` ) } if (!isInClassifier(path)) { missing.push( - `add '${path}' to WINDOWS_PACKAGE_TESTS in config/scripts/pr-package-test-paths.mjs` + `add '${path}' to WINDOWS_PACKAGE_TESTS in config/scripts/workflow/source-routing/pr-package-test-paths.mjs` ) } return missing.length === 0 ? null : `${path}: ${missing.join('; and ')}` diff --git a/config/scripts/windows-native-batch-reference-policy.test.ts b/config/scripts/windows-native-batch-reference-policy.test.ts index 2962f9ba811..8698b9412c4 100644 --- a/config/scripts/windows-native-batch-reference-policy.test.ts +++ b/config/scripts/windows-native-batch-reference-policy.test.ts @@ -3,14 +3,14 @@ import path from 'node:path' import { describe, expect, it } from 'vitest' import { hasWindowsNativeBatchReferenceViolation } from './windows-native-batch-reference-policy' -const initializer = 'config/scripts/initialize-windows-native-toolchain.mjs' -const benchmark = 'config/scripts/benchmark-windows-native-preparation.mjs' -const observer = 'config/scripts/windows-native-benchmark-observer.mjs' +const initializer = 'config/scripts/native-build/windows/initialize-windows-native-toolchain.mjs' +const benchmark = 'config/scripts/native-build/windows/benchmark-windows-native-preparation.mjs' +const observer = 'config/scripts/native-build/windows/windows-native-benchmark-observer.mjs' const metadataCallers = [ - 'config/scripts/node-server-change-scope.mjs', - 'config/scripts/pr-code-change-scope.mjs', - 'config/scripts/orcad-windows-prebuild-cache.mjs', - 'config/scripts/windows-native-toolchain-routing.test.mjs' + 'config/scripts/node-server/qualification/node-server-change-scope.mjs', + 'config/scripts/workflow/source-routing/pr-code-change-scope.mjs', + 'config/scripts/orcad-distribution/prebuilds/orcad-windows-prebuild-cache.mjs', + 'config/scripts/workflow/source-routing/windows-native-toolchain-routing.test.mjs' ] const capture = 'capture-windows-native-environment.cmd' const initializerSource = ` @@ -24,7 +24,7 @@ const initializerSource = ` ` const benchmarkSource = ` import { runProcess } from '@orca/process-host' - const source = 'config/scripts/${capture}' + const source = 'config/scripts/native-build/windows/${capture}' await runProcess({ program: process.execPath, args: [source] }) ` @@ -47,7 +47,9 @@ describe('reviewed Windows native batch references', () => { ) it.each(metadataCallers)('allows the fixed source path as metadata in %s', (relativePath) => { - expect(hasViolation(relativePath, `const source = 'config/scripts/${capture}'`)).toBe(false) + expect( + hasViolation(relativePath, `const source = 'config/scripts/native-build/windows/${capture}'`) + ).toBe(false) }) it('accepts the process-host executor through its imported alias', () => { @@ -78,7 +80,10 @@ describe('reviewed Windows native batch references', () => { it.each(metadataCallers)('rejects other batch metadata in %s', (relativePath) => { expect( - hasViolation(relativePath, `const sources = ['config/scripts/${capture}', 'other.cmd']`) + hasViolation( + relativePath, + `const sources = ['config/scripts/native-build/windows/${capture}', 'other.cmd']` + ) ).toBe(true) expect(hasViolation(relativePath, `const command = 'VsDevCmd.bat'`)).toBe(true) }) @@ -145,13 +150,13 @@ describe('reviewed Windows native batch references', () => { expect( hasViolation( relativePath, - `const capture = 'config/scripts/${capture}'; runProcess({ program: capture })` + `const capture = 'config/scripts/native-build/windows/${capture}'; runProcess({ program: capture })` ) ).toBe(true) expect( hasViolation( relativePath, - `import { runProcess as execute } from '@orca/process-host'; const capture = 'config/scripts/${capture}'; execute({ program: capture })` + `import { runProcess as execute } from '@orca/process-host'; const capture = 'config/scripts/native-build/windows/${capture}'; execute({ program: capture })` ) ).toBe(true) }) diff --git a/config/scripts/windows-native-batch-reference-policy.ts b/config/scripts/windows-native-batch-reference-policy.ts index 78db540c82d..8f96024e930 100644 --- a/config/scripts/windows-native-batch-reference-policy.ts +++ b/config/scripts/windows-native-batch-reference-policy.ts @@ -3,45 +3,45 @@ import { collectModuleSpecifiers, literalString, propertyName -} from './static-module-specifiers.mjs' +} from './static-analysis/module-requests/static-module-specifiers.mjs' import { hasNodeModulesBinSpawn } from './windows-bin-spawn-predicate.mjs' const references = new Map([ [ - 'config/scripts/node-server-change-scope.mjs', - 'config/scripts/capture-windows-native-environment.cmd' + 'config/scripts/node-server/qualification/node-server-change-scope.mjs', + 'config/scripts/native-build/windows/capture-windows-native-environment.cmd' ], [ - 'config/scripts/pr-code-change-scope.mjs', - 'config/scripts/capture-windows-native-environment.cmd' + 'config/scripts/workflow/source-routing/pr-code-change-scope.mjs', + 'config/scripts/native-build/windows/capture-windows-native-environment.cmd' ], [ - 'config/scripts/orcad-windows-prebuild-cache.mjs', - 'config/scripts/capture-windows-native-environment.cmd' + 'config/scripts/orcad-distribution/prebuilds/orcad-windows-prebuild-cache.mjs', + 'config/scripts/native-build/windows/capture-windows-native-environment.cmd' ], [ - 'config/scripts/windows-native-toolchain-routing.test.mjs', - 'config/scripts/capture-windows-native-environment.cmd' + 'config/scripts/workflow/source-routing/windows-native-toolchain-routing.test.mjs', + 'config/scripts/native-build/windows/capture-windows-native-environment.cmd' ], [ - 'config/scripts/windows-native-benchmark-observer.mjs', + 'config/scripts/native-build/windows/windows-native-benchmark-observer.mjs', 'capture-windows-native-environment.cmd' ], [ - 'config/scripts/initialize-windows-native-toolchain.mjs', + 'config/scripts/native-build/windows/initialize-windows-native-toolchain.mjs', 'capture-windows-native-environment.cmd' ], [ - 'config/scripts/benchmark-windows-native-preparation.mjs', - 'config/scripts/capture-windows-native-environment.cmd' + 'config/scripts/native-build/windows/benchmark-windows-native-preparation.mjs', + 'config/scripts/native-build/windows/capture-windows-native-environment.cmd' ] ]) const executors = new Map([ - ['config/scripts/initialize-windows-native-toolchain.mjs', 'runProcessSync'], - ['config/scripts/benchmark-windows-native-preparation.mjs', 'runProcess'] + ['config/scripts/native-build/windows/initialize-windows-native-toolchain.mjs', 'runProcessSync'], + ['config/scripts/native-build/windows/benchmark-windows-native-preparation.mjs', 'runProcess'] ]) -const initializer = 'config/scripts/initialize-windows-native-toolchain.mjs' -const observer = 'config/scripts/windows-native-benchmark-observer.mjs' +const initializer = 'config/scripts/native-build/windows/initialize-windows-native-toolchain.mjs' +const observer = 'config/scripts/native-build/windows/windows-native-benchmark-observer.mjs' const rawProcessMethods = new Set([ 'spawn', 'spawnSync', diff --git a/config/scripts/windows-security-reuse-benchmark.test.mjs b/config/scripts/windows-security-reuse-benchmark.test.mjs index def4746ceb2..9b98784f31c 100644 --- a/config/scripts/windows-security-reuse-benchmark.test.mjs +++ b/config/scripts/windows-security-reuse-benchmark.test.mjs @@ -14,8 +14,8 @@ import { dirname, join } from 'node:path' import { runInNewContext } from 'node:vm' import { afterEach, expect, it, vi } from 'vitest' import { NODE_RUNTIME_PIN } from '../../src/shared/node-runtime-pin.ts' -import { sha256Of } from './orcad-prebuild-slot-contents.mjs' -import { peImage } from './windows-pe-image-fixture.mjs' +import { sha256Of } from './orcad-distribution/prebuilds/orcad-prebuild-slot-contents.mjs' +import { peImage } from './native-build/windows/windows-pe-image-fixture.mjs' import { benchmarkWindowsSecurityReuse, probeSecurityArtifact, @@ -203,8 +203,8 @@ function hostedFixture(arch = 'x64', failure) { 'package.json', '.github/actions/prepare-native-runtime/action.yml', 'src/shared/node-runtime-pin.ts', - 'config/scripts/build-windows-security-addon.mjs', - 'config/scripts/ensure-native-runtime.mjs', + 'config/scripts/native-build/windows/build-windows-security-addon.mjs', + 'config/scripts/native-build/node-addons/ensure-native-runtime.mjs', 'config/scripts/benchmark-windows-security-reuse.mjs' ]) { mkdirSync(dirname(join(f.root, path)), { recursive: true }) diff --git a/config/scripts/workflow-ref-mirror-case-safety.test.mjs b/config/scripts/workflow-ref-mirror-case-safety.test.mjs index 4dceebd3f64..cc00efc0c49 100644 --- a/config/scripts/workflow-ref-mirror-case-safety.test.mjs +++ b/config/scripts/workflow-ref-mirror-case-safety.test.mjs @@ -81,7 +81,7 @@ describe('ref-mirroring vet steps', () => { const script = ` const result = []; for (const [channel, exported] of [['daily', 'Daily'], ['hourly', 'Hourly'], ['adhoc', 'Adhoc']]) { - const module = await import(${JSON.stringify(pathToFileURL(join(projectDir, 'config/scripts/')).href)} + channel + '-build-version.mjs'); + const module = await import(${JSON.stringify(pathToFileURL(join(projectDir, 'config/scripts/release/versioning/')).href)} + channel + '-build-version.mjs'); const date = new Date('2026-09-12T00:00:00Z'); result.push(channel === 'adhoc' ? module.getAdhocBuildIdentity(date, 'branch', ['v1.4.167']) diff --git a/config/scripts/pr-aggregate-gate-context.mjs b/config/scripts/workflow/pr-admission/pr-aggregate-gate-context.mjs similarity index 96% rename from config/scripts/pr-aggregate-gate-context.mjs rename to config/scripts/workflow/pr-admission/pr-aggregate-gate-context.mjs index 061a7db328c..19e25590793 100644 --- a/config/scripts/pr-aggregate-gate-context.mjs +++ b/config/scripts/workflow/pr-admission/pr-aggregate-gate-context.mjs @@ -1,7 +1,7 @@ import { readFileSync } from 'node:fs' import { Evaluator, Lexer, Parser, data } from '@actions/expressions' import { parse } from 'yaml' -import { PR_CHECK_JOBS } from './pr-code-change-scope.mjs' +import { PR_CHECK_JOBS } from '../source-routing/pr-code-change-scope.mjs' export const aggregateWorkflow = parse(readFileSync('.github/workflows/pr.yml', 'utf8')) export const aggregateJob = aggregateWorkflow.jobs.verify diff --git a/config/scripts/pr-aggregate-gate.test.mjs b/config/scripts/workflow/pr-admission/pr-aggregate-gate.test.mjs similarity index 100% rename from config/scripts/pr-aggregate-gate.test.mjs rename to config/scripts/workflow/pr-admission/pr-aggregate-gate.test.mjs diff --git a/config/scripts/pr-ready-check-gate.test.mjs b/config/scripts/workflow/pr-admission/pr-ready-check-gate.test.mjs similarity index 100% rename from config/scripts/pr-ready-check-gate.test.mjs rename to config/scripts/workflow/pr-admission/pr-ready-check-gate.test.mjs diff --git a/config/scripts/pr-browser-e2e-source-routes.mjs b/config/scripts/workflow/source-routing/pr-browser-e2e-source-routes.mjs similarity index 100% rename from config/scripts/pr-browser-e2e-source-routes.mjs rename to config/scripts/workflow/source-routing/pr-browser-e2e-source-routes.mjs diff --git a/config/scripts/pr-code-change-scope-cross-version-launch-route.test.mjs b/config/scripts/workflow/source-routing/pr-code-change-scope-cross-version-launch-route.test.mjs similarity index 100% rename from config/scripts/pr-code-change-scope-cross-version-launch-route.test.mjs rename to config/scripts/workflow/source-routing/pr-code-change-scope-cross-version-launch-route.test.mjs diff --git a/config/scripts/pr-code-change-scope-cross-version-send-path.test.mjs b/config/scripts/workflow/source-routing/pr-code-change-scope-cross-version-send-path.test.mjs similarity index 100% rename from config/scripts/pr-code-change-scope-cross-version-send-path.test.mjs rename to config/scripts/workflow/source-routing/pr-code-change-scope-cross-version-send-path.test.mjs diff --git a/config/scripts/pr-code-change-scope-daemon-protocol.test.mjs b/config/scripts/workflow/source-routing/pr-code-change-scope-daemon-protocol.test.mjs similarity index 90% rename from config/scripts/pr-code-change-scope-daemon-protocol.test.mjs rename to config/scripts/workflow/source-routing/pr-code-change-scope-daemon-protocol.test.mjs index 014b83dd9fa..7bae90a47b4 100644 --- a/config/scripts/pr-code-change-scope-daemon-protocol.test.mjs +++ b/config/scripts/workflow/source-routing/pr-code-change-scope-daemon-protocol.test.mjs @@ -12,7 +12,7 @@ describe('daemon protocol crossing gate routing', () => { }) it.each([ - 'config/scripts/daemon-protocol-facts.mjs', + 'config/scripts/daemon-protocol/schema-facts/daemon-protocol-facts.mjs', 'config/scripts/check-daemon-protocol-crossing.mjs', 'config/scripts/stable-release-tags.mjs' ])('runs the gate when its checker %s changes', (file) => { diff --git a/config/scripts/pr-code-change-scope-format-route.test.mjs b/config/scripts/workflow/source-routing/pr-code-change-scope-format-route.test.mjs similarity index 100% rename from config/scripts/pr-code-change-scope-format-route.test.mjs rename to config/scripts/workflow/source-routing/pr-code-change-scope-format-route.test.mjs diff --git a/config/scripts/pr-code-change-scope-process-host.test.mjs b/config/scripts/workflow/source-routing/pr-code-change-scope-process-host.test.mjs similarity index 90% rename from config/scripts/pr-code-change-scope-process-host.test.mjs rename to config/scripts/workflow/source-routing/pr-code-change-scope-process-host.test.mjs index bdf128d8956..487395e09ac 100644 --- a/config/scripts/pr-code-change-scope-process-host.test.mjs +++ b/config/scripts/workflow/source-routing/pr-code-change-scope-process-host.test.mjs @@ -23,7 +23,7 @@ it('keeps unrelated host packages out of the mobile web build checks', () => { it.each([ 'src/packages/process-host/src/run-process.ts', 'config/scripts/smoke-process-host-node18.mjs', - 'config/scripts/packaged-process-host-fixture.mjs' + 'config/scripts/desktop-distribution/runtime-verification/packaged-process-host-fixture.mjs' ])('qualifies the Node 18 package floor for %s', (file) => { expect(classifyPrJobs([file]).managed_hook_node18).toBe(true) }) diff --git a/config/scripts/pr-code-change-scope-released-phone.test.mjs b/config/scripts/workflow/source-routing/pr-code-change-scope-released-phone.test.mjs similarity index 100% rename from config/scripts/pr-code-change-scope-released-phone.test.mjs rename to config/scripts/workflow/source-routing/pr-code-change-scope-released-phone.test.mjs diff --git a/config/scripts/pr-code-change-scope-test-inputs.test.mjs b/config/scripts/workflow/source-routing/pr-code-change-scope-test-inputs.test.mjs similarity index 71% rename from config/scripts/pr-code-change-scope-test-inputs.test.mjs rename to config/scripts/workflow/source-routing/pr-code-change-scope-test-inputs.test.mjs index 73daaeccd7f..78ad2f1b87e 100644 --- a/config/scripts/pr-code-change-scope-test-inputs.test.mjs +++ b/config/scripts/workflow/source-routing/pr-code-change-scope-test-inputs.test.mjs @@ -2,8 +2,8 @@ import { expect, it } from 'vitest' import { classifyPrJobs, PR_CHECK_JOBS } from './pr-code-change-scope.mjs' it.each([ - 'config/scripts/pr-code-change-scope.test.mjs', - 'config/scripts/pr-code-change-scope-released-phone.test.mjs', + 'config/scripts/workflow/source-routing/pr-code-change-scope.test.mjs', + 'config/scripts/workflow/source-routing/pr-code-change-scope-released-phone.test.mjs', 'config/scripts/pr-package-test-paths.test.mjs' ])('keeps full units and preflight without forcing unrelated lanes for %s', (file) => { for (const files of [[file], [file, 'AGENTS.md']]) { @@ -26,13 +26,16 @@ it.each([ }) it.each([ - 'config/scripts/pr-code-change-scope.mjs', + 'config/scripts/workflow/source-routing/pr-code-change-scope.mjs', 'config/scripts/pr-code-change-scope-next.mjs', - 'config/scripts/pr-package-test-paths.mjs', + 'config/scripts/workflow/source-routing/pr-package-test-paths.mjs', '.github/workflows/pr.yml', '.github/actions/install-node-dependencies/action.yml' ])('keeps every lane for routing or execution changes mixed with routing tests: %s', (file) => { - const result = classifyPrJobs(['config/scripts/pr-code-change-scope.test.mjs', file]) + const result = classifyPrJobs([ + 'config/scripts/workflow/source-routing/pr-code-change-scope.test.mjs', + file + ]) for (const job of PR_CHECK_JOBS) { expect(result[job], job).toBe(true) } diff --git a/config/scripts/pr-code-change-scope-windows-process-probe.test.mjs b/config/scripts/workflow/source-routing/pr-code-change-scope-windows-process-probe.test.mjs similarity index 79% rename from config/scripts/pr-code-change-scope-windows-process-probe.test.mjs rename to config/scripts/workflow/source-routing/pr-code-change-scope-windows-process-probe.test.mjs index c746dcde802..663c857a92a 100644 --- a/config/scripts/pr-code-change-scope-windows-process-probe.test.mjs +++ b/config/scripts/workflow/source-routing/pr-code-change-scope-windows-process-probe.test.mjs @@ -7,12 +7,12 @@ describe('Windows installer process probe routing', () => { ['config/nsis/orca-process-check.nsh'], ['config/nsis/orca-installer-hooks.nsh'], ['config/scripts/nsis-process-check.test.mjs'], - ['config/scripts/idle-cpu-process-sampling.mjs'], - ['config/scripts/idle-cpu-process-sampling.test.mjs'], + ['config/scripts/performance/idle-cpu/idle-cpu-process-sampling.mjs'], + ['config/scripts/performance/idle-cpu/idle-cpu-process-sampling.test.mjs'], ['src/packages/process-host/src/run-process.ts'], ['config/vitest.config.ts'], - ['config/scripts/vitest-host-ports-setup.ts'], - ['config/scripts/ci-unit-files.mjs'], + ['config/scripts/test-runtime/environment/vitest-host-ports-setup.ts'], + ['config/scripts/ci/unit-selection/dependency-graph/ci-unit-files.mjs'], ['.github/actions/install-node-dependencies/action.yml'], ['.github/workflows/pr.yml'], ['package.json'], diff --git a/config/scripts/pr-code-change-scope.mjs b/config/scripts/workflow/source-routing/pr-code-change-scope.mjs similarity index 86% rename from config/scripts/pr-code-change-scope.mjs rename to config/scripts/workflow/source-routing/pr-code-change-scope.mjs index a923aa5e34e..69bfa1b7913 100644 --- a/config/scripts/pr-code-change-scope.mjs +++ b/config/scripts/workflow/source-routing/pr-code-change-scope.mjs @@ -3,10 +3,13 @@ import { join } from 'node:path' import { pathToFileURL } from 'node:url' import { isLayoutOracleSource } from './pr-layout-oracle-route.mjs' import { SHELL_PREFIXES } from './pr-shell-contract-prefixes.mjs' +import { XTERM_PREFIXES } from './pr-xterm-patch-prefixes.mjs' import { isCloudTestRunnerInput, isWindowsProcessProbePath, + LINUX_PACKAGE_PREFIXES, LINUX_PACKAGE_TESTS, + WINDOWS_PACKAGE_PREFIXES, WINDOWS_PACKAGE_TESTS } from './pr-package-test-paths.mjs' @@ -59,7 +62,10 @@ const GLOBAL_FORCE_PREFIXES = [ '.github/actions/restore-pnpm-verification/', '.github/actions/prepare-native-runtime/', 'config/scripts/pr-code-change-scope', - 'config/scripts/pr-package-test-paths' + 'config/scripts/workflow/source-routing/pr-code-change-scope', + 'config/scripts/workflow/source-routing/pr-xterm-patch-prefixes.mjs', + 'config/scripts/pr-package-test-paths', + 'config/scripts/workflow/source-routing/pr-package-test-paths' ] const GLOBAL_FORCE_FILES = new Set(['package.json', 'pnpm-lock.yaml']) @@ -123,13 +129,6 @@ const CODEX_INDEX_HEAL_CONTRACT_PREFIXES = [ 'src/shared/windows-batch-spawn' ] -const XTERM_PREFIXES = [ - 'config/patches/xterm-upstream.json', - 'config/patches/@xterm', - 'config/patches/xterm-src/', - 'config/scripts/regenerate-xterm-patches' -] - const ORCAD_BROWSER_PREFIXES = [ 'src/main/orcad/external-chromium-', 'src/main/orcad/orcad-browser-provider', @@ -153,15 +152,22 @@ const DEPENDENCY_ISOLATION_PREFIXES = [ const MOBILE_WEB_APP_PREFIXES = [ '.github/scripts/prepare-ubuntu-apt.sh', 'config/scripts/build-mobile-web-app', + 'config/scripts/build/mobile-web-app/build-mobile-web-app', 'config/scripts/run-mobile-web-app-checks', + 'config/scripts/mobile-web/check-entry/run-mobile-web-app-checks', 'src/packages/process-host/', 'config/scripts/verify-mobile-web-app-bundle', + 'config/scripts/build/mobile-web-app/verify-mobile-web-app-bundle', 'config/scripts/mobile-web-app-', 'config/scripts/mobile-web-app/', 'config/scripts/mobile-web-bundle-', + 'config/scripts/build/mobile-web-app/mobile-web-bundle-', 'config/scripts/verify-packaged-mobile-web-bundle', + 'config/scripts/desktop-distribution/runtime-verification/verify-packaged-mobile-web-bundle', 'config/scripts/mobile-web-source-line-endings', + 'config/scripts/build/mobile-web-app/mobile-web-source-line-endings', 'config/scripts/script-entry-detection', + 'config/scripts/tool-invocation/script-entry-detection', 'mobile/web-entry/', 'mobile/app/', 'mobile/src/', @@ -184,6 +190,7 @@ const CROSS_VERSION_WIRE_PREFIXES = [ 'config/scripts/stable-release-tags', // The R1 daemon protocol crossing gate runs in this job. 'config/scripts/daemon-protocol-facts', + 'config/scripts/daemon-protocol/schema-facts/daemon-protocol-facts', 'config/scripts/check-daemon-protocol-crossing', // R3 runtime launcher protocol ratchet; a bump always routes here via the protocol file. 'config/scripts/check-runtime-launcher-protocol-ratchet', @@ -281,31 +288,15 @@ const CROSS_VERSION_WIRE_PREFIXES = [ const MANAGED_HOOK_PREFIXES = [ 'config/scripts/smoke-process-host-node18', 'config/scripts/packaged-process-host-fixture', + 'config/scripts/desktop-distribution/runtime-verification/packaged-process-host-fixture', 'src/packages/process-host/', 'config/scripts/build-wsl-guest', + 'config/scripts/remote-host-build/wsl-guest/build-wsl-guest', 'src/wsl-guest/', 'src/shared/agent-hook', 'src/main/agent-hooks/' ] -const NATIVE_RUNTIME_PREFIXES = [ - 'config/scripts/ensure-native-runtime', - 'config/scripts/initialize-windows-native-toolchain', - 'config/scripts/capture-windows-native-environment', - 'config/scripts/rebuild-native-deps', - 'config/scripts/node-pty-job-ownership', - 'config/scripts/windows-pe-machine', - 'config/scripts/windows-pe-image-fixture', - 'config/scripts/script-module-dependencies', - 'config/scripts/windows-process-tree-creation-time', - 'config/scripts/windows-process-tree-gyp-rebuild', - 'config/scripts/electron-builder-native-rebuild', - 'config/scripts/native-build-entry', - 'config/scripts/shared-native-build', - 'config/patches/node-pty@', - 'config/patches/@vscode__windows-process-tree' -] - const NATIVE_CACHE_FILES = new Set([ 'package.json', 'pnpm-lock.yaml', @@ -314,27 +305,29 @@ const NATIVE_CACHE_FILES = new Set([ 'pnpm-workspace.yaml', '.npmrc', 'config/pnpmfile.cjs', - 'config/scripts/ensure-native-runtime.mjs', - 'config/scripts/initialize-windows-native-toolchain.mjs', - 'config/scripts/capture-windows-native-environment.cmd', - 'config/scripts/rebuild-native-deps.mjs', - 'config/scripts/node-pty-job-ownership.cjs', - 'config/scripts/windows-pe-machine.cjs', - 'config/scripts/windows-process-tree-gyp-rebuild.mjs', - 'config/scripts/windows-process-tree-creation-time.cjs', - 'config/scripts/install-electron-package-binary.mjs', - 'config/scripts/electron-platform-path.mjs', + 'config/scripts/native-build/node-addons/ensure-native-runtime.mjs', + 'config/scripts/native-build/windows/initialize-windows-native-toolchain.mjs', + 'config/scripts/native-build/windows/capture-windows-native-environment.cmd', + 'config/scripts/native-build/node-addons/rebuild-native-deps.mjs', + 'config/scripts/native-build/node-addons/node-pty-job-ownership.cjs', + 'config/scripts/native-build/windows/windows-pe-machine.cjs', + 'config/scripts/native-build/windows/windows-process-tree-gyp-rebuild.mjs', + 'config/scripts/native-build/windows/windows-process-tree-creation-time.cjs', + 'config/scripts/electron-installation/platform-layout/install-electron-package-binary.mjs', + 'config/scripts/electron-installation/platform-layout/electron-platform-path.mjs', 'config/scripts/zip-extractor-command.mjs', 'src/shared/zip-extractor-command.ts', - 'config/scripts/space-sharing-copy.mjs', - 'config/scripts/native-dependency-lock-digest.mjs', - 'config/scripts/orcad-prebuild-node-gyp.mjs', - 'config/scripts/msbuild-file-tracking.mjs' + 'config/scripts/artifact-storage/reflink-copy/space-sharing-copy.mjs', + 'config/scripts/native-build/node-addons/native-dependency-lock-digest.mjs', + 'config/scripts/orcad-distribution/prebuilds/orcad-prebuild-node-gyp.mjs', + 'config/scripts/native-build/windows/msbuild-file-tracking.mjs' ]) const NATIVE_CACHE_PREFIXES = [ 'config/scripts/native-build-entry', + 'config/scripts/native-build/node-addons/native-build-entry', 'config/scripts/shared-', + 'config/scripts/native-build/node-addons/shared-', 'config/patches/node-pty@', 'config/patches/@vscode__windows-process-tree', // The vendored addons' sources: build/ and bin/ beside them are ignored, so nothing else lands here. @@ -342,63 +335,6 @@ const NATIVE_CACHE_PREFIXES = [ 'native/windows-security/' ] -const SHARED_PACKAGE_PREFIXES = [ - 'electron.vite.config.ts', - 'config/electron-builder', - 'config/packaged-runtime', - 'config/packaged-native-build-entries', - 'config/build-plugins/', - 'config/scripts/build-', - 'config/scripts/smoke-packaged', - 'config/scripts/install-electron-package-binary', - 'config/scripts/verify-packaged', - 'config/scripts/verify-skills-cli-runtime', - 'config/scripts/verify-linux-glibc', - 'config/scripts/run-electron-vite', - 'skills/', - 'skill-guides/', - 'resources/build/', - 'resources/onboarding/', - 'resources/plugins/', - 'resources/skills/', - ...NATIVE_RUNTIME_PREFIXES -] - -const LINUX_PACKAGE_PREFIXES = [ - ...SHARED_PACKAGE_PREFIXES, - 'config/scripts/package-linux-formats', - 'config/scripts/process-failure-message.mjs', - 'config/scripts/space-sharing-copy.mjs', - '.github/actions/prepare-linux-package-fixture/', - '.github/actions/prepare-wayland-clipboard/', - 'config/docker/cli-launch-contract/', - 'config/docker/headless-pairing/', - 'config/docker/headless-serve-shutdown/', - 'config/docker/daemon-shutdown-descendants/', - 'config/scripts/run-linux-cli-launch-contract', - 'config/scripts/run-headless-linux-pairing-docker', - 'config/scripts/run-daemon-shutdown-descendants-docker', - 'config/scripts/static-appimage-package-contract', - 'native/computer-use-linux/', - 'native/wayland-clipboard/', - 'resources/linux/', - 'config/scripts/run-headless-serve' -] - -const WINDOWS_PACKAGE_PREFIXES = [ - ...SHARED_PACKAGE_PREFIXES, - 'native/windows-cli-launcher/', - 'native/windows-agent-hook/', - 'native/computer-use-windows/', - 'resources/win32/', - 'config/scripts/build-windows-cli-launcher', - 'config/scripts/build-windows-agent-hook', - 'config/scripts/windows-rust-executable-build', - 'config/scripts/verify-packaged-windows-agent-hook', - 'config/scripts/windows-pty-native-capability', - 'tests/tools/windows-pty-native-capability-smoke/' -] - const DESKTOP_IRRELEVANT_PREFIXES = [ 'mobile/', 'cloud/', @@ -436,7 +372,7 @@ function oxlintScanRoots(command) { // Derive lint trees from command argv: mobile is otherwise desktop-irrelevant, and duplicate scope lists let #20702 bypass audits. function readStaticAnalysisScanRoots() { - const manifest = join(import.meta.dirname, '../../package.json') + const manifest = join(import.meta.dirname, '../../../../package.json') const { scripts = {} } = JSON.parse(readFileSync(manifest, 'utf8')) return [ ...new Set( @@ -456,7 +392,9 @@ const FORMAT_CHECKED_EXTENSION = function readFormatIgnoredPrefixes() { let config try { - config = JSON.parse(readFileSync(join(import.meta.dirname, '../../.oxfmtrc.json'), 'utf8')) + config = JSON.parse( + readFileSync(join(import.meta.dirname, '../../../../.oxfmtrc.json'), 'utf8') + ) } catch { // Fail closed: with no ignores known, every formatted type keeps the gate. return [] diff --git a/config/scripts/pr-code-change-scope.test.mjs b/config/scripts/workflow/source-routing/pr-code-change-scope.test.mjs similarity index 87% rename from config/scripts/pr-code-change-scope.test.mjs rename to config/scripts/workflow/source-routing/pr-code-change-scope.test.mjs index 19cc9ed4669..c9d2b5d6a90 100644 --- a/config/scripts/pr-code-change-scope.test.mjs +++ b/config/scripts/workflow/source-routing/pr-code-change-scope.test.mjs @@ -7,7 +7,7 @@ import { STATIC_ANALYSIS_SCAN_ROOTS } from './pr-code-change-scope.mjs' -const projectDir = resolve(import.meta.dirname, '../..') +const projectDir = resolve(import.meta.dirname, '../../../..') describe('per-job path classification', () => { it('runs every expensive job on an empty diff rather than skipping by accident', () => { @@ -23,8 +23,11 @@ describe('per-job path classification', () => { expect([classified.should_run, classified.mobile_web_app]).toEqual([false, true]) }) - it('runs workflow-self-change and lockfile diffs as force-all', () => { - const result = classifyPrJobs(['.github/workflows/pr.yml']) + it.each([ + '.github/workflows/pr.yml', + 'config/scripts/workflow/source-routing/pr-xterm-patch-prefixes.mjs' + ])('runs workflow and routing owner diffs as force-all: %s', (file) => { + const result = classifyPrJobs([file]) expect(result.should_run).toBe(true) for (const job of PR_CHECK_JOBS) { expect(result[job], job).toBe(true) @@ -64,10 +67,14 @@ describe('per-job path classification', () => { const input = `${[...filler, 'config/patches/xterm-upstream.json'].join('\n')}\n` expect(input.length).toBeGreaterThan(64 * 1024) - const child = spawn(process.execPath, ['config/scripts/pr-code-change-scope.mjs'], { - cwd: projectDir, - stdio: ['pipe', 'pipe', 'pipe'] - }) + const child = spawn( + process.execPath, + ['config/scripts/workflow/source-routing/pr-code-change-scope.mjs'], + { + cwd: projectDir, + stdio: ['pipe', 'pipe', 'pipe'] + } + ) let stdout = '' let stderr = '' let brokePipe = false diff --git a/config/scripts/pr-codex-unit-only-selection.test.mjs b/config/scripts/workflow/source-routing/pr-codex-unit-only-selection.test.mjs similarity index 100% rename from config/scripts/pr-codex-unit-only-selection.test.mjs rename to config/scripts/workflow/source-routing/pr-codex-unit-only-selection.test.mjs diff --git a/config/scripts/pr-e2e-gate-contract.test.mjs b/config/scripts/workflow/source-routing/pr-e2e-gate-contract.test.mjs similarity index 100% rename from config/scripts/pr-e2e-gate-contract.test.mjs rename to config/scripts/workflow/source-routing/pr-e2e-gate-contract.test.mjs diff --git a/config/scripts/pr-e2e-source-routing.mjs b/config/scripts/workflow/source-routing/pr-e2e-source-routing.mjs similarity index 99% rename from config/scripts/pr-e2e-source-routing.mjs rename to config/scripts/workflow/source-routing/pr-e2e-source-routing.mjs index 80fcf173669..a09edf90e23 100644 --- a/config/scripts/pr-e2e-source-routing.mjs +++ b/config/scripts/workflow/source-routing/pr-e2e-source-routing.mjs @@ -5,7 +5,7 @@ import { isDaemonInitTestSupportChange, isUnitTestSupportSource } from './pr-code-change-scope.mjs' -import { MANAGED_SSH_E2E_SPEC_PREFIX } from './ci-e2e-job-selection.mjs' +import { MANAGED_SSH_E2E_SPEC_PREFIX } from '../../ci/e2e-selection/ci-e2e-job-selection.mjs' import { LAYOUT_ORACLE_E2E_SPECS } from './pr-layout-oracle-route.mjs' import { PR_BROWSER_E2E_SOURCE_ROUTES } from './pr-browser-e2e-source-routes.mjs' import { PR_EDITOR_PREVIEW_E2E_SOURCE_ROUTES } from './pr-editor-preview-e2e-source-routes.mjs' @@ -559,7 +559,7 @@ export function selectPrE2eSpecs( [...specs].some((spec) => spec.startsWith(MANAGED_SSH_E2E_SPEC_PREFIX))) || file === '.github/workflows/e2e.yml' || file === '.github/scripts/prepare-ubuntu-apt.sh' || - file === 'config/scripts/ci-e2e-job-selection.mjs' + file === 'config/scripts/ci/e2e-selection/ci-e2e-job-selection.mjs' ) ) { specs.add(MANAGED_SSH_E2E_SPEC_PREFIX) diff --git a/config/scripts/pr-editor-preview-e2e-source-routes.mjs b/config/scripts/workflow/source-routing/pr-editor-preview-e2e-source-routes.mjs similarity index 100% rename from config/scripts/pr-editor-preview-e2e-source-routes.mjs rename to config/scripts/workflow/source-routing/pr-editor-preview-e2e-source-routes.mjs diff --git a/config/scripts/pr-feature-area-e2e-source-routes.mjs b/config/scripts/workflow/source-routing/pr-feature-area-e2e-source-routes.mjs similarity index 100% rename from config/scripts/pr-feature-area-e2e-source-routes.mjs rename to config/scripts/workflow/source-routing/pr-feature-area-e2e-source-routes.mjs diff --git a/config/scripts/pr-layout-oracle-route.mjs b/config/scripts/workflow/source-routing/pr-layout-oracle-route.mjs similarity index 97% rename from config/scripts/pr-layout-oracle-route.mjs rename to config/scripts/workflow/source-routing/pr-layout-oracle-route.mjs index 96cd9da77c7..d301c9c25bf 100644 --- a/config/scripts/pr-layout-oracle-route.mjs +++ b/config/scripts/workflow/source-routing/pr-layout-oracle-route.mjs @@ -63,8 +63,8 @@ const LAYOUT_ORACLE_PREFIXES = [ // The job itself: the called workflow, its window-spec lane picker, and this route. '.github/workflows/e2e.yml', '.github/scripts/prepare-ubuntu-apt.sh', - 'config/scripts/ci-e2e-job-selection.mjs', - 'config/scripts/pr-layout-oracle-route.mjs' + 'config/scripts/ci/e2e-selection/ci-e2e-job-selection.mjs', + 'config/scripts/workflow/source-routing/pr-layout-oracle-route.mjs' ] const RUNTIME_LAYOUT_WRITERS = [ diff --git a/config/scripts/workflow/source-routing/pr-package-test-paths.mjs b/config/scripts/workflow/source-routing/pr-package-test-paths.mjs new file mode 100644 index 00000000000..ea7c7948b2b --- /dev/null +++ b/config/scripts/workflow/source-routing/pr-package-test-paths.mjs @@ -0,0 +1,266 @@ +import process from 'node:process' +import { pathToFileURL } from 'node:url' + +const NATIVE_RUNTIME_PREFIXES = [ + 'config/scripts/ensure-native-runtime', + 'config/scripts/native-build/node-addons/ensure-native-runtime', + 'config/scripts/initialize-windows-native-toolchain', + 'config/scripts/native-build/windows/initialize-windows-native-toolchain', + 'config/scripts/capture-windows-native-environment', + 'config/scripts/native-build/windows/capture-windows-native-environment', + 'config/scripts/rebuild-native-deps', + 'config/scripts/native-build/node-addons/rebuild-native-deps', + 'config/scripts/node-pty-job-ownership', + 'config/scripts/native-build/node-addons/node-pty-job-ownership', + 'config/scripts/windows-pe-machine', + 'config/scripts/native-build/windows/windows-pe-machine', + 'config/scripts/windows-pe-image-fixture', + 'config/scripts/native-build/windows/windows-pe-image-fixture', + 'config/scripts/script-module-dependencies', + 'config/scripts/test-fixtures/script-copy-closure/script-module-dependencies', + 'config/scripts/windows-process-tree-creation-time', + 'config/scripts/native-build/windows/windows-process-tree-creation-time', + 'config/scripts/windows-process-tree-gyp-rebuild', + 'config/scripts/native-build/windows/windows-process-tree-gyp-rebuild', + 'config/scripts/electron-builder-native-rebuild', + 'config/scripts/desktop-distribution/runtime-verification/electron-builder-native-rebuild', + 'config/scripts/native-build-entry', + 'config/scripts/native-build/node-addons/native-build-entry', + 'config/scripts/shared-native-build', + 'config/scripts/native-build/node-addons/shared-native-build', + 'config/patches/node-pty@', + 'config/patches/@vscode__windows-process-tree' +] + +const SHARED_PACKAGE_PREFIXES = [ + 'electron.vite.config.ts', + 'config/electron-builder', + 'config/packaged-runtime', + 'config/packaged-native-build-entries', + 'config/build-plugins/', + 'config/scripts/build-', + 'config/scripts/cli-build/build-', + 'config/scripts/native-build/macos/build-', + 'config/scripts/desktop-distribution/linux/build-', + 'config/scripts/desktop-distribution/macos/build-', + 'config/scripts/build/mobile-web-app/build-', + 'config/scripts/native-build/composition/build-', + 'config/scripts/orcad-distribution/prebuilds/build-', + 'config/scripts/orcad-distribution/template/build-', + 'config/scripts/orcad-distribution/server-bundle/build-', + 'config/scripts/plugin-build/declarative-runtime/build-', + 'config/scripts/terminal-dependencies/serialize-addon/build-', + 'config/scripts/build-identity/build-', + 'config/scripts/native-build/linux/build-', + 'config/scripts/native-build/windows/build-', + 'config/scripts/workspace-package-build/build-', + 'config/scripts/remote-host-build/wsl-guest/build-', + 'config/scripts/smoke-packaged', + 'config/scripts/install-electron-package-binary', + 'config/scripts/electron-installation/platform-layout/install-electron-package-binary', + 'config/scripts/verify-packaged', + 'config/scripts/desktop-distribution/runtime-verification/verify-packaged', + 'config/scripts/orcad-distribution/template/verify-packaged', + 'config/scripts/verify-skills-cli-runtime', + 'config/scripts/runtime-verification/skills-cli/verify-skills-cli-runtime', + 'config/scripts/verify-linux-glibc', + 'config/scripts/native-build/linux/verify-linux-glibc', + 'config/scripts/run-electron-vite', + 'config/scripts/desktop-build/execution/run-electron-vite', + 'skills/', + 'skill-guides/', + 'resources/build/', + 'resources/onboarding/', + 'resources/plugins/', + 'resources/skills/', + ...NATIVE_RUNTIME_PREFIXES +] + +export const LINUX_PACKAGE_PREFIXES = [ + ...SHARED_PACKAGE_PREFIXES, + 'config/scripts/package-linux-formats', + 'config/scripts/desktop-distribution/linux/package-linux-formats', + 'config/scripts/tool-invocation/process-failure-message.mjs', + 'config/scripts/artifact-storage/reflink-copy/space-sharing-copy.mjs', + '.github/actions/prepare-linux-package-fixture/', + '.github/actions/prepare-wayland-clipboard/', + 'config/docker/cli-launch-contract/', + 'config/docker/headless-pairing/', + 'config/docker/headless-serve-shutdown/', + 'config/docker/daemon-shutdown-descendants/', + 'config/scripts/run-linux-cli-launch-contract', + 'config/scripts/run-headless-linux-pairing-docker', + 'config/scripts/run-daemon-shutdown-descendants-docker', + 'config/scripts/static-appimage-package-contract', + 'native/computer-use-linux/', + 'native/wayland-clipboard/', + 'resources/linux/', + 'config/scripts/run-headless-serve' +] + +export const WINDOWS_PACKAGE_PREFIXES = [ + ...SHARED_PACKAGE_PREFIXES, + 'native/windows-cli-launcher/', + 'native/windows-agent-hook/', + 'native/computer-use-windows/', + 'resources/win32/', + 'config/scripts/build-windows-cli-launcher', + 'config/scripts/native-build/windows/build-windows-cli-launcher', + 'config/scripts/build-windows-agent-hook', + 'config/scripts/native-build/windows/build-windows-agent-hook', + 'config/scripts/windows-rust-executable-build', + 'config/scripts/native-build/windows/windows-rust-executable-build', + 'config/scripts/verify-packaged-windows-agent-hook', + 'config/scripts/desktop-distribution/runtime-verification/verify-packaged-windows-agent-hook', + 'config/scripts/windows-pty-native-capability', + 'tests/tools/windows-pty-native-capability-smoke/' +] + +export const LINUX_PACKAGE_TESTS = [ + 'src/main/browser/cookies/browser-google-cookie-clear.electron.test.ts', + 'config/scripts/desktop-distribution/runtime-verification/packaged-repository-input-exclusion.test.mjs', + 'src/main/browser/guest-lifecycle/popups/popup-origin-chrome.electron.test.ts', + 'src/main/browser/guest-lifecycle/navigation/browser-link-materialization.electron.test.ts', + 'src/main/browser/client-pages/renderer/browser-client-page-renderer-lifecycle.electron.test.ts', + 'src/main/persistence/profile-state/profile-state-writer-stall.electron.test.ts', + 'src/main/browser/guest-lifecycle/popups/browser-popup-compatibility.electron.test.ts', + 'src/main/browser/guest-lifecycle/popups/browser-popup-adapter-compatibility.electron.test.ts', + 'src/main/browser/guest-lifecycle/popups/browser-popup-native-compatibility.electron.test.ts', + 'src/main/browser/guest-lifecycle/popups/browser-popup-background-compatibility.electron.test.ts', + 'src/main/browser/extensions/api-runtime/browser-extension-api.electron.test.ts', + 'src/main/browser/extensions/profile-storage/browser-extension-persistence.electron.test.ts', + 'src/main/browser/extensions/profile-sessions/browser-extension-lifecycle.electron.test.ts', + 'src/main/browser/extensions/actions/browser-extension-toolbar.electron.test.ts', + 'src/main/browser/extensions/native-messaging/browser-extension-native-messaging.electron.test.ts' +] + +// Cloud-only code must run check-test-file-runners: cloud is neither linted nor format-checked, and any source can register tests. +const CLOUD_TEST_RUNNER_INPUT = /^cloud\/(?:.+\.[cm]?[jt]sx?|(?:.+\/)?package\.json)$/ + +export function isCloudTestRunnerInput(file) { + return CLOUD_TEST_RUNNER_INPUT.test(file) +} + +// The package (windows) job's "Test Windows-specific boundaries" step runs exactly these files. +export const WINDOWS_BOUNDARY_TESTS = [ + 'src/main/zcode/zcode-plan-api-key-store-native-windows.test.ts', + 'config/scripts/native-build/node-addons/rebuild-native-deps.test.mjs', + 'config/scripts/native-build/node-addons/rebuild-native-deps-windows-process-tree.test.mjs', + 'config/scripts/native-build/node-addons/rebuild-native-deps-node-pty.test.mjs', + 'config/scripts/native-build/node-addons/ensure-native-runtime-job-ownership.test.mjs', + 'config/scripts/desktop-distribution/runtime-verification/verify-packaged-node-pty-job-ownership.test.mjs', + 'config/scripts/native-build/windows/windows-pe-machine.test.mjs', + 'config/scripts/native-build/windows/build-windows-cli-launcher.test.mjs', + 'config/scripts/desktop-distribution/runtime-verification/verify-packaged-windows-agent-hook.test.mjs', + 'config/scripts/test-fixtures/script-copy-closure/script-module-dependencies.test.mjs', + 'src/main/windows/windows-registry-addon.test.ts', + 'src/main/daemon/daemon-host-process-package.test.ts', + 'src/shared/windows-security-addon.win32.test.ts', + 'src/shared/windows-private-credential-file.test.ts', + 'config/scripts/native-build/windows/windows-process-tree-gyp-path.test.mjs', + 'config/scripts/native-build/windows/windows-process-tree-gyp-rebuild.test.mjs', + 'config/scripts/package-electron-runtime-contract.test.mjs', + 'config/scripts/desktop-distribution/runtime-verification/electron-builder-runtime-resources.test.mjs', + 'src/main/browser/client-pages/renderer/browser-client-page-renderer-lifecycle.electron.test.ts', + 'src/main/persistence/profile-state/profile-state-writer-stall.electron.test.ts', + 'src/main/providers/windows-conpty-wide-char-duplication.node-pty.test.ts', + 'src/shared/__tests__/process-host/windows-command-line.win32.test.ts', + 'src/shared/__tests__/process-host/windows-cmd-shim-resolution.test.ts', + 'src/shared/__tests__/process-host/windows-cmd-shim-resolution.win32.test.ts', + 'src/shared/__tests__/process-host/windows-tree-kill-late-taskkill.win32.test.ts', + 'src/shared/agent-launch/startup/omp-fresh-launch-cmd.win32.test.ts', + 'src/shared/windows-batch-spawn.win32.test.ts', + 'src/main/agent-hooks/windows-hook-payload-delivery.test.ts', + 'src/main/agent-hooks/managed-hook-stdin-lifecycle.test.ts', + 'src/main/jcode/hook-gate-script.test.ts', + 'src/main/agent-hooks/windows-direct-cmd-hook-command.test.ts', + 'src/main/agent-hooks/windows-native-hook-exe-hosts.test.ts', + 'src/main/claude/windows-native-hook-registration.test.ts', + 'src/main/agent-hooks/windows-cmd-hook-command-unicode.test.ts', + 'src/main/agent-hooks/windows-batch-hook-launcher.test.ts', + 'src/main/agent-hooks/windows-powershell-hook-launcher.test.ts', + 'src/main/claude/claude-status-line-windows.test.ts', + 'src/main/codex/hooks/installation/windows-hook-command.test.ts', + 'src/main/codex/hooks/installation/windows-hook-upgrade.test.ts', + 'src/main/codex/hooks/installation/hook-service-managed-install.test.ts', + 'src/main/windows/windows-pty-job.win32.test.ts', + 'src/main/windows/windows-msys-job.win32.test.ts', + 'src/main/providers/agent-foreground-process-git-bash.win32.test.ts', + 'src/main/windows/windows-host-job.win32.test.ts', + 'src/main/windows/windows-process-tree-command-line-patch.test.ts', + 'src/main/windows/windows-process-table-native-addon.win32.test.ts', + 'src/main/windows/windows-administrator-status.win32.test.ts', + 'src/main/windows/windows-administrator-restart.win32.test.ts', + 'src/main/daemon/daemon-pid-identity-native.win32.test.ts', + 'src/main/daemon/node-pty-conout-worker-errors.test.ts', + 'src/main/daemon/node-pty-windows-output-error.win32.test.ts', + 'src/main/persistence/profile-state/profile-state-access-windows-native.win32.test.ts', + 'src/main/pty/process-retirement/windows-live-tree-kill.win32.test.ts', + 'src/main/wsl/execution/wsl-runner.test.ts', + 'src/main/wsl/execution/wsl-guest-environment.test.ts', + 'src/main/wsl/execution/wsl-executable-path.win32.test.ts', + 'src/main/claude-accounts/claude-profile-history-windows.test.ts', + 'src/shared/source-scan/source-tree-scan.test.ts', + 'src/main/cli/wsl-cli-powershell-boundary.test.ts', + 'src/main/computer/desktop-script-runtime-host.win32.test.ts', + 'src/main/cursor/hook-service.test.ts', + 'src/main/orca-profiles/profile-index-store.test.ts', + 'src/main/startup/windows-install-dir-acl-repair.win32.test.ts', + 'src/main/startup/windows-app-data-path.test.ts', + 'src/main/startup/windows-std-handle-inheritance.win32.test.ts', + 'src/main/startup/windows-isolated-spawner.win32.test.ts', + 'src/main/runtime/worktree-scan-admin-fingerprint-gate.test.ts', + 'src/shared/secure-file-fsync-flags.test.ts', + 'src/shared/secure-path-windows-acl.win32.test.ts', + 'src/main/runtime/unreadable-secret-store-preservation.win32.test.ts', + 'src/main/ipc/pty/pty-codex-account-attribution.test.ts', + 'src/main/ipc/pty/pty-spawn-env-codex-resume-provenance.test.ts', + 'src/main/ipc/preflight-provider-command-selection.test.ts', + 'src/main/ipc/preflight-runnable-local-cli.test.ts', + 'src/main/managed-server/install/remote-node-runtime-store-windows.test.ts', + 'src/main/skills/skill-windows-rename-contention.integration.test.ts', + 'src/main/skills/bundled-skill-install/local-host.test.ts', + 'src/main/skills/bundled-skill-install/plan-selection.test.ts', + 'src/main/ipc/filesystem/filesystem-read-dir-unc-drive.test.ts', + 'src/main/ipc/filesystem/filesystem-file-content-unc-drive.test.ts' +] + +const WINDOWS_PROCESS_PROBE_PREFIXES = [ + 'config/nsis/', + 'config/scripts/nsis-process-check', + 'config/scripts/idle-cpu-process-sampling', + 'config/scripts/performance/idle-cpu/idle-cpu-process-sampling', + 'config/vitest.config.', + 'config/scripts/vitest-', + 'config/scripts/test-runtime/environment/vitest-', + 'config/scripts/test-runtime/execution-policy/vitest-', + 'config/scripts/test-runtime/dom/vitest-', + 'config/scripts/test-runtime/module-cache/vitest-', + 'config/scripts/test-runtime/node-worker/vitest-', + 'config/scripts/test-runtime/sqlite-admission/vitest-', + 'config/scripts/ci-unit-', + 'config/scripts/ci/unit-selection/dependency-graph/ci-unit-', + 'config/scripts/ci/unit-selection/ci-unit-', + 'config/scripts/ci/unit-cache/ci-unit-', + 'config/scripts/ci/sharding/ci-unit-', + 'config/scripts/workspace-source-exports', + 'config/scripts/workspace/source-exports/workspace-source-exports', + 'config/dark-build-switches.', + 'src/packages/process-host/' +] + +export function isWindowsProcessProbePath(file) { + return WINDOWS_PROCESS_PROBE_PREFIXES.some((prefix) => file.startsWith(prefix)) +} + +export const WINDOWS_PACKAGE_TESTS = [ + ...WINDOWS_BOUNDARY_TESTS, + ...LINUX_PACKAGE_TESTS, + // The "Test Windows installer process probe" step runs these serially. + 'config/scripts/nsis-process-check.test.mjs', + 'config/scripts/performance/idle-cpu/idle-cpu-process-sampling.test.mjs' +] + +if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) { + console.log(WINDOWS_BOUNDARY_TESTS.join('\n')) +} diff --git a/config/scripts/pr-plugin-e2e-source-routes.mjs b/config/scripts/workflow/source-routing/pr-plugin-e2e-source-routes.mjs similarity index 100% rename from config/scripts/pr-plugin-e2e-source-routes.mjs rename to config/scripts/workflow/source-routing/pr-plugin-e2e-source-routes.mjs diff --git a/config/scripts/pr-shell-contract-prefixes.mjs b/config/scripts/workflow/source-routing/pr-shell-contract-prefixes.mjs similarity index 85% rename from config/scripts/pr-shell-contract-prefixes.mjs rename to config/scripts/workflow/source-routing/pr-shell-contract-prefixes.mjs index 76bb3cefed9..a6eb9e1464a 100644 --- a/config/scripts/pr-shell-contract-prefixes.mjs +++ b/config/scripts/workflow/source-routing/pr-shell-contract-prefixes.mjs @@ -20,5 +20,7 @@ export const SHELL_PREFIXES = [ 'src/shared/wsl-login-shell-command', 'config/patches/node-pty@', 'config/scripts/ensure-native-runtime', - 'config/scripts/node-pty-job-ownership' + 'config/scripts/native-build/node-addons/ensure-native-runtime', + 'config/scripts/node-pty-job-ownership', + 'config/scripts/native-build/node-addons/node-pty-job-ownership' ] diff --git a/config/scripts/pr-unit-support-routing.test.mjs b/config/scripts/workflow/source-routing/pr-unit-support-routing.test.mjs similarity index 96% rename from config/scripts/pr-unit-support-routing.test.mjs rename to config/scripts/workflow/source-routing/pr-unit-support-routing.test.mjs index b280c73a9fa..95630e12b3d 100644 --- a/config/scripts/pr-unit-support-routing.test.mjs +++ b/config/scripts/workflow/source-routing/pr-unit-support-routing.test.mjs @@ -5,8 +5,11 @@ import { buildUnitDependencyGraph, collectUnitDependencyGraph, unitConsumers -} from './ci-unit-dependency-graph.mjs' -import { CROSS_VERSION_WIRE_DIR, discoverUnitFiles } from './ci-unit-files.mjs' +} from '../../ci/unit-selection/dependency-graph/ci-unit-dependency-graph.mjs' +import { + CROSS_VERSION_WIRE_DIR, + discoverUnitFiles +} from '../../ci/unit-selection/dependency-graph/ci-unit-files.mjs' const harness = 'src/renderer/src/runtime/web-session-tabs-sync-test-harness.ts' const structuredSessionHarness = diff --git a/config/scripts/pr-wsl-e2e-source-routes.mjs b/config/scripts/workflow/source-routing/pr-wsl-e2e-source-routes.mjs similarity index 66% rename from config/scripts/pr-wsl-e2e-source-routes.mjs rename to config/scripts/workflow/source-routing/pr-wsl-e2e-source-routes.mjs index eeb466ab357..710723b804b 100644 --- a/config/scripts/pr-wsl-e2e-source-routes.mjs +++ b/config/scripts/workflow/source-routing/pr-wsl-e2e-source-routes.mjs @@ -25,7 +25,7 @@ export const PR_WSL_E2E_SOURCE_ROUTES = [ ], matches: (file) => isProductSource(file) && - /^(?:config\/scripts\/(?:verify-wsl-e2e-participation|verify-wsl-no-background-boot-participation|verify-playwright-participation)\.mjs$|src\/main\/(?:wsl[/-]|pty\/.*wsl|providers\/wsl)|src\/shared\/(?:wsl-|windows-terminal-shell|shell\/launch\/shell-argument-quoting)|src\/renderer\/src\/.*(?:terminal-paste|pty-paste)|tests\/e2e\/(?:golden-tab-bar-agent-launch\.spec|terminal-windows-shell-paste-ownership\.spec|terminal-inline-images-windows\.spec|wsl-bridge-no-background-boot\.spec|helpers\/(?:wsl-golden-stub-agent|golden-stub-agent))|\.github\/(?:actions\/setup-wsl-test-runtime\/|workflows\/windows-wsl-e2e\.yml))/.test( + /^(?:config\/scripts\/(?:verify-wsl-e2e-participation|verify-wsl-no-background-boot-participation|verify-playwright-participation)\.mjs$|config\/scripts\/runtime-verification\/participation\/verify-playwright-participation\.mjs$|src\/main\/(?:wsl[/-]|pty\/.*wsl|providers\/wsl)|src\/shared\/(?:wsl-|windows-terminal-shell|shell\/launch\/shell-argument-quoting)|src\/renderer\/src\/.*(?:terminal-paste|pty-paste)|tests\/e2e\/(?:golden-tab-bar-agent-launch\.spec|terminal-windows-shell-paste-ownership\.spec|terminal-inline-images-windows\.spec|wsl-bridge-no-background-boot\.spec|helpers\/(?:wsl-golden-stub-agent|golden-stub-agent))|\.github\/(?:actions\/setup-wsl-test-runtime\/|workflows\/windows-wsl-e2e\.yml))/.test( file ) } diff --git a/config/scripts/workflow/source-routing/pr-xterm-patch-prefixes.mjs b/config/scripts/workflow/source-routing/pr-xterm-patch-prefixes.mjs new file mode 100644 index 00000000000..cbcf84925cd --- /dev/null +++ b/config/scripts/workflow/source-routing/pr-xterm-patch-prefixes.mjs @@ -0,0 +1,7 @@ +export const XTERM_PREFIXES = [ + 'config/patches/xterm-upstream.json', + 'config/patches/@xterm', + 'config/patches/xterm-src/', + 'config/scripts/regenerate-xterm-patches', + 'config/scripts/terminal-dependencies/xterm-patches/regenerate-xterm-patches' +] diff --git a/config/scripts/windows-native-toolchain-routing.test.mjs b/config/scripts/workflow/source-routing/windows-native-toolchain-routing.test.mjs similarity index 81% rename from config/scripts/windows-native-toolchain-routing.test.mjs rename to config/scripts/workflow/source-routing/windows-native-toolchain-routing.test.mjs index a8e066b1610..44c7bba3f1d 100644 --- a/config/scripts/windows-native-toolchain-routing.test.mjs +++ b/config/scripts/workflow/source-routing/windows-native-toolchain-routing.test.mjs @@ -1,11 +1,11 @@ import { describe, expect, it, vi } from 'vitest' import { classifyPrJobs } from './pr-code-change-scope.mjs' -import { classifyNodeServerChanges } from './node-server-change-scope.mjs' -import { nodeServerQualification } from './node-server-qualification.mjs' +import { classifyNodeServerChanges } from '../../node-server/qualification/node-server-change-scope.mjs' +import { nodeServerQualification } from '../../node-server/qualification/node-server-qualification.mjs' const toolchainSources = [ - 'config/scripts/initialize-windows-native-toolchain.mjs', - 'config/scripts/capture-windows-native-environment.cmd' + 'config/scripts/native-build/windows/initialize-windows-native-toolchain.mjs', + 'config/scripts/native-build/windows/capture-windows-native-environment.cmd' ] describe('Windows native toolchain CI routing', () => { diff --git a/config/scripts/wsl-e2e-lane-contract.test.mjs b/config/scripts/workflow/source-routing/wsl-e2e-lane-contract.test.mjs similarity index 94% rename from config/scripts/wsl-e2e-lane-contract.test.mjs rename to config/scripts/workflow/source-routing/wsl-e2e-lane-contract.test.mjs index 42040c44fdb..3f8561f7fb6 100644 --- a/config/scripts/wsl-e2e-lane-contract.test.mjs +++ b/config/scripts/workflow/source-routing/wsl-e2e-lane-contract.test.mjs @@ -4,7 +4,7 @@ import { hasWslSourceChange, selectPrE2eSpecs } from './pr-e2e-source-routing.mj describe('real WSL terminal lane', () => { it.each([ 'config/scripts/verify-wsl-e2e-participation.mjs', - 'config/scripts/verify-playwright-participation.mjs', + 'config/scripts/runtime-verification/participation/verify-playwright-participation.mjs', 'src/main/wsl/discovery/wsl-availability.ts', 'src/main/wsl/execution/wsl-runner.ts', 'src/main/pty/shell-startup/wsl-orca-env.ts', diff --git a/config/scripts/build-workspace-packages.mjs b/config/scripts/workspace-package-build/build-workspace-packages.mjs similarity index 96% rename from config/scripts/build-workspace-packages.mjs rename to config/scripts/workspace-package-build/build-workspace-packages.mjs index ba32e2e4c1a..078f0f6932c 100644 --- a/config/scripts/build-workspace-packages.mjs +++ b/config/scripts/workspace-package-build/build-workspace-packages.mjs @@ -11,9 +11,9 @@ import { } from 'node:fs' import { createRequire } from 'node:module' import { dirname, join, relative, resolve } from 'node:path' -import { resolvePnpmCliInvocation } from './pnpm-cli-invocation.mjs' +import { resolvePnpmCliInvocation } from '../tool-invocation/pnpm-cli-invocation.mjs' -const root = resolve(import.meta.dirname, '../..') +const root = resolve(import.meta.dirname, '../../..') const PACKAGES = [{ name: '@orca/process-host', dir: 'src/packages/process-host' }] // Outputs and build scratch space, not inputs. const NON_INPUTS = new Set(['dist', 'node_modules', '.dist-build.lock']) diff --git a/config/scripts/workspace-source-exports.mjs b/config/scripts/workspace/source-exports/workspace-source-exports.mjs similarity index 100% rename from config/scripts/workspace-source-exports.mjs rename to config/scripts/workspace/source-exports/workspace-source-exports.mjs diff --git a/config/scripts/workspace-source-exports.test.mjs b/config/scripts/workspace/source-exports/workspace-source-exports.test.mjs similarity index 100% rename from config/scripts/workspace-source-exports.test.mjs rename to config/scripts/workspace/source-exports/workspace-source-exports.test.mjs diff --git a/config/scripts/dev-storage-reclaim.mjs b/config/scripts/worktree-storage/dev-storage-reclaim.mjs similarity index 100% rename from config/scripts/dev-storage-reclaim.mjs rename to config/scripts/worktree-storage/dev-storage-reclaim.mjs diff --git a/config/scripts/dev-storage-reclaim.test.mjs b/config/scripts/worktree-storage/dev-storage-reclaim.test.mjs similarity index 98% rename from config/scripts/dev-storage-reclaim.test.mjs rename to config/scripts/worktree-storage/dev-storage-reclaim.test.mjs index 390b686d7cf..f54f714f934 100644 --- a/config/scripts/dev-storage-reclaim.test.mjs +++ b/config/scripts/worktree-storage/dev-storage-reclaim.test.mjs @@ -74,7 +74,7 @@ it('closes captured dev output before the detached worker exits', async () => { }); process.exit(0);` ], - cwd: resolve(import.meta.dirname, '../..'), + cwd: resolve(import.meta.dirname, '../../..'), env: { ...process.env, ORCA_BACKGROUND_LAUNCH: '1' }, timeoutMs: 2_000, terminationBarrier: true diff --git a/config/scripts/local-repository-worktrees.mjs b/config/scripts/worktree-storage/local-repository-worktrees.mjs similarity index 94% rename from config/scripts/local-repository-worktrees.mjs rename to config/scripts/worktree-storage/local-repository-worktrees.mjs index cfdee29ce17..89820d2ef7a 100644 --- a/config/scripts/local-repository-worktrees.mjs +++ b/config/scripts/worktree-storage/local-repository-worktrees.mjs @@ -1,7 +1,7 @@ import { realpath } from 'node:fs/promises' import { resolve } from 'node:path' import { runProcess } from '@orca/process-host' -import { decodeGitCQuotedPath } from '../../src/shared/git/paths/git-cquoted-path.ts' +import { decodeGitCQuotedPath } from '../../../src/shared/git/paths/git-cquoted-path.ts' async function git(repoRoot, args) { const result = await runProcess({ diff --git a/config/scripts/reclaim-dev-electron-bundles.mjs b/config/scripts/worktree-storage/reclaim-dev-electron-bundles.mjs similarity index 98% rename from config/scripts/reclaim-dev-electron-bundles.mjs rename to config/scripts/worktree-storage/reclaim-dev-electron-bundles.mjs index 629ebfccabf..98d8cd8202a 100644 --- a/config/scripts/reclaim-dev-electron-bundles.mjs +++ b/config/scripts/worktree-storage/reclaim-dev-electron-bundles.mjs @@ -9,7 +9,7 @@ import { DEV_BUNDLE_MARKER_FILENAME, getDevBundleProcessTable, selectStaleDevBundleDirs -} from './dev-electron-bundle-cache.mjs' +} from '../development/electron-bundle-cache/dev-electron-bundle-cache.mjs' const apply = process.argv.includes('--apply') const minAgeIndex = process.argv.indexOf('--min-age-days') diff --git a/config/scripts/reclaim-dev-electron-bundles.test.ts b/config/scripts/worktree-storage/reclaim-dev-electron-bundles.test.ts similarity index 98% rename from config/scripts/reclaim-dev-electron-bundles.test.ts rename to config/scripts/worktree-storage/reclaim-dev-electron-bundles.test.ts index 8d481dcc4d1..16340f04383 100644 --- a/config/scripts/reclaim-dev-electron-bundles.test.ts +++ b/config/scripts/worktree-storage/reclaim-dev-electron-bundles.test.ts @@ -7,7 +7,7 @@ import { DEV_BUNDLE_MARKER_FILENAME, getDevBundleProcessTable, selectStaleDevBundleDirs -} from './dev-electron-bundle-cache.mjs' +} from '../development/electron-bundle-cache/dev-electron-bundle-cache.mjs' import { collectDevBundles } from './reclaim-dev-electron-bundles.mjs' const roots: string[] = [] diff --git a/config/scripts/reclaim-dev-worktree-profiles.mjs b/config/scripts/worktree-storage/reclaim-dev-worktree-profiles.mjs similarity index 92% rename from config/scripts/reclaim-dev-worktree-profiles.mjs rename to config/scripts/worktree-storage/reclaim-dev-worktree-profiles.mjs index 52192ea7d51..6523e56cf41 100644 --- a/config/scripts/reclaim-dev-worktree-profiles.mjs +++ b/config/scripts/worktree-storage/reclaim-dev-worktree-profiles.mjs @@ -7,10 +7,13 @@ import { readWorktreeProfileMarker, sameFilesystemPath, WORKTREE_PROFILE_NAME_PATTERN -} from './dev-instance-isolation.mjs' +} from '../development/instance-isolation/dev-instance-isolation.mjs' import { localRepositoryWorktrees } from './local-repository-worktrees.mjs' import { parseReclaimArguments } from './reclaim-worktree-command.mjs' -import { isProcessAlive, readDaemonPids } from './remote-agent-session-process-cleanup.mjs' +import { + isProcessAlive, + readDaemonPids +} from '../development/remote-session-cleanup/remote-agent-session-process-cleanup.mjs' async function exists(filePath) { try { @@ -122,7 +125,7 @@ if (process.argv[1] && path.resolve(process.argv[1]) === path.resolve(import.met const options = parseReclaimArguments(process.argv.slice(2)) if (options.help) { console.log( - 'Usage: node config/scripts/reclaim-dev-worktree-profiles.mjs [--apply] [--repo DIRECTORY]' + 'Usage: node config/scripts/worktree-storage/reclaim-dev-worktree-profiles.mjs [--apply] [--repo DIRECTORY]' ) } else { reclaimDevWorktreeProfiles(options).catch((error) => { diff --git a/config/scripts/reclaim-dev-worktree-profiles.test.mjs b/config/scripts/worktree-storage/reclaim-dev-worktree-profiles.test.mjs similarity index 95% rename from config/scripts/reclaim-dev-worktree-profiles.test.mjs rename to config/scripts/worktree-storage/reclaim-dev-worktree-profiles.test.mjs index 07e1f1d4f1f..73ac41a1a02 100644 --- a/config/scripts/reclaim-dev-worktree-profiles.test.mjs +++ b/config/scripts/worktree-storage/reclaim-dev-worktree-profiles.test.mjs @@ -2,7 +2,7 @@ import { existsSync, mkdirSync, mkdtempSync, realpathSync, rmSync, writeFileSync import { tmpdir } from 'node:os' import path from 'node:path' import { afterEach, expect, it } from 'vitest' -import { writeWorktreeProfileMarker } from './dev-instance-isolation.mjs' +import { writeWorktreeProfileMarker } from '../development/instance-isolation/dev-instance-isolation.mjs' import { reclaimDevWorktreeProfiles } from './reclaim-dev-worktree-profiles.mjs' const roots = [] diff --git a/config/scripts/reclaim-electron-dists.mjs b/config/scripts/worktree-storage/reclaim-electron-dists.mjs similarity index 97% rename from config/scripts/reclaim-electron-dists.mjs rename to config/scripts/worktree-storage/reclaim-electron-dists.mjs index c43f9850ad7..20dd958f8c2 100644 --- a/config/scripts/reclaim-electron-dists.mjs +++ b/config/scripts/worktree-storage/reclaim-electron-dists.mjs @@ -24,8 +24,8 @@ import { recordAdoptedSharedElectronDist, resolveSharedElectronDistEntry, shareElectronDistFromCache -} from './shared-electron-dist-cache.mjs' -import { getElectronPlatformPath } from './electron-platform-path.mjs' +} from '../electron-installation/shared-dist-cache/shared-electron-dist-cache.mjs' +import { getElectronPlatformPath } from '../electron-installation/platform-layout/electron-platform-path.mjs' const apply = process.argv.includes('--apply') const repoRoot = process.argv.includes('--repo') diff --git a/config/scripts/reclaim-electron-dists.test.ts b/config/scripts/worktree-storage/reclaim-electron-dists.test.ts similarity index 97% rename from config/scripts/reclaim-electron-dists.test.ts rename to config/scripts/worktree-storage/reclaim-electron-dists.test.ts index fbac962ca5e..266687802c2 100644 --- a/config/scripts/reclaim-electron-dists.test.ts +++ b/config/scripts/worktree-storage/reclaim-electron-dists.test.ts @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os' import { join, resolve } from 'node:path' import { afterEach, expect, it } from 'vitest' import { runProcess } from '@orca/process-host' -import { getElectronPlatformPath } from './electron-platform-path.mjs' +import { getElectronPlatformPath } from '../electron-installation/platform-layout/electron-platform-path.mjs' const roots: string[] = [] afterEach(async () => { diff --git a/config/scripts/reclaim-release-test-caches.mjs b/config/scripts/worktree-storage/reclaim-release-test-caches.mjs similarity index 94% rename from config/scripts/reclaim-release-test-caches.mjs rename to config/scripts/worktree-storage/reclaim-release-test-caches.mjs index f2524822fb5..457f435189e 100644 --- a/config/scripts/reclaim-release-test-caches.mjs +++ b/config/scripts/worktree-storage/reclaim-release-test-caches.mjs @@ -3,10 +3,10 @@ import { lstat, readFile, readdir, rm } from 'node:fs/promises' import { join, resolve } from 'node:path' import { lock } from 'proper-lockfile' import { localRepositoryWorktrees } from './local-repository-worktrees.mjs' -import { getDevBundleProcessTable } from './dev-electron-bundle-cache.mjs' +import { getDevBundleProcessTable } from '../development/electron-bundle-cache/dev-electron-bundle-cache.mjs' import { worktreeActiveSince } from './worktree-recent-activity.mjs' -import { CHECKOUT_FORMAT } from '../../tests/e2e/cross-version-wire/release-checkout-publication.ts' -import { withReleaseSourceFormatLease } from '../../tests/e2e/cross-version-wire/release-source-retention.ts' +import { CHECKOUT_FORMAT } from '../../../tests/e2e/cross-version-wire/release-checkout-publication.ts' +import { withReleaseSourceFormatLease } from '../../../tests/e2e/cross-version-wire/release-source-retention.ts' const COMMIT = '(?:[\\da-f]{40}|[\\da-f]{64})' const LOCAL_ENTRY = new RegExp(`^(${COMMIT})-format-([1-9]\\d*)$`) @@ -241,7 +241,7 @@ if (process.argv[1] && resolve(process.argv[1]) === resolve(import.meta.filename const argument = process.argv[index] if (argument === '--help') { console.log( - 'Usage: node config/scripts/reclaim-release-test-caches.mjs [--repo DIRECTORY] [--min-age-days 30] [--idle-days 7] [--tests-stopped] [--apply]' + 'Usage: node config/scripts/worktree-storage/reclaim-release-test-caches.mjs [--repo DIRECTORY] [--min-age-days 30] [--idle-days 7] [--tests-stopped] [--apply]' ) process.exit(0) } diff --git a/config/scripts/reclaim-release-test-caches.test.ts b/config/scripts/worktree-storage/reclaim-release-test-caches.test.ts similarity index 97% rename from config/scripts/reclaim-release-test-caches.test.ts rename to config/scripts/worktree-storage/reclaim-release-test-caches.test.ts index 15f1c2973d7..c1e255ce35c 100644 --- a/config/scripts/reclaim-release-test-caches.test.ts +++ b/config/scripts/worktree-storage/reclaim-release-test-caches.test.ts @@ -15,8 +15,8 @@ import { join } from 'node:path' import { afterEach, expect, it } from 'vitest' import { lock } from 'proper-lockfile' import { reclaimReleaseTestCaches } from './reclaim-release-test-caches.mjs' -import { withReleaseSourceLease } from '../../tests/e2e/cross-version-wire/release-source-retention' -import { CHECKOUT_FORMAT } from '../../tests/e2e/cross-version-wire/release-checkout-publication' +import { withReleaseSourceLease } from '../../../tests/e2e/cross-version-wire/release-source-retention' +import { CHECKOUT_FORMAT } from '../../../tests/e2e/cross-version-wire/release-checkout-publication' const roots: string[] = [] const commit = 'c'.repeat(40) diff --git a/config/scripts/reclaim-vite-caches.mjs b/config/scripts/worktree-storage/reclaim-vite-caches.mjs similarity index 97% rename from config/scripts/reclaim-vite-caches.mjs rename to config/scripts/worktree-storage/reclaim-vite-caches.mjs index eb625cad185..c6600370286 100644 --- a/config/scripts/reclaim-vite-caches.mjs +++ b/config/scripts/worktree-storage/reclaim-vite-caches.mjs @@ -1,7 +1,7 @@ import { lstat, readdir, realpath, rm } from 'node:fs/promises' import { join, resolve } from 'node:path' import { localRepositoryWorktrees } from './local-repository-worktrees.mjs' -import { isProcessAlive } from './remote-agent-session-process-cleanup.mjs' +import { isProcessAlive } from '../development/remote-session-cleanup/remote-agent-session-process-cleanup.mjs' import { parseReclaimArguments } from './reclaim-worktree-command.mjs' import { VITE_CACHE_HOST_ID, diff --git a/config/scripts/reclaim-vite-caches.test.mjs b/config/scripts/worktree-storage/reclaim-vite-caches.test.mjs similarity index 98% rename from config/scripts/reclaim-vite-caches.test.mjs rename to config/scripts/worktree-storage/reclaim-vite-caches.test.mjs index 583d09ff7e2..a845ac0b07f 100644 --- a/config/scripts/reclaim-vite-caches.test.mjs +++ b/config/scripts/worktree-storage/reclaim-vite-caches.test.mjs @@ -15,7 +15,7 @@ import { pathToFileURL } from 'node:url' import { runProcess } from '@orca/process-host' import { createServer } from 'vite' import { afterEach, expect, it, vi } from 'vitest' -import { createViteCacheRetentionPlugin } from '../build-plugins/vite-cache-retention' +import { createViteCacheRetentionPlugin } from '../../build-plugins/vite-cache-retention' import { reclaimViteCaches } from './reclaim-vite-caches.mjs' import { retainViteCache, diff --git a/config/scripts/reclaim-vitest-module-caches.mjs b/config/scripts/worktree-storage/reclaim-vitest-module-caches.mjs similarity index 95% rename from config/scripts/reclaim-vitest-module-caches.mjs rename to config/scripts/worktree-storage/reclaim-vitest-module-caches.mjs index 47446a9676f..d24b168c07c 100644 --- a/config/scripts/reclaim-vitest-module-caches.mjs +++ b/config/scripts/worktree-storage/reclaim-vitest-module-caches.mjs @@ -2,7 +2,7 @@ import { lstat, readdir, realpath, rm } from 'node:fs/promises' import { join, resolve } from 'node:path' import { localRepositoryWorktrees } from './local-repository-worktrees.mjs' import { parseReclaimArguments } from './reclaim-worktree-command.mjs' -import { localModuleCacheParent } from './vitest-local-module-cache.mjs' +import { localModuleCacheParent } from '../test-runtime/module-cache/vitest-local-module-cache.mjs' // Each run touches its directory, so an mtime this old means no recent test run used it. export const VITEST_MODULE_CACHE_MIN_AGE_DAYS = 7 diff --git a/config/scripts/reclaim-vitest-module-caches.test.mjs b/config/scripts/worktree-storage/reclaim-vitest-module-caches.test.mjs similarity index 94% rename from config/scripts/reclaim-vitest-module-caches.test.mjs rename to config/scripts/worktree-storage/reclaim-vitest-module-caches.test.mjs index 90027910b07..88b3fc0f9ed 100644 --- a/config/scripts/reclaim-vitest-module-caches.test.mjs +++ b/config/scripts/worktree-storage/reclaim-vitest-module-caches.test.mjs @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, expect, it } from 'vitest' import { reclaimVitestModuleCaches } from './reclaim-vitest-module-caches.mjs' -import { localModuleCacheParent } from './vitest-local-module-cache.mjs' +import { localModuleCacheParent } from '../test-runtime/module-cache/vitest-local-module-cache.mjs' const roots = [] const nowMs = Date.now() diff --git a/config/scripts/reclaim-worktree-command.mjs b/config/scripts/worktree-storage/reclaim-worktree-command.mjs similarity index 100% rename from config/scripts/reclaim-worktree-command.mjs rename to config/scripts/worktree-storage/reclaim-worktree-command.mjs diff --git a/config/scripts/reclaim-worktree-command.test.mjs b/config/scripts/worktree-storage/reclaim-worktree-command.test.mjs similarity index 100% rename from config/scripts/reclaim-worktree-command.test.mjs rename to config/scripts/worktree-storage/reclaim-worktree-command.test.mjs diff --git a/config/scripts/reclaim-worktree-generated-files.mjs b/config/scripts/worktree-storage/reclaim-worktree-generated-files.mjs similarity index 100% rename from config/scripts/reclaim-worktree-generated-files.mjs rename to config/scripts/worktree-storage/reclaim-worktree-generated-files.mjs diff --git a/config/scripts/reclaim-worktree-generated-files.test.mjs b/config/scripts/worktree-storage/reclaim-worktree-generated-files.test.mjs similarity index 100% rename from config/scripts/reclaim-worktree-generated-files.test.mjs rename to config/scripts/worktree-storage/reclaim-worktree-generated-files.test.mjs diff --git a/config/scripts/reclaim-worktree-space.mjs b/config/scripts/worktree-storage/reclaim-worktree-space.mjs similarity index 100% rename from config/scripts/reclaim-worktree-space.mjs rename to config/scripts/worktree-storage/reclaim-worktree-space.mjs diff --git a/config/scripts/reclaim-worktree-space.test.mjs b/config/scripts/worktree-storage/reclaim-worktree-space.test.mjs similarity index 100% rename from config/scripts/reclaim-worktree-space.test.mjs rename to config/scripts/worktree-storage/reclaim-worktree-space.test.mjs diff --git a/config/scripts/vite-cache-activity.mjs b/config/scripts/worktree-storage/vite-cache-activity.mjs similarity index 100% rename from config/scripts/vite-cache-activity.mjs rename to config/scripts/worktree-storage/vite-cache-activity.mjs diff --git a/config/scripts/worktree-recent-activity.mjs b/config/scripts/worktree-storage/worktree-recent-activity.mjs similarity index 93% rename from config/scripts/worktree-recent-activity.mjs rename to config/scripts/worktree-storage/worktree-recent-activity.mjs index b68706a10a6..a8077e6dfff 100644 --- a/config/scripts/worktree-recent-activity.mjs +++ b/config/scripts/worktree-storage/worktree-recent-activity.mjs @@ -1,7 +1,7 @@ import { lstat } from 'node:fs/promises' import { join } from 'node:path' import { runProcess } from '@orca/process-host' -import { isDevBundleInUse } from './dev-electron-bundle-cache.mjs' +import { isDevBundleInUse } from '../development/electron-bundle-cache/dev-electron-bundle-cache.mjs' async function git(worktree, args) { const result = await runProcess({ diff --git a/config/scripts/wsl-git-shell-benchmark.mjs b/config/scripts/wsl-git-shell-benchmark.mjs index 90c4de3f113..d4fa6087884 100644 --- a/config/scripts/wsl-git-shell-benchmark.mjs +++ b/config/scripts/wsl-git-shell-benchmark.mjs @@ -8,8 +8,8 @@ import { createJiti } from 'jiti' import { BENCHMARK_SAMPLE_AGGREGATION, summarizeBenchmarkSamples -} from './benchmark-sample-summary.mjs' -import { buildCounterbalancedSchedule } from './counterbalanced-benchmark-schedule.mjs' +} from './performance/measurement/benchmark-sample-summary.mjs' +import { buildCounterbalancedSchedule } from './performance/measurement/counterbalanced-benchmark-schedule.mjs' const DEFAULT_SAMPLES = 20 const DEFAULT_WARMUPS = 3 diff --git a/config/scripts/wsl-hook-relay-reattach-benchmark.mjs b/config/scripts/wsl-hook-relay-reattach-benchmark.mjs index 8f715467c9e..d92ba0e3535 100644 --- a/config/scripts/wsl-hook-relay-reattach-benchmark.mjs +++ b/config/scripts/wsl-hook-relay-reattach-benchmark.mjs @@ -278,9 +278,13 @@ async function main() { const bundlePath = join(bundleDir, 'wsl-agent-hook-relay.js') const versionPath = join(bundleDir, '.version') if (!existsSync(bundlePath) || !existsSync(versionPath)) { - await run(process.execPath, [join('config', 'scripts', 'build-wsl-guest.mjs')], { - cwd: process.cwd() - }) + await run( + process.execPath, + [join('config', 'scripts', 'remote-host-build', 'wsl-guest', 'build-wsl-guest.mjs')], + { + cwd: process.cwd() + } + ) } // Why: main's PTY graph reads app paths at import time; keep it inside a disposable directory. diff --git a/config/scripts/wsl-orcad-workflow-qualification.test.mjs b/config/scripts/wsl-orcad-workflow-qualification.test.mjs index 54d8ef16efa..2a521b7b77b 100644 --- a/config/scripts/wsl-orcad-workflow-qualification.test.mjs +++ b/config/scripts/wsl-orcad-workflow-qualification.test.mjs @@ -1,7 +1,7 @@ import { readFileSync } from 'node:fs' import { expect, it } from 'vitest' import { parse } from 'yaml' -import { compileAggregateExpression } from './pr-aggregate-gate-context.mjs' +import { compileAggregateExpression } from './workflow/pr-admission/pr-aggregate-gate-context.mjs' import { WSL_FAMILIES } from './wsl-orcad-qualification.mjs' const workflow = parse(readFileSync('.github/workflows/wsl-orcad-e2e.yml', 'utf8')) diff --git a/config/scripts/zip-extractor-command.mjs b/config/scripts/zip-extractor-command.mjs deleted file mode 100644 index 2bbe38a8cad..00000000000 --- a/config/scripts/zip-extractor-command.mjs +++ /dev/null @@ -1 +0,0 @@ -export { getTarProgram, getZipExtractorCommand } from '../../src/shared/zip-extractor-command.ts' diff --git a/config/tsconfig.node.json b/config/tsconfig.node.json index b7151109e37..93c52a161a2 100644 --- a/config/tsconfig.node.json +++ b/config/tsconfig.node.json @@ -4,17 +4,17 @@ "../electron.vite.config.*", "./vitest.config.ts", "./build-plugins/**/*", - "./scripts/vitest-host-ports-setup.ts", - "./scripts/vitest-caller-identity-env-setup.ts", - "./scripts/vitest-inherited-git-env-setup.ts", - "./scripts/vitest-real-agent-home-write-guard.ts", - "./scripts/vitest-bun-node-builtins.ts", - "./scripts/vitest-dom-setup.ts", - "./scripts/happy-dom-offscreen-canvas.ts", - "./scripts/happy-dom-mutation-observer-retention.ts", - "./scripts/happy-dom-animation-cancel.ts", - "./scripts/vitest-node-runtime-pool.ts", - "./scripts/vitest-module-cache-resolution-key.ts", + "./scripts/test-runtime/environment/vitest-host-ports-setup.ts", + "./scripts/test-runtime/environment/vitest-caller-identity-env-setup.ts", + "./scripts/test-runtime/environment/vitest-inherited-git-env-setup.ts", + "./scripts/test-runtime/environment/vitest-real-agent-home-write-guard.ts", + "./scripts/test-runtime/environment/vitest-bun-node-builtins.ts", + "./scripts/test-runtime/dom/vitest-dom-setup.ts", + "./scripts/test-runtime/dom/happy-dom-offscreen-canvas.ts", + "./scripts/test-runtime/dom/happy-dom-mutation-observer-retention.ts", + "./scripts/test-runtime/dom/happy-dom-animation-cancel.ts", + "./scripts/test-runtime/node-worker/vitest-node-runtime-pool.ts", + "./scripts/test-runtime/module-cache/vitest-module-cache-resolution-key.ts", "../src/main/**/*", "../src/cli/runtime/transport.ts", "../src/cli/runtime/envelope-schema.ts", diff --git a/config/vitest.config.ts b/config/vitest.config.ts index ab6e9482b23..97a35b6ae3a 100644 --- a/config/vitest.config.ts +++ b/config/vitest.config.ts @@ -3,14 +3,18 @@ import { createRequire } from 'node:module' import { resolve } from 'node:path' import { normalizePath, transformWithOxc, type Plugin } from 'vite' import { configDefaults, defaultExclude, defineConfig } from 'vitest/config' -import { UNIT_INCLUDE, UNIT_EXCLUDE, UNIT_SETUP_FILES } from './scripts/ci-unit-files.mjs' -import TimingSequencer from './scripts/ci-unit-sequencer.mjs' -import RuntimeSequencer from './scripts/vitest-runtime-sequencer.mjs' -import { getNodeRuntimeInclude } from './scripts/vitest-node-runtime-files.mjs' -import { nodeRuntimePool } from './scripts/vitest-node-runtime-pool' -import { readRunFilters } from './scripts/vitest-run-filters.mjs' -import { createWorkspaceSourceResolver } from './scripts/workspace-source-exports.mjs' -import { moduleCacheResolutionKey } from './scripts/vitest-module-cache-resolution-key' +import { + UNIT_INCLUDE, + UNIT_EXCLUDE, + UNIT_SETUP_FILES +} from './scripts/ci/unit-selection/dependency-graph/ci-unit-files.mjs' +import TimingSequencer from './scripts/ci/sharding/ci-unit-sequencer.mjs' +import RuntimeSequencer from './scripts/test-runtime/execution-policy/vitest-runtime-sequencer.mjs' +import { getNodeRuntimeInclude } from './scripts/test-runtime/sqlite-admission/vitest-node-runtime-files.mjs' +import { nodeRuntimePool } from './scripts/test-runtime/node-worker/vitest-node-runtime-pool' +import { readRunFilters } from './scripts/test-runtime/execution-policy/vitest-run-filters.mjs' +import { createWorkspaceSourceResolver } from './scripts/workspace/source-exports/workspace-source-exports.mjs' +import { moduleCacheResolutionKey } from './scripts/test-runtime/module-cache/vitest-module-cache-resolution-key' const nodeRuntimeInclude = process.versions.bun ? getNodeRuntimeInclude({ filters: readRunFilters() }) @@ -152,7 +156,7 @@ export default defineConfig({ sequence: { sequencer: balancedShards ? TimingSequencer : RuntimeSequencer }, ...(balancedShards ? { - reporters: ['default', resolve('config/scripts/ci-unit-timing-reporter.mjs')] + reporters: ['default', resolve('config/scripts/ci/sharding/ci-unit-timing-reporter.mjs')] } : {}), projects, diff --git a/config/vitest.performance.config.ts b/config/vitest.performance.config.ts index e2dc7961aee..8fbc8661922 100644 --- a/config/vitest.performance.config.ts +++ b/config/vitest.performance.config.ts @@ -2,7 +2,7 @@ import { existsSync } from 'node:fs' import { resolve } from 'node:path' import { defineConfig } from 'vitest/config' import baseConfig from './vitest.config' -import { nodeRuntimePool } from './scripts/vitest-node-runtime-pool' +import { nodeRuntimePool } from './scripts/test-runtime/node-worker/vitest-node-runtime-pool' const contracts = [ 'src/renderer/src/components/terminal-pane/pty-connection/saved-resume-cancellation.test.ts', diff --git a/config/wayland-clipboard-resources.cjs b/config/wayland-clipboard-resources.cjs index 1d491954071..1784dfc73a7 100644 --- a/config/wayland-clipboard-resources.cjs +++ b/config/wayland-clipboard-resources.cjs @@ -1,7 +1,9 @@ const { spawnSync } = require('node:child_process') const { chmodSync, existsSync } = require('node:fs') const { join } = require('node:path') -const { collectNativeBinaries } = require('./scripts/verify-linux-glibc-floor.cjs') +const { + collectNativeBinaries +} = require('./scripts/native-build/linux/verify-linux-glibc-floor.cjs') function ensureBundledWaylandClipboard(archEnum, root = join(__dirname, '..'), run = spawnSync) { const arch = { 1: 'x64', 3: 'arm64' }[archEnum] @@ -10,7 +12,11 @@ function ensureBundledWaylandClipboard(archEnum, root = join(__dirname, '..'), r } const result = run( process.execPath, - [join(root, 'config', 'scripts', 'build-wayland-clipboard.mjs'), '--arch', arch], + [ + join(root, 'config', 'scripts', 'native-build', 'linux', 'build-wayland-clipboard.mjs'), + '--arch', + arch + ], { cwd: root, stdio: 'inherit' } ) if ( diff --git a/docs/readme/release-source-sharing.md b/docs/readme/release-source-sharing.md index 6a3a0ce5f86..c9204c4beb5 100644 --- a/docs/readme/release-source-sharing.md +++ b/docs/readme/release-source-sharing.md @@ -99,7 +99,7 @@ Tests cover concurrent publication, lock heartbeats and eviction, independent br corrupt seeds, fallback, the opt-out, and preserved read-only files. Run them with: ```sh -ORCA_BACKGROUND_LAUNCH=1 pnpm test tests/e2e/cross-version-wire/release-source-cache.unit.test.ts tests/e2e/cross-version-wire/release-source-retention.unit.test.ts tests/e2e/cross-version-wire/release-checkout.unit.test.ts tests/e2e/cross-version-wire/release-checkout-tree.unit.test.ts tests/e2e/cross-version-wire/release-missing-packages.unit.test.ts config/scripts/space-sharing-copy.test.ts +ORCA_BACKGROUND_LAUNCH=1 pnpm test tests/e2e/cross-version-wire/release-source-cache.unit.test.ts tests/e2e/cross-version-wire/release-source-retention.unit.test.ts tests/e2e/cross-version-wire/release-checkout.unit.test.ts tests/e2e/cross-version-wire/release-checkout-tree.unit.test.ts tests/e2e/cross-version-wire/release-missing-packages.unit.test.ts config/scripts/artifact-storage/reflink-copy/space-sharing-copy.test.ts ``` ## P3 remains an experiment diff --git a/docs/readme/terminal-perf.md b/docs/readme/terminal-perf.md index a6f0ed53521..9a329c3d968 100644 --- a/docs/readme/terminal-perf.md +++ b/docs/readme/terminal-perf.md @@ -30,7 +30,7 @@ Pass Playwright arguments after `--`, for example (change with `--report <path>` or `ORCA_E2E_TERMINAL_PERF_REPORT_PATH`). - A summary table on stdout (`test:e2e:terminal-perf:summarize <report>`). - A budget check (`test:e2e:terminal-perf:check-report <report>`); budgets live - in `config/scripts/terminal-perf-report-budgets.mjs`. + in `config/scripts/performance/terminal-reporting/terminal-perf-report-budgets.mjs`. - `test-results/terminal-perf-impact-report.html` (`ORCA_E2E_TERMINAL_PERF_HTML_REPORT_PATH`). diff --git a/docs/readme/unit-test-input-ownership.md b/docs/readme/unit-test-input-ownership.md index 9cdd541dc82..1af14600277 100644 --- a/docs/readme/unit-test-input-ownership.md +++ b/docs/readme/unit-test-input-ownership.md @@ -2,7 +2,7 @@ Unit selection remains advisory. Every PR still executes the full unit inventory. -`config/scripts/ci-unit-input-ownership.json` records reviewed indirect repository inputs. A record covers the entire local source closure reachable from its `file`, including type imports. It does not remove ordinary import edges. Other callers of an indirect reader retain their own conservative fallback. +`config/scripts/ci/unit-selection/dependency-graph/ci-unit-input-ownership.json` records reviewed indirect repository inputs. A record covers the entire local source closure reachable from its `file`, including type imports. It does not remove ordinary import edges. Other callers of an indirect reader retain their own conservative fallback. - `inputs`: exact repository paths or directory prefixes ending in `/`. Directory ownership includes new files. Unknown, deleted, renamed and global inputs still select the full suite. - `emptyEnv`: optional external input overrides that must be absent or empty for the declaration to apply. diff --git a/docs/readme/worktree-storage-maintenance.md b/docs/readme/worktree-storage-maintenance.md index 54b57f67395..7abf832a439 100644 --- a/docs/readme/worktree-storage-maintenance.md +++ b/docs/readme/worktree-storage-maintenance.md @@ -108,7 +108,7 @@ An unreadable process table prevents removal. To retain older bundles during a manual sweep, run the underlying command with an age limit: ```sh -node config/scripts/reclaim-dev-electron-bundles.mjs --min-age-days 7 --apply +node config/scripts/worktree-storage/reclaim-dev-electron-bundles.mjs --min-age-days 7 --apply ``` That limit uses the bundle directory's modification time. The underlying command also accepts diff --git a/electron.vite.config.ts b/electron.vite.config.ts index 57e38ae78d0..785f2918f23 100644 --- a/electron.vite.config.ts +++ b/electron.vite.config.ts @@ -15,7 +15,7 @@ import { createViteCacheRetentionPlugin } from './config/build-plugins/vite-cach import { MAIN_BUILD_ENTRY_POINTS } from './config/build-plugins/main-build-entry-points' import { createPlainNodeEntryGuardPlugin } from './config/build-plugins/plain-node-entry-guard' import { createDevServeConfig } from './config/build-plugins/dev-serve-config' -import { resolveBuildSourceCommit } from './config/scripts/build-source-commit.mjs' +import { resolveBuildSourceCommit } from './config/scripts/build-identity/build-source-commit.mjs' const BUNDLED_MAIN_DEPENDENCIES = new Set([ 'stream-json', diff --git a/mobile/scripts/check-node-tests-typecheck.mjs b/mobile/scripts/check-node-tests-typecheck.mjs index c2f3ec25260..ab8803fd300 100644 --- a/mobile/scripts/check-node-tests-typecheck.mjs +++ b/mobile/scripts/check-node-tests-typecheck.mjs @@ -3,7 +3,7 @@ import fs from 'node:fs' import path from 'node:path' import process from 'node:process' import { fileURLToPath, pathToFileURL } from 'node:url' -import { resolveProjectCompilerInfo } from '../../config/scripts/run-typecheck-projects-in-parallel.mjs' +import { resolveProjectCompilerInfo } from '../../config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.mjs' // Phone tests that drive real desktop sources cannot join the RN test program: RN's global timers // and Expo's process.env augmentation break the desktop graph. Each source graph emits genuine diff --git a/mobile/scripts/check-tests-typecheck-incremental-cache.test.ts b/mobile/scripts/check-tests-typecheck-incremental-cache.test.ts index 8b801c0032e..7392dc4b8d2 100644 --- a/mobile/scripts/check-tests-typecheck-incremental-cache.test.ts +++ b/mobile/scripts/check-tests-typecheck-incremental-cache.test.ts @@ -8,7 +8,7 @@ import { } from 'node:fs' import { join } from 'node:path' import { expect, it, vi } from 'vitest' -import { supportsTsrs } from '../../config/scripts/tsrs-typecheck-compiler.mjs' +import { supportsTsrs } from '../../config/scripts/typecheck/project-execution/tsrs-typecheck-compiler.mjs' import { removeTreeSync } from '../../src/shared/windows-transient-lock-removal' import { collectTypecheckPass, findTsNocheckFiles } from './check-tests-typecheck-ratchet.mjs' import { resolveMobileTypecheckCommand } from './mobile-typecheck-compiler.mjs' diff --git a/mobile/scripts/mobile-typecheck-compiler.mjs b/mobile/scripts/mobile-typecheck-compiler.mjs index d4375593b47..c02942ea64e 100644 --- a/mobile/scripts/mobile-typecheck-compiler.mjs +++ b/mobile/scripts/mobile-typecheck-compiler.mjs @@ -4,7 +4,7 @@ import { resolveTypecheckBunExecutable, resolveTypecheckCommand, selectTypecheckCompiler -} from '../../config/scripts/run-typecheck-projects-in-parallel.mjs' +} from '../../config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.mjs' const root = fileURLToPath(new URL('../..', import.meta.url)) diff --git a/native/wayland-clipboard/README.md b/native/wayland-clipboard/README.md index 619cb4555b8..2fe29d19af6 100644 --- a/native/wayland-clipboard/README.md +++ b/native/wayland-clipboard/README.md @@ -58,8 +58,8 @@ running `pnpm dev` on native Wayland, build the helper with `pnpm run build:nati macOS and Windows builds do not invoke it. To select a slice directly: ```sh -node config/scripts/build-wayland-clipboard.mjs --arch x64 -node config/scripts/build-wayland-clipboard.mjs --arch arm64 +node config/scripts/native-build/linux/build-wayland-clipboard.mjs --arch x64 +node config/scripts/native-build/linux/build-wayland-clipboard.mjs --arch arm64 ``` Builds use Ubuntu 20.04, preserve the glibc 2.31 floor, validate ELF architecture diff --git a/package.json b/package.json index 4f0125ec0ad..5280c074947 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,8 @@ "audit:code-quality:type-aware": "oxlint --type-aware --config config/oxlint-code-quality-type-aware.json src config tests --deny-warnings", "audit:react-doctor": "node config/scripts/run-audit-tool.mjs react-doctor . --yes --no-supply-chain --no-telemetry --blocking none", "audit:dead-code": "node config/scripts/run-audit-tool.mjs knip --config config/knip.json", - "check:changed": "node config/scripts/check-changed.mjs", - "check:code-quality:changed": "node config/scripts/check-changed-code-quality.mjs", + "check:changed": "node config/scripts/preflight/changed-checks/check-changed.mjs", + "check:code-quality:changed": "node config/scripts/preflight/changed-checks/check-changed-code-quality.mjs", "lint:js-plugins": "oxlint --config config/oxlint-js-plugins.json src config tests mobile native .github", "lint:ast-grep": "ast-grep scan --config config/sgconfig.yml --min-severity warning src config tests mobile", "lint:ast-grep-gates": "node config/scripts/ast-grep-gates.mjs", @@ -37,15 +37,15 @@ "lint:react-doctor": "oxlint --config config/oxlint-react-doctor.json", "lint:react-doctor:changed": "node config/scripts/lint-react-doctor-changed.mjs", "prepare": "husky", - "test": "node config/scripts/build-workspace-packages.mjs && node config/scripts/ensure-native-runtime.mjs --runtime=node && node config/scripts/run-vitest.mjs run --config config/vitest.config.ts", - "test:changed": "node config/scripts/build-workspace-packages.mjs && node config/scripts/ensure-native-runtime.mjs --runtime=node && node config/scripts/run-vitest.mjs run --config config/vitest.config.ts --changed=HEAD", - "test:node": "pnpm run build:packages && node config/scripts/ensure-native-runtime.mjs --runtime=node && vitest run --config config/vitest.config.ts", + "test": "node config/scripts/workspace-package-build/build-workspace-packages.mjs && node config/scripts/native-build/node-addons/ensure-native-runtime.mjs --runtime=node && node config/scripts/test-runtime/execution-policy/run-vitest.mjs run --config config/vitest.config.ts", + "test:changed": "node config/scripts/workspace-package-build/build-workspace-packages.mjs && node config/scripts/native-build/node-addons/ensure-native-runtime.mjs --runtime=node && node config/scripts/test-runtime/execution-policy/run-vitest.mjs run --config config/vitest.config.ts --changed=HEAD", + "test:node": "pnpm run build:packages && node config/scripts/native-build/node-addons/ensure-native-runtime.mjs --runtime=node && vitest run --config config/vitest.config.ts", "test:node-server": "node config/scripts/run-node-server-tests.mjs", "test:skill-sharing:release": "vitest run --config config/vitest.config.ts src/main/skills src/main/runtime/rpc/methods/skills.test.ts src/shared/skill-bundle-install-contract.test.ts src/shared/skill-install-contract.test.ts src/shared/skill-install-failure.test.ts src/shared/skill-package-manifest.test.ts", "test:repro:remote-agent-session": "pnpm run build:cli && pnpm run build:electron-vite && node config/scripts/remote-agent-session-authority-repro.mjs", - "capture:agent-transcript": "node config/scripts/ensure-native-runtime.mjs --runtime=node && node config/scripts/capture-agent-pty-transcript.mjs", + "capture:agent-transcript": "node config/scripts/native-build/node-addons/ensure-native-runtime.mjs --runtime=node && node config/scripts/capture-agent-pty-transcript.mjs", "check:reliability-gates": "node config/scripts/check-reliability-gates.mjs", - "check:ratchets": "node config/scripts/run-ratchets.mjs", + "check:ratchets": "node config/scripts/static-analysis/ratchet-runner/run-ratchets.mjs", "check:max-lines-ratchet": "node config/scripts/check-max-lines-ratchet.mjs", "check:ts-nocheck-ratchet": "node config/scripts/check-ts-nocheck-ratchet.mjs", "check:host-list-render-ratchet": "node config/scripts/check-host-list-render-ratchet.mjs", @@ -71,13 +71,13 @@ "check:node-runtime-pin": "node config/scripts/check-node-runtime-pin.mjs", "check:test-file-runners": "node config/scripts/check-test-file-runners.mjs", "check:mobile-shared-dependency-versions": "node config/scripts/check-mobile-shared-dependency-versions.mjs", - "build:orcad": "pnpm run build:packages && node config/scripts/build-orcad-node.mjs", - "build:orcad-template": "pnpm run build:packages && node config/scripts/build-orcad-template.mjs", - "build:orcad-prebuilds": "pnpm run build:packages && node config/scripts/build-orcad-prebuilds.mjs", - "smoke:orcad-terminal": "node config/scripts/ensure-native-runtime.mjs --runtime=node && pnpm run build:orcad && node config/scripts/runtime-serve-terminal-smoke.mjs --target orcad", + "build:orcad": "pnpm run build:packages && node config/scripts/orcad-distribution/prebuilds/build-orcad-node.mjs", + "build:orcad-template": "pnpm run build:packages && node config/scripts/orcad-distribution/template/build-orcad-template.mjs", + "build:orcad-prebuilds": "pnpm run build:packages && node config/scripts/orcad-distribution/prebuilds/build-orcad-prebuilds.mjs", + "smoke:orcad-terminal": "node config/scripts/native-build/node-addons/ensure-native-runtime.mjs --runtime=node && pnpm run build:orcad && node config/scripts/runtime-serve-terminal-smoke.mjs --target orcad", "smoke:serve-terminal": "node config/scripts/runtime-serve-terminal-smoke.mjs", "check:feature-wall-assets": "node config/scripts/check-feature-wall-assets.mjs", - "generate:plugin-declarative-runtime": "node config/scripts/build-plugin-declarative-runtime.mjs", + "generate:plugin-declarative-runtime": "node config/scripts/plugin-build/declarative-runtime/build-plugin-declarative-runtime.mjs", "generate:plugin-declarative-typings": "node config/scripts/generate-plugin-declarative-typings.mjs", "generate:plugin-schemas": "node config/scripts/generate-plugin-schemas.mjs", "generate:plugin-author-typings": "node config/scripts/generate-plugin-author-typings.mjs", @@ -94,40 +94,40 @@ "verify:skill-bundle-manifest": "node config/scripts/generate-skill-bundle-manifest.mjs", "verify:macos-entitlements": "node config/scripts/verify-macos-entitlements.mjs", "vendor:feature-wall-assets": "node config/scripts/vendor-feature-wall-assets.mjs", - "tc:node": "node config/scripts/build-workspace-packages.mjs && node config/scripts/run-typecheck-projects-in-parallel.mjs --project=config/tsconfig.node.json", - "tc:cli": "node config/scripts/build-workspace-packages.mjs && node config/scripts/run-typecheck-projects-in-parallel.mjs --project=config/tsconfig.tc.cli.json", - "tc:web": "node config/scripts/build-workspace-packages.mjs && node config/scripts/run-typecheck-projects-in-parallel.mjs --project=config/tsconfig.tc.web.json", - "tc": "node config/scripts/build-workspace-packages.mjs && node config/scripts/run-typecheck-projects-in-parallel.mjs", - "typecheck:node": "node config/scripts/build-workspace-packages.mjs && node config/scripts/run-typecheck-projects-in-parallel.mjs --project=config/tsconfig.node.json", - "typecheck:cli": "node config/scripts/build-workspace-packages.mjs && node config/scripts/run-typecheck-projects-in-parallel.mjs --project=config/tsconfig.tc.cli.json", - "typecheck:web": "node config/scripts/build-workspace-packages.mjs && node config/scripts/run-typecheck-projects-in-parallel.mjs --project=config/tsconfig.tc.web.json", + "tc:node": "node config/scripts/workspace-package-build/build-workspace-packages.mjs && node config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.mjs --project=config/tsconfig.node.json", + "tc:cli": "node config/scripts/workspace-package-build/build-workspace-packages.mjs && node config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.mjs --project=config/tsconfig.tc.cli.json", + "tc:web": "node config/scripts/workspace-package-build/build-workspace-packages.mjs && node config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.mjs --project=config/tsconfig.tc.web.json", + "tc": "node config/scripts/workspace-package-build/build-workspace-packages.mjs && node config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.mjs", + "typecheck:node": "node config/scripts/workspace-package-build/build-workspace-packages.mjs && node config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.mjs --project=config/tsconfig.node.json", + "typecheck:cli": "node config/scripts/workspace-package-build/build-workspace-packages.mjs && node config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.mjs --project=config/tsconfig.tc.cli.json", + "typecheck:web": "node config/scripts/workspace-package-build/build-workspace-packages.mjs && node config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.mjs --project=config/tsconfig.tc.web.json", "typecheck:e2e": "pnpm run build:packages && node config/scripts/run-e2e-typecheck.mjs", "typecheck:tsc:e2e": "pnpm run build:packages && node config/scripts/run-e2e-typecheck.mjs --compiler=native", - "typecheck": "node config/scripts/build-workspace-packages.mjs && node config/scripts/run-typecheck-projects-in-parallel.mjs", - "typecheck:ci": "node config/scripts/build-workspace-packages.mjs && node config/scripts/run-typecheck-projects-in-parallel.mjs --compiler=bun", + "typecheck": "node config/scripts/workspace-package-build/build-workspace-packages.mjs && node config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.mjs", + "typecheck:ci": "node config/scripts/workspace-package-build/build-workspace-packages.mjs && node config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.mjs --compiler=bun", "typecheck:tsc:node": "pnpm run build:packages && node node_modules/typescript/bin/tsc --noEmit -p config/tsconfig.node.json --composite false", "typecheck:tsc:cli": "pnpm run build:packages && tsc --noEmit -p config/tsconfig.cli.json --composite false", "typecheck:tsc:web": "pnpm run build:packages && tsc --noEmit -p config/tsconfig.web.json --composite false", "typecheck:tsc": "pnpm run build:packages && tsc --noEmit -p config/tsconfig.node.json --composite false && tsc --noEmit -p config/tsconfig.cli.json --composite false && tsc --noEmit -p config/tsconfig.web.json --composite false", - "ensure:electron-runtime": "node config/scripts/ensure-native-runtime.mjs --runtime=electron", + "ensure:electron-runtime": "node config/scripts/native-build/node-addons/ensure-native-runtime.mjs --runtime=electron", "start": "pnpm run build:packages && pnpm run ensure:electron-runtime && electron-vite preview", - "dev": "node config/scripts/build-workspace-packages.mjs && node config/scripts/ensure-native-runtime.mjs --runtime=electron && node config/scripts/run-electron-vite-dev.mjs", + "dev": "node config/scripts/workspace-package-build/build-workspace-packages.mjs && node config/scripts/native-build/node-addons/ensure-native-runtime.mjs --runtime=electron && node config/scripts/run-electron-vite-dev.mjs", "dev-stable-name": "pnpm run build:packages && pnpm run ensure:electron-runtime && node config/scripts/run-electron-vite-dev.mjs --stable-name", "dev:fresh": "pnpm run build:packages && node config/scripts/dev-fresh-profile.mjs", "dev:seed-profile": "node config/scripts/dev-profile-seed.mjs", "dev:web": "vite --config vite.web.config.ts --host 127.0.0.1", "dev:fixtures": "vite --config config/vite.fixtures.config.ts", "fixtures:shot": "node config/scripts/component-fixtures/fixtures-shot.mjs", - "build:wsl-guest": "pnpm run build:packages && node --disable-warning=MODULE_TYPELESS_PACKAGE_JSON config/scripts/build-wsl-guest.mjs", - "build:computer-macos": "node config/scripts/build-computer-macos.mjs", - "build:keyboard-layout-macos": "node config/scripts/build-keyboard-layout-macos.mjs", - "build:process-footprint-macos": "node config/scripts/build-process-footprint-macos.mjs", - "build:notification-status-macos": "node config/scripts/build-notification-status-macos.mjs", - "build:native": "node config/scripts/build-native-for-platform.mjs", + "build:wsl-guest": "pnpm run build:packages && node --disable-warning=MODULE_TYPELESS_PACKAGE_JSON config/scripts/remote-host-build/wsl-guest/build-wsl-guest.mjs", + "build:computer-macos": "node config/scripts/native-build/macos/build-computer-macos.mjs", + "build:keyboard-layout-macos": "node config/scripts/native-build/macos/build-keyboard-layout-macos.mjs", + "build:process-footprint-macos": "node config/scripts/native-build/macos/build-process-footprint-macos.mjs", + "build:notification-status-macos": "node config/scripts/native-build/macos/build-notification-status-macos.mjs", + "build:native": "node config/scripts/native-build/composition/build-native-for-platform.mjs", "smoke:computer": "node config/scripts/computer-use-smoke.mjs", "verify:computer-native": "node config/scripts/verify-computer-native.mjs", "verify:cli-bin": "node config/scripts/verify-cli-bin.mjs", - "verify:built-skills-cli": "node config/scripts/verify-skills-cli-runtime.cjs out", + "verify:built-skills-cli": "node config/scripts/runtime-verification/skills-cli/verify-skills-cli-runtime.cjs out", "verify:renderer-boot-graph": "node config/scripts/verify-renderer-boot-graph.mjs", "verify:localization-catalogs": "bun config/scripts/verify-localization-catalogs.mjs", "verify:localization-catalog": "node config/scripts/verify-localization-catalog.mjs", @@ -142,15 +142,15 @@ "sync:mobile-localization": "node config/scripts/verify-mobile-localization.mjs --fix", "verify:mobile-localization-coverage": "node config/scripts/audit-localization-coverage.mjs --check --source-root mobile/app --source-root mobile/src --source-root mobile/web-entry --allowlist config/mobile-localization-coverage-allowlist.json", "audit:localization": "node config/scripts/audit-localization-coverage.mjs", - "build:cli": "pnpm run build:packages && node config/scripts/build-cli.mjs && pnpm run prepare:cli-output", + "build:cli": "pnpm run build:packages && node config/scripts/cli-build/build-cli.mjs && pnpm run prepare:cli-output", "prepare:cli-output": "node config/scripts/verify-cli-bin.mjs --fix-executable --fix-package-json && node config/scripts/install-dev-cli.mjs", "test:linux-cli-contract": "node config/scripts/run-linux-cli-launch-contract-docker.mjs --appimage dist/orca-linux.AppImage", "test:repro:skills-cli-runtime": "pnpm run build:cli && pnpm run build:electron-vite && pnpm run verify:built-skills-cli", - "build:electron-vite": "pnpm run build:packages && node config/scripts/run-electron-vite-build.mjs", + "build:electron-vite": "pnpm run build:packages && node config/scripts/desktop-build/execution/run-electron-vite-build.mjs", "build:electron-vite:parallel": "pnpm run build:packages && node config/scripts/run-electron-vite-targets-in-parallel.mjs", - "build:web": "pnpm run build:packages && node config/scripts/run-vite-web-build.mjs && node config/scripts/verify-web-build.mjs", + "build:web": "pnpm run build:packages && node config/scripts/web-build/execution/run-vite-web-build.mjs && node config/scripts/verify-web-build.mjs", "build:web-from-renderer": "node config/scripts/project-renderer-web-client.mjs && node config/scripts/verify-web-build.mjs", - "build:mobile-web": "node config/scripts/build-mobile-web-app-bundle.mjs && node config/scripts/verify-mobile-web-app-bundle.mjs", + "build:mobile-web": "node config/scripts/build/mobile-web-app/build-mobile-web-app-bundle.mjs && node config/scripts/build/mobile-web-app/verify-mobile-web-app-bundle.mjs", "build:desktop": "pnpm run typecheck && pnpm run build:desktop:assets", "build:desktop:ci": "pnpm run typecheck:ci --bun-concurrency=2 --bun-threads=2 && pnpm run build:desktop:assets", "build:desktop:assets": "pnpm run build:wsl-guest && pnpm run build:cli && pnpm run build:electron-vite && pnpm run verify:built-skills-cli && pnpm run build:web-from-renderer && pnpm run build:mobile-web", @@ -160,16 +160,16 @@ "build:release:javascript:parallel": "pnpm run build:cli && pnpm run build:electron-vite:parallel && pnpm run verify:built-skills-cli && pnpm run build:web-from-renderer && pnpm run build:mobile-web", "build:release:host": "pnpm run build:wsl-guest && pnpm run build:native && pnpm run verify:computer-native && pnpm run verify:built-skills-cli", "build:release:parallel": "pnpm run build:wsl-guest && pnpm run build:native && pnpm run verify:computer-native && pnpm run build:cli && pnpm run build:electron-vite:parallel && pnpm run verify:built-skills-cli && pnpm run build:web-from-renderer && pnpm run build:mobile-web", - "postinstall": "node config/scripts/build-workspace-packages.mjs && node config/scripts/rebuild-native-deps.mjs", - "rebuild:electron": "node config/scripts/rebuild-native-deps.mjs", - "reclaim-space": "node config/scripts/reclaim-worktree-space.mjs", - "rebuild:node": "node config/scripts/ensure-native-runtime.mjs --runtime=node --force", + "postinstall": "node config/scripts/workspace-package-build/build-workspace-packages.mjs && node config/scripts/native-build/node-addons/rebuild-native-deps.mjs", + "rebuild:electron": "node config/scripts/native-build/node-addons/rebuild-native-deps.mjs", + "reclaim-space": "node config/scripts/worktree-storage/reclaim-worktree-space.mjs", + "rebuild:node": "node config/scripts/native-build/node-addons/ensure-native-runtime.mjs --runtime=node --force", "build:unpack": "pnpm run build && pnpm run ensure:electron-runtime && electron-builder --config config/electron-builder.config.cjs --dir", "build:win": "pnpm run build:desktop && pnpm run ensure:electron-runtime && electron-builder --config config/electron-builder.config.cjs --win", "build:icons": "bash resources/icon-source/generate.sh", - "build:mac": "pnpm run build:desktop && pnpm run build:computer-macos && pnpm run build:keyboard-layout-macos && pnpm run build:process-footprint-macos && pnpm run build:notification-status-macos && pnpm run ensure:electron-runtime && node config/scripts/build-mac-local.mjs", + "build:mac": "pnpm run build:desktop && pnpm run build:computer-macos && pnpm run build:keyboard-layout-macos && pnpm run build:process-footprint-macos && pnpm run build:notification-status-macos && pnpm run ensure:electron-runtime && node config/scripts/desktop-distribution/macos/build-mac-local.mjs", "build:mac:release": "node config/scripts/verify-macos-release-env.mjs && ORCA_MAC_RELEASE=1 pnpm run build:desktop && ORCA_MAC_RELEASE=1 pnpm run build:computer-macos && ORCA_MAC_RELEASE=1 pnpm run build:keyboard-layout-macos && ORCA_MAC_RELEASE=1 pnpm run build:process-footprint-macos && ORCA_MAC_RELEASE=1 pnpm run build:notification-status-macos && pnpm run ensure:electron-runtime && ORCA_MAC_RELEASE=1 electron-builder --config config/electron-builder.config.cjs --mac", - "build:linux": "pnpm run build:desktop && pnpm run ensure:electron-runtime && node config/scripts/build-linux-local.mjs", + "build:linux": "pnpm run build:desktop && pnpm run ensure:electron-runtime && node config/scripts/desktop-distribution/linux/build-linux-local.mjs", "test:e2e": "pnpm run ensure:electron-runtime && npx playwright test --config tests/playwright.config.ts --project=electron-headless", "test:e2e:workspace-session-golden": "pnpm run ensure:electron-runtime && npx playwright test tests/e2e/golden-quit-relaunch-session.spec.ts tests/e2e/golden-terminal-file-link.spec.ts tests/e2e/golden-worktree-create-switch.spec.ts --config tests/playwright.config.ts --project electron-headless --workers=1", "test:e2e:multi-client-navigation": "node config/scripts/run-multi-client-navigation-e2e.mjs", @@ -184,9 +184,9 @@ "test:e2e:terminal-perf": "pnpm run ensure:electron-runtime && npx playwright test tests/e2e/terminal-typing-latency.spec.ts tests/e2e/terminal-foreground-redraw-freeze.spec.ts tests/e2e/terminal-output-scheduler.spec.ts tests/e2e/terminal-hidden-tui-visual-restore.spec.ts tests/e2e/artificial-opencode-terminal-load.spec.ts --config tests/playwright.config.ts --project electron-headless --workers=2", "test:e2e:terminal-perf:scale": "pnpm run ensure:electron-runtime && node config/scripts/run-terminal-scale-perf-e2e.mjs", "test:e2e:terminal-perf:scale:report": "pnpm run ensure:electron-runtime && node config/scripts/run-terminal-scale-perf-report-gate.mjs", - "test:e2e:terminal-perf:check-report": "node config/scripts/check-terminal-perf-report-budgets.mjs", - "test:e2e:terminal-perf:summarize": "node config/scripts/summarize-terminal-perf-report.mjs", - "test:e2e:terminal-perf:html-report": "node config/scripts/generate-terminal-perf-html-report.mjs", + "test:e2e:terminal-perf:check-report": "node config/scripts/performance/terminal-reporting/check-terminal-perf-report-budgets.mjs", + "test:e2e:terminal-perf:summarize": "node config/scripts/performance/terminal-reporting/summarize-terminal-perf-report.mjs", + "test:e2e:terminal-perf:html-report": "node config/scripts/performance/terminal-reporting/generate-terminal-perf-html-report.mjs", "test:e2e:source-control-scale": "pnpm run ensure:electron-runtime && npx playwright test tests/e2e/source-control-large-file-count.spec.ts --config tests/playwright.config.ts --project electron-headless --workers=1", "win-update-e2e": "node tests/tools/win-update-e2e/run.mjs", "win-crash-survival-e2e": "node tests/tools/win-crash-survival-e2e/run.mjs", @@ -194,7 +194,7 @@ "test:e2e:headful": "pnpm run ensure:electron-runtime && npx playwright test --config tests/playwright.config.ts --project electron-headful", "test:e2e:terminal-ime-native": "node config/scripts/run-terminal-ibus-hangul-e2e.mjs", "test:e2e:computer": "vitest run --config tests/e2e/vitest.config.ts", - "bench:idle-cpu": "pnpm run ensure:electron-runtime && node config/scripts/run-idle-cpu-benchmark.mjs", + "bench:idle-cpu": "pnpm run ensure:electron-runtime && node config/scripts/performance/idle-cpu/run-idle-cpu-benchmark.mjs", "bench:spinners": "pnpm run ensure:electron-runtime && node tests/tools/benchmarks/spinner-rendering/run.mjs", "bench:macos-computer-helper-owner-loss": "node config/scripts/macos-computer-helper-owner-loss-benchmark.mjs", "bench:startup": "pnpm run ensure:electron-runtime && node tests/tools/benchmarks/startup-time-bench.mjs", @@ -218,9 +218,9 @@ "repro:live-remote-realistic-freeze": "node config/scripts/live-remote-realistic-freeze-repro.mjs", "audit:anti-slop": "node config/scripts/sync-anti-slop-plugin.mjs && bun --smol node_modules/oxlint/bin/oxlint --config config/oxlint-anti-slop.json src config tests mobile --deny-warnings", "sync:anti-slop-plugin": "node config/scripts/sync-anti-slop-plugin.mjs", - "build:packages": "node config/scripts/build-workspace-packages.mjs", - "check:process-host-imports": "node config/scripts/check-process-host-imports.mjs", - "check:main-sync-spawn-ratchet": "node config/scripts/check-main-sync-spawn-ratchet.mjs", + "build:packages": "node config/scripts/workspace-package-build/build-workspace-packages.mjs", + "check:process-host-imports": "node config/scripts/static-analysis/process-boundaries/check-process-host-imports.mjs", + "check:main-sync-spawn-ratchet": "node config/scripts/static-analysis/process-boundaries/check-main-sync-spawn-ratchet.mjs", "check:compat-boundary-imports": "node config/scripts/check-compat-boundary-imports.mjs", "check:import-boundaries": "bun config/scripts/check-import-boundaries.mjs" }, diff --git a/resources/plugins/declarative/orca-runtime.mjs b/resources/plugins/declarative/orca-runtime.mjs index 6209e478cd4..4ed005b6d50 100644 --- a/resources/plugins/declarative/orca-runtime.mjs +++ b/resources/plugins/declarative/orca-runtime.mjs @@ -1,4 +1,4 @@ -// Generated by config/scripts/build-plugin-declarative-runtime.mjs from +// Generated by config/scripts/plugin-build/declarative-runtime/build-plugin-declarative-runtime.mjs from // src/shared/plugins/declarative/runtime/. Do not edit. // src/shared/plugins/frames/plugin-frame-source-map-prelude.ts diff --git a/resources/plugins/declarative/orca-test-hooks.mjs b/resources/plugins/declarative/orca-test-hooks.mjs index 2f6407033cf..39b6138711e 100644 --- a/resources/plugins/declarative/orca-test-hooks.mjs +++ b/resources/plugins/declarative/orca-test-hooks.mjs @@ -1,4 +1,4 @@ -// Generated by config/scripts/build-plugin-declarative-runtime.mjs from +// Generated by config/scripts/plugin-build/declarative-runtime/build-plugin-declarative-runtime.mjs from // src/main/plugins/testing/. Do not edit. var wp=Object.create;var Li=Object.defineProperty;var bp=Object.getOwnPropertyDescriptor;var Cp=Object.getOwnPropertyNames;var Ip=Object.getPrototypeOf,Sp=Object.prototype.hasOwnProperty;var se=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(n){throw t=0,n}};var Ep=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Cp(t))!Sp.call(e,r)&&r!==n&&Li(e,r,{get:()=>t[r],enumerable:!(o=bp(t,r))||o.enumerable});return e};var Ap=(e,t,n)=>(n=e!=null?wp(Ip(e)):{},Ep(t||!e||!e.__esModule?Li(n,"default",{value:e,enumerable:!0}):n,e));var wt=se(lr=>{"use strict";Object.defineProperty(lr,"__esModule",{value:!0});var $i;(function(e){e[e.NONE=0]="NONE";let n=1;e[e._abstract=n]="_abstract";let o=n+1;e[e._accessor=o]="_accessor";let r=o+1;e[e._as=r]="_as";let l=r+1;e[e._assert=l]="_assert";let u=l+1;e[e._asserts=u]="_asserts";let _=u+1;e[e._async=_]="_async";let O=_+1;e[e._await=O]="_await";let C=O+1;e[e._checks=C]="_checks";let k=C+1;e[e._constructor=k]="_constructor";let a=k+1;e[e._declare=a]="_declare";let U=a+1;e[e._enum=U]="_enum";let z=U+1;e[e._exports=z]="_exports";let G=z+1;e[e._from=G]="_from";let le=G+1;e[e._get=le]="_get";let E=le+1;e[e._global=E]="_global";let B=E+1;e[e._implements=B]="_implements";let V=B+1;e[e._infer=V]="_infer";let ne=V+1;e[e._interface=ne]="_interface";let ae=ne+1;e[e._is=ae]="_is";let $=ae+1;e[e._keyof=$]="_keyof";let de=$+1;e[e._mixins=de]="_mixins";let we=de+1;e[e._module=we]="_module";let Ae=we+1;e[e._namespace=Ae]="_namespace";let Ye=Ae+1;e[e._of=Ye]="_of";let ft=Ye+1;e[e._opaque=ft]="_opaque";let At=ft+1;e[e._out=At]="_out";let bt=At+1;e[e._override=bt]="_override";let qe=bt+1;e[e._private=qe]="_private";let xt=qe+1;e[e._protected=xt]="_protected";let Jt=xt+1;e[e._proto=Jt]="_proto";let Pt=Jt+1;e[e._public=Pt]="_public";let $t=Pt+1;e[e._readonly=$t]="_readonly";let at=$t+1;e[e._require=at]="_require";let Ue=at+1;e[e._satisfies=Ue]="_satisfies";let Mt=Ue+1;e[e._set=Mt]="_set";let K=Mt+1;e[e._static=K]="_static";let F=K+1;e[e._symbol=F]="_symbol";let I=F+1;e[e._type=I]="_type";let H=I+1;e[e._unique=H]="_unique";let ce=H+1;e[e._using=ce]="_using"})($i||(lr.ContextualKeyword=$i={}))});var Re=se(ns=>{"use strict";Object.defineProperty(ns,"__esModule",{value:!0});var L;(function(e){e[e.PRECEDENCE_MASK=15]="PRECEDENCE_MASK";let n=16;e[e.IS_KEYWORD=n]="IS_KEYWORD";let o=32;e[e.IS_ASSIGN=o]="IS_ASSIGN";let r=64;e[e.IS_RIGHT_ASSOCIATIVE=r]="IS_RIGHT_ASSOCIATIVE";let l=128;e[e.IS_PREFIX=l]="IS_PREFIX";let u=256;e[e.IS_POSTFIX=u]="IS_POSTFIX";let _=512;e[e.IS_EXPRESSION_START=_]="IS_EXPRESSION_START";let O=512;e[e.num=O]="num";let C=1536;e[e.bigint=C]="bigint";let k=2560;e[e.decimal=k]="decimal";let a=3584;e[e.regexp=a]="regexp";let U=4608;e[e.string=U]="string";let z=5632;e[e.name=z]="name";let G=6144;e[e.eof=G]="eof";let le=7680;e[e.bracketL=le]="bracketL";let E=8192;e[e.bracketR=E]="bracketR";let B=9728;e[e.braceL=B]="braceL";let V=10752;e[e.braceBarL=V]="braceBarL";let ne=11264;e[e.braceR=ne]="braceR";let ae=12288;e[e.braceBarR=ae]="braceBarR";let $=13824;e[e.parenL=$]="parenL";let de=14336;e[e.parenR=de]="parenR";let we=15360;e[e.comma=we]="comma";let Ae=16384;e[e.semi=Ae]="semi";let Ye=17408;e[e.colon=Ye]="colon";let ft=18432;e[e.doubleColon=ft]="doubleColon";let At=19456;e[e.dot=At]="dot";let bt=20480;e[e.question=bt]="question";let qe=21504;e[e.questionDot=qe]="questionDot";let xt=22528;e[e.arrow=xt]="arrow";let Jt=23552;e[e.template=Jt]="template";let Pt=24576;e[e.ellipsis=Pt]="ellipsis";let $t=25600;e[e.backQuote=$t]="backQuote";let at=27136;e[e.dollarBraceL=at]="dollarBraceL";let Ue=27648;e[e.at=Ue]="at";let Mt=29184;e[e.hash=Mt]="hash";let K=29728;e[e.eq=K]="eq";let F=30752;e[e.assign=F]="assign";let I=32640;e[e.preIncDec=I]="preIncDec";let H=33664;e[e.postIncDec=H]="postIncDec";let ce=34432;e[e.bang=ce]="bang";let me=35456;e[e.tilde=me]="tilde";let Pe=35841;e[e.pipeline=Pe]="pipeline";let Ce=36866;e[e.nullishCoalescing=Ce]="nullishCoalescing";let Ve=37890;e[e.logicalOR=Ve]="logicalOR";let Xe=38915;e[e.logicalAND=Xe]="logicalAND";let Ie=39940;e[e.bitwiseOR=Ie]="bitwiseOR";let We=40965;e[e.bitwiseXOR=We]="bitwiseXOR";let Je=41990;e[e.bitwiseAND=Je]="bitwiseAND";let be=43015;e[e.equality=be]="equality";let tt=44040;e[e.lessThan=tt]="lessThan";let j=45064;e[e.greaterThan=j]="greaterThan";let N=46088;e[e.relationalOrEqual=N]="relationalOrEqual";let X=47113;e[e.bitShiftL=X]="bitShiftL";let ee=48137;e[e.bitShiftR=ee]="bitShiftR";let _e=49802;e[e.plus=_e]="plus";let ye=50826;e[e.minus=ye]="minus";let ve=51723;e[e.modulo=ve]="modulo";let Fe=52235;e[e.star=Fe]="star";let it=53259;e[e.slash=it]="slash";let Ct=54348;e[e.exponent=Ct]="exponent";let qt=55296;e[e.jsxName=qt]="jsxName";let Ft=56320;e[e.jsxText=Ft]="jsxText";let nn=57344;e[e.jsxEmptyText=nn]="jsxEmptyText";let jt=58880;e[e.jsxTagStart=jt]="jsxTagStart";let Bt=59392;e[e.jsxTagEnd=Bt]="jsxTagEnd";let It=60928;e[e.typeParameterStart=It]="typeParameterStart";let s=61440;e[e.nonNullAssertion=s]="nonNullAssertion";let d=62480;e[e._break=d]="_break";let x=63504;e[e._case=x]="_case";let i=64528;e[e._catch=i]="_catch";let T=65552;e[e._continue=T]="_continue";let v=66576;e[e._debugger=v]="_debugger";let D=67600;e[e._default=D]="_default";let oe=68624;e[e._do=oe]="_do";let Q=69648;e[e._else=Q]="_else";let ge=70672;e[e._finally=ge]="_finally";let je=71696;e[e._for=je]="_for";let xe=73232;e[e._function=xe]="_function";let pe=73744;e[e._if=pe]="_if";let Te=74768;e[e._return=Te]="_return";let ut=75792;e[e._switch=ut]="_switch";let St=77456;e[e._throw=St]="_throw";let Rt=77840;e[e._try=Rt]="_try";let Ut=78864;e[e._var=Ut]="_var";let Wt=79888;e[e._let=Wt]="_let";let Gt=80912;e[e._const=Gt]="_const";let hn=81936;e[e._while=hn]="_while";let Un=82960;e[e._with=Un]="_with";let Nt=84496;e[e._new=Nt]="_new";let Wn=85520;e[e._this=Wn]="_this";let Yn=86544;e[e._super=Yn]="_super";let xo=87568;e[e._class=xo]="_class";let Qn=88080;e[e._extends=Qn]="_extends";let Hn=89104;e[e._export=Hn]="_export";let cn=90640;e[e._import=cn]="_import";let En=91664;e[e._yield=En]="_yield";let Zn=92688;e[e._null=Zn]="_null";let eo=93712;e[e._true=eo]="_true";let to=94736;e[e._false=to]="_false";let Zs=95256;e[e._in=Zs]="_in";let er=96280;e[e._instanceof=er]="_instanceof";let tr=97936;e[e._typeof=tr]="_typeof";let nr=98960;e[e._void=nr]="_void";let ip=99984;e[e._delete=ip]="_delete";let lp=100880;e[e._async=lp]="_async";let cp=101904;e[e._get=cp]="_get";let pp=102928;e[e._set=pp]="_set";let up=103952;e[e._declare=up]="_declare";let dp=104976;e[e._readonly=dp]="_readonly";let fp=106e3;e[e._abstract=fp]="_abstract";let hp=107024;e[e._static=hp]="_static";let Tp=107536;e[e._public=Tp]="_public";let mp=108560;e[e._private=mp]="_private";let kp=109584;e[e._protected=kp]="_protected";let yp=110608;e[e._override=yp]="_override";let vp=112144;e[e._as=vp]="_as";let xp=113168;e[e._enum=xp]="_enum";let _p=114192;e[e._type=_p]="_type";let gp=115216;e[e._implements=gp]="_implements"})(L||(ns.TokenType=L={}));function qp(e){switch(e){case L.num:return"num";case L.bigint:return"bigint";case L.decimal:return"decimal";case L.regexp:return"regexp";case L.string:return"string";case L.name:return"name";case L.eof:return"eof";case L.bracketL:return"[";case L.bracketR:return"]";case L.braceL:return"{";case L.braceBarL:return"{|";case L.braceR:return"}";case L.braceBarR:return"|}";case L.parenL:return"(";case L.parenR:return")";case L.comma:return",";case L.semi:return";";case L.colon:return":";case L.doubleColon:return"::";case L.dot:return".";case L.question:return"?";case L.questionDot:return"?.";case L.arrow:return"=>";case L.template:return"template";case L.ellipsis:return"...";case L.backQuote:return"`";case L.dollarBraceL:return"${";case L.at:return"@";case L.hash:return"#";case L.eq:return"=";case L.assign:return"_=";case L.preIncDec:return"++/--";case L.postIncDec:return"++/--";case L.bang:return"!";case L.tilde:return"~";case L.pipeline:return"|>";case L.nullishCoalescing:return"??";case L.logicalOR:return"||";case L.logicalAND:return"&&";case L.bitwiseOR:return"|";case L.bitwiseXOR:return"^";case L.bitwiseAND:return"&";case L.equality:return"==/!=";case L.lessThan:return"<";case L.greaterThan:return">";case L.relationalOrEqual:return"<=/>=";case L.bitShiftL:return"<<";case L.bitShiftR:return">>/>>>";case L.plus:return"+";case L.minus:return"-";case L.modulo:return"%";case L.star:return"*";case L.slash:return"/";case L.exponent:return"**";case L.jsxName:return"jsxName";case L.jsxText:return"jsxText";case L.jsxEmptyText:return"jsxEmptyText";case L.jsxTagStart:return"jsxTagStart";case L.jsxTagEnd:return"jsxTagEnd";case L.typeParameterStart:return"typeParameterStart";case L.nonNullAssertion:return"nonNullAssertion";case L._break:return"break";case L._case:return"case";case L._catch:return"catch";case L._continue:return"continue";case L._debugger:return"debugger";case L._default:return"default";case L._do:return"do";case L._else:return"else";case L._finally:return"finally";case L._for:return"for";case L._function:return"function";case L._if:return"if";case L._return:return"return";case L._switch:return"switch";case L._throw:return"throw";case L._try:return"try";case L._var:return"var";case L._let:return"let";case L._const:return"const";case L._while:return"while";case L._with:return"with";case L._new:return"new";case L._this:return"this";case L._super:return"super";case L._class:return"class";case L._extends:return"extends";case L._export:return"export";case L._import:return"import";case L._yield:return"yield";case L._null:return"null";case L._true:return"true";case L._false:return"false";case L._in:return"in";case L._instanceof:return"instanceof";case L._typeof:return"typeof";case L._void:return"void";case L._delete:return"delete";case L._async:return"async";case L._get:return"get";case L._set:return"set";case L._declare:return"declare";case L._readonly:return"readonly";case L._abstract:return"abstract";case L._static:return"static";case L._public:return"public";case L._private:return"private";case L._protected:return"protected";case L._override:return"override";case L._as:return"as";case L._enum:return"enum";case L._type:return"type";case L._implements:return"implements";default:return""}}ns.formatTokenType=qp});var ss=se(wo=>{"use strict";Object.defineProperty(wo,"__esModule",{value:!0});var Fp=wt(),jp=Re(),cr=class{constructor(t,n,o){this.startTokenIndex=t,this.endTokenIndex=n,this.isFunctionScope=o}};wo.Scope=cr;var os=class{constructor(t,n,o,r,l,u,_,O,C,k,a,U,z){this.potentialArrowAt=t,this.noAnonFunctionType=n,this.inDisallowConditionalTypesContext=o,this.tokensLength=r,this.scopesLength=l,this.pos=u,this.type=_,this.contextualKeyword=O,this.start=C,this.end=k,this.isType=a,this.scopeDepth=U,this.error=z}};wo.StateSnapshot=os;var pr=class e{constructor(){e.prototype.__init.call(this),e.prototype.__init2.call(this),e.prototype.__init3.call(this),e.prototype.__init4.call(this),e.prototype.__init5.call(this),e.prototype.__init6.call(this),e.prototype.__init7.call(this),e.prototype.__init8.call(this),e.prototype.__init9.call(this),e.prototype.__init10.call(this),e.prototype.__init11.call(this),e.prototype.__init12.call(this),e.prototype.__init13.call(this)}__init(){this.potentialArrowAt=-1}__init2(){this.noAnonFunctionType=!1}__init3(){this.inDisallowConditionalTypesContext=!1}__init4(){this.tokens=[]}__init5(){this.scopes=[]}__init6(){this.pos=0}__init7(){this.type=jp.TokenType.eof}__init8(){this.contextualKeyword=Fp.ContextualKeyword.NONE}__init9(){this.start=0}__init10(){this.end=0}__init11(){this.isType=!1}__init12(){this.scopeDepth=0}__init13(){this.error=null}snapshot(){return new os(this.potentialArrowAt,this.noAnonFunctionType,this.inDisallowConditionalTypesContext,this.tokens.length,this.scopes.length,this.pos,this.type,this.contextualKeyword,this.start,this.end,this.isType,this.scopeDepth,this.error)}restoreFromSnapshot(t){this.potentialArrowAt=t.potentialArrowAt,this.noAnonFunctionType=t.noAnonFunctionType,this.inDisallowConditionalTypesContext=t.inDisallowConditionalTypesContext,this.tokens.length=t.tokensLength,this.scopes.length=t.scopesLength,this.pos=t.pos,this.type=t.type,this.contextualKeyword=t.contextualKeyword,this.start=t.start,this.end=t.end,this.isType=t.isType,this.scopeDepth=t.scopeDepth,this.error=t.error}};wo.default=pr});var zt=se(rs=>{"use strict";Object.defineProperty(rs,"__esModule",{value:!0});var Pn;(function(e){e[e.backSpace=8]="backSpace";let n=10;e[e.lineFeed=n]="lineFeed";let o=9;e[e.tab=o]="tab";let r=13;e[e.carriageReturn=r]="carriageReturn";let l=14;e[e.shiftOut=l]="shiftOut";let u=32;e[e.space=u]="space";let _=33;e[e.exclamationMark=_]="exclamationMark";let O=34;e[e.quotationMark=O]="quotationMark";let C=35;e[e.numberSign=C]="numberSign";let k=36;e[e.dollarSign=k]="dollarSign";let a=37;e[e.percentSign=a]="percentSign";let U=38;e[e.ampersand=U]="ampersand";let z=39;e[e.apostrophe=z]="apostrophe";let G=40;e[e.leftParenthesis=G]="leftParenthesis";let le=41;e[e.rightParenthesis=le]="rightParenthesis";let E=42;e[e.asterisk=E]="asterisk";let B=43;e[e.plusSign=B]="plusSign";let V=44;e[e.comma=V]="comma";let ne=45;e[e.dash=ne]="dash";let ae=46;e[e.dot=ae]="dot";let $=47;e[e.slash=$]="slash";let de=48;e[e.digit0=de]="digit0";let we=49;e[e.digit1=we]="digit1";let Ae=50;e[e.digit2=Ae]="digit2";let Ye=51;e[e.digit3=Ye]="digit3";let ft=52;e[e.digit4=ft]="digit4";let At=53;e[e.digit5=At]="digit5";let bt=54;e[e.digit6=bt]="digit6";let qe=55;e[e.digit7=qe]="digit7";let xt=56;e[e.digit8=xt]="digit8";let Jt=57;e[e.digit9=Jt]="digit9";let Pt=58;e[e.colon=Pt]="colon";let $t=59;e[e.semicolon=$t]="semicolon";let at=60;e[e.lessThan=at]="lessThan";let Ue=61;e[e.equalsTo=Ue]="equalsTo";let Mt=62;e[e.greaterThan=Mt]="greaterThan";let K=63;e[e.questionMark=K]="questionMark";let F=64;e[e.atSign=F]="atSign";let I=65;e[e.uppercaseA=I]="uppercaseA";let H=66;e[e.uppercaseB=H]="uppercaseB";let ce=67;e[e.uppercaseC=ce]="uppercaseC";let me=68;e[e.uppercaseD=me]="uppercaseD";let Pe=69;e[e.uppercaseE=Pe]="uppercaseE";let Ce=70;e[e.uppercaseF=Ce]="uppercaseF";let Ve=71;e[e.uppercaseG=Ve]="uppercaseG";let Xe=72;e[e.uppercaseH=Xe]="uppercaseH";let Ie=73;e[e.uppercaseI=Ie]="uppercaseI";let We=74;e[e.uppercaseJ=We]="uppercaseJ";let Je=75;e[e.uppercaseK=Je]="uppercaseK";let be=76;e[e.uppercaseL=be]="uppercaseL";let tt=77;e[e.uppercaseM=tt]="uppercaseM";let j=78;e[e.uppercaseN=j]="uppercaseN";let N=79;e[e.uppercaseO=N]="uppercaseO";let X=80;e[e.uppercaseP=X]="uppercaseP";let ee=81;e[e.uppercaseQ=ee]="uppercaseQ";let _e=82;e[e.uppercaseR=_e]="uppercaseR";let ye=83;e[e.uppercaseS=ye]="uppercaseS";let ve=84;e[e.uppercaseT=ve]="uppercaseT";let Fe=85;e[e.uppercaseU=Fe]="uppercaseU";let it=86;e[e.uppercaseV=it]="uppercaseV";let Ct=87;e[e.uppercaseW=Ct]="uppercaseW";let qt=88;e[e.uppercaseX=qt]="uppercaseX";let Ft=89;e[e.uppercaseY=Ft]="uppercaseY";let nn=90;e[e.uppercaseZ=nn]="uppercaseZ";let jt=91;e[e.leftSquareBracket=jt]="leftSquareBracket";let Bt=92;e[e.backslash=Bt]="backslash";let It=93;e[e.rightSquareBracket=It]="rightSquareBracket";let s=94;e[e.caret=s]="caret";let d=95;e[e.underscore=d]="underscore";let x=96;e[e.graveAccent=x]="graveAccent";let i=97;e[e.lowercaseA=i]="lowercaseA";let T=98;e[e.lowercaseB=T]="lowercaseB";let v=99;e[e.lowercaseC=v]="lowercaseC";let D=100;e[e.lowercaseD=D]="lowercaseD";let oe=101;e[e.lowercaseE=oe]="lowercaseE";let Q=102;e[e.lowercaseF=Q]="lowercaseF";let ge=103;e[e.lowercaseG=ge]="lowercaseG";let je=104;e[e.lowercaseH=je]="lowercaseH";let xe=105;e[e.lowercaseI=xe]="lowercaseI";let pe=106;e[e.lowercaseJ=pe]="lowercaseJ";let Te=107;e[e.lowercaseK=Te]="lowercaseK";let ut=108;e[e.lowercaseL=ut]="lowercaseL";let St=109;e[e.lowercaseM=St]="lowercaseM";let Rt=110;e[e.lowercaseN=Rt]="lowercaseN";let Ut=111;e[e.lowercaseO=Ut]="lowercaseO";let Wt=112;e[e.lowercaseP=Wt]="lowercaseP";let Gt=113;e[e.lowercaseQ=Gt]="lowercaseQ";let hn=114;e[e.lowercaseR=hn]="lowercaseR";let Un=115;e[e.lowercaseS=Un]="lowercaseS";let Nt=116;e[e.lowercaseT=Nt]="lowercaseT";let Wn=117;e[e.lowercaseU=Wn]="lowercaseU";let Yn=118;e[e.lowercaseV=Yn]="lowercaseV";let xo=119;e[e.lowercaseW=xo]="lowercaseW";let Qn=120;e[e.lowercaseX=Qn]="lowercaseX";let Hn=121;e[e.lowercaseY=Hn]="lowercaseY";let cn=122;e[e.lowercaseZ=cn]="lowercaseZ";let En=123;e[e.leftCurlyBrace=En]="leftCurlyBrace";let Zn=124;e[e.verticalBar=Zn]="verticalBar";let eo=125;e[e.rightCurlyBrace=eo]="rightCurlyBrace";let to=126;e[e.tilde=to]="tilde";let Zs=160;e[e.nonBreakingSpace=Zs]="nonBreakingSpace";let er=5760;e[e.oghamSpaceMark=er]="oghamSpaceMark";let tr=8232;e[e.lineSeparator=tr]="lineSeparator";let nr=8233;e[e.paragraphSeparator=nr]="paragraphSeparator"})(Pn||(rs.charCodes=Pn={}));function Bp(e){return e>=Pn.digit0&&e<=Pn.digit9||e>=Pn.lowercaseA&&e<=Pn.lowercaseF||e>=Pn.uppercaseA&&e<=Pn.uppercaseF}rs.isDigit=Bp});var Yt=se(kt=>{"use strict";Object.defineProperty(kt,"__esModule",{value:!0});function Kp(e){return e&&e.__esModule?e:{default:e}}var $p=ss(),Up=Kp($p),Wp=zt();kt.isJSXEnabled;kt.isTypeScriptEnabled;kt.isFlowEnabled;kt.state;kt.input;kt.nextContextId;function Hp(){return kt.nextContextId++}kt.getNextContextId=Hp;function Vp(e){if("pos"in e){let t=Ui(e.pos);e.message+=` (${t.line}:${t.column})`,e.loc=t}return e}kt.augmentError=Vp;var as=class{constructor(t,n){this.line=t,this.column=n}};kt.Loc=as;function Ui(e){let t=1,n=1;for(let o=0;o<e;o++)kt.input.charCodeAt(o)===Wp.charCodes.lineFeed?(t++,n=1):n++;return new as(t,n)}kt.locationForIndex=Ui;function Xp(e,t,n,o){kt.input=e,kt.state=new Up.default,kt.nextContextId=1,kt.isJSXEnabled=t,kt.isTypeScriptEnabled=n,kt.isFlowEnabled=o}kt.initParser=Xp});var Nn=se(Zt=>{"use strict";Object.defineProperty(Zt,"__esModule",{value:!0});var Rn=_t(),Vn=Re(),is=zt(),Qt=Yt();function Jp(e){return Qt.state.contextualKeyword===e}Zt.isContextual=Jp;function Gp(e){let t=Rn.lookaheadTypeAndKeyword.call(void 0);return t.type===Vn.TokenType.name&&t.contextualKeyword===e}Zt.isLookaheadContextual=Gp;function Wi(e){return Qt.state.contextualKeyword===e&&Rn.eat.call(void 0,Vn.TokenType.name)}Zt.eatContextual=Wi;function zp(e){Wi(e)||ls()}Zt.expectContextual=zp;function Hi(){return Rn.match.call(void 0,Vn.TokenType.eof)||Rn.match.call(void 0,Vn.TokenType.braceR)||Vi()}Zt.canInsertSemicolon=Hi;function Vi(){let e=Qt.state.tokens[Qt.state.tokens.length-1],t=e?e.end:0;for(let n=t;n<Qt.state.start;n++){let o=Qt.input.charCodeAt(n);if(o===is.charCodes.lineFeed||o===is.charCodes.carriageReturn||o===8232||o===8233)return!0}return!1}Zt.hasPrecedingLineBreak=Vi;function Yp(){let e=Rn.nextTokenStart.call(void 0);for(let t=Qt.state.end;t<e;t++){let n=Qt.input.charCodeAt(t);if(n===is.charCodes.lineFeed||n===is.charCodes.carriageReturn||n===8232||n===8233)return!0}return!1}Zt.hasFollowingLineBreak=Yp;function Xi(){return Rn.eat.call(void 0,Vn.TokenType.semi)||Hi()}Zt.isLineTerminator=Xi;function Qp(){Xi()||ls('Unexpected token, expected ";"')}Zt.semicolon=Qp;function Zp(e){Rn.eat.call(void 0,e)||ls(`Unexpected token, expected "${Vn.formatTokenType.call(void 0,e)}"`)}Zt.expect=Zp;function ls(e="Unexpected token",t=Qt.state.start){if(Qt.state.error)return;let n=new SyntaxError(e);n.pos=t,Qt.state.error=n,Qt.state.pos=Qt.input.length,Rn.finishToken.call(void 0,Vn.TokenType.eof)}Zt.unexpected=ls});var dr=se(Xn=>{"use strict";Object.defineProperty(Xn,"__esModule",{value:!0});var ur=zt(),eu=[9,11,12,ur.charCodes.space,ur.charCodes.nonBreakingSpace,ur.charCodes.oghamSpaceMark,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279];Xn.WHITESPACE_CHARS=eu;var tu=/(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g;Xn.skipWhiteSpace=tu;var nu=new Uint8Array(65536);Xn.IS_WHITESPACE=nu;for(let e of Xn.WHITESPACE_CHARS)Xn.IS_WHITESPACE[e]=1});var no=se(pn=>{"use strict";Object.defineProperty(pn,"__esModule",{value:!0});var Ji=zt(),ou=dr();function su(e){if(e<48)return e===36;if(e<58)return!0;if(e<65)return!1;if(e<91)return!0;if(e<97)return e===95;if(e<123)return!0;if(e<128)return!1;throw new Error("Should not be called with non-ASCII char code.")}var ru=new Uint8Array(65536);pn.IS_IDENTIFIER_CHAR=ru;for(let e=0;e<128;e++)pn.IS_IDENTIFIER_CHAR[e]=su(e)?1:0;for(let e=128;e<65536;e++)pn.IS_IDENTIFIER_CHAR[e]=1;for(let e of ou.WHITESPACE_CHARS)pn.IS_IDENTIFIER_CHAR[e]=0;pn.IS_IDENTIFIER_CHAR[8232]=0;pn.IS_IDENTIFIER_CHAR[8233]=0;var au=pn.IS_IDENTIFIER_CHAR.slice();pn.IS_IDENTIFIER_START=au;for(let e=Ji.charCodes.digit0;e<=Ji.charCodes.digit9;e++)pn.IS_IDENTIFIER_START[e]=0});var Gi=se(fr=>{"use strict";Object.defineProperty(fr,"__esModule",{value:!0});var Se=wt(),Ne=Re(),iu=new Int32Array([-1,27,783,918,1755,2376,2862,3483,-1,3699,-1,4617,4752,4833,5130,5508,5940,-1,6480,6939,7749,8181,8451,8613,-1,8829,-1,-1,-1,54,243,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,432,-1,-1,-1,675,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,81,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,108,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,135,-1,-1,-1,-1,-1,-1,-1,-1,-1,162,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,189,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,216,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._abstract<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,270,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,297,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,324,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,351,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,378,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,405,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._accessor<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._as<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,459,-1,-1,-1,-1,-1,594,-1,-1,-1,-1,-1,-1,486,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,513,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,540,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._assert<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,567,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._asserts<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,621,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,648,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._async<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,702,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,729,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,756,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._await<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,810,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,837,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,864,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,891,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._break<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,945,-1,-1,-1,-1,-1,-1,1107,-1,-1,-1,1242,-1,-1,1350,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,972,1026,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,999,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._case<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1053,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1080,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._catch<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1134,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1161,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1188,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1215,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._checks<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1269,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1296,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1323,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._class<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1377,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1404,1620,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1431,-1,-1,-1,-1,-1,-1,(Ne.TokenType._const<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1458,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1485,-1,-1,-1,-1,-1,-1,-1,-1,1512,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1539,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1566,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1593,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._constructor<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1647,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1674,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1701,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1728,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._continue<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1782,-1,-1,-1,-1,-1,-1,-1,-1,-1,2349,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1809,1971,-1,-1,2106,-1,-1,-1,-1,-1,2241,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1836,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1863,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1890,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1917,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1944,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._debugger<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1998,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2025,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2052,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2079,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._declare<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2133,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2160,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2187,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2214,-1,-1,-1,-1,-1,-1,(Ne.TokenType._default<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2268,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2295,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2322,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._delete<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._do<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2403,-1,2484,-1,-1,-1,-1,-1,-1,-1,-1,-1,2565,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2430,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2457,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._else<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2511,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2538,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._enum<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2592,-1,-1,-1,2727,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2619,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2646,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2673,-1,-1,-1,-1,-1,-1,(Ne.TokenType._export<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2700,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._exports<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2754,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2781,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2808,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2835,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._extends<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2889,-1,-1,-1,-1,-1,-1,-1,2997,-1,-1,-1,-1,-1,3159,-1,-1,3213,-1,-1,3294,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2916,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2943,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2970,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._false<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3024,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3051,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3078,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3105,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3132,-1,(Ne.TokenType._finally<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3186,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._for<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3240,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3267,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._from<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3321,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3348,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3375,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3402,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3429,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3456,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._function<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3510,-1,-1,-1,-1,-1,-1,3564,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3537,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._get<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3591,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3618,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3645,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3672,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._global<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3726,-1,-1,-1,-1,-1,-1,3753,4077,-1,-1,-1,-1,4590,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._if<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3780,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3807,-1,-1,3996,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3834,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3861,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3888,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3915,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3942,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3969,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._implements<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4023,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4050,-1,-1,-1,-1,-1,-1,(Ne.TokenType._import<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._in<<1)+1,-1,-1,-1,-1,-1,4104,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4185,4401,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4131,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4158,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._infer<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4212,-1,-1,-1,-1,-1,-1,-1,4239,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4266,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4293,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4320,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4347,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4374,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._instanceof<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4428,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4455,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4482,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4509,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4536,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4563,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._interface<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._is<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4644,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4671,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4698,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4725,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._keyof<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4779,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4806,-1,-1,-1,-1,-1,-1,(Ne.TokenType._let<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4860,-1,-1,-1,-1,-1,4995,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4887,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4914,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4941,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4968,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._mixins<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5022,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5049,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5076,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5103,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._module<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5157,-1,-1,-1,5373,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5427,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5184,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5211,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5238,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5265,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5292,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5319,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5346,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._namespace<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5400,-1,-1,-1,(Ne.TokenType._new<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5454,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5481,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._null<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5535,-1,-1,-1,-1,-1,-1,-1,-1,-1,5562,-1,-1,-1,-1,5697,5751,-1,-1,-1,-1,Se.ContextualKeyword._of<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5589,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5616,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5643,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5670,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._opaque<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5724,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._out<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5778,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5805,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5832,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5859,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5886,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5913,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._override<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5967,-1,-1,6345,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5994,-1,-1,-1,-1,-1,6129,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6021,-1,-1,-1,-1,-1,6048,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6075,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6102,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._private<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6156,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6183,-1,-1,-1,-1,-1,-1,-1,-1,-1,6318,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6210,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6237,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6264,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6291,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._protected<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._proto<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6372,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6399,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6426,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6453,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._public<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6507,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6534,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6696,-1,-1,6831,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6561,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6588,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6615,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6642,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6669,-1,Se.ContextualKeyword._readonly<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6723,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6750,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6777,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6804,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._require<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6858,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6885,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6912,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._return<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6966,-1,-1,-1,7182,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7236,7371,-1,7479,-1,7614,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6993,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7020,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7047,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7074,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7101,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7128,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7155,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._satisfies<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7209,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._set<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7263,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7290,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7317,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7344,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._static<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7398,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7425,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7452,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._super<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7506,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7533,-1,-1,-1,-1,-1,-1,-1,-1,-1,7560,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7587,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._switch<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7641,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7668,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7695,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7722,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._symbol<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7776,-1,-1,-1,-1,-1,-1,-1,-1,-1,7938,-1,-1,-1,-1,-1,-1,8046,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7803,-1,-1,-1,-1,-1,-1,-1,-1,7857,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7830,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._this<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7884,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7911,-1,-1,-1,(Ne.TokenType._throw<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7965,-1,-1,-1,8019,-1,-1,-1,-1,-1,-1,7992,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._true<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._try<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8073,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8100,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._type<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8127,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8154,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._typeof<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8208,-1,-1,-1,-1,8343,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8235,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8262,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8289,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8316,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._unique<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8370,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8397,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8424,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,Se.ContextualKeyword._using<<1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8478,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8532,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8505,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._var<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8559,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8586,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._void<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8640,8748,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8667,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8694,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8721,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._while<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8775,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8802,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._with<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8856,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8883,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8910,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8937,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,(Ne.TokenType._yield<<1)+1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]);fr.READ_WORD_TREE=iu});var Zi=se(Tr=>{"use strict";Object.defineProperty(Tr,"__esModule",{value:!0});var un=Yt(),On=zt(),zi=no(),hr=_t(),Yi=Gi(),Qi=Re();function lu(){let e=0,t=0,n=un.state.pos;for(;n<un.input.length&&(t=un.input.charCodeAt(n),!(t<On.charCodes.lowercaseA||t>On.charCodes.lowercaseZ));){let r=Yi.READ_WORD_TREE[e+(t-On.charCodes.lowercaseA)+1];if(r===-1)break;e=r,n++}let o=Yi.READ_WORD_TREE[e];if(o>-1&&!zi.IS_IDENTIFIER_CHAR[t]){un.state.pos=n,o&1?hr.finishToken.call(void 0,o>>>1):hr.finishToken.call(void 0,Qi.TokenType.name,o>>>1);return}for(;n<un.input.length;){let r=un.input.charCodeAt(n);if(zi.IS_IDENTIFIER_CHAR[r])n++;else if(r===On.charCodes.backslash){if(n+=2,un.input.charCodeAt(n)===On.charCodes.leftCurlyBrace){for(;n<un.input.length&&un.input.charCodeAt(n)!==On.charCodes.rightCurlyBrace;)n++;n++}}else if(r===On.charCodes.atSign&&un.input.charCodeAt(n+1)===On.charCodes.atSign)n+=2;else break}un.state.pos=n,hr.finishToken.call(void 0,Qi.TokenType.name)}Tr.default=lu});var _t=se(ze=>{"use strict";Object.defineProperty(ze,"__esModule",{value:!0});function cu(e){return e&&e.__esModule?e:{default:e}}var h=Yt(),oo=Nn(),S=zt(),t1=no(),kr=dr(),pu=wt(),uu=Zi(),du=cu(uu),Y=Re(),ct;(function(e){e[e.Access=0]="Access";let n=1;e[e.ExportAccess=n]="ExportAccess";let o=n+1;e[e.TopLevelDeclaration=o]="TopLevelDeclaration";let r=o+1;e[e.FunctionScopedDeclaration=r]="FunctionScopedDeclaration";let l=r+1;e[e.BlockScopedDeclaration=l]="BlockScopedDeclaration";let u=l+1;e[e.ObjectShorthandTopLevelDeclaration=u]="ObjectShorthandTopLevelDeclaration";let _=u+1;e[e.ObjectShorthandFunctionScopedDeclaration=_]="ObjectShorthandFunctionScopedDeclaration";let O=_+1;e[e.ObjectShorthandBlockScopedDeclaration=O]="ObjectShorthandBlockScopedDeclaration";let C=O+1;e[e.ObjectShorthand=C]="ObjectShorthand";let k=C+1;e[e.ImportDeclaration=k]="ImportDeclaration";let a=k+1;e[e.ObjectKey=a]="ObjectKey";let U=a+1;e[e.ImportAccess=U]="ImportAccess"})(ct||(ze.IdentifierRole=ct={}));var e1;(function(e){e[e.NoChildren=0]="NoChildren";let n=1;e[e.OneChild=n]="OneChild";let o=n+1;e[e.StaticChildren=o]="StaticChildren";let r=o+1;e[e.KeyAfterPropSpread=r]="KeyAfterPropSpread"})(e1||(ze.JSXRole=e1={}));function fu(e){let t=e.identifierRole;return t===ct.TopLevelDeclaration||t===ct.FunctionScopedDeclaration||t===ct.BlockScopedDeclaration||t===ct.ObjectShorthandTopLevelDeclaration||t===ct.ObjectShorthandFunctionScopedDeclaration||t===ct.ObjectShorthandBlockScopedDeclaration}ze.isDeclaration=fu;function hu(e){let t=e.identifierRole;return t===ct.FunctionScopedDeclaration||t===ct.BlockScopedDeclaration||t===ct.ObjectShorthandFunctionScopedDeclaration||t===ct.ObjectShorthandBlockScopedDeclaration}ze.isNonTopLevelDeclaration=hu;function Tu(e){let t=e.identifierRole;return t===ct.TopLevelDeclaration||t===ct.ObjectShorthandTopLevelDeclaration||t===ct.ImportDeclaration}ze.isTopLevelDeclaration=Tu;function mu(e){let t=e.identifierRole;return t===ct.TopLevelDeclaration||t===ct.BlockScopedDeclaration||t===ct.ObjectShorthandTopLevelDeclaration||t===ct.ObjectShorthandBlockScopedDeclaration}ze.isBlockScopedDeclaration=mu;function ku(e){let t=e.identifierRole;return t===ct.FunctionScopedDeclaration||t===ct.ObjectShorthandFunctionScopedDeclaration}ze.isFunctionScopedDeclaration=ku;function yu(e){return e.identifierRole===ct.ObjectShorthandTopLevelDeclaration||e.identifierRole===ct.ObjectShorthandBlockScopedDeclaration||e.identifierRole===ct.ObjectShorthandFunctionScopedDeclaration}ze.isObjectShorthandDeclaration=yu;var bo=class{constructor(){this.type=h.state.type,this.contextualKeyword=h.state.contextualKeyword,this.start=h.state.start,this.end=h.state.end,this.scopeDepth=h.state.scopeDepth,this.isType=h.state.isType,this.identifierRole=null,this.jsxRole=null,this.shadowsGlobal=!1,this.isAsyncOperation=!1,this.contextId=null,this.rhsEndIndex=null,this.isExpression=!1,this.numNullishCoalesceStarts=0,this.numNullishCoalesceEnds=0,this.isOptionalChainStart=!1,this.isOptionalChainEnd=!1,this.subscriptStartIndex=null,this.nullishStartIndex=null}};ze.Token=bo;function ps(){h.state.tokens.push(new bo),r1()}ze.next=ps;function vu(){h.state.tokens.push(new bo),h.state.start=h.state.pos,$u()}ze.nextTemplateToken=vu;function xu(){h.state.type===Y.TokenType.assign&&--h.state.pos,ju()}ze.retokenizeSlashAsRegex=xu;function _u(e){for(let n=h.state.tokens.length-e;n<h.state.tokens.length;n++)h.state.tokens[n].isType=!0;let t=h.state.isType;return h.state.isType=!0,t}ze.pushTypeContext=_u;function gu(e){h.state.isType=e}ze.popTypeContext=gu;function n1(e){return yr(e)?(ps(),!0):!1}ze.eat=n1;function wu(e){let t=h.state.isType;h.state.isType=!0,n1(e),h.state.isType=t}ze.eatTypeToken=wu;function yr(e){return h.state.type===e}ze.match=yr;function bu(){let e=h.state.snapshot();ps();let t=h.state.type;return h.state.restoreFromSnapshot(e),t}ze.lookaheadType=bu;var cs=class{constructor(t,n){this.type=t,this.contextualKeyword=n}};ze.TypeAndKeyword=cs;function Cu(){let e=h.state.snapshot();ps();let t=h.state.type,n=h.state.contextualKeyword;return h.state.restoreFromSnapshot(e),new cs(t,n)}ze.lookaheadTypeAndKeyword=Cu;function o1(){return s1(h.state.pos)}ze.nextTokenStart=o1;function s1(e){kr.skipWhiteSpace.lastIndex=e;let t=kr.skipWhiteSpace.exec(h.input);return e+t[0].length}ze.nextTokenStartSince=s1;function Iu(){return h.input.charCodeAt(o1())}ze.lookaheadCharCode=Iu;function r1(){if(i1(),h.state.start=h.state.pos,h.state.pos>=h.input.length){let e=h.state.tokens;e.length>=2&&e[e.length-1].start>=h.input.length&&e[e.length-2].start>=h.input.length&&oo.unexpected.call(void 0,"Unexpectedly reached the end of input."),Qe(Y.TokenType.eof);return}Su(h.input.charCodeAt(h.state.pos))}ze.nextToken=r1;function Su(e){t1.IS_IDENTIFIER_START[e]||e===S.charCodes.backslash||e===S.charCodes.atSign&&h.input.charCodeAt(h.state.pos+1)===S.charCodes.atSign?du.default.call(void 0):c1(e)}function Eu(){for(;h.input.charCodeAt(h.state.pos)!==S.charCodes.asterisk||h.input.charCodeAt(h.state.pos+1)!==S.charCodes.slash;)if(h.state.pos++,h.state.pos>h.input.length){oo.unexpected.call(void 0,"Unterminated comment",h.state.pos-2);return}h.state.pos+=2}function a1(e){let t=h.input.charCodeAt(h.state.pos+=e);if(h.state.pos<h.input.length)for(;t!==S.charCodes.lineFeed&&t!==S.charCodes.carriageReturn&&t!==S.charCodes.lineSeparator&&t!==S.charCodes.paragraphSeparator&&++h.state.pos<h.input.length;)t=h.input.charCodeAt(h.state.pos)}ze.skipLineComment=a1;function i1(){for(;h.state.pos<h.input.length;){let e=h.input.charCodeAt(h.state.pos);switch(e){case S.charCodes.carriageReturn:h.input.charCodeAt(h.state.pos+1)===S.charCodes.lineFeed&&++h.state.pos;case S.charCodes.lineFeed:case S.charCodes.lineSeparator:case S.charCodes.paragraphSeparator:++h.state.pos;break;case S.charCodes.slash:switch(h.input.charCodeAt(h.state.pos+1)){case S.charCodes.asterisk:h.state.pos+=2,Eu();break;case S.charCodes.slash:a1(2);break;default:return}break;default:if(kr.IS_WHITESPACE[e])++h.state.pos;else return}}}ze.skipSpace=i1;function Qe(e,t=pu.ContextualKeyword.NONE){h.state.end=h.state.pos,h.state.type=e,h.state.contextualKeyword=t}ze.finishToken=Qe;function Au(){let e=h.input.charCodeAt(h.state.pos+1);if(e>=S.charCodes.digit0&&e<=S.charCodes.digit9){p1(!0);return}e===S.charCodes.dot&&h.input.charCodeAt(h.state.pos+2)===S.charCodes.dot?(h.state.pos+=3,Qe(Y.TokenType.ellipsis)):(++h.state.pos,Qe(Y.TokenType.dot))}function Pu(){h.input.charCodeAt(h.state.pos+1)===S.charCodes.equalsTo?Ge(Y.TokenType.assign,2):Ge(Y.TokenType.slash,1)}function Ru(e){let t=e===S.charCodes.asterisk?Y.TokenType.star:Y.TokenType.modulo,n=1,o=h.input.charCodeAt(h.state.pos+1);e===S.charCodes.asterisk&&o===S.charCodes.asterisk&&(n++,o=h.input.charCodeAt(h.state.pos+2),t=Y.TokenType.exponent),o===S.charCodes.equalsTo&&h.input.charCodeAt(h.state.pos+2)!==S.charCodes.greaterThan&&(n++,t=Y.TokenType.assign),Ge(t,n)}function Nu(e){let t=h.input.charCodeAt(h.state.pos+1);if(t===e){h.input.charCodeAt(h.state.pos+2)===S.charCodes.equalsTo?Ge(Y.TokenType.assign,3):Ge(e===S.charCodes.verticalBar?Y.TokenType.logicalOR:Y.TokenType.logicalAND,2);return}if(e===S.charCodes.verticalBar){if(t===S.charCodes.greaterThan){Ge(Y.TokenType.pipeline,2);return}else if(t===S.charCodes.rightCurlyBrace&&h.isFlowEnabled){Ge(Y.TokenType.braceBarR,2);return}}if(t===S.charCodes.equalsTo){Ge(Y.TokenType.assign,2);return}Ge(e===S.charCodes.verticalBar?Y.TokenType.bitwiseOR:Y.TokenType.bitwiseAND,1)}function Ou(){h.input.charCodeAt(h.state.pos+1)===S.charCodes.equalsTo?Ge(Y.TokenType.assign,2):Ge(Y.TokenType.bitwiseXOR,1)}function Lu(e){let t=h.input.charCodeAt(h.state.pos+1);if(t===e){Ge(Y.TokenType.preIncDec,2);return}t===S.charCodes.equalsTo?Ge(Y.TokenType.assign,2):e===S.charCodes.plusSign?Ge(Y.TokenType.plus,1):Ge(Y.TokenType.minus,1)}function Du(){let e=h.input.charCodeAt(h.state.pos+1);if(e===S.charCodes.lessThan){if(h.input.charCodeAt(h.state.pos+2)===S.charCodes.equalsTo){Ge(Y.TokenType.assign,3);return}h.state.isType?Ge(Y.TokenType.lessThan,1):Ge(Y.TokenType.bitShiftL,2);return}e===S.charCodes.equalsTo?Ge(Y.TokenType.relationalOrEqual,2):Ge(Y.TokenType.lessThan,1)}function l1(){if(h.state.isType){Ge(Y.TokenType.greaterThan,1);return}let e=h.input.charCodeAt(h.state.pos+1);if(e===S.charCodes.greaterThan){let t=h.input.charCodeAt(h.state.pos+2)===S.charCodes.greaterThan?3:2;if(h.input.charCodeAt(h.state.pos+t)===S.charCodes.equalsTo){Ge(Y.TokenType.assign,t+1);return}Ge(Y.TokenType.bitShiftR,t);return}e===S.charCodes.equalsTo?Ge(Y.TokenType.relationalOrEqual,2):Ge(Y.TokenType.greaterThan,1)}function Mu(){h.state.type===Y.TokenType.greaterThan&&(h.state.pos-=1,l1())}ze.rescan_gt=Mu;function qu(e){let t=h.input.charCodeAt(h.state.pos+1);if(t===S.charCodes.equalsTo){Ge(Y.TokenType.equality,h.input.charCodeAt(h.state.pos+2)===S.charCodes.equalsTo?3:2);return}if(e===S.charCodes.equalsTo&&t===S.charCodes.greaterThan){h.state.pos+=2,Qe(Y.TokenType.arrow);return}Ge(e===S.charCodes.equalsTo?Y.TokenType.eq:Y.TokenType.bang,1)}function Fu(){let e=h.input.charCodeAt(h.state.pos+1),t=h.input.charCodeAt(h.state.pos+2);e===S.charCodes.questionMark&&!(h.isFlowEnabled&&h.state.isType)?t===S.charCodes.equalsTo?Ge(Y.TokenType.assign,3):Ge(Y.TokenType.nullishCoalescing,2):e===S.charCodes.dot&&!(t>=S.charCodes.digit0&&t<=S.charCodes.digit9)?(h.state.pos+=2,Qe(Y.TokenType.questionDot)):(++h.state.pos,Qe(Y.TokenType.question))}function c1(e){switch(e){case S.charCodes.numberSign:++h.state.pos,Qe(Y.TokenType.hash);return;case S.charCodes.dot:Au();return;case S.charCodes.leftParenthesis:++h.state.pos,Qe(Y.TokenType.parenL);return;case S.charCodes.rightParenthesis:++h.state.pos,Qe(Y.TokenType.parenR);return;case S.charCodes.semicolon:++h.state.pos,Qe(Y.TokenType.semi);return;case S.charCodes.comma:++h.state.pos,Qe(Y.TokenType.comma);return;case S.charCodes.leftSquareBracket:++h.state.pos,Qe(Y.TokenType.bracketL);return;case S.charCodes.rightSquareBracket:++h.state.pos,Qe(Y.TokenType.bracketR);return;case S.charCodes.leftCurlyBrace:h.isFlowEnabled&&h.input.charCodeAt(h.state.pos+1)===S.charCodes.verticalBar?Ge(Y.TokenType.braceBarL,2):(++h.state.pos,Qe(Y.TokenType.braceL));return;case S.charCodes.rightCurlyBrace:++h.state.pos,Qe(Y.TokenType.braceR);return;case S.charCodes.colon:h.input.charCodeAt(h.state.pos+1)===S.charCodes.colon?Ge(Y.TokenType.doubleColon,2):(++h.state.pos,Qe(Y.TokenType.colon));return;case S.charCodes.questionMark:Fu();return;case S.charCodes.atSign:++h.state.pos,Qe(Y.TokenType.at);return;case S.charCodes.graveAccent:++h.state.pos,Qe(Y.TokenType.backQuote);return;case S.charCodes.digit0:{let t=h.input.charCodeAt(h.state.pos+1);if(t===S.charCodes.lowercaseX||t===S.charCodes.uppercaseX||t===S.charCodes.lowercaseO||t===S.charCodes.uppercaseO||t===S.charCodes.lowercaseB||t===S.charCodes.uppercaseB){Bu();return}}case S.charCodes.digit1:case S.charCodes.digit2:case S.charCodes.digit3:case S.charCodes.digit4:case S.charCodes.digit5:case S.charCodes.digit6:case S.charCodes.digit7:case S.charCodes.digit8:case S.charCodes.digit9:p1(!1);return;case S.charCodes.quotationMark:case S.charCodes.apostrophe:Ku(e);return;case S.charCodes.slash:Pu();return;case S.charCodes.percentSign:case S.charCodes.asterisk:Ru(e);return;case S.charCodes.verticalBar:case S.charCodes.ampersand:Nu(e);return;case S.charCodes.caret:Ou();return;case S.charCodes.plusSign:case S.charCodes.dash:Lu(e);return;case S.charCodes.lessThan:Du();return;case S.charCodes.greaterThan:l1();return;case S.charCodes.equalsTo:case S.charCodes.exclamationMark:qu(e);return;case S.charCodes.tilde:Ge(Y.TokenType.tilde,1);return;default:break}oo.unexpected.call(void 0,`Unexpected character '${String.fromCharCode(e)}'`,h.state.pos)}ze.getTokenFromCode=c1;function Ge(e,t){h.state.pos+=t,Qe(e)}function ju(){let e=h.state.pos,t=!1,n=!1;for(;;){if(h.state.pos>=h.input.length){oo.unexpected.call(void 0,"Unterminated regular expression",e);return}let o=h.input.charCodeAt(h.state.pos);if(t)t=!1;else{if(o===S.charCodes.leftSquareBracket)n=!0;else if(o===S.charCodes.rightSquareBracket&&n)n=!1;else if(o===S.charCodes.slash&&!n)break;t=o===S.charCodes.backslash}++h.state.pos}++h.state.pos,u1(),Qe(Y.TokenType.regexp)}function mr(){for(;;){let e=h.input.charCodeAt(h.state.pos);if(e>=S.charCodes.digit0&&e<=S.charCodes.digit9||e===S.charCodes.underscore)h.state.pos++;else break}}function Bu(){for(h.state.pos+=2;;){let t=h.input.charCodeAt(h.state.pos);if(t>=S.charCodes.digit0&&t<=S.charCodes.digit9||t>=S.charCodes.lowercaseA&&t<=S.charCodes.lowercaseF||t>=S.charCodes.uppercaseA&&t<=S.charCodes.uppercaseF||t===S.charCodes.underscore)h.state.pos++;else break}h.input.charCodeAt(h.state.pos)===S.charCodes.lowercaseN?(++h.state.pos,Qe(Y.TokenType.bigint)):Qe(Y.TokenType.num)}function p1(e){let t=!1,n=!1;e||mr();let o=h.input.charCodeAt(h.state.pos);if(o===S.charCodes.dot&&(++h.state.pos,mr(),o=h.input.charCodeAt(h.state.pos)),(o===S.charCodes.uppercaseE||o===S.charCodes.lowercaseE)&&(o=h.input.charCodeAt(++h.state.pos),(o===S.charCodes.plusSign||o===S.charCodes.dash)&&++h.state.pos,mr(),o=h.input.charCodeAt(h.state.pos)),o===S.charCodes.lowercaseN?(++h.state.pos,t=!0):o===S.charCodes.lowercaseM&&(++h.state.pos,n=!0),t){Qe(Y.TokenType.bigint);return}if(n){Qe(Y.TokenType.decimal);return}Qe(Y.TokenType.num)}function Ku(e){for(h.state.pos++;;){if(h.state.pos>=h.input.length){oo.unexpected.call(void 0,"Unterminated string constant");return}let t=h.input.charCodeAt(h.state.pos);if(t===S.charCodes.backslash)h.state.pos++;else if(t===e)break;h.state.pos++}h.state.pos++,Qe(Y.TokenType.string)}function $u(){for(;;){if(h.state.pos>=h.input.length){oo.unexpected.call(void 0,"Unterminated template");return}let e=h.input.charCodeAt(h.state.pos);if(e===S.charCodes.graveAccent||e===S.charCodes.dollarSign&&h.input.charCodeAt(h.state.pos+1)===S.charCodes.leftCurlyBrace){if(h.state.pos===h.state.start&&yr(Y.TokenType.template))if(e===S.charCodes.dollarSign){h.state.pos+=2,Qe(Y.TokenType.dollarBraceL);return}else{++h.state.pos,Qe(Y.TokenType.backQuote);return}Qe(Y.TokenType.template);return}e===S.charCodes.backslash&&h.state.pos++,h.state.pos++}}function u1(){for(;h.state.pos<h.input.length;){let e=h.input.charCodeAt(h.state.pos);if(t1.IS_IDENTIFIER_CHAR[e])h.state.pos++;else if(e===S.charCodes.backslash){if(h.state.pos+=2,h.input.charCodeAt(h.state.pos)===S.charCodes.leftCurlyBrace){for(;h.state.pos<h.input.length&&h.input.charCodeAt(h.state.pos)!==S.charCodes.rightCurlyBrace;)h.state.pos++;h.state.pos++}}else break}}ze.skipWord=u1});var Co=se(vr=>{"use strict";Object.defineProperty(vr,"__esModule",{value:!0});var d1=Re();function Uu(e,t=e.currentIndex()){let n=t+1;if(us(e,n)){let o=e.identifierNameAtIndex(t);return{isType:!1,leftName:o,rightName:o,endIndex:n}}if(n++,us(e,n))return{isType:!0,leftName:null,rightName:null,endIndex:n};if(n++,us(e,n))return{isType:!1,leftName:e.identifierNameAtIndex(t),rightName:e.identifierNameAtIndex(t+2),endIndex:n};if(n++,us(e,n))return{isType:!0,leftName:null,rightName:null,endIndex:n};throw new Error(`Unexpected import/export specifier at ${t}`)}vr.default=Uu;function us(e,t){let n=e.tokens[t];return n.type===d1.TokenType.braceR||n.type===d1.TokenType.comma}});var f1=se(xr=>{"use strict";Object.defineProperty(xr,"__esModule",{value:!0});xr.default=new Map([["quot",'"'],["amp","&"],["apos","'"],["lt","<"],["gt",">"],["nbsp"," "],["iexcl","¡"],["cent","¢"],["pound","£"],["curren","¤"],["yen","¥"],["brvbar","¦"],["sect","§"],["uml","¨"],["copy","©"],["ordf","ª"],["laquo","«"],["not","¬"],["shy","­"],["reg","®"],["macr","¯"],["deg","°"],["plusmn","±"],["sup2","²"],["sup3","³"],["acute","´"],["micro","µ"],["para","¶"],["middot","·"],["cedil","¸"],["sup1","¹"],["ordm","º"],["raquo","»"],["frac14","¼"],["frac12","½"],["frac34","¾"],["iquest","¿"],["Agrave","À"],["Aacute","Á"],["Acirc","Â"],["Atilde","Ã"],["Auml","Ä"],["Aring","Å"],["AElig","Æ"],["Ccedil","Ç"],["Egrave","È"],["Eacute","É"],["Ecirc","Ê"],["Euml","Ë"],["Igrave","Ì"],["Iacute","Í"],["Icirc","Î"],["Iuml","Ï"],["ETH","Ð"],["Ntilde","Ñ"],["Ograve","Ò"],["Oacute","Ó"],["Ocirc","Ô"],["Otilde","Õ"],["Ouml","Ö"],["times","×"],["Oslash","Ø"],["Ugrave","Ù"],["Uacute","Ú"],["Ucirc","Û"],["Uuml","Ü"],["Yacute","Ý"],["THORN","Þ"],["szlig","ß"],["agrave","à"],["aacute","á"],["acirc","â"],["atilde","ã"],["auml","ä"],["aring","å"],["aelig","æ"],["ccedil","ç"],["egrave","è"],["eacute","é"],["ecirc","ê"],["euml","ë"],["igrave","ì"],["iacute","í"],["icirc","î"],["iuml","ï"],["eth","ð"],["ntilde","ñ"],["ograve","ò"],["oacute","ó"],["ocirc","ô"],["otilde","õ"],["ouml","ö"],["divide","÷"],["oslash","ø"],["ugrave","ù"],["uacute","ú"],["ucirc","û"],["uuml","ü"],["yacute","ý"],["thorn","þ"],["yuml","ÿ"],["OElig","Œ"],["oelig","œ"],["Scaron","Š"],["scaron","š"],["Yuml","Ÿ"],["fnof","ƒ"],["circ","ˆ"],["tilde","˜"],["Alpha","Α"],["Beta","Β"],["Gamma","Γ"],["Delta","Δ"],["Epsilon","Ε"],["Zeta","Ζ"],["Eta","Η"],["Theta","Θ"],["Iota","Ι"],["Kappa","Κ"],["Lambda","Λ"],["Mu","Μ"],["Nu","Ν"],["Xi","Ξ"],["Omicron","Ο"],["Pi","Π"],["Rho","Ρ"],["Sigma","Σ"],["Tau","Τ"],["Upsilon","Υ"],["Phi","Φ"],["Chi","Χ"],["Psi","Ψ"],["Omega","Ω"],["alpha","α"],["beta","β"],["gamma","γ"],["delta","δ"],["epsilon","ε"],["zeta","ζ"],["eta","η"],["theta","θ"],["iota","ι"],["kappa","κ"],["lambda","λ"],["mu","μ"],["nu","ν"],["xi","ξ"],["omicron","ο"],["pi","π"],["rho","ρ"],["sigmaf","ς"],["sigma","σ"],["tau","τ"],["upsilon","υ"],["phi","φ"],["chi","χ"],["psi","ψ"],["omega","ω"],["thetasym","ϑ"],["upsih","ϒ"],["piv","ϖ"],["ensp"," "],["emsp"," "],["thinsp"," "],["zwnj","‌"],["zwj","‍"],["lrm","‎"],["rlm","‏"],["ndash","–"],["mdash","—"],["lsquo","‘"],["rsquo","’"],["sbquo","‚"],["ldquo","“"],["rdquo","”"],["bdquo","„"],["dagger","†"],["Dagger","‡"],["bull","•"],["hellip","…"],["permil","‰"],["prime","′"],["Prime","″"],["lsaquo","‹"],["rsaquo","›"],["oline","‾"],["frasl","⁄"],["euro","€"],["image","ℑ"],["weierp","℘"],["real","ℜ"],["trade","™"],["alefsym","ℵ"],["larr","←"],["uarr","↑"],["rarr","→"],["darr","↓"],["harr","↔"],["crarr","↵"],["lArr","⇐"],["uArr","⇑"],["rArr","⇒"],["dArr","⇓"],["hArr","⇔"],["forall","∀"],["part","∂"],["exist","∃"],["empty","∅"],["nabla","∇"],["isin","∈"],["notin","∉"],["ni","∋"],["prod","∏"],["sum","∑"],["minus","−"],["lowast","∗"],["radic","√"],["prop","∝"],["infin","∞"],["ang","∠"],["and","∧"],["or","∨"],["cap","∩"],["cup","∪"],["int","∫"],["there4","∴"],["sim","∼"],["cong","≅"],["asymp","≈"],["ne","≠"],["equiv","≡"],["le","≤"],["ge","≥"],["sub","⊂"],["sup","⊃"],["nsub","⊄"],["sube","⊆"],["supe","⊇"],["oplus","⊕"],["otimes","⊗"],["perp","⊥"],["sdot","⋅"],["lceil","⌈"],["rceil","⌉"],["lfloor","⌊"],["rfloor","⌋"],["lang","〈"],["rang","〉"],["loz","◊"],["spades","♠"],["clubs","♣"],["hearts","♥"],["diams","♦"]])});var gr=se(_r=>{"use strict";Object.defineProperty(_r,"__esModule",{value:!0});function Wu(e){let[t,n]=h1(e.jsxPragma||"React.createElement"),[o,r]=h1(e.jsxFragmentPragma||"React.Fragment");return{base:t,suffix:n,fragmentBase:o,fragmentSuffix:r}}_r.default=Wu;function h1(e){let t=e.indexOf(".");return t===-1&&(t=e.length),[e.slice(0,t),e.slice(t)]}});var on=se(br=>{"use strict";Object.defineProperty(br,"__esModule",{value:!0});var wr=class{getPrefixCode(){return""}getHoistedCode(){return""}getSuffixCode(){return""}};br.default=wr});var Sr=se(fs=>{"use strict";Object.defineProperty(fs,"__esModule",{value:!0});function Ir(e){return e&&e.__esModule?e:{default:e}}var Hu=f1(),Vu=Ir(Hu),ds=_t(),Be=Re(),Tn=zt(),Xu=gr(),Ju=Ir(Xu),Gu=on(),zu=Ir(Gu),Cr=class e extends zu.default{__init(){this.lastLineNumber=1}__init2(){this.lastIndex=0}__init3(){this.filenameVarName=null}__init4(){this.esmAutomaticImportNameResolutions={}}__init5(){this.cjsAutomaticModuleNameResolutions={}}constructor(t,n,o,r,l){super(),this.rootTransformer=t,this.tokens=n,this.importProcessor=o,this.nameManager=r,this.options=l,e.prototype.__init.call(this),e.prototype.__init2.call(this),e.prototype.__init3.call(this),e.prototype.__init4.call(this),e.prototype.__init5.call(this),this.jsxPragmaInfo=Ju.default.call(void 0,l),this.isAutomaticRuntime=l.jsxRuntime==="automatic",this.jsxImportSource=l.jsxImportSource||"react"}process(){return this.tokens.matches1(Be.TokenType.jsxTagStart)?(this.processJSXTag(),!0):!1}getPrefixCode(){let t="";if(this.filenameVarName&&(t+=`const ${this.filenameVarName} = ${JSON.stringify(this.options.filePath||"")};`),this.isAutomaticRuntime)if(this.importProcessor)for(let[n,o]of Object.entries(this.cjsAutomaticModuleNameResolutions))t+=`var ${o} = require("${n}");`;else{let{createElement:n,...o}=this.esmAutomaticImportNameResolutions;n&&(t+=`import {createElement as ${n}} from "${this.jsxImportSource}";`);let r=Object.entries(o).map(([l,u])=>`${l} as ${u}`).join(", ");if(r){let l=this.jsxImportSource+(this.options.production?"/jsx-runtime":"/jsx-dev-runtime");t+=`import {${r}} from "${l}";`}}return t}processJSXTag(){let{jsxRole:t,start:n}=this.tokens.currentToken(),o=this.options.production?null:this.getElementLocationCode(n);this.isAutomaticRuntime&&t!==ds.JSXRole.KeyAfterPropSpread?this.transformTagToJSXFunc(o,t):this.transformTagToCreateElement(o)}getElementLocationCode(t){return`lineNumber: ${this.getLineNumberForIndex(t)}`}getLineNumberForIndex(t){let n=this.tokens.code;for(;this.lastIndex<t&&this.lastIndex<n.length;)n[this.lastIndex]===` `&&this.lastLineNumber++,this.lastIndex++;return this.lastLineNumber}transformTagToJSXFunc(t,n){let o=n===ds.JSXRole.StaticChildren;this.tokens.replaceToken(this.getJSXFuncInvocationCode(o));let r=null;if(this.tokens.matches1(Be.TokenType.jsxTagEnd))this.tokens.replaceToken(`${this.getFragmentCode()}, {`),this.processAutomaticChildrenAndEndProps(n);else{if(this.processTagIntro(),this.tokens.appendCode(", {"),r=this.processProps(!0),this.tokens.matches2(Be.TokenType.slash,Be.TokenType.jsxTagEnd))this.tokens.appendCode("}");else if(this.tokens.matches1(Be.TokenType.jsxTagEnd))this.tokens.removeToken(),this.processAutomaticChildrenAndEndProps(n);else throw new Error("Expected either /> or > at the end of the tag.");r&&this.tokens.appendCode(`, ${r}`)}for(this.options.production||(r===null&&this.tokens.appendCode(", void 0"),this.tokens.appendCode(`, ${o}, ${this.getDevSource(t)}, this`)),this.tokens.removeInitialToken();!this.tokens.matches1(Be.TokenType.jsxTagEnd);)this.tokens.removeToken();this.tokens.replaceToken(")")}transformTagToCreateElement(t){if(this.tokens.replaceToken(this.getCreateElementInvocationCode()),this.tokens.matches1(Be.TokenType.jsxTagEnd))this.tokens.replaceToken(`${this.getFragmentCode()}, null`),this.processChildren(!0);else if(this.processTagIntro(),this.processPropsObjectWithDevInfo(t),!this.tokens.matches2(Be.TokenType.slash,Be.TokenType.jsxTagEnd))if(this.tokens.matches1(Be.TokenType.jsxTagEnd))this.tokens.removeToken(),this.processChildren(!0);else throw new Error("Expected either /> or > at the end of the tag.");for(this.tokens.removeInitialToken();!this.tokens.matches1(Be.TokenType.jsxTagEnd);)this.tokens.removeToken();this.tokens.replaceToken(")")}getJSXFuncInvocationCode(t){return this.options.production?t?this.claimAutoImportedFuncInvocation("jsxs","/jsx-runtime"):this.claimAutoImportedFuncInvocation("jsx","/jsx-runtime"):this.claimAutoImportedFuncInvocation("jsxDEV","/jsx-dev-runtime")}getCreateElementInvocationCode(){if(this.isAutomaticRuntime)return this.claimAutoImportedFuncInvocation("createElement","");{let{jsxPragmaInfo:t}=this;return`${this.importProcessor&&this.importProcessor.getIdentifierReplacement(t.base)||t.base}${t.suffix}(`}}getFragmentCode(){if(this.isAutomaticRuntime)return this.claimAutoImportedName("Fragment",this.options.production?"/jsx-runtime":"/jsx-dev-runtime");{let{jsxPragmaInfo:t}=this;return(this.importProcessor&&this.importProcessor.getIdentifierReplacement(t.fragmentBase)||t.fragmentBase)+t.fragmentSuffix}}claimAutoImportedFuncInvocation(t,n){let o=this.claimAutoImportedName(t,n);return this.importProcessor?`${o}.call(void 0, `:`${o}(`}claimAutoImportedName(t,n){if(this.importProcessor){let o=this.jsxImportSource+n;return this.cjsAutomaticModuleNameResolutions[o]||(this.cjsAutomaticModuleNameResolutions[o]=this.importProcessor.getFreeIdentifierForPath(o)),`${this.cjsAutomaticModuleNameResolutions[o]}.${t}`}else return this.esmAutomaticImportNameResolutions[t]||(this.esmAutomaticImportNameResolutions[t]=this.nameManager.claimFreeName(`_${t}`)),this.esmAutomaticImportNameResolutions[t]}processTagIntro(){let t=this.tokens.currentIndex()+1;for(;this.tokens.tokens[t].isType||!this.tokens.matches2AtIndex(t-1,Be.TokenType.jsxName,Be.TokenType.jsxName)&&!this.tokens.matches2AtIndex(t-1,Be.TokenType.greaterThan,Be.TokenType.jsxName)&&!this.tokens.matches1AtIndex(t,Be.TokenType.braceL)&&!this.tokens.matches1AtIndex(t,Be.TokenType.jsxTagEnd)&&!this.tokens.matches2AtIndex(t,Be.TokenType.slash,Be.TokenType.jsxTagEnd);)t++;if(t===this.tokens.currentIndex()+1){let n=this.tokens.identifierName();m1(n)&&this.tokens.replaceToken(`'${n}'`)}for(;this.tokens.currentIndex()<t;)this.rootTransformer.processToken()}processPropsObjectWithDevInfo(t){let n=this.options.production?"":`__self: this, __source: ${this.getDevSource(t)}`;if(!this.tokens.matches1(Be.TokenType.jsxName)&&!this.tokens.matches1(Be.TokenType.braceL)){n?this.tokens.appendCode(`, {${n}}`):this.tokens.appendCode(", null");return}this.tokens.appendCode(", {"),this.processProps(!1),n?this.tokens.appendCode(` ${n}}`):this.tokens.appendCode("}")}processProps(t){let n=null;for(;;){if(this.tokens.matches2(Be.TokenType.jsxName,Be.TokenType.eq)){let o=this.tokens.identifierName();if(t&&o==="key"){n!==null&&this.tokens.appendCode(n.replace(/[^\n]/g,"")),this.tokens.removeToken(),this.tokens.removeToken();let r=this.tokens.snapshot();this.processPropValue(),n=this.tokens.dangerouslyGetAndRemoveCodeSinceSnapshot(r);continue}else this.processPropName(o),this.tokens.replaceToken(": "),this.processPropValue()}else if(this.tokens.matches1(Be.TokenType.jsxName)){let o=this.tokens.identifierName();this.processPropName(o),this.tokens.appendCode(": true")}else if(this.tokens.matches1(Be.TokenType.braceL))this.tokens.replaceToken(""),this.rootTransformer.processBalancedCode(),this.tokens.replaceToken("");else break;this.tokens.appendCode(",")}return n}processPropName(t){t.includes("-")?this.tokens.replaceToken(`'${t}'`):this.tokens.copyToken()}processPropValue(){this.tokens.matches1(Be.TokenType.braceL)?(this.tokens.replaceToken(""),this.rootTransformer.processBalancedCode(),this.tokens.replaceToken("")):this.tokens.matches1(Be.TokenType.jsxTagStart)?this.processJSXTag():this.processStringPropValue()}processStringPropValue(){let t=this.tokens.currentToken(),n=this.tokens.code.slice(t.start+1,t.end-1),o=T1(n),r=Qu(n);this.tokens.replaceToken(r+o)}processAutomaticChildrenAndEndProps(t){t===ds.JSXRole.StaticChildren?(this.tokens.appendCode(" children: ["),this.processChildren(!1),this.tokens.appendCode("]}")):(t===ds.JSXRole.OneChild&&this.tokens.appendCode(" children: "),this.processChildren(!1),this.tokens.appendCode("}"))}processChildren(t){let n=t;for(;;){if(this.tokens.matches2(Be.TokenType.jsxTagStart,Be.TokenType.slash))return;let o=!1;if(this.tokens.matches1(Be.TokenType.braceL))this.tokens.matches2(Be.TokenType.braceL,Be.TokenType.braceR)?(this.tokens.replaceToken(""),this.tokens.replaceToken("")):(this.tokens.replaceToken(n?", ":""),this.rootTransformer.processBalancedCode(),this.tokens.replaceToken(""),o=!0);else if(this.tokens.matches1(Be.TokenType.jsxTagStart))this.tokens.appendCode(n?", ":""),this.processJSXTag(),o=!0;else if(this.tokens.matches1(Be.TokenType.jsxText)||this.tokens.matches1(Be.TokenType.jsxEmptyText))o=this.processChildTextElement(n);else throw new Error("Unexpected token when processing JSX children.");o&&(n=!0)}}processChildTextElement(t){let n=this.tokens.currentToken(),o=this.tokens.code.slice(n.start,n.end),r=T1(o),l=Yu(o);return l==='""'?(this.tokens.replaceToken(r),!1):(this.tokens.replaceToken(`${t?", ":""}${l}${r}`),!0)}getDevSource(t){return`{fileName: ${this.getFilenameVarName()}, ${t}}`}getFilenameVarName(){return this.filenameVarName||(this.filenameVarName=this.nameManager.claimFreeName("_jsxFileName")),this.filenameVarName}};fs.default=Cr;function m1(e){let t=e.charCodeAt(0);return t>=Tn.charCodes.lowercaseA&&t<=Tn.charCodes.lowercaseZ}fs.startsWithLowerCase=m1;function Yu(e){let t="",n="",o=!1,r=!1;for(let l=0;l<e.length;l++){let u=e[l];if(u===" "||u===" "||u==="\r")o||(n+=u);else if(u===` diff --git a/resources/plugins/declarative/orca-test-register.mjs b/resources/plugins/declarative/orca-test-register.mjs index 27ba397945e..51c96909730 100644 --- a/resources/plugins/declarative/orca-test-register.mjs +++ b/resources/plugins/declarative/orca-test-register.mjs @@ -1,3 +1,3 @@ -// Generated by config/scripts/build-plugin-declarative-runtime.mjs from +// Generated by config/scripts/plugin-build/declarative-runtime/build-plugin-declarative-runtime.mjs from // src/main/plugins/testing/. Do not edit. import{register as r}from"node:module";r("./orca-test-hooks.mjs",import.meta.url); diff --git a/resources/plugins/declarative/orca-testing.mjs b/resources/plugins/declarative/orca-testing.mjs index 3feccb7c656..01809e9d4a3 100644 --- a/resources/plugins/declarative/orca-testing.mjs +++ b/resources/plugins/declarative/orca-testing.mjs @@ -1,4 +1,4 @@ -// Generated by config/scripts/build-plugin-declarative-runtime.mjs from +// Generated by config/scripts/plugin-build/declarative-runtime/build-plugin-declarative-runtime.mjs from // src/shared/plugins/declarative/testing/. Do not edit. var Jy=Object.defineProperty;var We=(e,n)=>{for(var i in n)Jy(e,i,{get:n[i],enumerable:!0})};import{readFileSync as lP}from"node:fs";import{dirname as Hy,join as dP}from"node:path";var l={};We(l,{$brand:()=>Fa,$input:()=>hc,$output:()=>gc,INVALID:()=>pe,NEVER:()=>Ga,TimePrecision:()=>Tc,ZodAny:()=>gd,ZodArray:()=>bd,ZodBase64:()=>Yo,ZodBase64URL:()=>Qo,ZodBigInt:()=>En,ZodBigIntFormat:()=>na,ZodBoolean:()=>Tn,ZodCIDRv4:()=>Xo,ZodCIDRv6:()=>qo,ZodCUID:()=>Go,ZodCUID2:()=>Fo,ZodCatch:()=>Md,ZodCodec:()=>Cr,ZodCompileAsyncError:()=>De,ZodCompileUnsupportedError:()=>V,ZodCreditCard:()=>sd,ZodCustom:()=>jr,ZodCustomStringFormat:()=>Lt,ZodDate:()=>Er,ZodDefault:()=>Dd,ZodDiscriminatedUnion:()=>$d,ZodE164:()=>ea,ZodEmail:()=>Ro,ZodEmoji:()=>Zo,ZodEnum:()=>In,ZodError:()=>fx,ZodExactOptional:()=>aa,ZodFile:()=>Ad,ZodFirstPartyTypeKind:()=>ep,ZodFunction:()=>Xd,ZodGUID:()=>Mo,ZodIBAN:()=>ud,ZodIPv4:()=>Wo,ZodIPv6:()=>Jo,ZodISODate:()=>mt,ZodISODateTime:()=>pt,ZodISODuration:()=>gt,ZodISOTime:()=>ft,ZodInstanceOf:()=>Qd,ZodIntersection:()=>kd,ZodIssueCode:()=>vx,ZodJWT:()=>ta,ZodKSUID:()=>Ko,ZodLazy:()=>Kd,ZodLiteral:()=>Ed,ZodMAC:()=>ad,ZodMap:()=>Pd,ZodNaN:()=>Vd,ZodNanoID:()=>Vo,ZodNever:()=>vd,ZodNonOptional:()=>sa,ZodNull:()=>md,ZodNullable:()=>zd,ZodNumber:()=>Pn,ZodNumberFormat:()=>Ut,ZodObject:()=>Or,ZodOptional:()=>zr,ZodPipe:()=>Dr,ZodPrefault:()=>jd,ZodPreprocess:()=>Gd,ZodPromise:()=>Jd,ZodReadonly:()=>Fd,ZodRealError:()=>ke,ZodRecord:()=>wn,ZodSet:()=>Td,ZodString:()=>Sn,ZodStringFormat:()=>X,ZodSuccess:()=>Rd,ZodSymbol:()=>dd,ZodTemplateLiteral:()=>Hd,ZodTransform:()=>Od,ZodTuple:()=>wd,ZodType:()=>M,ZodULID:()=>Bo,ZodURL:()=>Tr,ZodUUID:()=>Fe,ZodUndefined:()=>pd,ZodUnion:()=>Nr,ZodUnknown:()=>hd,ZodVoid:()=>yd,ZodXID:()=>Ho,ZodXor:()=>_d,_ZodString:()=>Uo,_default:()=>Cd,_function:()=>wh,any:()=>th,array:()=>Ar,base64:()=>Cg,base64url:()=>jg,bigint:()=>Xg,boolean:()=>ld,catch:()=>Zd,check:()=>Ih,cidrv4:()=>zg,cidrv6:()=>Dg,clone:()=>H,codec:()=>_h,coerce:()=>np,compile:()=>_c,config:()=>ee,core:()=>Qe,creditCard:()=>Ug,cuid:()=>Ig,cuid2:()=>Sg,currencyCode:()=>Fg,custom:()=>Sh,date:()=>rh,decode:()=>Ql,decodeAsync:()=>td,deepPartial:()=>Rh,describe:()=>Ph,discriminatedUnion:()=>ch,e164:()=>Lg,email:()=>gg,emoji:()=>xg,encode:()=>Yl,encodeAsync:()=>ed,endsWith:()=>mn,enum:()=>ia,exactOptional:()=>Nd,file:()=>hh,flattenError:()=>qn,float32:()=>Hg,float64:()=>Kg,formatError:()=>Yn,fromJSONSchema:()=>Lh,function:()=>wh,getDiscriminatedOption:()=>Gu,getErrorMap:()=>bx,globalRegistry:()=>ue,gt:()=>Ve,gte:()=>we,guid:()=>hg,hash:()=>Bg,hex:()=>Gg,hostname:()=>Vg,httpUrl:()=>kg,iban:()=>Rg,includes:()=>dn,input:()=>Zh,instanceof:()=>Eh,int:()=>jo,int32:()=>Wg,int64:()=>qg,intersection:()=>xd,invertCodec:()=>$h,ipv4:()=>Ag,ipv6:()=>Ng,iso:()=>Lr,json:()=>Oh,jwt:()=>Mg,keyof:()=>ih,ksuid:()=>Eg,lazy:()=>Wd,length:()=>Nt,literal:()=>gh,locales:()=>yr,looseObject:()=>sh,looseRecord:()=>dh,lowercase:()=>cn,lt:()=>Ze,lte:()=>xe,mac:()=>Og,map:()=>ph,maxLength:()=>Ot,maxSize:()=>ut,memoizer:()=>hr,meta:()=>Th,mime:()=>gn,minLength:()=>Ye,minSize:()=>Ge,multipleOf:()=>st,nan:()=>bh,nanoid:()=>wg,nativeEnum:()=>fh,negative:()=>Io,never:()=>ra,nonnegative:()=>Po,nonoptional:()=>Ud,nonpositive:()=>So,normalize:()=>hn,null:()=>fd,nullable:()=>Pr,nullish:()=>vh,number:()=>cd,object:()=>oh,optional:()=>Ct,output:()=>Vh,overwrite:()=>Ce,parse:()=>Wl,parseAsync:()=>Jl,partialRecord:()=>lh,pipe:()=>Lo,positive:()=>wo,prefault:()=>Ld,preprocess:()=>Nh,prettifyError:()=>Ja,promise:()=>xh,properties:()=>fn,property:()=>To,readonly:()=>Bd,record:()=>Sd,refine:()=>qd,regex:()=>un,regexes:()=>Pe,registry:()=>Yi,safeDecode:()=>rd,safeDecodeAsync:()=>od,safeEncode:()=>nd,safeEncodeAsync:()=>id,safeParse:()=>Xl,safeParseAsync:()=>ql,set:()=>mh,setErrorMap:()=>yx,size:()=>At,slugify:()=>_n,startsWith:()=>pn,strictObject:()=>ah,string:()=>Sr,stringFormat:()=>Zg,stringbool:()=>Ah,success:()=>yh,superRefine:()=>Yd,symbol:()=>Qg,templateLiteral:()=>kh,toJSONSchema:()=>No,toLowerCase:()=>yn,toUpperCase:()=>bn,toZod:()=>Zn,transform:()=>oa,treeifyError:()=>Wa,trim:()=>vn,tuple:()=>Id,uint32:()=>Jg,uint64:()=>Yg,ulid:()=>Pg,undefined:()=>eh,union:()=>An,unknown:()=>Dt,uppercase:()=>ln,url:()=>$g,util:()=>_,uuid:()=>vg,uuidv4:()=>yg,uuidv6:()=>bg,uuidv7:()=>_g,validate:()=>Qn,validateAsync:()=>er,void:()=>nh,withParser:()=>Qi,xid:()=>Tg,xor:()=>uh});var Qe={};We(Qe,{$ZodAny:()=>Du,$ZodArray:()=>Mu,$ZodAsyncError:()=>_e,$ZodBase64:()=>ku,$ZodBase64URL:()=>xu,$ZodBigInt:()=>Ui,$ZodBigIntFormat:()=>Au,$ZodBoolean:()=>lr,$ZodCIDRv4:()=>_u,$ZodCIDRv6:()=>$u,$ZodCUID:()=>uu,$ZodCUID2:()=>cu,$ZodCatch:()=>oc,$ZodCheck:()=>q,$ZodCheckBigIntFormat:()=>Cs,$ZodCheckEndsWith:()=>Ks,$ZodCheckGreaterThan:()=>ki,$ZodCheckIncludes:()=>Bs,$ZodCheckLengthEquals:()=>Zs,$ZodCheckLessThan:()=>$i,$ZodCheckLowerCase:()=>Gs,$ZodCheckMaxLength:()=>Rs,$ZodCheckMaxSize:()=>js,$ZodCheckMimeType:()=>Xs,$ZodCheckMinLength:()=>Ms,$ZodCheckMinSize:()=>Ls,$ZodCheckMultipleOf:()=>zs,$ZodCheckNumberFormat:()=>Ds,$ZodCheckOverwrite:()=>qs,$ZodCheckProperties:()=>Js,$ZodCheckProperty:()=>Ws,$ZodCheckRegex:()=>Vs,$ZodCheckSizeEquals:()=>Us,$ZodCheckStartsWith:()=>Hs,$ZodCheckStringFormat:()=>nn,$ZodCheckUpperCase:()=>Fs,$ZodCodec:()=>pr,$ZodCreditCard:()=>Iu,$ZodCustom:()=>pc,$ZodCustomStringFormat:()=>Tu,$ZodCyclicError:()=>Bi,$ZodDate:()=>Uu,$ZodDefault:()=>tc,$ZodDiscriminatedUnion:()=>Fu,$ZodE164:()=>wu,$ZodEmail:()=>nu,$ZodEmoji:()=>au,$ZodEncodeError:()=>ot,$ZodEnum:()=>Ju,$ZodError:()=>Ka,$ZodExactOptional:()=>Qu,$ZodFile:()=>qu,$ZodFunction:()=>lc,$ZodGUID:()=>eu,$ZodIBAN:()=>Su,$ZodIPv4:()=>vu,$ZodIPv6:()=>yu,$ZodISODate:()=>fu,$ZodISODateTime:()=>mu,$ZodISODuration:()=>hu,$ZodISOTime:()=>gu,$ZodIntersection:()=>Bu,$ZodJWT:()=>Pu,$ZodKSUID:()=>pu,$ZodLazy:()=>mr,$ZodLiteral:()=>Xu,$ZodMAC:()=>bu,$ZodMap:()=>Ku,$ZodNaN:()=>ac,$ZodNanoID:()=>su,$ZodNever:()=>ju,$ZodNonOptional:()=>rc,$ZodNull:()=>zu,$ZodNullable:()=>ec,$ZodNumber:()=>Li,$ZodNumberFormat:()=>Eu,$ZodObject:()=>wm,$ZodObjectJIT:()=>Zu,$ZodOptional:()=>Mi,$ZodPipe:()=>Zi,$ZodPrefault:()=>nc,$ZodPreprocess:()=>sc,$ZodPromise:()=>dc,$ZodReadonly:()=>uc,$ZodRealError:()=>$e,$ZodRecord:()=>Hu,$ZodRegistry:()=>qi,$ZodSet:()=>Wu,$ZodString:()=>St,$ZodStringFormat:()=>K,$ZodSuccess:()=>ic,$ZodSymbol:()=>Ou,$ZodTemplateLiteral:()=>cc,$ZodTransform:()=>Yu,$ZodTuple:()=>Ri,$ZodType:()=>U,$ZodULID:()=>lu,$ZodURL:()=>ou,$ZodUUID:()=>tu,$ZodUndefined:()=>Nu,$ZodUnion:()=>dr,$ZodUnknown:()=>Cu,$ZodVoid:()=>Lu,$ZodXID:()=>du,$ZodXor:()=>Vu,$brand:()=>Fa,$constructor:()=>h,$input:()=>hc,$output:()=>gc,Doc:()=>It,INVALID:()=>pe,JSONSchema:()=>pg,JSONSchemaGenerator:()=>zo,NEVER:()=>Ga,TimePrecision:()=>Tc,URL_BAD_FORMAT:()=>ru,URL_UNPARSEABLE:()=>or,ZodCompileAsyncError:()=>De,ZodCompileUnsupportedError:()=>V,_any:()=>Bc,_array:()=>Yc,_base64:()=>_o,_base64url:()=>$o,_bigint:()=>Uc,_boolean:()=>jc,_catch:()=>nx,_check:()=>Xf,_cidrv4:()=>yo,_cidrv6:()=>bo,_coercedBigint:()=>Rc,_coercedBoolean:()=>Lc,_coercedDate:()=>Xc,_coercedNumber:()=>Ac,_coercedString:()=>wc,_creditCard:()=>Sc,_cuid:()=>lo,_cuid2:()=>po,_custom:()=>el,_date:()=>Jc,_decode:()=>li,_decodeAsync:()=>pi,_default:()=>Qk,_discriminatedUnion:()=>Zk,_e164:()=>ko,_email:()=>no,_emoji:()=>uo,_encode:()=>ci,_encodeAsync:()=>di,_endsWith:()=>mn,_enum:()=>Kk,_file:()=>Qc,_float32:()=>Nc,_float64:()=>zc,_gt:()=>Ve,_gte:()=>we,_guid:()=>ro,_iban:()=>Pc,_includes:()=>dn,_int:()=>Oc,_int32:()=>Dc,_int64:()=>Mc,_intersection:()=>Vk,_ipv4:()=>ho,_ipv6:()=>vo,_isoDate:()=>$r,_isoDateTime:()=>_r,_isoDuration:()=>xr,_isoTime:()=>kr,_jwt:()=>xo,_ksuid:()=>go,_lazy:()=>ax,_length:()=>Nt,_literal:()=>Jk,_lowercase:()=>cn,_lt:()=>Ze,_lte:()=>xe,_mac:()=>Ic,_map:()=>Bk,_max:()=>xe,_maxLength:()=>Ot,_maxSize:()=>ut,_mime:()=>gn,_min:()=>we,_minLength:()=>Ye,_minSize:()=>Ge,_multipleOf:()=>st,_nan:()=>qc,_nanoid:()=>co,_nativeEnum:()=>Wk,_negative:()=>Io,_never:()=>Kc,_nonnegative:()=>Po,_nonoptional:()=>ex,_nonpositive:()=>So,_normalize:()=>hn,_null:()=>Fc,_nullable:()=>Yk,_number:()=>Ec,_optional:()=>qk,_overwrite:()=>Ce,_parse:()=>Yt,_parseAsync:()=>Qt,_pipe:()=>rx,_positive:()=>wo,_promise:()=>sx,_properties:()=>fn,_property:()=>To,_readonly:()=>ix,_record:()=>Fk,_refine:()=>tl,_regex:()=>un,_safeDecode:()=>fi,_safeDecodeAsync:()=>hi,_safeEncode:()=>mi,_safeEncodeAsync:()=>gi,_safeParse:()=>en,_safeParseAsync:()=>tn,_set:()=>Hk,_size:()=>At,_slugify:()=>_n,_startsWith:()=>pn,_string:()=>xc,_stringFormat:()=>zt,_stringbool:()=>ol,_success:()=>tx,_superRefine:()=>nl,_symbol:()=>Vc,_templateLiteral:()=>ox,_toLowerCase:()=>yn,_toUpperCase:()=>bn,_transform:()=>Xk,_trim:()=>vn,_tuple:()=>Gk,_uint32:()=>Cc,_uint64:()=>Zc,_ulid:()=>mo,_undefined:()=>Gc,_union:()=>Rk,_unknown:()=>Hc,_uppercase:()=>ln,_url:()=>br,_uuid:()=>io,_uuidv4:()=>oo,_uuidv6:()=>ao,_uuidv7:()=>so,_void:()=>Wc,_xid:()=>fo,_xor:()=>Mk,base64Charset:()=>Ni,base64urlCharset:()=>cr,canParseURL:()=>iu,clone:()=>H,compile:()=>_c,compileFn:()=>eo,config:()=>ee,createStandardJSONSchemaMethod:()=>$n,createToJSONSchemaMethod:()=>sl,decode:()=>Mb,decodeAsync:()=>Vb,describe:()=>rl,encode:()=>Rb,encodeAsync:()=>Zb,extractDefs:()=>lt,finalize:()=>dt,flattenError:()=>qn,formatError:()=>Yn,getDiscriminatedOption:()=>Gu,globalConfig:()=>oe,globalRegistry:()=>ue,handleUnrepresentable:()=>re,initializeContext:()=>ct,isBackEdge:()=>Ki,isRecursiveSchema:()=>Hi,isValidBase64:()=>ur,isValidBase64URL:()=>zi,isValidCIDRv6:()=>Oi,isValidCreditCard:()=>Di,isValidIBAN:()=>Ci,isValidIPv6:()=>sr,isValidJWT:()=>ji,locales:()=>yr,memoizer:()=>hr,mergeValues:()=>rn,meta:()=>il,parse:()=>si,parseAsync:()=>ui,parseURLObject:()=>$m,prettifyError:()=>Ja,process:()=>W,processSchema:()=>W,regexes:()=>Pe,registry:()=>Yi,safeDecode:()=>Fb,safeDecodeAsync:()=>Hb,safeEncode:()=>Gb,safeEncodeAsync:()=>Bb,safeParse:()=>Db,safeParseAsync:()=>Cb,standardProps:()=>Pi,stripTabAndNewline:()=>ar,toDotPath:()=>em,toJSONSchema:()=>No,toZod:()=>Zn,treeifyError:()=>Wa,urlHostnameOk:()=>Ei,urlProtocolOk:()=>Ai,util:()=>_,validate:()=>Qn,validateAsync:()=>er,validateURL:()=>Ti,version:()=>Ys,withParser:()=>Qi});var _={};We(_,{BIGINT_FORMAT_RANGES:()=>Hn,CONSTANT_CATCH:()=>oi,Class:()=>za,NUMBER_FORMAT_RANGES:()=>Bn,aborted:()=>de,allowsEval:()=>ja,assert:()=>eb,assertEqual:()=>Xy,assertIs:()=>Yy,assertNever:()=>Qy,assertNotEqual:()=>qy,assignProp:()=>se,attachSchema:()=>Kn,base64ToUint8Array:()=>Wp,base64urlToUint8Array:()=>bb,cached:()=>Wt,captureStackTrace:()=>ri,cleanEnum:()=>yb,cleanRegex:()=>Xe,clone:()=>H,cloneDef:()=>rb,codePointLength:()=>xt,constantCatch:()=>Za,createTransparentProxy:()=>cb,defineLazy:()=>Da,defineLazyInternal:()=>Z,derived:()=>xb,esc:()=>le,escapeRegex:()=>Se,explicitlyAborted:()=>Ra,extend:()=>pb,finalizeIssue:()=>be,floatSafeRemainder:()=>Vn,getElementAtPath:()=>ib,getEnumValues:()=>Ht,getLengthableOrigin:()=>Jn,getParsedType:()=>ub,getSizableOrigin:()=>Wn,hexToUint8Array:()=>$b,hide:()=>Xn,installLazyProp:()=>Pb,isObject:()=>kt,isPlainObject:()=>Ie,issue:()=>qt,joinValues:()=>v,jsonStringifyReplacer:()=>Kt,members:()=>Ma,merge:()=>fb,mergeDefs:()=>ze,normalizeParams:()=>S,nullish:()=>ni,numKeys:()=>sb,objectClone:()=>tb,omit:()=>db,optionalKeys:()=>Ua,own:()=>it,parsedType:()=>k,partial:()=>gb,pick:()=>lb,prefixIssues:()=>ye,primitiveTypes:()=>La,promiseAllObject:()=>ob,propertyKeyTypes:()=>Fn,randomString:()=>ab,rawShape:()=>Jt,required:()=>hb,safeExtend:()=>mb,shallowClone:()=>Gn,sizeCaps:()=>Xt,slugify:()=>Ca,stringifyPrimitive:()=>$,toZod:()=>Zn,uint8ArrayToBase64:()=>Jp,uint8ArrayToBase64url:()=>_b,uint8ArrayToHex:()=>kb,unwrapMessage:()=>Bt});function Xy(e){return e}function qy(e){return e}function Zn(){return e=>e}function Yy(e){}function Qy(e){throw new Error("Unexpected value in exhaustive check")}function eb(e){}function Ht(e){let n=Object.values(e).filter(o=>typeof o=="number");return Object.entries(e).filter(([o,t])=>n.indexOf(+o)===-1).map(([o,t])=>t)}function v(e,n="|"){return e.map(i=>$(i)).join(n)}function Kt(e,n){return typeof n=="bigint"?n.toString():n}var Na=class{constructor(n){this._getter=n,this._value=void 0}get value(){let n=this._getter;return n!==void 0&&(this._value=n(),this._getter=void 0),this._value}};function Wt(e){return new Na(e)}function ni(e){return e==null}function Xe(e){let n=e.startsWith("^")?1:0,i=e.endsWith("$")?e.length-1:e.length;return e.slice(n,i)}function Vn(e,n){let i=e/n,o=Math.round(i),t=4*Number.EPSILON*Math.max(Math.abs(i),1);return Math.abs(i-o)<t?0:i-o}var Fp=Symbol("evaluating");function Da(e,n,i){let o;Object.defineProperty(e,n,{get(){if(o!==Fp)return o===void 0&&(o=Fp,o=i()),o},set(t){Object.defineProperty(e,n,{value:t})},configurable:!0})}function tb(e){return Object.create(Object.getPrototypeOf(e),Object.getOwnPropertyDescriptors(e))}function se(e,n,i){Object.defineProperty(e,n,{value:i,writable:!0,enumerable:!0,configurable:!0})}function Jt(e){let n=Object.getOwnPropertyDescriptor(e,"shape");return n?.get?n.get.raw:n?.value}function Je(e){return Jt(e._zod.def)??e._zod.def.shape}function Bp(e,n,i){Object.defineProperty(e,n,{get(){let o=i();return se(this,n,o),o},enumerable:!0,configurable:!0})}function Hp(e,n,i){n in e?se(e,n,i):e[n]=i}function $t(e,n,i,o){let t=Je(n);for(let r of i){let a=Object.getOwnPropertyDescriptor(t,r);a.enumerable&&(a.get?Bp(e,r,()=>{let s=n._zod.def.shape[r];return o?o(s,r):s}):Hp(e,r,o?o(a.value,r):a.value))}}function nb(e,n){for(let i of Reflect.ownKeys(n)){let o=Object.getOwnPropertyDescriptor(n,i);o.enumerable&&(o.get?Bp(e,i,()=>n[i]):Hp(e,i,o.value))}}function ze(...e){let n={};for(let i of e){let o=Object.getOwnPropertyDescriptors(i);Object.assign(n,o)}return Object.defineProperties({},n)}function rb(e){return ze(e._zod.def)}function ib(e,n){return n?n.reduce((i,o)=>i?.[o],e):e}function ob(e){let n=Object.keys(e),i=n.map(o=>e[o]);return Promise.all(i).then(o=>{let t={};for(let r=0;r<n.length;r++)t[n[r]]=o[r];return t})}function ab(e=10){let n="abcdefghijklmnopqrstuvwxyz",i="";for(let o=0;o<e;o++)i+=n[Math.floor(Math.random()*n.length)];return i}function le(e){return JSON.stringify(e)}function Ca(e){return e.toLowerCase().trim().replace(/[^\w\s-]/g,"").replace(/[\s_-]+/g,"-").replace(/^-+|-+$/g,"")}var ri="captureStackTrace"in Error?Error.captureStackTrace:(...e)=>{};function kt(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var ja=Wt(()=>{if(oe.jitless||typeof navigator<"u"&&navigator?.userAgent?.includes("Cloudflare"))return!1;try{let e=Function;return new e(""),!0}catch{return!1}});function Ie(e){if(kt(e)===!1)return!1;let n=e.constructor;if(n===void 0||typeof n!="function")return!0;let i=n.prototype;return!(kt(i)===!1||Object.prototype.hasOwnProperty.call(i,"isPrototypeOf")===!1)}function Gn(e){return Ie(e)?{...e}:Array.isArray(e)?[...e]:e instanceof Map?new Map(e):e instanceof Set?new Set(e):e}function sb(e){let n=0;for(let i in e)Object.prototype.hasOwnProperty.call(e,i)&&n++;return n}var ub=e=>{let n=typeof e;switch(n){case"undefined":return"undefined";case"string":return"string";case"number":return Number.isNaN(e)?"nan":"number";case"boolean":return"boolean";case"function":return"function";case"bigint":return"bigint";case"symbol":return"symbol";case"object":return Array.isArray(e)?"array":e===null?"null":e.then&&typeof e.then=="function"&&e.catch&&typeof e.catch=="function"?"promise":typeof Map<"u"&&e instanceof Map?"map":typeof Set<"u"&&e instanceof Set?"set":typeof Date<"u"&&e instanceof Date?"date":typeof File<"u"&&e instanceof File?"file":"object";default:throw new Error(`Unknown data type: ${n}`)}},Fn=new Set(["string","number","symbol"]),La=new Set(["string","number","bigint","boolean","symbol","undefined"]);function Se(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function H(e,n,i){let o=new e._zod.constr(n??e._zod.def);return(!n||i?.parent)&&(o._zod.parent=e),o}function S(e){let n=e;if(!n)return{};if(typeof n=="string")return{error:()=>n};if(n?.message!==void 0){if(n?.error!==void 0)throw new Error("Cannot specify both `message` and `error` params");n.error=n.message}return delete n.message,typeof n.error=="string"?{...n,error:()=>n.error}:n}function cb(e){let n;return new Proxy({},{get(i,o,t){return n??(n=e()),Reflect.get(n,o,t)},set(i,o,t,r){return n??(n=e()),Reflect.set(n,o,t,r)},has(i,o){return n??(n=e()),Reflect.has(n,o)},deleteProperty(i,o){return n??(n=e()),Reflect.deleteProperty(n,o)},ownKeys(i){return n??(n=e()),Reflect.ownKeys(n)},getOwnPropertyDescriptor(i,o){return n??(n=e()),Reflect.getOwnPropertyDescriptor(n,o)},defineProperty(i,o,t){return n??(n=e()),Reflect.defineProperty(n,o,t)}})}function $(e){return typeof e=="bigint"?e.toString()+"n":typeof e=="string"?`"${e}"`:`${e}`}function Ua(e){return Object.keys(e).filter(n=>e[n]._zod.optin!==void 0&&e[n]._zod.optout==="optional")}var Bn={safeint:[Number.MIN_SAFE_INTEGER,Number.MAX_SAFE_INTEGER],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-34028234663852886e22,34028234663852886e22],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]},Hn={int64:[BigInt("-9223372036854775808"),BigInt("9223372036854775807")],uint64:[BigInt(0),BigInt("18446744073709551615")]};function lb(e,n){let i=e._zod.def,o=i.checks;if(o&&o.length>0)throw new Error(".pick() cannot be used on object schemas containing refinements");let r={};return $t(r,e,ii(e,n)),H(e,ze(i,{shape:r,checks:[]}))}function ii(e,n){let i=Je(e),o=[];for(let t of Reflect.ownKeys(n)){if(!Object.getOwnPropertyDescriptor(i,t)?.enumerable)throw new Error(`Unrecognized key: "${String(t)}"`);n[t]&&o.push(t)}return o}function db(e,n){let i=e._zod.def,o=i.checks;if(o&&o.length>0)throw new Error(".omit() cannot be used on object schemas containing refinements");let r=new Set(ii(e,n)),a={};return $t(a,e,Reflect.ownKeys(Je(e)).filter(s=>!r.has(s))),H(e,ze(i,{shape:a,checks:[]}))}function pb(e,n){if(!Ie(n))throw new Error("Invalid input to extend: expected a plain object");let i=e._zod.def.checks;if(i&&i.length>0){let t=Je(e);for(let r of Reflect.ownKeys(n))if(Object.getOwnPropertyDescriptor(t,r)!==void 0)throw new Error("Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.")}return H(e,ze(e._zod.def,{shape:Kp(e,n)}))}function Kp(e,n){let i={};return $t(i,e,Reflect.ownKeys(Je(e))),nb(i,n),i}function mb(e,n){if(!Ie(n))throw new Error("Invalid input to safeExtend: expected a plain object");return H(e,ze(e._zod.def,{shape:Kp(e,n)}))}function fb(e,n){if(!n?._zod?.def)throw new Error("Invalid input to merge: expected an object schema. To merge a plain shape, use `.extend()`.");if(e._zod.def.checks?.length)throw new Error(".merge() cannot be used on object schemas containing refinements. Use .safeExtend() instead.");let i={};$t(i,e,Reflect.ownKeys(Je(e))),$t(i,n,Reflect.ownKeys(Je(n)));let o=ze(e._zod.def,{shape:i,get catchall(){return n._zod.def.catchall},checks:n._zod.def.checks??[]});return H(e,o)}function gb(e,n,i,o="partial"){let r=n._zod.def.checks;if(r&&r.length>0)throw new Error(`.${o}() cannot be used on object schemas containing refinements`);let s=i?new Set(ii(n,i)):void 0,u={};return $t(u,n,Reflect.ownKeys(Je(n)),e&&((c,d)=>s&&!s.has(d)?c:new e({type:"optional",innerType:c}))),H(n,ze(n._zod.def,{shape:u,checks:[]}))}function hb(e,n,i){let o=i?new Set(ii(n,i)):void 0,t={};return $t(t,n,Reflect.ownKeys(Je(n)),(r,a)=>o&&!o.has(a)?r:new e({type:"nonoptional",innerType:r})),H(n,ze(n._zod.def,{shape:t}))}function de(e,n=0){if(e.aborted===!0)return!0;for(let i=n;i<e.issues.length;i++)if(e.issues[i]?.continue!==!0)return!0;return!1}function Ra(e,n=0){if(e.aborted===!0)return!0;for(let i=n;i<e.issues.length;i++)if(e.issues[i]?.continue===!1)return!0;return!1}function ye(e,n){return n.map(i=>{var o;return(o=i).path??(o.path=[]),i.path.unshift(e),i})}function Bt(e){return typeof e=="string"?e:e?.message}function Xt(e){let n=[];for(let i of e??[]){let o=i._zod.def;if(!/_(length|size)$|_equals$/.test(o.check))break;let t=o.maximum??o.length??o.size;t>=0&&n.push([t,i])}return n}function Kn(e,n,i){var o;for(let t=n;t<e.length;t++)(o=e[t]).schema??(o.schema=i)}function be(e,n,i){var o;let t=e.inst?._zod?.traits;t?.has("$ZodType")&&(t.has("$ZodCheck")?(o=e).schema??(o.schema=e.inst):e.schema=e.inst);let r=e.schema!==e.inst?e.schema?._zod.def?.error:void 0,a=e.message?e.message:Bt(e.inst?._zod.def?.error?.(e))??Bt(r?.(e))??Bt(n?.error?.(e))??Bt(i.customError?.(e))??Bt(i.localeError?.(e))??"Invalid input",s={};for(let u of Object.keys(e))u==="inst"||u==="schema"||u==="continue"||u==="input"||u==="__proto__"||(s[u]=e[u]);return s.path??(s.path=[]),s.message=a,n?.reportInput&&(s.input=e.input),s}function Wn(e){return e instanceof Set?"set":e instanceof Map?"map":e instanceof File?"file":"unknown"}var vb=/[\uD800-\uDBFF]/;function xt(e){let n=e.length;if(!vb.test(e))return n;let i=n;for(let o=0;o<n-1;o++)(e.charCodeAt(o)&64512)===55296&&(e.charCodeAt(o+1)&64512)===56320&&(i--,o++);return i}function Jn(e){return Array.isArray(e)?"array":typeof e=="string"?"string":"unknown"}function k(e){let n=typeof e;switch(n){case"number":return Number.isNaN(e)?"nan":"number";case"object":{if(e===null)return"null";if(Array.isArray(e))return"array";let i=e;if(i&&Object.getPrototypeOf(i)!==Object.prototype&&"constructor"in i&&i.constructor)return i.constructor.name}}return n}function qt(...e){let[n,i,o]=e;return typeof n=="string"?{message:n,code:"custom",input:i,inst:o}:{...n}}function yb(e){return Object.entries(e).filter(([n,i])=>Number.isNaN(Number.parseInt(n,10))).map(n=>n[1])}function Wp(e){let n=atob(e),i=new Uint8Array(n.length);for(let o=0;o<n.length;o++)i[o]=n.charCodeAt(o);return i}function Jp(e){let n="";for(let i=0;i<e.length;i++)n+=String.fromCharCode(e[i]);return btoa(n)}function bb(e){let n=e.replace(/-/g,"+").replace(/_/g,"/"),i="=".repeat((4-n.length%4)%4);return Wp(n+i)}function _b(e){return Jp(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function $b(e){let n=e.replace(/^0x/,"");if(n.length%2!==0)throw new Error("Invalid hex string length");let i=new Uint8Array(n.length/2);for(let o=0;o<n.length;o+=2)i[o/2]=Number.parseInt(n.slice(o,o+2),16);return i}function kb(e){return Array.from(e).map(n=>n.toString(16).padStart(2,"0")).join("")}var za=class{constructor(...n){}};function Ma(e,n){for(let i in n){let o=Object.getOwnPropertyDescriptor(n,i);o.get?Object.defineProperty(e,i,{...o,enumerable:!1}):wb(e,i,o.value)}}function it(e,n,i,o=!0){return Object.defineProperty(e,n,{configurable:!0,writable:!0,enumerable:o,value:i}),i}function Xn(e,n,i){return it(e,n,i,!1)}function xb(e,n){for(let i in e){let o=e[i];Object.defineProperty(n,i,{configurable:!0,enumerable:!0,get(){return it(this,i,o(this))},set(t){it(this,i,t)}})}return n}function wb(e,n,i){Object.defineProperty(e,n,{configurable:!0,get(){return this==null?i:it(this,n,i.bind(this))},set(o){it(this,n,o)}})}function Ib(e,n){let i=Object.getPrototypeOf(e);return n in i?void 0:i}var Oa,rt=!1,Sb={configurable:!0,get(){rt=!0}};function Z(e,n,i){let o=Object.getPrototypeOf(e._zod);if(n in o&&Oa!==e._zod){Oa=void 0;return}Oa=e._zod,Object.defineProperty(o,n,{configurable:!0,get(){Object.defineProperty(this,n,Sb);let t=rt;rt=!1;try{let r=i(this);return rt?delete this[n]:Object.defineProperty(this,n,{configurable:!0,writable:!0,value:r}),rt=rt||t,r}catch(r){throw delete this[n],rt=rt||t,r}},set(t){Object.defineProperty(this,n,{configurable:!0,writable:!0,value:t})}})}function Pb(e,n,i,o){let t=Ib(e,n);t&&Object.defineProperty(t,n,{configurable:!0,get(){let r={configurable:!0,writable:!0,enumerable:o,value:void 0};return Object.defineProperty(this,n,r),r.value=i(this),Object.defineProperty(this,n,r),r.value},set(r){Object.defineProperty(this,n,{configurable:!0,writable:!0,enumerable:o,value:r})}})}var oi="~constantCatch";function Za(e){let n=()=>e;return n[oi]=!0,n}var Xp,Ga=Object.freeze({status:"aborted"}),Va={value:void 0,enumerable:!1},qp="captureStackTrace"in Error?Error:null;function Tb(e){let n=qp;if(n){let i=n.stackTraceLimit;if(typeof i=="number"){try{n.stackTraceLimit=0}catch{return qp=null,new e}try{return new e}finally{n.stackTraceLimit=i}}}return new e}function h(e,n,i,o){let t={};function r(m){this.def=m,this.constr=p,this.traits=new Set}r.prototype=t;let a=i,s=a&&new WeakSet;function u(m,f){if(m._zod){if(m._zod.traits.has(e))return}else{Va.value=new r(f);try{Object.defineProperty(m,"_zod",Va)}finally{Va.value=void 0}}if(m._zod.traits.add(e),n(m,f),s){let y=Object.getPrototypeOf(m),x=m._zod.constr.prototype,I=y;for(;I&&I!==x;)I=Object.getPrototypeOf(I);let b=I??y;s.has(b)||(s.add(b),Ma(b,a))}let g=p.prototype;for(let y in g)Object.prototype.hasOwnProperty.call(g,y)&&(y in m||(m[y]=g[y].bind(m)))}let c=o?.Parent??Object;class d extends c{}Object.defineProperty(d,"name",{value:e});function p(m){let f=o?.Parent?Tb(d):this;u(f,m);let g=f._zod.deferred;if(g){for(let x of g)x();f._zod.deferred=void 0}let y=globalThis.__zod_globalConfig?.postProcessor;return y&&y(f),f}return Object.defineProperty(p,"init",{value:u}),Object.defineProperty(p,Symbol.hasInstance,{value:m=>o?.Parent&&m instanceof o.Parent?!0:m?._zod?.traits?.has(e)}),Object.defineProperty(p,"name",{value:e}),p}var Fa=Symbol("zod_brand"),_e=class extends Error{constructor(){super("Encountered Promise during synchronous parse. Use .parseAsync() instead.")}},ot=class extends Error{constructor(n){super(`Encountered unidirectional transform during encode: ${n}`),this.name="ZodEncodeError"}};(Xp=globalThis).__zod_globalConfig??(Xp.__zod_globalConfig={});var oe=globalThis.__zod_globalConfig;function ee(e){return e&&Object.assign(oe,e),oe}function Eb(){let e=this._zod;return e.message??(e.message=JSON.stringify(e.def,Kt,2)),e.message}function Ab(e){this._zod.message=e}var Ob={get:Eb,set:Ab,enumerable:!0,configurable:!0},Ha={value:void 0,enumerable:!1},Yp=new WeakSet([Object.prototype,Error.prototype]),Qp=(e,n)=>{e.name="$ZodError",Ha.value=n,Object.defineProperty(e,"issues",Ha),Ha.value=void 0,Object.defineProperty(e,"message",Ob);let i=Object.getPrototypeOf(e);Yp.has(i)||(Yp.add(i),Object.defineProperty(i,"toString",{configurable:!0,enumerable:!1,get(){let o=()=>this.message;return Object.defineProperty(this,"toString",{value:o,configurable:!0,writable:!0}),o},set(o){Object.defineProperty(this,"toString",{value:o,configurable:!0,writable:!0})}}))},Ka=h("$ZodError",Qp),$e=h("$ZodError",Qp,void 0,{Parent:Error});function Nb(e,n,i){return Object.prototype.hasOwnProperty.call(e,n)||(n==="__proto__"?Object.defineProperty(e,n,{value:i(),writable:!0,enumerable:!0,configurable:!0}):e[n]=i()),e[n]}function qn(e,n=i=>i.message){let i={},o=[];for(let t of e.issues)t.path.length>0?Nb(i,t.path[0],()=>[]).push(n(t)):o.push(n(t));return{formErrors:o,fieldErrors:i}}function Yn(e,n=i=>i.message){let i={_errors:[]},o=(t,r=[])=>{for(let a of t.issues)if(a.code==="invalid_union"&&a.errors.length)a.errors.map(s=>o({issues:s},[...r,...a.path]));else if(a.code==="invalid_key")o({issues:a.issues},[...r,...a.path]);else if(a.code==="invalid_element")o({issues:a.issues},[...r,...a.path]);else{let s=[...r,...a.path];if(s.length===0)i._errors.push(n(a));else{let u=i,c=0;for(;c<s.length;){let d=s[c],p=c===s.length-1;if(d==="_errors"){p&&u._errors.push(n(a)),c++;continue}Object.prototype.hasOwnProperty.call(u,d)||Object.defineProperty(u,d,{value:{_errors:[]},enumerable:!0,writable:!0,configurable:!0});let m=u[d];p&&m._errors.push(n(a)),u=m,c++}}}};return o(e),i}function Wa(e,n=i=>i.message){let i={errors:[]},o=(t,r=[])=>{var a;for(let s of t.issues)if(s.code==="invalid_union"&&s.errors.length)s.errors.map(u=>o({issues:u},[...r,...s.path]));else if(s.code==="invalid_key")o({issues:s.issues},[...r,...s.path]);else if(s.code==="invalid_element")o({issues:s.issues},[...r,...s.path]);else{let u=[...r,...s.path];if(u.length===0){i.errors.push(n(s));continue}let c=i,d=0;for(;d<u.length;){let p=u[d],m=d===u.length-1;typeof p=="string"?(c.properties??(c.properties={}),Object.prototype.hasOwnProperty.call(c.properties,p)||Object.defineProperty(c.properties,p,{value:{errors:[]},enumerable:!0,writable:!0,configurable:!0}),c=c.properties[p]):(c.items??(c.items=[]),(a=c.items)[p]??(a[p]={errors:[]}),c=c.items[p]),m&&c.errors.push(n(s)),d++}}};return o(e),i}function em(e){let n=[],i=e.map(o=>typeof o=="object"?o.key:o);for(let o of i)typeof o=="number"?n.push(`[${o}]`):typeof o=="symbol"?n.push(`[${JSON.stringify(String(o))}]`):/[^\w$]/.test(o)?n.push(`[${JSON.stringify(o)}]`):(n.length&&n.push("."),n.push(o));return n.join("")}function Ja(e){let n=[],i=[...e.issues].sort((o,t)=>(o.path??[]).length-(t.path??[]).length);for(let o of i)n.push(`✖ ${o.message}`),o.path?.length&&n.push(` → at ${em(o.path)}`);return n.join(` `)}function ai(e,n){return{callee:n?.callee??e,Err:n?.Err}}var Yt=e=>{let n=(i,o,t,r)=>{let a=t?{...t,async:!1}:{async:!1},s=i._zod.run({value:o,issues:[]},a);if(s instanceof Promise)throw new _e;if(s.issues.length){let u=new(r?.Err??e)(s.issues.map(c=>be(c,a,ee())));throw ri(u,r?.callee??n),u}return s.value};return n},si=Yt($e),Qt=e=>{let n=async(i,o,t,r)=>{let a=t?{...t,async:!0}:{async:!0},s=i._zod.run({value:o,issues:[]},a);if(s instanceof Promise&&(s=await s),s.issues.length){let u=new(r?.Err??e)(s.issues.map(c=>be(c,a,ee())));throw ri(u,r?.callee??n),u}return s.value};return n},ui=Qt($e),en=e=>(n,i,o)=>{let t=o?{...o,async:!1}:{async:!1},r=n._zod.run({value:i,issues:[]},t);if(r instanceof Promise)throw new _e;return r.issues.length?tm(e,r.issues,t):{success:!0,data:r.value}},Db=en($e);function tm(e,n,i){let o;return{success:!1,get error(){return o||(o=new e(n.map(t=>be(t,i,ee()))),n=void 0,i=void 0),o},set error(t){o=t,n=void 0,i=void 0}}}var tn=e=>async(n,i,o)=>{let t=o?{...o,async:!0}:{async:!0},r=n._zod.run({value:i,issues:[]},t);return r instanceof Promise&&(r=await r),r.issues.length?tm(e,r.issues,t):{success:!0,data:r.value}},Cb=tn($e),jb=Symbol.for("zod.compile.invalid"),Lb=Symbol.for("zod.compile.fallback"),Qn=((e,n,i)=>{let o=e._zod.bag.validator;if(o!==void 0){if(o(n)!==jb)return!0;if(o.definite===!0&&i===void 0)return!1}return Ub(e,n,i)});function Ub(e,n,i){let o=i?{...i,async:!1,abortEarly:!0}:{async:!1,abortEarly:!0},t=e._zod.bag.fallbackRun,r;if(t?(o[Lb]=!0,r=t({value:n,issues:[]},o)):r=e._zod.run({value:n,issues:[]},o),r instanceof Promise)throw new _e;return r.issues.length===0}var er=async(e,n,i)=>{let o=i?{...i,async:!0,abortEarly:!0}:{async:!0,abortEarly:!0},t=e._zod.run({value:n,issues:[]},o);return t instanceof Promise&&(t=await t),t.issues.length===0},ci=e=>{let n=Yt(e),i=(o,t,r,a)=>{let s=r?{...r,direction:"backward"}:{direction:"backward"};return n(o,t,s,ai(i,a))};return i},Rb=ci($e),li=e=>{let n=Yt(e),i=(o,t,r,a)=>n(o,t,r,ai(i,a));return i},Mb=li($e),di=e=>{let n=Qt(e),i=async(o,t,r,a)=>{let s=r?{...r,direction:"backward"}:{direction:"backward"};return await n(o,t,s,ai(i,a))};return i},Zb=di($e),pi=e=>{let n=Qt(e),i=async(o,t,r,a)=>await n(o,t,r,ai(i,a));return i},Vb=pi($e),mi=e=>(n,i,o)=>{let t=o?{...o,direction:"backward"}:{direction:"backward"};return en(e)(n,i,t)},Gb=mi($e),fi=e=>(n,i,o)=>en(e)(n,i,o),Fb=fi($e),gi=e=>async(n,i,o)=>{let t=o?{...o,direction:"backward"}:{direction:"backward"};return tn(e)(n,i,t)},Bb=gi($e),hi=e=>async(n,i,o)=>tn(e)(n,i,o),Hb=hi($e);var Pe={};We(Pe,{anyString:()=>ks,base64:()=>ms,base64url:()=>fs,bigint:()=>ws,boolean:()=>Is,browserEmail:()=>e_,cidrv4:()=>ds,cidrv6:()=>ps,creditCard:()=>vi,cuid:()=>qa,cuid2:()=>Ya,currencyCode:()=>ys,date:()=>bs,datetime:()=>$s,domain:()=>hs,duration:()=>is,e164:()=>vs,email:()=>as,emoji:()=>ss,extendedDuration:()=>Kb,guid:()=>os,hex:()=>As,hostname:()=>gs,html5Email:()=>qb,httpProtocol:()=>tr,iban:()=>yi,idnEmail:()=>Qb,integer:()=>nr,ipv4:()=>us,ipv6:()=>cs,ksuid:()=>ts,lowercase:()=>Ts,mac:()=>ls,md5_base64:()=>i_,md5_base64url:()=>o_,md5_hex:()=>r_,nanoid:()=>ns,nanoidOfLength:()=>rs,null:()=>Ss,number:()=>qe,rfc5322Email:()=>Yb,sha1_base64:()=>s_,sha1_base64url:()=>u_,sha1_hex:()=>a_,sha256_base64:()=>l_,sha256_base64url:()=>d_,sha256_hex:()=>c_,sha384_base64:()=>m_,sha384_base64url:()=>f_,sha384_hex:()=>p_,sha512_base64:()=>h_,sha512_base64url:()=>v_,sha512_hex:()=>g_,string:()=>xs,time:()=>_s,ulid:()=>Qa,undefined:()=>Ps,unicodeEmail:()=>nm,uppercase:()=>Es,uuid:()=>wt,uuid4:()=>Wb,uuid6:()=>Jb,uuid7:()=>Xb,xid:()=>es});var qa=/^[cC][0-9a-z]{6,}$/,Ya=/^[0-9a-z]+$/,Qa=/^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$/,es=/^[0-9a-vA-V]{20}$/,ts=/^[A-Za-z0-9]{27}$/,ns=/^[a-zA-Z0-9_-]{21}$/;function rs(e){return new RegExp(`^[a-zA-Z0-9_-]{${e}}$`)}var is=/^P(?:(\d+W)|(?!.*W)(?=\d|T\d)(\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+([.,]\d+)?S)?)?)$/,Kb=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,os=/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/,wt=e=>e?new RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${e}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`):/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/,Wb=wt(4),Jb=wt(6),Xb=wt(7),as=/^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/,qb=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,Yb=/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,nm=/^[^\s@"]{1,64}@[^\s@]{1,255}$/u,Qb=nm,e_=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,t_="^(?=[\\s\\S]*[\\p{Extended_Pictographic}\\p{Regional_Indicator}\\u20E3])[\\p{Extended_Pictographic}\\p{Emoji_Component}]+$";function ss(){return new RegExp(t_,"u")}var us=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,cs=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/,ls=e=>{let n=Se(e??":");return new RegExp(`^(?:[0-9A-F]{2}${n}){5}[0-9A-F]{2}$|^(?:[0-9a-f]{2}${n}){5}[0-9a-f]{2}$`)},ds=/^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$/,ps=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,ms=/^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/,fs=/^(?:[A-Za-z0-9_-]{4})*(?:[A-Za-z0-9_-]{2,3})?$/,gs=/^(?=.{1,253}\.?$)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[-0-9a-zA-Z]{0,61}[0-9a-zA-Z])?)*\.?$/,hs=/^(?=.{1,253}$)([a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,63}$/,tr=/^https?$/,vs=/^\+[1-9]\d{6,14}$/,vi=/^\d(?:[ -]?\d){11,18}$/,ys=/^(?:AED|AFN|ALL|AMD|AOA|ARS|AUD|AWG|AZN|BAM|BBD|BDT|BHD|BIF|BMD|BND|BOB|BOV|BRL|BSD|BTN|BWP|BYN|BZD|CAD|CDF|CHE|CHF|CHW|CLF|CLP|CNY|COP|COU|CRC|CUP|CVE|CZK|DJF|DKK|DOP|DZD|EGP|ERN|ETB|EUR|FJD|FKP|GBP|GEL|GHS|GIP|GMD|GNF|GTQ|GYD|HKD|HNL|HTG|HUF|IDR|ILS|INR|IQD|IRR|ISK|JMD|JOD|JPY|KES|KGS|KHR|KMF|KPW|KRW|KWD|KYD|KZT|LAK|LBP|LKR|LRD|LSL|LYD|MAD|MDL|MGA|MKD|MMK|MNT|MOP|MRU|MUR|MVR|MWK|MXN|MXV|MYR|MZN|NAD|NGN|NIO|NOK|NPR|NZD|OMR|PAB|PEN|PGK|PHP|PKR|PLN|PYG|QAR|RON|RSD|RUB|RWF|SAR|SBD|SCR|SDG|SEK|SGD|SHP|SLE|SOS|SRD|SSP|STN|SVC|SYP|SZL|THB|TJS|TMT|TND|TOP|TRY|TTD|TWD|TZS|UAH|UGX|USD|USN|UYI|UYU|UYW|UZS|VED|VES|VND|VUV|WST|XAD|XAF|XAG|XAU|XBA|XBB|XBC|XBD|XCD|XCG|XDR|XOF|XPD|XPF|XPT|XSU|XTS|XUA|XXX|YER|ZAR|ZMW|ZWG)$/,yi=/^[A-Z]{2}(?!00|01|99)\d{2}[A-Z0-9]{11,30}$/,rm="(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))";function n_(e){return new RegExp(`^${e}$`)}var bs=n_(rm);function Xa(e){let n="(?:[01]\\d|2[0-3]):[0-5]\\d";return typeof e.precision=="number"?e.precision===-1?`${n}`:e.precision===0?`${n}:[0-5]\\d`:`${n}:[0-5]\\d\\.\\d{${e.precision}}`:e.seconds?`${n}:[0-5]\\d(?:\\.\\d+)?`:`${n}(?::[0-5]\\d(?:\\.\\d+)?)?`}function _s(e){return new RegExp(`^${Xa(e)}$`)}function $s(e){let n=["Z"];e.offset&&n.push("([+-](?:[01]\\d|2[0-3]):[0-5]\\d)");let i=`${Xa({precision:e.precision,seconds:!0})}(?:${n.join("|")})`,o=e.local?`${i}|${Xa({precision:e.precision})}`:i;return new RegExp(`^${rm}T(?:${o})$`)}var ks=/^[\s\S]{0,}$/,xs=e=>{let n=e?`[\\s\\S]{${e?.minimum??0},${e?.maximum??""}}`:"[\\s\\S]*";return new RegExp(`^${n}$`)},ws=/^-?\d+n?$/,nr=/^-?\d+$/,qe=/^-?\d+(?:\.\d+)?$/,Is=/^(?:true|false)$/i,Ss=/^null$/i;var Ps=/^undefined$/i;var Ts=/^[^A-Z]*$/,Es=/^[^a-z]*$/,As=/^[0-9a-fA-F]*$/;function rr(e,n){return new RegExp(`^[A-Za-z0-9+/]{${e}}${n}$`)}function ir(e){return new RegExp(`^[A-Za-z0-9_-]{${e}}$`)}var r_=/^[0-9a-fA-F]{32}$/,i_=rr(22,"=="),o_=ir(22),a_=/^[0-9a-fA-F]{40}$/,s_=rr(27,"="),u_=ir(27),c_=/^[0-9a-fA-F]{64}$/,l_=rr(43,"="),d_=ir(43),p_=/^[0-9a-fA-F]{96}$/,m_=rr(64,""),f_=ir(64),g_=/^[0-9a-fA-F]{128}$/,h_=rr(86,"=="),v_=ir(86);var q=h("$ZodCheck",(e,n)=>{var i;e._zod??(e._zod={}),e._zod.def=n,(i=e._zod).onattach??(i.onattach=[])}),Os=e=>{let n=e.value;return!ni(n)&&n.size!==void 0},Ns=e=>{let n=e.value;return!ni(n)&&n.length!==void 0},bi={number:"number",bigint:"bigint",object:"date"},$i=h("$ZodCheckLessThan",(e,n)=>{q.init(e,n);let i=bi[typeof n.value];e._zod.check=o=>{(n.inclusive?o.value<=n.value:o.value<n.value)||o.issues.push({origin:bi[typeof o.value]??i,code:"too_big",maximum:typeof n.value=="object"?n.value.getTime():n.value,input:o.value,inclusive:n.inclusive,inst:e,continue:!n.abort})}}),ki=h("$ZodCheckGreaterThan",(e,n)=>{q.init(e,n);let i=bi[typeof n.value];e._zod.check=o=>{(n.inclusive?o.value>=n.value:o.value>n.value)||o.issues.push({origin:bi[typeof o.value]??i,code:"too_small",minimum:typeof n.value=="object"?n.value.getTime():n.value,input:o.value,inclusive:n.inclusive,inst:e,continue:!n.abort})}}),zs=h("$ZodCheckMultipleOf",(e,n)=>{q.init(e,n),e._zod.check=i=>{if(typeof i.value!=typeof n.value)throw new Error("Cannot mix number and bigint in multiple_of check.");(typeof i.value=="bigint"?n.value!==BigInt(0)&&i.value%n.value===BigInt(0):Vn(i.value,n.value)===0)||i.issues.push({origin:typeof i.value,code:"not_multiple_of",divisor:n.value,input:i.value,inst:e,continue:!n.abort})}}),Ds=h("$ZodCheckNumberFormat",(e,n)=>{q.init(e,n),n.format=n.format||"float64";let i=n.format?.includes("int"),o=i?"int":"number",[t,r]=Bn[n.format];e._zod.check=a=>{let s=a.value;if(i){if(!Number.isInteger(s)){a.issues.push({expected:o,format:n.format,code:"invalid_type",continue:!1,input:s,inst:e});return}if(!Number.isSafeInteger(s)){s>0?a.issues.push({input:s,code:"too_big",maximum:Number.MAX_SAFE_INTEGER,note:"Integers must be within the safe integer range.",inst:e,origin:o,inclusive:!0,continue:!n.abort}):a.issues.push({input:s,code:"too_small",minimum:Number.MIN_SAFE_INTEGER,note:"Integers must be within the safe integer range.",inst:e,origin:o,inclusive:!0,continue:!n.abort});return}}s<t&&a.issues.push({origin:"number",input:s,code:"too_small",minimum:t,inclusive:!0,inst:e,continue:!n.abort}),s>r&&a.issues.push({origin:"number",input:s,code:"too_big",maximum:r,inclusive:!0,inst:e,continue:!n.abort})}}),Cs=h("$ZodCheckBigIntFormat",(e,n)=>{q.init(e,n);let[i,o]=Hn[n.format];e._zod.check=t=>{let r=t.value;r<i&&t.issues.push({origin:"bigint",input:r,code:"too_small",minimum:i,inclusive:!0,inst:e,continue:!n.abort}),r>o&&t.issues.push({origin:"bigint",input:r,code:"too_big",maximum:o,inclusive:!0,inst:e,continue:!n.abort})}}),js=h("$ZodCheckMaxSize",(e,n)=>{var i;q.init(e,n),(i=e._zod.def).when??(i.when=Os),e._zod.check=o=>{let t=o.value;t.size<=n.maximum||o.issues.push({origin:Wn(t),code:"too_big",maximum:n.maximum,inclusive:!0,input:t,inst:e,continue:!n.abort})}}),Ls=h("$ZodCheckMinSize",(e,n)=>{var i;q.init(e,n),(i=e._zod.def).when??(i.when=Os),e._zod.check=o=>{let t=o.value;t.size>=n.minimum||o.issues.push({origin:Wn(t),code:"too_small",minimum:n.minimum,inclusive:!0,input:t,inst:e,continue:!n.abort})}}),Us=h("$ZodCheckSizeEquals",(e,n)=>{var i;q.init(e,n),(i=e._zod.def).when??(i.when=Os),e._zod.check=o=>{let t=o.value,r=t.size;if(r===n.size)return;let a=r>n.size;o.issues.push({origin:Wn(t),...a?{code:"too_big",maximum:n.size}:{code:"too_small",minimum:n.size},inclusive:!0,exact:!0,input:o.value,inst:e,continue:!n.abort})}}),Rs=h("$ZodCheckMaxLength",(e,n)=>{var i;q.init(e,n),(i=e._zod.def).when??(i.when=Ns),e._zod.check=o=>{let t=o.value,r=t.length;if((typeof t=="string"&&r>n.maximum?xt(t):r)<=n.maximum)return;let s=Jn(t);o.issues.push({origin:s,code:"too_big",maximum:n.maximum,inclusive:!0,input:t,inst:e,continue:!n.abort})}}),Ms=h("$ZodCheckMinLength",(e,n)=>{var i;q.init(e,n),(i=e._zod.def).when??(i.when=Ns),e._zod.check=o=>{let t=o.value,r=t.length;if((typeof t=="string"&&r>=n.minimum&&r<n.minimum*2?xt(t):r)>=n.minimum)return;let s=Jn(t);o.issues.push({origin:s,code:"too_small",minimum:n.minimum,inclusive:!0,input:t,inst:e,continue:!n.abort})}}),Zs=h("$ZodCheckLengthEquals",(e,n)=>{var i;q.init(e,n),(i=e._zod.def).when??(i.when=Ns),e._zod.check=o=>{let t=o.value,r=t.length,a=typeof t=="string"&&r>=n.length&&r<=n.length*2?xt(t):r;if(a===n.length)return;let s=Jn(t),u=a>n.length;o.issues.push({origin:s,...u?{code:"too_big",maximum:n.length}:{code:"too_small",minimum:n.length},inclusive:!0,exact:!0,input:o.value,inst:e,continue:!n.abort})}}),nn=h("$ZodCheckStringFormat",(e,n)=>{var i,o;q.init(e,n),n.pattern?(i=e._zod).check??(i.check=t=>{n.pattern.lastIndex=0,!n.pattern.test(t.value)&&t.issues.push({origin:"string",code:"invalid_format",format:n.format,input:t.value,...n.pattern?{pattern:n.pattern.toString()}:{},inst:e,continue:!n.abort})}):(o=e._zod).check??(o.check=()=>{})}),Vs=h("$ZodCheckRegex",(e,n)=>{nn.init(e,n),e._zod.check=i=>{n.pattern.lastIndex=0,!n.pattern.test(i.value)&&i.issues.push({origin:"string",code:"invalid_format",format:"regex",input:i.value,pattern:n.pattern.toString(),inst:e,continue:!n.abort})}}),Gs=h("$ZodCheckLowerCase",(e,n)=>{n.pattern??(n.pattern=Ts),nn.init(e,n)}),Fs=h("$ZodCheckUpperCase",(e,n)=>{n.pattern??(n.pattern=Es),nn.init(e,n)}),Bs=h("$ZodCheckIncludes",(e,n)=>{q.init(e,n);let i=Se(n.includes),o=new RegExp(typeof n.position=="number"?`^.{${n.position},}${i}`:i);n.pattern=o,e._zod.check=t=>{t.value.includes(n.includes,n.position)||t.issues.push({origin:"string",code:"invalid_format",format:"includes",includes:n.includes,input:t.value,inst:e,continue:!n.abort})}}),Hs=h("$ZodCheckStartsWith",(e,n)=>{q.init(e,n);let i=new RegExp(`^${Se(n.prefix)}.*`);n.pattern??(n.pattern=i),e._zod.check=o=>{o.value.startsWith(n.prefix)||o.issues.push({origin:"string",code:"invalid_format",format:"starts_with",prefix:n.prefix,input:o.value,inst:e,continue:!n.abort})}}),Ks=h("$ZodCheckEndsWith",(e,n)=>{q.init(e,n);let i=new RegExp(`.*${Se(n.suffix)}$`);n.pattern??(n.pattern=i),e._zod.check=o=>{o.value.endsWith(n.suffix)||o.issues.push({origin:"string",code:"invalid_format",format:"ends_with",suffix:n.suffix,input:o.value,inst:e,continue:!n.abort})}});function _i(e,n,i){e.issues.length&&n.issues.push(...ye(i,e.issues))}var Ws=h("$ZodCheckProperty",(e,n)=>{q.init(e,n),e._zod.check=i=>{let o=n.schema._zod.run({value:i.value[n.property],issues:[]},{});if(o instanceof Promise)return o.then(t=>_i(t,i,n.property));_i(o,i,n.property)}}),Js=h("$ZodCheckProperties",(e,n)=>{q.init(e,n),Xn(e,Symbol.iterator,function*(){yield e});let i;e._zod.check=o=>{if(o.value==null){o.issues.push({expected:"object",code:"invalid_type",input:o.value,inst:e});return}i??(i=Reflect.ownKeys(n.shape).map(a=>[a,n.shape[a]]));let t=o.value,r;for(let[a,s]of i){let u=s._zod.run({value:t[a],issues:[]},{});u instanceof Promise?(r??(r=[]),r.push(u.then(c=>_i(c,o,a)))):_i(u,o,a)}if(r)return Promise.all(r).then(()=>{})}}),Xs=h("$ZodCheckMimeType",(e,n)=>{q.init(e,n);let i=new Set(n.mime);e._zod.check=o=>{i.has(o.value.type)||o.issues.push({code:"invalid_value",values:n.mime,input:o.value.type,inst:e,continue:!n.abort})}}),qs=h("$ZodCheckOverwrite",(e,n)=>{q.init(e,n),e._zod.check=i=>{i.value=n.tx(i.value)}});var It=class{constructor(n=[],i={}){this.content=[],this.indent=0,this.args=n,this.closed=i}indented(n){this.indent+=1;try{n(this)}finally{this.indent-=1}}write(n){if(typeof n=="function"){n(this,{execution:"sync"}),n(this,{execution:"async"});return}let o=n.split(` diff --git a/skill-guides/orca-per-workspace-env/references/provider-vercel.md b/skill-guides/orca-per-workspace-env/references/provider-vercel.md index 06377695e3a..69f52dff6fd 100644 --- a/skill-guides/orca-per-workspace-env/references/provider-vercel.md +++ b/skill-guides/orca-per-workspace-env/references/provider-vercel.md @@ -138,7 +138,7 @@ vercel sandbox exec "$name" ${vercel_args[@]+"${vercel_args[@]}"} --timeout 20m rm -f /tmp/askpass.sh; \ c="$(git rev-parse HEAD)"; [ -f .orca-built ] && [ "$(cat .orca-built)" = "$c" ] || { \ pnpm install --prefer-offline && pnpm run build:cli && \ - node config/scripts/run-electron-vite-build.mjs --config config/electron-vite.vm-serve.config.ts && \ + node config/scripts/desktop-build/execution/run-electron-vite-build.mjs --config config/electron-vite.vm-serve.config.ts && \ printf "%s" "$c" > .orca-built; }' >&2 # 3. (remote) start orca serve in the background, writing recipe JSON to a file; poll until it parses diff --git a/src/cli/bundled-skill-guides.ts b/src/cli/bundled-skill-guides.ts index 8c9620b7796..8cc21507351 100644 --- a/src/cli/bundled-skill-guides.ts +++ b/src/cli/bundled-skill-guides.ts @@ -2350,7 +2350,7 @@ const ORCA_PER_WORKSPACE_ENV_PROVIDER_VERCEL_REFERENCE_MARKDOWN = [ " rm -f /tmp/askpass.sh; \\", " c=\"$(git rev-parse HEAD)\"; [ -f .orca-built ] && [ \"$(cat .orca-built)\" = \"$c\" ] || { \\", " pnpm install --prefer-offline && pnpm run build:cli && \\", - " node config/scripts/run-electron-vite-build.mjs --config config/electron-vite.vm-serve.config.ts && \\", + " node config/scripts/desktop-build/execution/run-electron-vite-build.mjs --config config/electron-vite.vm-serve.config.ts && \\", " printf \"%s\" \"$c\" > .orca-built; }' >&2", "", "# 3. (remote) start orca serve in the background, writing recipe JSON to a file; poll until it parses", diff --git a/src/main/agent-hooks/managed-hook-script-refresh-main-thread.test.ts b/src/main/agent-hooks/managed-hook-script-refresh-main-thread.test.ts index 994301795bf..0b8d5f9bfc5 100644 --- a/src/main/agent-hooks/managed-hook-script-refresh-main-thread.test.ts +++ b/src/main/agent-hooks/managed-hook-script-refresh-main-thread.test.ts @@ -4,7 +4,7 @@ import { tmpdir } from 'node:os' import type * as NodeOsModule from 'node:os' import { join } from 'node:path' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' const state = vi.hoisted((): { home: string; syncCalls: { name: string; target: string }[] } => ({ home: '', diff --git a/src/main/agent-hooks/windows-native-hook-exe.test-fixture.ts b/src/main/agent-hooks/windows-native-hook-exe.test-fixture.ts index 2fc7e10de9d..627344e1d8d 100644 --- a/src/main/agent-hooks/windows-native-hook-exe.test-fixture.ts +++ b/src/main/agent-hooks/windows-native-hook-exe.test-fixture.ts @@ -17,7 +17,16 @@ export function buildWindowsNativeHookExecutable(): string { if (!built) { const result = runProcessSync({ program: process.execPath, - args: [join(REPO_ROOT, 'config', 'scripts', 'build-windows-agent-hook.mjs')], + args: [ + join( + REPO_ROOT, + 'config', + 'scripts', + 'native-build', + 'windows', + 'build-windows-agent-hook.mjs' + ) + ], cwd: REPO_ROOT, timeoutMs: 300_000 }) diff --git a/src/main/agent-hooks/wsl-hook-relay-live.integration.test.ts b/src/main/agent-hooks/wsl-hook-relay-live.integration.test.ts index 4c485e647f0..ff5e36fe1fd 100644 --- a/src/main/agent-hooks/wsl-hook-relay-live.integration.test.ts +++ b/src/main/agent-hooks/wsl-hook-relay-live.integration.test.ts @@ -37,10 +37,14 @@ describe.skipIf(process.platform === 'win32')( beforeAll(() => { if (!existsSync(BUNDLE_JS)) { - execFileSync(process.execPath, [join('config', 'scripts', 'build-wsl-guest.mjs')], { - cwd: process.cwd(), - stdio: 'ignore' - }) + execFileSync( + process.execPath, + [join('config', 'scripts', 'remote-host-build', 'wsl-guest', 'build-wsl-guest.mjs')], + { + cwd: process.cwd(), + stdio: 'ignore' + } + ) } }, 120_000) diff --git a/src/main/automations/automation-owner-fencing.test.ts b/src/main/automations/automation-owner-fencing.test.ts index 1b46b75735e..faa154ab17f 100644 --- a/src/main/automations/automation-owner-fencing.test.ts +++ b/src/main/automations/automation-owner-fencing.test.ts @@ -14,7 +14,7 @@ import type { Repo } from '../../shared/repo-types' import type { SshTarget } from '../../shared/ssh-types' import { getDefaultPersistedState } from '../../shared/constants' import { AUTOMATION_OWNER_CONFLICT_CODES } from '../../shared/automation-owner-conflict' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' let hasCreatedStoreInCase = false diff --git a/src/main/automations/automation-update-host-retarget.test.ts b/src/main/automations/automation-update-host-retarget.test.ts index b6bba50de3c..5c0821e8159 100644 --- a/src/main/automations/automation-update-host-retarget.test.ts +++ b/src/main/automations/automation-update-host-retarget.test.ts @@ -16,7 +16,7 @@ import type { SshTarget } from '../../shared/ssh-types' import { getDefaultPersistedState } from '../../shared/constants' import { AUTOMATION_ORPHAN_ISSUES } from '../../shared/automation-list-scope' import { AUTOMATION_OWNER_CONFLICT_CODES } from '../../shared/automation-owner-conflict' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' let hasCreatedStoreInCase = false diff --git a/src/main/automations/automation-workspace-host-attribution.test.ts b/src/main/automations/automation-workspace-host-attribution.test.ts index de590275903..34abf5b45d9 100644 --- a/src/main/automations/automation-workspace-host-attribution.test.ts +++ b/src/main/automations/automation-workspace-host-attribution.test.ts @@ -18,7 +18,7 @@ import type { SshTarget } from '../../shared/ssh-types' import { getDefaultPersistedState } from '../../shared/constants' import { AUTOMATION_ORPHAN_ISSUES } from '../../shared/automation-list-scope' import { AutomationService } from './service' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' let hasCreatedStoreInCase = false diff --git a/src/main/automations/service-precheck.test.ts b/src/main/automations/service-precheck.test.ts index 01b56fa0538..11c5ef9f2b7 100644 --- a/src/main/automations/service-precheck.test.ts +++ b/src/main/automations/service-precheck.test.ts @@ -15,7 +15,7 @@ import type { Repo } from '../../shared/repo-types' import { AutomationService } from './service' import { runHeadlessAutomationDispatch } from './headless-dispatch-runner' import { createAutomationRunWriter } from './automation-run-writer' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import type * as PrecheckRunner from './precheck-runner' const runAutomationPrecheckMock = vi.hoisted(() => vi.fn()) diff --git a/src/main/cli/orca-cli-child-path.test.ts b/src/main/cli/orca-cli-child-path.test.ts index 28394099360..59bedaadec6 100644 --- a/src/main/cli/orca-cli-child-path.test.ts +++ b/src/main/cli/orca-cli-child-path.test.ts @@ -1,6 +1,6 @@ import { join } from 'node:path' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' const shim = vi.hoisted(() => ({ ensureLinuxTerminalOrcaCliShimDir: vi.fn() })) vi.mock('./linux-terminal-orca-cli-shim', () => shim) diff --git a/src/main/cli/packaged-cli-assets.test.ts b/src/main/cli/packaged-cli-assets.test.ts index 746a4ed67df..8f7630191e1 100644 --- a/src/main/cli/packaged-cli-assets.test.ts +++ b/src/main/cli/packaged-cli-assets.test.ts @@ -19,7 +19,7 @@ import { fileURLToPath } from 'node:url' import { createPackageWithOptions, statFile } from '@electron/asar' import { describe, expect, it } from 'vitest' import { runProcess } from '@orca/process-host' -import { stagePackagedProcessHost } from '../../../config/scripts/packaged-process-host-fixture.mjs' +import { stagePackagedProcessHost } from '../../../config/scripts/desktop-distribution/runtime-verification/packaged-process-host-fixture.mjs' const require = createRequire(import.meta.url) const execFileAsync = promisify(execFile) diff --git a/src/main/cli/wsl-managed-cli.wsl.test.ts b/src/main/cli/wsl-managed-cli.wsl.test.ts index 52f0884a446..896fe004b2b 100644 --- a/src/main/cli/wsl-managed-cli.wsl.test.ts +++ b/src/main/cli/wsl-managed-cli.wsl.test.ts @@ -5,7 +5,7 @@ import { expect, it } from 'vitest' import { runProcess } from '@orca/process-host' import { removeTree } from '../../shared/windows-transient-lock-removal' import { buildWslExecArgs } from '../../shared/wsl-login-shell-command' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { addOrcaWslInteropEnv } from '../pty/shell-startup/wsl-orca-env' import { getManagedWslCliDir } from './wsl-managed-cli' import { buildLocalShellReadyWrapperFiles } from '../providers/local-pty/local-pty-shell-ready-wrapper-fileset' diff --git a/src/main/codex-accounts/runtime-home-catalog-account-key.test.ts b/src/main/codex-accounts/runtime-home-catalog-account-key.test.ts index 5eacaba65a1..8cb7cc2b8d1 100644 --- a/src/main/codex-accounts/runtime-home-catalog-account-key.test.ts +++ b/src/main/codex-accounts/runtime-home-catalog-account-key.test.ts @@ -1,6 +1,6 @@ import type * as NodeOs from 'node:os' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import type { AgentSessionAccountHome } from '../../shared/agent-session/lifecycle/agent-session-account-home' import { createSettings } from './runtime-home-settings-test-fixtures' import { diff --git a/src/main/codex-accounts/runtime-home-catalog-probe-prep.test.ts b/src/main/codex-accounts/runtime-home-catalog-probe-prep.test.ts index 5c2ab629567..3e70685c424 100644 --- a/src/main/codex-accounts/runtime-home-catalog-probe-prep.test.ts +++ b/src/main/codex-accounts/runtime-home-catalog-probe-prep.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs' import { dirname } from 'node:path' import type * as NodeOs from 'node:os' diff --git a/src/main/codex-accounts/runtime-home-history-sharing-opt-out.test.ts b/src/main/codex-accounts/runtime-home-history-sharing-opt-out.test.ts index 6b008ed54b2..61cb42d744d 100644 --- a/src/main/codex-accounts/runtime-home-history-sharing-opt-out.test.ts +++ b/src/main/codex-accounts/runtime-home-history-sharing-opt-out.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { existsSync } from 'node:fs' import { join } from 'node:path' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { createSettings } from './runtime-home-settings-test-fixtures' import { createCodexAccountRecord, diff --git a/src/main/codex-accounts/runtime-home-legacy-migration.test.ts b/src/main/codex-accounts/runtime-home-legacy-migration.test.ts index e5293cfc270..350b8f88218 100644 --- a/src/main/codex-accounts/runtime-home-legacy-migration.test.ts +++ b/src/main/codex-accounts/runtime-home-legacy-migration.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { existsSync, mkdirSync, diff --git a/src/main/codex-accounts/runtime-home-managed-auth-recovery.test.ts b/src/main/codex-accounts/runtime-home-managed-auth-recovery.test.ts index 8874f269e23..770816a405f 100644 --- a/src/main/codex-accounts/runtime-home-managed-auth-recovery.test.ts +++ b/src/main/codex-accounts/runtime-home-managed-auth-recovery.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { existsSync, readFileSync, rmSync, writeFileSync } from 'node:fs' import { join } from 'node:path' import { createSettings } from './runtime-home-settings-test-fixtures' diff --git a/src/main/codex-accounts/runtime-home-mirror-login-copy.test.ts b/src/main/codex-accounts/runtime-home-mirror-login-copy.test.ts index e1d40c09723..97b38d442fd 100644 --- a/src/main/codex-accounts/runtime-home-mirror-login-copy.test.ts +++ b/src/main/codex-accounts/runtime-home-mirror-login-copy.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { existsSync, readFileSync, rmSync, writeFileSync } from 'node:fs' import { createSettings } from './runtime-home-settings-test-fixtures' import { diff --git a/src/main/codex-accounts/runtime-home-per-account-homes.test.ts b/src/main/codex-accounts/runtime-home-per-account-homes.test.ts index e81c78c99f8..e323ea6e67f 100644 --- a/src/main/codex-accounts/runtime-home-per-account-homes.test.ts +++ b/src/main/codex-accounts/runtime-home-per-account-homes.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs' import { join } from 'node:path' import { createSettings } from './runtime-home-settings-test-fixtures' diff --git a/src/main/codex-accounts/runtime-home-read-only-launch-resolution.test.ts b/src/main/codex-accounts/runtime-home-read-only-launch-resolution.test.ts index e943072627f..0240bfdfa74 100644 --- a/src/main/codex-accounts/runtime-home-read-only-launch-resolution.test.ts +++ b/src/main/codex-accounts/runtime-home-read-only-launch-resolution.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { realpathSync, writeFileSync } from 'node:fs' import type * as NodeFs from 'node:fs' import type * as CodexConfigMirror from '../codex/configuration/settings/codex-config-mirror' diff --git a/src/main/codex-accounts/runtime-home-real-home-lane-routing.test.ts b/src/main/codex-accounts/runtime-home-real-home-lane-routing.test.ts index 4d9dce7e377..12d792683cc 100644 --- a/src/main/codex-accounts/runtime-home-real-home-lane-routing.test.ts +++ b/src/main/codex-accounts/runtime-home-real-home-lane-routing.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs' import { join } from 'node:path' import { createSettings } from './runtime-home-settings-test-fixtures' diff --git a/src/main/codex-accounts/runtime-home-resume-selection-gate.test.ts b/src/main/codex-accounts/runtime-home-resume-selection-gate.test.ts index 6d8a9b34f35..0e16a6cc0ec 100644 --- a/src/main/codex-accounts/runtime-home-resume-selection-gate.test.ts +++ b/src/main/codex-accounts/runtime-home-resume-selection-gate.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { realpathSync, writeFileSync } from 'node:fs' import type * as NodeFs from 'node:fs' import { join } from 'node:path' diff --git a/src/main/codex-accounts/runtime-home-retained-auth-provenance.test.ts b/src/main/codex-accounts/runtime-home-retained-auth-provenance.test.ts index eef4ea0a0f8..92fa9f907ff 100644 --- a/src/main/codex-accounts/runtime-home-retained-auth-provenance.test.ts +++ b/src/main/codex-accounts/runtime-home-retained-auth-provenance.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { existsSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from 'node:fs' import { join } from 'node:path' import { createSettings } from './runtime-home-settings-test-fixtures' diff --git a/src/main/codex-accounts/runtime-home-service-per-account-migration.test.ts b/src/main/codex-accounts/runtime-home-service-per-account-migration.test.ts index fb920b27b9d..84628272ffe 100644 --- a/src/main/codex-accounts/runtime-home-service-per-account-migration.test.ts +++ b/src/main/codex-accounts/runtime-home-service-per-account-migration.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { existsSync, mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' diff --git a/src/main/codex-accounts/runtime-home-session-discovery-read-only.test.ts b/src/main/codex-accounts/runtime-home-session-discovery-read-only.test.ts index 3194fb2c9f2..2e69857ecd2 100644 --- a/src/main/codex-accounts/runtime-home-session-discovery-read-only.test.ts +++ b/src/main/codex-accounts/runtime-home-session-discovery-read-only.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { existsSync, readdirSync, rmSync } from 'node:fs' import type * as NodeOs from 'node:os' import { join } from 'node:path' diff --git a/src/main/codex-accounts/runtime-home-system-default-mirror-readback.test.ts b/src/main/codex-accounts/runtime-home-system-default-mirror-readback.test.ts index cfb70abc6d0..317498c1322 100644 --- a/src/main/codex-accounts/runtime-home-system-default-mirror-readback.test.ts +++ b/src/main/codex-accounts/runtime-home-system-default-mirror-readback.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { chmodSync, existsSync, readFileSync, rmSync, statSync, writeFileSync } from 'node:fs' import { join } from 'node:path' import { createSettings } from './runtime-home-settings-test-fixtures' diff --git a/src/main/codex-accounts/runtime-home-system-default-snapshot.test.ts b/src/main/codex-accounts/runtime-home-system-default-snapshot.test.ts index 9739717b83e..b536e5f4055 100644 --- a/src/main/codex-accounts/runtime-home-system-default-snapshot.test.ts +++ b/src/main/codex-accounts/runtime-home-system-default-snapshot.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { chmodSync, existsSync, diff --git a/src/main/codex-accounts/service-account-add-login.test.ts b/src/main/codex-accounts/service-account-add-login.test.ts index 6c4aebbfc1f..ef209da791a 100644 --- a/src/main/codex-accounts/service-account-add-login.test.ts +++ b/src/main/codex-accounts/service-account-add-login.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi, beforeEach } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { EventEmitter } from 'node:events' import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs' import { join } from 'node:path' diff --git a/src/main/codex-accounts/service-account-selection-and-removal.test.ts b/src/main/codex-accounts/service-account-selection-and-removal.test.ts index 9c19f155cbc..6d83db52d11 100644 --- a/src/main/codex-accounts/service-account-selection-and-removal.test.ts +++ b/src/main/codex-accounts/service-account-selection-and-removal.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi, beforeEach } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { existsSync, readFileSync } from 'node:fs' import { join } from 'node:path' import { diff --git a/src/main/codex-accounts/service-device-code-login.test.ts b/src/main/codex-accounts/service-device-code-login.test.ts index d9814212bb9..874ca15f285 100644 --- a/src/main/codex-accounts/service-device-code-login.test.ts +++ b/src/main/codex-accounts/service-device-code-login.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { EventEmitter } from 'node:events' import { writeFileSync } from 'node:fs' import { join } from 'node:path' diff --git a/src/main/codex-accounts/service-managed-home-identity.test.ts b/src/main/codex-accounts/service-managed-home-identity.test.ts index 9cb15cf3f83..8d227d5015a 100644 --- a/src/main/codex-accounts/service-managed-home-identity.test.ts +++ b/src/main/codex-accounts/service-managed-home-identity.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi, beforeEach } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { EventEmitter } from 'node:events' import { readFileSync, rmSync, writeFileSync } from 'node:fs' import { join } from 'node:path' diff --git a/src/main/codex-accounts/service-reauthenticate-activation.test.ts b/src/main/codex-accounts/service-reauthenticate-activation.test.ts index 5056b0d7af6..bff99200a20 100644 --- a/src/main/codex-accounts/service-reauthenticate-activation.test.ts +++ b/src/main/codex-accounts/service-reauthenticate-activation.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi, beforeEach } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { EventEmitter } from 'node:events' import { writeFileSync } from 'node:fs' import { join } from 'node:path' diff --git a/src/main/codex-accounts/service-reset-credit-durability.test.ts b/src/main/codex-accounts/service-reset-credit-durability.test.ts index f8ce50735c9..6201ebcd86b 100644 --- a/src/main/codex-accounts/service-reset-credit-durability.test.ts +++ b/src/main/codex-accounts/service-reset-credit-durability.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi, beforeEach } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import type { RateLimitState } from '../../shared/rate-limit-types' import { buildCodexResetCreditExpectedScope } from '../../shared/codex-reset-credit-scope' import { diff --git a/src/main/codex-accounts/service-reset-credit-home-ownership.test.ts b/src/main/codex-accounts/service-reset-credit-home-ownership.test.ts index c6ce8a7d106..15dea633c08 100644 --- a/src/main/codex-accounts/service-reset-credit-home-ownership.test.ts +++ b/src/main/codex-accounts/service-reset-credit-home-ownership.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi, beforeEach } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { join } from 'node:path' import { realpathSync, readFileSync, readdirSync, writeFileSync } from 'node:fs' import type * as NodeFs from 'node:fs' diff --git a/src/main/codex-accounts/service-reset-credit-retry-routing.test.ts b/src/main/codex-accounts/service-reset-credit-retry-routing.test.ts index b7518e1040b..1e22a44054b 100644 --- a/src/main/codex-accounts/service-reset-credit-retry-routing.test.ts +++ b/src/main/codex-accounts/service-reset-credit-retry-routing.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import type { RateLimitState } from '../../shared/rate-limit-types' import { buildCodexResetCreditExpectedScope } from '../../shared/codex-reset-credit-scope' import { diff --git a/src/main/codex-accounts/service-reset-credit-target-routing.test.ts b/src/main/codex-accounts/service-reset-credit-target-routing.test.ts index 2846503affa..c652e0ca3fa 100644 --- a/src/main/codex-accounts/service-reset-credit-target-routing.test.ts +++ b/src/main/codex-accounts/service-reset-credit-target-routing.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi, beforeEach } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { existsSync } from 'node:fs' import { buildCodexResetCreditExpectedScope } from '../../shared/codex-reset-credit-scope' import { diff --git a/src/main/codex-accounts/service-system-default-identity.test.ts b/src/main/codex-accounts/service-system-default-identity.test.ts index 51a87a43558..2b61f5bbe4e 100644 --- a/src/main/codex-accounts/service-system-default-identity.test.ts +++ b/src/main/codex-accounts/service-system-default-identity.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi, beforeEach } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { writeFileSync } from 'node:fs' import { join } from 'node:path' import { diff --git a/src/main/codex-accounts/service.test.ts b/src/main/codex-accounts/service.test.ts index ca93e442277..e36ca0fd45c 100644 --- a/src/main/codex-accounts/service.test.ts +++ b/src/main/codex-accounts/service.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi, beforeEach } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { mkdirSync, readFileSync, statSync, utimesSync, writeFileSync } from 'node:fs' import { join } from 'node:path' import { diff --git a/src/main/codex-accounts/sta-4422-transient-ownership-error.test.ts b/src/main/codex-accounts/sta-4422-transient-ownership-error.test.ts index e9dae685612..77df7cd066b 100644 --- a/src/main/codex-accounts/sta-4422-transient-ownership-error.test.ts +++ b/src/main/codex-accounts/sta-4422-transient-ownership-error.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { realpathSync, writeFileSync } from 'node:fs' import type * as NodeFs from 'node:fs' import { join } from 'node:path' diff --git a/src/main/codex-accounts/sta-4734-login-rollback-deletes-authenticated-home.test.ts b/src/main/codex-accounts/sta-4734-login-rollback-deletes-authenticated-home.test.ts index e6827b53edd..f259ea6ef57 100644 --- a/src/main/codex-accounts/sta-4734-login-rollback-deletes-authenticated-home.test.ts +++ b/src/main/codex-accounts/sta-4734-login-rollback-deletes-authenticated-home.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi, beforeEach } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { EventEmitter } from 'node:events' import type * as NodeFs from 'node:fs' import type * as HostCodexManagedHomeOwnership from './host-codex-managed-home-ownership' diff --git a/src/main/ipc/filesystem/access/local-file-access-resolution.test.ts b/src/main/ipc/filesystem/access/local-file-access-resolution.test.ts index def8c5c97be..846cb11de94 100644 --- a/src/main/ipc/filesystem/access/local-file-access-resolution.test.ts +++ b/src/main/ipc/filesystem/access/local-file-access-resolution.test.ts @@ -2,7 +2,7 @@ import { mkdir, mkdtemp, realpath, rm, stat, symlink, writeFile } from 'node:fs/ import { homedir, tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import type { Store } from '../../../persistence/loading-store/store' import type * as RepoWorktrees from '../../../workspaces/catalog/repo-worktrees' import { resolveAuthorizedPath } from './filesystem-auth' diff --git a/src/main/ipc/floating-workspace-directory.test.ts b/src/main/ipc/floating-workspace-directory.test.ts index ebf5378be67..edf4d19ad54 100644 --- a/src/main/ipc/floating-workspace-directory.test.ts +++ b/src/main/ipc/floating-workspace-directory.test.ts @@ -2,7 +2,7 @@ import { mkdtemp, mkdir, realpath, rm, symlink, unlink } from 'node:fs/promises' import os from 'node:os' import path from 'node:path' import { afterEach, beforeEach, describe, expect, it } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import type { GlobalSettings } from '../../shared/global-settings-types' import { diff --git a/src/main/ipc/profiles/orca-profiles.test.ts b/src/main/ipc/profiles/orca-profiles.test.ts index 223de0a97c6..5339a0312ee 100644 --- a/src/main/ipc/profiles/orca-profiles.test.ts +++ b/src/main/ipc/profiles/orca-profiles.test.ts @@ -89,7 +89,7 @@ vi.mock('../../orca-profiles/profile-storage-paths', async (importOriginal) => ( })) import { registerOrcaProfileHandlers } from './orca-profiles' -import { installFakeAppEnvironment } from '../../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' const ipcEvent = { sender: { isDestroyed: () => false, send: vi.fn() } } diff --git a/src/main/ipc/pty/pty-ipc-suite-environment.ts b/src/main/ipc/pty/pty-ipc-suite-environment.ts index 101d1337637..2f5b985e27f 100644 --- a/src/main/ipc/pty/pty-ipc-suite-environment.ts +++ b/src/main/ipc/pty/pty-ipc-suite-environment.ts @@ -1,7 +1,7 @@ import { afterEach, beforeEach, vi } from 'vitest' import * as electron from 'electron' import { join } from 'node:path' -import { installFakeAppEnvironment } from '../../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { setPtyHostBindings } from './pty-host-bindings' import { testPtyIpcSurface } from './pty-ipc-test-surface' import type { Mock } from 'vitest' diff --git a/src/main/orca-profiles/profile-index-store.test.ts b/src/main/orca-profiles/profile-index-store.test.ts index 057cafe3aba..3dcc8d9f745 100644 --- a/src/main/orca-profiles/profile-index-store.test.ts +++ b/src/main/orca-profiles/profile-index-store.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { existsSync, mkdtempSync, diff --git a/src/main/orcad/orcad-account-services.test.ts b/src/main/orcad/orcad-account-services.test.ts index 7ff907857a3..75cee4f8235 100644 --- a/src/main/orcad/orcad-account-services.test.ts +++ b/src/main/orcad/orcad-account-services.test.ts @@ -7,7 +7,7 @@ import { ProfileStateSqliteAuthority } from '../persistence/profile-state/profil import { OrcaRuntimeService } from '../runtime/orca-runtime' import { eraseRpcMethods, isStreamingMethod } from '../runtime/rpc/core' import { ACCOUNT_METHODS } from '../runtime/rpc/methods/accounts' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { createOrcadAccountServices } from './orcad-account-services' import { USAGE_CREDENTIALS_RUNTIME_CAPABILITY } from '../../shared/account-runtime-capabilities' import type { OrcadRuntimeCleanup } from './orcad-runtime-lifetime' diff --git a/src/main/orcad/orcad-bundle-native-load-order.test.ts b/src/main/orcad/orcad-bundle-native-load-order.test.ts index 2cc6e63753e..985a8e5dd0e 100644 --- a/src/main/orcad/orcad-bundle-native-load-order.test.ts +++ b/src/main/orcad/orcad-bundle-native-load-order.test.ts @@ -18,7 +18,9 @@ it('loads a fresh production import graph before requiring native PTY code', () const directory = mkdtempSync(join(tmpdir(), 'orcad-load-order-')) directories.push(directory) const bundle = join(directory, 'orcad.js') - const builder = pathToFileURL(join(REPO_ROOT, 'config/scripts/orcad-entry-build.mjs')).href + const builder = pathToFileURL( + join(REPO_ROOT, 'config/scripts/orcad-distribution/server-bundle/orcad-entry-build.mjs') + ).href const built = runProcessSync({ program: process.execPath, args: [ diff --git a/src/main/orcad/orcad-cli-launcher.integration.test.ts b/src/main/orcad/orcad-cli-launcher.integration.test.ts index eac0b8e6acf..6d916e13d0f 100644 --- a/src/main/orcad/orcad-cli-launcher.integration.test.ts +++ b/src/main/orcad/orcad-cli-launcher.integration.test.ts @@ -2,7 +2,7 @@ import { existsSync, mkdirSync, mkdtempSync, writeFileSync } from 'node:fs' import { tmpdir } from 'node:os' import { join, resolve } from 'node:path' import { expect, it } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { runProcess, spawnProcess } from '@orca/process-host' import { sealedChildEnv } from '../runtime/structured-session-child-env.test-support' import { resolveBundledOrcadRuntime } from './orcad-bundled-runtime' diff --git a/src/main/orcad/orcad-help.integration.test.ts b/src/main/orcad/orcad-help.integration.test.ts index f0f98a96f08..e121ef4f9b2 100644 --- a/src/main/orcad/orcad-help.integration.test.ts +++ b/src/main/orcad/orcad-help.integration.test.ts @@ -12,7 +12,9 @@ let launcher = '' beforeAll(async () => { directory = await mkdtemp(join(tmpdir(), 'orcad-help-')) launcher = join(directory, ORCAD_LAUNCHER_FILENAME) - const builder = pathToFileURL(join(process.cwd(), 'config/scripts/orcad-entry-build.mjs')).href + const builder = pathToFileURL( + join(process.cwd(), 'config/scripts/orcad-distribution/server-bundle/orcad-entry-build.mjs') + ).href const built = await runProcess({ program: process.execPath, args: [ diff --git a/src/main/orcad/orcad-launcher-isolation.integration.test.ts b/src/main/orcad/orcad-launcher-isolation.integration.test.ts index 372398c6a39..4cfc10f784c 100644 --- a/src/main/orcad/orcad-launcher-isolation.integration.test.ts +++ b/src/main/orcad/orcad-launcher-isolation.integration.test.ts @@ -26,7 +26,9 @@ const SERVER_FIXTURE = [ ].join('\n') async function buildLauncher(entry: string): Promise<string[]> { - const builder = pathToFileURL(join(process.cwd(), 'config/scripts/orcad-entry-build.mjs')).href + const builder = pathToFileURL( + join(process.cwd(), 'config/scripts/orcad-distribution/server-bundle/orcad-entry-build.mjs') + ).href const result = await runProcess({ program: process.execPath, args: [ diff --git a/src/main/orcad/orcad-runtime-entry-artifacts.test.ts b/src/main/orcad/orcad-runtime-entry-artifacts.test.ts index 6cfcec11efe..14a272eccfc 100644 --- a/src/main/orcad/orcad-runtime-entry-artifacts.test.ts +++ b/src/main/orcad/orcad-runtime-entry-artifacts.test.ts @@ -18,7 +18,9 @@ afterAll(() => { }) function buildOrcadBundles(): string[] { - const builder = pathToFileURL(join(REPO_ROOT, 'config/scripts/orcad-entry-build.mjs')).href + const builder = pathToFileURL( + join(REPO_ROOT, 'config/scripts/orcad-distribution/server-bundle/orcad-entry-build.mjs') + ).href const script = ` import { build } from 'esbuild' import { join } from 'node:path' @@ -57,7 +59,9 @@ it('ships every worker and child entry orcad loads at runtime', () => { }) it('ships every child entry build-orcad.mjs builds', async () => { - const builder = pathToFileURL(join(REPO_ROOT, 'config/scripts/orcad-entry-build.mjs')).href + const builder = pathToFileURL( + join(REPO_ROOT, 'config/scripts/orcad-distribution/server-bundle/orcad-entry-build.mjs') + ).href const entries = await import(builder) const shipped = new Set(orcadArtifactFilenames('linux-x64-glibc', [])) const built = Object.values<string>(entries.ORCAD_CHILD_ENTRY_POINTS).map((entry) => diff --git a/src/main/orcad/orcad-speech-services.test.ts b/src/main/orcad/orcad-speech-services.test.ts index 69a08af8f85..c6388d9342f 100644 --- a/src/main/orcad/orcad-speech-services.test.ts +++ b/src/main/orcad/orcad-speech-services.test.ts @@ -2,7 +2,7 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, describe, expect, it } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { getDefaultVoiceSettings } from '../../shared/constants' import type { VoiceSettings } from '../../shared/speech-types' import { SPEECH_RECOGNIZER_DIR_ENV } from '../../shared/speech-recognizer-package' diff --git a/src/main/persistence/applying-settings/persistence-ui-state.test.ts b/src/main/persistence/applying-settings/persistence-ui-state.test.ts index 8f247263360..0cf20a0bc63 100644 --- a/src/main/persistence/applying-settings/persistence-ui-state.test.ts +++ b/src/main/persistence/applying-settings/persistence-ui-state.test.ts @@ -15,7 +15,7 @@ import { writeDataFile, readDataFile } from '../persistence-test-harness' -import { installFakeAppEnvironment } from '../../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' const { loadUserSshConfigMock, sshConfigHostsToTargetsMock } = vi.hoisted(() => ({ loadUserSshConfigMock: vi.fn(), diff --git a/src/main/persistence/persistence-protected-secret-fail-closed.test.ts b/src/main/persistence/persistence-protected-secret-fail-closed.test.ts index 82e4be0f143..dc5fdaa6272 100644 --- a/src/main/persistence/persistence-protected-secret-fail-closed.test.ts +++ b/src/main/persistence/persistence-protected-secret-fail-closed.test.ts @@ -8,7 +8,7 @@ import { mkdtempSync, rmSync, writeFileSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' import { randomUUID } from 'node:crypto' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' type FailureMode = 'availability-throws' | 'encryption-throws' | 'unavailable' diff --git a/src/main/persistence/persistence-proxy-secret-recovery.test.ts b/src/main/persistence/persistence-proxy-secret-recovery.test.ts index 5d4f2dd8fb1..4ae2c5f68ef 100644 --- a/src/main/persistence/persistence-proxy-secret-recovery.test.ts +++ b/src/main/persistence/persistence-proxy-secret-recovery.test.ts @@ -10,7 +10,7 @@ import { existsSync, mkdirSync, rmSync, mkdtempSync, writeFileSync } from 'node: import { dirname, join } from 'node:path' import { tmpdir } from 'node:os' import { randomUUID } from 'node:crypto' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' const testState = { dir: '' } diff --git a/src/main/persistence/persistence-single-serialize.test.ts b/src/main/persistence/persistence-single-serialize.test.ts index 9d49fa515ba..1e26aa3263e 100644 --- a/src/main/persistence/persistence-single-serialize.test.ts +++ b/src/main/persistence/persistence-single-serialize.test.ts @@ -11,7 +11,7 @@ import { join } from 'node:path' import { tmpdir } from 'node:os' import { randomUUID } from 'node:crypto' import { ProfileStateSqliteAuthority } from './profile-state/profile-state-sqlite-authority' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' const testState = { dir: '' } diff --git a/src/main/persistence/persistence-test-harness.ts b/src/main/persistence/persistence-test-harness.ts index c72216b0701..c4e561f9cc4 100644 --- a/src/main/persistence/persistence-test-harness.ts +++ b/src/main/persistence/persistence-test-harness.ts @@ -1,6 +1,6 @@ import { existsSync, mkdirSync, readFileSync, symlinkSync, writeFileSync } from 'node:fs' import { dirname, join } from 'node:path' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import type { Project, ProjectHostSetup } from '../../shared/project-types' import type { Repo } from '../../shared/repo-types' import type { WorkspaceLineage, WorktreeLineage } from '../../shared/worktree/lineage-types' diff --git a/src/main/persistence/profile-state/profile-state-access-process.test.ts b/src/main/persistence/profile-state/profile-state-access-process.test.ts index 4188cabc625..e1c1b3440bf 100644 --- a/src/main/persistence/profile-state/profile-state-access-process.test.ts +++ b/src/main/persistence/profile-state/profile-state-access-process.test.ts @@ -5,7 +5,7 @@ import { join, resolve } from 'node:path' import { buildSync } from 'esbuild' import { afterAll, afterEach, beforeAll, describe, expect, it } from 'vitest' import { spawnProcess } from '@orca/process-host' -import { stagePackagedProcessHost } from '../../../../config/scripts/packaged-process-host-fixture.mjs' +import { stagePackagedProcessHost } from '../../../../config/scripts/desktop-distribution/runtime-verification/packaged-process-host-fixture.mjs' import { acquireProfileStateMaintenance, acquireProfileStateRuntimeAdmission diff --git a/src/main/persistence/profile-state/profile-state-recovery-crash-process.ts b/src/main/persistence/profile-state/profile-state-recovery-crash-process.ts index 567ccd167e8..4dad4ce6e0e 100644 --- a/src/main/persistence/profile-state/profile-state-recovery-crash-process.ts +++ b/src/main/persistence/profile-state/profile-state-recovery-crash-process.ts @@ -3,7 +3,7 @@ import { writeFileSync } from 'node:fs' import { dirname, join } from 'node:path' import { buildSync, type Metafile } from 'esbuild' import { spawnProcess } from '@orca/process-host' -import { createWorkspaceSourceResolver } from '../../../../config/scripts/workspace-source-exports.mjs' +import { createWorkspaceSourceResolver } from '../../../../config/scripts/workspace/source-exports/workspace-source-exports.mjs' export type RecoveryCrashOptions = { root: string diff --git a/src/main/persistence/terminal-topology/persistence-ssh-readoption-automation-migration.test.ts b/src/main/persistence/terminal-topology/persistence-ssh-readoption-automation-migration.test.ts index ecb733a1c61..e7006d13d66 100644 --- a/src/main/persistence/terminal-topology/persistence-ssh-readoption-automation-migration.test.ts +++ b/src/main/persistence/terminal-topology/persistence-ssh-readoption-automation-migration.test.ts @@ -19,7 +19,7 @@ import { getDefaultPersistedState } from '../../../shared/constants' import { toSshExecutionHostId } from '../../../shared/execution-host' import { hostStableKey } from '../../../shared/automation-owner-key' import { folderWorkspaceKey } from '../../../shared/workspace-scope' -import { installFakeAppEnvironment } from '../../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { resetRetirementCollisionKeyCacheForTests } from '../../workspaces/removal/retirement/worktree-name-retirement' let hasCreatedStoreInCase = false diff --git a/src/main/persistence/tracking-repos/persistence-duplicate-repo-id-host-scope.test.ts b/src/main/persistence/tracking-repos/persistence-duplicate-repo-id-host-scope.test.ts index 3d0d2915109..57e822368b7 100644 --- a/src/main/persistence/tracking-repos/persistence-duplicate-repo-id-host-scope.test.ts +++ b/src/main/persistence/tracking-repos/persistence-duplicate-repo-id-host-scope.test.ts @@ -13,7 +13,7 @@ import type { Project, ProjectHostSetup } from '../../../shared/project-types' import type { Repo } from '../../../shared/repo-types' import { getDefaultPersistedState } from '../../../shared/constants' import { toRuntimeExecutionHostId } from '../../../shared/execution-host' -import { installFakeAppEnvironment } from '../../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { resetRetirementCollisionKeyCacheForTests } from '../../workspaces/removal/retirement/worktree-name-retirement' import { hostWorktreeTarget } from '../../../shared/worktree/host-qualified-identity' diff --git a/src/main/persistence/tracking-repos/persistence-workspace-pinned-automation-fence.test.ts b/src/main/persistence/tracking-repos/persistence-workspace-pinned-automation-fence.test.ts index 52773312e82..3b82b635430 100644 --- a/src/main/persistence/tracking-repos/persistence-workspace-pinned-automation-fence.test.ts +++ b/src/main/persistence/tracking-repos/persistence-workspace-pinned-automation-fence.test.ts @@ -20,7 +20,7 @@ import { AUTOMATION_ORPHAN_ISSUES } from '../../../shared/automation-list-scope' import { AUTOMATION_OWNER_CONFLICT_CODES } from '../../../shared/automation-owner-conflict' import { getDefaultPersistedState } from '../../../shared/constants' import { folderWorkspaceKey } from '../../../shared/workspace-scope' -import { installFakeAppEnvironment } from '../../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { resetRetirementCollisionKeyCacheForTests } from '../../workspaces/removal/retirement/worktree-name-retirement' let hasCreatedStoreInCase = false diff --git a/src/main/persistence/tracking-repos/persistence-workspace-repin-automation-owner.test.ts b/src/main/persistence/tracking-repos/persistence-workspace-repin-automation-owner.test.ts index 9f21d41098b..b9329734c5a 100644 --- a/src/main/persistence/tracking-repos/persistence-workspace-repin-automation-owner.test.ts +++ b/src/main/persistence/tracking-repos/persistence-workspace-repin-automation-owner.test.ts @@ -18,7 +18,7 @@ import type { SshTarget } from '../../../shared/ssh-types' import { AUTOMATION_ORPHAN_ISSUES } from '../../../shared/automation-list-scope' import { getDefaultPersistedState } from '../../../shared/constants' import { folderWorkspaceKey } from '../../../shared/workspace-scope' -import { installFakeAppEnvironment } from '../../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { resetRetirementCollisionKeyCacheForTests } from '../../workspaces/removal/retirement/worktree-name-retirement' let hasCreatedStoreInCase = false diff --git a/src/main/persistence/tracking-repos/persistence-workspace-session-scrollback.test.ts b/src/main/persistence/tracking-repos/persistence-workspace-session-scrollback.test.ts index feb3454b1c3..f1002449e3b 100644 --- a/src/main/persistence/tracking-repos/persistence-workspace-session-scrollback.test.ts +++ b/src/main/persistence/tracking-repos/persistence-workspace-session-scrollback.test.ts @@ -26,7 +26,7 @@ import { makeSessionWithBrowserHistory } from '../persistence-session-fixtures' -import { installFakeAppEnvironment } from '../../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { Store } from '../loading-store/store' import { initDataPath } from '../loading-store/user-data-path' diff --git a/src/main/persistence/tracking-repos/persistence-worktree-name-retirement.test.ts b/src/main/persistence/tracking-repos/persistence-worktree-name-retirement.test.ts index 29365503a68..157f7b27d86 100644 --- a/src/main/persistence/tracking-repos/persistence-worktree-name-retirement.test.ts +++ b/src/main/persistence/tracking-repos/persistence-worktree-name-retirement.test.ts @@ -15,7 +15,7 @@ import { createRetiredNameLookup } from '../../../shared/worktree/retired-name-r import type { SshTarget } from '../../../shared/ssh-types' import { MAX_RETIREMENT_NAMESPACES } from '../../workspaces/removal/retirement/worktree-retirement-namespace' import { getRuntimeOwnedSshTargetId } from '../../ssh/connection/ssh-connection-store' -import { installFakeAppEnvironment } from '../../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { resetRetirementCollisionKeyCacheForTests } from '../../workspaces/removal/retirement/worktree-name-retirement' let hasCreatedStoreInCase = false diff --git a/src/main/pi/titlebar-extension-overlay-path.test.ts b/src/main/pi/titlebar-extension-overlay-path.test.ts index 1a4ace7d352..788fe60b3be 100644 --- a/src/main/pi/titlebar-extension-overlay-path.test.ts +++ b/src/main/pi/titlebar-extension-overlay-path.test.ts @@ -2,7 +2,7 @@ import { existsSync, mkdirSync, mkdtempSync, readdirSync, rmSync, writeFileSync import { tmpdir } from 'node:os' import { join, sep } from 'node:path' import { afterEach, beforeEach, describe, expect, it } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' const userDataDir = mkdtempSync(join(tmpdir(), 'orca-pi-overlay-path-userdata-')) diff --git a/src/main/pi/titlebar-extension-service.test.ts b/src/main/pi/titlebar-extension-service.test.ts index 3aead95d63d..ea1551a1c25 100644 --- a/src/main/pi/titlebar-extension-service.test.ts +++ b/src/main/pi/titlebar-extension-service.test.ts @@ -17,7 +17,7 @@ import { tmpdir } from 'node:os' import type * as osModule from 'node:os' import type * as fsModule from 'node:fs' import { join } from 'node:path' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' const userDataDir = mkdtempSync(join(tmpdir(), 'orca-pi-test-userdata-')) diff --git a/src/main/pty/history/terminal-history-async-delete.test.ts b/src/main/pty/history/terminal-history-async-delete.test.ts index d5560479681..d748f795e11 100644 --- a/src/main/pty/history/terminal-history-async-delete.test.ts +++ b/src/main/pty/history/terminal-history-async-delete.test.ts @@ -2,7 +2,7 @@ import { mkdirSync, mkdtempSync, readdirSync, rmSync, writeFileSync } from 'node import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, beforeEach, describe, expect, it } from 'vitest' -import { installFakeAppEnvironment } from '../../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' let userDataDir: string diff --git a/src/main/pty/history/terminal-history-gc-fs-call-count.test.ts b/src/main/pty/history/terminal-history-gc-fs-call-count.test.ts index cdae4b6b0d6..d4fa42d0856 100644 --- a/src/main/pty/history/terminal-history-gc-fs-call-count.test.ts +++ b/src/main/pty/history/terminal-history-gc-fs-call-count.test.ts @@ -11,7 +11,7 @@ import type * as FsPromises from 'node:fs/promises' import { tmpdir } from 'node:os' import { dirname, join } from 'node:path' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' const { fsCalls, removeHostTreeMock } = vi.hoisted(() => ({ fsCalls: { readdir: [] as string[], stat: [] as string[] }, diff --git a/src/main/pty/history/terminal-history-gc.test.ts b/src/main/pty/history/terminal-history-gc.test.ts index 0dafb1b0194..d1786e10967 100644 --- a/src/main/pty/history/terminal-history-gc.test.ts +++ b/src/main/pty/history/terminal-history-gc.test.ts @@ -10,7 +10,7 @@ import { import { tmpdir } from 'node:os' import { basename, join } from 'node:path' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' const { removeHostTreeMock } = vi.hoisted(() => ({ removeHostTreeMock: vi.fn<(dir: string) => Promise<void>>() diff --git a/src/main/pty/history/terminal-history-tombstone-retry.test.ts b/src/main/pty/history/terminal-history-tombstone-retry.test.ts index 0ae70cf1ddd..2ad704b27e7 100644 --- a/src/main/pty/history/terminal-history-tombstone-retry.test.ts +++ b/src/main/pty/history/terminal-history-tombstone-retry.test.ts @@ -2,7 +2,7 @@ import { mkdirSync, mkdtempSync, readdirSync, rmSync, writeFileSync } from 'node import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' let userDataDir: string diff --git a/src/main/pty/history/terminal-history-tombstone-scan-cost.test.ts b/src/main/pty/history/terminal-history-tombstone-scan-cost.test.ts index d47df97344f..23ad48ee4fc 100644 --- a/src/main/pty/history/terminal-history-tombstone-scan-cost.test.ts +++ b/src/main/pty/history/terminal-history-tombstone-scan-cost.test.ts @@ -3,7 +3,7 @@ import type * as NodeFsPromises from 'node:fs/promises' import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' const reads = vi.hoisted(() => ({ count: 0, names: 0, failNext: 0 })) const { removeHostTreeMock } = vi.hoisted(() => ({ diff --git a/src/main/pty/history/terminal-history.test.ts b/src/main/pty/history/terminal-history.test.ts index a79e6c49029..db22e51061e 100644 --- a/src/main/pty/history/terminal-history.test.ts +++ b/src/main/pty/history/terminal-history.test.ts @@ -2,7 +2,7 @@ import type * as WslPathOwner from '../../../shared/wsl-paths' import type * as FsPromises from 'node:fs/promises' import { sep } from 'node:path' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' const { existsSyncMock, diff --git a/src/main/runtime/agent-state-rules/agent-state-rules-live-update.test.ts b/src/main/runtime/agent-state-rules/agent-state-rules-live-update.test.ts index a535cb13544..78939219e74 100644 --- a/src/main/runtime/agent-state-rules/agent-state-rules-live-update.test.ts +++ b/src/main/runtime/agent-state-rules/agent-state-rules-live-update.test.ts @@ -6,7 +6,7 @@ import { AGENT_STATE_RULES_ASSET, buildAgentStateRulesBundle } from '../../../../config/scripts/agent-state-rules-bundle.mjs' -import { agentStateRulesTag } from '../../../../config/scripts/release-tag-patterns.mjs' +import { agentStateRulesTag } from '../../../../config/scripts/release/versioning/release-tag-patterns.mjs' import { MAIN_RELEASE_REPO } from '../../../shared/release-channel' import { getTerminalTailSentinelMatches } from '../terminal-tail-sentinel-index' import { diff --git a/src/main/runtime/automation-change-publication.test.ts b/src/main/runtime/automation-change-publication.test.ts index 0a93871b018..bdb6e5a54c5 100644 --- a/src/main/runtime/automation-change-publication.test.ts +++ b/src/main/runtime/automation-change-publication.test.ts @@ -6,7 +6,7 @@ import { afterEach, beforeEach, describe, expect, it, vi, type MockInstance } fr import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs' import { join } from 'node:path' import { tmpdir } from 'node:os' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import type { Automation, AutomationRun } from '../../shared/automations-types' import type { Repo } from '../../shared/repo-types' import type { SshTarget } from '../../shared/ssh-types' diff --git a/src/main/runtime/claude-agent-teams-shim-env.test.ts b/src/main/runtime/claude-agent-teams-shim-env.test.ts index b6649fb9ec7..fa332ae8720 100644 --- a/src/main/runtime/claude-agent-teams-shim-env.test.ts +++ b/src/main/runtime/claude-agent-teams-shim-env.test.ts @@ -4,7 +4,7 @@ import { chmod, mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises import { tmpdir } from 'node:os' import { dirname, join, relative } from 'node:path' import { afterEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { getOrcaCliCommandNameForPlatform } from '../../shared/orca-cli-command-name' import { buildClaudeAgentTeamsLaunchPlan, diff --git a/src/main/runtime/mobile-pairing-userdata-path.test.ts b/src/main/runtime/mobile-pairing-userdata-path.test.ts index c708825db4a..d61203e4fd6 100644 --- a/src/main/runtime/mobile-pairing-userdata-path.test.ts +++ b/src/main/runtime/mobile-pairing-userdata-path.test.ts @@ -5,7 +5,7 @@ import { join } from 'node:path' import { tmpdir } from 'node:os' import { DEVICE_REGISTRY_FILENAME } from './mobile-pairing-files' import { E2EE_KEYPAIR_FILENAME } from '../../shared/remote-runtime/host-store/runtime-e2ee-keypair-file' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' // Simulate app.setName changing userData; distinct directories work even on case-insensitive filesystems. const appState = { userData: '' } diff --git a/src/main/runtime/orca-runtime-agent-skill-share.test.ts b/src/main/runtime/orca-runtime-agent-skill-share.test.ts index 5186e5caa03..ed6df24da72 100644 --- a/src/main/runtime/orca-runtime-agent-skill-share.test.ts +++ b/src/main/runtime/orca-runtime-agent-skill-share.test.ts @@ -3,7 +3,7 @@ import { mkdir, mkdtemp, readdir, rm, writeFile } from 'node:fs/promises' import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import type { AgentSkillShareRequest } from '../../shared/agent-skill-sharing-contract' import { getDefaultSettings } from '../../shared/constants' import type { DiscoveredSkill } from '../../shared/skills' diff --git a/src/main/runtime/orca-runtime-test-mocks/imported-values.spec.ts b/src/main/runtime/orca-runtime-test-mocks/imported-values.spec.ts index 69026898ba6..201dacc5743 100644 --- a/src/main/runtime/orca-runtime-test-mocks/imported-values.spec.ts +++ b/src/main/runtime/orca-runtime-test-mocks/imported-values.spec.ts @@ -10,7 +10,7 @@ import { import { __cancelLegacyWorkerTerminalRecoveryRetriesForTests } from '../runtime-legacy-worker-terminal-recovery-controller' import { setRuntimeTerminalUnavailableCause } from '../native-terminal-availability' import { setRuntimeDesktopSurface } from '../runtime-desktop-surface' -import { installFakeAppEnvironment } from '../../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { performance } from 'node:perf_hooks' import { EventEmitter as NodeEventEmitter } from 'node:events' import { createHash, randomUUID } from 'node:crypto' diff --git a/src/main/runtime/rpc/methods/mobile-web-bundle.test-fixture.ts b/src/main/runtime/rpc/methods/mobile-web-bundle.test-fixture.ts index 094d0d74a8b..dc9d913d961 100644 --- a/src/main/runtime/rpc/methods/mobile-web-bundle.test-fixture.ts +++ b/src/main/runtime/rpc/methods/mobile-web-bundle.test-fixture.ts @@ -1,7 +1,7 @@ import { createHash } from 'node:crypto' import { mkdirSync, writeFileSync } from 'node:fs' import { join } from 'node:path' -import { installFakeAppEnvironment } from '../../../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import type { OrcaRuntimeService } from '../../orca-runtime' import { RpcDispatcher } from '../dispatcher' import { MOBILE_WEB_BUNDLE_METHODS } from './mobile-web-bundle' diff --git a/src/main/runtime/structured-chat-tab-compatibility.test.ts b/src/main/runtime/structured-chat-tab-compatibility.test.ts index 29edb42e74e..b7c73152499 100644 --- a/src/main/runtime/structured-chat-tab-compatibility.test.ts +++ b/src/main/runtime/structured-chat-tab-compatibility.test.ts @@ -299,7 +299,7 @@ it('captures an admitted but unsaved failed-SHOW open, then removes exactly that await import('../persistence/loading-store/profile-state-delayed-authority-fixture') const { store: profile, authority } = await fixture() const { installFakeAppEnvironment } = - await import('../../../config/scripts/vitest-host-ports-setup') + await import('../../../config/scripts/test-runtime/environment/vitest-host-ports-setup') const { initOrcaProfilePaths } = await import('../orca-profiles/profile-storage-paths') installFakeAppEnvironment({ getPath: () => root }) initOrcaProfilePaths() diff --git a/src/main/runtime/structured-session-child-env.test.ts b/src/main/runtime/structured-session-child-env.test.ts index ca65cf9b3b9..17d47fef0a2 100644 --- a/src/main/runtime/structured-session-child-env.test.ts +++ b/src/main/runtime/structured-session-child-env.test.ts @@ -1,6 +1,6 @@ import { join } from 'node:path' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { resolveProviderChildEnv } from '../provider-process/provider-process-launch' const shim = vi.hoisted(() => ({ ensureLinuxTerminalOrcaCliShimDir: vi.fn() })) diff --git a/src/main/runtime/structured-session-login-shell-test-harness.ts b/src/main/runtime/structured-session-login-shell-test-harness.ts index 7d8b561e837..fd60da59d34 100644 --- a/src/main/runtime/structured-session-login-shell-test-harness.ts +++ b/src/main/runtime/structured-session-login-shell-test-harness.ts @@ -3,7 +3,7 @@ import { chmodSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { runProcess } from '@orca/process-host' import { sealedChildEnv } from './structured-session-child-env.test-support' diff --git a/src/main/speech/model-manager-windows-path.test.ts b/src/main/speech/model-manager-windows-path.test.ts index 9d850ee56d8..26228b405a1 100644 --- a/src/main/speech/model-manager-windows-path.test.ts +++ b/src/main/speech/model-manager-windows-path.test.ts @@ -5,7 +5,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { SPEECH_MODEL_CATALOG } from './model-catalog' import { ModelManager } from './model-manager' import { openElectronSpeechDownloadRequest } from '../host/electron-speech-services' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' const { appGetPathMock, netRequestMock } = vi.hoisted(() => ({ appGetPathMock: vi.fn(), diff --git a/src/main/speech/stt-worker-paths.test.ts b/src/main/speech/stt-worker-paths.test.ts index a6b137b2df1..be1e455d6e2 100644 --- a/src/main/speech/stt-worker-paths.test.ts +++ b/src/main/speech/stt-worker-paths.test.ts @@ -2,7 +2,7 @@ import { mkdtempSync, rmSync, writeFileSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, describe, expect, it } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { SPEECH_RECOGNIZER_DIR_ENV } from '../../shared/speech-recognizer-package' import { getSherpaModulePath, hasLocalSpeechRecognizer } from './stt-worker-paths' diff --git a/src/main/stats/agent-session-stats-feed.test.ts b/src/main/stats/agent-session-stats-feed.test.ts index bd400444b0c..2c5b9562ebc 100644 --- a/src/main/stats/agent-session-stats-feed.test.ts +++ b/src/main/stats/agent-session-stats-feed.test.ts @@ -2,7 +2,7 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, describe, expect, it } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import type { AgentSessionClearEvent, AgentSessionStatusEvent diff --git a/src/main/window/clipboard-ipc-handlers.test.ts b/src/main/window/clipboard-ipc-handlers.test.ts index 97037cf160d..d35b8c4684e 100644 --- a/src/main/window/clipboard-ipc-handlers.test.ts +++ b/src/main/window/clipboard-ipc-handlers.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import type * as ProcessHost from '@orca/process-host' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { CLIPBOARD_TEXT_MEASURE_YIELD_CODE_UNITS } from '../../shared/clipboard-text' import { CLIPBOARD_IMAGE_MAX_BASE64_CHARS, diff --git a/src/main/window/clipboard-macos-image-paste.test.ts b/src/main/window/clipboard-macos-image-paste.test.ts index 7c5bbd4d01d..b7c6c7c8c85 100644 --- a/src/main/window/clipboard-macos-image-paste.test.ts +++ b/src/main/window/clipboard-macos-image-paste.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import type * as FsPromises from 'node:fs/promises' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { CLIPBOARD_IMAGE_MAX_PIXELS, CLIPBOARD_IMAGE_MAX_SOURCE_BYTES diff --git a/src/main/window/native-chat-paste-files.test.ts b/src/main/window/native-chat-paste-files.test.ts index 89aa3596a12..849aa70b20d 100644 --- a/src/main/window/native-chat-paste-files.test.ts +++ b/src/main/window/native-chat-paste-files.test.ts @@ -2,7 +2,7 @@ import { mkdirSync, mkdtempSync, realpathSync, rmSync, symlinkSync, writeFileSyn import { tmpdir } from 'node:os' import path from 'node:path' import { afterEach, beforeEach, describe, expect, it } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import type { Store } from '../persistence/loading-store/store' import { resolveLocalFileRequestPath } from '../ipc/filesystem/access/local-file-access-resolution' diff --git a/src/main/window/native-chat-pasted-text-file.test.ts b/src/main/window/native-chat-pasted-text-file.test.ts index 1ab3b8b7fd6..71edccb972a 100644 --- a/src/main/window/native-chat-pasted-text-file.test.ts +++ b/src/main/window/native-chat-pasted-text-file.test.ts @@ -2,7 +2,7 @@ import { mkdtempSync, readFileSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import path from 'node:path' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { installFakeAppEnvironment } from '../../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' const mocks = vi.hoisted(() => ({ upload: vi.fn() })) diff --git a/src/main/wsl/orcad/wsl-orcad-update-move-hold-driver.test.ts b/src/main/wsl/orcad/wsl-orcad-update-move-hold-driver.test.ts index 0025a8a51ec..1b275ae664d 100644 --- a/src/main/wsl/orcad/wsl-orcad-update-move-hold-driver.test.ts +++ b/src/main/wsl/orcad/wsl-orcad-update-move-hold-driver.test.ts @@ -6,7 +6,7 @@ * cancelled, or killed mid-run and recovered on relaunch) the same update deploys. */ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { fakeAppEnvironment } from '../../../../config/scripts/vitest-host-ports-setup' +import { fakeAppEnvironment } from '../../../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { setAppEnvironment } from '../../../shared/app-environment' import { WSL_HOSTS_INTERNAL_GATE_ENV } from '../../../shared/wsl-host-internal-gate' import { ORCAD_UPDATE_WSL_MOVE_RUNNING_CODE } from '../../../shared/wsl-host-types' diff --git a/src/shared/node-runtime-pin.ts b/src/shared/node-runtime-pin.ts index a0be544b7ad..65a905b2b36 100644 --- a/src/shared/node-runtime-pin.ts +++ b/src/shared/node-runtime-pin.ts @@ -53,7 +53,7 @@ export type NodeRuntimeAsset = { executableSize: number } -// @generated-begin by config/scripts/update-node-runtime-pin.mjs +// @generated-begin by config/scripts/node-runtime/archive-identity/update-node-runtime-pin.mjs export const NODE_RUNTIME_PIN: NodeRuntimePin = { version: '24.22.1', electron: '43.8.6', diff --git a/src/shared/orca-cli-command-name.test.ts b/src/shared/orca-cli-command-name.test.ts index b72de8525ec..8d1451712e9 100644 --- a/src/shared/orca-cli-command-name.test.ts +++ b/src/shared/orca-cli-command-name.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest' -import { installFakeAppEnvironment } from '../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { getTuiAgentLaunchCommand, TUI_AGENT_CONFIG } from './agent-launch/catalog/tui-agent-config' const agentTeams = TUI_AGENT_CONFIG['claude-agent-teams'] diff --git a/tests/e2e/ai-vault-account-stream-test-fixture.ts b/tests/e2e/ai-vault-account-stream-test-fixture.ts index d1b5326b8f7..d61631d8987 100644 --- a/tests/e2e/ai-vault-account-stream-test-fixture.ts +++ b/tests/e2e/ai-vault-account-stream-test-fixture.ts @@ -2,7 +2,7 @@ import { vi } from 'vitest' import * as fs from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' -import { installFakeAppEnvironment } from '../../config/scripts/vitest-host-ports-setup' +import { installFakeAppEnvironment } from '../../config/scripts/test-runtime/environment/vitest-host-ports-setup' import { RuntimeAccountController, type RuntimeAccountServices diff --git a/tests/e2e/cross-version-wire/release-checkout-tree.ts b/tests/e2e/cross-version-wire/release-checkout-tree.ts index b2a347df8e0..7d10f76c63f 100644 --- a/tests/e2e/cross-version-wire/release-checkout-tree.ts +++ b/tests/e2e/cross-version-wire/release-checkout-tree.ts @@ -1,7 +1,7 @@ import { readFile, readdir, rm, writeFile } from 'node:fs/promises' import { dirname, join, relative } from 'node:path' import { parse } from 'yaml' -import { createWorkspaceSourceResolver } from '../../../config/scripts/workspace-source-exports.mjs' +import { createWorkspaceSourceResolver } from '../../../config/scripts/workspace/source-exports/workspace-source-exports.mjs' import { collectPackageImports, installMissingPackageStandIns, diff --git a/tests/e2e/cross-version-wire/release-source-cache.ts b/tests/e2e/cross-version-wire/release-source-cache.ts index 3c99fdaa585..95cad16af4d 100644 --- a/tests/e2e/cross-version-wire/release-source-cache.ts +++ b/tests/e2e/cross-version-wire/release-source-cache.ts @@ -3,7 +3,7 @@ import { join, resolve } from 'node:path' import { makeTreeReadOnlyAsync, shareTreeAsync -} from '../../../config/scripts/space-sharing-copy.mjs' +} from '../../../config/scripts/artifact-storage/reflink-copy/space-sharing-copy.mjs' import { extractReleaseCheckoutTree } from './release-checkout-tree.ts' import { installMissingPackageStandIns, type PackageImports } from './release-missing-packages.ts' import { publishReleaseCheckout } from './release-checkout-publication.ts' diff --git a/tests/e2e/spinner-workspace-fixture.ts b/tests/e2e/spinner-workspace-fixture.ts index 1d9fb64b3a3..55b5631014b 100644 --- a/tests/e2e/spinner-workspace-fixture.ts +++ b/tests/e2e/spinner-workspace-fixture.ts @@ -3,7 +3,7 @@ import { mkdirSync, mkdtempSync, writeFileSync } from 'node:fs' import path from 'node:path' import { runProcess } from '@orca/process-host' import { attachRepoAndOpenTerminal } from './helpers/orca-restart' -import { configureRendererScaleFixture } from '../../config/scripts/idle-cpu-renderer-scale-fixture.mjs' +import { configureRendererScaleFixture } from '../../config/scripts/performance/idle-cpu/idle-cpu-renderer-scale-fixture.mjs' export async function createSpinnerRepository(worktrees: number) { const parent = path.resolve('.bench-fixtures') diff --git a/tests/e2e/structured-chat-tab-lifetime-cost.unit.test.ts b/tests/e2e/structured-chat-tab-lifetime-cost.unit.test.ts index 960d7458c45..95a8b05549d 100644 --- a/tests/e2e/structured-chat-tab-lifetime-cost.unit.test.ts +++ b/tests/e2e/structured-chat-tab-lifetime-cost.unit.test.ts @@ -310,7 +310,8 @@ it('keeps failed advisory legacy insertion and retention while the actual inner const { store: profile, authority } = await fixture() const { root, B, holdStartup, rejectVisibility, savedIds } = await import('../../src/main/runtime/structured-agent-session-tab-authority.test-support') - const { installFakeAppEnvironment } = await import('../../config/scripts/vitest-host-ports-setup') + const { installFakeAppEnvironment } = + await import('../../config/scripts/test-runtime/environment/vitest-host-ports-setup') installFakeAppEnvironment({ getPath: () => root }) const base = await authorityProfile([B], { visible: [B] }, profile) const { workspace } = base @@ -612,7 +613,7 @@ it.each([10, 100])( const { root, B, rejectVisibility } = await import('../../src/main/runtime/structured-agent-session-tab-authority.test-support') const { installFakeAppEnvironment } = - await import('../../config/scripts/vitest-host-ports-setup') + await import('../../config/scripts/test-runtime/environment/vitest-host-ports-setup') installFakeAppEnvironment({ getPath: () => root }) const ids = Array.from({ length: p }, (_, i) => i === 0 ? B : `pending-${i.toString().padStart(5, '0')}` diff --git a/tests/playwright.config.ts b/tests/playwright.config.ts index 1071322690b..b355709d5f8 100644 --- a/tests/playwright.config.ts +++ b/tests/playwright.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from '@stablyai/playwright-test' -import { resolveBuildSourceCommit } from '../config/scripts/build-source-commit.mjs' +import { resolveBuildSourceCommit } from '../config/scripts/build-identity/build-source-commit.mjs' // Run ORCA_BACKGROUND_LAUNCH=1 pnpm run test:e2e to build/run; SKIP_BUILD=1 reuses the current E2E build. // Headful pointer-capture runs require an isolated display. Global setup/teardown own the seeded repo; fixtures launch Electron. diff --git a/tests/tools/windows-pty-native-capability-smoke/packaged-node-pty-capability-probe.test.mjs b/tests/tools/windows-pty-native-capability-smoke/packaged-node-pty-capability-probe.test.mjs index 16011169bff..e1ce7d45f4f 100644 --- a/tests/tools/windows-pty-native-capability-smoke/packaged-node-pty-capability-probe.test.mjs +++ b/tests/tools/windows-pty-native-capability-smoke/packaged-node-pty-capability-probe.test.mjs @@ -5,7 +5,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { describe, expect, it } from 'vitest' import { runProcess } from '@orca/process-host' -import { stagePackagedProcessHost } from '../../../config/scripts/packaged-process-host-fixture.mjs' +import { stagePackagedProcessHost } from '../../../config/scripts/desktop-distribution/runtime-verification/packaged-process-host-fixture.mjs' const require = createRequire(import.meta.url) const probePath = require.resolve('./packaged-node-pty-capability-probe.cjs') diff --git a/vite.web.config.ts b/vite.web.config.ts index 909dce7aaeb..a587bcf4bdf 100644 --- a/vite.web.config.ts +++ b/vite.web.config.ts @@ -5,7 +5,7 @@ import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' import { createPdfjsViewerAssetsPlugin } from './config/build-plugins/pdfjs-viewer-assets' import { createViteCacheRetentionPlugin } from './config/build-plugins/vite-cache-retention' -import { resolveBuildSourceCommit } from './config/scripts/build-source-commit.mjs' +import { resolveBuildSourceCommit } from './config/scripts/build-identity/build-source-commit.mjs' export default defineConfig({ root: resolve('src/renderer'),