History

misc stuff

Rhys Sullivan committed 8 months ago

Commit f045f3c1 parent 20f99de16 files · +744 −1741Browse files

Unified · Split

16 files
  1. .github/workflows/publish-executor-package.yml +6 −108
  2. apps/executor/package.json +2 −6
  3. apps/executor/src/distribution/artifact.ts +6 −74
  4. apps/executor/src/distribution/build-package.ts +0 −58
  5. apps/executor/src/distribution/build-portable.ts +0 −78
  6. apps/executor/src/distribution/build-release.ts +0 −137
  7. apps/executor/src/distribution/portable.test.ts +0 −232
  8. apps/executor/src/distribution/portable.ts +0 −607
  9. apps/executor/src/distribution/publish.ts +224 −0
  10. bun.lock +29 −232
  11. opencode.json +10 −0
  12. packages/codemode-core/src/discovery.ts +205 −33
  13. packages/codemode-core/src/index.test.ts +78 −0
  14. packages/codemode-core/src/system-tools.ts +143 −167
  15. packages/codemode-core/src/types.ts +40 −0
  16. packages/control-plane/package.json +1 −9
.github/workflows/publish-executor-package.yml+6−108
@@ -1,8 +1,10 @@
1−name: Publish Executor Package
1+name: Publish Executor
22 run-name: "${{ format('publish executor {0}', github.ref_name) }}"
33
44 on:
5− workflow_dispatch:
5+ push:
6+ tags:
7+ - "v*"
68
79 permissions:
810 contents: write
@@ -22,14 +24,6 @@ jobs: · 13 unmodified lines
2224 with:
2325 fetch-depth: 0
2426
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−
3327 - name: Setup Bun
3428 uses: oven-sh/setup-bun@v2
3529
@@ -39,111 +33,15 @@ jobs: · 3 unmodified lines
3933 node-version: 22
4034 registry-url: https://registry.npmjs.org
4135
42− - name: Setup Deno
43− uses: denoland/setup-deno@v2
44− with:
45− deno-version: v2.x
46−
4736 - name: Install dependencies
4837 run: bun install --frozen-lockfile
4938
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−
11039 - name: Run executor checks
11140 run: |
11241 bun run --cwd apps/executor typecheck
11342 bun run --cwd apps/executor test
11443
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
12645 env:
12746 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
apps/executor/package.json+2−6
@@ -29,12 +29,8 @@ · 28 unmodified lines
2929 "test": "vitest run",
3030 "test:watch": "vitest",
3131 "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"
3834 },
3935 "dependencies": {
4036 "@effect/cli": "catalog:",
apps/executor/src/distribution/artifact.ts+6−74
@@ -7,7 +7,6 @@ import { dirname, join, resolve } from "node:path"; · 6 unmodified lines
77 import { readDistributionPackageMetadata, repoRoot } from "./metadata";
88
99 const defaultOutputDir = resolve(repoRoot, "apps/executor/dist/npm");
10−const DENO_INSTALL_URL = "https://docs.deno.com/runtime/getting_started/installation/";
1110
1211
1312 export type BuildDistributionPackageOptions = {
@@ -72,26 +71,16 @@ const runCommand = async (input: CommandInput): Promise<void> => { · 58 unmodified lines
7271 );
7372 };
7473
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−
8974 const resolveQuickJsWasmPath = (): string => {
9075 const requireFromQuickJsRuntime = createRequire(
9176 join(repoRoot, "packages/runtime-quickjs/package.json"),
9277 );
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",
9584 );
9685
9786 if (!existsSync(wasmPath)) {
@@ -131,9 +120,6 @@ const createPackageJson = (input: { · 33 unmodified lines
131120 bin: {
132121 executor: "bin/executor.js",
133122 },
134− scripts: {
135− postinstall: "node ./bin/postinstall.js",
136− },
137123 files: [
138124 "bin",
139125 "resources",
@@ -154,48 +140,6 @@ const createLauncherSource = () => [ · 14 unmodified lines
154140 "",
155141 ].join("\n");
156142
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−
199143 export const buildDistributionPackage = async (
200144 options: BuildDistributionPackageOptions = {},
201145 ): Promise<DistributionPackageArtifact> => {
@@ -204,13 +148,8 @@ export const buildDistributionPackage = async ( · 2 unmodified lines
204148 const binDir = join(packageDir, "bin");
205149 const resourcesDir = join(packageDir, "resources");
206150 const webDir = join(resourcesDir, "web");
207− const migrationsDir = join(resourcesDir, "migrations");
208151 const bundlePath = join(binDir, "executor.mjs");
209152 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");
214153 const quickJsWasmPath = resolveQuickJsWasmPath();
215154 const webDistDir = join(repoRoot, "apps/web/dist");
216155 const readmePath = join(repoRoot, "README.md");
@@ -246,11 +185,6 @@ export const buildDistributionPackage = async ( · 29 unmodified lines
246185 });
247186
248187 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"));
254188 await cp(quickJsWasmPath, join(binDir, "emscripten-module.wasm"));
255189 await mkdir(join(binDir, "openapi-extractor-wasm"), { recursive: true });
256190 await cp(
@@ -273,9 +207,7 @@ export const buildDistributionPackage = async ( · 16 unmodified lines
273207 }));
274208 await cp(readmePath, join(packageDir, "README.md"));
275209 await writeFile(launcherPath, createLauncherSource());
276− await writeFile(postinstallPath, createPostinstallSource());
277210 await chmod(launcherPath, 0o755);
278− await chmod(postinstallPath, 0o755);
279211
280212 return {
281213 packageDir,
apps/executor/src/distribution/build-package.ts+0−58
@@ -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();
apps/executor/src/distribution/build-portable.ts+0−78
@@ -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();
apps/executor/src/distribution/build-release.ts+0−137
@@ -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();
apps/executor/src/distribution/portable.test.ts+0−232
@@ -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−});
apps/executor/src/distribution/portable.ts+0−607
@@ -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−};
apps/executor/src/distribution/publish.ts+224−0
@@ -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();
bun.lock+29−232
@@ -161,7 +161,6 @@ · 160 unmodified lines
161161 "name": "@executor/control-plane",
162162 "dependencies": {
163163 "@effect/platform": "catalog:",
164− "@electric-sql/pglite": "^0.3.12",
165164 "@executor/codemode-core": "workspace:*",
166165 "@executor/codemode-google-discovery": "workspace:*",
167166 "@executor/codemode-mcp": "workspace:*",
@@ -169,12 +168,11 @@ · 1 unmodified line
169168 "@executor/runtime-deno-subprocess": "workspace:*",
170169 "@executor/runtime-quickjs": "workspace:*",
171170 "@executor/runtime-ses": "workspace:*",
172− "drizzle-orm": "1.0.0-beta.15-859cf75",
173171 "effect": "catalog:",
174172 "graphql": "^16.12.0",
175173 "jsonc-parser": "3.3.1",
176− "postgres": "^3.4.7",
177174 "prettier": "^3.8.1",
175+ "typescript": "^5.9.3",
178176 },
179177 "devDependencies": {
180178 "@effect/platform-node": "catalog:",
@@ -182,7 +180,6 @@ · 1 unmodified line
182180 "@modelcontextprotocol/sdk": "^1.26.0",
183181 "@types/node": "catalog:",
184182 "bun-types": "catalog:",
185− "drizzle-kit": "1.0.0-beta.15-859cf75",
186183 "vitest": "catalog:",
187184 "zod": "catalog:",
188185 },
@@ -320,40 +317,6 @@ · 131 unmodified lines
320317
321318 "@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=="],
322319
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−
357320 "@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=="],
358321
359322 "@babel/compat-data": ["@babel/compat-data@7.29.0", "", {}, "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg=="],
@@ -402,8 +365,6 @@ · 42 unmodified lines
402365
403366 "@csstools/css-tokenizer": ["@csstools/css-tokenizer@3.0.4", "", {}, "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw=="],
404367
405− "@drizzle-team/brocli": ["@drizzle-team/brocli@0.11.0", "", {}, "sha512-hD3pekGiPg0WPCCGAZmusBBJsDqGUR66Y452YgQsZOnkdQ7ViEPKuyP4huUGEZQefp8g34RRodXYmJ2TbCH+tg=="],
406−
407368 "@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=="],
408369
409370 "@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
434395
435396 "@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=="],
436397
437− "@electric-sql/pglite": ["@electric-sql/pglite@0.3.15", "", {}, "sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ=="],
438−
439398 "@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="],
440399
441400 "@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="],
@@ -448,57 +407,57 @@ · 6 unmodified lines
448407
449408 "@endo/immutable-arraybuffer": ["@endo/immutable-arraybuffer@1.1.2", "", {}, "sha512-u+NaYB2aqEugQ3u7w3c5QNkPogf8q/xGgsPaqdY6pUiGWtYiTiFspKFcha6+oeZhWXWQ23rf0KrUq0kfuzqYyQ=="],
450409
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=="],
452411
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=="],
454413
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=="],
456415
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=="],
458417
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=="],
460419
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=="],
462421
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=="],
464423
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=="],
466425
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=="],
468427
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=="],
470429
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=="],
472431
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=="],
474433
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=="],
476435
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=="],
478437
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=="],
480439
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=="],
482441
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=="],
484443
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=="],
486445
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=="],
488447
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=="],
490449
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=="],
492451
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=="],
494453
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=="],
496455
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=="],
498457
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=="],
500459
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=="],
502461
503462 "@executor/ai-sdk-adapter": ["@executor/ai-sdk-adapter@workspace:packages/ai-sdk-adapter"],
504463
@@ -556,10 +515,6 @@ · 51 unmodified lines
556515
557516 "@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=="],
558517
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−
563518 "@medv/finder": ["@medv/finder@4.0.2", "", {}, "sha512-RraNY9SCcx4KZV0Dh6BEW6XEW2swkqYca74pkFFRw6hHItSHiy+O/xMnpbofjYbzXj0tSpBGthUF1hHTsr3vIQ=="],
564519
565520 "@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
768723
769724 "@tanstack/store": ["@tanstack/store@0.9.2", "", {}, "sha512-K013lUJEFJK2ofFQ/hZKJUmCnpcV00ebLyOyFOWQvyQHUOZp/iYO84BM6aOGiV81JzwbX0APTVmW8YI7yiG5oA=="],
770725
771− "@tediousjs/connection-string": ["@tediousjs/connection-string@0.5.0", "", {}, "sha512-7qSgZbincDDDFyRweCIEvZULFAw5iz/DeunhvuxpL31nfntX3P4Yd4HkHBRg9H8CdqY1e5WFN1PZIz/REL9MVQ=="],
772−
773726 "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
774727
775728 "@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
798751
799752 "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="],
800753
801− "@types/mssql": ["@types/mssql@9.1.9", "", { "dependencies": { "@types/node": "*", "tarn": "^3.0.1", "tedious": "*" } }, "sha512-P0nCgw6vzY23UxZMnbI4N7fnLGANt4LI4yvxze1paPj+LuN28cFv5EI+QidP8udnId/BKhkcRhm/BleNsjK65A=="],
802−
803754 "@types/node": ["@types/node@24.11.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-fPxQqz4VTgPI/IQ+lj9r0h+fDR66bzoeMGHp8ASee+32OSGIkeASsoZuJixsQoVef1QJbeubcPBxKk22QVoWdw=="],
804755
805756 "@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
808759
809760 "@types/react-reconciler": ["@types/react-reconciler@0.28.9", "", { "peerDependencies": { "@types/react": "*" } }, "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg=="],
810761
811− "@types/readable-stream": ["@types/readable-stream@4.0.23", "", { "dependencies": { "@types/node": "*" } }, "sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig=="],
812−
813762 "@types/tough-cookie": ["@types/tough-cookie@4.0.5", "", {}, "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA=="],
814763
815764 "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
816765
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−
819766 "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],
820767
821768 "@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="],
@@ -836,8 +783,6 @@ · 14 unmodified lines
836783
837784 "@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=="],
838785
839− "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="],
840−
841786 "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="],
842787
843788 "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="],
@@ -858,14 +803,10 @@ · 14 unmodified lines
858803
859804 "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
860805
861− "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
862−
863806 "baseline-browser-mapping": ["baseline-browser-mapping@2.10.0", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA=="],
864807
865808 "bippy": ["bippy@0.5.32", "", { "dependencies": { "@types/react-reconciler": "^0.28.9" }, "peerDependencies": { "react": ">=17.0.1" } }, "sha512-yt1mC8eReTxjfg41YBZdN4PvsDwHFWxltoiQX0Q+Htlbf41aSniopb7ECZits01HwNAvXEh69RGk/ImlswDTEw=="],
866809
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−
869810 "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=="],
870811
871812 "brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
@@ -874,14 +815,8 @@ · 2 unmodified lines
874815
875816 "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=="],
876817
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−
881818 "bun-types": ["bun-types@1.3.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-tcpfCCl6XWo6nCVnpcVrxQ+9AYN1iqMIzgrSKYMB/fjLtV2eyAVEg7AxQJuCq/26R6HpKWykQXuSOq/21RYcbg=="],
882819
883− "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="],
884−
885820 "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="],
886821
887822 "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="],
@@ -918,7 +853,7 @@ · 30 unmodified lines
918853
919854 "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="],
920855
921− "commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="],
856+ "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="],
922857
923858 "content-disposition": ["content-disposition@1.0.1", "", {}, "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q=="],
924859
@@ -950,12 +885,6 @@ · 25 unmodified lines
950885
951886 "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="],
952887
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−
959888 "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],
960889
961890 "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
@@ -964,14 +893,8 @@ · 2 unmodified lines
964893
965894 "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
966895
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−
971896 "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=="],
972897
973− "ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="],
974−
975898 "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="],
976899
977900 "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
994917
995918 "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="],
996919
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=="],
998921
999922 "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
1000923
@@ -1008,10 +931,6 @@ · 7 unmodified lines
1008931
1009932 "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="],
1010933
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−
1015934 "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="],
1016935
1017936 "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="],
@@ -1110,8 +1029,6 @@ · 92 unmodified lines
11101029
11111030 "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="],
11121031
1113− "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
1114−
11151032 "ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],
11161033
11171034 "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
@@ -1130,16 +1047,12 @@ · 12 unmodified lines
11301047
11311048 "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="],
11321049
1133− "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="],
1134−
11351050 "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
11361051
11371052 "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
11381053
11391054 "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="],
11401055
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−
11431056 "is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="],
11441057
11451058 "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
@@ -1152,8 +1065,6 @@ · 6 unmodified lines
11521065
11531066 "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="],
11541067
1155− "is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="],
1156−
11571068 "isbot": ["isbot@5.1.35", "", {}, "sha512-waFfC72ZNfwLLuJ2iLaoVaqcNo+CAaLR7xCpAn0Y5WfGzkNHv7ZN39Vbi1y+kb+Zs46XHOX3tZNExroFUPX+Kg=="],
11581069
11591070 "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
@@ -1162,14 +1073,10 @@ · 2 unmodified lines
11621073
11631074 "jose": ["jose@6.1.3", "", {}, "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ=="],
11641075
1165− "js-md4": ["js-md4@0.3.2", "", {}, "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA=="],
1166−
11671076 "js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="],
11681077
11691078 "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
11701079
1171− "jsbi": ["jsbi@4.3.2", "", {}, "sha512-9fqMSQbhJykSeii05nxKl4m6Eqn2P6rOlYiS+C5Dr/HPIU/7yZxu5qzbs40tgaFORiw2Amd0mirjxatXYMkIew=="],
1172−
11731080 "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=="],
11741081
11751082 "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
@@ -1184,12 +1091,6 @@ · 8 unmodified lines
11841091
11851092 "jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="],
11861093
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−
11931094 "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="],
11941095
11951096 "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
12201121
12211122 "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.31.1", "", { "os": "win32", "cpu": "x64" }, "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw=="],
12221123
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−
12371124 "log-symbols": ["log-symbols@6.0.0", "", { "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" } }, "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw=="],
12381125
12391126 "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="],
@@ -1362,14 +1249,10 @@ · 122 unmodified lines
13621249
13631250 "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=="],
13641251
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−
13671252 "multipasta": ["multipasta@0.2.7", "", {}, "sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA=="],
13681253
13691254 "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
13701255
1371− "native-duplexpair": ["native-duplexpair@1.0.0", "", {}, "sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA=="],
1372−
13731256 "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="],
13741257
13751258 "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="],
@@ -1394,8 +1277,6 @@ · 18 unmodified lines
13941277
13951278 "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=="],
13961279
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−
13991280 "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=="],
14001281
14011282 "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
14221303
14231304 "postcss": ["postcss@8.5.8", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg=="],
14241305
1425− "postgres": ["postgres@3.4.8", "", {}, "sha512-d+JFcLM17njZaOLkv6SCev7uoLaBtfK86vMUXhW1Z4glPWh4jozno9APvW/XKFJ3CCxVoC7OL38BqRydtu5nGg=="],
1426−
14271306 "prettier": ["prettier@3.8.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="],
14281307
1429− "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="],
1430−
14311308 "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="],
14321309
14331310 "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
@@ -1458,8 +1335,6 @@ · 24 unmodified lines
14581335
14591336 "react-refresh": ["react-refresh@0.18.0", "", {}, "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw=="],
14601337
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−
14631338 "regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="],
14641339
14651340 "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="],
@@ -1488,20 +1363,14 @@ · 22 unmodified lines
14881363
14891364 "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
14901365
1491− "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="],
1492−
14931366 "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=="],
14941367
14951368 "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=="],
14961369
14971370 "rrweb-cssom": ["rrweb-cssom@0.8.0", "", {}, "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw=="],
14981371
1499− "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="],
1500−
15011372 "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
15021373
1503− "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
1504−
15051374 "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
15061375
15071376 "saxes": ["saxes@6.0.0", "", { "dependencies": { "xmlchars": "^2.2.0" } }, "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA=="],
@@ -1550,8 +1419,6 @@ · 42 unmodified lines
15501419
15511420 "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],
15521421
1553− "sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="],
1554−
15551422 "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="],
15561423
15571424 "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="],
@@ -1564,8 +1431,6 @@ · 6 unmodified lines
15641431
15651432 "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=="],
15661433
1567− "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="],
1568−
15691434 "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=="],
15701435
15711436 "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
15861451
15871452 "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="],
15881453
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−
15931454 "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="],
15941455
15951456 "tiny-warning": ["tiny-warning@1.0.3", "", {}, "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="],
@@ -1706,8 +1567,6 @@ · 110 unmodified lines
17061567
17071568 "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=="],
17081569
1709− "wsl-utils": ["wsl-utils@0.1.0", "", { "dependencies": { "is-wsl": "^3.1.0" } }, "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw=="],
1710−
17111570 "xml-name-validator": ["xml-name-validator@5.0.0", "", {}, "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="],
17121571
17131572 "xmlchars": ["xmlchars@2.2.0", "", {}, "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="],
@@ -1722,14 +1581,10 @@ · 8 unmodified lines
17221581
17231582 "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="],
17241583
1725− "@azure/msal-node/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="],
1726−
17271584 "@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
17281585
17291586 "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
17301587
1731− "@react-grab/cli/commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="],
1732−
17331588 "@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=="],
17341589
17351590 "@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
17441599
17451600 "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
17461601
1747− "jsonwebtoken/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
1748−
17491602 "log-symbols/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="],
17501603
17511604 "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
17521605
17531606 "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
17541607
1755− "tedious/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
1756−
17571608 "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=="],
17581609
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−
17611610 "whatwg-encoding/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
17621611
17631612 "@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
17731622 "@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=="],
17741623
17751624 "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=="],
18281625 }
18291626 }
opencode.json+10−0
@@ -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+}
packages/codemode-core/src/discovery.ts+205−33
@@ -6,10 +6,14 @@ import type { · 5 unmodified lines
66 DescribePrimitive,
77 DiscoverPrimitive,
88 DiscoveryPrimitives,
9+ SearchHit,
910 ToolCatalog,
11+ ToolCatalogEntry,
1012 ToolDescriptor,
1113 ToolMap,
14+ ToolNamespace,
1215 ToolPath,
16+ ToolSchemaBundle,
1317 } from "./types";
1418
1519 const tokenize = (value: string): string[] =>
@@ -57,18 +61,117 @@ const namespaceFromPath = (path: string): string => { · 41 unmodified lines
5761 return second ? `${first}.${second}` : first;
5862 };
5963
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+
60147 export function createToolCatalogFromTools(input: {
61148 tools: ToolMap;
62149 defaultNamespace?: string;
63150 }): 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+ })),
66160 });
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+ );
68171 const namespaceCounts = new Map<string, number>();
69172
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);
72175 namespaceCounts.set(namespace, (namespaceCounts.get(namespace) ?? 0) + 1);
73176 }
74177
@@ -81,23 +184,22 @@ export function createToolCatalogFromTools(input: { · 6 unmodified lines
81184 ),
82185 listTools: ({ namespace, query, limit, includeSchemas = false }) =>
83186 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) => {
90192 if (!query) {
91193 return true;
92194 }
93195
94− const haystack = searchableTextForTool(descriptor);
196+ const haystack = searchableTextForEntry(entry);
95197 return tokenize(query).every((token) => haystack.includes(token));
96198 })
97199 .slice(0, limit)
98− .map((descriptor) =>
200+ .map((entry) =>
99201 projectDescriptor({
100− descriptor,
202+ descriptor: entry.descriptor,
101203 includeSchemas,
102204 })
103205 ),
@@ -106,33 +208,27 @@ export function createToolCatalogFromTools(input: { · 2 unmodified lines
106208 Effect.succeed(
107209 byPath.get(path)
108210 ? projectDescriptor({
109− descriptor: byPath.get(path)!,
211+ descriptor: byPath.get(path)!.descriptor,
110212 includeSchemas,
111213 })
112214 : null,
113215 ),
114− getSchemaBundle: () => Effect.succeed(null),
216+ getSchemaBundle: ({ id }) =>
217+ input.getSchemaBundle
218+ ? input.getSchemaBundle({ id })
219+ : Effect.succeed(null),
115220 searchTools: ({ query, namespace, limit }) => {
116221 const queryTokens = tokenize(query);
117222
118223 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+ }))
136232 .filter((hit) => hit.score > 0)
137233 .sort((left, right) => right.score - left.score)
138234 .slice(0, limit),
@@ -141,6 +237,82 @@ export function createToolCatalogFromTools(input: { · 2 unmodified lines
141237 } satisfies ToolCatalog;
142238 }
143239
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+
144316 export function createStaticDiscoveryFromTools(input: {
145317 tools: ToolMap;
146318 sourceKey?: string;
packages/codemode-core/src/index.test.ts+78−0
@@ -9,6 +9,7 @@ import * as TestClock from "effect/TestClock"; · 8 unmodified lines
99 import {
1010 allowAllToolInteractions,
1111 createToolCatalogDiscovery,
12+ createToolCatalogFromEntries,
1213 createToolCatalogFromTools,
1314 createStaticDiscoveryFromTools,
1415 createSystemToolMap,
@@ -355,6 +356,83 @@ describe("codemode-core", () => { · 340 unmodified lines
355356 }),
356357 );
357358
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+
358436 it.effect("system tools can be composed as normal tools", () =>
359437 Effect.gen(function* () {
360438 const catalog = createToolCatalogFromTools({
packages/codemode-core/src/system-tools.ts+143−167
@@ -3,11 +3,13 @@ import * as Schema from "effect/Schema"; · 2 unmodified lines
33
44 import { createDiscoveryPrimitivesFromToolCatalog } from "./discovery";
55 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,
1113 } from "./types";
1214
1315 const asToolPath = (value: string): ToolPath => value as ToolPath;
@@ -20,13 +22,7 @@ const catalogNamespacesInputSchema = Schema.standardSchemaV1( · 6 unmodified lines
2022
2123 const catalogNamespacesOutputSchema = Schema.standardSchemaV1(
2224 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),
3026 }),
3127 );
3228
@@ -41,23 +37,7 @@ const catalogToolsInputSchema = Schema.standardSchemaV1( · 8 unmodified lines
4137
4238 const catalogToolsOutputSchema = Schema.standardSchemaV1(
4339 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),
6141 }),
6242 );
6343
@@ -69,7 +49,7 @@ const describeToolInputSchema = Schema.standardSchemaV1( · 5 unmodified lines
6949 );
7050
7151 const describeToolOutputSchema = Schema.standardSchemaV1(
72− Schema.NullOr(Schema.Unknown),
52+ Schema.NullOr(ToolDescriptorSchema),
7353 );
7454
7555 const describeSchemaBundleInputSchema = Schema.standardSchemaV1(
@@ -79,14 +59,7 @@ const describeSchemaBundleInputSchema = Schema.standardSchemaV1( · 3 unmodified lines
7959 );
8060
8161 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),
9063 );
9164
9265 const discoverInputSchema = Schema.standardSchemaV1(
@@ -97,17 +70,12 @@ const discoverInputSchema = Schema.standardSchemaV1( · 4 unmodified lines
9770 }),
9871 );
9972
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+);
11179
11280 const discoverOutputSchema = Schema.standardSchemaV1(
11381 Schema.Struct({
@@ -118,7 +86,8 @@ const discoverOutputSchema = Schema.standardSchemaV1( · 4 unmodified lines
11886 );
11987
12088 export type CreateSystemToolMapInput = {
121− catalog: ToolCatalog;
89+ catalog?: ToolCatalog;
90+ getCatalog?: () => ToolCatalog;
12291 sourceKey?: string;
12392 };
12493
@@ -126,130 +95,137 @@ export const createSystemToolMap = ( · 1 unmodified line
12695 input: CreateSystemToolMapInput,
12796 ): ToolMap => {
12897 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>>;
132112
133113 const tools: ToolMap = {};
134114
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+ });
153132
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+ });
184164
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+ });
204183
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+ });
223201
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+ });
253229
254230 return tools;
255231 };
packages/codemode-core/src/types.ts+40−0
@@ -1,5 +1,6 @@
11 import type { StandardSchemaV1 } from "@standard-schema/spec";
22 import type * as Effect from "effect/Effect";
3+import * as Schema from "effect/Schema";
34
45 export type ToolPath = string & { readonly __toolPath: unique symbol };
56
@@ -142,6 +143,25 @@ export type ToolDescriptor = { · 136 unmodified lines
142143 providerDataJson?: string;
143144 };
144145
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+
145165 export type ToolSchemaBundle = {
146166 id: string;
147167 kind: string;
@@ -149,17 +169,37 @@ export type ToolSchemaBundle = { · 1 unmodified line
149169 refsJson: string;
150170 };
151171
172+export const ToolSchemaBundleSchema = Schema.Struct({
173+ id: Schema.String,
174+ kind: Schema.String,
175+ hash: Schema.String,
176+ refsJson: Schema.String,
177+});
178+
152179 export type ToolNamespace = {
153180 namespace: string;
154181 displayName?: string;
155182 toolCount?: number;
156183 };
157184
185+export const ToolNamespaceSchema = Schema.Struct({
186+ namespace: Schema.String,
187+ displayName: Schema.optional(Schema.String),
188+ toolCount: Schema.optional(Schema.Number),
189+});
190+
158191 export type SearchHit = {
159192 path: ToolPath;
160193 score: number;
161194 };
162195
196+export type ToolCatalogEntry = {
197+ descriptor: ToolDescriptor;
198+ namespace?: string;
199+ searchText?: string;
200+ score?: (queryTokens: readonly string[]) => number;
201+};
202+
163203 export interface ToolCatalog {
164204 listNamespaces(input: {
165205 limit: number;
packages/control-plane/package.json+1−9
@@ -10,21 +10,16 @@ · 9 unmodified lines
1010 "imports": {
1111 "#schema": "./src/schema/index.ts",
1212 "#domain": "./src/domain/index.ts",
13− "#persistence": "./src/persistence/index.ts",
1413 "#api": "./src/api/index.ts",
1514 "#runtime": "./src/runtime/index.ts"
1615 },
1716 "scripts": {
1817 "typecheck": "bunx tsc --noEmit -p tsconfig.json",
1918 "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"
2420 },
2521 "dependencies": {
2622 "@effect/platform": "catalog:",
27− "@electric-sql/pglite": "^0.3.12",
2823 "@executor/codemode-core": "workspace:*",
2924 "@executor/codemode-google-discovery": "workspace:*",
3025 "@executor/codemode-mcp": "workspace:*",
@@ -32,11 +27,9 @@ · 1 unmodified line
3227 "@executor/runtime-ses": "workspace:*",
3328 "@executor/codemode-openapi": "workspace:*",
3429 "@executor/runtime-deno-subprocess": "workspace:*",
35− "drizzle-orm": "1.0.0-beta.15-859cf75",
3630 "effect": "catalog:",
3731 "graphql": "^16.12.0",
3832 "jsonc-parser": "3.3.1",
39− "postgres": "^3.4.7",
4033 "prettier": "^3.8.1",
4134 "typescript": "^5.9.3"
4235 },
@@ -46,7 +39,6 @@ · 3 unmodified lines
4639 "@effect/platform-node": "catalog:",
4740 "@modelcontextprotocol/sdk": "^1.26.0",
4841 "bun-types": "catalog:",
49− "drizzle-kit": "1.0.0-beta.15-859cf75",
5042 "vitest": "catalog:",
5143 "zod": "catalog:"
5244 }