Unified · Split
| @@ -1,8 +1,10 @@ | ||
| 1 | −name: Publish Executor Package | |
| 1 | +name: Publish Executor | |
| 2 | 2 | run-name: "${{ format('publish executor {0}', github.ref_name) }}" |
| 3 | 3 | |
| 4 | 4 | on: |
| 5 | − workflow_dispatch: | |
| 5 | + push: | |
| 6 | + tags: | |
| 7 | + - "v*" | |
| 6 | 8 | |
| 7 | 9 | permissions: |
| 8 | 10 | contents: write |
| @@ -22,14 +24,6 @@ jobs: · 13 unmodified lines | ||
| 22 | 24 | with: |
| 23 | 25 | fetch-depth: 0 |
| 24 | 26 | |
| 25 | − - name: Require default branch | |
| 26 | − if: github.ref_name != github.event.repository.default_branch | |
| 27 | − run: | | |
| 28 | − echo "Publish from ${GITHUB_REF_NAME} is blocked; use ${DEFAULT_BRANCH}." >&2 | |
| 29 | − exit 1 | |
| 30 | − env: | |
| 31 | − DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} | |
| 32 | − | |
| 33 | 27 | - name: Setup Bun |
| 34 | 28 | uses: oven-sh/setup-bun@v2 |
| 35 | 29 | |
| @@ -39,111 +33,15 @@ jobs: · 3 unmodified lines | ||
| 39 | 33 | node-version: 22 |
| 40 | 34 | registry-url: https://registry.npmjs.org |
| 41 | 35 | |
| 42 | − - name: Setup Deno | |
| 43 | − uses: denoland/setup-deno@v2 | |
| 44 | − with: | |
| 45 | − deno-version: v2.x | |
| 46 | − | |
| 47 | 36 | - name: Install dependencies |
| 48 | 37 | run: bun install --frozen-lockfile |
| 49 | 38 | |
| 50 | − - name: Resolve package version | |
| 51 | − id: version | |
| 52 | − shell: bash | |
| 53 | − run: | | |
| 54 | − set -euo pipefail | |
| 55 | − version="$(node -p "require('./apps/executor/package.json').version")" | |
| 56 | − | |
| 57 | − if [[ ! "${version}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then | |
| 58 | − echo "apps/executor/package.json version is not semver: ${version}" >&2 | |
| 59 | − exit 1 | |
| 60 | − fi | |
| 61 | − | |
| 62 | − echo "version=${version}" >> "$GITHUB_OUTPUT" | |
| 63 | − echo "tag=v${version}" >> "$GITHUB_OUTPUT" | |
| 64 | − echo "Publishing executor@${version}" | |
| 65 | − | |
| 66 | − - name: Inspect existing publish state | |
| 67 | − id: state | |
| 68 | − shell: bash | |
| 69 | − env: | |
| 70 | − GH_TOKEN: ${{ github.token }} | |
| 71 | − run: | | |
| 72 | − set -euo pipefail | |
| 73 | − version="${{ steps.version.outputs.version }}" | |
| 74 | − tag="${{ steps.version.outputs.tag }}" | |
| 75 | − package_published=false | |
| 76 | − release_exists=false | |
| 77 | − tag_exists=false | |
| 78 | − | |
| 79 | − if npm view "executor@${version}" version >/dev/null 2>&1; then | |
| 80 | − package_published=true | |
| 81 | − fi | |
| 82 | − | |
| 83 | − if gh release view "${tag}" --repo "${GITHUB_REPOSITORY}" >/dev/null 2>&1; then | |
| 84 | − release_exists=true | |
| 85 | − fi | |
| 86 | − | |
| 87 | − if git rev-parse -q --verify "refs/tags/${tag}" >/dev/null || git ls-remote --exit-code --tags origin "refs/tags/${tag}" >/dev/null 2>&1; then | |
| 88 | − tag_exists=true | |
| 89 | − fi | |
| 90 | − | |
| 91 | − echo "package_published=${package_published}" >> "$GITHUB_OUTPUT" | |
| 92 | − echo "release_exists=${release_exists}" >> "$GITHUB_OUTPUT" | |
| 93 | − echo "tag_exists=${tag_exists}" >> "$GITHUB_OUTPUT" | |
| 94 | − | |
| 95 | − if [[ "${package_published}" == true && "${release_exists}" == true ]]; then | |
| 96 | − echo "executor@${version} is already published and ${tag} already exists" >&2 | |
| 97 | − exit 1 | |
| 98 | − fi | |
| 99 | − | |
| 100 | − if [[ "${package_published}" == false && "${release_exists}" == true ]]; then | |
| 101 | − echo "GitHub release ${tag} exists, but executor@${version} is not published to npm" >&2 | |
| 102 | − exit 1 | |
| 103 | − fi | |
| 104 | − | |
| 105 | − if [[ "${package_published}" == false && "${tag_exists}" == true && "${release_exists}" == false ]]; then | |
| 106 | − echo "Release tag ${tag} already exists without a GitHub release; resolve that before publishing executor@${version}" >&2 | |
| 107 | − exit 1 | |
| 108 | − fi | |
| 109 | − | |
| 110 | 39 | - name: Run executor checks |
| 111 | 40 | run: | |
| 112 | 41 | bun run --cwd apps/executor typecheck |
| 113 | 42 | bun run --cwd apps/executor test |
| 114 | 43 | |
| 115 | − - name: Build release artifacts | |
| 116 | − run: bun run --cwd apps/executor build:release | |
| 117 | − | |
| 118 | − - name: Publish to npm | |
| 119 | − if: steps.state.outputs.package_published != 'true' | |
| 120 | − working-directory: apps/executor | |
| 121 | − run: npm publish ./dist/npm --access public --provenance | |
| 122 | − | |
| 123 | − - name: Create GitHub release | |
| 124 | − if: steps.state.outputs.release_exists != 'true' | |
| 125 | − shell: bash | |
| 44 | + - name: Publish package and create release | |
| 126 | 45 | env: |
| 127 | 46 | GH_TOKEN: ${{ github.token }} |
| 128 | − run: | | |
| 129 | − set -euo pipefail | |
| 130 | − shopt -s nullglob | |
| 131 | − assets=( | |
| 132 | − apps/executor/dist/release/*.tgz | |
| 133 | − apps/executor/dist/release/checksums.txt | |
| 134 | − apps/executor/dist/release/portable/*.tar.gz | |
| 135 | − apps/executor/dist/release/portable/*.zip | |
| 136 | − ) | |
| 137 | − | |
| 138 | − if [[ ${#assets[@]} -lt 3 ]]; then | |
| 139 | − echo "Missing release assets under apps/executor/dist/release" >&2 | |
| 140 | − exit 1 | |
| 141 | − fi | |
| 142 | − | |
| 143 | − gh release create "${{ steps.version.outputs.tag }}" \ | |
| 144 | − "${assets[@]}" \ | |
| 145 | − --repo "${GITHUB_REPOSITORY}" \ | |
| 146 | − --target "${GITHUB_SHA}" \ | |
| 147 | − --title "${{ steps.version.outputs.tag }}" \ | |
| 148 | − --generate-notes \ | |
| 149 | − --latest | |
| 47 | + run: bun run --cwd apps/executor release:publish | |
| @@ -29,12 +29,8 @@ · 28 unmodified lines | ||
| 29 | 29 | "test": "vitest run", |
| 30 | 30 | "test:watch": "vitest", |
| 31 | 31 | "start": "bun src/cli/main.ts", |
| 32 | − "build:dist": "bun src/distribution/build-package.ts", | |
| 33 | − "pack:dist": "bun src/distribution/build-package.ts && npm pack ./dist/npm", | |
| 34 | − "publish:dist:dry-run": "bun src/distribution/build-package.ts && npm publish ./dist/npm --dry-run", | |
| 35 | − "publish:dist": "bun src/distribution/build-package.ts && npm publish ./dist/npm", | |
| 36 | − "build:portable": "bun src/distribution/build-portable.ts", | |
| 37 | − "build:release": "bun src/distribution/build-release.ts" | |
| 32 | + "release:publish:dry-run": "bun src/distribution/publish.ts --dry-run", | |
| 33 | + "release:publish": "bun src/distribution/publish.ts" | |
| 38 | 34 | }, |
| 39 | 35 | "dependencies": { |
| 40 | 36 | "@effect/cli": "catalog:", |
| @@ -7,7 +7,6 @@ import { dirname, join, resolve } from "node:path"; · 6 unmodified lines | ||
| 7 | 7 | import { readDistributionPackageMetadata, repoRoot } from "./metadata"; |
| 8 | 8 | |
| 9 | 9 | const defaultOutputDir = resolve(repoRoot, "apps/executor/dist/npm"); |
| 10 | −const DENO_INSTALL_URL = "https://docs.deno.com/runtime/getting_started/installation/"; | |
| 11 | 10 | |
| 12 | 11 | |
| 13 | 12 | export type BuildDistributionPackageOptions = { |
| @@ -72,26 +71,16 @@ const runCommand = async (input: CommandInput): Promise<void> => { · 58 unmodified lines | ||
| 72 | 71 | ); |
| 73 | 72 | }; |
| 74 | 73 | |
| 75 | −const resolvePGliteDistDir = (): string => { | |
| 76 | − const requireFromControlPlane = createRequire( | |
| 77 | − join(repoRoot, "packages/control-plane/package.json"), | |
| 78 | − ); | |
| 79 | − const entryPath = requireFromControlPlane.resolve("@electric-sql/pglite"); | |
| 80 | − const distDir = dirname(entryPath); | |
| 81 | − | |
| 82 | − if (!existsSync(distDir)) { | |
| 83 | − throw new Error(`Unable to locate PGlite dist directory at ${distDir}`); | |
| 84 | − } | |
| 85 | − | |
| 86 | − return distDir; | |
| 87 | −}; | |
| 88 | − | |
| 89 | 74 | const resolveQuickJsWasmPath = (): string => { |
| 90 | 75 | const requireFromQuickJsRuntime = createRequire( |
| 91 | 76 | join(repoRoot, "packages/runtime-quickjs/package.json"), |
| 92 | 77 | ); |
| 93 | − const wasmPath = requireFromQuickJsRuntime.resolve( | |
| 94 | − "@jitl/quickjs-wasmfile-release-sync/wasm", | |
| 78 | + const quickJsPackagePath = requireFromQuickJsRuntime.resolve( | |
| 79 | + "quickjs-emscripten/package.json", | |
| 80 | + ); | |
| 81 | + const wasmPath = resolve( | |
| 82 | + dirname(quickJsPackagePath), | |
| 83 | + "../@jitl/quickjs-wasmfile-release-sync/dist/emscripten-module.wasm", | |
| 95 | 84 | ); |
| 96 | 85 | |
| 97 | 86 | if (!existsSync(wasmPath)) { |
| @@ -131,9 +120,6 @@ const createPackageJson = (input: { · 33 unmodified lines | ||
| 131 | 120 | bin: { |
| 132 | 121 | executor: "bin/executor.js", |
| 133 | 122 | }, |
| 134 | − scripts: { | |
| 135 | − postinstall: "node ./bin/postinstall.js", | |
| 136 | − }, | |
| 137 | 123 | files: [ |
| 138 | 124 | "bin", |
| 139 | 125 | "resources", |
| @@ -154,48 +140,6 @@ const createLauncherSource = () => [ · 14 unmodified lines | ||
| 154 | 140 | "", |
| 155 | 141 | ].join("\n"); |
| 156 | 142 | |
| 157 | −const createPostinstallSource = () => [ | |
| 158 | − "#!/usr/bin/env node", | |
| 159 | − 'import { spawnSync } from "node:child_process";', | |
| 160 | − 'import { existsSync } from "node:fs";', | |
| 161 | − 'import { join } from "node:path";', | |
| 162 | − "", | |
| 163 | − `const denoInstallUrl = ${JSON.stringify(DENO_INSTALL_URL)};`, | |
| 164 | − "", | |
| 165 | − "const resolveDenoExecutable = () => {", | |
| 166 | − ' const configured = process.env.DENO_BIN?.trim();', | |
| 167 | − ' if (configured) {', | |
| 168 | − ' return configured;', | |
| 169 | − ' }', | |
| 170 | − "", | |
| 171 | − ' const home = process.env.HOME?.trim();', | |
| 172 | − ' if (home) {', | |
| 173 | − ' const installedPath = join(home, ".deno", "bin", "deno");', | |
| 174 | − ' if (existsSync(installedPath)) {', | |
| 175 | − ' return installedPath;', | |
| 176 | − ' }', | |
| 177 | − ' }', | |
| 178 | − "", | |
| 179 | − ' return "deno";', | |
| 180 | − "};", | |
| 181 | − "", | |
| 182 | − "const isDenoAvailable = (executable) => {", | |
| 183 | − ' const result = spawnSync(executable, ["--version"], {', | |
| 184 | − ' stdio: "ignore",', | |
| 185 | − ' timeout: 5000,', | |
| 186 | − ' });', | |
| 187 | − "", | |
| 188 | − ' return result.error === undefined && result.status === 0;', | |
| 189 | − "};", | |
| 190 | − "", | |
| 191 | − "const denoExecutable = resolveDenoExecutable();", | |
| 192 | − "", | |
| 193 | − "if (!isDenoAvailable(denoExecutable)) {", | |
| 194 | − ' console.warn(`Deno not found, if you want to use deno for sandboxing install it from ${denoInstallUrl} otherwise JS will execute in QuickJS`);', | |
| 195 | − "}", | |
| 196 | − "", | |
| 197 | −].join("\n"); | |
| 198 | − | |
| 199 | 143 | export const buildDistributionPackage = async ( |
| 200 | 144 | options: BuildDistributionPackageOptions = {}, |
| 201 | 145 | ): Promise<DistributionPackageArtifact> => { |
| @@ -204,13 +148,8 @@ export const buildDistributionPackage = async ( · 2 unmodified lines | ||
| 204 | 148 | const binDir = join(packageDir, "bin"); |
| 205 | 149 | const resourcesDir = join(packageDir, "resources"); |
| 206 | 150 | const webDir = join(resourcesDir, "web"); |
| 207 | − const migrationsDir = join(resourcesDir, "migrations"); | |
| 208 | 151 | const bundlePath = join(binDir, "executor.mjs"); |
| 209 | 152 | const launcherPath = join(binDir, "executor.js"); |
| 210 | − const postinstallPath = join(binDir, "postinstall.js"); | |
| 211 | − const pgliteDistDir = resolvePGliteDistDir(); | |
| 212 | − const pgliteDataPath = join(pgliteDistDir, "pglite.data"); | |
| 213 | − const pgliteWasmPath = join(pgliteDistDir, "pglite.wasm"); | |
| 214 | 153 | const quickJsWasmPath = resolveQuickJsWasmPath(); |
| 215 | 154 | const webDistDir = join(repoRoot, "apps/web/dist"); |
| 216 | 155 | const readmePath = join(repoRoot, "README.md"); |
| @@ -246,11 +185,6 @@ export const buildDistributionPackage = async ( · 29 unmodified lines | ||
| 246 | 185 | }); |
| 247 | 186 | |
| 248 | 187 | await cp(webDistDir, webDir, { recursive: true }); |
| 249 | − await cp(join(repoRoot, "packages/control-plane/drizzle"), migrationsDir, { | |
| 250 | − recursive: true, | |
| 251 | − }); | |
| 252 | − await cp(pgliteDataPath, join(binDir, "pglite.data")); | |
| 253 | − await cp(pgliteWasmPath, join(binDir, "pglite.wasm")); | |
| 254 | 188 | await cp(quickJsWasmPath, join(binDir, "emscripten-module.wasm")); |
| 255 | 189 | await mkdir(join(binDir, "openapi-extractor-wasm"), { recursive: true }); |
| 256 | 190 | await cp( |
| @@ -273,9 +207,7 @@ export const buildDistributionPackage = async ( · 16 unmodified lines | ||
| 273 | 207 | })); |
| 274 | 208 | await cp(readmePath, join(packageDir, "README.md")); |
| 275 | 209 | await writeFile(launcherPath, createLauncherSource()); |
| 276 | − await writeFile(postinstallPath, createPostinstallSource()); | |
| 277 | 210 | await chmod(launcherPath, 0o755); |
| 278 | − await chmod(postinstallPath, 0o755); | |
| 279 | 211 | |
| 280 | 212 | return { |
| 281 | 213 | packageDir, |
| @@ -1,58 +0,0 @@ | ||
| 1 | −import { buildDistributionPackage } from "./artifact"; | |
| 2 | − | |
| 3 | −type BuildPackageCliOptions = { | |
| 4 | − outputDir?: string; | |
| 5 | − packageName?: string; | |
| 6 | − packageVersion?: string; | |
| 7 | − buildWeb: boolean; | |
| 8 | −}; | |
| 9 | − | |
| 10 | −const parseArgs = (argv: ReadonlyArray<string>): BuildPackageCliOptions => { | |
| 11 | − const options: BuildPackageCliOptions = { | |
| 12 | − buildWeb: true, | |
| 13 | − }; | |
| 14 | − | |
| 15 | − for (let index = 0; index < argv.length; index += 1) { | |
| 16 | − const arg = argv[index]; | |
| 17 | − | |
| 18 | − if (arg === "--skip-web-build") { | |
| 19 | − options.buildWeb = false; | |
| 20 | − continue; | |
| 21 | − } | |
| 22 | − | |
| 23 | − const next = argv[index + 1]; | |
| 24 | − if (!next) { | |
| 25 | − throw new Error(`Missing value for ${arg}`); | |
| 26 | − } | |
| 27 | − | |
| 28 | − if (arg === "--output") { | |
| 29 | − options.outputDir = next; | |
| 30 | − index += 1; | |
| 31 | − continue; | |
| 32 | − } | |
| 33 | − | |
| 34 | − if (arg === "--package-name") { | |
| 35 | − options.packageName = next; | |
| 36 | − index += 1; | |
| 37 | − continue; | |
| 38 | − } | |
| 39 | − | |
| 40 | − if (arg === "--package-version") { | |
| 41 | − options.packageVersion = next; | |
| 42 | − index += 1; | |
| 43 | − continue; | |
| 44 | − } | |
| 45 | − | |
| 46 | − throw new Error(`Unknown argument: ${arg}`); | |
| 47 | − } | |
| 48 | − | |
| 49 | − return options; | |
| 50 | −}; | |
| 51 | − | |
| 52 | −const main = async () => { | |
| 53 | − const options = parseArgs(process.argv.slice(2)); | |
| 54 | − const artifact = await buildDistributionPackage(options); | |
| 55 | − process.stdout.write(`${artifact.packageDir}\n`); | |
| 56 | −}; | |
| 57 | − | |
| 58 | −await main(); | |
| @@ -1,78 +0,0 @@ | ||
| 1 | −import { | |
| 2 | − buildPortableDistribution, | |
| 3 | − type BuildPortableDistributionOptions, | |
| 4 | −} from "./portable"; | |
| 5 | − | |
| 6 | −type BuildPortableCliOptions = BuildPortableDistributionOptions; | |
| 7 | − | |
| 8 | −const parseArgs = (argv: ReadonlyArray<string>): BuildPortableCliOptions => { | |
| 9 | − const options: BuildPortableCliOptions = { | |
| 10 | − buildWeb: true, | |
| 11 | − createArchives: true, | |
| 12 | − }; | |
| 13 | − | |
| 14 | − for (let index = 0; index < argv.length; index += 1) { | |
| 15 | − const arg = argv[index]; | |
| 16 | − | |
| 17 | − if (arg === "--skip-web-build") { | |
| 18 | − options.buildWeb = false; | |
| 19 | − continue; | |
| 20 | − } | |
| 21 | − | |
| 22 | − if (arg === "--no-archive") { | |
| 23 | − options.createArchives = false; | |
| 24 | − continue; | |
| 25 | − } | |
| 26 | − | |
| 27 | − const next = argv[index + 1]; | |
| 28 | − if (!next) { | |
| 29 | − throw new Error(`Missing value for ${arg}`); | |
| 30 | − } | |
| 31 | − | |
| 32 | − if (arg === "--output") { | |
| 33 | − options.outputDir = next; | |
| 34 | − index += 1; | |
| 35 | − continue; | |
| 36 | − } | |
| 37 | − | |
| 38 | − if (arg === "--package-name") { | |
| 39 | − options.packageName = next; | |
| 40 | − index += 1; | |
| 41 | − continue; | |
| 42 | − } | |
| 43 | − | |
| 44 | − if (arg === "--package-version") { | |
| 45 | − options.packageVersion = next; | |
| 46 | − index += 1; | |
| 47 | − continue; | |
| 48 | − } | |
| 49 | − | |
| 50 | − if (arg === "--target") { | |
| 51 | − options.targets = [...(options.targets ?? []), next]; | |
| 52 | − index += 1; | |
| 53 | − continue; | |
| 54 | − } | |
| 55 | − | |
| 56 | − | |
| 57 | − if (arg === "--node-version") { | |
| 58 | − options.nodeVersion = next; | |
| 59 | − index += 1; | |
| 60 | − continue; | |
| 61 | − } | |
| 62 | − | |
| 63 | − throw new Error(`Unknown argument: ${arg}`); | |
| 64 | − } | |
| 65 | − | |
| 66 | − return options; | |
| 67 | −}; | |
| 68 | − | |
| 69 | −const main = async () => { | |
| 70 | − const options = parseArgs(process.argv.slice(2)); | |
| 71 | − const artifact = await buildPortableDistribution(options); | |
| 72 | − | |
| 73 | − for (const bundle of artifact.artifacts) { | |
| 74 | − process.stdout.write(`${bundle.archivePath ?? bundle.bundleDir}\n`); | |
| 75 | − } | |
| 76 | −}; | |
| 77 | − | |
| 78 | −await main(); | |
| @@ -1,137 +0,0 @@ | ||
| 1 | −import { createHash } from "node:crypto"; | |
| 2 | −import { spawn } from "node:child_process"; | |
| 3 | −import { mkdir, readFile, rm, writeFile } from "node:fs/promises"; | |
| 4 | −import { join, relative, resolve } from "node:path"; | |
| 5 | − | |
| 6 | −import { buildDistributionPackage } from "./artifact"; | |
| 7 | −import { repoRoot } from "./metadata"; | |
| 8 | −import { buildPortableDistribution, portableTargetIds } from "./portable"; | |
| 9 | − | |
| 10 | −const defaultReleaseDir = resolve(repoRoot, "apps/executor/dist/release"); | |
| 11 | − | |
| 12 | −type CommandInput = { | |
| 13 | − command: string; | |
| 14 | − args: ReadonlyArray<string>; | |
| 15 | − cwd: string; | |
| 16 | −}; | |
| 17 | − | |
| 18 | −type CommandOutput = { | |
| 19 | − stdout: string; | |
| 20 | − stderr: string; | |
| 21 | −}; | |
| 22 | − | |
| 23 | −type PackResult = { | |
| 24 | − filename?: string; | |
| 25 | −}; | |
| 26 | − | |
| 27 | −const runCommand = async (input: CommandInput): Promise<CommandOutput> => { | |
| 28 | − const child = spawn(input.command, [...input.args], { | |
| 29 | − cwd: input.cwd, | |
| 30 | − env: process.env, | |
| 31 | − stdio: ["ignore", "pipe", "pipe"], | |
| 32 | − }); | |
| 33 | − | |
| 34 | − let stdout = ""; | |
| 35 | − let stderr = ""; | |
| 36 | − | |
| 37 | − child.stdout?.setEncoding("utf8"); | |
| 38 | − child.stdout?.on("data", (chunk) => { | |
| 39 | − stdout += chunk; | |
| 40 | − }); | |
| 41 | − | |
| 42 | − child.stderr?.setEncoding("utf8"); | |
| 43 | − child.stderr?.on("data", (chunk) => { | |
| 44 | − stderr += chunk; | |
| 45 | − }); | |
| 46 | − | |
| 47 | − const exitCode = await new Promise<number>((resolveExitCode, reject) => { | |
| 48 | − child.once("error", reject); | |
| 49 | − child.once("close", (code) => { | |
| 50 | − resolveExitCode(code ?? -1); | |
| 51 | − }); | |
| 52 | − }); | |
| 53 | − | |
| 54 | − if (exitCode !== 0) { | |
| 55 | − throw new Error( | |
| 56 | − [ | |
| 57 | − `${input.command} ${input.args.join(" ")} exited with code ${exitCode}`, | |
| 58 | − stdout.trim().length > 0 ? `stdout:\n${stdout.trim()}` : null, | |
| 59 | − stderr.trim().length > 0 ? `stderr:\n${stderr.trim()}` : null, | |
| 60 | − ] | |
| 61 | − .filter((part) => part !== null) | |
| 62 | − .join("\n\n"), | |
| 63 | − ); | |
| 64 | − } | |
| 65 | − | |
| 66 | − return { | |
| 67 | − stdout: stdout.trim(), | |
| 68 | − stderr: stderr.trim(), | |
| 69 | − }; | |
| 70 | −}; | |
| 71 | − | |
| 72 | −const computeSha256 = (contents: Uint8Array): string => | |
| 73 | − createHash("sha256").update(contents).digest("hex"); | |
| 74 | − | |
| 75 | −const createChecksumsFile = async ( | |
| 76 | − releaseDir: string, | |
| 77 | − assetPaths: ReadonlyArray<string>, | |
| 78 | −): Promise<string> => { | |
| 79 | − const entries = await Promise.all( | |
| 80 | − [...assetPaths] | |
| 81 | − .sort((left, right) => left.localeCompare(right)) | |
| 82 | − .map(async (assetPath) => { | |
| 83 | − const contents = await readFile(assetPath); | |
| 84 | − const relativePath = relative(releaseDir, assetPath).replaceAll("\\", "/"); | |
| 85 | − return `${computeSha256(contents)} ${relativePath}`; | |
| 86 | − }), | |
| 87 | − ); | |
| 88 | − | |
| 89 | − const checksumsPath = join(releaseDir, "checksums.txt"); | |
| 90 | − await writeFile(checksumsPath, `${entries.join("\n")}\n`); | |
| 91 | − return checksumsPath; | |
| 92 | −}; | |
| 93 | − | |
| 94 | −const packDistributionPackage = async (releaseDir: string): Promise<string> => { | |
| 95 | − const output = await runCommand({ | |
| 96 | − command: "npm", | |
| 97 | − args: ["pack", "./apps/executor/dist/npm", "--pack-destination", releaseDir, "--json"], | |
| 98 | − cwd: repoRoot, | |
| 99 | − }); | |
| 100 | − const [result] = JSON.parse(output.stdout) as ReadonlyArray<PackResult>; | |
| 101 | − const filename = result?.filename; | |
| 102 | − | |
| 103 | − if (!filename) { | |
| 104 | − throw new Error(`npm pack did not report an output filename. stdout:\n${output.stdout}`); | |
| 105 | − } | |
| 106 | − | |
| 107 | − return join(releaseDir, filename); | |
| 108 | −}; | |
| 109 | − | |
| 110 | −const main = async () => { | |
| 111 | − const releaseDir = defaultReleaseDir; | |
| 112 | − const portableDir = join(releaseDir, "portable"); | |
| 113 | − | |
| 114 | − await rm(releaseDir, { recursive: true, force: true }); | |
| 115 | − await mkdir(releaseDir, { recursive: true }); | |
| 116 | − | |
| 117 | − await buildDistributionPackage(); | |
| 118 | − const packageArchivePath = await packDistributionPackage(releaseDir); | |
| 119 | − const portableArtifact = await buildPortableDistribution({ | |
| 120 | − outputDir: portableDir, | |
| 121 | − buildWeb: false, | |
| 122 | − targets: portableTargetIds, | |
| 123 | − }); | |
| 124 | − const portableArchivePaths = portableArtifact.artifacts | |
| 125 | − .map((artifact) => artifact.archivePath) | |
| 126 | − .filter((archivePath): archivePath is string => archivePath !== null); | |
| 127 | − const checksumsPath = await createChecksumsFile(releaseDir, [ | |
| 128 | − packageArchivePath, | |
| 129 | − ...portableArchivePaths, | |
| 130 | − ]); | |
| 131 | − | |
| 132 | − for (const assetPath of [packageArchivePath, ...portableArchivePaths, checksumsPath]) { | |
| 133 | − process.stdout.write(`${assetPath}\n`); | |
| 134 | − } | |
| 135 | −}; | |
| 136 | − | |
| 137 | −await main(); | |
| @@ -1,232 +0,0 @@ | ||
| 1 | −import { spawn } from "node:child_process"; | |
| 2 | −import { existsSync } from "node:fs"; | |
| 3 | −import { mkdir, mkdtemp, rm } from "node:fs/promises"; | |
| 4 | −import { createServer } from "node:net"; | |
| 5 | −import { tmpdir } from "node:os"; | |
| 6 | −import { join } from "node:path"; | |
| 7 | − | |
| 8 | −import { describe, expect, it } from "vitest"; | |
| 9 | − | |
| 10 | −import { | |
| 11 | − buildPortableDistribution, | |
| 12 | − resolveDefaultPortableTarget, | |
| 13 | −} from "./portable"; | |
| 14 | − | |
| 15 | −type CommandResult = { | |
| 16 | − stdout: string; | |
| 17 | − stderr: string; | |
| 18 | − exitCode: number; | |
| 19 | −}; | |
| 20 | − | |
| 21 | −const runCommand = async (input: { | |
| 22 | − command: string; | |
| 23 | − args: ReadonlyArray<string>; | |
| 24 | − cwd: string; | |
| 25 | − env: NodeJS.ProcessEnv; | |
| 26 | − okExitCodes?: ReadonlyArray<number>; | |
| 27 | −}): Promise<CommandResult> => { | |
| 28 | − const child = spawn(input.command, [...input.args], { | |
| 29 | − cwd: input.cwd, | |
| 30 | − env: input.env, | |
| 31 | − stdio: ["ignore", "pipe", "pipe"], | |
| 32 | − }); | |
| 33 | − | |
| 34 | − let stdout = ""; | |
| 35 | − let stderr = ""; | |
| 36 | − | |
| 37 | − child.stdout?.setEncoding("utf8"); | |
| 38 | − child.stdout?.on("data", (chunk) => { | |
| 39 | − stdout += chunk; | |
| 40 | − }); | |
| 41 | − | |
| 42 | − child.stderr?.setEncoding("utf8"); | |
| 43 | − child.stderr?.on("data", (chunk) => { | |
| 44 | − stderr += chunk; | |
| 45 | − }); | |
| 46 | − | |
| 47 | − const exitCode = await new Promise<number>((resolveExitCode, reject) => { | |
| 48 | − child.once("error", reject); | |
| 49 | − child.once("close", (code) => { | |
| 50 | − resolveExitCode(code ?? -1); | |
| 51 | − }); | |
| 52 | − }); | |
| 53 | − | |
| 54 | − const result = { | |
| 55 | − stdout: stdout.trim(), | |
| 56 | − stderr: stderr.trim(), | |
| 57 | − exitCode, | |
| 58 | − } satisfies CommandResult; | |
| 59 | − | |
| 60 | − if ((input.okExitCodes ?? [0]).includes(exitCode)) { | |
| 61 | − return result; | |
| 62 | − } | |
| 63 | − | |
| 64 | − throw new Error( | |
| 65 | − [ | |
| 66 | − `${input.command} ${input.args.join(" ")} exited with code ${exitCode}`, | |
| 67 | − result.stdout.length > 0 ? `stdout:\n${result.stdout}` : null, | |
| 68 | − result.stderr.length > 0 ? `stderr:\n${result.stderr}` : null, | |
| 69 | − ].filter((part) => part !== null).join("\n\n"), | |
| 70 | − ); | |
| 71 | −}; | |
| 72 | − | |
| 73 | −const allocatePort = async (): Promise<number> => | |
| 74 | − await new Promise<number>((resolvePort, reject) => { | |
| 75 | − const server = createServer(); | |
| 76 | − server.once("error", reject); | |
| 77 | − server.listen(0, "127.0.0.1", () => { | |
| 78 | − const address = server.address(); | |
| 79 | − if (!address || typeof address === "string") { | |
| 80 | − server.close(() => reject(new Error("Failed to allocate test port"))); | |
| 81 | − return; | |
| 82 | − } | |
| 83 | − | |
| 84 | − server.close((error) => { | |
| 85 | − if (error) { | |
| 86 | − reject(error); | |
| 87 | − return; | |
| 88 | − } | |
| 89 | − | |
| 90 | − resolvePort(address.port); | |
| 91 | − }); | |
| 92 | − }); | |
| 93 | − }); | |
| 94 | − | |
| 95 | −describe("portable distribution flow", () => { | |
| 96 | − it("installs and boots a portable bundle in a fresh home", async () => { | |
| 97 | − const tempRoot = await mkdtemp(join(tmpdir(), "executor-portable-")); | |
| 98 | − | |
| 99 | − try { | |
| 100 | − const distDir = join(tempRoot, "dist"); | |
| 101 | − const homeDir = join(tempRoot, "home"); | |
| 102 | − const binDir = join(homeDir, ".local", "bin"); | |
| 103 | − const installHome = process.platform === "darwin" | |
| 104 | − ? join(homeDir, "Library", "Application Support", "Executor") | |
| 105 | − : join(homeDir, ".local", "share", "executor"); | |
| 106 | − const runHome = process.platform === "darwin" | |
| 107 | − ? join(installHome, "run") | |
| 108 | − : join(homeDir, ".local", "state", "executor", "run"); | |
| 109 | − const legacyExecutorBin = join(homeDir, ".executor", "bin", "executor"); | |
| 110 | − const baseUrl = `http://127.0.0.1:${await allocatePort()}`; | |
| 111 | − | |
| 112 | − await mkdir(homeDir, { recursive: true }); | |
| 113 | − await mkdir(binDir, { recursive: true }); | |
| 114 | − | |
| 115 | − const artifact = await buildPortableDistribution({ | |
| 116 | − outputDir: distDir, | |
| 117 | − buildWeb: false, | |
| 118 | − targets: [resolveDefaultPortableTarget()], | |
| 119 | − }); | |
| 120 | − const bundle = artifact.artifacts[0]!; | |
| 121 | − | |
| 122 | − const env = { | |
| 123 | − ...process.env, | |
| 124 | − HOME: homeDir, | |
| 125 | − PATH: `${binDir}:/usr/bin:/bin`, | |
| 126 | − } satisfies NodeJS.ProcessEnv; | |
| 127 | − | |
| 128 | − await runCommand({ | |
| 129 | − command: "sh", | |
| 130 | − args: [bundle.installScriptPath], | |
| 131 | − cwd: bundle.bundleDir, | |
| 132 | − env, | |
| 133 | − }); | |
| 134 | − | |
| 135 | − await runCommand({ | |
| 136 | − command: "sh", | |
| 137 | − args: [bundle.installScriptPath], | |
| 138 | − cwd: bundle.bundleDir, | |
| 139 | − env, | |
| 140 | − }); | |
| 141 | − | |
| 142 | − expect(existsSync(join(binDir, "executor"))).toBe(true); | |
| 143 | − expect(existsSync(join(installHome, "portable"))).toBe(true); | |
| 144 | − expect(existsSync(legacyExecutorBin)).toBe(false); | |
| 145 | − | |
| 146 | − const initialDoctor = await runCommand({ | |
| 147 | − command: "executor", | |
| 148 | − args: ["doctor", "--json", "--base-url", baseUrl], | |
| 149 | − cwd: tempRoot, | |
| 150 | − env, | |
| 151 | − }); | |
| 152 | − const initialDoctorJson = JSON.parse(initialDoctor.stdout) as { | |
| 153 | − ok: boolean; | |
| 154 | − checks: Record<string, { ok: boolean }>; | |
| 155 | − }; | |
| 156 | − expect(initialDoctorJson.ok).toBe(false); | |
| 157 | − expect(initialDoctorJson.checks.webAssets?.ok).toBe(true); | |
| 158 | − expect(initialDoctorJson.checks.migrations?.ok).toBe(true); | |
| 159 | − | |
| 160 | − await runCommand({ | |
| 161 | − command: "executor", | |
| 162 | − args: ["up", "--base-url", baseUrl], | |
| 163 | − cwd: tempRoot, | |
| 164 | − env, | |
| 165 | − }); | |
| 166 | − | |
| 167 | − const statusResult = await runCommand({ | |
| 168 | − command: "executor", | |
| 169 | − args: ["status", "--json", "--base-url", baseUrl], | |
| 170 | − cwd: tempRoot, | |
| 171 | − env, | |
| 172 | − }); | |
| 173 | − const status = JSON.parse(statusResult.stdout) as { | |
| 174 | − reachable: boolean; | |
| 175 | − pidRunning: boolean; | |
| 176 | − logFile: string; | |
| 177 | − localDataDir: string; | |
| 178 | − pidFile: string; | |
| 179 | − installation: { workspaceId: string; accountId: string } | null; | |
| 180 | − }; | |
| 181 | − expect(status.reachable).toBe(true); | |
| 182 | − expect(status.pidRunning).toBe(true); | |
| 183 | − expect(status.installation).not.toBeNull(); | |
| 184 | − expect(status.logFile.startsWith(runHome)).toBe(true); | |
| 185 | − expect(status.localDataDir.startsWith(join(installHome, "data"))).toBe(true); | |
| 186 | − expect(status.pidFile.startsWith(runHome)).toBe(true); | |
| 187 | − | |
| 188 | − const html = await fetch(new URL("/", baseUrl)); | |
| 189 | − expect(html.status).toBe(200); | |
| 190 | − expect(html.headers.get("content-type")).toContain("text/html"); | |
| 191 | − expect(await html.text()).toContain('<div id="root"></div>'); | |
| 192 | − | |
| 193 | − const installationResponse = await fetch(new URL("/v1/local/installation", baseUrl)); | |
| 194 | − expect(installationResponse.status).toBe(200); | |
| 195 | − const installation = await installationResponse.json() as { | |
| 196 | − workspaceId: string; | |
| 197 | − accountId: string; | |
| 198 | − }; | |
| 199 | − | |
| 200 | − await runCommand({ | |
| 201 | − command: "executor", | |
| 202 | − args: ["down", "--base-url", baseUrl], | |
| 203 | − cwd: tempRoot, | |
| 204 | − env, | |
| 205 | − }); | |
| 206 | − await runCommand({ | |
| 207 | − command: "executor", | |
| 208 | − args: ["up", "--base-url", baseUrl], | |
| 209 | − cwd: tempRoot, | |
| 210 | − env, | |
| 211 | − }); | |
| 212 | − | |
| 213 | − const installationAfterRestartResponse = await fetch(new URL("/v1/local/installation", baseUrl)); | |
| 214 | − expect(installationAfterRestartResponse.status).toBe(200); | |
| 215 | − const installationAfterRestart = await installationAfterRestartResponse.json() as { | |
| 216 | − workspaceId: string; | |
| 217 | − accountId: string; | |
| 218 | − }; | |
| 219 | − expect(installationAfterRestart.workspaceId).toBe(installation.workspaceId); | |
| 220 | − expect(installationAfterRestart.accountId).toBe(installation.accountId); | |
| 221 | − | |
| 222 | − await runCommand({ | |
| 223 | − command: "executor", | |
| 224 | − args: ["down", "--base-url", baseUrl], | |
| 225 | − cwd: tempRoot, | |
| 226 | − env, | |
| 227 | − }); | |
| 228 | − } finally { | |
| 229 | − await rm(tempRoot, { recursive: true, force: true }); | |
| 230 | − } | |
| 231 | − }, 240_000); | |
| 232 | −}); | |
| @@ -1,607 +0,0 @@ | ||
| 1 | −import { createHash } from "node:crypto"; | |
| 2 | −import { spawn } from "node:child_process"; | |
| 3 | −import { existsSync } from "node:fs"; | |
| 4 | −import { | |
| 5 | − chmod, | |
| 6 | − copyFile, | |
| 7 | − cp, | |
| 8 | − mkdir, | |
| 9 | − mkdtemp, | |
| 10 | − readFile, | |
| 11 | − rm, | |
| 12 | − writeFile, | |
| 13 | −} from "node:fs/promises"; | |
| 14 | −import { tmpdir } from "node:os"; | |
| 15 | −import { basename, join, resolve } from "node:path"; | |
| 16 | − | |
| 17 | −import { buildDistributionPackage } from "./artifact"; | |
| 18 | −import { readDistributionPackageMetadata, repoRoot } from "./metadata"; | |
| 19 | − | |
| 20 | −const defaultOutputDir = resolve(repoRoot, "apps/executor/dist/portable"); | |
| 21 | −const defaultNodeCacheDir = resolve(repoRoot, "apps/executor/.cache/portable-node"); | |
| 22 | −const DEFAULT_OFFICIAL_NODE_VERSION = "v24.14.0"; | |
| 23 | − | |
| 24 | −type PortableTarget = { | |
| 25 | − id: string; | |
| 26 | − archiveExtension: "tar.gz" | "zip"; | |
| 27 | − archiveFileName: (nodeVersion: string) => string; | |
| 28 | − extractedExecutablePath: (nodeVersion: string) => string; | |
| 29 | − bundledExecutableName: string; | |
| 30 | −}; | |
| 31 | − | |
| 32 | −const portableTargets: Record<string, PortableTarget> = { | |
| 33 | − "linux-x64": { | |
| 34 | − id: "linux-x64", | |
| 35 | − archiveExtension: "tar.gz", | |
| 36 | − archiveFileName: (nodeVersion: string) => `node-${nodeVersion}-linux-x64.tar.gz`, | |
| 37 | − extractedExecutablePath: (nodeVersion: string) => join(`node-${nodeVersion}-linux-x64`, "bin", "node"), | |
| 38 | − bundledExecutableName: "node", | |
| 39 | − }, | |
| 40 | − "linux-arm64": { | |
| 41 | − id: "linux-arm64", | |
| 42 | − archiveExtension: "tar.gz", | |
| 43 | − archiveFileName: (nodeVersion: string) => `node-${nodeVersion}-linux-arm64.tar.gz`, | |
| 44 | − extractedExecutablePath: (nodeVersion: string) => join(`node-${nodeVersion}-linux-arm64`, "bin", "node"), | |
| 45 | − bundledExecutableName: "node", | |
| 46 | − }, | |
| 47 | − "darwin-x64": { | |
| 48 | − id: "darwin-x64", | |
| 49 | − archiveExtension: "tar.gz", | |
| 50 | − archiveFileName: (nodeVersion: string) => `node-${nodeVersion}-darwin-x64.tar.gz`, | |
| 51 | − extractedExecutablePath: (nodeVersion: string) => join(`node-${nodeVersion}-darwin-x64`, "bin", "node"), | |
| 52 | − bundledExecutableName: "node", | |
| 53 | − }, | |
| 54 | − "darwin-arm64": { | |
| 55 | − id: "darwin-arm64", | |
| 56 | − archiveExtension: "tar.gz", | |
| 57 | − archiveFileName: (nodeVersion: string) => `node-${nodeVersion}-darwin-arm64.tar.gz`, | |
| 58 | − extractedExecutablePath: (nodeVersion: string) => join(`node-${nodeVersion}-darwin-arm64`, "bin", "node"), | |
| 59 | − bundledExecutableName: "node", | |
| 60 | − }, | |
| 61 | − "win-x64": { | |
| 62 | − id: "win-x64", | |
| 63 | − archiveExtension: "zip", | |
| 64 | − archiveFileName: (nodeVersion: string) => `node-${nodeVersion}-win-x64.zip`, | |
| 65 | − extractedExecutablePath: (nodeVersion: string) => join(`node-${nodeVersion}-win-x64`, "node.exe"), | |
| 66 | − bundledExecutableName: "node.exe", | |
| 67 | − }, | |
| 68 | − "win-arm64": { | |
| 69 | − id: "win-arm64", | |
| 70 | − archiveExtension: "zip", | |
| 71 | − archiveFileName: (nodeVersion: string) => `node-${nodeVersion}-win-arm64.zip`, | |
| 72 | − extractedExecutablePath: (nodeVersion: string) => join(`node-${nodeVersion}-win-arm64`, "node.exe"), | |
| 73 | − bundledExecutableName: "node.exe", | |
| 74 | − }, | |
| 75 | −}; | |
| 76 | − | |
| 77 | −export const portableTargetIds = Object.freeze(Object.keys(portableTargets)); | |
| 78 | − | |
| 79 | −export type BuildPortableDistributionOptions = { | |
| 80 | − outputDir?: string; | |
| 81 | − packageName?: string; | |
| 82 | − packageVersion?: string; | |
| 83 | − buildWeb?: boolean; | |
| 84 | − targets?: ReadonlyArray<string>; | |
| 85 | − nodeVersion?: string; | |
| 86 | − createArchives?: boolean; | |
| 87 | −}; | |
| 88 | − | |
| 89 | −export type PortableBundleArtifact = { | |
| 90 | − target: string; | |
| 91 | − bundleDir: string; | |
| 92 | − launcherPath: string; | |
| 93 | − installScriptPath: string; | |
| 94 | − archivePath: string | null; | |
| 95 | − nodeVersion: string; | |
| 96 | −}; | |
| 97 | − | |
| 98 | −export type PortableDistributionArtifact = { | |
| 99 | − outputDir: string; | |
| 100 | − artifacts: ReadonlyArray<PortableBundleArtifact>; | |
| 101 | −}; | |
| 102 | − | |
| 103 | − | |
| 104 | −type NodeShasums = Map<string, string>; | |
| 105 | − | |
| 106 | −type CommandInput = { | |
| 107 | − command: string; | |
| 108 | − args: ReadonlyArray<string>; | |
| 109 | − cwd: string; | |
| 110 | −}; | |
| 111 | − | |
| 112 | −type CommandOutput = { | |
| 113 | − stdout: string; | |
| 114 | − stderr: string; | |
| 115 | −}; | |
| 116 | − | |
| 117 | −const runCommand = async (input: CommandInput): Promise<CommandOutput> => { | |
| 118 | − const child = spawn(input.command, [...input.args], { | |
| 119 | − cwd: input.cwd, | |
| 120 | − env: process.env, | |
| 121 | − stdio: ["ignore", "pipe", "pipe"], | |
| 122 | − }); | |
| 123 | − | |
| 124 | − let stdout = ""; | |
| 125 | − let stderr = ""; | |
| 126 | − | |
| 127 | − child.stdout?.setEncoding("utf8"); | |
| 128 | − child.stdout?.on("data", (chunk) => { | |
| 129 | − stdout += chunk; | |
| 130 | − }); | |
| 131 | − | |
| 132 | − child.stderr?.setEncoding("utf8"); | |
| 133 | − child.stderr?.on("data", (chunk) => { | |
| 134 | − stderr += chunk; | |
| 135 | − }); | |
| 136 | − | |
| 137 | − const exitCode = await new Promise<number>((resolveExitCode, reject) => { | |
| 138 | − child.once("error", reject); | |
| 139 | − child.once("close", (code) => { | |
| 140 | − resolveExitCode(code ?? -1); | |
| 141 | − }); | |
| 142 | − }); | |
| 143 | − | |
| 144 | − if (exitCode !== 0) { | |
| 145 | − throw new Error( | |
| 146 | − [ | |
| 147 | − `${input.command} ${input.args.join(" ")} exited with code ${exitCode}`, | |
| 148 | − stdout.trim().length > 0 ? `stdout:\n${stdout.trim()}` : null, | |
| 149 | − stderr.trim().length > 0 ? `stderr:\n${stderr.trim()}` : null, | |
| 150 | − ] | |
| 151 | − .filter((part) => part !== null) | |
| 152 | − .join("\n\n"), | |
| 153 | − ); | |
| 154 | − } | |
| 155 | − | |
| 156 | − return { | |
| 157 | − stdout: stdout.trim(), | |
| 158 | − stderr: stderr.trim(), | |
| 159 | − }; | |
| 160 | −}; | |
| 161 | − | |
| 162 | −const normalizeNodeVersion = (value: string): string => | |
| 163 | − value.startsWith("v") ? value : `v${value}`; | |
| 164 | − | |
| 165 | −const computeSha256 = (contents: Uint8Array): string => | |
| 166 | − createHash("sha256").update(contents).digest("hex"); | |
| 167 | − | |
| 168 | −const parseNodeShasums = (contents: string): NodeShasums => | |
| 169 | − new Map( | |
| 170 | − contents | |
| 171 | − .split(/\r?\n/u) | |
| 172 | − .map((line) => line.trim()) | |
| 173 | − .filter((line) => line.length > 0) | |
| 174 | − .flatMap((line) => { | |
| 175 | − const match = /^(?<sha>[a-f0-9]{64})\s+(?<filename>.+)$/iu.exec(line); | |
| 176 | − if (!match?.groups) { | |
| 177 | − return []; | |
| 178 | − } | |
| 179 | − | |
| 180 | − return [[match.groups.filename, match.groups.sha.toLowerCase()] as const]; | |
| 181 | − }), | |
| 182 | − ); | |
| 183 | − | |
| 184 | −const getHostTargetId = (): string => { | |
| 185 | − if (process.platform === "linux" && process.arch === "x64") { | |
| 186 | − return "linux-x64"; | |
| 187 | − } | |
| 188 | − | |
| 189 | − if (process.platform === "linux" && process.arch === "arm64") { | |
| 190 | − return "linux-arm64"; | |
| 191 | − } | |
| 192 | − | |
| 193 | − if (process.platform === "darwin" && process.arch === "x64") { | |
| 194 | − return "darwin-x64"; | |
| 195 | − } | |
| 196 | − | |
| 197 | − if (process.platform === "darwin" && process.arch === "arm64") { | |
| 198 | − return "darwin-arm64"; | |
| 199 | − } | |
| 200 | − | |
| 201 | − if (process.platform === "win32" && process.arch === "x64") { | |
| 202 | − return "win-x64"; | |
| 203 | − } | |
| 204 | − | |
| 205 | − if (process.platform === "win32" && process.arch === "arm64") { | |
| 206 | − return "win-arm64"; | |
| 207 | − } | |
| 208 | − | |
| 209 | − throw new Error(`Unsupported host platform for portable bundle: ${process.platform}-${process.arch}`); | |
| 210 | −}; | |
| 211 | − | |
| 212 | −export const resolveDefaultPortableTarget = (): string => getHostTargetId(); | |
| 213 | − | |
| 214 | −const resolveTargets = (requested: ReadonlyArray<string> | undefined): ReadonlyArray<PortableTarget> => { | |
| 215 | − const targetIds = requested && requested.length > 0 ? requested : [getHostTargetId()]; | |
| 216 | − | |
| 217 | − return targetIds.map((targetId) => { | |
| 218 | − const target = portableTargets[targetId]; | |
| 219 | − if (!target) { | |
| 220 | − throw new Error(`Unsupported portable target: ${targetId}`); | |
| 221 | − } | |
| 222 | − return target; | |
| 223 | − }); | |
| 224 | −}; | |
| 225 | − | |
| 226 | − | |
| 227 | −const resolveNodeVersion = async (requestedVersion: string | undefined): Promise<string> => { | |
| 228 | − if (!requestedVersion) { | |
| 229 | − return DEFAULT_OFFICIAL_NODE_VERSION; | |
| 230 | − } | |
| 231 | − | |
| 232 | − return normalizeNodeVersion(requestedVersion); | |
| 233 | −}; | |
| 234 | − | |
| 235 | − | |
| 236 | −const ensureOfficialNodeRuntime = async (input: { | |
| 237 | − target: PortableTarget; | |
| 238 | − nodeVersion: string; | |
| 239 | − cacheDir: string; | |
| 240 | − destinationPath: string; | |
| 241 | −}): Promise<void> => { | |
| 242 | − const archiveName = input.target.archiveFileName(input.nodeVersion); | |
| 243 | − const archivePath = join(input.cacheDir, archiveName); | |
| 244 | − const shasumsPath = join(input.cacheDir, "SHASUMS256.txt"); | |
| 245 | − const url = `https://nodejs.org/dist/${input.nodeVersion}/${archiveName}`; | |
| 246 | − const shasumsUrl = `https://nodejs.org/dist/${input.nodeVersion}/SHASUMS256.txt`; | |
| 247 | − | |
| 248 | − await mkdir(input.cacheDir, { recursive: true }); | |
| 249 | − | |
| 250 | − let shasumsContents = existsSync(shasumsPath) | |
| 251 | − ? await readFile(shasumsPath, "utf8") | |
| 252 | − : null; | |
| 253 | − | |
| 254 | − if (shasumsContents === null) { | |
| 255 | − const response = await fetch(shasumsUrl); | |
| 256 | − if (!response.ok) { | |
| 257 | − throw new Error(`Unable to download ${shasumsUrl}: ${response.status} ${response.statusText}`); | |
| 258 | − } | |
| 259 | − | |
| 260 | − shasumsContents = await response.text(); | |
| 261 | − await writeFile(shasumsPath, shasumsContents); | |
| 262 | − } | |
| 263 | − | |
| 264 | − const shasums = parseNodeShasums(shasumsContents); | |
| 265 | − const expectedChecksum = shasums.get(archiveName); | |
| 266 | − if (!expectedChecksum) { | |
| 267 | − throw new Error(`Missing checksum for ${archiveName} in ${shasumsUrl}`); | |
| 268 | − } | |
| 269 | − | |
| 270 | − const ensureArchiveMatchesChecksum = async (): Promise<void> => { | |
| 271 | − if (!existsSync(archivePath)) { | |
| 272 | − return; | |
| 273 | − } | |
| 274 | − | |
| 275 | − const existingArchive = await readFile(archivePath); | |
| 276 | − if (computeSha256(existingArchive) === expectedChecksum) { | |
| 277 | − return; | |
| 278 | − } | |
| 279 | − | |
| 280 | − await rm(archivePath, { force: true }); | |
| 281 | − }; | |
| 282 | − | |
| 283 | − await ensureArchiveMatchesChecksum(); | |
| 284 | − | |
| 285 | − if (!existsSync(archivePath)) { | |
| 286 | − const response = await fetch(url); | |
| 287 | − if (!response.ok) { | |
| 288 | − throw new Error(`Unable to download ${url}: ${response.status} ${response.statusText}`); | |
| 289 | − } | |
| 290 | − | |
| 291 | − const bytes = Buffer.from(await response.arrayBuffer()); | |
| 292 | − const actualChecksum = computeSha256(bytes); | |
| 293 | − if (actualChecksum !== expectedChecksum) { | |
| 294 | − throw new Error( | |
| 295 | − `Checksum mismatch for ${archiveName}: expected ${expectedChecksum}, received ${actualChecksum}`, | |
| 296 | − ); | |
| 297 | − } | |
| 298 | − | |
| 299 | − await writeFile(archivePath, bytes); | |
| 300 | − } | |
| 301 | − | |
| 302 | − const extractDir = await mkdtemp(join(tmpdir(), "executor-portable-node-")); | |
| 303 | − try { | |
| 304 | − if (input.target.archiveExtension === "tar.gz") { | |
| 305 | − await runCommand({ | |
| 306 | − command: "tar", | |
| 307 | − args: ["-xzf", archivePath, "-C", extractDir], | |
| 308 | − cwd: repoRoot, | |
| 309 | − }); | |
| 310 | − } else { | |
| 311 | − await runCommand({ | |
| 312 | − command: "unzip", | |
| 313 | − args: ["-q", archivePath, "-d", extractDir], | |
| 314 | − cwd: repoRoot, | |
| 315 | − }); | |
| 316 | − } | |
| 317 | − | |
| 318 | − const extractedExecutable = join( | |
| 319 | − extractDir, | |
| 320 | − input.target.extractedExecutablePath(input.nodeVersion), | |
| 321 | − ); | |
| 322 | − | |
| 323 | − if (!existsSync(extractedExecutable)) { | |
| 324 | − throw new Error(`Missing extracted Node.js executable at ${extractedExecutable}`); | |
| 325 | − } | |
| 326 | − | |
| 327 | − await copyFile(extractedExecutable, input.destinationPath); | |
| 328 | − } finally { | |
| 329 | − await rm(extractDir, { recursive: true, force: true }); | |
| 330 | − } | |
| 331 | −}; | |
| 332 | − | |
| 333 | −const createUnixLauncher = (): string => [ | |
| 334 | − "#!/bin/sh", | |
| 335 | − "set -eu", | |
| 336 | − 'SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)', | |
| 337 | − 'exec "$SCRIPT_DIR/runtime/node" "$SCRIPT_DIR/bin/executor.mjs" "$@"', | |
| 338 | − "", | |
| 339 | −].join("\n"); | |
| 340 | − | |
| 341 | −const createWindowsLauncher = (): string => [ | |
| 342 | − "@echo off", | |
| 343 | − 'set "SCRIPT_DIR=%~dp0"', | |
| 344 | − '"%SCRIPT_DIR%runtime\\node.exe" "%SCRIPT_DIR%bin\\executor.mjs" %*', | |
| 345 | − "", | |
| 346 | −].join("\r\n"); | |
| 347 | − | |
| 348 | −const createInstallScript = (input: { | |
| 349 | − packageName: string; | |
| 350 | − packageVersion: string; | |
| 351 | − target: string; | |
| 352 | −}) => [ | |
| 353 | − "#!/bin/sh", | |
| 354 | − "set -eu", | |
| 355 | − 'SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)', | |
| 356 | − 'DEFAULT_INSTALL_HOME=${EXECUTOR_INSTALL_HOME:-}', | |
| 357 | − 'if [ -z "$DEFAULT_INSTALL_HOME" ]; then', | |
| 358 | − ' if [ "$(uname -s)" = "Darwin" ]; then', | |
| 359 | − ' DEFAULT_INSTALL_HOME="$HOME/Library/Application Support/Executor"', | |
| 360 | − ' else', | |
| 361 | − ' DEFAULT_INSTALL_HOME="${XDG_DATA_HOME:-$HOME/.local/share}/executor"', | |
| 362 | − ' fi', | |
| 363 | − 'fi', | |
| 364 | − 'DEFAULT_BIN_DIR=${EXECUTOR_BIN_DIR:-${XDG_BIN_HOME:-$HOME/.local/bin}}', | |
| 365 | − `PACKAGE_NAME=${JSON.stringify(input.packageName)}`, | |
| 366 | − `PACKAGE_VERSION=${JSON.stringify(input.packageVersion)}`, | |
| 367 | − `TARGET_ID=${JSON.stringify(input.target)}`, | |
| 368 | − 'INSTALL_DIR="$DEFAULT_INSTALL_HOME/portable/$PACKAGE_VERSION/$TARGET_ID"', | |
| 369 | − 'INSTALL_PARENT=$(dirname "$INSTALL_DIR")', | |
| 370 | − 'STAGING_DIR="$INSTALL_PARENT/.install-$PACKAGE_VERSION-$TARGET_ID-$$"', | |
| 371 | − 'PREVIOUS_DIR="$INSTALL_PARENT/.previous-$PACKAGE_VERSION-$TARGET_ID-$$"', | |
| 372 | − 'BIN_DIR="$DEFAULT_BIN_DIR"', | |
| 373 | − "", | |
| 374 | − 'while [ "$#" -gt 0 ]; do', | |
| 375 | − ' case "$1" in', | |
| 376 | − ' --install-dir)', | |
| 377 | − ' INSTALL_DIR="$2"', | |
| 378 | − ' INSTALL_PARENT=$(dirname "$INSTALL_DIR")', | |
| 379 | − ' STAGING_DIR="$INSTALL_PARENT/.install-$PACKAGE_VERSION-$TARGET_ID-$$"', | |
| 380 | − ' PREVIOUS_DIR="$INSTALL_PARENT/.previous-$PACKAGE_VERSION-$TARGET_ID-$$"', | |
| 381 | − ' shift 2', | |
| 382 | − ' ;;', | |
| 383 | − ' --bin-dir)', | |
| 384 | − ' BIN_DIR="$2"', | |
| 385 | − ' shift 2', | |
| 386 | − ' ;;', | |
| 387 | − ' *)', | |
| 388 | − ' printf "Unknown argument: %s\\n" "$1" >&2', | |
| 389 | − ' exit 1', | |
| 390 | − ' ;;', | |
| 391 | − ' esac', | |
| 392 | − 'done', | |
| 393 | − "", | |
| 394 | − 'rm -rf "$STAGING_DIR" "$PREVIOUS_DIR"', | |
| 395 | − 'mkdir -p "$INSTALL_PARENT" "$STAGING_DIR" "$BIN_DIR"', | |
| 396 | − 'cp -R "$SCRIPT_DIR/bin" "$STAGING_DIR/bin"', | |
| 397 | − 'cp -R "$SCRIPT_DIR/runtime" "$STAGING_DIR/runtime"', | |
| 398 | − 'cp -R "$SCRIPT_DIR/resources" "$STAGING_DIR/resources"', | |
| 399 | − 'cp "$SCRIPT_DIR/package.json" "$STAGING_DIR/package.json"', | |
| 400 | − 'cp "$SCRIPT_DIR/executor" "$STAGING_DIR/executor"', | |
| 401 | − 'cp "$SCRIPT_DIR/executor.cmd" "$STAGING_DIR/executor.cmd"', | |
| 402 | − 'cp "$SCRIPT_DIR/install.sh" "$STAGING_DIR/install.sh"', | |
| 403 | − 'cp "$SCRIPT_DIR/install.ps1" "$STAGING_DIR/install.ps1"', | |
| 404 | − 'chmod 755 "$STAGING_DIR/executor" "$STAGING_DIR/runtime/node"', | |
| 405 | − 'if [ -e "$INSTALL_DIR" ]; then mv "$INSTALL_DIR" "$PREVIOUS_DIR"; fi', | |
| 406 | − 'mv "$STAGING_DIR" "$INSTALL_DIR"', | |
| 407 | − 'rm -rf "$PREVIOUS_DIR"', | |
| 408 | − 'WRAPPER_PATH="$BIN_DIR/executor"', | |
| 409 | − 'WRAPPER_TEMP="$WRAPPER_PATH.tmp.$$"', | |
| 410 | − 'cat > "$WRAPPER_TEMP" <<EOF', | |
| 411 | − '#!/bin/sh', | |
| 412 | − 'exec "$INSTALL_DIR/executor" "\\$@"', | |
| 413 | − 'EOF', | |
| 414 | − 'chmod 755 "$WRAPPER_TEMP"', | |
| 415 | − 'mv "$WRAPPER_TEMP" "$WRAPPER_PATH"', | |
| 416 | − 'printf "Installed %s %s to %s\\n" "$PACKAGE_NAME" "$PACKAGE_VERSION" "$INSTALL_DIR"', | |
| 417 | − 'printf "Launcher: %s\\n" "$BIN_DIR/executor"', | |
| 418 | − 'case ":${PATH}:" in', | |
| 419 | − ' *":${BIN_DIR}:"*) ;;', | |
| 420 | − ' *) printf "Add %s to PATH to run `executor` directly.\\n" "$BIN_DIR" ;;', | |
| 421 | − 'esac', | |
| 422 | − "", | |
| 423 | −].join("\n"); | |
| 424 | − | |
| 425 | −const createInstallPowerShellScript = (input: { | |
| 426 | − packageName: string; | |
| 427 | − packageVersion: string; | |
| 428 | − target: string; | |
| 429 | −}) => [ | |
| 430 | − 'param(', | |
| 431 | − ' [string]$InstallHome = $(if ($env:EXECUTOR_INSTALL_HOME) { $env:EXECUTOR_INSTALL_HOME } elseif ($env:LOCALAPPDATA) { Join-Path $env:LOCALAPPDATA "Executor" } else { Join-Path $env:USERPROFILE "AppData\\Local\\Executor" }),', | |
| 432 | − ' [string]$BinDir = $(if ($env:EXECUTOR_BIN_DIR) { $env:EXECUTOR_BIN_DIR } else { Join-Path $env:USERPROFILE ".local\\bin" })', | |
| 433 | − ')', | |
| 434 | − '$ErrorActionPreference = "Stop"', | |
| 435 | − '$InstallDir = Join-Path $InstallHome "portable\\' + input.packageVersion + '\\' + input.target + '"', | |
| 436 | − '$InstallParent = Split-Path -Parent $InstallDir', | |
| 437 | − '$StageDir = Join-Path $InstallParent (".install-' + input.packageVersion + '-' + input.target + '-" + [Guid]::NewGuid().ToString("N"))', | |
| 438 | − '$PreviousDir = Join-Path $InstallParent (".previous-' + input.packageVersion + '-' + input.target + '-" + [Guid]::NewGuid().ToString("N"))', | |
| 439 | − '$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path', | |
| 440 | − 'New-Item -ItemType Directory -Force -Path $InstallParent | Out-Null', | |
| 441 | − 'if (Test-Path $StageDir) { Remove-Item -Path $StageDir -Recurse -Force }', | |
| 442 | − 'if (Test-Path $PreviousDir) { Remove-Item -Path $PreviousDir -Recurse -Force }', | |
| 443 | − 'New-Item -ItemType Directory -Force -Path $StageDir | Out-Null', | |
| 444 | − 'New-Item -ItemType Directory -Force -Path $BinDir | Out-Null', | |
| 445 | − 'Copy-Item -Path (Join-Path $ScriptDir "bin") -Destination (Join-Path $StageDir "bin") -Recurse -Force', | |
| 446 | − 'Copy-Item -Path (Join-Path $ScriptDir "runtime") -Destination (Join-Path $StageDir "runtime") -Recurse -Force', | |
| 447 | − 'Copy-Item -Path (Join-Path $ScriptDir "resources") -Destination (Join-Path $StageDir "resources") -Recurse -Force', | |
| 448 | − 'Copy-Item -Path (Join-Path $ScriptDir "package.json") -Destination (Join-Path $StageDir "package.json") -Force', | |
| 449 | − 'Copy-Item -Path (Join-Path $ScriptDir "executor") -Destination (Join-Path $StageDir "executor") -Force', | |
| 450 | − 'Copy-Item -Path (Join-Path $ScriptDir "executor.cmd") -Destination (Join-Path $StageDir "executor.cmd") -Force', | |
| 451 | − 'Copy-Item -Path (Join-Path $ScriptDir "install.sh") -Destination (Join-Path $StageDir "install.sh") -Force', | |
| 452 | − 'Copy-Item -Path (Join-Path $ScriptDir "install.ps1") -Destination (Join-Path $StageDir "install.ps1") -Force', | |
| 453 | − 'if (Test-Path $InstallDir) { Move-Item -Path $InstallDir -Destination $PreviousDir -Force }', | |
| 454 | − 'Move-Item -Path $StageDir -Destination $InstallDir -Force', | |
| 455 | − 'if (Test-Path $PreviousDir) { Remove-Item -Path $PreviousDir -Recurse -Force }', | |
| 456 | − '$WrapperPath = Join-Path $BinDir "executor.cmd"', | |
| 457 | − '$WrapperTemp = "$WrapperPath.tmp"', | |
| 458 | − 'Set-Content -Path $WrapperTemp -Value ("@echo off`r`n\"" + (Join-Path $InstallDir "executor.cmd") + "\" %*`r`n") -NoNewline', | |
| 459 | − 'Move-Item -Path $WrapperTemp -Destination $WrapperPath -Force', | |
| 460 | − 'Write-Host "Installed ' + input.packageName + ' ' + input.packageVersion + ' to $InstallDir"', | |
| 461 | − 'Write-Host "Launcher: $WrapperPath"', | |
| 462 | −].join("\r\n"); | |
| 463 | − | |
| 464 | −const createArchive = async (input: { | |
| 465 | − bundleDir: string; | |
| 466 | − archivePath: string; | |
| 467 | − target: PortableTarget; | |
| 468 | − outputDir: string; | |
| 469 | −}): Promise<void> => { | |
| 470 | − const bundleName = basename(input.bundleDir); | |
| 471 | − | |
| 472 | − if (input.target.archiveExtension === "tar.gz") { | |
| 473 | − await runCommand({ | |
| 474 | − command: "tar", | |
| 475 | − args: ["-czf", input.archivePath, "-C", input.outputDir, bundleName], | |
| 476 | − cwd: repoRoot, | |
| 477 | − }); | |
| 478 | − return; | |
| 479 | − } | |
| 480 | − | |
| 481 | − await runCommand({ | |
| 482 | − command: "python3", | |
| 483 | − args: [ | |
| 484 | − "-c", | |
| 485 | − [ | |
| 486 | − "import os, sys, zipfile", | |
| 487 | − "bundle_dir = os.path.abspath(sys.argv[1])", | |
| 488 | − "archive_path = os.path.abspath(sys.argv[2])", | |
| 489 | − "parent = os.path.dirname(bundle_dir)", | |
| 490 | − "with zipfile.ZipFile(archive_path, 'w', zipfile.ZIP_DEFLATED) as archive:", | |
| 491 | − " for root, _, files in os.walk(bundle_dir):", | |
| 492 | − " for name in files:", | |
| 493 | − " path = os.path.join(root, name)", | |
| 494 | − " archive.write(path, os.path.relpath(path, parent))", | |
| 495 | − ].join("\n"), | |
| 496 | − input.bundleDir, | |
| 497 | − input.archivePath, | |
| 498 | − ], | |
| 499 | − cwd: repoRoot, | |
| 500 | − }); | |
| 501 | −}; | |
| 502 | − | |
| 503 | −const ensureRuntimeExecutable = async (input: { | |
| 504 | − target: PortableTarget; | |
| 505 | − nodeVersion: string; | |
| 506 | − cacheDir: string; | |
| 507 | − destinationPath: string; | |
| 508 | −}): Promise<void> => { | |
| 509 | − await ensureOfficialNodeRuntime(input); | |
| 510 | −}; | |
| 511 | − | |
| 512 | −export const buildPortableDistribution = async ( | |
| 513 | − options: BuildPortableDistributionOptions = {}, | |
| 514 | −): Promise<PortableDistributionArtifact> => { | |
| 515 | − const defaults = await readDistributionPackageMetadata(); | |
| 516 | − const packageName = options.packageName ?? defaults.name; | |
| 517 | − const packageVersion = options.packageVersion ?? defaults.version; | |
| 518 | − const outputDir = resolve(options.outputDir ?? defaultOutputDir); | |
| 519 | − const targets = resolveTargets(options.targets); | |
| 520 | − const nodeVersion = await resolveNodeVersion(options.nodeVersion); | |
| 521 | − const createArchives = options.createArchives ?? true; | |
| 522 | − const cacheDir = join(defaultNodeCacheDir, nodeVersion); | |
| 523 | − const stageRoot = await mkdtemp(join(tmpdir(), "executor-portable-stage-")); | |
| 524 | − | |
| 525 | − await rm(outputDir, { recursive: true, force: true }); | |
| 526 | − await mkdir(outputDir, { recursive: true }); | |
| 527 | − | |
| 528 | − try { | |
| 529 | − const stagedPackage = await buildDistributionPackage({ | |
| 530 | − outputDir: join(stageRoot, "package"), | |
| 531 | − packageName, | |
| 532 | − packageVersion, | |
| 533 | − buildWeb: options.buildWeb, | |
| 534 | − }); | |
| 535 | − | |
| 536 | − const artifacts: PortableBundleArtifact[] = []; | |
| 537 | − | |
| 538 | − for (const target of targets) { | |
| 539 | − const bundleName = `${packageName}-${packageVersion}-${target.id}`; | |
| 540 | − const bundleDir = join(outputDir, bundleName); | |
| 541 | − const runtimeDir = join(bundleDir, "runtime"); | |
| 542 | − const runtimeExecutablePath = join(runtimeDir, target.bundledExecutableName); | |
| 543 | − const launcherPath = join(bundleDir, "executor"); | |
| 544 | − const installScriptPath = join(bundleDir, "install.sh"); | |
| 545 | − const archivePath = createArchives | |
| 546 | − ? join(outputDir, `${bundleName}.${target.archiveExtension}`) | |
| 547 | − : null; | |
| 548 | − | |
| 549 | − await cp(stagedPackage.packageDir, bundleDir, { recursive: true }); | |
| 550 | − await mkdir(runtimeDir, { recursive: true }); | |
| 551 | − await ensureRuntimeExecutable({ | |
| 552 | − target, | |
| 553 | − nodeVersion, | |
| 554 | − cacheDir, | |
| 555 | − destinationPath: runtimeExecutablePath, | |
| 556 | − }); | |
| 557 | − await writeFile(launcherPath, createUnixLauncher()); | |
| 558 | − await writeFile(join(bundleDir, "executor.cmd"), createWindowsLauncher()); | |
| 559 | − await writeFile( | |
| 560 | − installScriptPath, | |
| 561 | − createInstallScript({ | |
| 562 | − packageName, | |
| 563 | − packageVersion, | |
| 564 | − target: target.id, | |
| 565 | − }), | |
| 566 | − ); | |
| 567 | − await writeFile( | |
| 568 | − join(bundleDir, "install.ps1"), | |
| 569 | − createInstallPowerShellScript({ | |
| 570 | − packageName, | |
| 571 | − packageVersion, | |
| 572 | − target: target.id, | |
| 573 | − }), | |
| 574 | − ); | |
| 575 | − await chmod(launcherPath, 0o755); | |
| 576 | − await chmod(installScriptPath, 0o755); | |
| 577 | − if (target.bundledExecutableName === "node") { | |
| 578 | − await chmod(runtimeExecutablePath, 0o755); | |
| 579 | − } | |
| 580 | − | |
| 581 | − if (archivePath !== null) { | |
| 582 | − await createArchive({ | |
| 583 | − bundleDir, | |
| 584 | − archivePath, | |
| 585 | − target, | |
| 586 | − outputDir, | |
| 587 | − }); | |
| 588 | − } | |
| 589 | − | |
| 590 | − artifacts.push({ | |
| 591 | − target: target.id, | |
| 592 | − bundleDir, | |
| 593 | − launcherPath, | |
| 594 | − installScriptPath, | |
| 595 | − archivePath, | |
| 596 | − nodeVersion, | |
| 597 | − }); | |
| 598 | − } | |
| 599 | − | |
| 600 | − return { | |
| 601 | − outputDir, | |
| 602 | − artifacts, | |
| 603 | − }; | |
| 604 | − } finally { | |
| 605 | − await rm(stageRoot, { recursive: true, force: true }); | |
| 606 | − } | |
| 607 | −}; | |
| @@ -0,0 +1,224 @@ | ||
| 1 | +import { spawn } from "node:child_process"; | |
| 2 | +import { mkdir, rm } from "node:fs/promises"; | |
| 3 | +import { join, resolve } from "node:path"; | |
| 4 | + | |
| 5 | +import { buildDistributionPackage } from "./artifact"; | |
| 6 | +import { readDistributionPackageMetadata, repoRoot } from "./metadata"; | |
| 7 | + | |
| 8 | +const defaultReleaseDir = resolve(repoRoot, "apps/executor/dist/release"); | |
| 9 | +const semverPattern = | |
| 10 | + /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*)(?:\.(?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*))*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$/; | |
| 11 | + | |
| 12 | +type PublishCliOptions = { | |
| 13 | + dryRun: boolean; | |
| 14 | +}; | |
| 15 | + | |
| 16 | +type CommandInput = { | |
| 17 | + command: string; | |
| 18 | + args: ReadonlyArray<string>; | |
| 19 | + cwd: string; | |
| 20 | +}; | |
| 21 | + | |
| 22 | +type CommandOutput = { | |
| 23 | + stdout: string; | |
| 24 | + stderr: string; | |
| 25 | +}; | |
| 26 | + | |
| 27 | +type PackResult = { | |
| 28 | + filename?: string; | |
| 29 | +}; | |
| 30 | + | |
| 31 | +const parseArgs = (argv: ReadonlyArray<string>): PublishCliOptions => { | |
| 32 | + const options: PublishCliOptions = { | |
| 33 | + dryRun: false, | |
| 34 | + }; | |
| 35 | + | |
| 36 | + for (const arg of argv) { | |
| 37 | + if (arg === "--dry-run") { | |
| 38 | + options.dryRun = true; | |
| 39 | + continue; | |
| 40 | + } | |
| 41 | + | |
| 42 | + throw new Error(`Unknown argument: ${arg}`); | |
| 43 | + } | |
| 44 | + | |
| 45 | + return options; | |
| 46 | +}; | |
| 47 | + | |
| 48 | +const runCommand = async (input: CommandInput): Promise<CommandOutput> => { | |
| 49 | + const child = spawn(input.command, [...input.args], { | |
| 50 | + cwd: input.cwd, | |
| 51 | + env: process.env, | |
| 52 | + stdio: ["ignore", "pipe", "pipe"], | |
| 53 | + }); | |
| 54 | + | |
| 55 | + let stdout = ""; | |
| 56 | + let stderr = ""; | |
| 57 | + | |
| 58 | + child.stdout?.setEncoding("utf8"); | |
| 59 | + child.stdout?.on("data", (chunk) => { | |
| 60 | + stdout += chunk; | |
| 61 | + }); | |
| 62 | + | |
| 63 | + child.stderr?.setEncoding("utf8"); | |
| 64 | + child.stderr?.on("data", (chunk) => { | |
| 65 | + stderr += chunk; | |
| 66 | + }); | |
| 67 | + | |
| 68 | + const exitCode = await new Promise<number>((resolveExitCode, reject) => { | |
| 69 | + child.once("error", reject); | |
| 70 | + child.once("close", (code) => { | |
| 71 | + resolveExitCode(code ?? -1); | |
| 72 | + }); | |
| 73 | + }); | |
| 74 | + | |
| 75 | + if (exitCode !== 0) { | |
| 76 | + throw new Error( | |
| 77 | + [ | |
| 78 | + `${input.command} ${input.args.join(" ")} exited with code ${exitCode}`, | |
| 79 | + stdout.trim().length > 0 ? `stdout:\n${stdout.trim()}` : null, | |
| 80 | + stderr.trim().length > 0 ? `stderr:\n${stderr.trim()}` : null, | |
| 81 | + ] | |
| 82 | + .filter((part) => part !== null) | |
| 83 | + .join("\n\n"), | |
| 84 | + ); | |
| 85 | + } | |
| 86 | + | |
| 87 | + return { | |
| 88 | + stdout: stdout.trim(), | |
| 89 | + stderr: stderr.trim(), | |
| 90 | + }; | |
| 91 | +}; | |
| 92 | + | |
| 93 | +const resolveTagFromEnvironment = (): string | undefined => { | |
| 94 | + const refName = process.env.GITHUB_REF_NAME?.trim(); | |
| 95 | + if (process.env.GITHUB_REF_TYPE === "tag" && refName) { | |
| 96 | + return refName; | |
| 97 | + } | |
| 98 | + | |
| 99 | + const ref = process.env.GITHUB_REF?.trim(); | |
| 100 | + if (ref?.startsWith("refs/tags/")) { | |
| 101 | + return ref.slice("refs/tags/".length); | |
| 102 | + } | |
| 103 | + | |
| 104 | + return undefined; | |
| 105 | +}; | |
| 106 | + | |
| 107 | +const resolveGitHubRepository = (): string => { | |
| 108 | + const repository = process.env.GH_REPO?.trim() || process.env.GITHUB_REPOSITORY?.trim(); | |
| 109 | + if (!repository) { | |
| 110 | + throw new Error("Set GH_REPO or GITHUB_REPOSITORY before creating a GitHub release."); | |
| 111 | + } | |
| 112 | + | |
| 113 | + return repository; | |
| 114 | +}; | |
| 115 | + | |
| 116 | +const validateVersion = (version: string): void => { | |
| 117 | + if (!semverPattern.test(version)) { | |
| 118 | + throw new Error(`apps/executor/package.json version is not valid semver: ${version}`); | |
| 119 | + } | |
| 120 | +}; | |
| 121 | + | |
| 122 | +const resolveChannel = (version: string): "latest" | "beta" => | |
| 123 | + version.includes("-") ? "beta" : "latest"; | |
| 124 | + | |
| 125 | +const packDistributionPackage = async (releaseDir: string): Promise<string> => { | |
| 126 | + const output = await runCommand({ | |
| 127 | + command: "npm", | |
| 128 | + args: ["pack", "./apps/executor/dist/npm", "--pack-destination", releaseDir, "--json"], | |
| 129 | + cwd: repoRoot, | |
| 130 | + }); | |
| 131 | + const [result] = JSON.parse(output.stdout) as ReadonlyArray<PackResult>; | |
| 132 | + const filename = result?.filename; | |
| 133 | + | |
| 134 | + if (!filename) { | |
| 135 | + throw new Error(`npm pack did not report an output filename. stdout:\n${output.stdout}`); | |
| 136 | + } | |
| 137 | + | |
| 138 | + return join(releaseDir, filename); | |
| 139 | +}; | |
| 140 | + | |
| 141 | +const publishDistributionPackage = async (channel: "latest" | "beta"): Promise<void> => { | |
| 142 | + const args = ["publish", "./dist/npm", "--access", "public", "--tag", channel]; | |
| 143 | + if (process.env.GITHUB_ACTIONS === "true") { | |
| 144 | + args.push("--provenance"); | |
| 145 | + } | |
| 146 | + | |
| 147 | + await runCommand({ | |
| 148 | + command: "npm", | |
| 149 | + args, | |
| 150 | + cwd: resolve(repoRoot, "apps/executor"), | |
| 151 | + }); | |
| 152 | +}; | |
| 153 | + | |
| 154 | +const createGitHubRelease = async (input: { | |
| 155 | + tag: string; | |
| 156 | + channel: "latest" | "beta"; | |
| 157 | + assetPath: string; | |
| 158 | +}): Promise<void> => { | |
| 159 | + if (!process.env.GH_TOKEN?.trim()) { | |
| 160 | + throw new Error("GH_TOKEN is required to create a GitHub release."); | |
| 161 | + } | |
| 162 | + | |
| 163 | + const args = [ | |
| 164 | + "release", | |
| 165 | + "create", | |
| 166 | + input.tag, | |
| 167 | + input.assetPath, | |
| 168 | + "--repo", | |
| 169 | + resolveGitHubRepository(), | |
| 170 | + "--title", | |
| 171 | + input.tag, | |
| 172 | + "--generate-notes", | |
| 173 | + "--verify-tag", | |
| 174 | + ]; | |
| 175 | + | |
| 176 | + if (input.channel === "beta") { | |
| 177 | + args.push("--prerelease"); | |
| 178 | + } else { | |
| 179 | + args.push("--latest"); | |
| 180 | + } | |
| 181 | + | |
| 182 | + await runCommand({ | |
| 183 | + command: "gh", | |
| 184 | + args, | |
| 185 | + cwd: repoRoot, | |
| 186 | + }); | |
| 187 | +}; | |
| 188 | + | |
| 189 | +const main = async () => { | |
| 190 | + const options = parseArgs(process.argv.slice(2)); | |
| 191 | + const metadata = await readDistributionPackageMetadata(); | |
| 192 | + const version = metadata.version; | |
| 193 | + const tag = `v${version}`; | |
| 194 | + const refTag = resolveTagFromEnvironment(); | |
| 195 | + | |
| 196 | + validateVersion(version); | |
| 197 | + | |
| 198 | + if (refTag && refTag !== tag) { | |
| 199 | + throw new Error(`GitHub tag ${refTag} does not match apps/executor/package.json version ${version}`); | |
| 200 | + } | |
| 201 | + | |
| 202 | + const channel = resolveChannel(version); | |
| 203 | + await rm(defaultReleaseDir, { recursive: true, force: true }); | |
| 204 | + await mkdir(defaultReleaseDir, { recursive: true }); | |
| 205 | + | |
| 206 | + await buildDistributionPackage(); | |
| 207 | + const archivePath = await packDistributionPackage(defaultReleaseDir); | |
| 208 | + | |
| 209 | + process.stdout.write(`Prepared executor@${version} for ${channel}\n`); | |
| 210 | + process.stdout.write(`${archivePath}\n`); | |
| 211 | + | |
| 212 | + if (options.dryRun) { | |
| 213 | + return; | |
| 214 | + } | |
| 215 | + | |
| 216 | + await publishDistributionPackage(channel); | |
| 217 | + await createGitHubRelease({ | |
| 218 | + tag, | |
| 219 | + channel, | |
| 220 | + assetPath: archivePath, | |
| 221 | + }); | |
| 222 | +}; | |
| 223 | + | |
| 224 | +await main(); | |
| @@ -161,7 +161,6 @@ · 160 unmodified lines | ||
| 161 | 161 | "name": "@executor/control-plane", |
| 162 | 162 | "dependencies": { |
| 163 | 163 | "@effect/platform": "catalog:", |
| 164 | − "@electric-sql/pglite": "^0.3.12", | |
| 165 | 164 | "@executor/codemode-core": "workspace:*", |
| 166 | 165 | "@executor/codemode-google-discovery": "workspace:*", |
| 167 | 166 | "@executor/codemode-mcp": "workspace:*", |
| @@ -169,12 +168,11 @@ · 1 unmodified line | ||
| 169 | 168 | "@executor/runtime-deno-subprocess": "workspace:*", |
| 170 | 169 | "@executor/runtime-quickjs": "workspace:*", |
| 171 | 170 | "@executor/runtime-ses": "workspace:*", |
| 172 | − "drizzle-orm": "1.0.0-beta.15-859cf75", | |
| 173 | 171 | "effect": "catalog:", |
| 174 | 172 | "graphql": "^16.12.0", |
| 175 | 173 | "jsonc-parser": "3.3.1", |
| 176 | − "postgres": "^3.4.7", | |
| 177 | 174 | "prettier": "^3.8.1", |
| 175 | + "typescript": "^5.9.3", | |
| 178 | 176 | }, |
| 179 | 177 | "devDependencies": { |
| 180 | 178 | "@effect/platform-node": "catalog:", |
| @@ -182,7 +180,6 @@ · 1 unmodified line | ||
| 182 | 180 | "@modelcontextprotocol/sdk": "^1.26.0", |
| 183 | 181 | "@types/node": "catalog:", |
| 184 | 182 | "bun-types": "catalog:", |
| 185 | − "drizzle-kit": "1.0.0-beta.15-859cf75", | |
| 186 | 183 | "vitest": "catalog:", |
| 187 | 184 | "zod": "catalog:", |
| 188 | 185 | }, |
| @@ -320,40 +317,6 @@ · 131 unmodified lines | ||
| 320 | 317 | |
| 321 | 318 | "@asamuzakjp/css-color": ["@asamuzakjp/css-color@3.2.0", "", { "dependencies": { "@csstools/css-calc": "^2.1.3", "@csstools/css-color-parser": "^3.0.9", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "lru-cache": "^10.4.3" } }, "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw=="], |
| 322 | 319 | |
| 323 | − "@azure-rest/core-client": ["@azure-rest/core-client@2.5.1", "", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.10.0", "@azure/core-rest-pipeline": "^1.22.0", "@azure/core-tracing": "^1.3.0", "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" } }, "sha512-EHaOXW0RYDKS5CFffnixdyRPak5ytiCtU7uXDcP/uiY+A6jFRwNGzzJBiznkCzvi5EYpY+YWinieqHb0oY916A=="], | |
| 324 | − | |
| 325 | − "@azure/abort-controller": ["@azure/abort-controller@2.1.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA=="], | |
| 326 | − | |
| 327 | − "@azure/core-auth": ["@azure/core-auth@1.10.1", "", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-util": "^1.13.0", "tslib": "^2.6.2" } }, "sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg=="], | |
| 328 | − | |
| 329 | − "@azure/core-client": ["@azure/core-client@1.10.1", "", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.10.0", "@azure/core-rest-pipeline": "^1.22.0", "@azure/core-tracing": "^1.3.0", "@azure/core-util": "^1.13.0", "@azure/logger": "^1.3.0", "tslib": "^2.6.2" } }, "sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w=="], | |
| 330 | − | |
| 331 | − "@azure/core-http-compat": ["@azure/core-http-compat@2.3.2", "", { "dependencies": { "@azure/abort-controller": "^2.1.2" }, "peerDependencies": { "@azure/core-client": "^1.10.0", "@azure/core-rest-pipeline": "^1.22.0" } }, "sha512-Tf6ltdKzOJEgxZeWLCjMxrxbodB/ZeCbzzA1A2qHbhzAjzjHoBVSUeSl/baT/oHAxhc4qdqVaDKnc2+iE932gw=="], | |
| 332 | − | |
| 333 | − "@azure/core-lro": ["@azure/core-lro@2.7.2", "", { "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-util": "^1.2.0", "@azure/logger": "^1.0.0", "tslib": "^2.6.2" } }, "sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw=="], | |
| 334 | − | |
| 335 | − "@azure/core-paging": ["@azure/core-paging@1.6.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA=="], | |
| 336 | − | |
| 337 | − "@azure/core-rest-pipeline": ["@azure/core-rest-pipeline@1.22.2", "", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.10.0", "@azure/core-tracing": "^1.3.0", "@azure/core-util": "^1.13.0", "@azure/logger": "^1.3.0", "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" } }, "sha512-MzHym+wOi8CLUlKCQu12de0nwcq9k9Kuv43j4Wa++CsCpJwps2eeBQwD2Bu8snkxTtDKDx4GwjuR9E8yC8LNrg=="], | |
| 338 | − | |
| 339 | − "@azure/core-tracing": ["@azure/core-tracing@1.3.1", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ=="], | |
| 340 | − | |
| 341 | − "@azure/core-util": ["@azure/core-util@1.13.1", "", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" } }, "sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A=="], | |
| 342 | − | |
| 343 | − "@azure/identity": ["@azure/identity@4.13.0", "", { "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.9.0", "@azure/core-client": "^1.9.2", "@azure/core-rest-pipeline": "^1.17.0", "@azure/core-tracing": "^1.0.0", "@azure/core-util": "^1.11.0", "@azure/logger": "^1.0.0", "@azure/msal-browser": "^4.2.0", "@azure/msal-node": "^3.5.0", "open": "^10.1.0", "tslib": "^2.2.0" } }, "sha512-uWC0fssc+hs1TGGVkkghiaFkkS7NkTxfnCH+Hdg+yTehTpMcehpok4PgUKKdyCH+9ldu6FhiHRv84Ntqj1vVcw=="], | |
| 344 | − | |
| 345 | − "@azure/keyvault-common": ["@azure/keyvault-common@2.0.0", "", { "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.3.0", "@azure/core-client": "^1.5.0", "@azure/core-rest-pipeline": "^1.8.0", "@azure/core-tracing": "^1.0.0", "@azure/core-util": "^1.10.0", "@azure/logger": "^1.1.4", "tslib": "^2.2.0" } }, "sha512-wRLVaroQtOqfg60cxkzUkGKrKMsCP6uYXAOomOIysSMyt1/YM0eUn9LqieAWM8DLcU4+07Fio2YGpPeqUbpP9w=="], | |
| 346 | − | |
| 347 | − "@azure/keyvault-keys": ["@azure/keyvault-keys@4.10.0", "", { "dependencies": { "@azure-rest/core-client": "^2.3.3", "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.9.0", "@azure/core-http-compat": "^2.2.0", "@azure/core-lro": "^2.7.2", "@azure/core-paging": "^1.6.2", "@azure/core-rest-pipeline": "^1.19.0", "@azure/core-tracing": "^1.2.0", "@azure/core-util": "^1.11.0", "@azure/keyvault-common": "^2.0.0", "@azure/logger": "^1.1.4", "tslib": "^2.8.1" } }, "sha512-eDT7iXoBTRZ2n3fLiftuGJFD+yjkiB1GNqzU2KbY1TLYeXeSPVTVgn2eJ5vmRTZ11978jy2Kg2wI7xa9Tyr8ag=="], | |
| 348 | − | |
| 349 | − "@azure/logger": ["@azure/logger@1.3.0", "", { "dependencies": { "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" } }, "sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA=="], | |
| 350 | − | |
| 351 | − "@azure/msal-browser": ["@azure/msal-browser@4.29.0", "", { "dependencies": { "@azure/msal-common": "15.15.0" } }, "sha512-/f3eHkSNUTl6DLQHm+bKecjBKcRQxbd/XLx8lvSYp8Nl/HRyPuIPOijt9Dt0sH50/SxOwQ62RnFCmFlGK+bR/w=="], | |
| 352 | − | |
| 353 | − "@azure/msal-common": ["@azure/msal-common@15.15.0", "", {}, "sha512-/n+bN0AKlVa+AOcETkJSKj38+bvFs78BaP4rNtv3MJCmPH0YrHiskMRe74OhyZ5DZjGISlFyxqvf9/4QVEi2tw=="], | |
| 354 | − | |
| 355 | − "@azure/msal-node": ["@azure/msal-node@3.8.8", "", { "dependencies": { "@azure/msal-common": "15.15.0", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" } }, "sha512-+f1VrJH1iI517t4zgmuhqORja0bL6LDQXfBqkjuMmfTYXTQQnh1EvwwxO3UbKLT05N0obF72SRHFrC1RBDv5Gg=="], | |
| 356 | − | |
| 357 | 320 | "@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], |
| 358 | 321 | |
| 359 | 322 | "@babel/compat-data": ["@babel/compat-data@7.29.0", "", {}, "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg=="], |
| @@ -402,8 +365,6 @@ · 42 unmodified lines | ||
| 402 | 365 | |
| 403 | 366 | "@csstools/css-tokenizer": ["@csstools/css-tokenizer@3.0.4", "", {}, "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw=="], |
| 404 | 367 | |
| 405 | − "@drizzle-team/brocli": ["@drizzle-team/brocli@0.11.0", "", {}, "sha512-hD3pekGiPg0WPCCGAZmusBBJsDqGUR66Y452YgQsZOnkdQ7ViEPKuyP4huUGEZQefp8g34RRodXYmJ2TbCH+tg=="], | |
| 406 | − | |
| 407 | 368 | "@effect-atom/atom": ["@effect-atom/atom@0.5.3", "", { "peerDependencies": { "@effect/experimental": "^0.58.0", "@effect/platform": "^0.94.2", "@effect/rpc": "^0.73.0", "effect": "^3.19.15" } }, "sha512-TRZv/i+YT3TtnN0oFORJqXdxSs1fc7lrJlH+1xZvDFyjC9hgoVnrcKbeZsDFmr6r0wYRqVo7U3IftxiQNjpNZA=="], |
| 408 | 369 | |
| 409 | 370 | "@effect-atom/atom-react": ["@effect-atom/atom-react@0.5.0", "", { "dependencies": { "@effect-atom/atom": "^0.5.0" }, "peerDependencies": { "effect": "^3.19", "react": ">=18 <20", "scheduler": "*" } }, "sha512-aFfjWi4rEJCqfM12Oi36/EKaDm/W6n4/N6yM5vL0t/QozKhJhK05rQL/GY4XMxlH2eqkQ4ih8jBQa3Yyp0Fiqw=="], |
| @@ -434,8 +395,6 @@ · 24 unmodified lines | ||
| 434 | 395 | |
| 435 | 396 | "@effect/workflow": ["@effect/workflow@0.16.0", "", { "peerDependencies": { "@effect/experimental": "^0.58.0", "@effect/platform": "^0.94.0", "@effect/rpc": "^0.73.0", "effect": "^3.19.13" } }, "sha512-MiAdlxx3TixkgHdbw+Yf1Z3tHAAE0rOQga12kIydJqj05Fnod+W/I+kQGRMY/XWRg+QUsVxhmh1qTr7Ype6lrw=="], |
| 436 | 397 | |
| 437 | − "@electric-sql/pglite": ["@electric-sql/pglite@0.3.15", "", {}, "sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ=="], | |
| 438 | − | |
| 439 | 398 | "@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="], |
| 440 | 399 | |
| 441 | 400 | "@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], |
| @@ -448,57 +407,57 @@ · 6 unmodified lines | ||
| 448 | 407 | |
| 449 | 408 | "@endo/immutable-arraybuffer": ["@endo/immutable-arraybuffer@1.1.2", "", {}, "sha512-u+NaYB2aqEugQ3u7w3c5QNkPogf8q/xGgsPaqdY6pUiGWtYiTiFspKFcha6+oeZhWXWQ23rf0KrUq0kfuzqYyQ=="], |
| 450 | 409 | |
| 451 | − "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], | |
| 410 | + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], | |
| 452 | 411 | |
| 453 | − "@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], | |
| 412 | + "@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], | |
| 454 | 413 | |
| 455 | − "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], | |
| 414 | + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="], | |
| 456 | 415 | |
| 457 | − "@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], | |
| 416 | + "@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="], | |
| 458 | 417 | |
| 459 | − "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], | |
| 418 | + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="], | |
| 460 | 419 | |
| 461 | − "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], | |
| 420 | + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="], | |
| 462 | 421 | |
| 463 | − "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], | |
| 422 | + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="], | |
| 464 | 423 | |
| 465 | − "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], | |
| 424 | + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="], | |
| 466 | 425 | |
| 467 | − "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], | |
| 426 | + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="], | |
| 468 | 427 | |
| 469 | − "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], | |
| 428 | + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="], | |
| 470 | 429 | |
| 471 | − "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], | |
| 430 | + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="], | |
| 472 | 431 | |
| 473 | − "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], | |
| 432 | + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="], | |
| 474 | 433 | |
| 475 | − "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], | |
| 434 | + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="], | |
| 476 | 435 | |
| 477 | − "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], | |
| 436 | + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="], | |
| 478 | 437 | |
| 479 | − "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], | |
| 438 | + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="], | |
| 480 | 439 | |
| 481 | − "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], | |
| 440 | + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="], | |
| 482 | 441 | |
| 483 | − "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], | |
| 442 | + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="], | |
| 484 | 443 | |
| 485 | − "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], | |
| 444 | + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="], | |
| 486 | 445 | |
| 487 | − "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], | |
| 446 | + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="], | |
| 488 | 447 | |
| 489 | − "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], | |
| 448 | + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="], | |
| 490 | 449 | |
| 491 | − "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], | |
| 450 | + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="], | |
| 492 | 451 | |
| 493 | − "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], | |
| 452 | + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="], | |
| 494 | 453 | |
| 495 | − "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], | |
| 454 | + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="], | |
| 496 | 455 | |
| 497 | − "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], | |
| 456 | + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="], | |
| 498 | 457 | |
| 499 | − "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], | |
| 458 | + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="], | |
| 500 | 459 | |
| 501 | − "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], | |
| 460 | + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], | |
| 502 | 461 | |
| 503 | 462 | "@executor/ai-sdk-adapter": ["@executor/ai-sdk-adapter@workspace:packages/ai-sdk-adapter"], |
| 504 | 463 | |
| @@ -556,10 +515,6 @@ · 51 unmodified lines | ||
| 556 | 515 | |
| 557 | 516 | "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], |
| 558 | 517 | |
| 559 | − "@js-joda/core": ["@js-joda/core@5.7.0", "", {}, "sha512-WBu4ULVVxySLLzK1Ppq+OdfP+adRS4ntmDQT915rzDJ++i95gc2jZkM5B6LWEAwN3lGXpfie3yPABozdD3K3Vg=="], | |
| 560 | − | |
| 561 | − "@js-temporal/polyfill": ["@js-temporal/polyfill@0.5.1", "", { "dependencies": { "jsbi": "^4.3.0" } }, "sha512-hloP58zRVCRSpgDxmqCWJNlizAlUgJFqG2ypq79DCvyv9tHjRYMDOcPFjzfl/A1/YxDvRCZz8wvZvmapQnKwFQ=="], | |
| 562 | − | |
| 563 | 518 | "@medv/finder": ["@medv/finder@4.0.2", "", {}, "sha512-RraNY9SCcx4KZV0Dh6BEW6XEW2swkqYca74pkFFRw6hHItSHiy+O/xMnpbofjYbzXj0tSpBGthUF1hHTsr3vIQ=="], |
| 564 | 519 | |
| 565 | 520 | "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.27.1", "", { "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-sr6GbP+4edBwFndLbM60gf07z0FQ79gaExpnsjMGePXqFcSSb7t6iscpjk9DhFhwd+mTEQrzNafGP8/iGGFYaA=="], |
| @@ -768,8 +723,6 @@ · 202 unmodified lines | ||
| 768 | 723 | |
| 769 | 724 | "@tanstack/store": ["@tanstack/store@0.9.2", "", {}, "sha512-K013lUJEFJK2ofFQ/hZKJUmCnpcV00ebLyOyFOWQvyQHUOZp/iYO84BM6aOGiV81JzwbX0APTVmW8YI7yiG5oA=="], |
| 770 | 725 | |
| 771 | − "@tediousjs/connection-string": ["@tediousjs/connection-string@0.5.0", "", {}, "sha512-7qSgZbincDDDFyRweCIEvZULFAw5iz/DeunhvuxpL31nfntX3P4Yd4HkHBRg9H8CdqY1e5WFN1PZIz/REL9MVQ=="], | |
| 772 | − | |
| 773 | 726 | "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], |
| 774 | 727 | |
| 775 | 728 | "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], |
| @@ -798,8 +751,6 @@ · 22 unmodified lines | ||
| 798 | 751 | |
| 799 | 752 | "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], |
| 800 | 753 | |
| 801 | − "@types/mssql": ["@types/mssql@9.1.9", "", { "dependencies": { "@types/node": "*", "tarn": "^3.0.1", "tedious": "*" } }, "sha512-P0nCgw6vzY23UxZMnbI4N7fnLGANt4LI4yvxze1paPj+LuN28cFv5EI+QidP8udnId/BKhkcRhm/BleNsjK65A=="], | |
| 802 | − | |
| 803 | 754 | "@types/node": ["@types/node@24.11.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-fPxQqz4VTgPI/IQ+lj9r0h+fDR66bzoeMGHp8ASee+32OSGIkeASsoZuJixsQoVef1QJbeubcPBxKk22QVoWdw=="], |
| 804 | 755 | |
| 805 | 756 | "@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="], |
| @@ -808,14 +759,10 @@ · 2 unmodified lines | ||
| 808 | 759 | |
| 809 | 760 | "@types/react-reconciler": ["@types/react-reconciler@0.28.9", "", { "peerDependencies": { "@types/react": "*" } }, "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg=="], |
| 810 | 761 | |
| 811 | − "@types/readable-stream": ["@types/readable-stream@4.0.23", "", { "dependencies": { "@types/node": "*" } }, "sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig=="], | |
| 812 | − | |
| 813 | 762 | "@types/tough-cookie": ["@types/tough-cookie@4.0.5", "", {}, "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA=="], |
| 814 | 763 | |
| 815 | 764 | "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], |
| 816 | 765 | |
| 817 | − "@typespec/ts-http-runtime": ["@typespec/ts-http-runtime@0.3.3", "", { "dependencies": { "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "tslib": "^2.6.2" } }, "sha512-91fp6CAAJSRtH5ja95T1FHSKa8aPW9/Zw6cta81jlZTUw/+Vq8jM/AfF/14h2b71wwR84JUTW/3Y8QPhDAawFA=="], | |
| 818 | − | |
| 819 | 766 | "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], |
| 820 | 767 | |
| 821 | 768 | "@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="], |
| @@ -836,8 +783,6 @@ · 14 unmodified lines | ||
| 836 | 783 | |
| 837 | 784 | "@vitest/utils": ["@vitest/utils@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA=="], |
| 838 | 785 | |
| 839 | − "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], | |
| 840 | − | |
| 841 | 786 | "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], |
| 842 | 787 | |
| 843 | 788 | "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], |
| @@ -858,14 +803,10 @@ · 14 unmodified lines | ||
| 858 | 803 | |
| 859 | 804 | "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], |
| 860 | 805 | |
| 861 | − "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], | |
| 862 | − | |
| 863 | 806 | "baseline-browser-mapping": ["baseline-browser-mapping@2.10.0", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA=="], |
| 864 | 807 | |
| 865 | 808 | "bippy": ["bippy@0.5.32", "", { "dependencies": { "@types/react-reconciler": "^0.28.9" }, "peerDependencies": { "react": ">=17.0.1" } }, "sha512-yt1mC8eReTxjfg41YBZdN4PvsDwHFWxltoiQX0Q+Htlbf41aSniopb7ECZits01HwNAvXEh69RGk/ImlswDTEw=="], |
| 866 | 809 | |
| 867 | − "bl": ["bl@6.1.6", "", { "dependencies": { "@types/readable-stream": "^4.0.0", "buffer": "^6.0.3", "inherits": "^2.0.4", "readable-stream": "^4.2.0" } }, "sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg=="], | |
| 868 | − | |
| 869 | 810 | "body-parser": ["body-parser@2.2.2", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="], |
| 870 | 811 | |
| 871 | 812 | "brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], |
| @@ -874,14 +815,8 @@ · 2 unmodified lines | ||
| 874 | 815 | |
| 875 | 816 | "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="], |
| 876 | 817 | |
| 877 | − "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], | |
| 878 | − | |
| 879 | − "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="], | |
| 880 | − | |
| 881 | 818 | "bun-types": ["bun-types@1.3.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-tcpfCCl6XWo6nCVnpcVrxQ+9AYN1iqMIzgrSKYMB/fjLtV2eyAVEg7AxQJuCq/26R6HpKWykQXuSOq/21RYcbg=="], |
| 882 | 819 | |
| 883 | − "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], | |
| 884 | − | |
| 885 | 820 | "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], |
| 886 | 821 | |
| 887 | 822 | "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], |
| @@ -918,7 +853,7 @@ · 30 unmodified lines | ||
| 918 | 853 | |
| 919 | 854 | "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], |
| 920 | 855 | |
| 921 | − "commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], | |
| 856 | + "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], | |
| 922 | 857 | |
| 923 | 858 | "content-disposition": ["content-disposition@1.0.1", "", {}, "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q=="], |
| 924 | 859 | |
| @@ -950,12 +885,6 @@ · 25 unmodified lines | ||
| 950 | 885 | |
| 951 | 886 | "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], |
| 952 | 887 | |
| 953 | − "default-browser": ["default-browser@5.5.0", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw=="], | |
| 954 | − | |
| 955 | − "default-browser-id": ["default-browser-id@5.0.1", "", {}, "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="], | |
| 956 | − | |
| 957 | − "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="], | |
| 958 | − | |
| 959 | 888 | "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], |
| 960 | 889 | |
| 961 | 890 | "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], |
| @@ -964,14 +893,8 @@ · 2 unmodified lines | ||
| 964 | 893 | |
| 965 | 894 | "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], |
| 966 | 895 | |
| 967 | − "drizzle-kit": ["drizzle-kit@1.0.0-beta.15-859cf75", "", { "dependencies": { "@drizzle-team/brocli": "^0.11.0", "@js-temporal/polyfill": "^0.5.1", "esbuild": "^0.25.10", "jiti": "^2.6.1" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-Y36s1XQGVb1PgU3aRNgufp1K3D2VkIifu8kv4Ubsmxi+Dq+N7KMklnpp7Knu/XC4FZi2MHPPG3v3o097r0/TcQ=="], | |
| 968 | − | |
| 969 | − "drizzle-orm": ["drizzle-orm@1.0.0-beta.15-859cf75", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@effect/sql": "^0.48.5", "@effect/sql-pg": "^0.49.7", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@sinclair/typebox": ">=0.34.8", "@sqlitecloud/drivers": ">=1.0.653", "@tidbcloud/serverless": "*", "@tursodatabase/database": ">=0.2.1", "@tursodatabase/database-common": ">=0.2.1", "@tursodatabase/database-wasm": ">=0.2.1", "@types/better-sqlite3": "*", "@types/mssql": "^9.1.4", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "arktype": ">=2.0.0", "better-sqlite3": ">=9.3.0", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "mssql": "^11.0.1", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5", "typebox": ">=1.0.0", "valibot": ">=1.0.0-beta.7", "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@effect/sql", "@effect/sql-pg", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@sinclair/typebox", "@sqlitecloud/drivers", "@tidbcloud/serverless", "@tursodatabase/database", "@tursodatabase/database-common", "@tursodatabase/database-wasm", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "arktype", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "mysql2", "pg", "postgres", "sql.js", "sqlite3", "typebox", "valibot", "zod"] }, "sha512-dGVb2Q70H2AV6513hkOXR3Ud0FeGXLdugVq3YehoqkGIVTJrkuo0gRnCcW/dfI00O07t3T4HSh4clF/D/o/IsQ=="], | |
| 970 | − | |
| 971 | 896 | "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], |
| 972 | 897 | |
| 973 | − "ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="], | |
| 974 | − | |
| 975 | 898 | "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], |
| 976 | 899 | |
| 977 | 900 | "effect": ["effect@3.19.19", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-Yc8U/SVXo2dHnaP7zNBlAo83h/nzSJpi7vph6Hzyl4ulgMBIgPmz3UzOjb9sBgpFE00gC0iETR244sfXDNLHRg=="], |
| @@ -994,7 +917,7 @@ · 16 unmodified lines | ||
| 994 | 917 | |
| 995 | 918 | "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], |
| 996 | 919 | |
| 997 | − "esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], | |
| 920 | + "esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], | |
| 998 | 921 | |
| 999 | 922 | "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], |
| 1000 | 923 | |
| @@ -1008,10 +931,6 @@ · 7 unmodified lines | ||
| 1008 | 931 | |
| 1009 | 932 | "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], |
| 1010 | 933 | |
| 1011 | − "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], | |
| 1012 | − | |
| 1013 | − "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], | |
| 1014 | − | |
| 1015 | 934 | "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="], |
| 1016 | 935 | |
| 1017 | 936 | "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="], |
| @@ -1110,8 +1029,6 @@ · 92 unmodified lines | ||
| 1110 | 1029 | |
| 1111 | 1030 | "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], |
| 1112 | 1031 | |
| 1113 | − "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], | |
| 1114 | − | |
| 1115 | 1032 | "ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], |
| 1116 | 1033 | |
| 1117 | 1034 | "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], |
| @@ -1130,16 +1047,12 @@ · 12 unmodified lines | ||
| 1130 | 1047 | |
| 1131 | 1048 | "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], |
| 1132 | 1049 | |
| 1133 | − "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], | |
| 1134 | − | |
| 1135 | 1050 | "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], |
| 1136 | 1051 | |
| 1137 | 1052 | "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], |
| 1138 | 1053 | |
| 1139 | 1054 | "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], |
| 1140 | 1055 | |
| 1141 | − "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], | |
| 1142 | − | |
| 1143 | 1056 | "is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="], |
| 1144 | 1057 | |
| 1145 | 1058 | "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], |
| @@ -1152,8 +1065,6 @@ · 6 unmodified lines | ||
| 1152 | 1065 | |
| 1153 | 1066 | "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="], |
| 1154 | 1067 | |
| 1155 | − "is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="], | |
| 1156 | − | |
| 1157 | 1068 | "isbot": ["isbot@5.1.35", "", {}, "sha512-waFfC72ZNfwLLuJ2iLaoVaqcNo+CAaLR7xCpAn0Y5WfGzkNHv7ZN39Vbi1y+kb+Zs46XHOX3tZNExroFUPX+Kg=="], |
| 1158 | 1069 | |
| 1159 | 1070 | "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], |
| @@ -1162,14 +1073,10 @@ · 2 unmodified lines | ||
| 1162 | 1073 | |
| 1163 | 1074 | "jose": ["jose@6.1.3", "", {}, "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ=="], |
| 1164 | 1075 | |
| 1165 | − "js-md4": ["js-md4@0.3.2", "", {}, "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA=="], | |
| 1166 | − | |
| 1167 | 1076 | "js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="], |
| 1168 | 1077 | |
| 1169 | 1078 | "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], |
| 1170 | 1079 | |
| 1171 | − "jsbi": ["jsbi@4.3.2", "", {}, "sha512-9fqMSQbhJykSeii05nxKl4m6Eqn2P6rOlYiS+C5Dr/HPIU/7yZxu5qzbs40tgaFORiw2Amd0mirjxatXYMkIew=="], | |
| 1172 | − | |
| 1173 | 1080 | "jsdom": ["jsdom@26.1.0", "", { "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", "decimal.js": "^10.5.0", "html-encoding-sniffer": "^4.0.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.6", "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.16", "parse5": "^7.2.1", "rrweb-cssom": "^0.8.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^5.1.1", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.1.1", "ws": "^8.18.0", "xml-name-validator": "^5.0.0" }, "peerDependencies": { "canvas": "^3.0.0" }, "optionalPeers": ["canvas"] }, "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg=="], |
| 1174 | 1081 | |
| 1175 | 1082 | "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], |
| @@ -1184,12 +1091,6 @@ · 8 unmodified lines | ||
| 1184 | 1091 | |
| 1185 | 1092 | "jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="], |
| 1186 | 1093 | |
| 1187 | − "jsonwebtoken": ["jsonwebtoken@9.0.3", "", { "dependencies": { "jws": "^4.0.1", "lodash.includes": "^4.3.0", "lodash.isboolean": "^3.0.3", "lodash.isinteger": "^4.0.4", "lodash.isnumber": "^3.0.3", "lodash.isplainobject": "^4.0.6", "lodash.isstring": "^4.0.1", "lodash.once": "^4.0.0", "ms": "^2.1.1", "semver": "^7.5.4" } }, "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g=="], | |
| 1188 | − | |
| 1189 | − "jwa": ["jwa@2.0.1", "", { "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg=="], | |
| 1190 | − | |
| 1191 | − "jws": ["jws@4.0.1", "", { "dependencies": { "jwa": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA=="], | |
| 1192 | − | |
| 1193 | 1094 | "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], |
| 1194 | 1095 | |
| 1195 | 1096 | "knip": ["knip@5.85.0", "", { "dependencies": { "@nodelib/fs.walk": "^1.2.3", "fast-glob": "^3.3.3", "formatly": "^0.3.0", "jiti": "^2.6.0", "js-yaml": "^4.1.1", "minimist": "^1.2.8", "oxc-resolver": "^11.15.0", "picocolors": "^1.1.1", "picomatch": "^4.0.1", "smol-toml": "^1.5.2", "strip-json-comments": "5.0.3", "zod": "^4.1.11" }, "peerDependencies": { "@types/node": ">=18", "typescript": ">=5.0.4 <7" }, "bin": { "knip": "bin/knip.js", "knip-bun": "bin/knip-bun.js" } }, "sha512-V2kyON+DZiYdNNdY6GALseiNCwX7dYdpz9Pv85AUn69Gk0UKCts+glOKWfe5KmaMByRjM9q17Mzj/KinTVOyxg=="], |
| @@ -1220,20 +1121,6 @@ · 24 unmodified lines | ||
| 1220 | 1121 | |
| 1221 | 1122 | "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.31.1", "", { "os": "win32", "cpu": "x64" }, "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw=="], |
| 1222 | 1123 | |
| 1223 | − "lodash.includes": ["lodash.includes@4.3.0", "", {}, "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="], | |
| 1224 | − | |
| 1225 | − "lodash.isboolean": ["lodash.isboolean@3.0.3", "", {}, "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="], | |
| 1226 | − | |
| 1227 | − "lodash.isinteger": ["lodash.isinteger@4.0.4", "", {}, "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="], | |
| 1228 | − | |
| 1229 | − "lodash.isnumber": ["lodash.isnumber@3.0.3", "", {}, "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="], | |
| 1230 | − | |
| 1231 | − "lodash.isplainobject": ["lodash.isplainobject@4.0.6", "", {}, "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="], | |
| 1232 | − | |
| 1233 | − "lodash.isstring": ["lodash.isstring@4.0.1", "", {}, "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="], | |
| 1234 | − | |
| 1235 | − "lodash.once": ["lodash.once@4.1.1", "", {}, "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="], | |
| 1236 | − | |
| 1237 | 1124 | "log-symbols": ["log-symbols@6.0.0", "", { "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" } }, "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw=="], |
| 1238 | 1125 | |
| 1239 | 1126 | "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], |
| @@ -1362,14 +1249,10 @@ · 122 unmodified lines | ||
| 1362 | 1249 | |
| 1363 | 1250 | "msgpackr-extract": ["msgpackr-extract@3.0.3", "", { "dependencies": { "node-gyp-build-optional-packages": "5.2.2" }, "optionalDependencies": { "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" } }, "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA=="], |
| 1364 | 1251 | |
| 1365 | − "mssql": ["mssql@11.0.1", "", { "dependencies": { "@tediousjs/connection-string": "^0.5.0", "commander": "^11.0.0", "debug": "^4.3.3", "rfdc": "^1.3.0", "tarn": "^3.0.2", "tedious": "^18.2.1" }, "bin": { "mssql": "bin/mssql" } }, "sha512-KlGNsugoT90enKlR8/G36H0kTxPthDhmtNUCwEHvgRza5Cjpjoj+P2X6eMpFUDN7pFrJZsKadL4x990G8RBE1w=="], | |
| 1366 | − | |
| 1367 | 1252 | "multipasta": ["multipasta@0.2.7", "", {}, "sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA=="], |
| 1368 | 1253 | |
| 1369 | 1254 | "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], |
| 1370 | 1255 | |
| 1371 | − "native-duplexpair": ["native-duplexpair@1.0.0", "", {}, "sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA=="], | |
| 1372 | − | |
| 1373 | 1256 | "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], |
| 1374 | 1257 | |
| 1375 | 1258 | "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], |
| @@ -1394,8 +1277,6 @@ · 18 unmodified lines | ||
| 1394 | 1277 | |
| 1395 | 1278 | "oniguruma-to-es": ["oniguruma-to-es@4.3.4", "", { "dependencies": { "oniguruma-parser": "^0.12.1", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA=="], |
| 1396 | 1279 | |
| 1397 | − "open": ["open@10.2.0", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "wsl-utils": "^0.1.0" } }, "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA=="], | |
| 1398 | − | |
| 1399 | 1280 | "ora": ["ora@8.2.0", "", { "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^5.0.0", "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.0.0", "log-symbols": "^6.0.0", "stdin-discarder": "^0.2.2", "string-width": "^7.2.0", "strip-ansi": "^7.1.0" } }, "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw=="], |
| 1400 | 1281 | |
| 1401 | 1282 | "oxc-resolver": ["oxc-resolver@11.19.1", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.19.1", "@oxc-resolver/binding-android-arm64": "11.19.1", "@oxc-resolver/binding-darwin-arm64": "11.19.1", "@oxc-resolver/binding-darwin-x64": "11.19.1", "@oxc-resolver/binding-freebsd-x64": "11.19.1", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.19.1", "@oxc-resolver/binding-linux-arm-musleabihf": "11.19.1", "@oxc-resolver/binding-linux-arm64-gnu": "11.19.1", "@oxc-resolver/binding-linux-arm64-musl": "11.19.1", "@oxc-resolver/binding-linux-ppc64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-musl": "11.19.1", "@oxc-resolver/binding-linux-s390x-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-musl": "11.19.1", "@oxc-resolver/binding-openharmony-arm64": "11.19.1", "@oxc-resolver/binding-wasm32-wasi": "11.19.1", "@oxc-resolver/binding-win32-arm64-msvc": "11.19.1", "@oxc-resolver/binding-win32-ia32-msvc": "11.19.1", "@oxc-resolver/binding-win32-x64-msvc": "11.19.1" } }, "sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg=="], |
| @@ -1422,12 +1303,8 @@ · 20 unmodified lines | ||
| 1422 | 1303 | |
| 1423 | 1304 | "postcss": ["postcss@8.5.8", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg=="], |
| 1424 | 1305 | |
| 1425 | − "postgres": ["postgres@3.4.8", "", {}, "sha512-d+JFcLM17njZaOLkv6SCev7uoLaBtfK86vMUXhW1Z4glPWh4jozno9APvW/XKFJ3CCxVoC7OL38BqRydtu5nGg=="], | |
| 1426 | − | |
| 1427 | 1306 | "prettier": ["prettier@3.8.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="], |
| 1428 | 1307 | |
| 1429 | − "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], | |
| 1430 | − | |
| 1431 | 1308 | "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], |
| 1432 | 1309 | |
| 1433 | 1310 | "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], |
| @@ -1458,8 +1335,6 @@ · 24 unmodified lines | ||
| 1458 | 1335 | |
| 1459 | 1336 | "react-refresh": ["react-refresh@0.18.0", "", {}, "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw=="], |
| 1460 | 1337 | |
| 1461 | − "readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], | |
| 1462 | − | |
| 1463 | 1338 | "regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="], |
| 1464 | 1339 | |
| 1465 | 1340 | "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="], |
| @@ -1488,20 +1363,14 @@ · 22 unmodified lines | ||
| 1488 | 1363 | |
| 1489 | 1364 | "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], |
| 1490 | 1365 | |
| 1491 | − "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], | |
| 1492 | − | |
| 1493 | 1366 | "rollup": ["rollup@4.59.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.59.0", "@rollup/rollup-android-arm64": "4.59.0", "@rollup/rollup-darwin-arm64": "4.59.0", "@rollup/rollup-darwin-x64": "4.59.0", "@rollup/rollup-freebsd-arm64": "4.59.0", "@rollup/rollup-freebsd-x64": "4.59.0", "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", "@rollup/rollup-linux-arm-musleabihf": "4.59.0", "@rollup/rollup-linux-arm64-gnu": "4.59.0", "@rollup/rollup-linux-arm64-musl": "4.59.0", "@rollup/rollup-linux-loong64-gnu": "4.59.0", "@rollup/rollup-linux-loong64-musl": "4.59.0", "@rollup/rollup-linux-ppc64-gnu": "4.59.0", "@rollup/rollup-linux-ppc64-musl": "4.59.0", "@rollup/rollup-linux-riscv64-gnu": "4.59.0", "@rollup/rollup-linux-riscv64-musl": "4.59.0", "@rollup/rollup-linux-s390x-gnu": "4.59.0", "@rollup/rollup-linux-x64-gnu": "4.59.0", "@rollup/rollup-linux-x64-musl": "4.59.0", "@rollup/rollup-openbsd-x64": "4.59.0", "@rollup/rollup-openharmony-arm64": "4.59.0", "@rollup/rollup-win32-arm64-msvc": "4.59.0", "@rollup/rollup-win32-ia32-msvc": "4.59.0", "@rollup/rollup-win32-x64-gnu": "4.59.0", "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg=="], |
| 1494 | 1367 | |
| 1495 | 1368 | "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], |
| 1496 | 1369 | |
| 1497 | 1370 | "rrweb-cssom": ["rrweb-cssom@0.8.0", "", {}, "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw=="], |
| 1498 | 1371 | |
| 1499 | − "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="], | |
| 1500 | − | |
| 1501 | 1372 | "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], |
| 1502 | 1373 | |
| 1503 | − "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], | |
| 1504 | − | |
| 1505 | 1374 | "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], |
| 1506 | 1375 | |
| 1507 | 1376 | "saxes": ["saxes@6.0.0", "", { "dependencies": { "xmlchars": "^2.2.0" } }, "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA=="], |
| @@ -1550,8 +1419,6 @@ · 42 unmodified lines | ||
| 1550 | 1419 | |
| 1551 | 1420 | "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], |
| 1552 | 1421 | |
| 1553 | − "sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], | |
| 1554 | − | |
| 1555 | 1422 | "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], |
| 1556 | 1423 | |
| 1557 | 1424 | "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], |
| @@ -1564,8 +1431,6 @@ · 6 unmodified lines | ||
| 1564 | 1431 | |
| 1565 | 1432 | "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], |
| 1566 | 1433 | |
| 1567 | − "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], | |
| 1568 | − | |
| 1569 | 1434 | "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], |
| 1570 | 1435 | |
| 1571 | 1436 | "strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], |
| @@ -1586,10 +1451,6 @@ · 14 unmodified lines | ||
| 1586 | 1451 | |
| 1587 | 1452 | "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="], |
| 1588 | 1453 | |
| 1589 | − "tarn": ["tarn@3.0.2", "", {}, "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ=="], | |
| 1590 | − | |
| 1591 | − "tedious": ["tedious@18.6.2", "", { "dependencies": { "@azure/core-auth": "^1.7.2", "@azure/identity": "^4.2.1", "@azure/keyvault-keys": "^4.4.0", "@js-joda/core": "^5.6.1", "@types/node": ">=18", "bl": "^6.0.11", "iconv-lite": "^0.6.3", "js-md4": "^0.3.2", "native-duplexpair": "^1.0.0", "sprintf-js": "^1.1.3" } }, "sha512-g7jC56o3MzLkE3lHkaFe2ZdOVFBahq5bsB60/M4NYUbocw/MCrS89IOEQUFr+ba6pb8ZHczZ/VqCyYeYq0xBAg=="], | |
| 1592 | − | |
| 1593 | 1454 | "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], |
| 1594 | 1455 | |
| 1595 | 1456 | "tiny-warning": ["tiny-warning@1.0.3", "", {}, "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="], |
| @@ -1706,8 +1567,6 @@ · 110 unmodified lines | ||
| 1706 | 1567 | |
| 1707 | 1568 | "ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], |
| 1708 | 1569 | |
| 1709 | − "wsl-utils": ["wsl-utils@0.1.0", "", { "dependencies": { "is-wsl": "^3.1.0" } }, "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw=="], | |
| 1710 | − | |
| 1711 | 1570 | "xml-name-validator": ["xml-name-validator@5.0.0", "", {}, "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="], |
| 1712 | 1571 | |
| 1713 | 1572 | "xmlchars": ["xmlchars@2.2.0", "", {}, "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="], |
| @@ -1722,14 +1581,10 @@ · 8 unmodified lines | ||
| 1722 | 1581 | |
| 1723 | 1582 | "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], |
| 1724 | 1583 | |
| 1725 | − "@azure/msal-node/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], | |
| 1726 | − | |
| 1727 | 1584 | "@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], |
| 1728 | 1585 | |
| 1729 | 1586 | "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], |
| 1730 | 1587 | |
| 1731 | − "@react-grab/cli/commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], | |
| 1732 | − | |
| 1733 | 1588 | "@streamdown/code/shiki": ["shiki@3.23.0", "", { "dependencies": { "@shikijs/core": "3.23.0", "@shikijs/engine-javascript": "3.23.0", "@shikijs/engine-oniguruma": "3.23.0", "@shikijs/langs": "3.23.0", "@shikijs/themes": "3.23.0", "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA=="], |
| 1734 | 1589 | |
| 1735 | 1590 | "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="], |
| @@ -1744,20 +1599,14 @@ · 8 unmodified lines | ||
| 1744 | 1599 | |
| 1745 | 1600 | "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], |
| 1746 | 1601 | |
| 1747 | − "jsonwebtoken/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], | |
| 1748 | − | |
| 1749 | 1602 | "log-symbols/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="], |
| 1750 | 1603 | |
| 1751 | 1604 | "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], |
| 1752 | 1605 | |
| 1753 | 1606 | "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], |
| 1754 | 1607 | |
| 1755 | − "tedious/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], | |
| 1756 | − | |
| 1757 | 1608 | "tough-cookie/tldts": ["tldts@6.1.86", "", { "dependencies": { "tldts-core": "^6.1.86" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ=="], |
| 1758 | 1609 | |
| 1759 | − "vite/esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], | |
| 1760 | − | |
| 1761 | 1610 | "whatwg-encoding/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], |
| 1762 | 1611 | |
| 1763 | 1612 | "@streamdown/code/shiki/@shikijs/core": ["@shikijs/core@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA=="], |
| @@ -1773,57 +1622,5 @@ · 9 unmodified lines | ||
| 1773 | 1622 | "@streamdown/code/shiki/@shikijs/types": ["@shikijs/types@3.23.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ=="], |
| 1774 | 1623 | |
| 1775 | 1624 | "tough-cookie/tldts/tldts-core": ["tldts-core@6.1.86", "", {}, "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA=="], |
| 1776 | − | |
| 1777 | − "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], | |
| 1778 | − | |
| 1779 | − "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], | |
| 1780 | − | |
| 1781 | − "vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="], | |
| 1782 | − | |
| 1783 | − "vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="], | |
| 1784 | − | |
| 1785 | − "vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="], | |
| 1786 | − | |
| 1787 | − "vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="], | |
| 1788 | − | |
| 1789 | − "vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="], | |
| 1790 | − | |
| 1791 | − "vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="], | |
| 1792 | − | |
| 1793 | − "vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="], | |
| 1794 | − | |
| 1795 | − "vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="], | |
| 1796 | − | |
| 1797 | − "vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="], | |
| 1798 | − | |
| 1799 | − "vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="], | |
| 1800 | − | |
| 1801 | − "vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="], | |
| 1802 | − | |
| 1803 | − "vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="], | |
| 1804 | − | |
| 1805 | − "vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="], | |
| 1806 | − | |
| 1807 | − "vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="], | |
| 1808 | − | |
| 1809 | − "vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="], | |
| 1810 | − | |
| 1811 | − "vite/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="], | |
| 1812 | − | |
| 1813 | − "vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="], | |
| 1814 | − | |
| 1815 | − "vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="], | |
| 1816 | − | |
| 1817 | − "vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="], | |
| 1818 | − | |
| 1819 | − "vite/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="], | |
| 1820 | − | |
| 1821 | − "vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="], | |
| 1822 | − | |
| 1823 | − "vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="], | |
| 1824 | − | |
| 1825 | − "vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="], | |
| 1826 | − | |
| 1827 | − "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], | |
| 1828 | 1625 | } |
| 1829 | 1626 | } |
| @@ -0,0 +1,10 @@ | ||
| 1 | +{ | |
| 2 | + "$schema": "https://opencode.ai/config.json", | |
| 3 | + "mcp": { | |
| 4 | + "executor": { | |
| 5 | + "type": "remote", | |
| 6 | + "url": "http://localhost:8788/mcp", | |
| 7 | + "enabled": true | |
| 8 | + } | |
| 9 | + } | |
| 10 | +} | |
| @@ -6,10 +6,14 @@ import type { · 5 unmodified lines | ||
| 6 | 6 | DescribePrimitive, |
| 7 | 7 | DiscoverPrimitive, |
| 8 | 8 | DiscoveryPrimitives, |
| 9 | + SearchHit, | |
| 9 | 10 | ToolCatalog, |
| 11 | + ToolCatalogEntry, | |
| 10 | 12 | ToolDescriptor, |
| 11 | 13 | ToolMap, |
| 14 | + ToolNamespace, | |
| 12 | 15 | ToolPath, |
| 16 | + ToolSchemaBundle, | |
| 13 | 17 | } from "./types"; |
| 14 | 18 | |
| 15 | 19 | const tokenize = (value: string): string[] => |
| @@ -57,18 +61,117 @@ const namespaceFromPath = (path: string): string => { · 41 unmodified lines | ||
| 57 | 61 | return second ? `${first}.${second}` : first; |
| 58 | 62 | }; |
| 59 | 63 | |
| 64 | +const namespaceFromCatalogEntry = (entry: ToolCatalogEntry): string => | |
| 65 | + entry.namespace ?? namespaceFromPath(entry.descriptor.path); | |
| 66 | + | |
| 67 | +const searchableTextForEntry = (entry: ToolCatalogEntry): string => | |
| 68 | + entry.searchText?.trim().toLowerCase() || searchableTextForTool(entry.descriptor); | |
| 69 | + | |
| 70 | +const scoreCatalogEntry = ( | |
| 71 | + queryTokens: readonly string[], | |
| 72 | + entry: ToolCatalogEntry, | |
| 73 | +): number => { | |
| 74 | + if (entry.score) { | |
| 75 | + return entry.score(queryTokens); | |
| 76 | + } | |
| 77 | + | |
| 78 | + const haystack = searchableTextForEntry(entry); | |
| 79 | + return queryTokens.reduce( | |
| 80 | + (total, token) => total + (haystack.includes(token) ? 1 : 0), | |
| 81 | + 0, | |
| 82 | + ); | |
| 83 | +}; | |
| 84 | + | |
| 85 | +const mergeToolNamespaces = ( | |
| 86 | + groups: ReadonlyArray<readonly ToolNamespace[]>, | |
| 87 | +): ToolNamespace[] => { | |
| 88 | + const merged = new Map<string, ToolNamespace>(); | |
| 89 | + | |
| 90 | + for (const group of groups) { | |
| 91 | + for (const namespace of group) { | |
| 92 | + const existing = merged.get(namespace.namespace); | |
| 93 | + merged.set(namespace.namespace, { | |
| 94 | + namespace: namespace.namespace, | |
| 95 | + displayName: existing?.displayName ?? namespace.displayName, | |
| 96 | + ...(existing?.toolCount !== undefined || namespace.toolCount !== undefined | |
| 97 | + ? { | |
| 98 | + toolCount: | |
| 99 | + (existing?.toolCount ?? 0) + (namespace.toolCount ?? 0), | |
| 100 | + } | |
| 101 | + : {}), | |
| 102 | + }); | |
| 103 | + } | |
| 104 | + } | |
| 105 | + | |
| 106 | + return [...merged.values()].sort((left, right) => | |
| 107 | + left.namespace.localeCompare(right.namespace), | |
| 108 | + ); | |
| 109 | +}; | |
| 110 | + | |
| 111 | +const dedupeToolDescriptors = ( | |
| 112 | + groups: ReadonlyArray<readonly ToolDescriptor[]>, | |
| 113 | +): ToolDescriptor[] => { | |
| 114 | + const merged = new Map<string, ToolDescriptor>(); | |
| 115 | + | |
| 116 | + for (const group of groups) { | |
| 117 | + for (const descriptor of group) { | |
| 118 | + if (!merged.has(descriptor.path)) { | |
| 119 | + merged.set(descriptor.path, descriptor); | |
| 120 | + } | |
| 121 | + } | |
| 122 | + } | |
| 123 | + | |
| 124 | + return [...merged.values()].sort((left, right) => | |
| 125 | + left.path.localeCompare(right.path), | |
| 126 | + ); | |
| 127 | +}; | |
| 128 | + | |
| 129 | +const dedupeSearchHits = ( | |
| 130 | + groups: ReadonlyArray<readonly SearchHit[]>, | |
| 131 | +): SearchHit[] => { | |
| 132 | + const merged = new Map<string, SearchHit>(); | |
| 133 | + | |
| 134 | + for (const group of groups) { | |
| 135 | + for (const hit of group) { | |
| 136 | + if (!merged.has(hit.path)) { | |
| 137 | + merged.set(hit.path, hit); | |
| 138 | + } | |
| 139 | + } | |
| 140 | + } | |
| 141 | + | |
| 142 | + return [...merged.values()].sort( | |
| 143 | + (left, right) => right.score - left.score || left.path.localeCompare(right.path), | |
| 144 | + ); | |
| 145 | +}; | |
| 146 | + | |
| 60 | 147 | export function createToolCatalogFromTools(input: { |
| 61 | 148 | tools: ToolMap; |
| 62 | 149 | defaultNamespace?: string; |
| 63 | 150 | }): ToolCatalog { |
| 64 | − const descriptors = toolDescriptorsFromTools({ | |
| 65 | − tools: input.tools, | |
| 151 | + return createToolCatalogFromEntries({ | |
| 152 | + entries: toolDescriptorsFromTools({ | |
| 153 | + tools: input.tools, | |
| 154 | + }).map((descriptor) => ({ | |
| 155 | + descriptor, | |
| 156 | + ...(input.defaultNamespace !== undefined | |
| 157 | + ? { namespace: input.defaultNamespace } | |
| 158 | + : {}), | |
| 159 | + })), | |
| 66 | 160 | }); |
| 67 | − const byPath = new Map(descriptors.map((descriptor) => [descriptor.path as string, descriptor])); | |
| 161 | +} | |
| 162 | + | |
| 163 | +export function createToolCatalogFromEntries(input: { | |
| 164 | + entries: ReadonlyArray<ToolCatalogEntry>; | |
| 165 | + getSchemaBundle?: (input: { id: string }) => Effect.Effect<ToolSchemaBundle | null, unknown>; | |
| 166 | +}): ToolCatalog { | |
| 167 | + const entries = [...input.entries]; | |
| 168 | + const byPath = new Map( | |
| 169 | + entries.map((entry) => [entry.descriptor.path as string, entry]), | |
| 170 | + ); | |
| 68 | 171 | const namespaceCounts = new Map<string, number>(); |
| 69 | 172 | |
| 70 | − for (const descriptor of descriptors) { | |
| 71 | − const namespace = input.defaultNamespace ?? namespaceFromPath(descriptor.path); | |
| 173 | + for (const entry of entries) { | |
| 174 | + const namespace = namespaceFromCatalogEntry(entry); | |
| 72 | 175 | namespaceCounts.set(namespace, (namespaceCounts.get(namespace) ?? 0) + 1); |
| 73 | 176 | } |
| 74 | 177 | |
| @@ -81,23 +184,22 @@ export function createToolCatalogFromTools(input: { · 6 unmodified lines | ||
| 81 | 184 | ), |
| 82 | 185 | listTools: ({ namespace, query, limit, includeSchemas = false }) => |
| 83 | 186 | Effect.succeed( |
| 84 | − descriptors | |
| 85 | − .filter((descriptor) => { | |
| 86 | − const descriptorNamespace = input.defaultNamespace ?? namespaceFromPath(descriptor.path); | |
| 87 | − return !namespace || descriptorNamespace === namespace; | |
| 88 | − }) | |
| 89 | − .filter((descriptor) => { | |
| 187 | + entries | |
| 188 | + .filter((entry) => | |
| 189 | + !namespace || namespaceFromCatalogEntry(entry) === namespace, | |
| 190 | + ) | |
| 191 | + .filter((entry) => { | |
| 90 | 192 | if (!query) { |
| 91 | 193 | return true; |
| 92 | 194 | } |
| 93 | 195 | |
| 94 | − const haystack = searchableTextForTool(descriptor); | |
| 196 | + const haystack = searchableTextForEntry(entry); | |
| 95 | 197 | return tokenize(query).every((token) => haystack.includes(token)); |
| 96 | 198 | }) |
| 97 | 199 | .slice(0, limit) |
| 98 | − .map((descriptor) => | |
| 200 | + .map((entry) => | |
| 99 | 201 | projectDescriptor({ |
| 100 | − descriptor, | |
| 202 | + descriptor: entry.descriptor, | |
| 101 | 203 | includeSchemas, |
| 102 | 204 | }) |
| 103 | 205 | ), |
| @@ -106,33 +208,27 @@ export function createToolCatalogFromTools(input: { · 2 unmodified lines | ||
| 106 | 208 | Effect.succeed( |
| 107 | 209 | byPath.get(path) |
| 108 | 210 | ? projectDescriptor({ |
| 109 | − descriptor: byPath.get(path)!, | |
| 211 | + descriptor: byPath.get(path)!.descriptor, | |
| 110 | 212 | includeSchemas, |
| 111 | 213 | }) |
| 112 | 214 | : null, |
| 113 | 215 | ), |
| 114 | − getSchemaBundle: () => Effect.succeed(null), | |
| 216 | + getSchemaBundle: ({ id }) => | |
| 217 | + input.getSchemaBundle | |
| 218 | + ? input.getSchemaBundle({ id }) | |
| 219 | + : Effect.succeed(null), | |
| 115 | 220 | searchTools: ({ query, namespace, limit }) => { |
| 116 | 221 | const queryTokens = tokenize(query); |
| 117 | 222 | |
| 118 | 223 | return Effect.succeed( |
| 119 | − descriptors | |
| 120 | − .filter((descriptor) => { | |
| 121 | − const descriptorNamespace = input.defaultNamespace ?? namespaceFromPath(descriptor.path); | |
| 122 | − return !namespace || descriptorNamespace === namespace; | |
| 123 | − }) | |
| 124 | − .map((descriptor) => { | |
| 125 | − const haystack = searchableTextForTool(descriptor); | |
| 126 | − const score = queryTokens.reduce( | |
| 127 | − (total, token) => total + (haystack.includes(token) ? 1 : 0), | |
| 128 | − 0, | |
| 129 | − ); | |
| 130 | − | |
| 131 | − return { | |
| 132 | − path: descriptor.path, | |
| 133 | − score, | |
| 134 | − }; | |
| 135 | − }) | |
| 224 | + entries | |
| 225 | + .filter((entry) => | |
| 226 | + !namespace || namespaceFromCatalogEntry(entry) === namespace, | |
| 227 | + ) | |
| 228 | + .map((entry) => ({ | |
| 229 | + path: entry.descriptor.path, | |
| 230 | + score: scoreCatalogEntry(queryTokens, entry), | |
| 231 | + })) | |
| 136 | 232 | .filter((hit) => hit.score > 0) |
| 137 | 233 | .sort((left, right) => right.score - left.score) |
| 138 | 234 | .slice(0, limit), |
| @@ -141,6 +237,82 @@ export function createToolCatalogFromTools(input: { · 2 unmodified lines | ||
| 141 | 237 | } satisfies ToolCatalog; |
| 142 | 238 | } |
| 143 | 239 | |
| 240 | +export function mergeToolCatalogs(input: { | |
| 241 | + catalogs: ReadonlyArray<ToolCatalog>; | |
| 242 | +}): ToolCatalog { | |
| 243 | + const catalogs = [...input.catalogs]; | |
| 244 | + | |
| 245 | + return { | |
| 246 | + listNamespaces: ({ limit }) => | |
| 247 | + Effect.gen(function* () { | |
| 248 | + const groups = yield* Effect.forEach( | |
| 249 | + catalogs, | |
| 250 | + (catalog) => catalog.listNamespaces({ limit: Math.max(limit, limit * catalogs.length) }), | |
| 251 | + { concurrency: "unbounded" }, | |
| 252 | + ); | |
| 253 | + | |
| 254 | + return mergeToolNamespaces(groups).slice(0, limit); | |
| 255 | + }), | |
| 256 | + | |
| 257 | + listTools: ({ namespace, query, limit, includeSchemas = false }) => | |
| 258 | + Effect.gen(function* () { | |
| 259 | + const groups = yield* Effect.forEach( | |
| 260 | + catalogs, | |
| 261 | + (catalog) => | |
| 262 | + catalog.listTools({ | |
| 263 | + ...(namespace !== undefined ? { namespace } : {}), | |
| 264 | + ...(query !== undefined ? { query } : {}), | |
| 265 | + limit: Math.max(limit, limit * catalogs.length), | |
| 266 | + includeSchemas, | |
| 267 | + }), | |
| 268 | + { concurrency: "unbounded" }, | |
| 269 | + ); | |
| 270 | + | |
| 271 | + return dedupeToolDescriptors(groups).slice(0, limit); | |
| 272 | + }), | |
| 273 | + | |
| 274 | + getToolByPath: ({ path, includeSchemas }) => | |
| 275 | + Effect.gen(function* () { | |
| 276 | + for (const catalog of catalogs) { | |
| 277 | + const descriptor = yield* catalog.getToolByPath({ path, includeSchemas }); | |
| 278 | + if (descriptor) { | |
| 279 | + return descriptor; | |
| 280 | + } | |
| 281 | + } | |
| 282 | + | |
| 283 | + return null; | |
| 284 | + }), | |
| 285 | + | |
| 286 | + getSchemaBundle: ({ id }) => | |
| 287 | + Effect.gen(function* () { | |
| 288 | + for (const catalog of catalogs) { | |
| 289 | + const bundle = yield* catalog.getSchemaBundle({ id }); | |
| 290 | + if (bundle) { | |
| 291 | + return bundle; | |
| 292 | + } | |
| 293 | + } | |
| 294 | + | |
| 295 | + return null; | |
| 296 | + }), | |
| 297 | + | |
| 298 | + searchTools: ({ query, namespace, limit }) => | |
| 299 | + Effect.gen(function* () { | |
| 300 | + const groups = yield* Effect.forEach( | |
| 301 | + catalogs, | |
| 302 | + (catalog) => | |
| 303 | + catalog.searchTools({ | |
| 304 | + query, | |
| 305 | + ...(namespace !== undefined ? { namespace } : {}), | |
| 306 | + limit: Math.max(limit, limit * catalogs.length), | |
| 307 | + }), | |
| 308 | + { concurrency: "unbounded" }, | |
| 309 | + ); | |
| 310 | + | |
| 311 | + return dedupeSearchHits(groups).slice(0, limit); | |
| 312 | + }), | |
| 313 | + } satisfies ToolCatalog; | |
| 314 | +} | |
| 315 | + | |
| 144 | 316 | export function createStaticDiscoveryFromTools(input: { |
| 145 | 317 | tools: ToolMap; |
| 146 | 318 | sourceKey?: string; |
| @@ -9,6 +9,7 @@ import * as TestClock from "effect/TestClock"; · 8 unmodified lines | ||
| 9 | 9 | import { |
| 10 | 10 | allowAllToolInteractions, |
| 11 | 11 | createToolCatalogDiscovery, |
| 12 | + createToolCatalogFromEntries, | |
| 12 | 13 | createToolCatalogFromTools, |
| 13 | 14 | createStaticDiscoveryFromTools, |
| 14 | 15 | createSystemToolMap, |
| @@ -355,6 +356,83 @@ describe("codemode-core", () => { · 340 unmodified lines | ||
| 355 | 356 | }), |
| 356 | 357 | ); |
| 357 | 358 | |
| 359 | + it.effect("builds a tool catalog from descriptor entries", () => | |
| 360 | + Effect.gen(function* () { | |
| 361 | + const catalog = createToolCatalogFromEntries({ | |
| 362 | + entries: [ | |
| 363 | + { | |
| 364 | + namespace: "github.repos", | |
| 365 | + searchText: "github repository details get repo", | |
| 366 | + descriptor: { | |
| 367 | + path: asToolPath("github.repos.getRepo"), | |
| 368 | + sourceKey: "source.github", | |
| 369 | + description: "Get repository details", | |
| 370 | + inputType: "{ owner: string; repo: string }", | |
| 371 | + outputType: "Repository", | |
| 372 | + inputSchemaJson: '{"type":"object"}', | |
| 373 | + }, | |
| 374 | + }, | |
| 375 | + { | |
| 376 | + namespace: "github.issues", | |
| 377 | + searchText: "github issues list repository issues", | |
| 378 | + score: (queryTokens) => | |
| 379 | + queryTokens.includes("issues") && queryTokens.includes("repository") | |
| 380 | + ? 50 | |
| 381 | + : 0, | |
| 382 | + descriptor: { | |
| 383 | + path: asToolPath("github.issues.list"), | |
| 384 | + sourceKey: "source.github", | |
| 385 | + description: "List repository issues", | |
| 386 | + inputType: "{ owner: string; repo: string }", | |
| 387 | + outputType: "Issue[]", | |
| 388 | + }, | |
| 389 | + }, | |
| 390 | + ], | |
| 391 | + getSchemaBundle: ({ id }) => | |
| 392 | + Effect.succeed( | |
| 393 | + id === "bundle_1" | |
| 394 | + ? { | |
| 395 | + id, | |
| 396 | + kind: "json_schema_ref_map", | |
| 397 | + hash: "hash_1", | |
| 398 | + refsJson: "{}", | |
| 399 | + } | |
| 400 | + : null, | |
| 401 | + ), | |
| 402 | + }); | |
| 403 | + | |
| 404 | + const namespaces = yield* catalog.listNamespaces({ limit: 10 }); | |
| 405 | + expect(namespaces).toEqual([ | |
| 406 | + { namespace: "github.repos", toolCount: 1 }, | |
| 407 | + { namespace: "github.issues", toolCount: 1 }, | |
| 408 | + ]); | |
| 409 | + | |
| 410 | + const listed = yield* catalog.listTools({ | |
| 411 | + namespace: "github.repos", | |
| 412 | + query: "repository details", | |
| 413 | + limit: 10, | |
| 414 | + includeSchemas: false, | |
| 415 | + }); | |
| 416 | + expect(listed[0]?.path).toBe("github.repos.getRepo"); | |
| 417 | + expect(listed[0]?.inputSchemaJson).toBeUndefined(); | |
| 418 | + | |
| 419 | + const discovered = yield* catalog.searchTools({ | |
| 420 | + query: "repository issues", | |
| 421 | + limit: 10, | |
| 422 | + }); | |
| 423 | + expect(discovered[0]?.path).toBe("github.issues.list"); | |
| 424 | + | |
| 425 | + const described = yield* catalog.getToolByPath({ | |
| 426 | + path: asToolPath("github.repos.getRepo"), | |
| 427 | + includeSchemas: true, | |
| 428 | + }); | |
| 429 | + expect(described?.inputSchemaJson).toContain('"type"'); | |
| 430 | + | |
| 431 | + const bundle = yield* catalog.getSchemaBundle({ id: "bundle_1" }); | |
| 432 | + expect(bundle?.id).toBe("bundle_1"); | |
| 433 | + }), | |
| 434 | + ); | |
| 435 | + | |
| 358 | 436 | it.effect("system tools can be composed as normal tools", () => |
| 359 | 437 | Effect.gen(function* () { |
| 360 | 438 | const catalog = createToolCatalogFromTools({ |
| @@ -3,11 +3,13 @@ import * as Schema from "effect/Schema"; · 2 unmodified lines | ||
| 3 | 3 | |
| 4 | 4 | import { createDiscoveryPrimitivesFromToolCatalog } from "./discovery"; |
| 5 | 5 | import { toTool } from "./tool-map"; |
| 6 | −import type { | |
| 7 | − DiscoveryPrimitives, | |
| 8 | − ToolCatalog, | |
| 9 | − ToolMap, | |
| 10 | − ToolPath, | |
| 6 | +import { | |
| 7 | + ToolDescriptorSchema, | |
| 8 | + ToolNamespaceSchema, | |
| 9 | + ToolSchemaBundleSchema, | |
| 10 | + type ToolCatalog, | |
| 11 | + type ToolMap, | |
| 12 | + type ToolPath, | |
| 11 | 13 | } from "./types"; |
| 12 | 14 | |
| 13 | 15 | const asToolPath = (value: string): ToolPath => value as ToolPath; |
| @@ -20,13 +22,7 @@ const catalogNamespacesInputSchema = Schema.standardSchemaV1( · 6 unmodified lines | ||
| 20 | 22 | |
| 21 | 23 | const catalogNamespacesOutputSchema = Schema.standardSchemaV1( |
| 22 | 24 | Schema.Struct({ |
| 23 | − namespaces: Schema.Array( | |
| 24 | − Schema.Struct({ | |
| 25 | − namespace: Schema.String, | |
| 26 | − displayName: Schema.optional(Schema.String), | |
| 27 | − toolCount: Schema.optional(Schema.Number), | |
| 28 | − }), | |
| 29 | − ), | |
| 25 | + namespaces: Schema.Array(ToolNamespaceSchema), | |
| 30 | 26 | }), |
| 31 | 27 | ); |
| 32 | 28 | |
| @@ -41,23 +37,7 @@ const catalogToolsInputSchema = Schema.standardSchemaV1( · 8 unmodified lines | ||
| 41 | 37 | |
| 42 | 38 | const catalogToolsOutputSchema = Schema.standardSchemaV1( |
| 43 | 39 | Schema.Struct({ |
| 44 | − results: Schema.Array( | |
| 45 | − Schema.Struct({ | |
| 46 | − path: Schema.String, | |
| 47 | − sourceKey: Schema.String, | |
| 48 | − description: Schema.optional(Schema.String), | |
| 49 | − interaction: Schema.optional(Schema.String), | |
| 50 | − inputType: Schema.optional(Schema.String), | |
| 51 | − outputType: Schema.optional(Schema.String), | |
| 52 | − inputSchemaJson: Schema.optional(Schema.String), | |
| 53 | − outputSchemaJson: Schema.optional(Schema.String), | |
| 54 | − schemaBundleId: Schema.optional(Schema.String), | |
| 55 | − exampleInputJson: Schema.optional(Schema.String), | |
| 56 | − exampleOutputJson: Schema.optional(Schema.String), | |
| 57 | − providerKind: Schema.optional(Schema.String), | |
| 58 | − providerDataJson: Schema.optional(Schema.String), | |
| 59 | − }), | |
| 60 | − ), | |
| 40 | + results: Schema.Array(ToolDescriptorSchema), | |
| 61 | 41 | }), |
| 62 | 42 | ); |
| 63 | 43 | |
| @@ -69,7 +49,7 @@ const describeToolInputSchema = Schema.standardSchemaV1( · 5 unmodified lines | ||
| 69 | 49 | ); |
| 70 | 50 | |
| 71 | 51 | const describeToolOutputSchema = Schema.standardSchemaV1( |
| 72 | − Schema.NullOr(Schema.Unknown), | |
| 52 | + Schema.NullOr(ToolDescriptorSchema), | |
| 73 | 53 | ); |
| 74 | 54 | |
| 75 | 55 | const describeSchemaBundleInputSchema = Schema.standardSchemaV1( |
| @@ -79,14 +59,7 @@ const describeSchemaBundleInputSchema = Schema.standardSchemaV1( · 3 unmodified lines | ||
| 79 | 59 | ); |
| 80 | 60 | |
| 81 | 61 | const describeSchemaBundleOutputSchema = Schema.standardSchemaV1( |
| 82 | − Schema.NullOr( | |
| 83 | − Schema.Struct({ | |
| 84 | − id: Schema.String, | |
| 85 | − kind: Schema.String, | |
| 86 | − hash: Schema.String, | |
| 87 | − refsJson: Schema.String, | |
| 88 | − }), | |
| 89 | − ), | |
| 62 | + Schema.NullOr(ToolSchemaBundleSchema), | |
| 90 | 63 | ); |
| 91 | 64 | |
| 92 | 65 | const discoverInputSchema = Schema.standardSchemaV1( |
| @@ -97,17 +70,12 @@ const discoverInputSchema = Schema.standardSchemaV1( · 4 unmodified lines | ||
| 97 | 70 | }), |
| 98 | 71 | ); |
| 99 | 72 | |
| 100 | −const discoverResultItemSchema = Schema.Struct({ | |
| 101 | − path: Schema.String, | |
| 102 | − score: Schema.Number, | |
| 103 | − description: Schema.optional(Schema.String), | |
| 104 | − interaction: Schema.optional(Schema.String), | |
| 105 | − inputType: Schema.optional(Schema.String), | |
| 106 | − outputType: Schema.optional(Schema.String), | |
| 107 | − inputSchemaJson: Schema.optional(Schema.String), | |
| 108 | − outputSchemaJson: Schema.optional(Schema.String), | |
| 109 | − schemaBundleId: Schema.optional(Schema.String), | |
| 110 | −}); | |
| 73 | +const discoverResultItemSchema = Schema.extend( | |
| 74 | + ToolDescriptorSchema, | |
| 75 | + Schema.Struct({ | |
| 76 | + score: Schema.Number, | |
| 77 | + }), | |
| 78 | +); | |
| 111 | 79 | |
| 112 | 80 | const discoverOutputSchema = Schema.standardSchemaV1( |
| 113 | 81 | Schema.Struct({ |
| @@ -118,7 +86,8 @@ const discoverOutputSchema = Schema.standardSchemaV1( · 4 unmodified lines | ||
| 118 | 86 | ); |
| 119 | 87 | |
| 120 | 88 | export type CreateSystemToolMapInput = { |
| 121 | − catalog: ToolCatalog; | |
| 89 | + catalog?: ToolCatalog; | |
| 90 | + getCatalog?: () => ToolCatalog; | |
| 122 | 91 | sourceKey?: string; |
| 123 | 92 | }; |
| 124 | 93 | |
| @@ -126,130 +95,137 @@ export const createSystemToolMap = ( · 1 unmodified line | ||
| 126 | 95 | input: CreateSystemToolMapInput, |
| 127 | 96 | ): ToolMap => { |
| 128 | 97 | const sourceKey = input.sourceKey ?? "system"; |
| 129 | − const primitives: DiscoveryPrimitives = createDiscoveryPrimitivesFromToolCatalog({ | |
| 130 | − catalog: input.catalog, | |
| 131 | − }); | |
| 98 | + const getCatalog = (): ToolCatalog => { | |
| 99 | + if (input.catalog) { | |
| 100 | + return input.catalog; | |
| 101 | + } | |
| 102 | + if (input.getCatalog) { | |
| 103 | + return input.getCatalog(); | |
| 104 | + } | |
| 105 | + | |
| 106 | + throw new Error("createSystemToolMap requires a catalog or getCatalog"); | |
| 107 | + }; | |
| 108 | + const getPrimitives = () => | |
| 109 | + createDiscoveryPrimitivesFromToolCatalog({ | |
| 110 | + catalog: getCatalog(), | |
| 111 | + }) as Required<ReturnType<typeof createDiscoveryPrimitivesFromToolCatalog>>; | |
| 132 | 112 | |
| 133 | 113 | const tools: ToolMap = {}; |
| 134 | 114 | |
| 135 | − if (primitives.catalog) { | |
| 136 | − tools["catalog.namespaces"] = toTool({ | |
| 137 | − tool: { | |
| 138 | − description: "List available namespaces with display names and tool counts", | |
| 139 | − inputSchema: catalogNamespacesInputSchema, | |
| 140 | − outputSchema: catalogNamespacesOutputSchema, | |
| 141 | − execute: ({ limit }: { limit?: number }) => | |
| 142 | − Effect.runPromise( | |
| 143 | − primitives.catalog!.namespaces({ | |
| 144 | − ...(limit !== undefined ? { limit } : {}), | |
| 145 | − }), | |
| 146 | − ), | |
| 147 | − }, | |
| 148 | − metadata: { | |
| 149 | − sourceKey, | |
| 150 | − interaction: "auto", | |
| 151 | − }, | |
| 152 | − }); | |
| 115 | + tools["catalog.namespaces"] = toTool({ | |
| 116 | + tool: { | |
| 117 | + description: "List available namespaces with display names and tool counts", | |
| 118 | + inputSchema: catalogNamespacesInputSchema, | |
| 119 | + outputSchema: catalogNamespacesOutputSchema, | |
| 120 | + execute: ({ limit }: { limit?: number }) => | |
| 121 | + Effect.runPromise( | |
| 122 | + getPrimitives().catalog.namespaces({ | |
| 123 | + ...(limit !== undefined ? { limit } : {}), | |
| 124 | + }), | |
| 125 | + ), | |
| 126 | + }, | |
| 127 | + metadata: { | |
| 128 | + sourceKey, | |
| 129 | + interaction: "auto", | |
| 130 | + }, | |
| 131 | + }); | |
| 153 | 132 | |
| 154 | − tools["catalog.tools"] = toTool({ | |
| 155 | − tool: { | |
| 156 | − description: "List tools with optional namespace and query filters", | |
| 157 | − inputSchema: catalogToolsInputSchema, | |
| 158 | − outputSchema: catalogToolsOutputSchema, | |
| 159 | − execute: ( | |
| 160 | − input: { | |
| 161 | − namespace?: string; | |
| 162 | − query?: string; | |
| 163 | − limit?: number; | |
| 164 | − includeSchemas?: boolean; | |
| 165 | − }, | |
| 166 | − ) => | |
| 167 | − Effect.runPromise( | |
| 168 | − primitives.catalog!.tools({ | |
| 169 | − ...(input.namespace !== undefined ? { namespace: input.namespace } : {}), | |
| 170 | − ...(input.query !== undefined ? { query: input.query } : {}), | |
| 171 | − ...(input.limit !== undefined ? { limit: input.limit } : {}), | |
| 172 | − ...(input.includeSchemas !== undefined | |
| 173 | − ? { includeSchemas: input.includeSchemas } | |
| 174 | − : {}), | |
| 175 | − }), | |
| 176 | − ), | |
| 177 | − }, | |
| 178 | − metadata: { | |
| 179 | − sourceKey, | |
| 180 | − interaction: "auto", | |
| 181 | − }, | |
| 182 | − }); | |
| 183 | − } | |
| 133 | + tools["catalog.tools"] = toTool({ | |
| 134 | + tool: { | |
| 135 | + description: "List tools with optional namespace and query filters", | |
| 136 | + inputSchema: catalogToolsInputSchema, | |
| 137 | + outputSchema: catalogToolsOutputSchema, | |
| 138 | + execute: ( | |
| 139 | + toolInput: { | |
| 140 | + namespace?: string; | |
| 141 | + query?: string; | |
| 142 | + limit?: number; | |
| 143 | + includeSchemas?: boolean; | |
| 144 | + }, | |
| 145 | + ) => | |
| 146 | + Effect.runPromise( | |
| 147 | + getPrimitives().catalog.tools({ | |
| 148 | + ...(toolInput.namespace !== undefined | |
| 149 | + ? { namespace: toolInput.namespace } | |
| 150 | + : {}), | |
| 151 | + ...(toolInput.query !== undefined ? { query: toolInput.query } : {}), | |
| 152 | + ...(toolInput.limit !== undefined ? { limit: toolInput.limit } : {}), | |
| 153 | + ...(toolInput.includeSchemas !== undefined | |
| 154 | + ? { includeSchemas: toolInput.includeSchemas } | |
| 155 | + : {}), | |
| 156 | + }), | |
| 157 | + ), | |
| 158 | + }, | |
| 159 | + metadata: { | |
| 160 | + sourceKey, | |
| 161 | + interaction: "auto", | |
| 162 | + }, | |
| 163 | + }); | |
| 184 | 164 | |
| 185 | − if (primitives.describe) { | |
| 186 | − tools["describe.tool"] = toTool({ | |
| 187 | − tool: { | |
| 188 | − description: "Get metadata and optional schemas for a tool path", | |
| 189 | − inputSchema: describeToolInputSchema, | |
| 190 | − outputSchema: describeToolOutputSchema, | |
| 191 | − execute: ({ path, includeSchemas }: { path: string; includeSchemas?: boolean }) => | |
| 192 | − Effect.runPromise( | |
| 193 | − primitives.describe!.tool({ | |
| 194 | − path: asToolPath(path), | |
| 195 | − ...(includeSchemas !== undefined ? { includeSchemas } : {}), | |
| 196 | − }), | |
| 197 | − ), | |
| 198 | − }, | |
| 199 | − metadata: { | |
| 200 | − sourceKey, | |
| 201 | − interaction: "auto", | |
| 202 | − }, | |
| 203 | − }); | |
| 165 | + tools["describe.tool"] = toTool({ | |
| 166 | + tool: { | |
| 167 | + description: "Get metadata and optional schemas for a tool path", | |
| 168 | + inputSchema: describeToolInputSchema, | |
| 169 | + outputSchema: describeToolOutputSchema, | |
| 170 | + execute: ({ path, includeSchemas }: { path: string; includeSchemas?: boolean }) => | |
| 171 | + Effect.runPromise( | |
| 172 | + getPrimitives().describe.tool({ | |
| 173 | + path: asToolPath(path), | |
| 174 | + ...(includeSchemas !== undefined ? { includeSchemas } : {}), | |
| 175 | + }), | |
| 176 | + ), | |
| 177 | + }, | |
| 178 | + metadata: { | |
| 179 | + sourceKey, | |
| 180 | + interaction: "auto", | |
| 181 | + }, | |
| 182 | + }); | |
| 204 | 183 | |
| 205 | − tools["describe.schemaBundle"] = toTool({ | |
| 206 | − tool: { | |
| 207 | − description: "Get a shared schema bundle by id", | |
| 208 | − inputSchema: describeSchemaBundleInputSchema, | |
| 209 | − outputSchema: describeSchemaBundleOutputSchema, | |
| 210 | − execute: ({ id }: { id: string }) => | |
| 211 | − Effect.runPromise( | |
| 212 | − primitives.describe!.schemaBundle({ | |
| 213 | − id, | |
| 214 | − }), | |
| 215 | − ), | |
| 216 | − }, | |
| 217 | − metadata: { | |
| 218 | − sourceKey, | |
| 219 | − interaction: "auto", | |
| 220 | − }, | |
| 221 | − }); | |
| 222 | − } | |
| 184 | + tools["describe.schemaBundle"] = toTool({ | |
| 185 | + tool: { | |
| 186 | + description: "Get a shared schema bundle by id", | |
| 187 | + inputSchema: describeSchemaBundleInputSchema, | |
| 188 | + outputSchema: describeSchemaBundleOutputSchema, | |
| 189 | + execute: ({ id }: { id: string }) => | |
| 190 | + Effect.runPromise( | |
| 191 | + getPrimitives().describe.schemaBundle({ | |
| 192 | + id, | |
| 193 | + }), | |
| 194 | + ), | |
| 195 | + }, | |
| 196 | + metadata: { | |
| 197 | + sourceKey, | |
| 198 | + interaction: "auto", | |
| 199 | + }, | |
| 200 | + }); | |
| 223 | 201 | |
| 224 | − if (primitives.discover) { | |
| 225 | − tools.discover = toTool({ | |
| 226 | − tool: { | |
| 227 | − description: "Search tools by intent and return ranked matches", | |
| 228 | − inputSchema: discoverInputSchema, | |
| 229 | − outputSchema: discoverOutputSchema, | |
| 230 | − execute: ( | |
| 231 | − input: { | |
| 232 | − query: string; | |
| 233 | − limit?: number; | |
| 234 | − includeSchemas?: boolean; | |
| 235 | − }, | |
| 236 | − ) => | |
| 237 | − Effect.runPromise( | |
| 238 | − primitives.discover!({ | |
| 239 | − query: input.query, | |
| 240 | − ...(input.limit !== undefined ? { limit: input.limit } : {}), | |
| 241 | − ...(input.includeSchemas !== undefined | |
| 242 | − ? { includeSchemas: input.includeSchemas } | |
| 243 | − : {}), | |
| 244 | − }), | |
| 245 | − ), | |
| 246 | − }, | |
| 247 | − metadata: { | |
| 248 | − sourceKey, | |
| 249 | − interaction: "auto", | |
| 250 | − }, | |
| 251 | − }); | |
| 252 | − } | |
| 202 | + tools.discover = toTool({ | |
| 203 | + tool: { | |
| 204 | + description: "Search tools by intent and return ranked matches", | |
| 205 | + inputSchema: discoverInputSchema, | |
| 206 | + outputSchema: discoverOutputSchema, | |
| 207 | + execute: ( | |
| 208 | + toolInput: { | |
| 209 | + query: string; | |
| 210 | + limit?: number; | |
| 211 | + includeSchemas?: boolean; | |
| 212 | + }, | |
| 213 | + ) => | |
| 214 | + Effect.runPromise( | |
| 215 | + getPrimitives().discover({ | |
| 216 | + query: toolInput.query, | |
| 217 | + ...(toolInput.limit !== undefined ? { limit: toolInput.limit } : {}), | |
| 218 | + ...(toolInput.includeSchemas !== undefined | |
| 219 | + ? { includeSchemas: toolInput.includeSchemas } | |
| 220 | + : {}), | |
| 221 | + }), | |
| 222 | + ), | |
| 223 | + }, | |
| 224 | + metadata: { | |
| 225 | + sourceKey, | |
| 226 | + interaction: "auto", | |
| 227 | + }, | |
| 228 | + }); | |
| 253 | 229 | |
| 254 | 230 | return tools; |
| 255 | 231 | }; |
| @@ -1,5 +1,6 @@ | ||
| 1 | 1 | import type { StandardSchemaV1 } from "@standard-schema/spec"; |
| 2 | 2 | import type * as Effect from "effect/Effect"; |
| 3 | +import * as Schema from "effect/Schema"; | |
| 3 | 4 | |
| 4 | 5 | export type ToolPath = string & { readonly __toolPath: unique symbol }; |
| 5 | 6 | |
| @@ -142,6 +143,25 @@ export type ToolDescriptor = { · 136 unmodified lines | ||
| 142 | 143 | providerDataJson?: string; |
| 143 | 144 | }; |
| 144 | 145 | |
| 146 | +export const ToolDescriptorSchema = Schema.Struct({ | |
| 147 | + path: Schema.String, | |
| 148 | + sourceKey: Schema.String, | |
| 149 | + description: Schema.optional(Schema.String), | |
| 150 | + interaction: Schema.optional( | |
| 151 | + Schema.Union(Schema.Literal("auto"), Schema.Literal("required")), | |
| 152 | + ), | |
| 153 | + elicitation: Schema.optional(Schema.Unknown), | |
| 154 | + inputType: Schema.optional(Schema.String), | |
| 155 | + outputType: Schema.optional(Schema.String), | |
| 156 | + inputSchemaJson: Schema.optional(Schema.String), | |
| 157 | + outputSchemaJson: Schema.optional(Schema.String), | |
| 158 | + schemaBundleId: Schema.optional(Schema.String), | |
| 159 | + exampleInputJson: Schema.optional(Schema.String), | |
| 160 | + exampleOutputJson: Schema.optional(Schema.String), | |
| 161 | + providerKind: Schema.optional(Schema.String), | |
| 162 | + providerDataJson: Schema.optional(Schema.String), | |
| 163 | +}); | |
| 164 | + | |
| 145 | 165 | export type ToolSchemaBundle = { |
| 146 | 166 | id: string; |
| 147 | 167 | kind: string; |
| @@ -149,17 +169,37 @@ export type ToolSchemaBundle = { · 1 unmodified line | ||
| 149 | 169 | refsJson: string; |
| 150 | 170 | }; |
| 151 | 171 | |
| 172 | +export const ToolSchemaBundleSchema = Schema.Struct({ | |
| 173 | + id: Schema.String, | |
| 174 | + kind: Schema.String, | |
| 175 | + hash: Schema.String, | |
| 176 | + refsJson: Schema.String, | |
| 177 | +}); | |
| 178 | + | |
| 152 | 179 | export type ToolNamespace = { |
| 153 | 180 | namespace: string; |
| 154 | 181 | displayName?: string; |
| 155 | 182 | toolCount?: number; |
| 156 | 183 | }; |
| 157 | 184 | |
| 185 | +export const ToolNamespaceSchema = Schema.Struct({ | |
| 186 | + namespace: Schema.String, | |
| 187 | + displayName: Schema.optional(Schema.String), | |
| 188 | + toolCount: Schema.optional(Schema.Number), | |
| 189 | +}); | |
| 190 | + | |
| 158 | 191 | export type SearchHit = { |
| 159 | 192 | path: ToolPath; |
| 160 | 193 | score: number; |
| 161 | 194 | }; |
| 162 | 195 | |
| 196 | +export type ToolCatalogEntry = { | |
| 197 | + descriptor: ToolDescriptor; | |
| 198 | + namespace?: string; | |
| 199 | + searchText?: string; | |
| 200 | + score?: (queryTokens: readonly string[]) => number; | |
| 201 | +}; | |
| 202 | + | |
| 163 | 203 | export interface ToolCatalog { |
| 164 | 204 | listNamespaces(input: { |
| 165 | 205 | limit: number; |
| @@ -10,21 +10,16 @@ · 9 unmodified lines | ||
| 10 | 10 | "imports": { |
| 11 | 11 | "#schema": "./src/schema/index.ts", |
| 12 | 12 | "#domain": "./src/domain/index.ts", |
| 13 | − "#persistence": "./src/persistence/index.ts", | |
| 14 | 13 | "#api": "./src/api/index.ts", |
| 15 | 14 | "#runtime": "./src/runtime/index.ts" |
| 16 | 15 | }, |
| 17 | 16 | "scripts": { |
| 18 | 17 | "typecheck": "bunx tsc --noEmit -p tsconfig.json", |
| 19 | 18 | "test": "vitest run", |
| 20 | − "test:watch": "vitest", | |
| 21 | − "db:generate": "bunx drizzle-kit generate --config drizzle.config.ts", | |
| 22 | − "db:migrate": "bunx drizzle-kit migrate --config drizzle.config.ts", | |
| 23 | − "db:studio": "bunx drizzle-kit studio --config drizzle.config.ts" | |
| 19 | + "test:watch": "vitest" | |
| 24 | 20 | }, |
| 25 | 21 | "dependencies": { |
| 26 | 22 | "@effect/platform": "catalog:", |
| 27 | − "@electric-sql/pglite": "^0.3.12", | |
| 28 | 23 | "@executor/codemode-core": "workspace:*", |
| 29 | 24 | "@executor/codemode-google-discovery": "workspace:*", |
| 30 | 25 | "@executor/codemode-mcp": "workspace:*", |
| @@ -32,11 +27,9 @@ · 1 unmodified line | ||
| 32 | 27 | "@executor/runtime-ses": "workspace:*", |
| 33 | 28 | "@executor/codemode-openapi": "workspace:*", |
| 34 | 29 | "@executor/runtime-deno-subprocess": "workspace:*", |
| 35 | − "drizzle-orm": "1.0.0-beta.15-859cf75", | |
| 36 | 30 | "effect": "catalog:", |
| 37 | 31 | "graphql": "^16.12.0", |
| 38 | 32 | "jsonc-parser": "3.3.1", |
| 39 | − "postgres": "^3.4.7", | |
| 40 | 33 | "prettier": "^3.8.1", |
| 41 | 34 | "typescript": "^5.9.3" |
| 42 | 35 | }, |
| @@ -46,7 +39,6 @@ · 3 unmodified lines | ||
| 46 | 39 | "@effect/platform-node": "catalog:", |
| 47 | 40 | "@modelcontextprotocol/sdk": "^1.26.0", |
| 48 | 41 | "bun-types": "catalog:", |
| 49 | − "drizzle-kit": "1.0.0-beta.15-859cf75", | |
| 50 | 42 | "vitest": "catalog:", |
| 51 | 43 | "zod": "catalog:" |
| 52 | 44 | } |