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