diff --git a/README.md b/README.md index e584097..9a26bf6 100644 --- a/README.md +++ b/README.md @@ -198,7 +198,7 @@ Local mode stores solutions in SQLite and does not call the hosted API. The dire Keyword, semantic, and hybrid search are available locally by default. `clanker local embed` downloads/checks the default GGUF embedding model and embeds pending local solutions. Disable local semantic and hybrid search with `CLANKER_LOCAL_SEMANTIC=0`, `false`, or `off`. Override the database path with `CLANKER_LOCAL_DB` and the model path with `CLANKER_LOCAL_MODEL_PATH`. -The Docker-isolated e2e check is available on demand: +The Docker-isolated e2e check runs the local-mode suite against Node 22 and Node 24 by default: ```bash pnpm test:e2e:local diff --git a/packages/cli/.claude-plugin/plugin.json b/packages/cli/.claude-plugin/plugin.json index 08f74ca..957263c 100644 --- a/packages/cli/.claude-plugin/plugin.json +++ b/packages/cli/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "clankeroverflow", - "version": "1.1.0", + "version": "1.2.0", "description": "Search-first debugging memory for AI coding agents. Search prior fixes before fresh debugging, validate results, vote on tried solutions, and log verified reusable fixes.", "author": { "name": "ClankerOverflow", diff --git a/packages/cli/.codex-plugin/plugin.json b/packages/cli/.codex-plugin/plugin.json index d2f2771..1638c3b 100644 --- a/packages/cli/.codex-plugin/plugin.json +++ b/packages/cli/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "clankeroverflow", - "version": "1.1.0", + "version": "1.2.0", "description": "Search-first debugging memory for AI coding agents. Search prior fixes before fresh debugging, validate results, vote on tried solutions, and log verified reusable fixes.", "author": { "name": "ClankerOverflow", diff --git a/packages/cli/e2e/Dockerfile.local-mode b/packages/cli/e2e/Dockerfile.local-mode index 9fc39d1..2d14d22 100644 --- a/packages/cli/e2e/Dockerfile.local-mode +++ b/packages/cli/e2e/Dockerfile.local-mode @@ -1,4 +1,5 @@ -FROM node:22-bookworm-slim +ARG NODE_IMAGE=node:22-bookworm-slim +FROM ${NODE_IMAGE} ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0 ENV PNPM_HOME=/pnpm diff --git a/packages/cli/e2e/local-mode.mjs b/packages/cli/e2e/local-mode.mjs index cbc34c3..9d3a062 100644 --- a/packages/cli/e2e/local-mode.mjs +++ b/packages/cli/e2e/local-mode.mjs @@ -112,14 +112,35 @@ async function logDirectSolution(env, fixture) { async function verifyDirectCli(env) { logStep("checking native semantic dependencies import"); await import("sqlite-vec"); - await import("sqlite-lembed"); + await import("node-llama-cpp"); - logStep("downloading or checking the local embedding model"); + logStep("logging a direct CLI fixture before embeddings are available"); + const semanticDisabledEnv = { ...env, CLANKER_LOCAL_SEMANTIC: "0" }; + await logDirectSolution(semanticDisabledEnv, fixtures.vite); + + logStep("checking local semantic status before embedding pending direct logs"); + const pendingStatus = JSON.parse(await runCli(["local", "status", "--json"], env)); + assert.equal(pendingStatus.mode, "local"); + assert.equal(pendingStatus.semantic.enabled, true); + assert.equal(pendingStatus.semantic.totalSolutions, 1); + assert.equal(pendingStatus.semantic.embeddedSolutions, 0); + assert.equal(pendingStatus.semantic.pendingEmbeddings, 1); + assert.equal(pendingStatus.semantic.sqliteVecAvailable, true); + assert.equal(pendingStatus.semantic.embedderAvailable, true); + + logStep("verifying direct keyword search works before local embeddings exist"); + const preEmbedKeyword = await runCli( + ["search", "EADDRINUSE", "--mode", "keyword", "--limit", "1"], + env, + ); + assertTopProblem(preEmbedKeyword, fixtures.vite.problem, "pre-embed direct keyword search"); + + logStep("downloading or checking the local embedding model and embedding pending solutions"); const embedOutput = await runCli(["local", "embed"], env); assert.match(embedOutput, /Local embeddings ready/); + assert.match(embedOutput, /1 solution\(s\) embedded/); - logStep("logging direct CLI fixture solutions"); - await logDirectSolution(env, fixtures.vite); + logStep("logging direct CLI fixture solutions with immediate embeddings"); await logDirectSolution(env, fixtures.playwright); await logDirectSolution(env, fixtures.prisma); diff --git a/packages/cli/openclaw.plugin.json b/packages/cli/openclaw.plugin.json index 203ec3f..c8d6e44 100644 --- a/packages/cli/openclaw.plugin.json +++ b/packages/cli/openclaw.plugin.json @@ -2,7 +2,7 @@ "id": "@bernoussama/clankeroverflow", "name": "ClankerOverflow", "description": "Search-first debugging memory for AI coding agents. Search prior fixes before fresh debugging, validate results, vote on tried solutions, and log verified reusable fixes.", - "version": "1.1.0", + "version": "1.2.0", "configSchema": { "type": "object", "additionalProperties": false diff --git a/packages/cli/package.json b/packages/cli/package.json index 98becd7..9d92030 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@clankeroverflow/cli", - "version": "1.1.0", + "version": "1.2.0", "description": "ClankerOverflow CLI for logging and searching AI agent solutions", "license": "MIT", "repository": { @@ -51,6 +51,6 @@ "vitest": "4.0.7" }, "optionalDependencies": { - "sqlite-lembed": "0.0.1-alpha.8" + "node-llama-cpp": "3.18.1" } } diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index 7e16ef3..173a338 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -39,7 +39,7 @@ function formatLocalStatus(dbPath: string, status: Awaited { dimensions: 4, }; const embedder = { - embed(text: string) { + async embed(text: string) { return /oauth/i.test(text) ? vector([1, 0, 0, 0]) : vector([0, 1, 0, 0]); }, }; @@ -134,7 +139,7 @@ describe("CLI local MCP backend", () => { dimensions: 4, }; const embedder = { - embed(text: string) { + async embed(text: string) { return /oauth/i.test(text) ? vector([1, 0, 0, 0]) : vector([0, 1, 0, 0]); }, }; @@ -167,7 +172,7 @@ describe("CLI local MCP backend", () => { }; const firstBackend = new LocalBackend(dbPath, { semantic, - embedder: { embed: () => vector([1, 0, 0, 0]) }, + embedder: { embed: async () => vector([1, 0, 0, 0]) }, }); await firstBackend.log({ problem: "OAuth callback timeout", @@ -177,7 +182,7 @@ describe("CLI local MCP backend", () => { const freshBackend = new LocalBackend(dbPath, { semantic, - embedder: { embed: () => vector([1, 0, 0, 0]) }, + embedder: { embed: async () => vector([1, 0, 0, 0]) }, }); await expect(freshBackend.status()).resolves.toMatchObject({ @@ -201,6 +206,24 @@ describe("CLI local MCP backend", () => { expect(second).not.toBe(first); }); + test("local embedding metadata uses node-llama-cpp", () => { + expect(LOCAL_EMBEDDER_ID).toBe("node-llama-cpp"); + }); + + test("converts embedding vectors to explicit float32 sqlite blobs", () => { + const buffer = floatVectorToBuffer([1.5, -2.25], 2); + + expect(buffer).toHaveLength(8); + expect(buffer.readFloatLE(0)).toBe(1.5); + expect(buffer.readFloatLE(4)).toBe(-2.25); + }); + + test("rejects local embedding vectors with unexpected dimensions", () => { + expect(() => floatVectorToBuffer([1, 2, 3], 4)).toThrow( + "node-llama-cpp returned 3 embedding dimensions", + ); + }); + test("replacing a model file at the same path makes existing embeddings pending", async () => { const semantic: LocalSemanticConfig = { enabled: true, @@ -210,7 +233,7 @@ describe("CLI local MCP backend", () => { }; const backend = new LocalBackend(dbPath, { semantic, - embedder: { embed: () => vector([1, 0, 0, 0]) }, + embedder: { embed: async () => vector([1, 0, 0, 0]) }, }); await backend.log({ problem: "OAuth callback timeout", diff --git a/packages/cli/src/mcp/local-backend.ts b/packages/cli/src/mcp/local-backend.ts index 2d81038..e95ed14 100644 --- a/packages/cli/src/mcp/local-backend.ts +++ b/packages/cli/src/mcp/local-backend.ts @@ -9,7 +9,7 @@ import type { } from "./backend"; import { openLocalDb, type LocalDb } from "./local-db"; import { - createSqliteEmbedder, + createLocalEmbedder, embeddingFingerprintForConfig, ensureLocalSemanticSchema, ensureVecTable, @@ -31,7 +31,7 @@ export class LocalSemanticSearchNotConfiguredError extends Error { } type SearchRow = SolutionResult & { rank: number }; -type Embedder = { embed(text: string): Buffer }; +type Embedder = { embed(text: string): Promise }; function nowIso() { return new Date().toISOString(); @@ -184,7 +184,7 @@ export class LocalBackend implements SolutionBackend { if (!this.semantic?.enabled) throw new LocalSemanticSearchNotConfiguredError(); await ensureVecTable(this.db, this.semantic.dimensions); const embedder = await this.resolveEmbedder(); - const embedding = embedder.embed(queryEmbeddingText(queryText)); + const embedding = await embedder.embed(queryEmbeddingText(queryText)); const rows = this.db .prepare( `SELECT solution_id, distance @@ -245,7 +245,7 @@ export class LocalBackend implements SolutionBackend { await ensureVecTable(this.db, this.semantic.dimensions); const embedder = await this.resolveEmbedder(); const text = solutionEmbeddingText({ problem, solution, tags }); - const embedding = embedder.embed(text); + const embedding = await embedder.embed(text); insertEmbedding(this.db, { solutionId: id, model: this.semantic.modelId, @@ -260,7 +260,7 @@ export class LocalBackend implements SolutionBackend { private async resolveEmbedder() { if (this.embedder) return this.embedder; if (!this.semantic?.enabled) throw new LocalSemanticSearchNotConfiguredError(); - this.embedder = await createSqliteEmbedder(this.db, this.semantic); + this.embedder = await createLocalEmbedder(this.semantic); return this.embedder; } diff --git a/packages/cli/src/mcp/local-semantic.ts b/packages/cli/src/mcp/local-semantic.ts index 7ebb949..4af7a51 100644 --- a/packages/cli/src/mcp/local-semantic.ts +++ b/packages/cli/src/mcp/local-semantic.ts @@ -22,7 +22,7 @@ export const DEFAULT_LOCAL_MODEL_FILE = "bge-small-en-v1.5-q8_0.gguf"; export const DEFAULT_LOCAL_MODEL_DIMENSIONS = 384; export const DEFAULT_LOCAL_MODEL_URL = "https://huggingface.co/ggml-org/bge-small-en-v1.5-Q8_0-GGUF/resolve/main/bge-small-en-v1.5-q8_0.gguf"; -export const LOCAL_EMBEDDER_ID = "sqlite-lembed"; +export const LOCAL_EMBEDDER_ID = "node-llama-cpp"; export const LOCAL_EMBEDDING_FORMAT_VERSION = "solution-v1"; export const LOCAL_QUERY_FORMAT_VERSION = "query-v1"; @@ -54,7 +54,6 @@ export type LocalSemanticStatus = { }; const sqliteVecLoaded = new WeakSet(); -const lembedLoaded = new WeakSet(); export function defaultLocalModelPath(env: NodeJS.ProcessEnv = process.env) { const cacheRoot = env.XDG_CACHE_HOME || join(homedir(), ".cache"); @@ -177,40 +176,42 @@ export async function loadSqliteVec(db: LocalDb) { } } -async function loadLembed(db: LocalDb) { - if (lembedLoaded.has(db)) return; +export async function checkLocalEmbedderAvailable() { try { - const sqliteLembed = await import("sqlite-lembed"); - sqliteLembed.load(db); - lembedLoaded.add(db); + await import("node-llama-cpp"); } catch (error) { throw new Error( - `sqlite-lembed extension is unavailable: ${error instanceof Error ? error.message : String(error)}`, + `node-llama-cpp embedder is unavailable: ${error instanceof Error ? error.message : String(error)}`, ); } } -function ensureTempModelTable(db: LocalDb, config: LocalSemanticConfig) { +export function floatVectorToBuffer(vector: ArrayLike, dimensions: number) { + if (vector.length !== dimensions) { + throw new Error( + `node-llama-cpp returned ${vector.length} embedding dimensions, but CLANKER_LOCAL_MODEL_DIMENSIONS is ${dimensions}`, + ); + } + const buffer = Buffer.allocUnsafe(dimensions * Float32Array.BYTES_PER_ELEMENT); + for (let index = 0; index < dimensions; index += 1) { + buffer.writeFloatLE(vector[index]!, index * Float32Array.BYTES_PER_ELEMENT); + } + return buffer; +} + +export async function createLocalEmbedder(config: LocalSemanticConfig) { const modelValidation = validateGgufFile(config.modelPath); if (!modelValidation.ok) { throw new Error(modelValidation.error ?? "model file is not valid"); } - db.prepare( - `INSERT OR REPLACE INTO temp.lembed_models(name, model) - SELECT ?, lembed_model_from_file(?)`, - ).run(config.modelId, config.modelPath); -} - -export async function createSqliteEmbedder(db: LocalDb, config: LocalSemanticConfig) { - await loadLembed(db); - ensureTempModelTable(db, config); + const { getLlama } = await import("node-llama-cpp"); + const llama = await getLlama(); + const model = await llama.loadModel({ modelPath: config.modelPath }); + const context = await model.createEmbeddingContext(); return { - embed(text: string) { - const row = db.prepare("SELECT lembed(?, ?) AS embedding").get(config.modelId, text) as - | { embedding: Buffer | Uint8Array } - | undefined; - if (!row?.embedding) throw new Error("sqlite-lembed returned no embedding"); - return Buffer.from(row.embedding); + async embed(text: string) { + const embedding = await context.getEmbeddingFor(text); + return floatVectorToBuffer(embedding.vector, config.dimensions); }, }; } @@ -375,7 +376,7 @@ export async function getLocalSemanticStatus(db: LocalDb, config: LocalSemanticC let embedderAvailable = true; let embedderError: string | undefined; try { - await loadLembed(db); + await checkLocalEmbedderAvailable(); } catch (error) { embedderAvailable = false; embedderError = error instanceof Error ? error.message : String(error); diff --git a/packages/cli/src/mcp/server.ts b/packages/cli/src/mcp/server.ts index b9d0594..eb4fbc6 100644 --- a/packages/cli/src/mcp/server.ts +++ b/packages/cli/src/mcp/server.ts @@ -191,8 +191,8 @@ export function createMcpServer() { ? "sqlite-vec: available" : `sqlite-vec: ${status.sqliteVecError}`, status.embedderAvailable - ? "sqlite-lembed: available" - : `sqlite-lembed: ${status.embedderError}`, + ? "node-llama-cpp: available" + : `node-llama-cpp: ${status.embedderError}`, ].join("\n"), }, ], diff --git a/packages/cli/src/package.test.ts b/packages/cli/src/package.test.ts index 41470b8..a923f2b 100644 --- a/packages/cli/src/package.test.ts +++ b/packages/cli/src/package.test.ts @@ -24,7 +24,8 @@ describe("packages/cli package metadata", () => { expect(packageJson.dependencies?.["better-sqlite3"]).toBe("12.10.0"); expect(packageJson.dependencies?.mcplog).toBe("^0.0.5"); expect(packageJson.dependencies?.["sqlite-vec"]).toBe("^0.1.9"); - expect(packageJson.optionalDependencies?.["sqlite-lembed"]).toBe("0.0.1-alpha.8"); + expect(packageJson.optionalDependencies?.["node-llama-cpp"]).toBe("3.18.1"); + expect(packageJson.optionalDependencies?.["sqlite-lembed"]).toBeUndefined(); expect(packageJson.dependencies?.zod).toBe("^4.1.13"); expect(packageJson.dependencies?.["@tobilu/qmd"]).toBeUndefined(); expect(packageJson.dependencies?.["node-llama-cpp"]).toBeUndefined(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1e575d1..8c27fba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -369,9 +369,9 @@ importers: specifier: 4.0.7 version: 4.0.7(@types/debug@4.1.13)(@types/node@22.19.19)(jiti@2.7.0)(lightningcss@1.32.0)(msw@2.14.6(@types/node@22.19.19)(typescript@5.9.3))(terser@5.16.9)(tsx@4.22.3)(yaml@2.9.0) optionalDependencies: - sqlite-lembed: - specifier: 0.0.1-alpha.8 - version: 0.0.1-alpha.8 + node-llama-cpp: + specifier: 3.18.1 + version: 3.18.1(typescript@5.9.3) packages/config: {} @@ -2045,6 +2045,10 @@ packages: '@trpc/server': ^10.10.0 || >11.0.0-rc hono: '>=4.0.0' + '@huggingface/jinja@0.5.9': + resolution: {integrity: sha512-uWTG+l3VJRsl7EXxYizuL3P+cCPoc3cRqbWWRcQN0FhejRfbdq0RNhCmbY/YDtnTcz9icdLYuLDjsnz4d8JMuw==} + engines: {node: '>=18'} + '@iarna/toml@2.2.5': resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} @@ -2244,6 +2248,10 @@ packages: resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} engines: {node: '>=18'} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -2266,6 +2274,12 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@kwsites/file-exists@1.1.1': + resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} + + '@kwsites/promise-deferred@1.1.1': + resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} + '@modelcontextprotocol/sdk@1.29.0': resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} engines: {node: '>=18'} @@ -2364,6 +2378,90 @@ packages: '@nodable/entities@2.1.1': resolution: {integrity: sha512-Pig3HxDIoMgjdEH8OCf/dkcTmLFjJRjWuq8jSnklu284/TKOPibSRERmOykiwmyXTtv61mP+44f3GMx0tLAyjg==} + '@node-llama-cpp/linux-arm64@3.18.1': + resolution: {integrity: sha512-rXMgZxUay78FOJV/fJ67apYP9eElH5jd4df5YRKPlLhLHHchuOSyDn+qtyW/L/EnPzpogoLkmULqCkdXU39XsQ==} + engines: {node: '>=20.0.0'} + cpu: [arm64, x64] + os: [linux] + libc: [glibc] + + '@node-llama-cpp/linux-armv7l@3.18.1': + resolution: {integrity: sha512-BrJL2cGo0pN5xd5nw+CzTn2rFMpz9MJyZZPUY81ptGkF2uIuXT2hdCVh56i9ImQrTwBfq1YcZL/l/Qe/1+HR/Q==} + engines: {node: '>=20.0.0'} + cpu: [arm, x64] + os: [linux] + libc: [glibc] + + '@node-llama-cpp/linux-x64-cuda-ext@3.18.1': + resolution: {integrity: sha512-VqyKhAVHPCpFzh0f1koCBgpThL+04QOXwv0oDQ8s8YcpfMMOXQlBhTB0plgTh0HrPExoObfTS4ohkrbyGgmztQ==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@node-llama-cpp/linux-x64-cuda@3.18.1': + resolution: {integrity: sha512-qOaYP4uwsUoBHQ/7xSOvyJIuXapS57Al+Sudgi00f96ldNZLKe1vuSGptAi5LTM2lIj66PKm6h8PlRWctwsZ2g==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@node-llama-cpp/linux-x64-vulkan@3.18.1': + resolution: {integrity: sha512-SIaNTK5pUPhwJD0gmiQfHa8OrRctVMmnqu+slJrz2Mzgg/XrwFndJlS9hvc+jSjTXCouwf7sYeQaaJWvQgBh/A==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@node-llama-cpp/linux-x64@3.18.1': + resolution: {integrity: sha512-tRmWcsyvAcqJHQHXHsaOkx6muGbcirA9nRdNgH6n7bjGUw4VuoBD3dChyNF3/Ktt7ohB9kz+XhhyZjbDHpXyMA==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@node-llama-cpp/mac-arm64-metal@3.18.1': + resolution: {integrity: sha512-cyZTdsUMlvuRlGmkkoBbN3v/DT6NuruEqoQYd9CqIrPyLa1xLNBTSKIZ9SgRnw23iCOj4URfITvRP+2pu63LuQ==} + engines: {node: '>=20.0.0'} + cpu: [arm64, x64] + os: [darwin] + + '@node-llama-cpp/mac-x64@3.18.1': + resolution: {integrity: sha512-GfCPgdltaIpBhEnQ7WfsrRXrZO9r9pBtDUAQMXRuJwOPP5q7xKrQZUXI6J6mpc8tAG0//CTIuGn4hTKoD/8V8w==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [darwin] + + '@node-llama-cpp/win-arm64@3.18.1': + resolution: {integrity: sha512-S05YUzBMVSRS5KNbOS26cDYugeQHqogI3uewtTUBVC0tPbTHRSKjsdicmgWru1eNAry399LWWhzOf/3St/qsAw==} + engines: {node: '>=20.0.0'} + cpu: [arm64, x64] + os: [win32] + + '@node-llama-cpp/win-x64-cuda-ext@3.18.1': + resolution: {integrity: sha512-u0FzJBQsJA355ksKERxwPJhlcWl3ZJSNkU2ZUwDEiKNOCbv3ybvSCIEyDvB63wdtkfVUuCRJWijZnpDZxrCGqg==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [win32] + + '@node-llama-cpp/win-x64-cuda@3.18.1': + resolution: {integrity: sha512-drgJmBhnxGQtB/SLo4sf4PPSuxRv3MdNP0FF6rKPY9TtzEOV293bRQyYEu/JYwvXfVApAIsRaJUTGvCkA9Qobw==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [win32] + + '@node-llama-cpp/win-x64-vulkan@3.18.1': + resolution: {integrity: sha512-PjmxrnPToi7y0zlP7l+hRIhvOmuEv94P6xZ11vjqICEJu8XdAJpvTfPKgDW4W0p0v4+So8ZiZYLUuwIHcsseyQ==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [win32] + + '@node-llama-cpp/win-x64@3.18.1': + resolution: {integrity: sha512-QLDVphPl+YDI+x/VYYgIV1N9g0GMXk3PqcoopOUG3cBRUtce7FO+YX903YdRJezs4oKbIp8YaO+xYBgeUSqhpA==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [win32] + '@node-minify/core@8.0.6': resolution: {integrity: sha512-/vxN46ieWDLU67CmgbArEvOb41zlYFOkOtr9QW9CnTrBLuTyGgkyNWC2y5+khvRw3Br58p2B5ZVSx/PxCTru6g==} engines: {node: '>=16.0.0'} @@ -2675,6 +2773,62 @@ packages: '@quansync/fs@1.0.0': resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + '@reflink/reflink-darwin-arm64@0.1.19': + resolution: {integrity: sha512-ruy44Lpepdk1FqDz38vExBY/PVUsjxZA+chd9wozjUH9JjuDT/HEaQYA6wYN9mf041l0yLVar6BCZuWABJvHSA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@reflink/reflink-darwin-x64@0.1.19': + resolution: {integrity: sha512-By85MSWrMZa+c26TcnAy8SDk0sTUkYlNnwknSchkhHpGXOtjNDUOxJE9oByBnGbeuIE1PiQsxDG3Ud+IVV9yuA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@reflink/reflink-linux-arm64-gnu@0.1.19': + resolution: {integrity: sha512-7P+er8+rP9iNeN+bfmccM4hTAaLP6PQJPKWSA4iSk2bNvo6KU6RyPgYeHxXmzNKzPVRcypZQTpFgstHam6maVg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@reflink/reflink-linux-arm64-musl@0.1.19': + resolution: {integrity: sha512-37iO/Dp6m5DDaC2sf3zPtx/hl9FV3Xze4xoYidrxxS9bgP3S8ALroxRK6xBG/1TtfXKTvolvp+IjrUU6ujIGmA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@reflink/reflink-linux-x64-gnu@0.1.19': + resolution: {integrity: sha512-jbI8jvuYCaA3MVUdu8vLoLAFqC+iNMpiSuLbxlAgg7x3K5bsS8nOpTRnkLF7vISJ+rVR8W+7ThXlXlUQ93ulkw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@reflink/reflink-linux-x64-musl@0.1.19': + resolution: {integrity: sha512-e9FBWDe+lv7QKAwtKOt6A2W/fyy/aEEfr0g6j/hWzvQcrzHCsz07BNQYlNOjTfeytrtLU7k449H1PI95jA4OjQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@reflink/reflink-win32-arm64-msvc@0.1.19': + resolution: {integrity: sha512-09PxnVIQcd+UOn4WAW73WU6PXL7DwGS6wPlkMhMg2zlHHG65F3vHepOw06HFCq+N42qkaNAc8AKIabWvtk6cIQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@reflink/reflink-win32-x64-msvc@0.1.19': + resolution: {integrity: sha512-E//yT4ni2SyhwP8JRjVGWr3cbnhWDiPLgnQ66qqaanjjnMiu3O/2tjCPQXlcGc/DEYofpDc9fvhv6tALQsMV9w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@reflink/reflink@0.1.19': + resolution: {integrity: sha512-DmCG8GzysnCZ15bres3N5AHCmwBwYgp0As6xjhQ47rAUTUXxJiK+lLUxaGsX3hd/30qUpVElh05PbGuxRPgJwA==} + engines: {node: '>= 10'} + '@rolldown/binding-android-arm64@1.0.3': resolution: {integrity: sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2927,6 +3081,12 @@ packages: resolution: {integrity: sha512-XUyoNtDSYCvgJnoNzlh+YeAXfIPhCRIXbhWqqM3GQ3AFtZICi85lkyfsrwXEl9wzlPGYnU+Eg8F4tOfScx+FcQ==} engines: {node: '>=18'} + '@simple-git/args-pathspec@1.0.3': + resolution: {integrity: sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA==} + + '@simple-git/argv-parser@1.1.1': + resolution: {integrity: sha512-Q9lBcfQ+VQCpQqGJFHe5yooOS5hGdLFFbJ5R+R5aDsnkPCahtn1hSkMcORX65J2Z5lxSkD0lQorMsncuBQxYUw==} + '@sindresorhus/is@7.2.0': resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} engines: {node: '>=18'} @@ -3244,6 +3404,10 @@ packages: peerDependencies: react: ^18 || ^19 + '@tinyhttp/content-disposition@2.2.4': + resolution: {integrity: sha512-5Kc5CM2Ysn3vTTArBs2vESUt0AQiWZA86yc1TI3B+lxXmtEq133C1nxXNOgnzhrivdPZIh3zLj5gDnZjoLL5GA==} + engines: {node: '>=12.17.0'} + '@trpc/client@11.17.0': resolution: {integrity: sha512-KpJBFrbKTDeVCFv/3ckL1XBBH5Yssn8hethI/rUy7GIpTj+VzjtPjykDqJpzobuVOz+d26cXCSu1t4I6MYI5Zg==} hasBin: true @@ -3531,6 +3695,10 @@ packages: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} + ansi-escapes@6.2.1: + resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} + engines: {node: '>=14.16'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -3569,6 +3737,9 @@ packages: resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} engines: {node: '>=4'} + async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -3768,9 +3939,16 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chmodrp@1.0.2: + resolution: {integrity: sha512-TdngOlFV1FLTzU0o1w8MB6/BFywhtLC0SzRTGJU7T9lmdjlCWeMRt1iVo0Ki+ldwNk0BqNiKoc8xpLZEQ8mY1w==} + chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + ci-info@4.4.0: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} @@ -3786,6 +3964,10 @@ packages: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} + cli-spinners@3.4.0: + resolution: {integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==} + engines: {node: '>=18.20'} + cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} @@ -3808,6 +3990,11 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + cmake-js@8.0.0: + resolution: {integrity: sha512-YbUP88RDwCvoQkZhRtGURYm9RIpWdtvZuhT87fKNoLjk8kIFIFeARpKfuZQGdwfH99GZpUmqSfcDrK62X7lTgg==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + code-block-writer@13.0.3: resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} @@ -3825,6 +4012,10 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} @@ -4142,6 +4333,10 @@ packages: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + env-var@7.5.0: + resolution: {integrity: sha512-mKZOzLRN0ETzau2W2QXefbFjo5EF4yWq28OyKb9ICdeNhHJlOE/pHHnz4hdYJ9cNZXcJHo5xN4OT4pzuSHSNvA==} + engines: {node: '>=10'} + error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} @@ -4226,6 +4421,9 @@ packages: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + eventsource-parser@3.1.0: resolution: {integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==} engines: {node: '>=18.0.0'} @@ -4325,6 +4523,14 @@ packages: file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + filename-reserved-regex@3.0.0: + resolution: {integrity: sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + filenamify@6.0.0: + resolution: {integrity: sha512-vqIlNogKeyD3yzrm0yhRMQg8hOVwYcYRfjEoODd49iCprMn4HL85gK3HcykQE53EPIpX3HcAbGA5ELQv216dAQ==} + engines: {node: '>=16'} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -4534,6 +4740,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} @@ -4562,6 +4772,11 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + ipull@3.9.5: + resolution: {integrity: sha512-5w/yZB5lXmTfsvNawmvkCjYo4SJNuKQz/av8TC1UiOyfOHyaM+DReqbpU2XpWYfmY+NIUbRRH8PUAWsxaS+IfA==} + engines: {node: '>=18.0.0'} + hasBin: true + is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -4587,6 +4802,10 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-fullwidth-code-point@5.1.0: + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} + engines: {node: '>=18'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -4659,6 +4878,10 @@ packages: resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} engines: {node: '>=18'} + isexe@4.0.0: + resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} + engines: {node: '>=20'} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -4726,6 +4949,12 @@ packages: lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lifecycle-utils@2.1.0: + resolution: {integrity: sha512-AnrXnE2/OF9PHCyFg0RSqsnQTzV991XaZA/buhFDoc58xU7rhSCDgCz/09Lqpsn4MpoPHt7TRAXV1kWZypFVsA==} + + lifecycle-utils@3.1.1: + resolution: {integrity: sha512-gNd3OvhFNjHykJE3uGntz7UuPzWlK9phrIdXxU9Adis0+ExkwnZibfxCJWiWWZ+a6VbKiZrb+9D9hCQWd4vjTg==} + lightningcss-android-arm64@1.32.0: resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} @@ -4803,10 +5032,17 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + log-symbols@6.0.0: resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} engines: {node: '>=18'} + log-symbols@7.0.1: + resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} + engines: {node: '>=18'} + loglevel@1.9.2: resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} engines: {node: '>= 0.6.0'} @@ -4814,6 +5050,10 @@ packages: longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + lowdb@7.0.1: + resolution: {integrity: sha512-neJAj8GwF0e8EpycYIDFqEPcx9Qz4GUho20jWFR7YiFeXzF1YMLdxB36PypcTSPMA+4+LvgyMacYhlr18Zlymw==} + engines: {node: '>=18'} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -5006,6 +5246,10 @@ packages: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} @@ -5039,6 +5283,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@5.1.14: + resolution: {integrity: sha512-5c8l8kVzqpnDPaicbEop/fV0Q1w16FmbWtVhMqugTozAwYdlIQojWH5a/M7UfziFmGdQRrUdV+EPzc9Xng3VAQ==} + engines: {node: ^18 || >=20} + hasBin: true + nanostores@1.3.0: resolution: {integrity: sha512-XPUa/jz+P1oJvN9VBxw4L9MtdFfaH3DAryqPssqhb2kXjmb9npz0dly6rCsgFWOPr4Yg9mTfM3MDZgZZ+7A3lA==} engines: {node: ^20.0.0 || >=22.0.0} @@ -5085,6 +5334,13 @@ packages: resolution: {integrity: sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==} engines: {node: '>=10'} + node-addon-api@8.8.0: + resolution: {integrity: sha512-c5Ko1fZJIJmzhFIkhRN76WTq+fC6tWnGy9CXA0fA+XygsWZmEwG8vmbkNqxMyoaa0Tin4djul49NzdVcJJcjeA==} + engines: {node: ^18 || ^20 || >= 21} + + node-api-headers@1.9.0: + resolution: {integrity: sha512-2oNILP4jXwRB4ywnYKjVk1YyJ96n2D4EOVJO6S3oYZ5PtbJrw3Yt9TpAuX3nBLMuzn74rnfGQrv13pS9vC+YiA==} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -5103,6 +5359,16 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-llama-cpp@3.18.1: + resolution: {integrity: sha512-w0zfuy/IKS2fhrbed5SylZDXJHTVz4HnkwZ4UrFPgSNwJab3QIPwIl4lyCKHHy9flLrtxsAuV5kXfH3HZ6bb8w==} + engines: {node: '>=20.0.0'} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + peerDependenciesMeta: + typescript: + optional: true + node-releases@2.0.46: resolution: {integrity: sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==} engines: {node: '>=18'} @@ -5166,6 +5432,10 @@ packages: resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} engines: {node: '>=18'} + ora@9.4.0: + resolution: {integrity: sha512-84cglkRILFxdtA8hAvLNdMrtBpPNBTrQ9/ulg0FA7xLMnD6mifv+enAIeRmvtv+WgdCE+LPGOfQmtJRrVaIVhQ==} + engines: {node: '>=20'} + outvariant@1.4.3: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} @@ -5207,6 +5477,10 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse-ms@3.0.0: + resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} + engines: {node: '>=12'} + parse-ms@4.0.0: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} @@ -5357,6 +5631,14 @@ packages: deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. hasBin: true + pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} + + pretty-ms@8.0.0: + resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} + engines: {node: '>=14.16'} + pretty-ms@9.3.0: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} @@ -5461,6 +5743,10 @@ packages: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + rettime@0.11.11: resolution: {integrity: sha512-ILJRqVWBCTlg9r42fFgwVZx1gnFAcQF8mRoMkbgQfIrjEDf9nbBFDFx00oloOa+Q869FUtaYDXZvEfnecQSCoQ==} @@ -5617,9 +5903,23 @@ packages: simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + simple-git@3.36.0: + resolution: {integrity: sha512-cGQjLjK8bxJw4QuYT7gxHw3/IouVESbhahSsHrX97MzCL1gu2u7oy38W6L2ZIGECEfIBG4BabsWDPjBxJENv9Q==} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + sleep-promise@9.1.0: + resolution: {integrity: sha512-UHYzVpz9Xn8b+jikYSD6bqvf754xL2uBUzDFwiU6NcdZeifPr6UfgU43xpkPu67VMS88+TI2PSI7Eohgqf2fKA==} + + slice-ansi@7.1.2: + resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} + engines: {node: '>=18'} + + slice-ansi@8.0.0: + resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==} + engines: {node: '>=20'} + sonner@2.0.7: resolution: {integrity: sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==} peerDependencies: @@ -5644,24 +5944,6 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} - sqlite-lembed-darwin-arm64@0.0.1-alpha.8: - resolution: {integrity: sha512-Dg3nmU9stayqDNzlNRKOvhmERhpRU/uqKclf2mtRPo0hyB8uG9k4LGDgDtCoSOoPK9jMXdabI+qSUckqvn8o5w==} - cpu: [arm64] - os: [darwin] - - sqlite-lembed-darwin-x64@0.0.1-alpha.8: - resolution: {integrity: sha512-S5Ix4/8WXBk5yHjqjugm1Xh4Uq0axU8AhH5G97Kk5PzteXlXv24QzgUu6QE0hNh8HSKuDxyga89aUwRV1MsFjQ==} - cpu: [x64] - os: [darwin] - - sqlite-lembed-linux-x64@0.0.1-alpha.8: - resolution: {integrity: sha512-N4Nlu0DqIDKIKgR51EBgURwwvTx8jp3NsJHm9yZBRc4OhqlG3eEaNUe5lX/MKWY31g+fO+0/Ew+gcQ2Sppk2Qw==} - cpu: [x64] - os: [linux] - - sqlite-lembed@0.0.1-alpha.8: - resolution: {integrity: sha512-TPj4Nwh2xVTJgb29FLFb/onMQ7nIi1P5aNceGi9EHKX7VM33CKtcelnMLmsiBbAkuFFaZMDv8oxHxDhO1IqDvg==} - sqlite-vec-darwin-arm64@0.1.9: resolution: {integrity: sha512-jSsZpE42OfBkGL/ItyJTVCUwl6o6Ka3U5rc4j+UBDIQzC1ulSSKMEhQLthsOnF/MdAf1MuAkYhkdKmmcjaIZQg==} cpu: [arm64] @@ -5707,6 +5989,18 @@ packages: resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} engines: {node: '>=18'} + stdin-discarder@0.3.2: + resolution: {integrity: sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==} + engines: {node: '>=18'} + + stdout-update@4.0.1: + resolution: {integrity: sha512-wiS21Jthlvl1to+oorePvcyrIkiG/6M3D3VTmDUlJm7Cy6SbFhKkAvX+YBuHLxck/tO3mrdpC/cNesigQc3+UQ==} + engines: {node: '>=16.0.0'} + + steno@4.0.2: + resolution: {integrity: sha512-yhPIQXjrlt1xv7dyPQg2P17URmXbuM5pdGkpiMB3RenprfiBlvK415Lctfe0eshk90oA7/tNq7WEiMK8RSP39A==} + engines: {node: '>=18'} + strict-event-emitter@0.5.1: resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} @@ -5722,6 +6016,10 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} + string-width@8.2.1: + resolution: {integrity: sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==} + engines: {node: '>=20'} + string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -5810,6 +6108,10 @@ packages: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} + tar@7.5.16: + resolution: {integrity: sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w==} + engines: {node: '>=18'} + terser@5.16.9: resolution: {integrity: sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg==} engines: {node: '>=10'} @@ -6016,6 +6318,9 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + url-join@4.0.1: + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + urlpattern-polyfill@10.1.0: resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} @@ -6180,6 +6485,11 @@ packages: engines: {node: ^16.13.0 || >=18.0.0} hasBin: true + which@6.0.1: + resolution: {integrity: sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} @@ -6279,6 +6589,10 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yaml@2.9.0: resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} @@ -7869,6 +8183,9 @@ snapshots: '@trpc/server': 11.17.0(typescript@6.0.3) hono: 4.12.23 + '@huggingface/jinja@0.5.9': + optional: true + '@iarna/toml@2.2.5': {} '@img/colour@1.1.0': {} @@ -8031,6 +8348,11 @@ snapshots: '@isaacs/cliui@9.0.0': {} + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.3 + optional: true + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -8060,6 +8382,16 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@kwsites/file-exists@1.1.1': + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + optional: true + + '@kwsites/promise-deferred@1.1.1': + optional: true + '@modelcontextprotocol/sdk@1.29.0(zod@3.25.76)': dependencies: '@hono/node-server': 1.19.14(hono@4.12.23) @@ -8160,6 +8492,45 @@ snapshots: '@nodable/entities@2.1.1': {} + '@node-llama-cpp/linux-arm64@3.18.1': + optional: true + + '@node-llama-cpp/linux-armv7l@3.18.1': + optional: true + + '@node-llama-cpp/linux-x64-cuda-ext@3.18.1': + optional: true + + '@node-llama-cpp/linux-x64-cuda@3.18.1': + optional: true + + '@node-llama-cpp/linux-x64-vulkan@3.18.1': + optional: true + + '@node-llama-cpp/linux-x64@3.18.1': + optional: true + + '@node-llama-cpp/mac-arm64-metal@3.18.1': + optional: true + + '@node-llama-cpp/mac-x64@3.18.1': + optional: true + + '@node-llama-cpp/win-arm64@3.18.1': + optional: true + + '@node-llama-cpp/win-x64-cuda-ext@3.18.1': + optional: true + + '@node-llama-cpp/win-x64-cuda@3.18.1': + optional: true + + '@node-llama-cpp/win-x64-vulkan@3.18.1': + optional: true + + '@node-llama-cpp/win-x64@3.18.1': + optional: true + '@node-minify/core@8.0.6': dependencies: '@node-minify/utils': 8.0.6 @@ -8423,6 +8794,42 @@ snapshots: dependencies: quansync: 1.0.0 + '@reflink/reflink-darwin-arm64@0.1.19': + optional: true + + '@reflink/reflink-darwin-x64@0.1.19': + optional: true + + '@reflink/reflink-linux-arm64-gnu@0.1.19': + optional: true + + '@reflink/reflink-linux-arm64-musl@0.1.19': + optional: true + + '@reflink/reflink-linux-x64-gnu@0.1.19': + optional: true + + '@reflink/reflink-linux-x64-musl@0.1.19': + optional: true + + '@reflink/reflink-win32-arm64-msvc@0.1.19': + optional: true + + '@reflink/reflink-win32-x64-msvc@0.1.19': + optional: true + + '@reflink/reflink@0.1.19': + optionalDependencies: + '@reflink/reflink-darwin-arm64': 0.1.19 + '@reflink/reflink-darwin-x64': 0.1.19 + '@reflink/reflink-linux-arm64-gnu': 0.1.19 + '@reflink/reflink-linux-arm64-musl': 0.1.19 + '@reflink/reflink-linux-x64-gnu': 0.1.19 + '@reflink/reflink-linux-x64-musl': 0.1.19 + '@reflink/reflink-win32-arm64-msvc': 0.1.19 + '@reflink/reflink-win32-x64-msvc': 0.1.19 + optional: true + '@rolldown/binding-android-arm64@1.0.3': optional: true @@ -8560,6 +8967,14 @@ snapshots: '@sentry/core@10.55.0': {} + '@simple-git/args-pathspec@1.0.3': + optional: true + + '@simple-git/argv-parser@1.1.1': + dependencies: + '@simple-git/args-pathspec': 1.0.3 + optional: true + '@sindresorhus/is@7.2.0': {} '@sindresorhus/merge-streams@4.0.0': {} @@ -8867,6 +9282,9 @@ snapshots: '@tanstack/query-core': 5.100.14 react: 19.2.6 + '@tinyhttp/content-disposition@2.2.4': + optional: true + '@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3)': dependencies: '@trpc/server': 11.17.0(typescript@5.9.3) @@ -9267,6 +9685,9 @@ snapshots: ansi-colors@4.1.3: {} + ansi-escapes@6.2.1: + optional: true + ansi-regex@5.0.1: {} ansi-regex@6.2.2: {} @@ -9295,6 +9716,11 @@ snapshots: dependencies: tslib: 2.8.1 + async-retry@1.3.3: + dependencies: + retry: 0.13.1 + optional: true + asynckit@0.4.0: {} aws4fetch@1.0.20: {} @@ -9491,8 +9917,14 @@ snapshots: character-reference-invalid@2.0.1: {} + chmodrp@1.0.2: + optional: true + chownr@1.1.4: {} + chownr@3.0.0: + optional: true + ci-info@4.4.0: {} class-variance-authority@0.7.1: @@ -9505,6 +9937,9 @@ snapshots: cli-spinners@2.9.2: {} + cli-spinners@3.4.0: + optional: true + cli-width@4.1.0: {} client-only@0.0.1: {} @@ -9535,6 +9970,21 @@ snapshots: clsx@2.1.1: {} + cmake-js@8.0.0: + dependencies: + debug: 4.4.3 + fs-extra: 11.3.5 + node-api-headers: 1.9.0 + rc: 1.2.8 + semver: 7.8.1 + tar: 7.5.16 + url-join: 4.0.1 + which: 6.0.1 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + optional: true + code-block-writer@13.0.3: {} color-convert@2.0.1: @@ -9549,6 +9999,9 @@ snapshots: comma-separated-tokens@2.0.3: {} + commander@10.0.1: + optional: true + commander@11.1.0: {} commander@12.1.0: {} @@ -9719,6 +10172,9 @@ snapshots: env-paths@3.0.0: {} + env-var@7.5.0: + optional: true + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 @@ -9929,6 +10385,9 @@ snapshots: event-target-shim@5.0.1: {} + eventemitter3@5.0.4: + optional: true + eventsource-parser@3.1.0: {} eventsource@3.0.7: @@ -10073,6 +10532,14 @@ snapshots: file-uri-to-path@1.0.0: {} + filename-reserved-regex@3.0.0: + optional: true + + filenamify@6.0.0: + dependencies: + filename-reserved-regex: 3.0.0 + optional: true + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -10304,6 +10771,9 @@ snapshots: ignore@5.3.2: {} + ignore@7.0.5: + optional: true + immediate@3.0.6: {} import-fresh@3.3.1: @@ -10323,6 +10793,31 @@ snapshots: ipaddr.js@1.9.1: {} + ipull@3.9.5: + dependencies: + '@tinyhttp/content-disposition': 2.2.4 + async-retry: 1.3.3 + chalk: 5.6.2 + ci-info: 4.4.0 + cli-spinners: 2.9.2 + commander: 10.0.1 + eventemitter3: 5.0.4 + filenamify: 6.0.0 + fs-extra: 11.3.5 + is-unicode-supported: 2.1.0 + lifecycle-utils: 2.1.0 + lodash.debounce: 4.0.8 + lowdb: 7.0.1 + pretty-bytes: 6.1.1 + pretty-ms: 8.0.0 + sleep-promise: 9.1.0 + slice-ansi: 7.1.2 + stdout-update: 4.0.1 + strip-ansi: 7.2.0 + optionalDependencies: + '@reflink/reflink': 0.1.19 + optional: true + is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -10340,6 +10835,11 @@ snapshots: is-fullwidth-code-point@3.0.0: {} + is-fullwidth-code-point@5.1.0: + dependencies: + get-east-asian-width: 1.6.0 + optional: true + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -10384,6 +10884,9 @@ snapshots: isexe@3.1.5: {} + isexe@4.0.0: + optional: true + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -10443,6 +10946,12 @@ snapshots: dependencies: immediate: 3.0.6 + lifecycle-utils@2.1.0: + optional: true + + lifecycle-utils@3.1.1: + optional: true + lightningcss-android-arm64@1.32.0: optional: true @@ -10494,15 +11003,29 @@ snapshots: lines-and-columns@1.2.4: {} + lodash.debounce@4.0.8: + optional: true + log-symbols@6.0.0: dependencies: chalk: 5.6.2 is-unicode-supported: 1.3.0 + log-symbols@7.0.1: + dependencies: + is-unicode-supported: 2.1.0 + yoctocolors: 2.1.2 + optional: true + loglevel@1.9.2: {} longest-streak@3.1.0: {} + lowdb@7.0.1: + dependencies: + steno: 4.0.2 + optional: true + lru-cache@10.4.3: {} lru-cache@11.5.1: {} @@ -10818,6 +11341,11 @@ snapshots: minipass@7.1.3: {} + minizlib@3.1.0: + dependencies: + minipass: 7.1.3 + optional: true + mkdirp-classic@0.5.3: {} mkdirp@1.0.4: {} @@ -10909,6 +11437,9 @@ snapshots: nanoid@3.3.12: {} + nanoid@5.1.14: + optional: true + nanostores@1.3.0: {} napi-build-utils@2.0.0: {} @@ -10955,6 +11486,12 @@ snapshots: dependencies: semver: 7.8.1 + node-addon-api@8.8.0: + optional: true + + node-api-headers@1.9.0: + optional: true + node-domexception@1.0.0: {} node-fetch@2.7.0: @@ -10967,6 +11504,55 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 + node-llama-cpp@3.18.1(typescript@5.9.3): + dependencies: + '@huggingface/jinja': 0.5.9 + async-retry: 1.3.3 + bytes: 3.1.2 + chalk: 5.6.2 + chmodrp: 1.0.2 + cmake-js: 8.0.0 + cross-spawn: 7.0.6 + env-var: 7.5.0 + filenamify: 6.0.0 + fs-extra: 11.3.5 + ignore: 7.0.5 + ipull: 3.9.5 + is-unicode-supported: 2.1.0 + lifecycle-utils: 3.1.1 + log-symbols: 7.0.1 + nanoid: 5.1.14 + node-addon-api: 8.8.0 + ora: 9.4.0 + pretty-ms: 9.3.0 + proper-lockfile: 4.1.2 + semver: 7.8.1 + simple-git: 3.36.0 + slice-ansi: 8.0.0 + stdout-update: 4.0.1 + strip-ansi: 7.2.0 + validate-npm-package-name: 7.0.2 + which: 6.0.1 + yargs: 17.7.2 + optionalDependencies: + '@node-llama-cpp/linux-arm64': 3.18.1 + '@node-llama-cpp/linux-armv7l': 3.18.1 + '@node-llama-cpp/linux-x64': 3.18.1 + '@node-llama-cpp/linux-x64-cuda': 3.18.1 + '@node-llama-cpp/linux-x64-cuda-ext': 3.18.1 + '@node-llama-cpp/linux-x64-vulkan': 3.18.1 + '@node-llama-cpp/mac-arm64-metal': 3.18.1 + '@node-llama-cpp/mac-x64': 3.18.1 + '@node-llama-cpp/win-arm64': 3.18.1 + '@node-llama-cpp/win-x64': 3.18.1 + '@node-llama-cpp/win-x64-cuda': 3.18.1 + '@node-llama-cpp/win-x64-cuda-ext': 3.18.1 + '@node-llama-cpp/win-x64-vulkan': 3.18.1 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + optional: true + node-releases@2.0.46: {} npm-run-path@4.0.1: @@ -11036,6 +11622,18 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.2.0 + ora@9.4.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 3.4.0 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 7.0.1 + stdin-discarder: 0.3.2 + string-width: 8.2.1 + optional: true + outvariant@1.4.3: {} oxfmt@0.26.0: @@ -11100,6 +11698,9 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse-ms@3.0.0: + optional: true + parse-ms@4.0.0: {} parseurl@1.3.3: {} @@ -11232,6 +11833,14 @@ snapshots: tar-fs: 2.1.4 tunnel-agent: 0.6.0 + pretty-bytes@6.1.1: + optional: true + + pretty-ms@8.0.0: + dependencies: + parse-ms: 3.0.0 + optional: true + pretty-ms@9.3.0: dependencies: parse-ms: 4.0.0 @@ -11368,6 +11977,9 @@ snapshots: retry@0.12.0: {} + retry@0.13.1: + optional: true + rettime@0.11.11: {} reusify@1.1.0: {} @@ -11655,8 +12267,34 @@ snapshots: once: 1.4.0 simple-concat: 1.0.1 + simple-git@3.36.0: + dependencies: + '@kwsites/file-exists': 1.1.1 + '@kwsites/promise-deferred': 1.1.1 + '@simple-git/args-pathspec': 1.0.3 + '@simple-git/argv-parser': 1.1.1 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + optional: true + sisteransi@1.0.5: {} + sleep-promise@9.1.0: + optional: true + + slice-ansi@7.1.2: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 + optional: true + + slice-ansi@8.0.0: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 + optional: true + sonner@2.0.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: react: 19.2.6 @@ -11675,22 +12313,6 @@ snapshots: split2@4.2.0: {} - sqlite-lembed-darwin-arm64@0.0.1-alpha.8: - optional: true - - sqlite-lembed-darwin-x64@0.0.1-alpha.8: - optional: true - - sqlite-lembed-linux-x64@0.0.1-alpha.8: - optional: true - - sqlite-lembed@0.0.1-alpha.8: - optionalDependencies: - sqlite-lembed-darwin-arm64: 0.0.1-alpha.8 - sqlite-lembed-darwin-x64: 0.0.1-alpha.8 - sqlite-lembed-linux-x64: 0.0.1-alpha.8 - optional: true - sqlite-vec-darwin-arm64@0.1.9: optional: true @@ -11724,6 +12346,20 @@ snapshots: stdin-discarder@0.2.2: {} + stdin-discarder@0.3.2: + optional: true + + stdout-update@4.0.1: + dependencies: + ansi-escapes: 6.2.1 + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.2.0 + optional: true + + steno@4.0.2: + optional: true + strict-event-emitter@0.5.1: {} string-width@4.2.3: @@ -11744,6 +12380,12 @@ snapshots: get-east-asian-width: 1.6.0 strip-ansi: 7.2.0 + string-width@8.2.1: + dependencies: + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + optional: true + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -11825,6 +12467,15 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + tar@7.5.16: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.3 + minizlib: 3.1.0 + yallist: 5.0.0 + optional: true + terser@5.16.9: dependencies: '@jridgewell/source-map': 0.3.11 @@ -12049,6 +12700,9 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + url-join@4.0.1: + optional: true + urlpattern-polyfill@10.1.0: {} use-sync-external-store@1.6.0(react@19.2.6): @@ -12219,6 +12873,11 @@ snapshots: dependencies: isexe: 3.1.5 + which@6.0.1: + dependencies: + isexe: 4.0.0 + optional: true + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 @@ -12301,6 +12960,9 @@ snapshots: yallist@3.1.1: {} + yallist@5.0.0: + optional: true + yaml@2.9.0: {} yargs-parser@21.1.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8118271..396e3dd 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -10,6 +10,7 @@ allowBuilds: esbuild: true sharp: true msw: false + node-llama-cpp: true overrides: kysely: 0.28.17 diff --git a/scripts/test-cli-local-e2e.ts b/scripts/test-cli-local-e2e.ts index 3dde11a..ef4673d 100644 --- a/scripts/test-cli-local-e2e.ts +++ b/scripts/test-cli-local-e2e.ts @@ -1,8 +1,24 @@ import { spawn } from "node:child_process"; -const IMAGE = process.env.CLANKER_LOCAL_E2E_IMAGE || "clankeroverflow-cli-local-e2e:latest"; const MODEL_VOLUME = process.env.CLANKER_LOCAL_E2E_MODEL_VOLUME || "clankeroverflow_cli_e2e_model_cache"; +const DEFAULT_NODE_IMAGES = ["node:22-bookworm-slim", "node:24-bookworm-slim"]; +const NODE_IMAGES = (process.env.CLANKER_LOCAL_E2E_NODE_IMAGES?.split(",") ?? DEFAULT_NODE_IMAGES) + .map((image) => image.trim()) + .filter(Boolean); + +if (NODE_IMAGES.length === 0) { + throw new Error("CLANKER_LOCAL_E2E_NODE_IMAGES must include at least one Docker image."); +} + +function imageName(nodeImage: string) { + if (process.env.CLANKER_LOCAL_E2E_IMAGE) return process.env.CLANKER_LOCAL_E2E_IMAGE; + const suffix = nodeImage + .replace(/^node:/, "node-") + .replaceAll(/[^a-zA-Z0-9_.-]+/g, "-") + .toLowerCase(); + return `clankeroverflow-cli-local-e2e:${suffix}`; +} async function run(cmd: string[]) { const proc = spawn(cmd[0]!, cmd.slice(1), { @@ -19,15 +35,30 @@ async function run(cmd: string[]) { } } -await run(["docker", "build", "-f", "packages/cli/e2e/Dockerfile.local-mode", "-t", IMAGE, "."]); await run(["docker", "volume", "create", MODEL_VOLUME]); -await run([ - "docker", - "run", - "--rm", - "-e", - "XDG_CACHE_HOME=/model-cache", - "-v", - `${MODEL_VOLUME}:/model-cache`, - IMAGE, -]); +for (const nodeImage of NODE_IMAGES) { + const image = imageName(nodeImage); + console.log(`[local-mode-e2e] building ${image} from ${nodeImage}`); + await run([ + "docker", + "build", + "--build-arg", + `NODE_IMAGE=${nodeImage}`, + "-f", + "packages/cli/e2e/Dockerfile.local-mode", + "-t", + image, + ".", + ]); + console.log(`[local-mode-e2e] running ${image}`); + await run([ + "docker", + "run", + "--rm", + "-e", + "XDG_CACHE_HOME=/model-cache", + "-v", + `${MODEL_VOLUME}:/model-cache`, + image, + ]); +}